{"version":3,"file":"application.js","sources":["../../../node_modules/sortablejs/modular/sortable.esm.js","../javascripts/sort.js","../javascripts/dom.js","../javascripts/tag_input.js","../javascripts/vendor/photoswipe-lightbox.esm.js","../javascripts/vendor/photoswipe.esm.js","../javascripts/file-upload.js","../javascripts/input_autocomplete.js","../javascripts/when-ready.js","../javascripts/admin-tools.js","../javascripts/cookie-notice.js","../javascripts/gallery.js"],"sourcesContent":["/**!\n * Sortable 1.15.2\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n    keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n  return target;\n}\nfunction _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 && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n  return _typeof(obj);\n}\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n    return target;\n  };\n  return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}\nfunction _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = _objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}\nfunction _toConsumableArray(arr) {\n  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\nfunction _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\nfunction _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nfunction _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)) return _arrayLikeToArray(o, minLen);\n}\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nvar version = \"1.15.2\";\n\nfunction userAgent(pattern) {\n  if (typeof window !== 'undefined' && window.navigator) {\n    return !! /*@__PURE__*/navigator.userAgent.match(pattern);\n  }\n}\nvar IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i);\nvar Edge = userAgent(/Edge/i);\nvar FireFox = userAgent(/firefox/i);\nvar Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i);\nvar IOS = userAgent(/iP(ad|od|hone)/i);\nvar ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i);\n\nvar captureMode = {\n  capture: false,\n  passive: false\n};\nfunction on(el, event, fn) {\n  el.addEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction off(el, event, fn) {\n  el.removeEventListener(event, fn, !IE11OrLess && captureMode);\n}\nfunction matches( /**HTMLElement*/el, /**String*/selector) {\n  if (!selector) return;\n  selector[0] === '>' && (selector = selector.substring(1));\n  if (el) {\n    try {\n      if (el.matches) {\n        return el.matches(selector);\n      } else if (el.msMatchesSelector) {\n        return el.msMatchesSelector(selector);\n      } else if (el.webkitMatchesSelector) {\n        return el.webkitMatchesSelector(selector);\n      }\n    } catch (_) {\n      return false;\n    }\n  }\n  return false;\n}\nfunction getParentOrHost(el) {\n  return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode;\n}\nfunction closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) {\n  if (el) {\n    ctx = ctx || document;\n    do {\n      if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) {\n        return el;\n      }\n      if (el === ctx) break;\n      /* jshint boss:true */\n    } while (el = getParentOrHost(el));\n  }\n  return null;\n}\nvar R_SPACE = /\\s+/g;\nfunction toggleClass(el, name, state) {\n  if (el && name) {\n    if (el.classList) {\n      el.classList[state ? 'add' : 'remove'](name);\n    } else {\n      var className = (' ' + el.className + ' ').replace(R_SPACE, ' ').replace(' ' + name + ' ', ' ');\n      el.className = (className + (state ? ' ' + name : '')).replace(R_SPACE, ' ');\n    }\n  }\n}\nfunction css(el, prop, val) {\n  var style = el && el.style;\n  if (style) {\n    if (val === void 0) {\n      if (document.defaultView && document.defaultView.getComputedStyle) {\n        val = document.defaultView.getComputedStyle(el, '');\n      } else if (el.currentStyle) {\n        val = el.currentStyle;\n      }\n      return prop === void 0 ? val : val[prop];\n    } else {\n      if (!(prop in style) && prop.indexOf('webkit') === -1) {\n        prop = '-webkit-' + prop;\n      }\n      style[prop] = val + (typeof val === 'string' ? '' : 'px');\n    }\n  }\n}\nfunction matrix(el, selfOnly) {\n  var appliedTransforms = '';\n  if (typeof el === 'string') {\n    appliedTransforms = el;\n  } else {\n    do {\n      var transform = css(el, 'transform');\n      if (transform && transform !== 'none') {\n        appliedTransforms = transform + ' ' + appliedTransforms;\n      }\n      /* jshint boss:true */\n    } while (!selfOnly && (el = el.parentNode));\n  }\n  var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix;\n  /*jshint -W056 */\n  return matrixFn && new matrixFn(appliedTransforms);\n}\nfunction find(ctx, tagName, iterator) {\n  if (ctx) {\n    var list = ctx.getElementsByTagName(tagName),\n      i = 0,\n      n = list.length;\n    if (iterator) {\n      for (; i < n; i++) {\n        iterator(list[i], i);\n      }\n    }\n    return list;\n  }\n  return [];\n}\nfunction getWindowScrollingElement() {\n  var scrollingElement = document.scrollingElement;\n  if (scrollingElement) {\n    return scrollingElement;\n  } else {\n    return document.documentElement;\n  }\n}\n\n/**\r\n * Returns the \"bounding client rect\" of given element\r\n * @param  {HTMLElement} el                       The element whose boundingClientRect is wanted\r\n * @param  {[Boolean]} relativeToContainingBlock  Whether the rect should be relative to the containing block of (including) the container\r\n * @param  {[Boolean]} relativeToNonStaticParent  Whether the rect should be relative to the relative parent of (including) the contaienr\r\n * @param  {[Boolean]} undoScale                  Whether the container's scale() should be undone\r\n * @param  {[HTMLElement]} container              The parent the element will be placed in\r\n * @return {Object}                               The boundingClientRect of el, with specified adjustments\r\n */\nfunction getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) {\n  if (!el.getBoundingClientRect && el !== window) return;\n  var elRect, top, left, bottom, right, height, width;\n  if (el !== window && el.parentNode && el !== getWindowScrollingElement()) {\n    elRect = el.getBoundingClientRect();\n    top = elRect.top;\n    left = elRect.left;\n    bottom = elRect.bottom;\n    right = elRect.right;\n    height = elRect.height;\n    width = elRect.width;\n  } else {\n    top = 0;\n    left = 0;\n    bottom = window.innerHeight;\n    right = window.innerWidth;\n    height = window.innerHeight;\n    width = window.innerWidth;\n  }\n  if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) {\n    // Adjust for translate()\n    container = container || el.parentNode;\n\n    // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312)\n    // Not needed on <= IE11\n    if (!IE11OrLess) {\n      do {\n        if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) {\n          var containerRect = container.getBoundingClientRect();\n\n          // Set relative to edges of padding box of container\n          top -= containerRect.top + parseInt(css(container, 'border-top-width'));\n          left -= containerRect.left + parseInt(css(container, 'border-left-width'));\n          bottom = top + elRect.height;\n          right = left + elRect.width;\n          break;\n        }\n        /* jshint boss:true */\n      } while (container = container.parentNode);\n    }\n  }\n  if (undoScale && el !== window) {\n    // Adjust for scale()\n    var elMatrix = matrix(container || el),\n      scaleX = elMatrix && elMatrix.a,\n      scaleY = elMatrix && elMatrix.d;\n    if (elMatrix) {\n      top /= scaleY;\n      left /= scaleX;\n      width /= scaleX;\n      height /= scaleY;\n      bottom = top + height;\n      right = left + width;\n    }\n  }\n  return {\n    top: top,\n    left: left,\n    bottom: bottom,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n/**\r\n * Checks if a side of an element is scrolled past a side of its parents\r\n * @param  {HTMLElement}  el           The element who's side being scrolled out of view is in question\r\n * @param  {String}       elSide       Side of the element in question ('top', 'left', 'right', 'bottom')\r\n * @param  {String}       parentSide   Side of the parent in question ('top', 'left', 'right', 'bottom')\r\n * @return {HTMLElement}               The parent scroll element that the el's side is scrolled past, or null if there is no such element\r\n */\nfunction isScrolledPast(el, elSide, parentSide) {\n  var parent = getParentAutoScrollElement(el, true),\n    elSideVal = getRect(el)[elSide];\n\n  /* jshint boss:true */\n  while (parent) {\n    var parentSideVal = getRect(parent)[parentSide],\n      visible = void 0;\n    if (parentSide === 'top' || parentSide === 'left') {\n      visible = elSideVal >= parentSideVal;\n    } else {\n      visible = elSideVal <= parentSideVal;\n    }\n    if (!visible) return parent;\n    if (parent === getWindowScrollingElement()) break;\n    parent = getParentAutoScrollElement(parent, false);\n  }\n  return false;\n}\n\n/**\r\n * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible)\r\n * and non-draggable elements\r\n * @param  {HTMLElement} el       The parent element\r\n * @param  {Number} childNum      The index of the child\r\n * @param  {Object} options       Parent Sortable's options\r\n * @return {HTMLElement}          The child at index childNum, or null if not found\r\n */\nfunction getChild(el, childNum, options, includeDragEl) {\n  var currentChild = 0,\n    i = 0,\n    children = el.children;\n  while (i < children.length) {\n    if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {\n      if (currentChild === childNum) {\n        return children[i];\n      }\n      currentChild++;\n    }\n    i++;\n  }\n  return null;\n}\n\n/**\r\n * Gets the last child in the el, ignoring ghostEl or invisible elements (clones)\r\n * @param  {HTMLElement} el       Parent element\r\n * @param  {selector} selector    Any other elements that should be ignored\r\n * @return {HTMLElement}          The last child, ignoring ghostEl\r\n */\nfunction lastChild(el, selector) {\n  var last = el.lastElementChild;\n  while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) {\n    last = last.previousElementSibling;\n  }\n  return last || null;\n}\n\n/**\r\n * Returns the index of an element within its parent for a selected set of\r\n * elements\r\n * @param  {HTMLElement} el\r\n * @param  {selector} selector\r\n * @return {number}\r\n */\nfunction index(el, selector) {\n  var index = 0;\n  if (!el || !el.parentNode) {\n    return -1;\n  }\n\n  /* jshint boss:true */\n  while (el = el.previousElementSibling) {\n    if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) {\n      index++;\n    }\n  }\n  return index;\n}\n\n/**\r\n * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements.\r\n * The value is returned in real pixels.\r\n * @param  {HTMLElement} el\r\n * @return {Array}             Offsets in the format of [left, top]\r\n */\nfunction getRelativeScrollOffset(el) {\n  var offsetLeft = 0,\n    offsetTop = 0,\n    winScroller = getWindowScrollingElement();\n  if (el) {\n    do {\n      var elMatrix = matrix(el),\n        scaleX = elMatrix.a,\n        scaleY = elMatrix.d;\n      offsetLeft += el.scrollLeft * scaleX;\n      offsetTop += el.scrollTop * scaleY;\n    } while (el !== winScroller && (el = el.parentNode));\n  }\n  return [offsetLeft, offsetTop];\n}\n\n/**\r\n * Returns the index of the object within the given array\r\n * @param  {Array} arr   Array that may or may not hold the object\r\n * @param  {Object} obj  An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find\r\n * @return {Number}      The index of the object in the array, or -1\r\n */\nfunction indexOfObject(arr, obj) {\n  for (var i in arr) {\n    if (!arr.hasOwnProperty(i)) continue;\n    for (var key in obj) {\n      if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i);\n    }\n  }\n  return -1;\n}\nfunction getParentAutoScrollElement(el, includeSelf) {\n  // skip to window\n  if (!el || !el.getBoundingClientRect) return getWindowScrollingElement();\n  var elem = el;\n  var gotSelf = false;\n  do {\n    // we don't need to get elem css if it isn't even overflowing in the first place (performance)\n    if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) {\n      var elemCSS = css(elem);\n      if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) {\n        if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement();\n        if (gotSelf || includeSelf) return elem;\n        gotSelf = true;\n      }\n    }\n    /* jshint boss:true */\n  } while (elem = elem.parentNode);\n  return getWindowScrollingElement();\n}\nfunction extend(dst, src) {\n  if (dst && src) {\n    for (var key in src) {\n      if (src.hasOwnProperty(key)) {\n        dst[key] = src[key];\n      }\n    }\n  }\n  return dst;\n}\nfunction isRectEqual(rect1, rect2) {\n  return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width);\n}\nvar _throttleTimeout;\nfunction throttle(callback, ms) {\n  return function () {\n    if (!_throttleTimeout) {\n      var args = arguments,\n        _this = this;\n      if (args.length === 1) {\n        callback.call(_this, args[0]);\n      } else {\n        callback.apply(_this, args);\n      }\n      _throttleTimeout = setTimeout(function () {\n        _throttleTimeout = void 0;\n      }, ms);\n    }\n  };\n}\nfunction cancelThrottle() {\n  clearTimeout(_throttleTimeout);\n  _throttleTimeout = void 0;\n}\nfunction scrollBy(el, x, y) {\n  el.scrollLeft += x;\n  el.scrollTop += y;\n}\nfunction clone(el) {\n  var Polymer = window.Polymer;\n  var $ = window.jQuery || window.Zepto;\n  if (Polymer && Polymer.dom) {\n    return Polymer.dom(el).cloneNode(true);\n  } else if ($) {\n    return $(el).clone(true)[0];\n  } else {\n    return el.cloneNode(true);\n  }\n}\nfunction setRect(el, rect) {\n  css(el, 'position', 'absolute');\n  css(el, 'top', rect.top);\n  css(el, 'left', rect.left);\n  css(el, 'width', rect.width);\n  css(el, 'height', rect.height);\n}\nfunction unsetRect(el) {\n  css(el, 'position', '');\n  css(el, 'top', '');\n  css(el, 'left', '');\n  css(el, 'width', '');\n  css(el, 'height', '');\n}\nfunction getChildContainingRectFromElement(container, options, ghostEl) {\n  var rect = {};\n  Array.from(container.children).forEach(function (child) {\n    var _rect$left, _rect$top, _rect$right, _rect$bottom;\n    if (!closest(child, options.draggable, container, false) || child.animated || child === ghostEl) return;\n    var childRect = getRect(child);\n    rect.left = Math.min((_rect$left = rect.left) !== null && _rect$left !== void 0 ? _rect$left : Infinity, childRect.left);\n    rect.top = Math.min((_rect$top = rect.top) !== null && _rect$top !== void 0 ? _rect$top : Infinity, childRect.top);\n    rect.right = Math.max((_rect$right = rect.right) !== null && _rect$right !== void 0 ? _rect$right : -Infinity, childRect.right);\n    rect.bottom = Math.max((_rect$bottom = rect.bottom) !== null && _rect$bottom !== void 0 ? _rect$bottom : -Infinity, childRect.bottom);\n  });\n  rect.width = rect.right - rect.left;\n  rect.height = rect.bottom - rect.top;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\nvar expando = 'Sortable' + new Date().getTime();\n\nfunction AnimationStateManager() {\n  var animationStates = [],\n    animationCallbackId;\n  return {\n    captureAnimationState: function captureAnimationState() {\n      animationStates = [];\n      if (!this.options.animation) return;\n      var children = [].slice.call(this.el.children);\n      children.forEach(function (child) {\n        if (css(child, 'display') === 'none' || child === Sortable.ghost) return;\n        animationStates.push({\n          target: child,\n          rect: getRect(child)\n        });\n        var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect);\n\n        // If animating: compensate for current animation\n        if (child.thisAnimationDuration) {\n          var childMatrix = matrix(child, true);\n          if (childMatrix) {\n            fromRect.top -= childMatrix.f;\n            fromRect.left -= childMatrix.e;\n          }\n        }\n        child.fromRect = fromRect;\n      });\n    },\n    addAnimationState: function addAnimationState(state) {\n      animationStates.push(state);\n    },\n    removeAnimationState: function removeAnimationState(target) {\n      animationStates.splice(indexOfObject(animationStates, {\n        target: target\n      }), 1);\n    },\n    animateAll: function animateAll(callback) {\n      var _this = this;\n      if (!this.options.animation) {\n        clearTimeout(animationCallbackId);\n        if (typeof callback === 'function') callback();\n        return;\n      }\n      var animating = false,\n        animationTime = 0;\n      animationStates.forEach(function (state) {\n        var time = 0,\n          target = state.target,\n          fromRect = target.fromRect,\n          toRect = getRect(target),\n          prevFromRect = target.prevFromRect,\n          prevToRect = target.prevToRect,\n          animatingRect = state.rect,\n          targetMatrix = matrix(target, true);\n        if (targetMatrix) {\n          // Compensate for current animation\n          toRect.top -= targetMatrix.f;\n          toRect.left -= targetMatrix.e;\n        }\n        target.toRect = toRect;\n        if (target.thisAnimationDuration) {\n          // Could also check if animatingRect is between fromRect and toRect\n          if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) &&\n          // Make sure animatingRect is on line between toRect & fromRect\n          (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) {\n            // If returning to same place as started from animation and on same axis\n            time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options);\n          }\n        }\n\n        // if fromRect != toRect: animate\n        if (!isRectEqual(toRect, fromRect)) {\n          target.prevFromRect = fromRect;\n          target.prevToRect = toRect;\n          if (!time) {\n            time = _this.options.animation;\n          }\n          _this.animate(target, animatingRect, toRect, time);\n        }\n        if (time) {\n          animating = true;\n          animationTime = Math.max(animationTime, time);\n          clearTimeout(target.animationResetTimer);\n          target.animationResetTimer = setTimeout(function () {\n            target.animationTime = 0;\n            target.prevFromRect = null;\n            target.fromRect = null;\n            target.prevToRect = null;\n            target.thisAnimationDuration = null;\n          }, time);\n          target.thisAnimationDuration = time;\n        }\n      });\n      clearTimeout(animationCallbackId);\n      if (!animating) {\n        if (typeof callback === 'function') callback();\n      } else {\n        animationCallbackId = setTimeout(function () {\n          if (typeof callback === 'function') callback();\n        }, animationTime);\n      }\n      animationStates = [];\n    },\n    animate: function animate(target, currentRect, toRect, duration) {\n      if (duration) {\n        css(target, 'transition', '');\n        css(target, 'transform', '');\n        var elMatrix = matrix(this.el),\n          scaleX = elMatrix && elMatrix.a,\n          scaleY = elMatrix && elMatrix.d,\n          translateX = (currentRect.left - toRect.left) / (scaleX || 1),\n          translateY = (currentRect.top - toRect.top) / (scaleY || 1);\n        target.animatingX = !!translateX;\n        target.animatingY = !!translateY;\n        css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)');\n        this.forRepaintDummy = repaint(target); // repaint\n\n        css(target, 'transition', 'transform ' + duration + 'ms' + (this.options.easing ? ' ' + this.options.easing : ''));\n        css(target, 'transform', 'translate3d(0,0,0)');\n        typeof target.animated === 'number' && clearTimeout(target.animated);\n        target.animated = setTimeout(function () {\n          css(target, 'transition', '');\n          css(target, 'transform', '');\n          target.animated = false;\n          target.animatingX = false;\n          target.animatingY = false;\n        }, duration);\n      }\n    }\n  };\n}\nfunction repaint(target) {\n  return target.offsetWidth;\n}\nfunction calculateRealTime(animatingRect, fromRect, toRect, options) {\n  return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation;\n}\n\nvar plugins = [];\nvar defaults = {\n  initializeByDefault: true\n};\nvar PluginManager = {\n  mount: function mount(plugin) {\n    // Set default static properties\n    for (var option in defaults) {\n      if (defaults.hasOwnProperty(option) && !(option in plugin)) {\n        plugin[option] = defaults[option];\n      }\n    }\n    plugins.forEach(function (p) {\n      if (p.pluginName === plugin.pluginName) {\n        throw \"Sortable: Cannot mount plugin \".concat(plugin.pluginName, \" more than once\");\n      }\n    });\n    plugins.push(plugin);\n  },\n  pluginEvent: function pluginEvent(eventName, sortable, evt) {\n    var _this = this;\n    this.eventCanceled = false;\n    evt.cancel = function () {\n      _this.eventCanceled = true;\n    };\n    var eventNameGlobal = eventName + 'Global';\n    plugins.forEach(function (plugin) {\n      if (!sortable[plugin.pluginName]) return;\n      // Fire global events if it exists in this sortable\n      if (sortable[plugin.pluginName][eventNameGlobal]) {\n        sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n\n      // Only fire plugin event if plugin is enabled in this sortable,\n      // and plugin has event defined\n      if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {\n        sortable[plugin.pluginName][eventName](_objectSpread2({\n          sortable: sortable\n        }, evt));\n      }\n    });\n  },\n  initializePlugins: function initializePlugins(sortable, el, defaults, options) {\n    plugins.forEach(function (plugin) {\n      var pluginName = plugin.pluginName;\n      if (!sortable.options[pluginName] && !plugin.initializeByDefault) return;\n      var initialized = new plugin(sortable, el, sortable.options);\n      initialized.sortable = sortable;\n      initialized.options = sortable.options;\n      sortable[pluginName] = initialized;\n\n      // Add default options from plugin\n      _extends(defaults, initialized.defaults);\n    });\n    for (var option in sortable.options) {\n      if (!sortable.options.hasOwnProperty(option)) continue;\n      var modified = this.modifyOption(sortable, option, sortable.options[option]);\n      if (typeof modified !== 'undefined') {\n        sortable.options[option] = modified;\n      }\n    }\n  },\n  getEventProperties: function getEventProperties(name, sortable) {\n    var eventProperties = {};\n    plugins.forEach(function (plugin) {\n      if (typeof plugin.eventProperties !== 'function') return;\n      _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name));\n    });\n    return eventProperties;\n  },\n  modifyOption: function modifyOption(sortable, name, value) {\n    var modifiedValue;\n    plugins.forEach(function (plugin) {\n      // Plugin must exist on the Sortable\n      if (!sortable[plugin.pluginName]) return;\n\n      // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin\n      if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') {\n        modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value);\n      }\n    });\n    return modifiedValue;\n  }\n};\n\nfunction dispatchEvent(_ref) {\n  var sortable = _ref.sortable,\n    rootEl = _ref.rootEl,\n    name = _ref.name,\n    targetEl = _ref.targetEl,\n    cloneEl = _ref.cloneEl,\n    toEl = _ref.toEl,\n    fromEl = _ref.fromEl,\n    oldIndex = _ref.oldIndex,\n    newIndex = _ref.newIndex,\n    oldDraggableIndex = _ref.oldDraggableIndex,\n    newDraggableIndex = _ref.newDraggableIndex,\n    originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    extraEventProperties = _ref.extraEventProperties;\n  sortable = sortable || rootEl && rootEl[expando];\n  if (!sortable) return;\n  var evt,\n    options = sortable.options,\n    onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1);\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent(name, {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent(name, true, true);\n  }\n  evt.to = toEl || rootEl;\n  evt.from = fromEl || rootEl;\n  evt.item = targetEl || rootEl;\n  evt.clone = cloneEl;\n  evt.oldIndex = oldIndex;\n  evt.newIndex = newIndex;\n  evt.oldDraggableIndex = oldDraggableIndex;\n  evt.newDraggableIndex = newDraggableIndex;\n  evt.originalEvent = originalEvent;\n  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;\n  var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));\n  for (var option in allEventProperties) {\n    evt[option] = allEventProperties[option];\n  }\n  if (rootEl) {\n    rootEl.dispatchEvent(evt);\n  }\n  if (options[onName]) {\n    options[onName].call(sortable, evt);\n  }\n}\n\nvar _excluded = [\"evt\"];\nvar pluginEvent = function pluginEvent(eventName, sortable) {\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n    originalEvent = _ref.evt,\n    data = _objectWithoutProperties(_ref, _excluded);\n  PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({\n    dragEl: dragEl,\n    parentEl: parentEl,\n    ghostEl: ghostEl,\n    rootEl: rootEl,\n    nextEl: nextEl,\n    lastDownEl: lastDownEl,\n    cloneEl: cloneEl,\n    cloneHidden: cloneHidden,\n    dragStarted: moved,\n    putSortable: putSortable,\n    activeSortable: Sortable.active,\n    originalEvent: originalEvent,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex,\n    hideGhostForTarget: _hideGhostForTarget,\n    unhideGhostForTarget: _unhideGhostForTarget,\n    cloneNowHidden: function cloneNowHidden() {\n      cloneHidden = true;\n    },\n    cloneNowShown: function cloneNowShown() {\n      cloneHidden = false;\n    },\n    dispatchSortableEvent: function dispatchSortableEvent(name) {\n      _dispatchEvent({\n        sortable: sortable,\n        name: name,\n        originalEvent: originalEvent\n      });\n    }\n  }, data));\n};\nfunction _dispatchEvent(info) {\n  dispatchEvent(_objectSpread2({\n    putSortable: putSortable,\n    cloneEl: cloneEl,\n    targetEl: dragEl,\n    rootEl: rootEl,\n    oldIndex: oldIndex,\n    oldDraggableIndex: oldDraggableIndex,\n    newIndex: newIndex,\n    newDraggableIndex: newDraggableIndex\n  }, info));\n}\nvar dragEl,\n  parentEl,\n  ghostEl,\n  rootEl,\n  nextEl,\n  lastDownEl,\n  cloneEl,\n  cloneHidden,\n  oldIndex,\n  newIndex,\n  oldDraggableIndex,\n  newDraggableIndex,\n  activeGroup,\n  putSortable,\n  awaitingDragStarted = false,\n  ignoreNextClick = false,\n  sortables = [],\n  tapEvt,\n  touchEvt,\n  lastDx,\n  lastDy,\n  tapDistanceLeft,\n  tapDistanceTop,\n  moved,\n  lastTarget,\n  lastDirection,\n  pastFirstInvertThresh = false,\n  isCircumstantialInvert = false,\n  targetMoveDistance,\n  // For positioning ghost absolutely\n  ghostRelativeParent,\n  ghostRelativeParentInitialScroll = [],\n  // (left, top)\n\n  _silent = false,\n  savedInputChecked = [];\n\n/** @const */\nvar documentExists = typeof document !== 'undefined',\n  PositionGhostAbsolutely = IOS,\n  CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float',\n  // This will not pass for IE9, because IE9 DnD only works on anchors\n  supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'),\n  supportCssPointerEvents = function () {\n    if (!documentExists) return;\n    // false when <= IE11\n    if (IE11OrLess) {\n      return false;\n    }\n    var el = document.createElement('x');\n    el.style.cssText = 'pointer-events:auto';\n    return el.style.pointerEvents === 'auto';\n  }(),\n  _detectDirection = function _detectDirection(el, options) {\n    var elCSS = css(el),\n      elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth),\n      child1 = getChild(el, 0, options),\n      child2 = getChild(el, 1, options),\n      firstChildCSS = child1 && css(child1),\n      secondChildCSS = child2 && css(child2),\n      firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width,\n      secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width;\n    if (elCSS.display === 'flex') {\n      return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal';\n    }\n    if (elCSS.display === 'grid') {\n      return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal';\n    }\n    if (child1 && firstChildCSS[\"float\"] && firstChildCSS[\"float\"] !== 'none') {\n      var touchingSideChild2 = firstChildCSS[\"float\"] === 'left' ? 'left' : 'right';\n      return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal';\n    }\n    return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal';\n  },\n  _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) {\n    var dragElS1Opp = vertical ? dragRect.left : dragRect.top,\n      dragElS2Opp = vertical ? dragRect.right : dragRect.bottom,\n      dragElOppLength = vertical ? dragRect.width : dragRect.height,\n      targetS1Opp = vertical ? targetRect.left : targetRect.top,\n      targetS2Opp = vertical ? targetRect.right : targetRect.bottom,\n      targetOppLength = vertical ? targetRect.width : targetRect.height;\n    return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;\n  },\n  /**\r\n   * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.\r\n   * @param  {Number} x      X position\r\n   * @param  {Number} y      Y position\r\n   * @return {HTMLElement}   Element of the first found nearest Sortable\r\n   */\n  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {\n    var ret;\n    sortables.some(function (sortable) {\n      var threshold = sortable[expando].options.emptyInsertThreshold;\n      if (!threshold || lastChild(sortable)) return;\n      var rect = getRect(sortable),\n        insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,\n        insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;\n      if (insideHorizontally && insideVertically) {\n        return ret = sortable;\n      }\n    });\n    return ret;\n  },\n  _prepareGroup = function _prepareGroup(options) {\n    function toFn(value, pull) {\n      return function (to, from, dragEl, evt) {\n        var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name;\n        if (value == null && (pull || sameGroup)) {\n          // Default pull value\n          // Default pull and put value if same group\n          return true;\n        } else if (value == null || value === false) {\n          return false;\n        } else if (pull && value === 'clone') {\n          return value;\n        } else if (typeof value === 'function') {\n          return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt);\n        } else {\n          var otherGroup = (pull ? to : from).options.group.name;\n          return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1;\n        }\n      };\n    }\n    var group = {};\n    var originalGroup = options.group;\n    if (!originalGroup || _typeof(originalGroup) != 'object') {\n      originalGroup = {\n        name: originalGroup\n      };\n    }\n    group.name = originalGroup.name;\n    group.checkPull = toFn(originalGroup.pull, true);\n    group.checkPut = toFn(originalGroup.put);\n    group.revertClone = originalGroup.revertClone;\n    options.group = group;\n  },\n  _hideGhostForTarget = function _hideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', 'none');\n    }\n  },\n  _unhideGhostForTarget = function _unhideGhostForTarget() {\n    if (!supportCssPointerEvents && ghostEl) {\n      css(ghostEl, 'display', '');\n    }\n  };\n\n// #1184 fix - Prevent click event on fallback if dragged but item not changed position\nif (documentExists && !ChromeForAndroid) {\n  document.addEventListener('click', function (evt) {\n    if (ignoreNextClick) {\n      evt.preventDefault();\n      evt.stopPropagation && evt.stopPropagation();\n      evt.stopImmediatePropagation && evt.stopImmediatePropagation();\n      ignoreNextClick = false;\n      return false;\n    }\n  }, true);\n}\nvar nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) {\n  if (dragEl) {\n    evt = evt.touches ? evt.touches[0] : evt;\n    var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY);\n    if (nearest) {\n      // Create imitation event\n      var event = {};\n      for (var i in evt) {\n        if (evt.hasOwnProperty(i)) {\n          event[i] = evt[i];\n        }\n      }\n      event.target = event.rootEl = nearest;\n      event.preventDefault = void 0;\n      event.stopPropagation = void 0;\n      nearest[expando]._onDragOver(event);\n    }\n  }\n};\nvar _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {\n  if (dragEl) {\n    dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n  }\n};\n\n/**\r\n * @class  Sortable\r\n * @param  {HTMLElement}  el\r\n * @param  {Object}       [options]\r\n */\nfunction Sortable(el, options) {\n  if (!(el && el.nodeType && el.nodeType === 1)) {\n    throw \"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(el));\n  }\n  this.el = el; // root element\n  this.options = options = _extends({}, options);\n\n  // Export instance\n  el[expando] = this;\n  var defaults = {\n    group: null,\n    sort: true,\n    disabled: false,\n    store: null,\n    handle: null,\n    draggable: /^[uo]l$/i.test(el.nodeName) ? '>li' : '>*',\n    swapThreshold: 1,\n    // percentage; 0 <= x <= 1\n    invertSwap: false,\n    // invert always\n    invertedSwapThreshold: null,\n    // will be set to same as swapThreshold if default\n    removeCloneOnHide: true,\n    direction: function direction() {\n      return _detectDirection(el, this.options);\n    },\n    ghostClass: 'sortable-ghost',\n    chosenClass: 'sortable-chosen',\n    dragClass: 'sortable-drag',\n    ignore: 'a, img',\n    filter: null,\n    preventOnFilter: true,\n    animation: 0,\n    easing: null,\n    setData: function setData(dataTransfer, dragEl) {\n      dataTransfer.setData('Text', dragEl.textContent);\n    },\n    dropBubble: false,\n    dragoverBubble: false,\n    dataIdAttr: 'data-id',\n    delay: 0,\n    delayOnTouchOnly: false,\n    touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1,\n    forceFallback: false,\n    fallbackClass: 'sortable-fallback',\n    fallbackOnBody: false,\n    fallbackTolerance: 0,\n    fallbackOffset: {\n      x: 0,\n      y: 0\n    },\n    supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari,\n    emptyInsertThreshold: 5\n  };\n  PluginManager.initializePlugins(this, el, defaults);\n\n  // Set default options\n  for (var name in defaults) {\n    !(name in options) && (options[name] = defaults[name]);\n  }\n  _prepareGroup(options);\n\n  // Bind all private methods\n  for (var fn in this) {\n    if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n      this[fn] = this[fn].bind(this);\n    }\n  }\n\n  // Setup drag mode\n  this.nativeDraggable = options.forceFallback ? false : supportDraggable;\n  if (this.nativeDraggable) {\n    // Touch start threshold cannot be greater than the native dragstart threshold\n    this.options.touchStartThreshold = 1;\n  }\n\n  // Bind events\n  if (options.supportPointer) {\n    on(el, 'pointerdown', this._onTapStart);\n  } else {\n    on(el, 'mousedown', this._onTapStart);\n    on(el, 'touchstart', this._onTapStart);\n  }\n  if (this.nativeDraggable) {\n    on(el, 'dragover', this);\n    on(el, 'dragenter', this);\n  }\n  sortables.push(this.el);\n\n  // Restore sorting\n  options.store && options.store.get && this.sort(options.store.get(this) || []);\n\n  // Add animation state manager\n  _extends(this, AnimationStateManager());\n}\nSortable.prototype = /** @lends Sortable.prototype */{\n  constructor: Sortable,\n  _isOutsideThisEl: function _isOutsideThisEl(target) {\n    if (!this.el.contains(target) && target !== this.el) {\n      lastTarget = null;\n    }\n  },\n  _getDirection: function _getDirection(evt, target) {\n    return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction;\n  },\n  _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) {\n    if (!evt.cancelable) return;\n    var _this = this,\n      el = this.el,\n      options = this.options,\n      preventOnFilter = options.preventOnFilter,\n      type = evt.type,\n      touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt,\n      target = (touch || evt).target,\n      originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target,\n      filter = options.filter;\n    _saveInputCheckedState(el);\n\n    // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group.\n    if (dragEl) {\n      return;\n    }\n    if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) {\n      return; // only left button and enabled\n    }\n\n    // cancel dnd if original target is content editable\n    if (originalTarget.isContentEditable) {\n      return;\n    }\n\n    // Safari ignores further event handling after mousedown\n    if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') {\n      return;\n    }\n    target = closest(target, options.draggable, el, false);\n    if (target && target.animated) {\n      return;\n    }\n    if (lastDownEl === target) {\n      // Ignoring duplicate `down`\n      return;\n    }\n\n    // Get the index of the dragged element within its parent\n    oldIndex = index(target);\n    oldDraggableIndex = index(target, options.draggable);\n\n    // Check filter\n    if (typeof filter === 'function') {\n      if (filter.call(this, evt, target, this)) {\n        _dispatchEvent({\n          sortable: _this,\n          rootEl: originalTarget,\n          name: 'filter',\n          targetEl: target,\n          toEl: el,\n          fromEl: el\n        });\n        pluginEvent('filter', _this, {\n          evt: evt\n        });\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    } else if (filter) {\n      filter = filter.split(',').some(function (criteria) {\n        criteria = closest(originalTarget, criteria.trim(), el, false);\n        if (criteria) {\n          _dispatchEvent({\n            sortable: _this,\n            rootEl: criteria,\n            name: 'filter',\n            targetEl: target,\n            fromEl: el,\n            toEl: el\n          });\n          pluginEvent('filter', _this, {\n            evt: evt\n          });\n          return true;\n        }\n      });\n      if (filter) {\n        preventOnFilter && evt.cancelable && evt.preventDefault();\n        return; // cancel dnd\n      }\n    }\n    if (options.handle && !closest(originalTarget, options.handle, el, false)) {\n      return;\n    }\n\n    // Prepare `dragstart`\n    this._prepareDragStart(evt, touch, target);\n  },\n  _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) {\n    var _this = this,\n      el = _this.el,\n      options = _this.options,\n      ownerDocument = el.ownerDocument,\n      dragStartFn;\n    if (target && !dragEl && target.parentNode === el) {\n      var dragRect = getRect(target);\n      rootEl = el;\n      dragEl = target;\n      parentEl = dragEl.parentNode;\n      nextEl = dragEl.nextSibling;\n      lastDownEl = target;\n      activeGroup = options.group;\n      Sortable.dragged = dragEl;\n      tapEvt = {\n        target: dragEl,\n        clientX: (touch || evt).clientX,\n        clientY: (touch || evt).clientY\n      };\n      tapDistanceLeft = tapEvt.clientX - dragRect.left;\n      tapDistanceTop = tapEvt.clientY - dragRect.top;\n      this._lastX = (touch || evt).clientX;\n      this._lastY = (touch || evt).clientY;\n      dragEl.style['will-change'] = 'all';\n      dragStartFn = function dragStartFn() {\n        pluginEvent('delayEnded', _this, {\n          evt: evt\n        });\n        if (Sortable.eventCanceled) {\n          _this._onDrop();\n          return;\n        }\n        // Delayed drag has been triggered\n        // we can re-enable the events: touchmove/mousemove\n        _this._disableDelayedDragEvents();\n        if (!FireFox && _this.nativeDraggable) {\n          dragEl.draggable = true;\n        }\n\n        // Bind the events: dragstart/dragend\n        _this._triggerDragStart(evt, touch);\n\n        // Drag start event\n        _dispatchEvent({\n          sortable: _this,\n          name: 'choose',\n          originalEvent: evt\n        });\n\n        // Chosen item\n        toggleClass(dragEl, options.chosenClass, true);\n      };\n\n      // Disable \"draggable\"\n      options.ignore.split(',').forEach(function (criteria) {\n        find(dragEl, criteria.trim(), _disableDraggable);\n      });\n      on(ownerDocument, 'dragover', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mousemove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent);\n      on(ownerDocument, 'mouseup', _this._onDrop);\n      on(ownerDocument, 'touchend', _this._onDrop);\n      on(ownerDocument, 'touchcancel', _this._onDrop);\n\n      // Make dragEl draggable (must be before delay for FireFox)\n      if (FireFox && this.nativeDraggable) {\n        this.options.touchStartThreshold = 4;\n        dragEl.draggable = true;\n      }\n      pluginEvent('delayStart', this, {\n        evt: evt\n      });\n\n      // Delay is impossible for native DnD in Edge or IE\n      if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) {\n        if (Sortable.eventCanceled) {\n          this._onDrop();\n          return;\n        }\n        // If the user moves the pointer or let go the click or touch\n        // before the delay has been reached:\n        // disable the delayed drag\n        on(ownerDocument, 'mouseup', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchend', _this._disableDelayedDrag);\n        on(ownerDocument, 'touchcancel', _this._disableDelayedDrag);\n        on(ownerDocument, 'mousemove', _this._delayedDragTouchMoveHandler);\n        on(ownerDocument, 'touchmove', _this._delayedDragTouchMoveHandler);\n        options.supportPointer && on(ownerDocument, 'pointermove', _this._delayedDragTouchMoveHandler);\n        _this._dragStartTimer = setTimeout(dragStartFn, options.delay);\n      } else {\n        dragStartFn();\n      }\n    }\n  },\n  _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) {\n    var touch = e.touches ? e.touches[0] : e;\n    if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) {\n      this._disableDelayedDrag();\n    }\n  },\n  _disableDelayedDrag: function _disableDelayedDrag() {\n    dragEl && _disableDraggable(dragEl);\n    clearTimeout(this._dragStartTimer);\n    this._disableDelayedDragEvents();\n  },\n  _disableDelayedDragEvents: function _disableDelayedDragEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._disableDelayedDrag);\n    off(ownerDocument, 'touchend', this._disableDelayedDrag);\n    off(ownerDocument, 'touchcancel', this._disableDelayedDrag);\n    off(ownerDocument, 'mousemove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler);\n    off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler);\n  },\n  _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) {\n    touch = touch || evt.pointerType == 'touch' && evt;\n    if (!this.nativeDraggable || touch) {\n      if (this.options.supportPointer) {\n        on(document, 'pointermove', this._onTouchMove);\n      } else if (touch) {\n        on(document, 'touchmove', this._onTouchMove);\n      } else {\n        on(document, 'mousemove', this._onTouchMove);\n      }\n    } else {\n      on(dragEl, 'dragend', this);\n      on(rootEl, 'dragstart', this._onDragStart);\n    }\n    try {\n      if (document.selection) {\n        // Timeout neccessary for IE9\n        _nextTick(function () {\n          document.selection.empty();\n        });\n      } else {\n        window.getSelection().removeAllRanges();\n      }\n    } catch (err) {}\n  },\n  _dragStarted: function _dragStarted(fallback, evt) {\n    awaitingDragStarted = false;\n    if (rootEl && dragEl) {\n      pluginEvent('dragStarted', this, {\n        evt: evt\n      });\n      if (this.nativeDraggable) {\n        on(document, 'dragover', _checkOutsideTargetEl);\n      }\n      var options = this.options;\n\n      // Apply effect\n      !fallback && toggleClass(dragEl, options.dragClass, false);\n      toggleClass(dragEl, options.ghostClass, true);\n      Sortable.active = this;\n      fallback && this._appendGhost();\n\n      // Drag start event\n      _dispatchEvent({\n        sortable: this,\n        name: 'start',\n        originalEvent: evt\n      });\n    } else {\n      this._nulling();\n    }\n  },\n  _emulateDragOver: function _emulateDragOver() {\n    if (touchEvt) {\n      this._lastX = touchEvt.clientX;\n      this._lastY = touchEvt.clientY;\n      _hideGhostForTarget();\n      var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n      var parent = target;\n      while (target && target.shadowRoot) {\n        target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY);\n        if (target === parent) break;\n        parent = target;\n      }\n      dragEl.parentNode[expando]._isOutsideThisEl(target);\n      if (parent) {\n        do {\n          if (parent[expando]) {\n            var inserted = void 0;\n            inserted = parent[expando]._onDragOver({\n              clientX: touchEvt.clientX,\n              clientY: touchEvt.clientY,\n              target: target,\n              rootEl: parent\n            });\n            if (inserted && !this.options.dragoverBubble) {\n              break;\n            }\n          }\n          target = parent; // store last element\n        }\n        /* jshint boss:true */ while (parent = parent.parentNode);\n      }\n      _unhideGhostForTarget();\n    }\n  },\n  _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) {\n    if (tapEvt) {\n      var options = this.options,\n        fallbackTolerance = options.fallbackTolerance,\n        fallbackOffset = options.fallbackOffset,\n        touch = evt.touches ? evt.touches[0] : evt,\n        ghostMatrix = ghostEl && matrix(ghostEl, true),\n        scaleX = ghostEl && ghostMatrix && ghostMatrix.a,\n        scaleY = ghostEl && ghostMatrix && ghostMatrix.d,\n        relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent),\n        dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1),\n        dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1);\n\n      // only set the status to dragging, when we are actually dragging\n      if (!Sortable.active && !awaitingDragStarted) {\n        if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) {\n          return;\n        }\n        this._onDragStart(evt, true);\n      }\n      if (ghostEl) {\n        if (ghostMatrix) {\n          ghostMatrix.e += dx - (lastDx || 0);\n          ghostMatrix.f += dy - (lastDy || 0);\n        } else {\n          ghostMatrix = {\n            a: 1,\n            b: 0,\n            c: 0,\n            d: 1,\n            e: dx,\n            f: dy\n          };\n        }\n        var cssMatrix = \"matrix(\".concat(ghostMatrix.a, \",\").concat(ghostMatrix.b, \",\").concat(ghostMatrix.c, \",\").concat(ghostMatrix.d, \",\").concat(ghostMatrix.e, \",\").concat(ghostMatrix.f, \")\");\n        css(ghostEl, 'webkitTransform', cssMatrix);\n        css(ghostEl, 'mozTransform', cssMatrix);\n        css(ghostEl, 'msTransform', cssMatrix);\n        css(ghostEl, 'transform', cssMatrix);\n        lastDx = dx;\n        lastDy = dy;\n        touchEvt = touch;\n      }\n      evt.cancelable && evt.preventDefault();\n    }\n  },\n  _appendGhost: function _appendGhost() {\n    // Bug if using scale(): https://stackoverflow.com/questions/2637058\n    // Not being adjusted for\n    if (!ghostEl) {\n      var container = this.options.fallbackOnBody ? document.body : rootEl,\n        rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container),\n        options = this.options;\n\n      // Position absolutely\n      if (PositionGhostAbsolutely) {\n        // Get relatively positioned parent\n        ghostRelativeParent = container;\n        while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) {\n          ghostRelativeParent = ghostRelativeParent.parentNode;\n        }\n        if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) {\n          if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement();\n          rect.top += ghostRelativeParent.scrollTop;\n          rect.left += ghostRelativeParent.scrollLeft;\n        } else {\n          ghostRelativeParent = getWindowScrollingElement();\n        }\n        ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent);\n      }\n      ghostEl = dragEl.cloneNode(true);\n      toggleClass(ghostEl, options.ghostClass, false);\n      toggleClass(ghostEl, options.fallbackClass, true);\n      toggleClass(ghostEl, options.dragClass, true);\n      css(ghostEl, 'transition', '');\n      css(ghostEl, 'transform', '');\n      css(ghostEl, 'box-sizing', 'border-box');\n      css(ghostEl, 'margin', 0);\n      css(ghostEl, 'top', rect.top);\n      css(ghostEl, 'left', rect.left);\n      css(ghostEl, 'width', rect.width);\n      css(ghostEl, 'height', rect.height);\n      css(ghostEl, 'opacity', '0.8');\n      css(ghostEl, 'position', PositionGhostAbsolutely ? 'absolute' : 'fixed');\n      css(ghostEl, 'zIndex', '100000');\n      css(ghostEl, 'pointerEvents', 'none');\n      Sortable.ghost = ghostEl;\n      container.appendChild(ghostEl);\n\n      // Set transform-origin\n      css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%');\n    }\n  },\n  _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) {\n    var _this = this;\n    var dataTransfer = evt.dataTransfer;\n    var options = _this.options;\n    pluginEvent('dragStart', this, {\n      evt: evt\n    });\n    if (Sortable.eventCanceled) {\n      this._onDrop();\n      return;\n    }\n    pluginEvent('setupClone', this);\n    if (!Sortable.eventCanceled) {\n      cloneEl = clone(dragEl);\n      cloneEl.removeAttribute(\"id\");\n      cloneEl.draggable = false;\n      cloneEl.style['will-change'] = '';\n      this._hideClone();\n      toggleClass(cloneEl, this.options.chosenClass, false);\n      Sortable.clone = cloneEl;\n    }\n\n    // #1143: IFrame support workaround\n    _this.cloneId = _nextTick(function () {\n      pluginEvent('clone', _this);\n      if (Sortable.eventCanceled) return;\n      if (!_this.options.removeCloneOnHide) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      }\n      _this._hideClone();\n      _dispatchEvent({\n        sortable: _this,\n        name: 'clone'\n      });\n    });\n    !fallback && toggleClass(dragEl, options.dragClass, true);\n\n    // Set proper drop events\n    if (fallback) {\n      ignoreNextClick = true;\n      _this._loopId = setInterval(_this._emulateDragOver, 50);\n    } else {\n      // Undo what was set in _prepareDragStart before drag started\n      off(document, 'mouseup', _this._onDrop);\n      off(document, 'touchend', _this._onDrop);\n      off(document, 'touchcancel', _this._onDrop);\n      if (dataTransfer) {\n        dataTransfer.effectAllowed = 'move';\n        options.setData && options.setData.call(_this, dataTransfer, dragEl);\n      }\n      on(document, 'drop', _this);\n\n      // #1276 fix:\n      css(dragEl, 'transform', 'translateZ(0)');\n    }\n    awaitingDragStarted = true;\n    _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt));\n    on(document, 'selectstart', _this);\n    moved = true;\n    if (Safari) {\n      css(document.body, 'user-select', 'none');\n    }\n  },\n  // Returns true - if no further action is needed (either inserted or another condition)\n  _onDragOver: function _onDragOver( /**Event*/evt) {\n    var el = this.el,\n      target = evt.target,\n      dragRect,\n      targetRect,\n      revert,\n      options = this.options,\n      group = options.group,\n      activeSortable = Sortable.active,\n      isOwner = activeGroup === group,\n      canSort = options.sort,\n      fromSortable = putSortable || activeSortable,\n      vertical,\n      _this = this,\n      completedFired = false;\n    if (_silent) return;\n    function dragOverEvent(name, extra) {\n      pluginEvent(name, _this, _objectSpread2({\n        evt: evt,\n        isOwner: isOwner,\n        axis: vertical ? 'vertical' : 'horizontal',\n        revert: revert,\n        dragRect: dragRect,\n        targetRect: targetRect,\n        canSort: canSort,\n        fromSortable: fromSortable,\n        target: target,\n        completed: completed,\n        onMove: function onMove(target, after) {\n          return _onMove(rootEl, el, dragEl, dragRect, target, getRect(target), evt, after);\n        },\n        changed: changed\n      }, extra));\n    }\n\n    // Capture animation state\n    function capture() {\n      dragOverEvent('dragOverAnimationCapture');\n      _this.captureAnimationState();\n      if (_this !== fromSortable) {\n        fromSortable.captureAnimationState();\n      }\n    }\n\n    // Return invocation when dragEl is inserted (or completed)\n    function completed(insertion) {\n      dragOverEvent('dragOverCompleted', {\n        insertion: insertion\n      });\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        } else {\n          activeSortable._showClone(_this);\n        }\n        if (_this !== fromSortable) {\n          // Set ghost class to new sortable's ghost class\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false);\n          toggleClass(dragEl, options.ghostClass, true);\n        }\n        if (putSortable !== _this && _this !== Sortable.active) {\n          putSortable = _this;\n        } else if (_this === Sortable.active && putSortable) {\n          putSortable = null;\n        }\n\n        // Animation\n        if (fromSortable === _this) {\n          _this._ignoreWhileAnimating = target;\n        }\n        _this.animateAll(function () {\n          dragOverEvent('dragOverAnimationComplete');\n          _this._ignoreWhileAnimating = null;\n        });\n        if (_this !== fromSortable) {\n          fromSortable.animateAll();\n          fromSortable._ignoreWhileAnimating = null;\n        }\n      }\n\n      // Null lastTarget if it is not inside a previously swapped element\n      if (target === dragEl && !dragEl.animated || target === el && !target.animated) {\n        lastTarget = null;\n      }\n\n      // no bubbling and not fallback\n      if (!options.dragoverBubble && !evt.rootEl && target !== document) {\n        dragEl.parentNode[expando]._isOutsideThisEl(evt.target);\n\n        // Do not detect for empty insert if already inserted\n        !insertion && nearestEmptyInsertDetectEvent(evt);\n      }\n      !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation();\n      return completedFired = true;\n    }\n\n    // Call when dragEl has been inserted\n    function changed() {\n      newIndex = index(dragEl);\n      newDraggableIndex = index(dragEl, options.draggable);\n      _dispatchEvent({\n        sortable: _this,\n        name: 'change',\n        toEl: el,\n        newIndex: newIndex,\n        newDraggableIndex: newDraggableIndex,\n        originalEvent: evt\n      });\n    }\n    if (evt.preventDefault !== void 0) {\n      evt.cancelable && evt.preventDefault();\n    }\n    target = closest(target, options.draggable, el, true);\n    dragOverEvent('dragOver');\n    if (Sortable.eventCanceled) return completedFired;\n    if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) {\n      return completed(false);\n    }\n    ignoreNextClick = false;\n    if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list\n    : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {\n      vertical = this._getDirection(evt, target) === 'vertical';\n      dragRect = getRect(dragEl);\n      dragOverEvent('dragOverValid');\n      if (Sortable.eventCanceled) return completedFired;\n      if (revert) {\n        parentEl = rootEl; // actualization\n        capture();\n        this._hideClone();\n        dragOverEvent('revert');\n        if (!Sortable.eventCanceled) {\n          if (nextEl) {\n            rootEl.insertBefore(dragEl, nextEl);\n          } else {\n            rootEl.appendChild(dragEl);\n          }\n        }\n        return completed(true);\n      }\n      var elLastChild = lastChild(el, options.draggable);\n      if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {\n        // Insert to end of list\n\n        // If already at end of list: Do not insert\n        if (elLastChild === dragEl) {\n          return completed(false);\n        }\n\n        // if there is a last element, it is the target\n        if (elLastChild && el === evt.target) {\n          target = elLastChild;\n        }\n        if (target) {\n          targetRect = getRect(target);\n        }\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {\n          capture();\n          if (elLastChild && elLastChild.nextSibling) {\n            // the last draggable element is not the last node\n            el.insertBefore(dragEl, elLastChild.nextSibling);\n          } else {\n            el.appendChild(dragEl);\n          }\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {\n        // Insert to start of list\n        var firstChild = getChild(el, 0, options, true);\n        if (firstChild === dragEl) {\n          return completed(false);\n        }\n        target = firstChild;\n        targetRect = getRect(target);\n        if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {\n          capture();\n          el.insertBefore(dragEl, firstChild);\n          parentEl = el; // actualization\n\n          changed();\n          return completed(true);\n        }\n      } else if (target.parentNode === el) {\n        targetRect = getRect(target);\n        var direction = 0,\n          targetBeforeFirstSwap,\n          differentLevel = dragEl.parentNode !== el,\n          differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical),\n          side1 = vertical ? 'top' : 'left',\n          scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'),\n          scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0;\n        if (lastTarget !== target) {\n          targetBeforeFirstSwap = targetRect[side1];\n          pastFirstInvertThresh = false;\n          isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel;\n        }\n        direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target);\n        var sibling;\n        if (direction !== 0) {\n          // Check if target is beside dragEl in respective direction (ignoring hidden elements)\n          var dragIndex = index(dragEl);\n          do {\n            dragIndex -= direction;\n            sibling = parentEl.children[dragIndex];\n          } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl));\n        }\n        // If dragEl is already beside target: Do not insert\n        if (direction === 0 || sibling === target) {\n          return completed(false);\n        }\n        lastTarget = target;\n        lastDirection = direction;\n        var nextSibling = target.nextElementSibling,\n          after = false;\n        after = direction === 1;\n        var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after);\n        if (moveVector !== false) {\n          if (moveVector === 1 || moveVector === -1) {\n            after = moveVector === 1;\n          }\n          _silent = true;\n          setTimeout(_unsilent, 30);\n          capture();\n          if (after && !nextSibling) {\n            el.appendChild(dragEl);\n          } else {\n            target.parentNode.insertBefore(dragEl, after ? nextSibling : target);\n          }\n\n          // Undo chrome's scroll adjustment (has no effect on other browsers)\n          if (scrolledPastTop) {\n            scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop);\n          }\n          parentEl = dragEl.parentNode; // actualization\n\n          // must be done before animation\n          if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) {\n            targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]);\n          }\n          changed();\n          return completed(true);\n        }\n      }\n      if (el.contains(dragEl)) {\n        return completed(false);\n      }\n    }\n    return false;\n  },\n  _ignoreWhileAnimating: null,\n  _offMoveEvents: function _offMoveEvents() {\n    off(document, 'mousemove', this._onTouchMove);\n    off(document, 'touchmove', this._onTouchMove);\n    off(document, 'pointermove', this._onTouchMove);\n    off(document, 'dragover', nearestEmptyInsertDetectEvent);\n    off(document, 'mousemove', nearestEmptyInsertDetectEvent);\n    off(document, 'touchmove', nearestEmptyInsertDetectEvent);\n  },\n  _offUpEvents: function _offUpEvents() {\n    var ownerDocument = this.el.ownerDocument;\n    off(ownerDocument, 'mouseup', this._onDrop);\n    off(ownerDocument, 'touchend', this._onDrop);\n    off(ownerDocument, 'pointerup', this._onDrop);\n    off(ownerDocument, 'touchcancel', this._onDrop);\n    off(document, 'selectstart', this);\n  },\n  _onDrop: function _onDrop( /**Event*/evt) {\n    var el = this.el,\n      options = this.options;\n\n    // Get the index of the dragged element within its parent\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    pluginEvent('drop', this, {\n      evt: evt\n    });\n    parentEl = dragEl && dragEl.parentNode;\n\n    // Get again after plugin event\n    newIndex = index(dragEl);\n    newDraggableIndex = index(dragEl, options.draggable);\n    if (Sortable.eventCanceled) {\n      this._nulling();\n      return;\n    }\n    awaitingDragStarted = false;\n    isCircumstantialInvert = false;\n    pastFirstInvertThresh = false;\n    clearInterval(this._loopId);\n    clearTimeout(this._dragStartTimer);\n    _cancelNextTick(this.cloneId);\n    _cancelNextTick(this._dragStartId);\n\n    // Unbind events\n    if (this.nativeDraggable) {\n      off(document, 'drop', this);\n      off(el, 'dragstart', this._onDragStart);\n    }\n    this._offMoveEvents();\n    this._offUpEvents();\n    if (Safari) {\n      css(document.body, 'user-select', '');\n    }\n    css(dragEl, 'transform', '');\n    if (evt) {\n      if (moved) {\n        evt.cancelable && evt.preventDefault();\n        !options.dropBubble && evt.stopPropagation();\n      }\n      ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl);\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        // Remove clone(s)\n        cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl);\n      }\n      if (dragEl) {\n        if (this.nativeDraggable) {\n          off(dragEl, 'dragend', this);\n        }\n        _disableDraggable(dragEl);\n        dragEl.style['will-change'] = '';\n\n        // Remove classes\n        // ghostClass is added in dragStarted\n        if (moved && !awaitingDragStarted) {\n          toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false);\n        }\n        toggleClass(dragEl, this.options.chosenClass, false);\n\n        // Drag stop event\n        _dispatchEvent({\n          sortable: this,\n          name: 'unchoose',\n          toEl: parentEl,\n          newIndex: null,\n          newDraggableIndex: null,\n          originalEvent: evt\n        });\n        if (rootEl !== parentEl) {\n          if (newIndex >= 0) {\n            // Add event\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'add',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n\n            // Remove event\n            _dispatchEvent({\n              sortable: this,\n              name: 'remove',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n\n            // drag from one list and drop into another\n            _dispatchEvent({\n              rootEl: parentEl,\n              name: 'sort',\n              toEl: parentEl,\n              fromEl: rootEl,\n              originalEvent: evt\n            });\n            _dispatchEvent({\n              sortable: this,\n              name: 'sort',\n              toEl: parentEl,\n              originalEvent: evt\n            });\n          }\n          putSortable && putSortable.save();\n        } else {\n          if (newIndex !== oldIndex) {\n            if (newIndex >= 0) {\n              // drag & drop within the same list\n              _dispatchEvent({\n                sortable: this,\n                name: 'update',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n              _dispatchEvent({\n                sortable: this,\n                name: 'sort',\n                toEl: parentEl,\n                originalEvent: evt\n              });\n            }\n          }\n        }\n        if (Sortable.active) {\n          /* jshint eqnull:true */\n          if (newIndex == null || newIndex === -1) {\n            newIndex = oldIndex;\n            newDraggableIndex = oldDraggableIndex;\n          }\n          _dispatchEvent({\n            sortable: this,\n            name: 'end',\n            toEl: parentEl,\n            originalEvent: evt\n          });\n\n          // Save sorting\n          this.save();\n        }\n      }\n    }\n    this._nulling();\n  },\n  _nulling: function _nulling() {\n    pluginEvent('nulling', this);\n    rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null;\n    savedInputChecked.forEach(function (el) {\n      el.checked = true;\n    });\n    savedInputChecked.length = lastDx = lastDy = 0;\n  },\n  handleEvent: function handleEvent( /**Event*/evt) {\n    switch (evt.type) {\n      case 'drop':\n      case 'dragend':\n        this._onDrop(evt);\n        break;\n      case 'dragenter':\n      case 'dragover':\n        if (dragEl) {\n          this._onDragOver(evt);\n          _globalDragOver(evt);\n        }\n        break;\n      case 'selectstart':\n        evt.preventDefault();\n        break;\n    }\n  },\n  /**\r\n   * Serializes the item into an array of string.\r\n   * @returns {String[]}\r\n   */\n  toArray: function toArray() {\n    var order = [],\n      el,\n      children = this.el.children,\n      i = 0,\n      n = children.length,\n      options = this.options;\n    for (; i < n; i++) {\n      el = children[i];\n      if (closest(el, options.draggable, this.el, false)) {\n        order.push(el.getAttribute(options.dataIdAttr) || _generateId(el));\n      }\n    }\n    return order;\n  },\n  /**\r\n   * Sorts the elements according to the array.\r\n   * @param  {String[]}  order  order of the items\r\n   */\n  sort: function sort(order, useAnimation) {\n    var items = {},\n      rootEl = this.el;\n    this.toArray().forEach(function (id, i) {\n      var el = rootEl.children[i];\n      if (closest(el, this.options.draggable, rootEl, false)) {\n        items[id] = el;\n      }\n    }, this);\n    useAnimation && this.captureAnimationState();\n    order.forEach(function (id) {\n      if (items[id]) {\n        rootEl.removeChild(items[id]);\n        rootEl.appendChild(items[id]);\n      }\n    });\n    useAnimation && this.animateAll();\n  },\n  /**\r\n   * Save the current sorting\r\n   */\n  save: function save() {\n    var store = this.options.store;\n    store && store.set && store.set(this);\n  },\n  /**\r\n   * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.\r\n   * @param   {HTMLElement}  el\r\n   * @param   {String}       [selector]  default: `options.draggable`\r\n   * @returns {HTMLElement|null}\r\n   */\n  closest: function closest$1(el, selector) {\n    return closest(el, selector || this.options.draggable, this.el, false);\n  },\n  /**\r\n   * Set/get option\r\n   * @param   {string} name\r\n   * @param   {*}      [value]\r\n   * @returns {*}\r\n   */\n  option: function option(name, value) {\n    var options = this.options;\n    if (value === void 0) {\n      return options[name];\n    } else {\n      var modifiedValue = PluginManager.modifyOption(this, name, value);\n      if (typeof modifiedValue !== 'undefined') {\n        options[name] = modifiedValue;\n      } else {\n        options[name] = value;\n      }\n      if (name === 'group') {\n        _prepareGroup(options);\n      }\n    }\n  },\n  /**\r\n   * Destroy\r\n   */\n  destroy: function destroy() {\n    pluginEvent('destroy', this);\n    var el = this.el;\n    el[expando] = null;\n    off(el, 'mousedown', this._onTapStart);\n    off(el, 'touchstart', this._onTapStart);\n    off(el, 'pointerdown', this._onTapStart);\n    if (this.nativeDraggable) {\n      off(el, 'dragover', this);\n      off(el, 'dragenter', this);\n    }\n    // Remove draggable attributes\n    Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) {\n      el.removeAttribute('draggable');\n    });\n    this._onDrop();\n    this._disableDelayedDragEvents();\n    sortables.splice(sortables.indexOf(this.el), 1);\n    this.el = el = null;\n  },\n  _hideClone: function _hideClone() {\n    if (!cloneHidden) {\n      pluginEvent('hideClone', this);\n      if (Sortable.eventCanceled) return;\n      css(cloneEl, 'display', 'none');\n      if (this.options.removeCloneOnHide && cloneEl.parentNode) {\n        cloneEl.parentNode.removeChild(cloneEl);\n      }\n      cloneHidden = true;\n    }\n  },\n  _showClone: function _showClone(putSortable) {\n    if (putSortable.lastPutMode !== 'clone') {\n      this._hideClone();\n      return;\n    }\n    if (cloneHidden) {\n      pluginEvent('showClone', this);\n      if (Sortable.eventCanceled) return;\n\n      // show clone at dragEl or original position\n      if (dragEl.parentNode == rootEl && !this.options.group.revertClone) {\n        rootEl.insertBefore(cloneEl, dragEl);\n      } else if (nextEl) {\n        rootEl.insertBefore(cloneEl, nextEl);\n      } else {\n        rootEl.appendChild(cloneEl);\n      }\n      if (this.options.group.revertClone) {\n        this.animate(dragEl, cloneEl);\n      }\n      css(cloneEl, 'display', '');\n      cloneHidden = false;\n    }\n  }\n};\nfunction _globalDragOver( /**Event*/evt) {\n  if (evt.dataTransfer) {\n    evt.dataTransfer.dropEffect = 'move';\n  }\n  evt.cancelable && evt.preventDefault();\n}\nfunction _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) {\n  var evt,\n    sortable = fromEl[expando],\n    onMoveFn = sortable.options.onMove,\n    retVal;\n  // Support for new CustomEvent feature\n  if (window.CustomEvent && !IE11OrLess && !Edge) {\n    evt = new CustomEvent('move', {\n      bubbles: true,\n      cancelable: true\n    });\n  } else {\n    evt = document.createEvent('Event');\n    evt.initEvent('move', true, true);\n  }\n  evt.to = toEl;\n  evt.from = fromEl;\n  evt.dragged = dragEl;\n  evt.draggedRect = dragRect;\n  evt.related = targetEl || toEl;\n  evt.relatedRect = targetRect || getRect(toEl);\n  evt.willInsertAfter = willInsertAfter;\n  evt.originalEvent = originalEvent;\n  fromEl.dispatchEvent(evt);\n  if (onMoveFn) {\n    retVal = onMoveFn.call(sortable, evt, originalEvent);\n  }\n  return retVal;\n}\nfunction _disableDraggable(el) {\n  el.draggable = false;\n}\nfunction _unsilent() {\n  _silent = false;\n}\nfunction _ghostIsFirst(evt, vertical, sortable) {\n  var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX < childContainingRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < childContainingRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left;\n}\nfunction _ghostIsLast(evt, vertical, sortable) {\n  var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable));\n  var childContainingRect = getChildContainingRectFromElement(sortable.el, sortable.options, ghostEl);\n  var spacer = 10;\n  return vertical ? evt.clientX > childContainingRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > childContainingRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top;\n}\nfunction _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) {\n  var mouseOnAxis = vertical ? evt.clientY : evt.clientX,\n    targetLength = vertical ? targetRect.height : targetRect.width,\n    targetS1 = vertical ? targetRect.top : targetRect.left,\n    targetS2 = vertical ? targetRect.bottom : targetRect.right,\n    invert = false;\n  if (!invertSwap) {\n    // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold\n    if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) {\n      // multiplied only by swapThreshold because mouse will already be inside target by (1 - threshold) * targetLength / 2\n      // check if past first invert threshold on side opposite of lastDirection\n      if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) {\n        // past first invert threshold, do not restrict inverted threshold to dragEl shadow\n        pastFirstInvertThresh = true;\n      }\n      if (!pastFirstInvertThresh) {\n        // dragEl shadow (target move distance shadow)\n        if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow\n        : mouseOnAxis > targetS2 - targetMoveDistance) {\n          return -lastDirection;\n        }\n      } else {\n        invert = true;\n      }\n    } else {\n      // Regular\n      if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) {\n        return _getInsertDirection(target);\n      }\n    }\n  }\n  invert = invert || invertSwap;\n  if (invert) {\n    // Invert of regular\n    if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) {\n      return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1;\n    }\n  }\n  return 0;\n}\n\n/**\r\n * Gets the direction dragEl must be swapped relative to target in order to make it\r\n * seem that dragEl has been \"inserted\" into that element's position\r\n * @param  {HTMLElement} target       The target whose position dragEl is being inserted at\r\n * @return {Number}                   Direction dragEl must be swapped\r\n */\nfunction _getInsertDirection(target) {\n  if (index(dragEl) < index(target)) {\n    return 1;\n  } else {\n    return -1;\n  }\n}\n\n/**\r\n * Generate id\r\n * @param   {HTMLElement} el\r\n * @returns {String}\r\n * @private\r\n */\nfunction _generateId(el) {\n  var str = el.tagName + el.className + el.src + el.href + el.textContent,\n    i = str.length,\n    sum = 0;\n  while (i--) {\n    sum += str.charCodeAt(i);\n  }\n  return sum.toString(36);\n}\nfunction _saveInputCheckedState(root) {\n  savedInputChecked.length = 0;\n  var inputs = root.getElementsByTagName('input');\n  var idx = inputs.length;\n  while (idx--) {\n    var el = inputs[idx];\n    el.checked && savedInputChecked.push(el);\n  }\n}\nfunction _nextTick(fn) {\n  return setTimeout(fn, 0);\n}\nfunction _cancelNextTick(id) {\n  return clearTimeout(id);\n}\n\n// Fixed #973:\nif (documentExists) {\n  on(document, 'touchmove', function (evt) {\n    if ((Sortable.active || awaitingDragStarted) && evt.cancelable) {\n      evt.preventDefault();\n    }\n  });\n}\n\n// Export utils\nSortable.utils = {\n  on: on,\n  off: off,\n  css: css,\n  find: find,\n  is: function is(el, selector) {\n    return !!closest(el, selector, el, false);\n  },\n  extend: extend,\n  throttle: throttle,\n  closest: closest,\n  toggleClass: toggleClass,\n  clone: clone,\n  index: index,\n  nextTick: _nextTick,\n  cancelNextTick: _cancelNextTick,\n  detectDirection: _detectDirection,\n  getChild: getChild\n};\n\n/**\r\n * Get the Sortable instance of an element\r\n * @param  {HTMLElement} element The element\r\n * @return {Sortable|undefined}         The instance of Sortable\r\n */\nSortable.get = function (element) {\n  return element[expando];\n};\n\n/**\r\n * Mount a plugin to Sortable\r\n * @param  {...SortablePlugin|SortablePlugin[]} plugins       Plugins being mounted\r\n */\nSortable.mount = function () {\n  for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) {\n    plugins[_key] = arguments[_key];\n  }\n  if (plugins[0].constructor === Array) plugins = plugins[0];\n  plugins.forEach(function (plugin) {\n    if (!plugin.prototype || !plugin.prototype.constructor) {\n      throw \"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(plugin));\n    }\n    if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);\n    PluginManager.mount(plugin);\n  });\n};\n\n/**\r\n * Create sortable instance\r\n * @param {HTMLElement}  el\r\n * @param {Object}      [options]\r\n */\nSortable.create = function (el, options) {\n  return new Sortable(el, options);\n};\n\n// Export\nSortable.version = version;\n\nvar autoScrolls = [],\n  scrollEl,\n  scrollRootEl,\n  scrolling = false,\n  lastAutoScrollX,\n  lastAutoScrollY,\n  touchEvt$1,\n  pointerElemChangedInterval;\nfunction AutoScrollPlugin() {\n  function AutoScroll() {\n    this.defaults = {\n      scroll: true,\n      forceAutoScrollFallback: false,\n      scrollSensitivity: 30,\n      scrollSpeed: 10,\n      bubbleScroll: true\n    };\n\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n  }\n  AutoScroll.prototype = {\n    dragStarted: function dragStarted(_ref) {\n      var originalEvent = _ref.originalEvent;\n      if (this.sortable.nativeDraggable) {\n        on(document, 'dragover', this._handleAutoScroll);\n      } else {\n        if (this.options.supportPointer) {\n          on(document, 'pointermove', this._handleFallbackAutoScroll);\n        } else if (originalEvent.touches) {\n          on(document, 'touchmove', this._handleFallbackAutoScroll);\n        } else {\n          on(document, 'mousemove', this._handleFallbackAutoScroll);\n        }\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref2) {\n      var originalEvent = _ref2.originalEvent;\n      // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached)\n      if (!this.options.dragOverBubble && !originalEvent.rootEl) {\n        this._handleAutoScroll(originalEvent);\n      }\n    },\n    drop: function drop() {\n      if (this.sortable.nativeDraggable) {\n        off(document, 'dragover', this._handleAutoScroll);\n      } else {\n        off(document, 'pointermove', this._handleFallbackAutoScroll);\n        off(document, 'touchmove', this._handleFallbackAutoScroll);\n        off(document, 'mousemove', this._handleFallbackAutoScroll);\n      }\n      clearPointerElemChangedInterval();\n      clearAutoScrolls();\n      cancelThrottle();\n    },\n    nulling: function nulling() {\n      touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null;\n      autoScrolls.length = 0;\n    },\n    _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) {\n      this._handleAutoScroll(evt, true);\n    },\n    _handleAutoScroll: function _handleAutoScroll(evt, fallback) {\n      var _this = this;\n      var x = (evt.touches ? evt.touches[0] : evt).clientX,\n        y = (evt.touches ? evt.touches[0] : evt).clientY,\n        elem = document.elementFromPoint(x, y);\n      touchEvt$1 = evt;\n\n      // IE does not seem to have native autoscroll,\n      // Edge's autoscroll seems too conditional,\n      // MACOS Safari does not have autoscroll,\n      // Firefox and Chrome are good\n      if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {\n        autoScroll(evt, this.options, elem, fallback);\n\n        // Listener for pointer element change\n        var ogElemScroller = getParentAutoScrollElement(elem, true);\n        if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) {\n          pointerElemChangedInterval && clearPointerElemChangedInterval();\n          // Detect for pointer elem change, emulating native DnD behaviour\n          pointerElemChangedInterval = setInterval(function () {\n            var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true);\n            if (newElem !== ogElemScroller) {\n              ogElemScroller = newElem;\n              clearAutoScrolls();\n            }\n            autoScroll(evt, _this.options, newElem, fallback);\n          }, 10);\n          lastAutoScrollX = x;\n          lastAutoScrollY = y;\n        }\n      } else {\n        // if DnD is enabled (and browser has good autoscrolling), first autoscroll will already scroll, so get parent autoscroll of first autoscroll\n        if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) {\n          clearAutoScrolls();\n          return;\n        }\n        autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false);\n      }\n    }\n  };\n  return _extends(AutoScroll, {\n    pluginName: 'scroll',\n    initializeByDefault: true\n  });\n}\nfunction clearAutoScrolls() {\n  autoScrolls.forEach(function (autoScroll) {\n    clearInterval(autoScroll.pid);\n  });\n  autoScrolls = [];\n}\nfunction clearPointerElemChangedInterval() {\n  clearInterval(pointerElemChangedInterval);\n}\nvar autoScroll = throttle(function (evt, options, rootEl, isFallback) {\n  // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521\n  if (!options.scroll) return;\n  var x = (evt.touches ? evt.touches[0] : evt).clientX,\n    y = (evt.touches ? evt.touches[0] : evt).clientY,\n    sens = options.scrollSensitivity,\n    speed = options.scrollSpeed,\n    winScroller = getWindowScrollingElement();\n  var scrollThisInstance = false,\n    scrollCustomFn;\n\n  // New scroll root, set scrollEl\n  if (scrollRootEl !== rootEl) {\n    scrollRootEl = rootEl;\n    clearAutoScrolls();\n    scrollEl = options.scroll;\n    scrollCustomFn = options.scrollFn;\n    if (scrollEl === true) {\n      scrollEl = getParentAutoScrollElement(rootEl, true);\n    }\n  }\n  var layersOut = 0;\n  var currentParent = scrollEl;\n  do {\n    var el = currentParent,\n      rect = getRect(el),\n      top = rect.top,\n      bottom = rect.bottom,\n      left = rect.left,\n      right = rect.right,\n      width = rect.width,\n      height = rect.height,\n      canScrollX = void 0,\n      canScrollY = void 0,\n      scrollWidth = el.scrollWidth,\n      scrollHeight = el.scrollHeight,\n      elCSS = css(el),\n      scrollPosX = el.scrollLeft,\n      scrollPosY = el.scrollTop;\n    if (el === winScroller) {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible');\n    } else {\n      canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll');\n      canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll');\n    }\n    var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX);\n    var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY);\n    if (!autoScrolls[layersOut]) {\n      for (var i = 0; i <= layersOut; i++) {\n        if (!autoScrolls[i]) {\n          autoScrolls[i] = {};\n        }\n      }\n    }\n    if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) {\n      autoScrolls[layersOut].el = el;\n      autoScrolls[layersOut].vx = vx;\n      autoScrolls[layersOut].vy = vy;\n      clearInterval(autoScrolls[layersOut].pid);\n      if (vx != 0 || vy != 0) {\n        scrollThisInstance = true;\n        /* jshint loopfunc:true */\n        autoScrolls[layersOut].pid = setInterval(function () {\n          // emulate drag over during autoscroll (fallback), emulating native DnD behaviour\n          if (isFallback && this.layer === 0) {\n            Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely\n          }\n          var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0;\n          var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0;\n          if (typeof scrollCustomFn === 'function') {\n            if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') {\n              return;\n            }\n          }\n          scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY);\n        }.bind({\n          layer: layersOut\n        }), 24);\n      }\n    }\n    layersOut++;\n  } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false)));\n  scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not\n}, 30);\n\nvar drop = function drop(_ref) {\n  var originalEvent = _ref.originalEvent,\n    putSortable = _ref.putSortable,\n    dragEl = _ref.dragEl,\n    activeSortable = _ref.activeSortable,\n    dispatchSortableEvent = _ref.dispatchSortableEvent,\n    hideGhostForTarget = _ref.hideGhostForTarget,\n    unhideGhostForTarget = _ref.unhideGhostForTarget;\n  if (!originalEvent) return;\n  var toSortable = putSortable || activeSortable;\n  hideGhostForTarget();\n  var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent;\n  var target = document.elementFromPoint(touch.clientX, touch.clientY);\n  unhideGhostForTarget();\n  if (toSortable && !toSortable.el.contains(target)) {\n    dispatchSortableEvent('spill');\n    this.onSpill({\n      dragEl: dragEl,\n      putSortable: putSortable\n    });\n  }\n};\nfunction Revert() {}\nRevert.prototype = {\n  startIndex: null,\n  dragStart: function dragStart(_ref2) {\n    var oldDraggableIndex = _ref2.oldDraggableIndex;\n    this.startIndex = oldDraggableIndex;\n  },\n  onSpill: function onSpill(_ref3) {\n    var dragEl = _ref3.dragEl,\n      putSortable = _ref3.putSortable;\n    this.sortable.captureAnimationState();\n    if (putSortable) {\n      putSortable.captureAnimationState();\n    }\n    var nextSibling = getChild(this.sortable.el, this.startIndex, this.options);\n    if (nextSibling) {\n      this.sortable.el.insertBefore(dragEl, nextSibling);\n    } else {\n      this.sortable.el.appendChild(dragEl);\n    }\n    this.sortable.animateAll();\n    if (putSortable) {\n      putSortable.animateAll();\n    }\n  },\n  drop: drop\n};\n_extends(Revert, {\n  pluginName: 'revertOnSpill'\n});\nfunction Remove() {}\nRemove.prototype = {\n  onSpill: function onSpill(_ref4) {\n    var dragEl = _ref4.dragEl,\n      putSortable = _ref4.putSortable;\n    var parentSortable = putSortable || this.sortable;\n    parentSortable.captureAnimationState();\n    dragEl.parentNode && dragEl.parentNode.removeChild(dragEl);\n    parentSortable.animateAll();\n  },\n  drop: drop\n};\n_extends(Remove, {\n  pluginName: 'removeOnSpill'\n});\n\nvar lastSwapEl;\nfunction SwapPlugin() {\n  function Swap() {\n    this.defaults = {\n      swapClass: 'sortable-swap-highlight'\n    };\n  }\n  Swap.prototype = {\n    dragStart: function dragStart(_ref) {\n      var dragEl = _ref.dragEl;\n      lastSwapEl = dragEl;\n    },\n    dragOverValid: function dragOverValid(_ref2) {\n      var completed = _ref2.completed,\n        target = _ref2.target,\n        onMove = _ref2.onMove,\n        activeSortable = _ref2.activeSortable,\n        changed = _ref2.changed,\n        cancel = _ref2.cancel;\n      if (!activeSortable.options.swap) return;\n      var el = this.sortable.el,\n        options = this.options;\n      if (target && target !== el) {\n        var prevSwapEl = lastSwapEl;\n        if (onMove(target) !== false) {\n          toggleClass(target, options.swapClass, true);\n          lastSwapEl = target;\n        } else {\n          lastSwapEl = null;\n        }\n        if (prevSwapEl && prevSwapEl !== lastSwapEl) {\n          toggleClass(prevSwapEl, options.swapClass, false);\n        }\n      }\n      changed();\n      completed(true);\n      cancel();\n    },\n    drop: function drop(_ref3) {\n      var activeSortable = _ref3.activeSortable,\n        putSortable = _ref3.putSortable,\n        dragEl = _ref3.dragEl;\n      var toSortable = putSortable || this.sortable;\n      var options = this.options;\n      lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false);\n      if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) {\n        if (dragEl !== lastSwapEl) {\n          toSortable.captureAnimationState();\n          if (toSortable !== activeSortable) activeSortable.captureAnimationState();\n          swapNodes(dragEl, lastSwapEl);\n          toSortable.animateAll();\n          if (toSortable !== activeSortable) activeSortable.animateAll();\n        }\n      }\n    },\n    nulling: function nulling() {\n      lastSwapEl = null;\n    }\n  };\n  return _extends(Swap, {\n    pluginName: 'swap',\n    eventProperties: function eventProperties() {\n      return {\n        swapItem: lastSwapEl\n      };\n    }\n  });\n}\nfunction swapNodes(n1, n2) {\n  var p1 = n1.parentNode,\n    p2 = n2.parentNode,\n    i1,\n    i2;\n  if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return;\n  i1 = index(n1);\n  i2 = index(n2);\n  if (p1.isEqualNode(p2) && i1 < i2) {\n    i2++;\n  }\n  p1.insertBefore(n2, p1.children[i1]);\n  p2.insertBefore(n1, p2.children[i2]);\n}\n\nvar multiDragElements = [],\n  multiDragClones = [],\n  lastMultiDragSelect,\n  // for selection with modifier key down (SHIFT)\n  multiDragSortable,\n  initialFolding = false,\n  // Initial multi-drag fold when drag started\n  folding = false,\n  // Folding any other time\n  dragStarted = false,\n  dragEl$1,\n  clonesFromRect,\n  clonesHidden;\nfunction MultiDragPlugin() {\n  function MultiDrag(sortable) {\n    // Bind all private methods\n    for (var fn in this) {\n      if (fn.charAt(0) === '_' && typeof this[fn] === 'function') {\n        this[fn] = this[fn].bind(this);\n      }\n    }\n    if (!sortable.options.avoidImplicitDeselect) {\n      if (sortable.options.supportPointer) {\n        on(document, 'pointerup', this._deselectMultiDrag);\n      } else {\n        on(document, 'mouseup', this._deselectMultiDrag);\n        on(document, 'touchend', this._deselectMultiDrag);\n      }\n    }\n    on(document, 'keydown', this._checkKeyDown);\n    on(document, 'keyup', this._checkKeyUp);\n    this.defaults = {\n      selectedClass: 'sortable-selected',\n      multiDragKey: null,\n      avoidImplicitDeselect: false,\n      setData: function setData(dataTransfer, dragEl) {\n        var data = '';\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          multiDragElements.forEach(function (multiDragElement, i) {\n            data += (!i ? '' : ', ') + multiDragElement.textContent;\n          });\n        } else {\n          data = dragEl.textContent;\n        }\n        dataTransfer.setData('Text', data);\n      }\n    };\n  }\n  MultiDrag.prototype = {\n    multiDragKeyDown: false,\n    isMultiDrag: false,\n    delayStartGlobal: function delayStartGlobal(_ref) {\n      var dragged = _ref.dragEl;\n      dragEl$1 = dragged;\n    },\n    delayEnded: function delayEnded() {\n      this.isMultiDrag = ~multiDragElements.indexOf(dragEl$1);\n    },\n    setupClone: function setupClone(_ref2) {\n      var sortable = _ref2.sortable,\n        cancel = _ref2.cancel;\n      if (!this.isMultiDrag) return;\n      for (var i = 0; i < multiDragElements.length; i++) {\n        multiDragClones.push(clone(multiDragElements[i]));\n        multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex;\n        multiDragClones[i].draggable = false;\n        multiDragClones[i].style['will-change'] = '';\n        toggleClass(multiDragClones[i], this.options.selectedClass, false);\n        multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false);\n      }\n      sortable._hideClone();\n      cancel();\n    },\n    clone: function clone(_ref3) {\n      var sortable = _ref3.sortable,\n        rootEl = _ref3.rootEl,\n        dispatchSortableEvent = _ref3.dispatchSortableEvent,\n        cancel = _ref3.cancel;\n      if (!this.isMultiDrag) return;\n      if (!this.options.removeCloneOnHide) {\n        if (multiDragElements.length && multiDragSortable === sortable) {\n          insertMultiDragClones(true, rootEl);\n          dispatchSortableEvent('clone');\n          cancel();\n        }\n      }\n    },\n    showClone: function showClone(_ref4) {\n      var cloneNowShown = _ref4.cloneNowShown,\n        rootEl = _ref4.rootEl,\n        cancel = _ref4.cancel;\n      if (!this.isMultiDrag) return;\n      insertMultiDragClones(false, rootEl);\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', '');\n      });\n      cloneNowShown();\n      clonesHidden = false;\n      cancel();\n    },\n    hideClone: function hideClone(_ref5) {\n      var _this = this;\n      var sortable = _ref5.sortable,\n        cloneNowHidden = _ref5.cloneNowHidden,\n        cancel = _ref5.cancel;\n      if (!this.isMultiDrag) return;\n      multiDragClones.forEach(function (clone) {\n        css(clone, 'display', 'none');\n        if (_this.options.removeCloneOnHide && clone.parentNode) {\n          clone.parentNode.removeChild(clone);\n        }\n      });\n      cloneNowHidden();\n      clonesHidden = true;\n      cancel();\n    },\n    dragStartGlobal: function dragStartGlobal(_ref6) {\n      var sortable = _ref6.sortable;\n      if (!this.isMultiDrag && multiDragSortable) {\n        multiDragSortable.multiDrag._deselectMultiDrag();\n      }\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.sortableIndex = index(multiDragElement);\n      });\n\n      // Sort multi-drag elements\n      multiDragElements = multiDragElements.sort(function (a, b) {\n        return a.sortableIndex - b.sortableIndex;\n      });\n      dragStarted = true;\n    },\n    dragStarted: function dragStarted(_ref7) {\n      var _this2 = this;\n      var sortable = _ref7.sortable;\n      if (!this.isMultiDrag) return;\n      if (this.options.sort) {\n        // Capture rects,\n        // hide multi drag elements (by positioning them absolute),\n        // set multi drag elements rects to dragRect,\n        // show multi drag elements,\n        // animate to rects,\n        // unset rects & remove from DOM\n\n        sortable.captureAnimationState();\n        if (this.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            css(multiDragElement, 'position', 'absolute');\n          });\n          var dragRect = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRect);\n          });\n          folding = true;\n          initialFolding = true;\n        }\n      }\n      sortable.animateAll(function () {\n        folding = false;\n        initialFolding = false;\n        if (_this2.options.animation) {\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n        }\n\n        // Remove all auxiliary multidrag items from el, if sorting enabled\n        if (_this2.options.sort) {\n          removeMultiDragElements();\n        }\n      });\n    },\n    dragOver: function dragOver(_ref8) {\n      var target = _ref8.target,\n        completed = _ref8.completed,\n        cancel = _ref8.cancel;\n      if (folding && ~multiDragElements.indexOf(target)) {\n        completed(false);\n        cancel();\n      }\n    },\n    revert: function revert(_ref9) {\n      var fromSortable = _ref9.fromSortable,\n        rootEl = _ref9.rootEl,\n        sortable = _ref9.sortable,\n        dragRect = _ref9.dragRect;\n      if (multiDragElements.length > 1) {\n        // Setup unfold animation\n        multiDragElements.forEach(function (multiDragElement) {\n          sortable.addAnimationState({\n            target: multiDragElement,\n            rect: folding ? getRect(multiDragElement) : dragRect\n          });\n          unsetRect(multiDragElement);\n          multiDragElement.fromRect = dragRect;\n          fromSortable.removeAnimationState(multiDragElement);\n        });\n        folding = false;\n        insertMultiDragElements(!this.options.removeCloneOnHide, rootEl);\n      }\n    },\n    dragOverCompleted: function dragOverCompleted(_ref10) {\n      var sortable = _ref10.sortable,\n        isOwner = _ref10.isOwner,\n        insertion = _ref10.insertion,\n        activeSortable = _ref10.activeSortable,\n        parentEl = _ref10.parentEl,\n        putSortable = _ref10.putSortable;\n      var options = this.options;\n      if (insertion) {\n        // Clones must be hidden before folding animation to capture dragRectAbsolute properly\n        if (isOwner) {\n          activeSortable._hideClone();\n        }\n        initialFolding = false;\n        // If leaving sort:false root, or already folding - Fold to new location\n        if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) {\n          // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible\n          var dragRectAbsolute = getRect(dragEl$1, false, true, true);\n          multiDragElements.forEach(function (multiDragElement) {\n            if (multiDragElement === dragEl$1) return;\n            setRect(multiDragElement, dragRectAbsolute);\n\n            // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted\n            // while folding, and so that we can capture them again because old sortable will no longer be fromSortable\n            parentEl.appendChild(multiDragElement);\n          });\n          folding = true;\n        }\n\n        // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out\n        if (!isOwner) {\n          // Only remove if not folding (folding will remove them anyways)\n          if (!folding) {\n            removeMultiDragElements();\n          }\n          if (multiDragElements.length > 1) {\n            var clonesHiddenBefore = clonesHidden;\n            activeSortable._showClone(sortable);\n\n            // Unfold animation for clones if showing from hidden\n            if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) {\n              multiDragClones.forEach(function (clone) {\n                activeSortable.addAnimationState({\n                  target: clone,\n                  rect: clonesFromRect\n                });\n                clone.fromRect = clonesFromRect;\n                clone.thisAnimationDuration = null;\n              });\n            }\n          } else {\n            activeSortable._showClone(sortable);\n          }\n        }\n      }\n    },\n    dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) {\n      var dragRect = _ref11.dragRect,\n        isOwner = _ref11.isOwner,\n        activeSortable = _ref11.activeSortable;\n      multiDragElements.forEach(function (multiDragElement) {\n        multiDragElement.thisAnimationDuration = null;\n      });\n      if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) {\n        clonesFromRect = _extends({}, dragRect);\n        var dragMatrix = matrix(dragEl$1, true);\n        clonesFromRect.top -= dragMatrix.f;\n        clonesFromRect.left -= dragMatrix.e;\n      }\n    },\n    dragOverAnimationComplete: function dragOverAnimationComplete() {\n      if (folding) {\n        folding = false;\n        removeMultiDragElements();\n      }\n    },\n    drop: function drop(_ref12) {\n      var evt = _ref12.originalEvent,\n        rootEl = _ref12.rootEl,\n        parentEl = _ref12.parentEl,\n        sortable = _ref12.sortable,\n        dispatchSortableEvent = _ref12.dispatchSortableEvent,\n        oldIndex = _ref12.oldIndex,\n        putSortable = _ref12.putSortable;\n      var toSortable = putSortable || this.sortable;\n      if (!evt) return;\n      var options = this.options,\n        children = parentEl.children;\n\n      // Multi-drag selection\n      if (!dragStarted) {\n        if (options.multiDragKey && !this.multiDragKeyDown) {\n          this._deselectMultiDrag();\n        }\n        toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1));\n        if (!~multiDragElements.indexOf(dragEl$1)) {\n          multiDragElements.push(dragEl$1);\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'select',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n\n          // Modifier activated, select from last to dragEl\n          if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {\n            var lastIndex = index(lastMultiDragSelect),\n              currentIndex = index(dragEl$1);\n            if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) {\n              // Must include lastMultiDragSelect (select it), in case modified selection from no selection\n              // (but previous selection existed)\n              var n, i;\n              if (currentIndex > lastIndex) {\n                i = lastIndex;\n                n = currentIndex;\n              } else {\n                i = currentIndex;\n                n = lastIndex + 1;\n              }\n              for (; i < n; i++) {\n                if (~multiDragElements.indexOf(children[i])) continue;\n                toggleClass(children[i], options.selectedClass, true);\n                multiDragElements.push(children[i]);\n                dispatchEvent({\n                  sortable: sortable,\n                  rootEl: rootEl,\n                  name: 'select',\n                  targetEl: children[i],\n                  originalEvent: evt\n                });\n              }\n            }\n          } else {\n            lastMultiDragSelect = dragEl$1;\n          }\n          multiDragSortable = toSortable;\n        } else {\n          multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1);\n          lastMultiDragSelect = null;\n          dispatchEvent({\n            sortable: sortable,\n            rootEl: rootEl,\n            name: 'deselect',\n            targetEl: dragEl$1,\n            originalEvent: evt\n          });\n        }\n      }\n\n      // Multi-drag drop\n      if (dragStarted && this.isMultiDrag) {\n        folding = false;\n        // Do not \"unfold\" after around dragEl if reverted\n        if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {\n          var dragRect = getRect(dragEl$1),\n            multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');\n          if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null;\n          toSortable.captureAnimationState();\n          if (!initialFolding) {\n            if (options.animation) {\n              dragEl$1.fromRect = dragRect;\n              multiDragElements.forEach(function (multiDragElement) {\n                multiDragElement.thisAnimationDuration = null;\n                if (multiDragElement !== dragEl$1) {\n                  var rect = folding ? getRect(multiDragElement) : dragRect;\n                  multiDragElement.fromRect = rect;\n\n                  // Prepare unfold animation\n                  toSortable.addAnimationState({\n                    target: multiDragElement,\n                    rect: rect\n                  });\n                }\n              });\n            }\n\n            // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert\n            // properly they must all be removed\n            removeMultiDragElements();\n            multiDragElements.forEach(function (multiDragElement) {\n              if (children[multiDragIndex]) {\n                parentEl.insertBefore(multiDragElement, children[multiDragIndex]);\n              } else {\n                parentEl.appendChild(multiDragElement);\n              }\n              multiDragIndex++;\n            });\n\n            // If initial folding is done, the elements may have changed position because they are now\n            // unfolding around dragEl, even though dragEl may not have his index changed, so update event\n            // must be fired here as Sortable will not.\n            if (oldIndex === index(dragEl$1)) {\n              var update = false;\n              multiDragElements.forEach(function (multiDragElement) {\n                if (multiDragElement.sortableIndex !== index(multiDragElement)) {\n                  update = true;\n                  return;\n                }\n              });\n              if (update) {\n                dispatchSortableEvent('update');\n                dispatchSortableEvent('sort');\n              }\n            }\n          }\n\n          // Must be done after capturing individual rects (scroll bar)\n          multiDragElements.forEach(function (multiDragElement) {\n            unsetRect(multiDragElement);\n          });\n          toSortable.animateAll();\n        }\n        multiDragSortable = toSortable;\n      }\n\n      // Remove clones if necessary\n      if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') {\n        multiDragClones.forEach(function (clone) {\n          clone.parentNode && clone.parentNode.removeChild(clone);\n        });\n      }\n    },\n    nullingGlobal: function nullingGlobal() {\n      this.isMultiDrag = dragStarted = false;\n      multiDragClones.length = 0;\n    },\n    destroyGlobal: function destroyGlobal() {\n      this._deselectMultiDrag();\n      off(document, 'pointerup', this._deselectMultiDrag);\n      off(document, 'mouseup', this._deselectMultiDrag);\n      off(document, 'touchend', this._deselectMultiDrag);\n      off(document, 'keydown', this._checkKeyDown);\n      off(document, 'keyup', this._checkKeyUp);\n    },\n    _deselectMultiDrag: function _deselectMultiDrag(evt) {\n      if (typeof dragStarted !== \"undefined\" && dragStarted) return;\n\n      // Only deselect if selection is in this sortable\n      if (multiDragSortable !== this.sortable) return;\n\n      // Only deselect if target is not item in this sortable\n      if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return;\n\n      // Only deselect if left click\n      if (evt && evt.button !== 0) return;\n      while (multiDragElements.length) {\n        var el = multiDragElements[0];\n        toggleClass(el, this.options.selectedClass, false);\n        multiDragElements.shift();\n        dispatchEvent({\n          sortable: this.sortable,\n          rootEl: this.sortable.el,\n          name: 'deselect',\n          targetEl: el,\n          originalEvent: evt\n        });\n      }\n    },\n    _checkKeyDown: function _checkKeyDown(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = true;\n      }\n    },\n    _checkKeyUp: function _checkKeyUp(evt) {\n      if (evt.key === this.options.multiDragKey) {\n        this.multiDragKeyDown = false;\n      }\n    }\n  };\n  return _extends(MultiDrag, {\n    // Static methods & properties\n    pluginName: 'multiDrag',\n    utils: {\n      /**\r\n       * Selects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be selected\r\n       */\n      select: function select(el) {\n        var sortable = el.parentNode[expando];\n        if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;\n        if (multiDragSortable && multiDragSortable !== sortable) {\n          multiDragSortable.multiDrag._deselectMultiDrag();\n          multiDragSortable = sortable;\n        }\n        toggleClass(el, sortable.options.selectedClass, true);\n        multiDragElements.push(el);\n      },\n      /**\r\n       * Deselects the provided multi-drag item\r\n       * @param  {HTMLElement} el    The element to be deselected\r\n       */\n      deselect: function deselect(el) {\n        var sortable = el.parentNode[expando],\n          index = multiDragElements.indexOf(el);\n        if (!sortable || !sortable.options.multiDrag || !~index) return;\n        toggleClass(el, sortable.options.selectedClass, false);\n        multiDragElements.splice(index, 1);\n      }\n    },\n    eventProperties: function eventProperties() {\n      var _this3 = this;\n      var oldIndicies = [],\n        newIndicies = [];\n      multiDragElements.forEach(function (multiDragElement) {\n        oldIndicies.push({\n          multiDragElement: multiDragElement,\n          index: multiDragElement.sortableIndex\n        });\n\n        // multiDragElements will already be sorted if folding\n        var newIndex;\n        if (folding && multiDragElement !== dragEl$1) {\n          newIndex = -1;\n        } else if (folding) {\n          newIndex = index(multiDragElement, ':not(.' + _this3.options.selectedClass + ')');\n        } else {\n          newIndex = index(multiDragElement);\n        }\n        newIndicies.push({\n          multiDragElement: multiDragElement,\n          index: newIndex\n        });\n      });\n      return {\n        items: _toConsumableArray(multiDragElements),\n        clones: [].concat(multiDragClones),\n        oldIndicies: oldIndicies,\n        newIndicies: newIndicies\n      };\n    },\n    optionListeners: {\n      multiDragKey: function multiDragKey(key) {\n        key = key.toLowerCase();\n        if (key === 'ctrl') {\n          key = 'Control';\n        } else if (key.length > 1) {\n          key = key.charAt(0).toUpperCase() + key.substr(1);\n        }\n        return key;\n      }\n    }\n  });\n}\nfunction insertMultiDragElements(clonesInserted, rootEl) {\n  multiDragElements.forEach(function (multiDragElement, i) {\n    var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(multiDragElement, target);\n    } else {\n      rootEl.appendChild(multiDragElement);\n    }\n  });\n}\n\n/**\r\n * Insert multi-drag clones\r\n * @param  {[Boolean]} elementsInserted  Whether the multi-drag elements are inserted\r\n * @param  {HTMLElement} rootEl\r\n */\nfunction insertMultiDragClones(elementsInserted, rootEl) {\n  multiDragClones.forEach(function (clone, i) {\n    var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)];\n    if (target) {\n      rootEl.insertBefore(clone, target);\n    } else {\n      rootEl.appendChild(clone);\n    }\n  });\n}\nfunction removeMultiDragElements() {\n  multiDragElements.forEach(function (multiDragElement) {\n    if (multiDragElement === dragEl$1) return;\n    multiDragElement.parentNode && multiDragElement.parentNode.removeChild(multiDragElement);\n  });\n}\n\nSortable.mount(new AutoScrollPlugin());\nSortable.mount(Remove, Revert);\n\nexport default Sortable;\nexport { MultiDragPlugin as MultiDrag, Sortable, SwapPlugin as Swap };\n","/* Handles setting up sorting. */\nimport { Sortable } from 'sortablejs';\n\n// This handles sorting the image grid for Aggregates.\nfunction setupAggregateSorting() {\n    const element = document.querySelector('#js-aggregate-reorder');\n\n    if (!element) {\n        return;\n    }\n\n    let sorting = false;\n\n    element.addEventListener('click', e => {\n        const grid = document.querySelector('.image-grid');\n        if (!grid) {\n            return;\n        }\n\n        sorting = !sorting;\n\n        if (sorting) {\n            element.innerText  = 'Save Category Order';\n            grid.classList.add('grid--is-sorting');\n            Sortable.create(grid,\n                {\n                    sort: true,\n                    onEnd: function(evt) {\n                        const oldIndex = evt.oldDraggableIndex;\n                        const newIndex = evt.newDraggableIndex;\n\n                        if (oldIndex !== newIndex) {\n                            // Re-number all the children.\n                            let i = 0;\n                            for (const child of grid.querySelectorAll('.image-container')) {\n                                child.dataset.ordinal = String(i);\n                                i++;\n                            }\n                        }\n                    }\n                }\n            );\n        } else {\n            element.innerText = 'Re-order Category (Saving...)';\n            element.disabled = true;\n            element.classList.add('is-loading');\n            grid.classList.remove('grid--is-sorting');\n            const payload = {};\n\n            for (const child of grid.querySelectorAll('.image-container')) {\n                payload[child.dataset.id] = String(child.dataset.ordinal);\n            }\n\n            const csrfToken = document.querySelector('meta[name=csrf-token]').getAttribute('content');\n\n            fetch(window.location, {\n                method: 'put',\n                body: JSON.stringify({ order: payload }),\n                headers: {\n                    'Content-Type': 'application/json',\n                    'X-CSRF-Token': csrfToken\n                }\n            }).then(res => {\n                element.disabled = false;\n                element.innerText = 'Re-order Category (Saved!)';\n            });\n        }\n    });\n}\n\nfunction setupSorting() {\n    const elements = document.querySelectorAll('.sortable');\n\n    for (const element of elements) {\n        Sortable.create(element,\n            {\n                sort: true,\n                onEnd: function(evt) {\n                    const oldIndex = evt.oldDraggableIndex;\n                    const newIndex = evt.newDraggableIndex;\n\n                    if (oldIndex !== newIndex) {\n                        // Re-number all the children.\n                        let i = 0;\n\n                        for (const child of element.children) {\n                            child.querySelector('input[type=hidden]').setAttribute('value', String(i));\n                            i++;\n                        }\n                    }\n                }\n            }\n        );\n    }\n\n    setupAggregateSorting();\n}\n\nexport { setupSorting };\n","/* Utility functions for DOM manipulation and interaction. */\nfunction makeEl(html) {\n    const template = document.createElement('template');\n\n    template.innerHTML = html.trim();\n\n    return template.content.firstChild;\n}\n\nfunction clearEl(...elements) {\n    [].concat(...elements).forEach(el => { while (el.firstChild) el.removeChild(el.firstChild); });\n}\n\nfunction escape(unsafe) {\n    return unsafe\n        .replace(/&/g, \"&amp;\")\n        .replace(/</g, \"&lt;\")\n        .replace(/>/g, \"&gt;\")\n        .replace(/\"/g, \"&quot;\")\n        .replace(/'/g, \"&#039;\");\n}\n\nexport { clearEl, makeEl, escape };","/* Handles the fancy tag input for editing tags on Works. */\nimport { makeEl, escape } from \"./dom\";\n\nclass TagsInput {\n    constructor(element, options = {}) {\n        this.element = element;\n        this.tags = [];\n        this.options = options\n\n        this.maxTags = options.maxTags || 32;\n        this.inputNode = null;\n        this.containerNode = null;\n    }\n\n    attach() {\n        this.element.style.display = 'none';\n\n        this.containerNode = makeEl('<div class=\"tags-input\"></div>');\n        this.inputNode = makeEl('<input class=\"input\" type=\"text\" placeholder=\"Type a comma to separate each tag...\" value=\"\" />');\n        this.containerNode.appendChild(this.inputNode);\n\n        this.element.parentNode.insertBefore(this.containerNode, this.element.nextSibling);\n\n        /* Load existing tags from input */\n        if (this.element.value) {\n            for (const tag of this.element.value.split(',')) {\n                this.addTag(tag);\n            }\n        }\n\n        /* Handle addition and removal of tags via key-presses */\n        this.containerNode.addEventListener('keydown', this._handleInputKeyUp.bind(this));\n\n        /* Handle deletions by clicking the delete button */\n        this.containerNode.addEventListener('click', this._handleContainerClick.bind(this));\n\n        /* Handle clicks outside the input node to add the past tag */\n        this.inputNode.addEventListener('focusout', (evt) => {\n            if (this.inputNode.value) {\n                this.addTag(this.inputNode.value);\n                this.inputNode.value = \"\";\n                this.updateHiddenInputValue();\n            }\n        });\n\n        this.inputNode.addEventListener('tagadded', evt => {\n            this.addTag(evt.details.tag);\n        });\n    }\n\n    detach() {\n        this.tags.clear();\n        this.containerNode.remove();\n        this.element.style.display = 'inline-block';\n    }\n\n    updateHiddenInputValue() {\n        this.element.setAttribute('value', this.tags.join(','));\n    }\n\n    deleteTagNode(node) {\n        this.tags.splice(this.tags.indexOf(node.dataset.value.toLowerCase()), 1);\n        node.remove();\n\n        /* Below the limit? Make sure the input is enabled. */\n        if (this.tags.length < this.maxTags) {\n            this.inputNode.disabled = false;\n        }\n    }\n\n    addTag(tagValue) {\n        tagValue = tagValue.trim();\n\n        /* Tag value is probably not empty and we don't already have the same tag. */\n        if (tagValue !== '' && this.tags.indexOf(tagValue.toLowerCase()) === -1) {\n            this.tags.push(tagValue.toLowerCase());\n\n            this.inputNode.parentNode.insertBefore(\n                makeEl('<span class=\"tag is-info\" data-value=\"' + escape(tagValue) + '\">' + escape(tagValue) + '<span class=\"delete is-small\" /></span>'),\n                this.inputNode\n            );\n\n            /* Too many tags, disable the input for now. */\n            if (this.tags.length >= this.maxTags) {\n                this.inputNode.disabled = true;\n            }\n        }\n    }\n\n    _handleInputKeyUp(evt) {\n        let tagValue = this.inputNode.value;\n\n        if (evt.key === 'Backspace' && tagValue === '') {\n            // Remove the child\n            if (this.inputNode.previousSibling) {\n                this.deleteTagNode(this.inputNode.previousSibling);\n\n                this.updateHiddenInputValue();\n            }\n        } else if (evt.key === ',') {\n            this.addTag(tagValue);\n\n            this.inputNode.value = ''\n            this.updateHiddenInputValue();\n\n            evt.preventDefault();\n        } else if (evt.key !== 'Backspace' && tagValue.length > 255) { // This could be improved to check if it would actually result in a new char being typed...\n            evt.preventDefault();\n        }\n    }\n\n    _handleContainerClick(evt) {\n        if (evt.target && evt.target.classList.contains('delete')) {\n            this.deleteTagNode(evt.target.closest('.tag'));\n            this.updateHiddenInputValue();\n        }\n    }\n}\n\nfunction setupTagsInput() {\n    for (const elem of document.querySelectorAll('.js-tag-input')) {\n        new TagsInput(elem)\n            .attach();\n    }\n}\n\nexport { setupTagsInput };\n","/*!\n  * PhotoSwipe Lightbox 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\n * @template {keyof HTMLElementTagNameMap} T\n * @param {string} className\n * @param {T} tagName\n * @param {Node} [appendToEl]\n * @returns {HTMLElementTagNameMap[T]}\n */\nfunction createElement(className, tagName, appendToEl) {\n  const el = document.createElement(tagName);\n\n  if (className) {\n    el.className = className;\n  }\n\n  if (appendToEl) {\n    appendToEl.appendChild(el);\n  }\n\n  return el;\n}\n/**\n * Get transform string\n *\n * @param {number} x\n * @param {number} [y]\n * @param {number} [scale]\n * @returns {string}\n */\n\nfunction toTransformString(x, y, scale) {\n  let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n  if (scale !== undefined) {\n    propValue += ` scale3d(${scale},${scale},1)`;\n  }\n\n  return propValue;\n}\n/**\n * Apply width and height CSS properties to element\n *\n * @param {HTMLElement} el\n * @param {string | number} w\n * @param {string | number} h\n */\n\nfunction setWidthHeight(el, w, h) {\n  el.style.width = typeof w === 'number' ? `${w}px` : w;\n  el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n  IDLE: 'idle',\n  LOADING: 'loading',\n  LOADED: 'loaded',\n  ERROR: 'error'\n};\n/**\n * Check if click or keydown event was dispatched\n * with a special key or via mouse wheel.\n *\n * @param {MouseEvent | KeyboardEvent} e\n * @returns {boolean}\n */\n\nfunction specialKeyUsed(e) {\n  return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\n * Parse `gallery` or `children` options.\n *\n * @param {import('../photoswipe.js').ElementProvider} [option]\n * @param {string} [legacySelector]\n * @param {HTMLElement | Document} [parent]\n * @returns HTMLElement[]\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n  /** @type {HTMLElement[]} */\n  let elements = [];\n\n  if (option instanceof Element) {\n    elements = [option];\n  } else if (option instanceof NodeList || Array.isArray(option)) {\n    elements = Array.from(option);\n  } else {\n    const selector = typeof option === 'string' ? option : legacySelector;\n\n    if (selector) {\n      elements = Array.from(parent.querySelectorAll(selector));\n    }\n  }\n\n  return elements;\n}\n/**\n * Check if variable is PhotoSwipe class\n *\n * @param {any} fn\n * @returns {boolean}\n */\n\nfunction isPswpClass(fn) {\n  return typeof fn === 'function' && fn.prototype && fn.prototype.goTo;\n}\n/**\n * Check if browser is Safari\n *\n * @returns {boolean}\n */\n\nfunction isSafari() {\n  return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\n * Allow adding an arbitrary props to the Content\n * https://photoswipe.com/custom-content/#using-webp-image-format\n * @typedef {ContentDefault & Record<string, any>} Content\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\n *\n *\n * https://photoswipe.com/adding-ui-elements/\n *\n * @prop {undefined} uiRegister\n * @prop {{ data: UIElementData }} uiElementCreate\n *\n *\n * https://photoswipe.com/events/#initialization-events\n *\n * @prop {undefined} beforeOpen\n * @prop {undefined} firstUpdate\n * @prop {undefined} initialLayout\n * @prop {undefined} change\n * @prop {undefined} afterInit\n * @prop {undefined} bindEvents\n *\n *\n * https://photoswipe.com/events/#opening-or-closing-transition-events\n *\n * @prop {undefined} openingAnimationStart\n * @prop {undefined} openingAnimationEnd\n * @prop {undefined} closingAnimationStart\n * @prop {undefined} closingAnimationEnd\n *\n *\n * https://photoswipe.com/events/#closing-events\n *\n * @prop {undefined} close\n * @prop {undefined} destroy\n *\n *\n * https://photoswipe.com/events/#pointer-and-gesture-events\n *\n * @prop {{ originalEvent: PointerEvent }} pointerDown\n * @prop {{ originalEvent: PointerEvent }} pointerMove\n * @prop {{ originalEvent: PointerEvent }} pointerUp\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\n * @prop {{ panY: number }} verticalDrag can be default prevented\n *\n *\n * https://photoswipe.com/events/#slide-content-events\n *\n * @prop {{ content: Content }} contentInit\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\n * @prop {{ content: Content; slide: Slide }} loadError\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\n * @prop {{ content: Content }} contentAppend can be default prevented\n * @prop {{ content: Content }} contentActivate can be default prevented\n * @prop {{ content: Content }} contentDeactivate can be default prevented\n * @prop {{ content: Content }} contentRemove can be default prevented\n * @prop {{ content: Content }} contentDestroy can be default prevented\n *\n *\n * undocumented\n *\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\n *\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\n * @prop {{ slide: Slide }} firstZoomPan\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\n * @prop {undefined} beforeResize\n * @prop {undefined} resize\n * @prop {undefined} viewportSize\n * @prop {undefined} updateScrollOffset\n * @prop {{ slide: Slide }} slideInit\n * @prop {{ slide: Slide }} afterSetContent\n * @prop {{ slide: Slide }} slideLoad\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\n * @prop {{ slide: Slide }} appendHeavyContent\n * @prop {{ slide: Slide }} slideActivate\n * @prop {{ slide: Slide }} slideDeactivate\n * @prop {{ slide: Slide }} slideDestroy\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\n * @prop {{ slide: Slide }} zoomPanUpdate\n * @prop {{ slide: Slide }} initialZoomPan\n * @prop {{ slide: Slide }} calcSlideSize\n * @prop {undefined} resolutionChanged\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\n * @prop {{ content: Content }} contentAppendImage can be default prevented\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\n * @prop {undefined} lazyLoad\n * @prop {{ slide: Slide }} calcBounds\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\n *\n *\n * legacy\n *\n * @prop {undefined} init\n * @prop {undefined} initialZoomIn\n * @prop {undefined} initialZoomOut\n * @prop {undefined} initialZoomInEnd\n * @prop {undefined} initialZoomOutEnd\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\n * @prop {{ itemData: SlideData; index: number }} itemData\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\n */\n\n/**\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\n *\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\n * Modify the total amount of slides. Example on Data sources page.\n * https://photoswipe.com/filters/#numitems\n *\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\n * Modify slide item data. Example on Data sources page.\n * https://photoswipe.com/filters/#itemdata\n *\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\n * https://photoswipe.com/filters/#domitemdata\n *\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\n * Modify clicked gallery item index.\n * https://photoswipe.com/filters/#clickedindex\n *\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\n * Modify placeholder image source.\n * https://photoswipe.com/filters/#placeholdersrc\n *\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\n * Modify if the content is currently loading.\n * https://photoswipe.com/filters/#iscontentloading\n *\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\n * Modify if the content can be zoomed.\n * https://photoswipe.com/filters/#iscontentzoomable\n *\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\n * Modify if the placeholder should be used for the content.\n * https://photoswipe.com/filters/#usecontentplaceholder\n *\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\n * Modify if the placeholder should be kept after the content is loaded.\n * https://photoswipe.com/filters/#iskeepingplaceholder\n *\n *\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\n * Modify an element when the content has error state (for example, if image cannot be loaded).\n * https://photoswipe.com/filters/#contenterrorelement\n *\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\n * Modify a UI element that's being created.\n * https://photoswipe.com/filters/#uielement\n *\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\n * Modify the thumbnail element from which opening zoom animation starts or ends.\n * https://photoswipe.com/filters/#thumbel\n *\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\n * https://photoswipe.com/filters/#thumbbounds\n *\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\n *\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\n *\n */\n\n/**\n * @template {keyof PhotoSwipeFiltersMap} T\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\n */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\n */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\n */\n\n/**\n * Base PhotoSwipe event object\n *\n * @template {keyof PhotoSwipeEventsMap} T\n */\nclass PhotoSwipeEvent {\n  /**\n   * @param {T} type\n   * @param {PhotoSwipeEventsMap[T]} [details]\n   */\n  constructor(type, details) {\n    this.type = type;\n    this.defaultPrevented = false;\n\n    if (details) {\n      Object.assign(this, details);\n    }\n  }\n\n  preventDefault() {\n    this.defaultPrevented = true;\n  }\n\n}\n/**\n * PhotoSwipe base class that can listen and dispatch for events.\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\n */\n\n\nclass Eventable {\n  constructor() {\n    /**\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\n     */\n    this._listeners = {};\n    /**\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\n     */\n\n    this._filters = {};\n    /** @type {PhotoSwipe | undefined} */\n\n    this.pswp = undefined;\n    /** @type {PhotoSwipeOptions | undefined} */\n\n    this.options = undefined;\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {PhotoSwipeFiltersMap[T]} fn\n   * @param {number} priority\n   */\n\n\n  addFilter(name, fn, priority = 100) {\n    var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n    if (!this._filters[name]) {\n      this._filters[name] = [];\n    }\n\n    (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n      fn,\n      priority\n    });\n    (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n    (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {PhotoSwipeFiltersMap[T]} fn\n   */\n\n\n  removeFilter(name, fn) {\n    if (this._filters[name]) {\n      // @ts-expect-error\n      this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n    }\n\n    if (this.pswp) {\n      this.pswp.removeFilter(name, fn);\n    }\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\n   */\n\n\n  applyFilters(name, ...args) {\n    var _this$_filters$name3;\n\n    (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n      // @ts-expect-error\n      args[0] = filter.fn.apply(this, args);\n    });\n    return args[0];\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {EventCallback<T>} fn\n   */\n\n\n  on(name, fn) {\n    var _this$_listeners$name, _this$pswp2;\n\n    if (!this._listeners[name]) {\n      this._listeners[name] = [];\n    }\n\n    (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n    // also bind events to PhotoSwipe Core,\n    // if it's open.\n\n    (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {EventCallback<T>} fn\n   */\n\n\n  off(name, fn) {\n    var _this$pswp3;\n\n    if (this._listeners[name]) {\n      // @ts-expect-error\n      this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n    }\n\n    (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {PhotoSwipeEventsMap[T]} [details]\n   * @returns {AugmentedEvent<T>}\n   */\n\n\n  dispatch(name, details) {\n    var _this$_listeners$name2;\n\n    if (this.pswp) {\n      return this.pswp.dispatch(name, details);\n    }\n\n    const event =\n    /** @type {AugmentedEvent<T>} */\n    new PhotoSwipeEvent(name, details);\n    (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n      listener.call(this, event);\n    });\n    return event;\n  }\n\n}\n\nclass Placeholder {\n  /**\n   * @param {string | false} imageSrc\n   * @param {HTMLElement} container\n   */\n  constructor(imageSrc, container) {\n    // Create placeholder\n    // (stretched thumbnail or simple div behind the main image)\n\n    /** @type {HTMLImageElement | HTMLDivElement | null} */\n    this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n    if (imageSrc) {\n      const imgEl =\n      /** @type {HTMLImageElement} */\n      this.element;\n      imgEl.decoding = 'async';\n      imgEl.alt = '';\n      imgEl.src = imageSrc;\n      imgEl.setAttribute('role', 'presentation');\n    }\n\n    this.element.setAttribute('aria-hidden', 'true');\n  }\n  /**\n   * @param {number} width\n   * @param {number} height\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.element.tagName === 'IMG') {\n      // Use transform scale() to modify img placeholder size\n      // (instead of changing width/height directly).\n      // This helps with performance, specifically in iOS15 Safari.\n      setWidthHeight(this.element, 250, 'auto');\n      this.element.style.transformOrigin = '0 0';\n      this.element.style.transform = toTransformString(0, 0, width / 250);\n    } else {\n      setWidthHeight(this.element, width, height);\n    }\n  }\n\n  destroy() {\n    var _this$element;\n\n    if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n      this.element.remove();\n    }\n\n    this.element = null;\n  }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n  /**\n   * @param {SlideData} itemData Slide data\n   * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\n   * @param {number} index\n   */\n  constructor(itemData, instance, index) {\n    this.instance = instance;\n    this.data = itemData;\n    this.index = index;\n    /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n    this.element = undefined;\n    /** @type {Placeholder | undefined} */\n\n    this.placeholder = undefined;\n    /** @type {Slide | undefined} */\n\n    this.slide = undefined;\n    this.displayedImageWidth = 0;\n    this.displayedImageHeight = 0;\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\n    this.isAttached = false;\n    this.hasSlide = false;\n    this.isDecoding = false;\n    /** @type {LoadState} */\n\n    this.state = LOAD_STATE.IDLE;\n\n    if (this.data.type) {\n      this.type = this.data.type;\n    } else if (this.data.src) {\n      this.type = 'image';\n    } else {\n      this.type = 'html';\n    }\n\n    this.instance.dispatch('contentInit', {\n      content: this\n    });\n  }\n\n  removePlaceholder() {\n    if (this.placeholder && !this.keepPlaceholder()) {\n      // With delay, as image might be loaded, but not rendered\n      setTimeout(() => {\n        if (this.placeholder) {\n          this.placeholder.destroy();\n          this.placeholder = undefined;\n        }\n      }, 1000);\n    }\n  }\n  /**\n   * Preload content\n   *\n   * @param {boolean} isLazy\n   * @param {boolean} [reload]\n   */\n\n\n  load(isLazy, reload) {\n    if (this.slide && this.usePlaceholder()) {\n      if (!this.placeholder) {\n        const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use  image-based placeholder only for the first slide,\n        // as rendering (even small stretched thumbnail) is an expensive operation\n        this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n        this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n      } else {\n        const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n        if (placeholderEl && !placeholderEl.parentElement) {\n          this.slide.container.prepend(placeholderEl);\n        }\n      }\n    }\n\n    if (this.element && !reload) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentLoad', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.isImageContent()) {\n      this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n      // Due to Safari feature, we must define sizes before srcset.\n\n      if (this.displayedImageWidth) {\n        this.loadImage(isLazy);\n      }\n    } else {\n      this.element = createElement('pswp__content', 'div');\n      this.element.innerHTML = this.data.html || '';\n    }\n\n    if (reload && this.slide) {\n      this.slide.updateContentSize(true);\n    }\n  }\n  /**\n   * Preload image\n   *\n   * @param {boolean} isLazy\n   */\n\n\n  loadImage(isLazy) {\n    var _this$data$src, _this$data$alt;\n\n    if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    const imageElement =\n    /** @type HTMLImageElement */\n    this.element;\n    this.updateSrcsetSizes();\n\n    if (this.data.srcset) {\n      imageElement.srcset = this.data.srcset;\n    }\n\n    imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n    imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n    this.state = LOAD_STATE.LOADING;\n\n    if (imageElement.complete) {\n      this.onLoaded();\n    } else {\n      imageElement.onload = () => {\n        this.onLoaded();\n      };\n\n      imageElement.onerror = () => {\n        this.onError();\n      };\n    }\n  }\n  /**\n   * Assign slide to content\n   *\n   * @param {Slide} slide\n   */\n\n\n  setSlide(slide) {\n    this.slide = slide;\n    this.hasSlide = true;\n    this.instance = slide.pswp; // todo: do we need to unset slide?\n  }\n  /**\n   * Content load success handler\n   */\n\n\n  onLoaded() {\n    this.state = LOAD_STATE.LOADED;\n\n    if (this.slide && this.element) {\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        content: this\n      }); // if content is reloaded\n\n      if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n        this.append();\n        this.slide.updateContentSize(true);\n      }\n\n      if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n        this.removePlaceholder();\n      }\n    }\n  }\n  /**\n   * Content load error handler\n   */\n\n\n  onError() {\n    this.state = LOAD_STATE.ERROR;\n\n    if (this.slide) {\n      this.displayError();\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        isError: true,\n        content: this\n      });\n      this.instance.dispatch('loadError', {\n        slide: this.slide,\n        content: this\n      });\n    }\n  }\n  /**\n   * @returns {Boolean} If the content is currently loading\n   */\n\n\n  isLoading() {\n    return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n  }\n  /**\n   * @returns {Boolean} If the content is in error state\n   */\n\n\n  isError() {\n    return this.state === LOAD_STATE.ERROR;\n  }\n  /**\n   * @returns {boolean} If the content is image\n   */\n\n\n  isImageContent() {\n    return this.type === 'image';\n  }\n  /**\n   * Update content size\n   *\n   * @param {Number} width\n   * @param {Number} height\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.placeholder) {\n      this.placeholder.setDisplayedSize(width, height);\n    }\n\n    if (this.instance.dispatch('contentResize', {\n      content: this,\n      width,\n      height\n    }).defaultPrevented) {\n      return;\n    }\n\n    setWidthHeight(this.element, width, height);\n\n    if (this.isImageContent() && !this.isError()) {\n      const isInitialSizeUpdate = !this.displayedImageWidth && width;\n      this.displayedImageWidth = width;\n      this.displayedImageHeight = height;\n\n      if (isInitialSizeUpdate) {\n        this.loadImage(false);\n      } else {\n        this.updateSrcsetSizes();\n      }\n\n      if (this.slide) {\n        this.instance.dispatch('imageSizeChange', {\n          slide: this.slide,\n          width,\n          height,\n          content: this\n        });\n      }\n    }\n  }\n  /**\n   * @returns {boolean} If the content can be zoomed\n   */\n\n\n  isZoomable() {\n    return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n  }\n  /**\n   * Update image srcset sizes attribute based on width and height\n   */\n\n\n  updateSrcsetSizes() {\n    // Handle srcset sizes attribute.\n    //\n    // Never lower quality, if it was increased previously.\n    // Chrome does this automatically, Firefox and Safari do not,\n    // so we store largest used size in dataset.\n    if (!this.isImageContent() || !this.element || !this.data.srcset) {\n      return;\n    }\n\n    const image =\n    /** @type HTMLImageElement */\n    this.element;\n    const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n    if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n      image.sizes = sizesWidth + 'px';\n      image.dataset.largestUsedSize = String(sizesWidth);\n    }\n  }\n  /**\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\n   */\n\n\n  usePlaceholder() {\n    return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n  }\n  /**\n   * Preload content with lazy-loading param\n   */\n\n\n  lazyLoad() {\n    if (this.instance.dispatch('contentLazyLoad', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.load(true);\n  }\n  /**\n   * @returns {boolean} If placeholder should be kept after content is loaded\n   */\n\n\n  keepPlaceholder() {\n    return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n  }\n  /**\n   * Destroy the content\n   */\n\n\n  destroy() {\n    this.hasSlide = false;\n    this.slide = undefined;\n\n    if (this.instance.dispatch('contentDestroy', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.remove();\n\n    if (this.placeholder) {\n      this.placeholder.destroy();\n      this.placeholder = undefined;\n    }\n\n    if (this.isImageContent() && this.element) {\n      this.element.onload = null;\n      this.element.onerror = null;\n      this.element = undefined;\n    }\n  }\n  /**\n   * Display error message\n   */\n\n\n  displayError() {\n    if (this.slide) {\n      var _this$instance$option, _this$instance$option2;\n\n      let errorMsgEl = createElement('pswp__error-msg', 'div');\n      errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n      errorMsgEl =\n      /** @type {HTMLDivElement} */\n      this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n      this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n      this.element.appendChild(errorMsgEl);\n      this.slide.container.innerText = '';\n      this.slide.container.appendChild(this.element);\n      this.slide.updateContentSize(true);\n      this.removePlaceholder();\n    }\n  }\n  /**\n   * Append the content\n   */\n\n\n  append() {\n    if (this.isAttached || !this.element) {\n      return;\n    }\n\n    this.isAttached = true;\n\n    if (this.state === LOAD_STATE.ERROR) {\n      this.displayError();\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppend', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    const supportsDecode = ('decode' in this.element);\n\n    if (this.isImageContent()) {\n      // Use decode() on nearby slides\n      //\n      // Nearby slide images are in DOM and not hidden via display:none.\n      // However, they are placed offscreen (to the left and right side).\n      //\n      // Some browsers do not composite the image until it's actually visible,\n      // using decode() helps.\n      //\n      // You might ask \"why dont you just decode() and then append all images\",\n      // that's because I want to show image before it's fully loaded,\n      // as browser can render parts of image while it is loading.\n      // We do not do this in Safari due to partial loading bug.\n      if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n        this.isDecoding = true; // purposefully using finally instead of then,\n        // as if srcset sizes changes dynamically - it may cause decode error\n\n        /** @type {HTMLImageElement} */\n\n        this.element.decode().catch(() => {}).finally(() => {\n          this.isDecoding = false;\n          this.appendImage();\n        });\n      } else {\n        this.appendImage();\n      }\n    } else if (this.slide && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n  }\n  /**\n   * Activate the slide,\n   * active slide is generally the current one,\n   * meaning the user can see it.\n   */\n\n\n  activate() {\n    if (this.instance.dispatch('contentActivate', {\n      content: this\n    }).defaultPrevented || !this.slide) {\n      return;\n    }\n\n    if (this.isImageContent() && this.isDecoding && !isSafari()) {\n      // add image to slide when it becomes active,\n      // even if it's not finished decoding\n      this.appendImage();\n    } else if (this.isError()) {\n      this.load(false, true); // try to reload\n    }\n\n    if (this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'false');\n    }\n  }\n  /**\n   * Deactivate the content\n   */\n\n\n  deactivate() {\n    this.instance.dispatch('contentDeactivate', {\n      content: this\n    });\n\n    if (this.slide && this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'true');\n    }\n  }\n  /**\n   * Remove the content from DOM\n   */\n\n\n  remove() {\n    this.isAttached = false;\n\n    if (this.instance.dispatch('contentRemove', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.element && this.element.parentNode) {\n      this.element.remove();\n    }\n\n    if (this.placeholder && this.placeholder.element) {\n      this.placeholder.element.remove();\n    }\n  }\n  /**\n   * Append the image content to slide container\n   */\n\n\n  appendImage() {\n    if (!this.isAttached) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppendImage', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    } // ensure that element exists and is not already appended\n\n\n    if (this.slide && this.element && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n\n    if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n      this.removePlaceholder();\n    }\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\n * @param {PhotoSwipeOptions} options\n * @param {PhotoSwipeBase} pswp\n * @returns {Point}\n */\nfunction getViewportSize(options, pswp) {\n  if (options.getViewportSizeFn) {\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n    if (newViewportSize) {\n      return newViewportSize;\n    }\n  }\n\n  return {\n    x: document.documentElement.clientWidth,\n    // TODO: height on mobile is very incosistent due to toolbar\n    // find a way to improve this\n    //\n    // document.documentElement.clientHeight - doesn't seem to work well\n    y: window.innerHeight\n  };\n}\n/**\n * Parses padding option.\n * Supported formats:\n *\n * // Object\n * padding: {\n *  top: 0,\n *  bottom: 0,\n *  left: 0,\n *  right: 0\n * }\n *\n * // A function that returns the object\n * paddingFn: (viewportSize, itemData, index) => {\n *  return {\n *    top: 0,\n *    bottom: 0,\n *    left: 0,\n *    right: 0\n *  };\n * }\n *\n * // Legacy variant\n * paddingLeft: 0,\n * paddingRight: 0,\n * paddingTop: 0,\n * paddingBottom: 0,\n *\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\n * @param {PhotoSwipeOptions} options PhotoSwipe options\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\n * @param {SlideData} itemData Data about the slide\n * @param {number} index Slide index\n * @returns {number}\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n  let paddingValue = 0;\n\n  if (options.paddingFn) {\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n  } else if (options.padding) {\n    paddingValue = options.padding[prop];\n  } else {\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n    if (options[legacyPropName]) {\n      // @ts-expect-error\n      paddingValue = options[legacyPropName];\n    }\n  }\n\n  return Number(paddingValue) || 0;\n}\n/**\n * @param {PhotoSwipeOptions} options\n * @param {Point} viewportSize\n * @param {SlideData} itemData\n * @param {number} index\n * @returns {Point}\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n  return {\n    x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n    y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n  };\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\n * Calculates zoom levels for specific slide.\n * Depends on viewport size and image size.\n */\n\nclass ZoomLevel {\n  /**\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\n   * @param {SlideData} itemData Slide data\n   * @param {number} index Slide index\n   * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\n   */\n  constructor(options, itemData, index, pswp) {\n    this.pswp = pswp;\n    this.options = options;\n    this.itemData = itemData;\n    this.index = index;\n    /** @type { Point | null } */\n\n    this.panAreaSize = null;\n    /** @type { Point | null } */\n\n    this.elementSize = null;\n    this.fit = 1;\n    this.fill = 1;\n    this.vFill = 1;\n    this.initial = 1;\n    this.secondary = 1;\n    this.max = 1;\n    this.min = 1;\n  }\n  /**\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\n   *\n   * It should be called when either image or viewport size changes.\n   *\n   * @param {number} maxWidth\n   * @param {number} maxHeight\n   * @param {Point} panAreaSize\n   */\n\n\n  update(maxWidth, maxHeight, panAreaSize) {\n    /** @type {Point} */\n    const elementSize = {\n      x: maxWidth,\n      y: maxHeight\n    };\n    this.elementSize = elementSize;\n    this.panAreaSize = panAreaSize;\n    const hRatio = panAreaSize.x / elementSize.x;\n    const vRatio = panAreaSize.y / elementSize.y;\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n    // when it has 100% of viewport vertical space (height)\n\n    this.vFill = Math.min(1, vRatio);\n    this.initial = this._getInitial();\n    this.secondary = this._getSecondary();\n    this.max = Math.max(this.initial, this.secondary, this._getMax());\n    this.min = Math.min(this.fit, this.initial, this.secondary);\n\n    if (this.pswp) {\n      this.pswp.dispatch('zoomLevelsUpdate', {\n        zoomLevels: this,\n        slideData: this.itemData\n      });\n    }\n  }\n  /**\n   * Parses user-defined zoom option.\n   *\n   * @private\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\n   * @returns { number | undefined }\n   */\n\n\n  _parseZoomLevelOption(optionPrefix) {\n    const optionName =\n    /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n    optionPrefix + 'ZoomLevel';\n    const optionValue = this.options[optionName];\n\n    if (!optionValue) {\n      return;\n    }\n\n    if (typeof optionValue === 'function') {\n      return optionValue(this);\n    }\n\n    if (optionValue === 'fill') {\n      return this.fill;\n    }\n\n    if (optionValue === 'fit') {\n      return this.fit;\n    }\n\n    return Number(optionValue);\n  }\n  /**\n   * Get zoom level to which image will be zoomed after double-tap gesture,\n   * or when user clicks on zoom icon,\n   * or mouse-click on image itself.\n   * If you return 1 image will be zoomed to its original size.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getSecondary() {\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n    if (currZoomLevel) {\n      return currZoomLevel;\n    } // 3x of \"fit\" state, but not larger than original\n\n\n    currZoomLevel = Math.min(1, this.fit * 3);\n\n    if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n    }\n\n    return currZoomLevel;\n  }\n  /**\n   * Get initial image zoom level.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getInitial() {\n    return this._parseZoomLevelOption('initial') || this.fit;\n  }\n  /**\n   * Maximum zoom level when user zooms\n   * via zoom/pinch gesture,\n   * via cmd/ctrl-wheel or via trackpad.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getMax() {\n    // max zoom level is x4 from \"fit state\",\n    // used for zoom gesture and ctrl/trackpad zoom\n    return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n  }\n\n}\n\n/**\n * Lazy-load an image\n * This function is used both by Lightbox and PhotoSwipe core,\n * thus it can be called before dialog is opened.\n *\n * @param {SlideData} itemData Data about the slide\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\n * @param {number} index\n * @returns {Content} Image that is being decoded or false.\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n  const content = instance.createContentFromData(itemData, index);\n  /** @type {ZoomLevel | undefined} */\n\n  let zoomLevel;\n  const {\n    options\n  } = instance; // We need to know dimensions of the image to preload it,\n  // as it might use srcset, and we need to define sizes\n\n  if (options) {\n    zoomLevel = new ZoomLevel(options, itemData, -1);\n    let viewportSize;\n\n    if (instance.pswp) {\n      viewportSize = instance.pswp.viewportSize;\n    } else {\n      viewportSize = getViewportSize(options, instance);\n    }\n\n    const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n    zoomLevel.update(content.width, content.height, panAreaSize);\n  }\n\n  content.lazyLoad();\n\n  if (zoomLevel) {\n    content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n  }\n\n  return content;\n}\n/**\n * Lazy-loads specific slide.\n * This function is used both by Lightbox and PhotoSwipe core,\n * thus it can be called before dialog is opened.\n *\n * By default, it loads image based on viewport size and initial zoom level.\n *\n * @param {number} index Slide index\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\n * @returns {Content | undefined}\n */\n\nfunction lazyLoadSlide(index, instance) {\n  const itemData = instance.getItemData(index);\n\n  if (instance.dispatch('lazyLoadSlide', {\n    index,\n    itemData\n  }).defaultPrevented) {\n    return;\n  }\n\n  return lazyLoadData(itemData, instance, index);\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\n * PhotoSwipe base class that can retrieve data about every slide.\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\n */\n\nclass PhotoSwipeBase extends Eventable {\n  /**\n   * Get total number of slides\n   *\n   * @returns {number}\n   */\n  getNumItems() {\n    var _this$options;\n\n    let numItems = 0;\n    const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n    if (dataSource && 'length' in dataSource) {\n      // may be an array or just object with length property\n      numItems = dataSource.length;\n    } else if (dataSource && 'gallery' in dataSource) {\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      if (dataSource.items) {\n        numItems = dataSource.items.length;\n      }\n    } // legacy event, before filters were introduced\n\n\n    const event = this.dispatch('numItems', {\n      dataSource,\n      numItems\n    });\n    return this.applyFilters('numItems', event.numItems, dataSource);\n  }\n  /**\n   * @param {SlideData} slideData\n   * @param {number} index\n   * @returns {Content}\n   */\n\n\n  createContentFromData(slideData, index) {\n    return new Content(slideData, this, index);\n  }\n  /**\n   * Get item data by index.\n   *\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\n   * For example, it may contain properties like\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\n   *\n   * @param {number} index\n   * @returns {SlideData}\n   */\n\n\n  getItemData(index) {\n    var _this$options2;\n\n    const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n    /** @type {SlideData | HTMLElement} */\n\n    let dataSourceItem = {};\n\n    if (Array.isArray(dataSource)) {\n      // Datasource is an array of elements\n      dataSourceItem = dataSource[index];\n    } else if (dataSource && 'gallery' in dataSource) {\n      // dataSource has gallery property,\n      // thus it was created by Lightbox, based on\n      // gallery and children options\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      dataSourceItem = dataSource.items[index];\n    }\n\n    let itemData = dataSourceItem;\n\n    if (itemData instanceof Element) {\n      itemData = this._domElementToItemData(itemData);\n    } // Dispatching the itemData event,\n    // it's a legacy verion before filters were introduced\n\n\n    const event = this.dispatch('itemData', {\n      itemData: itemData || {},\n      index\n    });\n    return this.applyFilters('itemData', event.itemData, index);\n  }\n  /**\n   * Get array of gallery DOM elements,\n   * based on childSelector and gallery element.\n   *\n   * @param {HTMLElement} galleryElement\n   * @returns {HTMLElement[]}\n   */\n\n\n  _getGalleryDOMElements(galleryElement) {\n    var _this$options3, _this$options4;\n\n    if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n      return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n    }\n\n    return [galleryElement];\n  }\n  /**\n   * Converts DOM element to item data object.\n   *\n   * @param {HTMLElement} element DOM element\n   * @returns {SlideData}\n   */\n\n\n  _domElementToItemData(element) {\n    /** @type {SlideData} */\n    const itemData = {\n      element\n    };\n    const linkEl =\n    /** @type {HTMLAnchorElement} */\n    element.tagName === 'A' ? element : element.querySelector('a');\n\n    if (linkEl) {\n      // src comes from data-pswp-src attribute,\n      // if it's empty link href is used\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n      if (linkEl.dataset.pswpSrcset) {\n        itemData.srcset = linkEl.dataset.pswpSrcset;\n      }\n\n      itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n      itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n      itemData.w = itemData.width;\n      itemData.h = itemData.height;\n\n      if (linkEl.dataset.pswpType) {\n        itemData.type = linkEl.dataset.pswpType;\n      }\n\n      const thumbnailEl = element.querySelector('img');\n\n      if (thumbnailEl) {\n        var _thumbnailEl$getAttri;\n\n        // msrc is URL to placeholder image that's displayed before large image is loaded\n        // by default it's displayed only for the first slide\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n        itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n      }\n\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n        itemData.thumbCropped = true;\n      }\n    }\n\n    return this.applyFilters('domItemData', itemData, element, linkEl);\n  }\n  /**\n   * Lazy-load by slide data\n   *\n   * @param {SlideData} itemData Data about the slide\n   * @param {number} index\n   * @returns {Content} Image that is being decoded or false.\n   */\n\n\n  lazyLoadData(itemData, index) {\n    return lazyLoadData(itemData, this, index);\n  }\n\n}\n\n/**\n * @template T\n * @typedef {import('../types.js').Type<T>} Type<T>\n */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/content.js').default} Content */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('../core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {import('../core/eventable.js').EventCallback<T>} EventCallback<T>\n */\n\n/**\n * PhotoSwipe Lightbox\n *\n * - If user has unsupported browser it falls back to default browser action (just opens URL)\n * - Binds click event to links that should open PhotoSwipe\n * - parses DOM strcture for PhotoSwipe (retrieves large image URLs and sizes)\n * - Initializes PhotoSwipe\n *\n *\n * Loader options use the same object as PhotoSwipe, and supports such options:\n *\n * gallery - Element | Element[] | NodeList | string selector for the gallery element\n * children - Element | Element[] | NodeList | string selector for the gallery children\n *\n */\n\nclass PhotoSwipeLightbox extends PhotoSwipeBase {\n  /**\n   * @param {PhotoSwipeOptions} [options]\n   */\n  constructor(options) {\n    super();\n    /** @type {PhotoSwipeOptions} */\n\n    this.options = options || {};\n    this._uid = 0;\n    this.shouldOpen = false;\n    /**\n     * @private\n     * @type {Content | undefined}\n     */\n\n    this._preloadedContent = undefined;\n    this.onThumbnailsClick = this.onThumbnailsClick.bind(this);\n  }\n  /**\n   * Initialize lightbox, should be called only once.\n   * It's not included in the main constructor, so you may bind events before it.\n   */\n\n\n  init() {\n    // Bind click events to each gallery\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n      galleryElement.addEventListener('click', this.onThumbnailsClick, false);\n    });\n  }\n  /**\n   * @param {MouseEvent} e\n   */\n\n\n  onThumbnailsClick(e) {\n    // Exit and allow default browser action if:\n    if (specialKeyUsed(e) // ... if clicked with a special key (ctrl/cmd...)\n    || window.pswp) {\n      // ... if PhotoSwipe is already open\n      return;\n    } // If both clientX and clientY are 0 or not defined,\n    // the event is likely triggered by keyboard,\n    // so we do not pass the initialPoint\n    //\n    // Note that some screen readers emulate the mouse position,\n    // so it's not the ideal way to detect them.\n    //\n\n    /** @type {Point | null} */\n\n\n    let initialPoint = {\n      x: e.clientX,\n      y: e.clientY\n    };\n\n    if (!initialPoint.x && !initialPoint.y) {\n      initialPoint = null;\n    }\n\n    let clickedIndex = this.getClickedIndex(e);\n    clickedIndex = this.applyFilters('clickedIndex', clickedIndex, e, this);\n    /** @type {DataSource} */\n\n    const dataSource = {\n      gallery:\n      /** @type {HTMLElement} */\n      e.currentTarget\n    };\n\n    if (clickedIndex >= 0) {\n      e.preventDefault();\n      this.loadAndOpen(clickedIndex, dataSource, initialPoint);\n    }\n  }\n  /**\n   * Get index of gallery item that was clicked.\n   *\n   * @param {MouseEvent} e click event\n   * @returns {number}\n   */\n\n\n  getClickedIndex(e) {\n    // legacy option\n    if (this.options.getClickedIndexFn) {\n      return this.options.getClickedIndexFn.call(this, e);\n    }\n\n    const clickedTarget =\n    /** @type {HTMLElement} */\n    e.target;\n    const childElements = getElementsFromOption(this.options.children, this.options.childSelector,\n    /** @type {HTMLElement} */\n    e.currentTarget);\n    const clickedChildIndex = childElements.findIndex(child => child === clickedTarget || child.contains(clickedTarget));\n\n    if (clickedChildIndex !== -1) {\n      return clickedChildIndex;\n    } else if (this.options.children || this.options.childSelector) {\n      // click wasn't on a child element\n      return -1;\n    } // There is only one item (which is the gallery)\n\n\n    return 0;\n  }\n  /**\n   * Load and open PhotoSwipe\n   *\n   * @param {number} index\n   * @param {DataSource} [dataSource]\n   * @param {Point | null} [initialPoint]\n   * @returns {boolean}\n   */\n\n\n  loadAndOpen(index, dataSource, initialPoint) {\n    // Check if the gallery is already open\n    if (window.pswp || !this.options) {\n      return false;\n    } // Use the first gallery element if dataSource is not provided\n\n\n    if (!dataSource && this.options.gallery && this.options.children) {\n      const galleryElements = getElementsFromOption(this.options.gallery);\n\n      if (galleryElements[0]) {\n        dataSource = {\n          gallery: galleryElements[0]\n        };\n      }\n    } // set initial index\n\n\n    this.options.index = index; // define options for PhotoSwipe constructor\n\n    this.options.initialPointerPos = initialPoint;\n    this.shouldOpen = true;\n    this.preload(index, dataSource);\n    return true;\n  }\n  /**\n   * Load the main module and the slide content by index\n   *\n   * @param {number} index\n   * @param {DataSource} [dataSource]\n   */\n\n\n  preload(index, dataSource) {\n    const {\n      options\n    } = this;\n\n    if (dataSource) {\n      options.dataSource = dataSource;\n    } // Add the main module\n\n    /** @type {Promise<Type<PhotoSwipe>>[]} */\n\n\n    const promiseArray = [];\n    const pswpModuleType = typeof options.pswpModule;\n\n    if (isPswpClass(options.pswpModule)) {\n      promiseArray.push(Promise.resolve(\n      /** @type {Type<PhotoSwipe>} */\n      options.pswpModule));\n    } else if (pswpModuleType === 'string') {\n      throw new Error('pswpModule as string is no longer supported');\n    } else if (pswpModuleType === 'function') {\n      promiseArray.push(\n      /** @type {() => Promise<Type<PhotoSwipe>>} */\n      options.pswpModule());\n    } else {\n      throw new Error('pswpModule is not valid');\n    } // Add custom-defined promise, if any\n\n\n    if (typeof options.openPromise === 'function') {\n      // allow developers to perform some task before opening\n      promiseArray.push(options.openPromise());\n    }\n\n    if (options.preloadFirstSlide !== false && index >= 0) {\n      this._preloadedContent = lazyLoadSlide(index, this);\n    } // Wait till all promises resolve and open PhotoSwipe\n\n\n    const uid = ++this._uid;\n    Promise.all(promiseArray).then(iterableModules => {\n      if (this.shouldOpen) {\n        const mainModule = iterableModules[0];\n\n        this._openPhotoswipe(mainModule, uid);\n      }\n    });\n  }\n  /**\n   * @private\n   * @param {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} module\n   * @param {number} uid\n   */\n\n\n  _openPhotoswipe(module, uid) {\n    // Cancel opening if UID doesn't match the current one\n    // (if user clicked on another gallery item before current was loaded).\n    //\n    // Or if shouldOpen flag is set to false\n    // (developer may modify it via public API)\n    if (uid !== this._uid && this.shouldOpen) {\n      return;\n    }\n\n    this.shouldOpen = false; // PhotoSwipe is already open\n\n    if (window.pswp) {\n      return;\n    }\n    /**\n     * Pass data to PhotoSwipe and open init\n     *\n     * @type {PhotoSwipe}\n     */\n\n\n    const pswp = typeof module === 'object' ? new module.default(this.options) // eslint-disable-line\n    : new module(this.options); // eslint-disable-line\n\n    this.pswp = pswp;\n    window.pswp = pswp; // map listeners from Lightbox to PhotoSwipe Core\n\n    /** @type {(keyof PhotoSwipeEventsMap)[]} */\n\n    Object.keys(this._listeners).forEach(name => {\n      var _this$_listeners$name;\n\n      (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.forEach(fn => {\n        pswp.on(name,\n        /** @type {EventCallback<typeof name>} */\n        fn);\n      });\n    }); // same with filters\n\n    /** @type {(keyof PhotoSwipeFiltersMap)[]} */\n\n    Object.keys(this._filters).forEach(name => {\n      var _this$_filters$name;\n\n      (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.forEach(filter => {\n        pswp.addFilter(name, filter.fn, filter.priority);\n      });\n    });\n\n    if (this._preloadedContent) {\n      pswp.contentLoader.addToCache(this._preloadedContent);\n      this._preloadedContent = undefined;\n    }\n\n    pswp.on('destroy', () => {\n      // clean up public variables\n      this.pswp = undefined;\n      delete window.pswp;\n    });\n    pswp.init();\n  }\n  /**\n   * Unbinds all events, closes PhotoSwipe if it's open.\n   */\n\n\n  destroy() {\n    var _this$pswp;\n\n    (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.destroy();\n    this.shouldOpen = false;\n    this._listeners = {};\n    getElementsFromOption(this.options.gallery, this.options.gallerySelector).forEach(galleryElement => {\n      galleryElement.removeEventListener('click', this.onThumbnailsClick, false);\n    });\n  }\n\n}\n\nexport { PhotoSwipeLightbox as default };\n//# sourceMappingURL=photoswipe-lightbox.esm.js.map\n","/*!\n  * PhotoSwipe 5.4.4 - https://photoswipe.com\n  * (c) 2024 Dmytro Semenov\n  */\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/**\n * @template {keyof HTMLElementTagNameMap} T\n * @param {string} className\n * @param {T} tagName\n * @param {Node} [appendToEl]\n * @returns {HTMLElementTagNameMap[T]}\n */\nfunction createElement(className, tagName, appendToEl) {\n  const el = document.createElement(tagName);\n\n  if (className) {\n    el.className = className;\n  }\n\n  if (appendToEl) {\n    appendToEl.appendChild(el);\n  }\n\n  return el;\n}\n/**\n * @param {Point} p1\n * @param {Point} p2\n * @returns {Point}\n */\n\nfunction equalizePoints(p1, p2) {\n  p1.x = p2.x;\n  p1.y = p2.y;\n\n  if (p2.id !== undefined) {\n    p1.id = p2.id;\n  }\n\n  return p1;\n}\n/**\n * @param {Point} p\n */\n\nfunction roundPoint(p) {\n  p.x = Math.round(p.x);\n  p.y = Math.round(p.y);\n}\n/**\n * Returns distance between two points.\n *\n * @param {Point} p1\n * @param {Point} p2\n * @returns {number}\n */\n\nfunction getDistanceBetween(p1, p2) {\n  const x = Math.abs(p1.x - p2.x);\n  const y = Math.abs(p1.y - p2.y);\n  return Math.sqrt(x * x + y * y);\n}\n/**\n * Whether X and Y positions of points are equal\n *\n * @param {Point} p1\n * @param {Point} p2\n * @returns {boolean}\n */\n\nfunction pointsEqual(p1, p2) {\n  return p1.x === p2.x && p1.y === p2.y;\n}\n/**\n * The float result between the min and max values.\n *\n * @param {number} val\n * @param {number} min\n * @param {number} max\n * @returns {number}\n */\n\nfunction clamp(val, min, max) {\n  return Math.min(Math.max(val, min), max);\n}\n/**\n * Get transform string\n *\n * @param {number} x\n * @param {number} [y]\n * @param {number} [scale]\n * @returns {string}\n */\n\nfunction toTransformString(x, y, scale) {\n  let propValue = `translate3d(${x}px,${y || 0}px,0)`;\n\n  if (scale !== undefined) {\n    propValue += ` scale3d(${scale},${scale},1)`;\n  }\n\n  return propValue;\n}\n/**\n * Apply transform:translate(x, y) scale(scale) to element\n *\n * @param {HTMLElement} el\n * @param {number} x\n * @param {number} [y]\n * @param {number} [scale]\n */\n\nfunction setTransform(el, x, y, scale) {\n  el.style.transform = toTransformString(x, y, scale);\n}\nconst defaultCSSEasing = 'cubic-bezier(.4,0,.22,1)';\n/**\n * Apply CSS transition to element\n *\n * @param {HTMLElement} el\n * @param {string} [prop] CSS property to animate\n * @param {number} [duration] in ms\n * @param {string} [ease] CSS easing function\n */\n\nfunction setTransitionStyle(el, prop, duration, ease) {\n  // inOut: 'cubic-bezier(.4, 0, .22, 1)', // for \"toggle state\" transitions\n  // out: 'cubic-bezier(0, 0, .22, 1)', // for \"show\" transitions\n  // in: 'cubic-bezier(.4, 0, 1, 1)'// for \"hide\" transitions\n  el.style.transition = prop ? `${prop} ${duration}ms ${ease || defaultCSSEasing}` : 'none';\n}\n/**\n * Apply width and height CSS properties to element\n *\n * @param {HTMLElement} el\n * @param {string | number} w\n * @param {string | number} h\n */\n\nfunction setWidthHeight(el, w, h) {\n  el.style.width = typeof w === 'number' ? `${w}px` : w;\n  el.style.height = typeof h === 'number' ? `${h}px` : h;\n}\n/**\n * @param {HTMLElement} el\n */\n\nfunction removeTransitionStyle(el) {\n  setTransitionStyle(el);\n}\n/**\n * @param {HTMLImageElement} img\n * @returns {Promise<HTMLImageElement | void>}\n */\n\nfunction decodeImage(img) {\n  if ('decode' in img) {\n    return img.decode().catch(() => {});\n  }\n\n  if (img.complete) {\n    return Promise.resolve(img);\n  }\n\n  return new Promise((resolve, reject) => {\n    img.onload = () => resolve(img);\n\n    img.onerror = reject;\n  });\n}\n/** @typedef {LOAD_STATE[keyof LOAD_STATE]} LoadState */\n\n/** @type {{ IDLE: 'idle'; LOADING: 'loading'; LOADED: 'loaded'; ERROR: 'error' }} */\n\nconst LOAD_STATE = {\n  IDLE: 'idle',\n  LOADING: 'loading',\n  LOADED: 'loaded',\n  ERROR: 'error'\n};\n/**\n * Check if click or keydown event was dispatched\n * with a special key or via mouse wheel.\n *\n * @param {MouseEvent | KeyboardEvent} e\n * @returns {boolean}\n */\n\nfunction specialKeyUsed(e) {\n  return 'button' in e && e.button === 1 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey;\n}\n/**\n * Parse `gallery` or `children` options.\n *\n * @param {import('../photoswipe.js').ElementProvider} [option]\n * @param {string} [legacySelector]\n * @param {HTMLElement | Document} [parent]\n * @returns HTMLElement[]\n */\n\nfunction getElementsFromOption(option, legacySelector, parent = document) {\n  /** @type {HTMLElement[]} */\n  let elements = [];\n\n  if (option instanceof Element) {\n    elements = [option];\n  } else if (option instanceof NodeList || Array.isArray(option)) {\n    elements = Array.from(option);\n  } else {\n    const selector = typeof option === 'string' ? option : legacySelector;\n\n    if (selector) {\n      elements = Array.from(parent.querySelectorAll(selector));\n    }\n  }\n\n  return elements;\n}\n/**\n * Check if browser is Safari\n *\n * @returns {boolean}\n */\n\nfunction isSafari() {\n  return !!(navigator.vendor && navigator.vendor.match(/apple/i));\n}\n\n// Detect passive event listener support\nlet supportsPassive = false;\n/* eslint-disable */\n\ntry {\n  /* @ts-ignore */\n  window.addEventListener('test', null, Object.defineProperty({}, 'passive', {\n    get: () => {\n      supportsPassive = true;\n    }\n  }));\n} catch (e) {}\n/* eslint-enable */\n\n/**\n * @typedef {Object} PoolItem\n * @prop {HTMLElement | Window | Document | undefined | null} target\n * @prop {string} type\n * @prop {EventListenerOrEventListenerObject} listener\n * @prop {boolean} [passive]\n */\n\n\nclass DOMEvents {\n  constructor() {\n    /**\n     * @type {PoolItem[]}\n     * @private\n     */\n    this._pool = [];\n  }\n  /**\n   * Adds event listeners\n   *\n   * @param {PoolItem['target']} target\n   * @param {PoolItem['type']} type Can be multiple, separated by space.\n   * @param {PoolItem['listener']} listener\n   * @param {PoolItem['passive']} [passive]\n   */\n\n\n  add(target, type, listener, passive) {\n    this._toggleListener(target, type, listener, passive);\n  }\n  /**\n   * Removes event listeners\n   *\n   * @param {PoolItem['target']} target\n   * @param {PoolItem['type']} type\n   * @param {PoolItem['listener']} listener\n   * @param {PoolItem['passive']} [passive]\n   */\n\n\n  remove(target, type, listener, passive) {\n    this._toggleListener(target, type, listener, passive, true);\n  }\n  /**\n   * Removes all bound events\n   */\n\n\n  removeAll() {\n    this._pool.forEach(poolItem => {\n      this._toggleListener(poolItem.target, poolItem.type, poolItem.listener, poolItem.passive, true, true);\n    });\n\n    this._pool = [];\n  }\n  /**\n   * Adds or removes event\n   *\n   * @private\n   * @param {PoolItem['target']} target\n   * @param {PoolItem['type']} type\n   * @param {PoolItem['listener']} listener\n   * @param {PoolItem['passive']} [passive]\n   * @param {boolean} [unbind] Whether the event should be added or removed\n   * @param {boolean} [skipPool] Whether events pool should be skipped\n   */\n\n\n  _toggleListener(target, type, listener, passive, unbind, skipPool) {\n    if (!target) {\n      return;\n    }\n\n    const methodName = unbind ? 'removeEventListener' : 'addEventListener';\n    const types = type.split(' ');\n    types.forEach(eType => {\n      if (eType) {\n        // Events pool is used to easily unbind all events when PhotoSwipe is closed,\n        // so developer doesn't need to do this manually\n        if (!skipPool) {\n          if (unbind) {\n            // Remove from the events pool\n            this._pool = this._pool.filter(poolItem => {\n              return poolItem.type !== eType || poolItem.listener !== listener || poolItem.target !== target;\n            });\n          } else {\n            // Add to the events pool\n            this._pool.push({\n              target,\n              type: eType,\n              listener,\n              passive\n            });\n          }\n        } // most PhotoSwipe events call preventDefault,\n        // and we do not need browser to scroll the page\n\n\n        const eventOptions = supportsPassive ? {\n          passive: passive || false\n        } : false;\n        target[methodName](eType, listener, eventOptions);\n      }\n    });\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/**\n * @param {PhotoSwipeOptions} options\n * @param {PhotoSwipeBase} pswp\n * @returns {Point}\n */\nfunction getViewportSize(options, pswp) {\n  if (options.getViewportSizeFn) {\n    const newViewportSize = options.getViewportSizeFn(options, pswp);\n\n    if (newViewportSize) {\n      return newViewportSize;\n    }\n  }\n\n  return {\n    x: document.documentElement.clientWidth,\n    // TODO: height on mobile is very incosistent due to toolbar\n    // find a way to improve this\n    //\n    // document.documentElement.clientHeight - doesn't seem to work well\n    y: window.innerHeight\n  };\n}\n/**\n * Parses padding option.\n * Supported formats:\n *\n * // Object\n * padding: {\n *  top: 0,\n *  bottom: 0,\n *  left: 0,\n *  right: 0\n * }\n *\n * // A function that returns the object\n * paddingFn: (viewportSize, itemData, index) => {\n *  return {\n *    top: 0,\n *    bottom: 0,\n *    left: 0,\n *    right: 0\n *  };\n * }\n *\n * // Legacy variant\n * paddingLeft: 0,\n * paddingRight: 0,\n * paddingTop: 0,\n * paddingBottom: 0,\n *\n * @param {'left' | 'top' | 'bottom' | 'right'} prop\n * @param {PhotoSwipeOptions} options PhotoSwipe options\n * @param {Point} viewportSize PhotoSwipe viewport size, for example: { x:800, y:600 }\n * @param {SlideData} itemData Data about the slide\n * @param {number} index Slide index\n * @returns {number}\n */\n\nfunction parsePaddingOption(prop, options, viewportSize, itemData, index) {\n  let paddingValue = 0;\n\n  if (options.paddingFn) {\n    paddingValue = options.paddingFn(viewportSize, itemData, index)[prop];\n  } else if (options.padding) {\n    paddingValue = options.padding[prop];\n  } else {\n    const legacyPropName = 'padding' + prop[0].toUpperCase() + prop.slice(1); // @ts-expect-error\n\n    if (options[legacyPropName]) {\n      // @ts-expect-error\n      paddingValue = options[legacyPropName];\n    }\n  }\n\n  return Number(paddingValue) || 0;\n}\n/**\n * @param {PhotoSwipeOptions} options\n * @param {Point} viewportSize\n * @param {SlideData} itemData\n * @param {number} index\n * @returns {Point}\n */\n\nfunction getPanAreaSize(options, viewportSize, itemData, index) {\n  return {\n    x: viewportSize.x - parsePaddingOption('left', options, viewportSize, itemData, index) - parsePaddingOption('right', options, viewportSize, itemData, index),\n    y: viewportSize.y - parsePaddingOption('top', options, viewportSize, itemData, index) - parsePaddingOption('bottom', options, viewportSize, itemData, index)\n  };\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {Record<Axis, number>} Point */\n\n/** @typedef {'x' | 'y'} Axis */\n\n/**\n * Calculates minimum, maximum and initial (center) bounds of a slide\n */\n\nclass PanBounds {\n  /**\n   * @param {Slide} slide\n   */\n  constructor(slide) {\n    this.slide = slide;\n    this.currZoomLevel = 1;\n    this.center =\n    /** @type {Point} */\n    {\n      x: 0,\n      y: 0\n    };\n    this.max =\n    /** @type {Point} */\n    {\n      x: 0,\n      y: 0\n    };\n    this.min =\n    /** @type {Point} */\n    {\n      x: 0,\n      y: 0\n    };\n  }\n  /**\n   * _getItemBounds\n   *\n   * @param {number} currZoomLevel\n   */\n\n\n  update(currZoomLevel) {\n    this.currZoomLevel = currZoomLevel;\n\n    if (!this.slide.width) {\n      this.reset();\n    } else {\n      this._updateAxis('x');\n\n      this._updateAxis('y');\n\n      this.slide.pswp.dispatch('calcBounds', {\n        slide: this.slide\n      });\n    }\n  }\n  /**\n   * _calculateItemBoundsForAxis\n   *\n   * @param {Axis} axis\n   */\n\n\n  _updateAxis(axis) {\n    const {\n      pswp\n    } = this.slide;\n    const elSize = this.slide[axis === 'x' ? 'width' : 'height'] * this.currZoomLevel;\n    const paddingProp = axis === 'x' ? 'left' : 'top';\n    const padding = parsePaddingOption(paddingProp, pswp.options, pswp.viewportSize, this.slide.data, this.slide.index);\n    const panAreaSize = this.slide.panAreaSize[axis]; // Default position of element.\n    // By default, it is center of viewport:\n\n    this.center[axis] = Math.round((panAreaSize - elSize) / 2) + padding; // maximum pan position\n\n    this.max[axis] = elSize > panAreaSize ? Math.round(panAreaSize - elSize) + padding : this.center[axis]; // minimum pan position\n\n    this.min[axis] = elSize > panAreaSize ? padding : this.center[axis];\n  } // _getZeroBounds\n\n\n  reset() {\n    this.center.x = 0;\n    this.center.y = 0;\n    this.max.x = 0;\n    this.max.y = 0;\n    this.min.x = 0;\n    this.min.y = 0;\n  }\n  /**\n   * Correct pan position if it's beyond the bounds\n   *\n   * @param {Axis} axis x or y\n   * @param {number} panOffset\n   * @returns {number}\n   */\n\n\n  correctPan(axis, panOffset) {\n    // checkPanBounds\n    return clamp(panOffset, this.max[axis], this.min[axis]);\n  }\n\n}\n\nconst MAX_IMAGE_WIDTH = 4000;\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {'fit' | 'fill' | number | ((zoomLevelObject: ZoomLevel) => number)} ZoomLevelOption */\n\n/**\n * Calculates zoom levels for specific slide.\n * Depends on viewport size and image size.\n */\n\nclass ZoomLevel {\n  /**\n   * @param {PhotoSwipeOptions} options PhotoSwipe options\n   * @param {SlideData} itemData Slide data\n   * @param {number} index Slide index\n   * @param {PhotoSwipe} [pswp] PhotoSwipe instance, can be undefined if not initialized yet\n   */\n  constructor(options, itemData, index, pswp) {\n    this.pswp = pswp;\n    this.options = options;\n    this.itemData = itemData;\n    this.index = index;\n    /** @type { Point | null } */\n\n    this.panAreaSize = null;\n    /** @type { Point | null } */\n\n    this.elementSize = null;\n    this.fit = 1;\n    this.fill = 1;\n    this.vFill = 1;\n    this.initial = 1;\n    this.secondary = 1;\n    this.max = 1;\n    this.min = 1;\n  }\n  /**\n   * Calculate initial, secondary and maximum zoom level for the specified slide.\n   *\n   * It should be called when either image or viewport size changes.\n   *\n   * @param {number} maxWidth\n   * @param {number} maxHeight\n   * @param {Point} panAreaSize\n   */\n\n\n  update(maxWidth, maxHeight, panAreaSize) {\n    /** @type {Point} */\n    const elementSize = {\n      x: maxWidth,\n      y: maxHeight\n    };\n    this.elementSize = elementSize;\n    this.panAreaSize = panAreaSize;\n    const hRatio = panAreaSize.x / elementSize.x;\n    const vRatio = panAreaSize.y / elementSize.y;\n    this.fit = Math.min(1, hRatio < vRatio ? hRatio : vRatio);\n    this.fill = Math.min(1, hRatio > vRatio ? hRatio : vRatio); // zoom.vFill defines zoom level of the image\n    // when it has 100% of viewport vertical space (height)\n\n    this.vFill = Math.min(1, vRatio);\n    this.initial = this._getInitial();\n    this.secondary = this._getSecondary();\n    this.max = Math.max(this.initial, this.secondary, this._getMax());\n    this.min = Math.min(this.fit, this.initial, this.secondary);\n\n    if (this.pswp) {\n      this.pswp.dispatch('zoomLevelsUpdate', {\n        zoomLevels: this,\n        slideData: this.itemData\n      });\n    }\n  }\n  /**\n   * Parses user-defined zoom option.\n   *\n   * @private\n   * @param {'initial' | 'secondary' | 'max'} optionPrefix Zoom level option prefix (initial, secondary, max)\n   * @returns { number | undefined }\n   */\n\n\n  _parseZoomLevelOption(optionPrefix) {\n    const optionName =\n    /** @type {'initialZoomLevel' | 'secondaryZoomLevel' | 'maxZoomLevel'} */\n    optionPrefix + 'ZoomLevel';\n    const optionValue = this.options[optionName];\n\n    if (!optionValue) {\n      return;\n    }\n\n    if (typeof optionValue === 'function') {\n      return optionValue(this);\n    }\n\n    if (optionValue === 'fill') {\n      return this.fill;\n    }\n\n    if (optionValue === 'fit') {\n      return this.fit;\n    }\n\n    return Number(optionValue);\n  }\n  /**\n   * Get zoom level to which image will be zoomed after double-tap gesture,\n   * or when user clicks on zoom icon,\n   * or mouse-click on image itself.\n   * If you return 1 image will be zoomed to its original size.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getSecondary() {\n    let currZoomLevel = this._parseZoomLevelOption('secondary');\n\n    if (currZoomLevel) {\n      return currZoomLevel;\n    } // 3x of \"fit\" state, but not larger than original\n\n\n    currZoomLevel = Math.min(1, this.fit * 3);\n\n    if (this.elementSize && currZoomLevel * this.elementSize.x > MAX_IMAGE_WIDTH) {\n      currZoomLevel = MAX_IMAGE_WIDTH / this.elementSize.x;\n    }\n\n    return currZoomLevel;\n  }\n  /**\n   * Get initial image zoom level.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getInitial() {\n    return this._parseZoomLevelOption('initial') || this.fit;\n  }\n  /**\n   * Maximum zoom level when user zooms\n   * via zoom/pinch gesture,\n   * via cmd/ctrl-wheel or via trackpad.\n   *\n   * @private\n   * @return {number}\n   */\n\n\n  _getMax() {\n    // max zoom level is x4 from \"fit state\",\n    // used for zoom gesture and ctrl/trackpad zoom\n    return this._parseZoomLevelOption('max') || Math.max(1, this.fit * 4);\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n/**\n * Renders and allows to control a single slide\n */\n\nclass Slide {\n  /**\n   * @param {SlideData} data\n   * @param {number} index\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(data, index, pswp) {\n    this.data = data;\n    this.index = index;\n    this.pswp = pswp;\n    this.isActive = index === pswp.currIndex;\n    this.currentResolution = 0;\n    /** @type {Point} */\n\n    this.panAreaSize = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point} */\n\n    this.pan = {\n      x: 0,\n      y: 0\n    };\n    this.isFirstSlide = this.isActive && !pswp.opener.isOpen;\n    this.zoomLevels = new ZoomLevel(pswp.options, data, index, pswp);\n    this.pswp.dispatch('gettingData', {\n      slide: this,\n      data: this.data,\n      index\n    });\n    this.content = this.pswp.contentLoader.getContentBySlide(this);\n    this.container = createElement('pswp__zoom-wrap', 'div');\n    /** @type {HTMLElement | null} */\n\n    this.holderElement = null;\n    this.currZoomLevel = 1;\n    /** @type {number} */\n\n    this.width = this.content.width;\n    /** @type {number} */\n\n    this.height = this.content.height;\n    this.heavyAppended = false;\n    this.bounds = new PanBounds(this);\n    this.prevDisplayedWidth = -1;\n    this.prevDisplayedHeight = -1;\n    this.pswp.dispatch('slideInit', {\n      slide: this\n    });\n  }\n  /**\n   * If this slide is active/current/visible\n   *\n   * @param {boolean} isActive\n   */\n\n\n  setIsActive(isActive) {\n    if (isActive && !this.isActive) {\n      // slide just became active\n      this.activate();\n    } else if (!isActive && this.isActive) {\n      // slide just became non-active\n      this.deactivate();\n    }\n  }\n  /**\n   * Appends slide content to DOM\n   *\n   * @param {HTMLElement} holderElement\n   */\n\n\n  append(holderElement) {\n    this.holderElement = holderElement;\n    this.container.style.transformOrigin = '0 0'; // Slide appended to DOM\n\n    if (!this.data) {\n      return;\n    }\n\n    this.calculateSize();\n    this.load();\n    this.updateContentSize();\n    this.appendHeavy();\n    this.holderElement.appendChild(this.container);\n    this.zoomAndPanToInitial();\n    this.pswp.dispatch('firstZoomPan', {\n      slide: this\n    });\n    this.applyCurrentZoomPan();\n    this.pswp.dispatch('afterSetContent', {\n      slide: this\n    });\n\n    if (this.isActive) {\n      this.activate();\n    }\n  }\n\n  load() {\n    this.content.load(false);\n    this.pswp.dispatch('slideLoad', {\n      slide: this\n    });\n  }\n  /**\n   * Append \"heavy\" DOM elements\n   *\n   * This may depend on a type of slide,\n   * but generally these are large images.\n   */\n\n\n  appendHeavy() {\n    const {\n      pswp\n    } = this;\n    const appendHeavyNearby = true; // todo\n    // Avoid appending heavy elements during animations\n\n    if (this.heavyAppended || !pswp.opener.isOpen || pswp.mainScroll.isShifted() || !this.isActive && !appendHeavyNearby) {\n      return;\n    }\n\n    if (this.pswp.dispatch('appendHeavy', {\n      slide: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.heavyAppended = true;\n    this.content.append();\n    this.pswp.dispatch('appendHeavyContent', {\n      slide: this\n    });\n  }\n  /**\n   * Triggered when this slide is active (selected).\n   *\n   * If it's part of opening/closing transition -\n   * activate() will trigger after the transition is ended.\n   */\n\n\n  activate() {\n    this.isActive = true;\n    this.appendHeavy();\n    this.content.activate();\n    this.pswp.dispatch('slideActivate', {\n      slide: this\n    });\n  }\n  /**\n   * Triggered when this slide becomes inactive.\n   *\n   * Slide can become inactive only after it was active.\n   */\n\n\n  deactivate() {\n    this.isActive = false;\n    this.content.deactivate();\n\n    if (this.currZoomLevel !== this.zoomLevels.initial) {\n      // allow filtering\n      this.calculateSize();\n    } // reset zoom level\n\n\n    this.currentResolution = 0;\n    this.zoomAndPanToInitial();\n    this.applyCurrentZoomPan();\n    this.updateContentSize();\n    this.pswp.dispatch('slideDeactivate', {\n      slide: this\n    });\n  }\n  /**\n   * The slide should destroy itself, it will never be used again.\n   * (unbind all events and destroy internal components)\n   */\n\n\n  destroy() {\n    this.content.hasSlide = false;\n    this.content.remove();\n    this.container.remove();\n    this.pswp.dispatch('slideDestroy', {\n      slide: this\n    });\n  }\n\n  resize() {\n    if (this.currZoomLevel === this.zoomLevels.initial || !this.isActive) {\n      // Keep initial zoom level if it was before the resize,\n      // as well as when this slide is not active\n      // Reset position and scale to original state\n      this.calculateSize();\n      this.currentResolution = 0;\n      this.zoomAndPanToInitial();\n      this.applyCurrentZoomPan();\n      this.updateContentSize();\n    } else {\n      // readjust pan position if it's beyond the bounds\n      this.calculateSize();\n      this.bounds.update(this.currZoomLevel);\n      this.panTo(this.pan.x, this.pan.y);\n    }\n  }\n  /**\n   * Apply size to current slide content,\n   * based on the current resolution and scale.\n   *\n   * @param {boolean} [force] if size should be updated even if dimensions weren't changed\n   */\n\n\n  updateContentSize(force) {\n    // Use initial zoom level\n    // if resolution is not defined (user didn't zoom yet)\n    const scaleMultiplier = this.currentResolution || this.zoomLevels.initial;\n\n    if (!scaleMultiplier) {\n      return;\n    }\n\n    const width = Math.round(this.width * scaleMultiplier) || this.pswp.viewportSize.x;\n    const height = Math.round(this.height * scaleMultiplier) || this.pswp.viewportSize.y;\n\n    if (!this.sizeChanged(width, height) && !force) {\n      return;\n    }\n\n    this.content.setDisplayedSize(width, height);\n  }\n  /**\n   * @param {number} width\n   * @param {number} height\n   */\n\n\n  sizeChanged(width, height) {\n    if (width !== this.prevDisplayedWidth || height !== this.prevDisplayedHeight) {\n      this.prevDisplayedWidth = width;\n      this.prevDisplayedHeight = height;\n      return true;\n    }\n\n    return false;\n  }\n  /** @returns {HTMLImageElement | HTMLDivElement | null | undefined} */\n\n\n  getPlaceholderElement() {\n    var _this$content$placeho;\n\n    return (_this$content$placeho = this.content.placeholder) === null || _this$content$placeho === void 0 ? void 0 : _this$content$placeho.element;\n  }\n  /**\n   * Zoom current slide image to...\n   *\n   * @param {number} destZoomLevel Destination zoom level.\n   * @param {Point} [centerPoint]\n   * Transform origin center point, or false if viewport center should be used.\n   * @param {number | false} [transitionDuration] Transition duration, may be set to 0.\n   * @param {boolean} [ignoreBounds] Minimum and maximum zoom levels will be ignored.\n   */\n\n\n  zoomTo(destZoomLevel, centerPoint, transitionDuration, ignoreBounds) {\n    const {\n      pswp\n    } = this;\n\n    if (!this.isZoomable() || pswp.mainScroll.isShifted()) {\n      return;\n    }\n\n    pswp.dispatch('beforeZoomTo', {\n      destZoomLevel,\n      centerPoint,\n      transitionDuration\n    }); // stop all pan and zoom transitions\n\n    pswp.animations.stopAllPan(); // if (!centerPoint) {\n    //   centerPoint = pswp.getViewportCenterPoint();\n    // }\n\n    const prevZoomLevel = this.currZoomLevel;\n\n    if (!ignoreBounds) {\n      destZoomLevel = clamp(destZoomLevel, this.zoomLevels.min, this.zoomLevels.max);\n    } // if (transitionDuration === undefined) {\n    //   transitionDuration = this.pswp.options.zoomAnimationDuration;\n    // }\n\n\n    this.setZoomLevel(destZoomLevel);\n    this.pan.x = this.calculateZoomToPanOffset('x', centerPoint, prevZoomLevel);\n    this.pan.y = this.calculateZoomToPanOffset('y', centerPoint, prevZoomLevel);\n    roundPoint(this.pan);\n\n    const finishTransition = () => {\n      this._setResolution(destZoomLevel);\n\n      this.applyCurrentZoomPan();\n    };\n\n    if (!transitionDuration) {\n      finishTransition();\n    } else {\n      pswp.animations.startTransition({\n        isPan: true,\n        name: 'zoomTo',\n        target: this.container,\n        transform: this.getCurrentTransform(),\n        onComplete: finishTransition,\n        duration: transitionDuration,\n        easing: pswp.options.easing\n      });\n    }\n  }\n  /**\n   * @param {Point} [centerPoint]\n   */\n\n\n  toggleZoom(centerPoint) {\n    this.zoomTo(this.currZoomLevel === this.zoomLevels.initial ? this.zoomLevels.secondary : this.zoomLevels.initial, centerPoint, this.pswp.options.zoomAnimationDuration);\n  }\n  /**\n   * Updates zoom level property and recalculates new pan bounds,\n   * unlike zoomTo it does not apply transform (use applyCurrentZoomPan)\n   *\n   * @param {number} currZoomLevel\n   */\n\n\n  setZoomLevel(currZoomLevel) {\n    this.currZoomLevel = currZoomLevel;\n    this.bounds.update(this.currZoomLevel);\n  }\n  /**\n   * Get pan position after zoom at a given `point`.\n   *\n   * Always call setZoomLevel(newZoomLevel) beforehand to recalculate\n   * pan bounds according to the new zoom level.\n   *\n   * @param {'x' | 'y'} axis\n   * @param {Point} [point]\n   * point based on which zoom is performed, usually refers to the current mouse position,\n   * if false - viewport center will be used.\n   * @param {number} [prevZoomLevel] Zoom level before new zoom was applied.\n   * @returns {number}\n   */\n\n\n  calculateZoomToPanOffset(axis, point, prevZoomLevel) {\n    const totalPanDistance = this.bounds.max[axis] - this.bounds.min[axis];\n\n    if (totalPanDistance === 0) {\n      return this.bounds.center[axis];\n    }\n\n    if (!point) {\n      point = this.pswp.getViewportCenterPoint();\n    }\n\n    if (!prevZoomLevel) {\n      prevZoomLevel = this.zoomLevels.initial;\n    }\n\n    const zoomFactor = this.currZoomLevel / prevZoomLevel;\n    return this.bounds.correctPan(axis, (this.pan[axis] - point[axis]) * zoomFactor + point[axis]);\n  }\n  /**\n   * Apply pan and keep it within bounds.\n   *\n   * @param {number} panX\n   * @param {number} panY\n   */\n\n\n  panTo(panX, panY) {\n    this.pan.x = this.bounds.correctPan('x', panX);\n    this.pan.y = this.bounds.correctPan('y', panY);\n    this.applyCurrentZoomPan();\n  }\n  /**\n   * If the slide in the current state can be panned by the user\n   * @returns {boolean}\n   */\n\n\n  isPannable() {\n    return Boolean(this.width) && this.currZoomLevel > this.zoomLevels.fit;\n  }\n  /**\n   * If the slide can be zoomed\n   * @returns {boolean}\n   */\n\n\n  isZoomable() {\n    return Boolean(this.width) && this.content.isZoomable();\n  }\n  /**\n   * Apply transform and scale based on\n   * the current pan position (this.pan) and zoom level (this.currZoomLevel)\n   */\n\n\n  applyCurrentZoomPan() {\n    this._applyZoomTransform(this.pan.x, this.pan.y, this.currZoomLevel);\n\n    if (this === this.pswp.currSlide) {\n      this.pswp.dispatch('zoomPanUpdate', {\n        slide: this\n      });\n    }\n  }\n\n  zoomAndPanToInitial() {\n    this.currZoomLevel = this.zoomLevels.initial; // pan according to the zoom level\n\n    this.bounds.update(this.currZoomLevel);\n    equalizePoints(this.pan, this.bounds.center);\n    this.pswp.dispatch('initialZoomPan', {\n      slide: this\n    });\n  }\n  /**\n   * Set translate and scale based on current resolution\n   *\n   * @param {number} x\n   * @param {number} y\n   * @param {number} zoom\n   * @private\n   */\n\n\n  _applyZoomTransform(x, y, zoom) {\n    zoom /= this.currentResolution || this.zoomLevels.initial;\n    setTransform(this.container, x, y, zoom);\n  }\n\n  calculateSize() {\n    const {\n      pswp\n    } = this;\n    equalizePoints(this.panAreaSize, getPanAreaSize(pswp.options, pswp.viewportSize, this.data, this.index));\n    this.zoomLevels.update(this.width, this.height, this.panAreaSize);\n    pswp.dispatch('calcSlideSize', {\n      slide: this\n    });\n  }\n  /** @returns {string} */\n\n\n  getCurrentTransform() {\n    const scale = this.currZoomLevel / (this.currentResolution || this.zoomLevels.initial);\n    return toTransformString(this.pan.x, this.pan.y, scale);\n  }\n  /**\n   * Set resolution and re-render the image.\n   *\n   * For example, if the real image size is 2000x1500,\n   * and resolution is 0.5 - it will be rendered as 1000x750.\n   *\n   * Image with zoom level 2 and resolution 0.5 is\n   * the same as image with zoom level 1 and resolution 1.\n   *\n   * Used to optimize animations and make\n   * sure that browser renders image in the highest quality.\n   * Also used by responsive images to load the correct one.\n   *\n   * @param {number} newResolution\n   */\n\n\n  _setResolution(newResolution) {\n    if (newResolution === this.currentResolution) {\n      return;\n    }\n\n    this.currentResolution = newResolution;\n    this.updateContentSize();\n    this.pswp.dispatch('resolutionChanged');\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst PAN_END_FRICTION = 0.35;\nconst VERTICAL_DRAG_FRICTION = 0.6; // 1 corresponds to the third of viewport height\n\nconst MIN_RATIO_TO_CLOSE = 0.4; // Minimum speed required to navigate\n// to next or previous slide\n\nconst MIN_NEXT_SLIDE_SPEED = 0.5;\n/**\n * @param {number} initialVelocity\n * @param {number} decelerationRate\n * @returns {number}\n */\n\nfunction project(initialVelocity, decelerationRate) {\n  return initialVelocity * decelerationRate / (1 - decelerationRate);\n}\n/**\n * Handles single pointer dragging\n */\n\n\nclass DragHandler {\n  /**\n   * @param {Gestures} gestures\n   */\n  constructor(gestures) {\n    this.gestures = gestures;\n    this.pswp = gestures.pswp;\n    /** @type {Point} */\n\n    this.startPan = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  start() {\n    if (this.pswp.currSlide) {\n      equalizePoints(this.startPan, this.pswp.currSlide.pan);\n    }\n\n    this.pswp.animations.stopAll();\n  }\n\n  change() {\n    const {\n      p1,\n      prevP1,\n      dragAxis\n    } = this.gestures;\n    const {\n      currSlide\n    } = this.pswp;\n\n    if (dragAxis === 'y' && this.pswp.options.closeOnVerticalDrag && currSlide && currSlide.currZoomLevel <= currSlide.zoomLevels.fit && !this.gestures.isMultitouch) {\n      // Handle vertical drag to close\n      const panY = currSlide.pan.y + (p1.y - prevP1.y);\n\n      if (!this.pswp.dispatch('verticalDrag', {\n        panY\n      }).defaultPrevented) {\n        this._setPanWithFriction('y', panY, VERTICAL_DRAG_FRICTION);\n\n        const bgOpacity = 1 - Math.abs(this._getVerticalDragRatio(currSlide.pan.y));\n        this.pswp.applyBgOpacity(bgOpacity);\n        currSlide.applyCurrentZoomPan();\n      }\n    } else {\n      const mainScrollChanged = this._panOrMoveMainScroll('x');\n\n      if (!mainScrollChanged) {\n        this._panOrMoveMainScroll('y');\n\n        if (currSlide) {\n          roundPoint(currSlide.pan);\n          currSlide.applyCurrentZoomPan();\n        }\n      }\n    }\n  }\n\n  end() {\n    const {\n      velocity\n    } = this.gestures;\n    const {\n      mainScroll,\n      currSlide\n    } = this.pswp;\n    let indexDiff = 0;\n    this.pswp.animations.stopAll(); // Handle main scroll if it's shifted\n\n    if (mainScroll.isShifted()) {\n      // Position of the main scroll relative to the viewport\n      const mainScrollShiftDiff = mainScroll.x - mainScroll.getCurrSlideX(); // Ratio between 0 and 1:\n      // 0 - slide is not visible at all,\n      // 0.5 - half of the slide is visible\n      // 1 - slide is fully visible\n\n      const currentSlideVisibilityRatio = mainScrollShiftDiff / this.pswp.viewportSize.x; // Go next slide.\n      //\n      // - if velocity and its direction is matched,\n      //   and we see at least tiny part of the next slide\n      //\n      // - or if we see less than 50% of the current slide\n      //   and velocity is close to 0\n      //\n\n      if (velocity.x < -MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio < 0 || velocity.x < 0.1 && currentSlideVisibilityRatio < -0.5) {\n        // Go to next slide\n        indexDiff = 1;\n        velocity.x = Math.min(velocity.x, 0);\n      } else if (velocity.x > MIN_NEXT_SLIDE_SPEED && currentSlideVisibilityRatio > 0 || velocity.x > -0.1 && currentSlideVisibilityRatio > 0.5) {\n        // Go to prev slide\n        indexDiff = -1;\n        velocity.x = Math.max(velocity.x, 0);\n      }\n\n      mainScroll.moveIndexBy(indexDiff, true, velocity.x);\n    } // Restore zoom level\n\n\n    if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.max || this.gestures.isMultitouch) {\n      this.gestures.zoomLevels.correctZoomPan(true);\n    } else {\n      // we run two animations instead of one,\n      // as each axis has own pan boundaries and thus different spring function\n      // (correctZoomPan does not have this functionality,\n      //  it animates all properties with single timing function)\n      this._finishPanGestureForAxis('x');\n\n      this._finishPanGestureForAxis('y');\n    }\n  }\n  /**\n   * @private\n   * @param {'x' | 'y'} axis\n   */\n\n\n  _finishPanGestureForAxis(axis) {\n    const {\n      velocity\n    } = this.gestures;\n    const {\n      currSlide\n    } = this.pswp;\n\n    if (!currSlide) {\n      return;\n    }\n\n    const {\n      pan,\n      bounds\n    } = currSlide;\n    const panPos = pan[axis];\n    const restoreBgOpacity = this.pswp.bgOpacity < 1 && axis === 'y'; // 0.995 means - scroll view loses 0.5% of its velocity per millisecond\n    // Increasing this number will reduce travel distance\n\n    const decelerationRate = 0.995; // 0.99\n    // Pan position if there is no bounds\n\n    const projectedPosition = panPos + project(velocity[axis], decelerationRate);\n\n    if (restoreBgOpacity) {\n      const vDragRatio = this._getVerticalDragRatio(panPos);\n\n      const projectedVDragRatio = this._getVerticalDragRatio(projectedPosition); // If we are above and moving upwards,\n      // or if we are below and moving downwards\n\n\n      if (vDragRatio < 0 && projectedVDragRatio < -MIN_RATIO_TO_CLOSE || vDragRatio > 0 && projectedVDragRatio > MIN_RATIO_TO_CLOSE) {\n        this.pswp.close();\n        return;\n      }\n    } // Pan position with corrected bounds\n\n\n    const correctedPanPosition = bounds.correctPan(axis, projectedPosition); // Exit if pan position should not be changed\n    // or if speed it too low\n\n    if (panPos === correctedPanPosition) {\n      return;\n    } // Overshoot if the final position is out of pan bounds\n\n\n    const dampingRatio = correctedPanPosition === projectedPosition ? 1 : 0.82;\n    const initialBgOpacity = this.pswp.bgOpacity;\n    const totalPanDist = correctedPanPosition - panPos;\n    this.pswp.animations.startSpring({\n      name: 'panGesture' + axis,\n      isPan: true,\n      start: panPos,\n      end: correctedPanPosition,\n      velocity: velocity[axis],\n      dampingRatio,\n      onUpdate: pos => {\n        // Animate opacity of background relative to Y pan position of an image\n        if (restoreBgOpacity && this.pswp.bgOpacity < 1) {\n          // 0 - start of animation, 1 - end of animation\n          const animationProgressRatio = 1 - (correctedPanPosition - pos) / totalPanDist; // We clamp opacity to keep it between 0 and 1.\n          // As progress ratio can be larger than 1 due to overshoot,\n          // and we do not want to bounce opacity.\n\n          this.pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * animationProgressRatio, 0, 1));\n        }\n\n        pan[axis] = Math.floor(pos);\n        currSlide.applyCurrentZoomPan();\n      }\n    });\n  }\n  /**\n   * Update position of the main scroll,\n   * or/and update pan position of the current slide.\n   *\n   * Should return true if it changes (or can change) main scroll.\n   *\n   * @private\n   * @param {'x' | 'y'} axis\n   * @returns {boolean}\n   */\n\n\n  _panOrMoveMainScroll(axis) {\n    const {\n      p1,\n      dragAxis,\n      prevP1,\n      isMultitouch\n    } = this.gestures;\n    const {\n      currSlide,\n      mainScroll\n    } = this.pswp;\n    const delta = p1[axis] - prevP1[axis];\n    const newMainScrollX = mainScroll.x + delta;\n\n    if (!delta || !currSlide) {\n      return false;\n    } // Always move main scroll if image can not be panned\n\n\n    if (axis === 'x' && !currSlide.isPannable() && !isMultitouch) {\n      mainScroll.moveTo(newMainScrollX, true);\n      return true; // changed main scroll\n    }\n\n    const {\n      bounds\n    } = currSlide;\n    const newPan = currSlide.pan[axis] + delta;\n\n    if (this.pswp.options.allowPanToNext && dragAxis === 'x' && axis === 'x' && !isMultitouch) {\n      const currSlideMainScrollX = mainScroll.getCurrSlideX(); // Position of the main scroll relative to the viewport\n\n      const mainScrollShiftDiff = mainScroll.x - currSlideMainScrollX;\n      const isLeftToRight = delta > 0;\n      const isRightToLeft = !isLeftToRight;\n\n      if (newPan > bounds.min[axis] && isLeftToRight) {\n        // Panning from left to right, beyond the left edge\n        // Wether the image was at minimum pan position (or less)\n        // when this drag gesture started.\n        // Minimum pan position refers to the left edge of the image.\n        const wasAtMinPanPosition = bounds.min[axis] <= this.startPan[axis];\n\n        if (wasAtMinPanPosition) {\n          mainScroll.moveTo(newMainScrollX, true);\n          return true;\n        } else {\n          this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n        }\n      } else if (newPan < bounds.max[axis] && isRightToLeft) {\n        // Paning from right to left, beyond the right edge\n        // Maximum pan position refers to the right edge of the image.\n        const wasAtMaxPanPosition = this.startPan[axis] <= bounds.max[axis];\n\n        if (wasAtMaxPanPosition) {\n          mainScroll.moveTo(newMainScrollX, true);\n          return true;\n        } else {\n          this._setPanWithFriction(axis, newPan); //currSlide.pan[axis] = newPan;\n\n        }\n      } else {\n        // If main scroll is shifted\n        if (mainScrollShiftDiff !== 0) {\n          // If main scroll is shifted right\n          if (mainScrollShiftDiff > 0\n          /*&& isRightToLeft*/\n          ) {\n            mainScroll.moveTo(Math.max(newMainScrollX, currSlideMainScrollX), true);\n            return true;\n          } else if (mainScrollShiftDiff < 0\n          /*&& isLeftToRight*/\n          ) {\n            // Main scroll is shifted left (Position is less than 0 comparing to the viewport 0)\n            mainScroll.moveTo(Math.min(newMainScrollX, currSlideMainScrollX), true);\n            return true;\n          }\n        } else {\n          // We are within pan bounds, so just pan\n          this._setPanWithFriction(axis, newPan);\n        }\n      }\n    } else {\n      if (axis === 'y') {\n        // Do not pan vertically if main scroll is shifted o\n        if (!mainScroll.isShifted() && bounds.min.y !== bounds.max.y) {\n          this._setPanWithFriction(axis, newPan);\n        }\n      } else {\n        this._setPanWithFriction(axis, newPan);\n      }\n    }\n\n    return false;\n  } // If we move above - the ratio is negative\n  // If we move below the ratio is positive\n\n  /**\n   * Relation between pan Y position and third of viewport height.\n   *\n   * When we are at initial position (center bounds) - the ratio is 0,\n   * if position is shifted upwards - the ratio is negative,\n   * if position is shifted downwards - the ratio is positive.\n   *\n   * @private\n   * @param {number} panY The current pan Y position.\n   * @returns {number}\n   */\n\n\n  _getVerticalDragRatio(panY) {\n    var _this$pswp$currSlide$, _this$pswp$currSlide;\n\n    return (panY - ((_this$pswp$currSlide$ = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.bounds.center.y) !== null && _this$pswp$currSlide$ !== void 0 ? _this$pswp$currSlide$ : 0)) / (this.pswp.viewportSize.y / 3);\n  }\n  /**\n   * Set pan position of the current slide.\n   * Apply friction if the position is beyond the pan bounds,\n   * or if custom friction is defined.\n   *\n   * @private\n   * @param {'x' | 'y'} axis\n   * @param {number} potentialPan\n   * @param {number} [customFriction] (0.1 - 1)\n   */\n\n\n  _setPanWithFriction(axis, potentialPan, customFriction) {\n    const {\n      currSlide\n    } = this.pswp;\n\n    if (!currSlide) {\n      return;\n    }\n\n    const {\n      pan,\n      bounds\n    } = currSlide;\n    const correctedPan = bounds.correctPan(axis, potentialPan); // If we are out of pan bounds\n\n    if (correctedPan !== potentialPan || customFriction) {\n      const delta = Math.round(potentialPan - pan[axis]);\n      pan[axis] += delta * (customFriction || PAN_END_FRICTION);\n    } else {\n      pan[axis] = potentialPan;\n    }\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\nconst UPPER_ZOOM_FRICTION = 0.05;\nconst LOWER_ZOOM_FRICTION = 0.15;\n/**\n * Get center point between two points\n *\n * @param {Point} p\n * @param {Point} p1\n * @param {Point} p2\n * @returns {Point}\n */\n\nfunction getZoomPointsCenter(p, p1, p2) {\n  p.x = (p1.x + p2.x) / 2;\n  p.y = (p1.y + p2.y) / 2;\n  return p;\n}\n\nclass ZoomHandler {\n  /**\n   * @param {Gestures} gestures\n   */\n  constructor(gestures) {\n    this.gestures = gestures;\n    /**\n     * @private\n     * @type {Point}\n     */\n\n    this._startPan = {\n      x: 0,\n      y: 0\n    };\n    /**\n     * @private\n     * @type {Point}\n     */\n\n    this._startZoomPoint = {\n      x: 0,\n      y: 0\n    };\n    /**\n     * @private\n     * @type {Point}\n     */\n\n    this._zoomPoint = {\n      x: 0,\n      y: 0\n    };\n    /** @private */\n\n    this._wasOverFitZoomLevel = false;\n    /** @private */\n\n    this._startZoomLevel = 1;\n  }\n\n  start() {\n    const {\n      currSlide\n    } = this.gestures.pswp;\n\n    if (currSlide) {\n      this._startZoomLevel = currSlide.currZoomLevel;\n      equalizePoints(this._startPan, currSlide.pan);\n    }\n\n    this.gestures.pswp.animations.stopAllPan();\n    this._wasOverFitZoomLevel = false;\n  }\n\n  change() {\n    const {\n      p1,\n      startP1,\n      p2,\n      startP2,\n      pswp\n    } = this.gestures;\n    const {\n      currSlide\n    } = pswp;\n\n    if (!currSlide) {\n      return;\n    }\n\n    const minZoomLevel = currSlide.zoomLevels.min;\n    const maxZoomLevel = currSlide.zoomLevels.max;\n\n    if (!currSlide.isZoomable() || pswp.mainScroll.isShifted()) {\n      return;\n    }\n\n    getZoomPointsCenter(this._startZoomPoint, startP1, startP2);\n    getZoomPointsCenter(this._zoomPoint, p1, p2);\n\n    let currZoomLevel = 1 / getDistanceBetween(startP1, startP2) * getDistanceBetween(p1, p2) * this._startZoomLevel; // slightly over the zoom.fit\n\n\n    if (currZoomLevel > currSlide.zoomLevels.initial + currSlide.zoomLevels.initial / 15) {\n      this._wasOverFitZoomLevel = true;\n    }\n\n    if (currZoomLevel < minZoomLevel) {\n      if (pswp.options.pinchToClose && !this._wasOverFitZoomLevel && this._startZoomLevel <= currSlide.zoomLevels.initial) {\n        // fade out background if zooming out\n        const bgOpacity = 1 - (minZoomLevel - currZoomLevel) / (minZoomLevel / 1.2);\n\n        if (!pswp.dispatch('pinchClose', {\n          bgOpacity\n        }).defaultPrevented) {\n          pswp.applyBgOpacity(bgOpacity);\n        }\n      } else {\n        // Apply the friction if zoom level is below the min\n        currZoomLevel = minZoomLevel - (minZoomLevel - currZoomLevel) * LOWER_ZOOM_FRICTION;\n      }\n    } else if (currZoomLevel > maxZoomLevel) {\n      // Apply the friction if zoom level is above the max\n      currZoomLevel = maxZoomLevel + (currZoomLevel - maxZoomLevel) * UPPER_ZOOM_FRICTION;\n    }\n\n    currSlide.pan.x = this._calculatePanForZoomLevel('x', currZoomLevel);\n    currSlide.pan.y = this._calculatePanForZoomLevel('y', currZoomLevel);\n    currSlide.setZoomLevel(currZoomLevel);\n    currSlide.applyCurrentZoomPan();\n  }\n\n  end() {\n    const {\n      pswp\n    } = this.gestures;\n    const {\n      currSlide\n    } = pswp;\n\n    if ((!currSlide || currSlide.currZoomLevel < currSlide.zoomLevels.initial) && !this._wasOverFitZoomLevel && pswp.options.pinchToClose) {\n      pswp.close();\n    } else {\n      this.correctZoomPan();\n    }\n  }\n  /**\n   * @private\n   * @param {'x' | 'y'} axis\n   * @param {number} currZoomLevel\n   * @returns {number}\n   */\n\n\n  _calculatePanForZoomLevel(axis, currZoomLevel) {\n    const zoomFactor = currZoomLevel / this._startZoomLevel;\n    return this._zoomPoint[axis] - (this._startZoomPoint[axis] - this._startPan[axis]) * zoomFactor;\n  }\n  /**\n   * Correct currZoomLevel and pan if they are\n   * beyond minimum or maximum values.\n   * With animation.\n   *\n   * @param {boolean} [ignoreGesture]\n   * Wether gesture coordinates should be ignored when calculating destination pan position.\n   */\n\n\n  correctZoomPan(ignoreGesture) {\n    const {\n      pswp\n    } = this.gestures;\n    const {\n      currSlide\n    } = pswp;\n\n    if (!(currSlide !== null && currSlide !== void 0 && currSlide.isZoomable())) {\n      return;\n    }\n\n    if (this._zoomPoint.x === 0) {\n      ignoreGesture = true;\n    }\n\n    const prevZoomLevel = currSlide.currZoomLevel;\n    /** @type {number} */\n\n    let destinationZoomLevel;\n    let currZoomLevelNeedsChange = true;\n\n    if (prevZoomLevel < currSlide.zoomLevels.initial) {\n      destinationZoomLevel = currSlide.zoomLevels.initial; // zoom to min\n    } else if (prevZoomLevel > currSlide.zoomLevels.max) {\n      destinationZoomLevel = currSlide.zoomLevels.max; // zoom to max\n    } else {\n      currZoomLevelNeedsChange = false;\n      destinationZoomLevel = prevZoomLevel;\n    }\n\n    const initialBgOpacity = pswp.bgOpacity;\n    const restoreBgOpacity = pswp.bgOpacity < 1;\n    const initialPan = equalizePoints({\n      x: 0,\n      y: 0\n    }, currSlide.pan);\n    let destinationPan = equalizePoints({\n      x: 0,\n      y: 0\n    }, initialPan);\n\n    if (ignoreGesture) {\n      this._zoomPoint.x = 0;\n      this._zoomPoint.y = 0;\n      this._startZoomPoint.x = 0;\n      this._startZoomPoint.y = 0;\n      this._startZoomLevel = prevZoomLevel;\n      equalizePoints(this._startPan, initialPan);\n    }\n\n    if (currZoomLevelNeedsChange) {\n      destinationPan = {\n        x: this._calculatePanForZoomLevel('x', destinationZoomLevel),\n        y: this._calculatePanForZoomLevel('y', destinationZoomLevel)\n      };\n    } // set zoom level, so pan bounds are updated according to it\n\n\n    currSlide.setZoomLevel(destinationZoomLevel);\n    destinationPan = {\n      x: currSlide.bounds.correctPan('x', destinationPan.x),\n      y: currSlide.bounds.correctPan('y', destinationPan.y)\n    }; // return zoom level and its bounds to initial\n\n    currSlide.setZoomLevel(prevZoomLevel);\n    const panNeedsChange = !pointsEqual(destinationPan, initialPan);\n\n    if (!panNeedsChange && !currZoomLevelNeedsChange && !restoreBgOpacity) {\n      // update resolution after gesture\n      currSlide._setResolution(destinationZoomLevel);\n\n      currSlide.applyCurrentZoomPan(); // nothing to animate\n\n      return;\n    }\n\n    pswp.animations.stopAllPan();\n    pswp.animations.startSpring({\n      isPan: true,\n      start: 0,\n      end: 1000,\n      velocity: 0,\n      dampingRatio: 1,\n      naturalFrequency: 40,\n      onUpdate: now => {\n        now /= 1000; // 0 - start, 1 - end\n\n        if (panNeedsChange || currZoomLevelNeedsChange) {\n          if (panNeedsChange) {\n            currSlide.pan.x = initialPan.x + (destinationPan.x - initialPan.x) * now;\n            currSlide.pan.y = initialPan.y + (destinationPan.y - initialPan.y) * now;\n          }\n\n          if (currZoomLevelNeedsChange) {\n            const newZoomLevel = prevZoomLevel + (destinationZoomLevel - prevZoomLevel) * now;\n            currSlide.setZoomLevel(newZoomLevel);\n          }\n\n          currSlide.applyCurrentZoomPan();\n        } // Restore background opacity\n\n\n        if (restoreBgOpacity && pswp.bgOpacity < 1) {\n          // We clamp opacity to keep it between 0 and 1.\n          // As progress ratio can be larger than 1 due to overshoot,\n          // and we do not want to bounce opacity.\n          pswp.applyBgOpacity(clamp(initialBgOpacity + (1 - initialBgOpacity) * now, 0, 1));\n        }\n      },\n      onComplete: () => {\n        // update resolution after transition ends\n        currSlide._setResolution(destinationZoomLevel);\n\n        currSlide.applyCurrentZoomPan();\n      }\n    });\n  }\n\n}\n\n/**\n * @template {string} T\n * @template {string} P\n * @typedef {import('../types.js').AddPostfix<T, P>} AddPostfix<T, P>\n */\n\n/** @typedef {import('./gestures.js').default} Gestures */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n\n/** @typedef {'imageClick' | 'bgClick' | 'tap' | 'doubleTap'} Actions */\n\n/**\n * Whether the tap was performed on the main slide\n * (rather than controls or caption).\n *\n * @param {PointerEvent} event\n * @returns {boolean}\n */\nfunction didTapOnMainContent(event) {\n  return !!\n  /** @type {HTMLElement} */\n  event.target.closest('.pswp__container');\n}\n/**\n * Tap, double-tap handler.\n */\n\n\nclass TapHandler {\n  /**\n   * @param {Gestures} gestures\n   */\n  constructor(gestures) {\n    this.gestures = gestures;\n  }\n  /**\n   * @param {Point} point\n   * @param {PointerEvent} originalEvent\n   */\n\n\n  click(point, originalEvent) {\n    const targetClassList =\n    /** @type {HTMLElement} */\n    originalEvent.target.classList;\n    const isImageClick = targetClassList.contains('pswp__img');\n    const isBackgroundClick = targetClassList.contains('pswp__item') || targetClassList.contains('pswp__zoom-wrap');\n\n    if (isImageClick) {\n      this._doClickOrTapAction('imageClick', point, originalEvent);\n    } else if (isBackgroundClick) {\n      this._doClickOrTapAction('bgClick', point, originalEvent);\n    }\n  }\n  /**\n   * @param {Point} point\n   * @param {PointerEvent} originalEvent\n   */\n\n\n  tap(point, originalEvent) {\n    if (didTapOnMainContent(originalEvent)) {\n      this._doClickOrTapAction('tap', point, originalEvent);\n    }\n  }\n  /**\n   * @param {Point} point\n   * @param {PointerEvent} originalEvent\n   */\n\n\n  doubleTap(point, originalEvent) {\n    if (didTapOnMainContent(originalEvent)) {\n      this._doClickOrTapAction('doubleTap', point, originalEvent);\n    }\n  }\n  /**\n   * @private\n   * @param {Actions} actionName\n   * @param {Point} point\n   * @param {PointerEvent} originalEvent\n   */\n\n\n  _doClickOrTapAction(actionName, point, originalEvent) {\n    var _this$gestures$pswp$e;\n\n    const {\n      pswp\n    } = this.gestures;\n    const {\n      currSlide\n    } = pswp;\n    const actionFullName =\n    /** @type {AddPostfix<Actions, 'Action'>} */\n    actionName + 'Action';\n    const optionValue = pswp.options[actionFullName];\n\n    if (pswp.dispatch(actionFullName, {\n      point,\n      originalEvent\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (typeof optionValue === 'function') {\n      optionValue.call(pswp, point, originalEvent);\n      return;\n    }\n\n    switch (optionValue) {\n      case 'close':\n      case 'next':\n        pswp[optionValue]();\n        break;\n\n      case 'zoom':\n        currSlide === null || currSlide === void 0 || currSlide.toggleZoom(point);\n        break;\n\n      case 'zoom-or-close':\n        // by default click zooms current image,\n        // if it can not be zoomed - gallery will be closed\n        if (currSlide !== null && currSlide !== void 0 && currSlide.isZoomable() && currSlide.zoomLevels.secondary !== currSlide.zoomLevels.initial) {\n          currSlide.toggleZoom(point);\n        } else if (pswp.options.clickToCloseNonZoomable) {\n          pswp.close();\n        }\n\n        break;\n\n      case 'toggle-controls':\n        (_this$gestures$pswp$e = this.gestures.pswp.element) === null || _this$gestures$pswp$e === void 0 || _this$gestures$pswp$e.classList.toggle('pswp--ui-visible'); // if (_controlsVisible) {\n        //   _ui.hideControls();\n        // } else {\n        //   _ui.showControls();\n        // }\n\n        break;\n    }\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').Point} Point */\n// How far should user should drag\n// until we can determine that the gesture is swipe and its direction\n\nconst AXIS_SWIPE_HYSTERISIS = 10; //const PAN_END_FRICTION = 0.35;\n\nconst DOUBLE_TAP_DELAY = 300; // ms\n\nconst MIN_TAP_DISTANCE = 25; // px\n\n/**\n * Gestures class bind touch, pointer or mouse events\n * and emits drag to drag-handler and zoom events zoom-handler.\n *\n * Drag and zoom events are emited in requestAnimationFrame,\n * and only when one of pointers was actually changed.\n */\n\nclass Gestures {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    /** @type {'x' | 'y' | null} */\n\n    this.dragAxis = null; // point objects are defined once and reused\n    // PhotoSwipe keeps track only of two pointers, others are ignored\n\n    /** @type {Point} */\n\n    this.p1 = {\n      x: 0,\n      y: 0\n    }; // the first pressed pointer\n\n    /** @type {Point} */\n\n    this.p2 = {\n      x: 0,\n      y: 0\n    }; // the second pressed pointer\n\n    /** @type {Point} */\n\n    this.prevP1 = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point} */\n\n    this.prevP2 = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point} */\n\n    this.startP1 = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point} */\n\n    this.startP2 = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point} */\n\n    this.velocity = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point}\n     * @private\n     */\n\n    this._lastStartP1 = {\n      x: 0,\n      y: 0\n    };\n    /** @type {Point}\n     * @private\n     */\n\n    this._intervalP1 = {\n      x: 0,\n      y: 0\n    };\n    /** @private */\n\n    this._numActivePoints = 0;\n    /** @type {Point[]}\n     * @private\n     */\n\n    this._ongoingPointers = [];\n    /** @private */\n\n    this._touchEventEnabled = 'ontouchstart' in window;\n    /** @private */\n\n    this._pointerEventEnabled = !!window.PointerEvent;\n    this.supportsTouch = this._touchEventEnabled || this._pointerEventEnabled && navigator.maxTouchPoints > 1;\n    /** @private */\n\n    this._numActivePoints = 0;\n    /** @private */\n\n    this._intervalTime = 0;\n    /** @private */\n\n    this._velocityCalculated = false;\n    this.isMultitouch = false;\n    this.isDragging = false;\n    this.isZooming = false;\n    /** @type {number | null} */\n\n    this.raf = null;\n    /** @type {NodeJS.Timeout | null}\n     * @private\n     */\n\n    this._tapTimer = null;\n\n    if (!this.supportsTouch) {\n      // disable pan to next slide for non-touch devices\n      pswp.options.allowPanToNext = false;\n    }\n\n    this.drag = new DragHandler(this);\n    this.zoomLevels = new ZoomHandler(this);\n    this.tapHandler = new TapHandler(this);\n    pswp.on('bindEvents', () => {\n      pswp.events.add(pswp.scrollWrap, 'click',\n      /** @type EventListener */\n      this._onClick.bind(this));\n\n      if (this._pointerEventEnabled) {\n        this._bindEvents('pointer', 'down', 'up', 'cancel');\n      } else if (this._touchEventEnabled) {\n        this._bindEvents('touch', 'start', 'end', 'cancel'); // In previous versions we also bound mouse event here,\n        // in case device supports both touch and mouse events,\n        // but newer versions of browsers now support PointerEvent.\n        // on iOS10 if you bind touchmove/end after touchstart,\n        // and you don't preventDefault touchstart (which PhotoSwipe does),\n        // preventDefault will have no effect on touchmove and touchend.\n        // Unless you bind it previously.\n\n\n        if (pswp.scrollWrap) {\n          pswp.scrollWrap.ontouchmove = () => {};\n\n          pswp.scrollWrap.ontouchend = () => {};\n        }\n      } else {\n        this._bindEvents('mouse', 'down', 'up');\n      }\n    });\n  }\n  /**\n   * @private\n   * @param {'mouse' | 'touch' | 'pointer'} pref\n   * @param {'down' | 'start'} down\n   * @param {'up' | 'end'} up\n   * @param {'cancel'} [cancel]\n   */\n\n\n  _bindEvents(pref, down, up, cancel) {\n    const {\n      pswp\n    } = this;\n    const {\n      events\n    } = pswp;\n    const cancelEvent = cancel ? pref + cancel : '';\n    events.add(pswp.scrollWrap, pref + down,\n    /** @type EventListener */\n    this.onPointerDown.bind(this));\n    events.add(window, pref + 'move',\n    /** @type EventListener */\n    this.onPointerMove.bind(this));\n    events.add(window, pref + up,\n    /** @type EventListener */\n    this.onPointerUp.bind(this));\n\n    if (cancelEvent) {\n      events.add(pswp.scrollWrap, cancelEvent,\n      /** @type EventListener */\n      this.onPointerUp.bind(this));\n    }\n  }\n  /**\n   * @param {PointerEvent} e\n   */\n\n\n  onPointerDown(e) {\n    // We do not call preventDefault for touch events\n    // to allow browser to show native dialog on longpress\n    // (the one that allows to save image or open it in new tab).\n    //\n    // Desktop Safari allows to drag images when preventDefault isn't called on mousedown,\n    // even though preventDefault IS called on mousemove. That's why we preventDefault mousedown.\n    const isMousePointer = e.type === 'mousedown' || e.pointerType === 'mouse'; // Allow dragging only via left mouse button.\n    // http://www.quirksmode.org/js/events_properties.html\n    // https://developer.mozilla.org/en-US/docs/Web/API/event.button\n\n    if (isMousePointer && e.button > 0) {\n      return;\n    }\n\n    const {\n      pswp\n    } = this; // if PhotoSwipe is opening or closing\n\n    if (!pswp.opener.isOpen) {\n      e.preventDefault();\n      return;\n    }\n\n    if (pswp.dispatch('pointerDown', {\n      originalEvent: e\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (isMousePointer) {\n      pswp.mouseDetected(); // preventDefault mouse event to prevent\n      // browser image drag feature\n\n      this._preventPointerEventBehaviour(e, 'down');\n    }\n\n    pswp.animations.stopAll();\n\n    this._updatePoints(e, 'down');\n\n    if (this._numActivePoints === 1) {\n      this.dragAxis = null; // we need to store initial point to determine the main axis,\n      // drag is activated only after the axis is determined\n\n      equalizePoints(this.startP1, this.p1);\n    }\n\n    if (this._numActivePoints > 1) {\n      // Tap or double tap should not trigger if more than one pointer\n      this._clearTapTimer();\n\n      this.isMultitouch = true;\n    } else {\n      this.isMultitouch = false;\n    }\n  }\n  /**\n   * @param {PointerEvent} e\n   */\n\n\n  onPointerMove(e) {\n    this._preventPointerEventBehaviour(e, 'move');\n\n    if (!this._numActivePoints) {\n      return;\n    }\n\n    this._updatePoints(e, 'move');\n\n    if (this.pswp.dispatch('pointerMove', {\n      originalEvent: e\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this._numActivePoints === 1 && !this.isDragging) {\n      if (!this.dragAxis) {\n        this._calculateDragDirection();\n      } // Drag axis was detected, emit drag.start\n\n\n      if (this.dragAxis && !this.isDragging) {\n        if (this.isZooming) {\n          this.isZooming = false;\n          this.zoomLevels.end();\n        }\n\n        this.isDragging = true;\n\n        this._clearTapTimer(); // Tap can not trigger after drag\n        // Adjust starting point\n\n\n        this._updateStartPoints();\n\n        this._intervalTime = Date.now(); //this._startTime = this._intervalTime;\n\n        this._velocityCalculated = false;\n        equalizePoints(this._intervalP1, this.p1);\n        this.velocity.x = 0;\n        this.velocity.y = 0;\n        this.drag.start();\n\n        this._rafStopLoop();\n\n        this._rafRenderLoop();\n      }\n    } else if (this._numActivePoints > 1 && !this.isZooming) {\n      this._finishDrag();\n\n      this.isZooming = true; // Adjust starting points\n\n      this._updateStartPoints();\n\n      this.zoomLevels.start();\n\n      this._rafStopLoop();\n\n      this._rafRenderLoop();\n    }\n  }\n  /**\n   * @private\n   */\n\n\n  _finishDrag() {\n    if (this.isDragging) {\n      this.isDragging = false; // Try to calculate velocity,\n      // if it wasn't calculated yet in drag.change\n\n      if (!this._velocityCalculated) {\n        this._updateVelocity(true);\n      }\n\n      this.drag.end();\n      this.dragAxis = null;\n    }\n  }\n  /**\n   * @param {PointerEvent} e\n   */\n\n\n  onPointerUp(e) {\n    if (!this._numActivePoints) {\n      return;\n    }\n\n    this._updatePoints(e, 'up');\n\n    if (this.pswp.dispatch('pointerUp', {\n      originalEvent: e\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this._numActivePoints === 0) {\n      this._rafStopLoop();\n\n      if (this.isDragging) {\n        this._finishDrag();\n      } else if (!this.isZooming && !this.isMultitouch) {\n        //this.zoomLevels.correctZoomPan();\n        this._finishTap(e);\n      }\n    }\n\n    if (this._numActivePoints < 2 && this.isZooming) {\n      this.isZooming = false;\n      this.zoomLevels.end();\n\n      if (this._numActivePoints === 1) {\n        // Since we have 1 point left, we need to reinitiate drag\n        this.dragAxis = null;\n\n        this._updateStartPoints();\n      }\n    }\n  }\n  /**\n   * @private\n   */\n\n\n  _rafRenderLoop() {\n    if (this.isDragging || this.isZooming) {\n      this._updateVelocity();\n\n      if (this.isDragging) {\n        // make sure that pointer moved since the last update\n        if (!pointsEqual(this.p1, this.prevP1)) {\n          this.drag.change();\n        }\n      } else\n        /* if (this.isZooming) */\n        {\n          if (!pointsEqual(this.p1, this.prevP1) || !pointsEqual(this.p2, this.prevP2)) {\n            this.zoomLevels.change();\n          }\n        }\n\n      this._updatePrevPoints();\n\n      this.raf = requestAnimationFrame(this._rafRenderLoop.bind(this));\n    }\n  }\n  /**\n   * Update velocity at 50ms interval\n   *\n   * @private\n   * @param {boolean} [force]\n   */\n\n\n  _updateVelocity(force) {\n    const time = Date.now();\n    const duration = time - this._intervalTime;\n\n    if (duration < 50 && !force) {\n      return;\n    }\n\n    this.velocity.x = this._getVelocity('x', duration);\n    this.velocity.y = this._getVelocity('y', duration);\n    this._intervalTime = time;\n    equalizePoints(this._intervalP1, this.p1);\n    this._velocityCalculated = true;\n  }\n  /**\n   * @private\n   * @param {PointerEvent} e\n   */\n\n\n  _finishTap(e) {\n    const {\n      mainScroll\n    } = this.pswp; // Do not trigger tap events if main scroll is shifted\n\n    if (mainScroll.isShifted()) {\n      // restore main scroll position\n      // (usually happens if stopped in the middle of animation)\n      mainScroll.moveIndexBy(0, true);\n      return;\n    } // Do not trigger tap for touchcancel or pointercancel\n\n\n    if (e.type.indexOf('cancel') > 0) {\n      return;\n    } // Trigger click instead of tap for mouse events\n\n\n    if (e.type === 'mouseup' || e.pointerType === 'mouse') {\n      this.tapHandler.click(this.startP1, e);\n      return;\n    } // Disable delay if there is no doubleTapAction\n\n\n    const tapDelay = this.pswp.options.doubleTapAction ? DOUBLE_TAP_DELAY : 0; // If tapTimer is defined - we tapped recently,\n    // check if the current tap is close to the previous one,\n    // if yes - trigger double tap\n\n    if (this._tapTimer) {\n      this._clearTapTimer(); // Check if two taps were more or less on the same place\n\n\n      if (getDistanceBetween(this._lastStartP1, this.startP1) < MIN_TAP_DISTANCE) {\n        this.tapHandler.doubleTap(this.startP1, e);\n      }\n    } else {\n      equalizePoints(this._lastStartP1, this.startP1);\n      this._tapTimer = setTimeout(() => {\n        this.tapHandler.tap(this.startP1, e);\n\n        this._clearTapTimer();\n      }, tapDelay);\n    }\n  }\n  /**\n   * @private\n   */\n\n\n  _clearTapTimer() {\n    if (this._tapTimer) {\n      clearTimeout(this._tapTimer);\n      this._tapTimer = null;\n    }\n  }\n  /**\n   * Get velocity for axis\n   *\n   * @private\n   * @param {'x' | 'y'} axis\n   * @param {number} duration\n   * @returns {number}\n   */\n\n\n  _getVelocity(axis, duration) {\n    // displacement is like distance, but can be negative.\n    const displacement = this.p1[axis] - this._intervalP1[axis];\n\n    if (Math.abs(displacement) > 1 && duration > 5) {\n      return displacement / duration;\n    }\n\n    return 0;\n  }\n  /**\n   * @private\n   */\n\n\n  _rafStopLoop() {\n    if (this.raf) {\n      cancelAnimationFrame(this.raf);\n      this.raf = null;\n    }\n  }\n  /**\n   * @private\n   * @param {PointerEvent} e\n   * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\n   */\n\n\n  _preventPointerEventBehaviour(e, pointerType) {\n    const preventPointerEvent = this.pswp.applyFilters('preventPointerEvent', true, e, pointerType);\n\n    if (preventPointerEvent) {\n      e.preventDefault();\n    }\n  }\n  /**\n   * Parses and normalizes points from the touch, mouse or pointer event.\n   * Updates p1 and p2.\n   *\n   * @private\n   * @param {PointerEvent | TouchEvent} e\n   * @param {'up' | 'down' | 'move'} pointerType Normalized pointer type\n   */\n\n\n  _updatePoints(e, pointerType) {\n    if (this._pointerEventEnabled) {\n      const pointerEvent =\n      /** @type {PointerEvent} */\n      e; // Try to find the current pointer in ongoing pointers by its ID\n\n      const pointerIndex = this._ongoingPointers.findIndex(ongoingPointer => {\n        return ongoingPointer.id === pointerEvent.pointerId;\n      });\n\n      if (pointerType === 'up' && pointerIndex > -1) {\n        // release the pointer - remove it from ongoing\n        this._ongoingPointers.splice(pointerIndex, 1);\n      } else if (pointerType === 'down' && pointerIndex === -1) {\n        // add new pointer\n        this._ongoingPointers.push(this._convertEventPosToPoint(pointerEvent, {\n          x: 0,\n          y: 0\n        }));\n      } else if (pointerIndex > -1) {\n        // update existing pointer\n        this._convertEventPosToPoint(pointerEvent, this._ongoingPointers[pointerIndex]);\n      }\n\n      this._numActivePoints = this._ongoingPointers.length; // update points that PhotoSwipe uses\n      // to calculate position and scale\n\n      if (this._numActivePoints > 0) {\n        equalizePoints(this.p1, this._ongoingPointers[0]);\n      }\n\n      if (this._numActivePoints > 1) {\n        equalizePoints(this.p2, this._ongoingPointers[1]);\n      }\n    } else {\n      const touchEvent =\n      /** @type {TouchEvent} */\n      e;\n      this._numActivePoints = 0;\n\n      if (touchEvent.type.indexOf('touch') > -1) {\n        // Touch Event\n        // https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n        if (touchEvent.touches && touchEvent.touches.length > 0) {\n          this._convertEventPosToPoint(touchEvent.touches[0], this.p1);\n\n          this._numActivePoints++;\n\n          if (touchEvent.touches.length > 1) {\n            this._convertEventPosToPoint(touchEvent.touches[1], this.p2);\n\n            this._numActivePoints++;\n          }\n        }\n      } else {\n        // Mouse Event\n        this._convertEventPosToPoint(\n        /** @type {PointerEvent} */\n        e, this.p1);\n\n        if (pointerType === 'up') {\n          // clear all points on mouseup\n          this._numActivePoints = 0;\n        } else {\n          this._numActivePoints++;\n        }\n      }\n    }\n  }\n  /** update points that were used during previous rAF tick\n   * @private\n   */\n\n\n  _updatePrevPoints() {\n    equalizePoints(this.prevP1, this.p1);\n    equalizePoints(this.prevP2, this.p2);\n  }\n  /** update points at the start of gesture\n   * @private\n   */\n\n\n  _updateStartPoints() {\n    equalizePoints(this.startP1, this.p1);\n    equalizePoints(this.startP2, this.p2);\n\n    this._updatePrevPoints();\n  }\n  /** @private */\n\n\n  _calculateDragDirection() {\n    if (this.pswp.mainScroll.isShifted()) {\n      // if main scroll position is shifted – direction is always horizontal\n      this.dragAxis = 'x';\n    } else {\n      // calculate delta of the last touchmove tick\n      const diff = Math.abs(this.p1.x - this.startP1.x) - Math.abs(this.p1.y - this.startP1.y);\n\n      if (diff !== 0) {\n        // check if pointer was shifted horizontally or vertically\n        const axisToCheck = diff > 0 ? 'x' : 'y';\n\n        if (Math.abs(this.p1[axisToCheck] - this.startP1[axisToCheck]) >= AXIS_SWIPE_HYSTERISIS) {\n          this.dragAxis = axisToCheck;\n        }\n      }\n    }\n  }\n  /**\n   * Converts touch, pointer or mouse event\n   * to PhotoSwipe point.\n   *\n   * @private\n   * @param {Touch | PointerEvent} e\n   * @param {Point} p\n   * @returns {Point}\n   */\n\n\n  _convertEventPosToPoint(e, p) {\n    p.x = e.pageX - this.pswp.offset.x;\n    p.y = e.pageY - this.pswp.offset.y;\n\n    if ('pointerId' in e) {\n      p.id = e.pointerId;\n    } else if (e.identifier !== undefined) {\n      p.id = e.identifier;\n    }\n\n    return p;\n  }\n  /**\n   * @private\n   * @param {PointerEvent} e\n   */\n\n\n  _onClick(e) {\n    // Do not allow click event to pass through after drag\n    if (this.pswp.mainScroll.isShifted()) {\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/slide.js').default} Slide */\n\n/** @typedef {{ el: HTMLDivElement; slide?: Slide }} ItemHolder */\n\nconst MAIN_SCROLL_END_FRICTION = 0.35; // const MIN_SWIPE_TRANSITION_DURATION = 250;\n// const MAX_SWIPE_TRABSITION_DURATION = 500;\n// const DEFAULT_SWIPE_TRANSITION_DURATION = 333;\n\n/**\n * Handles movement of the main scrolling container\n * (for example, it repositions when user swipes left or right).\n *\n * Also stores its state.\n */\n\nclass MainScroll {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    this.x = 0;\n    this.slideWidth = 0;\n    /** @private */\n\n    this._currPositionIndex = 0;\n    /** @private */\n\n    this._prevPositionIndex = 0;\n    /** @private */\n\n    this._containerShiftIndex = -1;\n    /** @type {ItemHolder[]} */\n\n    this.itemHolders = [];\n  }\n  /**\n   * Position the scroller and slide containers\n   * according to viewport size.\n   *\n   * @param {boolean} [resizeSlides] Whether slides content should resized\n   */\n\n\n  resize(resizeSlides) {\n    const {\n      pswp\n    } = this;\n    const newSlideWidth = Math.round(pswp.viewportSize.x + pswp.viewportSize.x * pswp.options.spacing); // Mobile browsers might trigger a resize event during a gesture.\n    // (due to toolbar appearing or hiding).\n    // Avoid re-adjusting main scroll position if width wasn't changed\n\n    const slideWidthChanged = newSlideWidth !== this.slideWidth;\n\n    if (slideWidthChanged) {\n      this.slideWidth = newSlideWidth;\n      this.moveTo(this.getCurrSlideX());\n    }\n\n    this.itemHolders.forEach((itemHolder, index) => {\n      if (slideWidthChanged) {\n        setTransform(itemHolder.el, (index + this._containerShiftIndex) * this.slideWidth);\n      }\n\n      if (resizeSlides && itemHolder.slide) {\n        itemHolder.slide.resize();\n      }\n    });\n  }\n  /**\n   * Reset X position of the main scroller to zero\n   */\n\n\n  resetPosition() {\n    // Position on the main scroller (offset)\n    // it is independent from slide index\n    this._currPositionIndex = 0;\n    this._prevPositionIndex = 0; // This will force recalculation of size on next resize()\n\n    this.slideWidth = 0; // _containerShiftIndex*viewportSize will give you amount of transform of the current slide\n\n    this._containerShiftIndex = -1;\n  }\n  /**\n   * Create and append array of three items\n   * that hold data about slides in DOM\n   */\n\n\n  appendHolders() {\n    this.itemHolders = []; // append our three slide holders -\n    // previous, current, and next\n\n    for (let i = 0; i < 3; i++) {\n      const el = createElement('pswp__item', 'div', this.pswp.container);\n      el.setAttribute('role', 'group');\n      el.setAttribute('aria-roledescription', 'slide');\n      el.setAttribute('aria-hidden', 'true'); // hide nearby item holders until initial zoom animation finishes (to avoid extra Paints)\n\n      el.style.display = i === 1 ? 'block' : 'none';\n      this.itemHolders.push({\n        el //index: -1\n\n      });\n    }\n  }\n  /**\n   * Whether the main scroll can be horizontally swiped to the next or previous slide.\n   * @returns {boolean}\n   */\n\n\n  canBeSwiped() {\n    return this.pswp.getNumItems() > 1;\n  }\n  /**\n   * Move main scroll by X amount of slides.\n   * For example:\n   *   `-1` will move to the previous slide,\n   *    `0` will reset the scroll position of the current slide,\n   *    `3` will move three slides forward\n   *\n   * If loop option is enabled - index will be automatically looped too,\n   * (for example `-1` will move to the last slide of the gallery).\n   *\n   * @param {number} diff\n   * @param {boolean} [animate]\n   * @param {number} [velocityX]\n   * @returns {boolean} whether index was changed or not\n   */\n\n\n  moveIndexBy(diff, animate, velocityX) {\n    const {\n      pswp\n    } = this;\n    let newIndex = pswp.potentialIndex + diff;\n    const numSlides = pswp.getNumItems();\n\n    if (pswp.canLoop()) {\n      newIndex = pswp.getLoopedIndex(newIndex);\n      const distance = (diff + numSlides) % numSlides;\n\n      if (distance <= numSlides / 2) {\n        // go forward\n        diff = distance;\n      } else {\n        // go backwards\n        diff = distance - numSlides;\n      }\n    } else {\n      if (newIndex < 0) {\n        newIndex = 0;\n      } else if (newIndex >= numSlides) {\n        newIndex = numSlides - 1;\n      }\n\n      diff = newIndex - pswp.potentialIndex;\n    }\n\n    pswp.potentialIndex = newIndex;\n    this._currPositionIndex -= diff;\n    pswp.animations.stopMainScroll();\n    const destinationX = this.getCurrSlideX();\n\n    if (!animate) {\n      this.moveTo(destinationX);\n      this.updateCurrItem();\n    } else {\n      pswp.animations.startSpring({\n        isMainScroll: true,\n        start: this.x,\n        end: destinationX,\n        velocity: velocityX || 0,\n        naturalFrequency: 30,\n        dampingRatio: 1,\n        //0.7,\n        onUpdate: x => {\n          this.moveTo(x);\n        },\n        onComplete: () => {\n          this.updateCurrItem();\n          pswp.appendHeavy();\n        }\n      });\n      let currDiff = pswp.potentialIndex - pswp.currIndex;\n\n      if (pswp.canLoop()) {\n        const currDistance = (currDiff + numSlides) % numSlides;\n\n        if (currDistance <= numSlides / 2) {\n          // go forward\n          currDiff = currDistance;\n        } else {\n          // go backwards\n          currDiff = currDistance - numSlides;\n        }\n      } // Force-append new slides during transition\n      // if difference between slides is more than 1\n\n\n      if (Math.abs(currDiff) > 1) {\n        this.updateCurrItem();\n      }\n    }\n\n    return Boolean(diff);\n  }\n  /**\n   * X position of the main scroll for the current slide\n   * (ignores position during dragging)\n   * @returns {number}\n   */\n\n\n  getCurrSlideX() {\n    return this.slideWidth * this._currPositionIndex;\n  }\n  /**\n   * Whether scroll position is shifted.\n   * For example, it will return true if the scroll is being dragged or animated.\n   * @returns {boolean}\n   */\n\n\n  isShifted() {\n    return this.x !== this.getCurrSlideX();\n  }\n  /**\n   * Update slides X positions and set their content\n   */\n\n\n  updateCurrItem() {\n    var _this$itemHolders$;\n\n    const {\n      pswp\n    } = this;\n    const positionDifference = this._prevPositionIndex - this._currPositionIndex;\n\n    if (!positionDifference) {\n      return;\n    }\n\n    this._prevPositionIndex = this._currPositionIndex;\n    pswp.currIndex = pswp.potentialIndex;\n    let diffAbs = Math.abs(positionDifference);\n    /** @type {ItemHolder | undefined} */\n\n    let tempHolder;\n\n    if (diffAbs >= 3) {\n      this._containerShiftIndex += positionDifference + (positionDifference > 0 ? -3 : 3);\n      diffAbs = 3; // If slides are changed by 3 screens or more - clean up previous slides\n\n      this.itemHolders.forEach(itemHolder => {\n        var _itemHolder$slide;\n\n        (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.destroy();\n        itemHolder.slide = undefined;\n      });\n    }\n\n    for (let i = 0; i < diffAbs; i++) {\n      if (positionDifference > 0) {\n        tempHolder = this.itemHolders.shift();\n\n        if (tempHolder) {\n          this.itemHolders[2] = tempHolder; // move first to last\n\n          this._containerShiftIndex++;\n          setTransform(tempHolder.el, (this._containerShiftIndex + 2) * this.slideWidth);\n          pswp.setContent(tempHolder, pswp.currIndex - diffAbs + i + 2);\n        }\n      } else {\n        tempHolder = this.itemHolders.pop();\n\n        if (tempHolder) {\n          this.itemHolders.unshift(tempHolder); // move last to first\n\n          this._containerShiftIndex--;\n          setTransform(tempHolder.el, this._containerShiftIndex * this.slideWidth);\n          pswp.setContent(tempHolder, pswp.currIndex + diffAbs - i - 2);\n        }\n      }\n    } // Reset transfrom every 50ish navigations in one direction.\n    //\n    // Otherwise transform will keep growing indefinitely,\n    // which might cause issues as browsers have a maximum transform limit.\n    // I wasn't able to reach it, but just to be safe.\n    // This should not cause noticable lag.\n\n\n    if (Math.abs(this._containerShiftIndex) > 50 && !this.isShifted()) {\n      this.resetPosition();\n      this.resize();\n    } // Pan transition might be running (and consntantly updating pan position)\n\n\n    pswp.animations.stopAllPan();\n    this.itemHolders.forEach((itemHolder, i) => {\n      if (itemHolder.slide) {\n        // Slide in the 2nd holder is always active\n        itemHolder.slide.setIsActive(i === 1);\n      }\n    });\n    pswp.currSlide = (_this$itemHolders$ = this.itemHolders[1]) === null || _this$itemHolders$ === void 0 ? void 0 : _this$itemHolders$.slide;\n    pswp.contentLoader.updateLazy(positionDifference);\n\n    if (pswp.currSlide) {\n      pswp.currSlide.applyCurrentZoomPan();\n    }\n\n    pswp.dispatch('change');\n  }\n  /**\n   * Move the X position of the main scroll container\n   *\n   * @param {number} x\n   * @param {boolean} [dragging]\n   */\n\n\n  moveTo(x, dragging) {\n    if (!this.pswp.canLoop() && dragging) {\n      // Apply friction\n      let newSlideIndexOffset = (this.slideWidth * this._currPositionIndex - x) / this.slideWidth;\n      newSlideIndexOffset += this.pswp.currIndex;\n      const delta = Math.round(x - this.x);\n\n      if (newSlideIndexOffset < 0 && delta > 0 || newSlideIndexOffset >= this.pswp.getNumItems() - 1 && delta < 0) {\n        x = this.x + delta * MAIN_SCROLL_END_FRICTION;\n      }\n    }\n\n    this.x = x;\n\n    if (this.pswp.container) {\n      setTransform(this.pswp.container, x);\n    }\n\n    this.pswp.dispatch('moveMainScroll', {\n      x,\n      dragging: dragging !== null && dragging !== void 0 ? dragging : false\n    });\n  }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\n * @template T\n * @typedef {import('./types.js').Methods<T>} Methods<T>\n */\n\nconst KeyboardKeyCodesMap = {\n  Escape: 27,\n  z: 90,\n  ArrowLeft: 37,\n  ArrowUp: 38,\n  ArrowRight: 39,\n  ArrowDown: 40,\n  Tab: 9\n};\n/**\n * @template {keyof KeyboardKeyCodesMap} T\n * @param {T} key\n * @param {boolean} isKeySupported\n * @returns {T | number | undefined}\n */\n\nconst getKeyboardEventKey = (key, isKeySupported) => {\n  return isKeySupported ? key : KeyboardKeyCodesMap[key];\n};\n/**\n * - Manages keyboard shortcuts.\n * - Helps trap focus within photoswipe.\n */\n\n\nclass Keyboard {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    /** @private */\n\n    this._wasFocused = false;\n    pswp.on('bindEvents', () => {\n      if (pswp.options.trapFocus) {\n        // Dialog was likely opened by keyboard if initial point is not defined\n        if (!pswp.options.initialPointerPos) {\n          // focus causes layout,\n          // which causes lag during the animation,\n          // that's why we delay it until the opener transition ends\n          this._focusRoot();\n        }\n\n        pswp.events.add(document, 'focusin',\n        /** @type EventListener */\n        this._onFocusIn.bind(this));\n      }\n\n      pswp.events.add(document, 'keydown',\n      /** @type EventListener */\n      this._onKeyDown.bind(this));\n    });\n    const lastActiveElement =\n    /** @type {HTMLElement} */\n    document.activeElement;\n    pswp.on('destroy', () => {\n      if (pswp.options.returnFocus && lastActiveElement && this._wasFocused) {\n        lastActiveElement.focus();\n      }\n    });\n  }\n  /** @private */\n\n\n  _focusRoot() {\n    if (!this._wasFocused && this.pswp.element) {\n      this.pswp.element.focus();\n      this._wasFocused = true;\n    }\n  }\n  /**\n   * @private\n   * @param {KeyboardEvent} e\n   */\n\n\n  _onKeyDown(e) {\n    const {\n      pswp\n    } = this;\n\n    if (pswp.dispatch('keydown', {\n      originalEvent: e\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (specialKeyUsed(e)) {\n      // don't do anything if special key pressed\n      // to prevent from overriding default browser actions\n      // for example, in Chrome on Mac cmd+arrow-left returns to previous page\n      return;\n    }\n    /** @type {Methods<PhotoSwipe> | undefined} */\n\n\n    let keydownAction;\n    /** @type {'x' | 'y' | undefined} */\n\n    let axis;\n    let isForward = false;\n    const isKeySupported = ('key' in e);\n\n    switch (isKeySupported ? e.key : e.keyCode) {\n      case getKeyboardEventKey('Escape', isKeySupported):\n        if (pswp.options.escKey) {\n          keydownAction = 'close';\n        }\n\n        break;\n\n      case getKeyboardEventKey('z', isKeySupported):\n        keydownAction = 'toggleZoom';\n        break;\n\n      case getKeyboardEventKey('ArrowLeft', isKeySupported):\n        axis = 'x';\n        break;\n\n      case getKeyboardEventKey('ArrowUp', isKeySupported):\n        axis = 'y';\n        break;\n\n      case getKeyboardEventKey('ArrowRight', isKeySupported):\n        axis = 'x';\n        isForward = true;\n        break;\n\n      case getKeyboardEventKey('ArrowDown', isKeySupported):\n        isForward = true;\n        axis = 'y';\n        break;\n\n      case getKeyboardEventKey('Tab', isKeySupported):\n        this._focusRoot();\n\n        break;\n    } // if left/right/top/bottom key\n\n\n    if (axis) {\n      // prevent page scroll\n      e.preventDefault();\n      const {\n        currSlide\n      } = pswp;\n\n      if (pswp.options.arrowKeys && axis === 'x' && pswp.getNumItems() > 1) {\n        keydownAction = isForward ? 'next' : 'prev';\n      } else if (currSlide && currSlide.currZoomLevel > currSlide.zoomLevels.fit) {\n        // up/down arrow keys pan the image vertically\n        // left/right arrow keys pan horizontally.\n        // Unless there is only one image,\n        // or arrowKeys option is disabled\n        currSlide.pan[axis] += isForward ? -80 : 80;\n        currSlide.panTo(currSlide.pan.x, currSlide.pan.y);\n      }\n    }\n\n    if (keydownAction) {\n      e.preventDefault(); // @ts-ignore\n\n      pswp[keydownAction]();\n    }\n  }\n  /**\n   * Trap focus inside photoswipe\n   *\n   * @private\n   * @param {FocusEvent} e\n   */\n\n\n  _onFocusIn(e) {\n    const {\n      template\n    } = this.pswp;\n\n    if (template && document !== e.target && template !== e.target && !template.contains(\n    /** @type {Node} */\n    e.target)) {\n      // focus root element\n      template.focus();\n    }\n  }\n\n}\n\nconst DEFAULT_EASING = 'cubic-bezier(.4,0,.22,1)';\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/** @typedef {Object} DefaultCssAnimationProps\n *\n * @prop {HTMLElement} target\n * @prop {number} [duration]\n * @prop {string} [easing]\n * @prop {string} [transform]\n * @prop {string} [opacity]\n * */\n\n/** @typedef {SharedAnimationProps & DefaultCssAnimationProps} CssAnimationProps */\n\n/**\n * Runs CSS transition.\n */\n\nclass CSSAnimation {\n  /**\n   * onComplete can be unpredictable, be careful about current state\n   *\n   * @param {CssAnimationProps} props\n   */\n  constructor(props) {\n    var _props$prop;\n\n    this.props = props;\n    const {\n      target,\n      onComplete,\n      transform,\n      onFinish = () => {},\n      duration = 333,\n      easing = DEFAULT_EASING\n    } = props;\n    this.onFinish = onFinish; // support only transform and opacity\n\n    const prop = transform ? 'transform' : 'opacity';\n    const propValue = (_props$prop = props[prop]) !== null && _props$prop !== void 0 ? _props$prop : '';\n    /** @private */\n\n    this._target = target;\n    /** @private */\n\n    this._onComplete = onComplete;\n    /** @private */\n\n    this._finished = false;\n    /** @private */\n\n    this._onTransitionEnd = this._onTransitionEnd.bind(this); // Using timeout hack to make sure that animation\n    // starts even if the animated property was changed recently,\n    // otherwise transitionend might not fire or transition won't start.\n    // https://drafts.csswg.org/css-transitions/#starting\n    //\n    // ¯\\_(ツ)_/¯\n\n    /** @private */\n\n    this._helperTimeout = setTimeout(() => {\n      setTransitionStyle(target, prop, duration, easing);\n      this._helperTimeout = setTimeout(() => {\n        target.addEventListener('transitionend', this._onTransitionEnd, false);\n        target.addEventListener('transitioncancel', this._onTransitionEnd, false); // Safari occasionally does not emit transitionend event\n        // if element property was modified during the transition,\n        // which may be caused by resize or third party component,\n        // using timeout as a safety fallback\n\n        this._helperTimeout = setTimeout(() => {\n          this._finalizeAnimation();\n        }, duration + 500);\n        target.style[prop] = propValue;\n      }, 30); // Do not reduce this number\n    }, 0);\n  }\n  /**\n   * @private\n   * @param {TransitionEvent} e\n   */\n\n\n  _onTransitionEnd(e) {\n    if (e.target === this._target) {\n      this._finalizeAnimation();\n    }\n  }\n  /**\n   * @private\n   */\n\n\n  _finalizeAnimation() {\n    if (!this._finished) {\n      this._finished = true;\n      this.onFinish();\n\n      if (this._onComplete) {\n        this._onComplete();\n      }\n    }\n  } // Destroy is called automatically onFinish\n\n\n  destroy() {\n    if (this._helperTimeout) {\n      clearTimeout(this._helperTimeout);\n    }\n\n    removeTransitionStyle(this._target);\n\n    this._target.removeEventListener('transitionend', this._onTransitionEnd, false);\n\n    this._target.removeEventListener('transitioncancel', this._onTransitionEnd, false);\n\n    if (!this._finished) {\n      this._finalizeAnimation();\n    }\n  }\n\n}\n\nconst DEFAULT_NATURAL_FREQUENCY = 12;\nconst DEFAULT_DAMPING_RATIO = 0.75;\n/**\n * Spring easing helper\n */\n\nclass SpringEaser {\n  /**\n   * @param {number} initialVelocity Initial velocity, px per ms.\n   *\n   * @param {number} [dampingRatio]\n   * Determines how bouncy animation will be.\n   * From 0 to 1, 0 - always overshoot, 1 - do not overshoot.\n   * \"overshoot\" refers to part of animation that\n   * goes beyond the final value.\n   *\n   * @param {number} [naturalFrequency]\n   * Determines how fast animation will slow down.\n   * The higher value - the stiffer the transition will be,\n   * and the faster it will slow down.\n   * Recommended value from 10 to 50\n   */\n  constructor(initialVelocity, dampingRatio, naturalFrequency) {\n    this.velocity = initialVelocity * 1000; // convert to \"pixels per second\"\n    // https://en.wikipedia.org/wiki/Damping_ratio\n\n    this._dampingRatio = dampingRatio || DEFAULT_DAMPING_RATIO; // https://en.wikipedia.org/wiki/Natural_frequency\n\n    this._naturalFrequency = naturalFrequency || DEFAULT_NATURAL_FREQUENCY;\n    this._dampedFrequency = this._naturalFrequency;\n\n    if (this._dampingRatio < 1) {\n      this._dampedFrequency *= Math.sqrt(1 - this._dampingRatio * this._dampingRatio);\n    }\n  }\n  /**\n   * @param {number} deltaPosition Difference between current and end position of the animation\n   * @param {number} deltaTime Frame duration in milliseconds\n   *\n   * @returns {number} Displacement, relative to the end position.\n   */\n\n\n  easeFrame(deltaPosition, deltaTime) {\n    // Inspired by Apple Webkit and Android spring function implementation\n    // https://en.wikipedia.org/wiki/Oscillation\n    // https://en.wikipedia.org/wiki/Damping_ratio\n    // we ignore mass (assume that it's 1kg)\n    let displacement = 0;\n    let coeff;\n    deltaTime /= 1000;\n    const naturalDumpingPow = Math.E ** (-this._dampingRatio * this._naturalFrequency * deltaTime);\n\n    if (this._dampingRatio === 1) {\n      coeff = this.velocity + this._naturalFrequency * deltaPosition;\n      displacement = (deltaPosition + coeff * deltaTime) * naturalDumpingPow;\n      this.velocity = displacement * -this._naturalFrequency + coeff * naturalDumpingPow;\n    } else if (this._dampingRatio < 1) {\n      coeff = 1 / this._dampedFrequency * (this._dampingRatio * this._naturalFrequency * deltaPosition + this.velocity);\n      const dumpedFCos = Math.cos(this._dampedFrequency * deltaTime);\n      const dumpedFSin = Math.sin(this._dampedFrequency * deltaTime);\n      displacement = naturalDumpingPow * (deltaPosition * dumpedFCos + coeff * dumpedFSin);\n      this.velocity = displacement * -this._naturalFrequency * this._dampingRatio + naturalDumpingPow * (-this._dampedFrequency * deltaPosition * dumpedFSin + this._dampedFrequency * coeff * dumpedFCos);\n    } // Overdamped (>1) damping ratio is not supported\n\n\n    return displacement;\n  }\n\n}\n\n/** @typedef {import('./animations.js').SharedAnimationProps} SharedAnimationProps */\n\n/**\n * @typedef {Object} DefaultSpringAnimationProps\n *\n * @prop {number} start\n * @prop {number} end\n * @prop {number} velocity\n * @prop {number} [dampingRatio]\n * @prop {number} [naturalFrequency]\n * @prop {(end: number) => void} onUpdate\n */\n\n/** @typedef {SharedAnimationProps & DefaultSpringAnimationProps} SpringAnimationProps */\n\nclass SpringAnimation {\n  /**\n   * @param {SpringAnimationProps} props\n   */\n  constructor(props) {\n    this.props = props;\n    this._raf = 0;\n    const {\n      start,\n      end,\n      velocity,\n      onUpdate,\n      onComplete,\n      onFinish = () => {},\n      dampingRatio,\n      naturalFrequency\n    } = props;\n    this.onFinish = onFinish;\n    const easer = new SpringEaser(velocity, dampingRatio, naturalFrequency);\n    let prevTime = Date.now();\n    let deltaPosition = start - end;\n\n    const animationLoop = () => {\n      if (this._raf) {\n        deltaPosition = easer.easeFrame(deltaPosition, Date.now() - prevTime); // Stop the animation if velocity is low and position is close to end\n\n        if (Math.abs(deltaPosition) < 1 && Math.abs(easer.velocity) < 50) {\n          // Finalize the animation\n          onUpdate(end);\n\n          if (onComplete) {\n            onComplete();\n          }\n\n          this.onFinish();\n        } else {\n          prevTime = Date.now();\n          onUpdate(deltaPosition + end);\n          this._raf = requestAnimationFrame(animationLoop);\n        }\n      }\n    };\n\n    this._raf = requestAnimationFrame(animationLoop);\n  } // Destroy is called automatically onFinish\n\n\n  destroy() {\n    if (this._raf >= 0) {\n      cancelAnimationFrame(this._raf);\n    }\n\n    this._raf = 0;\n  }\n\n}\n\n/** @typedef {import('./css-animation.js').CssAnimationProps} CssAnimationProps */\n\n/** @typedef {import('./spring-animation.js').SpringAnimationProps} SpringAnimationProps */\n\n/** @typedef {Object} SharedAnimationProps\n * @prop {string} [name]\n * @prop {boolean} [isPan]\n * @prop {boolean} [isMainScroll]\n * @prop {VoidFunction} [onComplete]\n * @prop {VoidFunction} [onFinish]\n */\n\n/** @typedef {SpringAnimation | CSSAnimation} Animation */\n\n/** @typedef {SpringAnimationProps | CssAnimationProps} AnimationProps */\n\n/**\n * Manages animations\n */\n\nclass Animations {\n  constructor() {\n    /** @type {Animation[]} */\n    this.activeAnimations = [];\n  }\n  /**\n   * @param {SpringAnimationProps} props\n   */\n\n\n  startSpring(props) {\n    this._start(props, true);\n  }\n  /**\n   * @param {CssAnimationProps} props\n   */\n\n\n  startTransition(props) {\n    this._start(props);\n  }\n  /**\n   * @private\n   * @param {AnimationProps} props\n   * @param {boolean} [isSpring]\n   * @returns {Animation}\n   */\n\n\n  _start(props, isSpring) {\n    const animation = isSpring ? new SpringAnimation(\n    /** @type SpringAnimationProps */\n    props) : new CSSAnimation(\n    /** @type CssAnimationProps */\n    props);\n    this.activeAnimations.push(animation);\n\n    animation.onFinish = () => this.stop(animation);\n\n    return animation;\n  }\n  /**\n   * @param {Animation} animation\n   */\n\n\n  stop(animation) {\n    animation.destroy();\n    const index = this.activeAnimations.indexOf(animation);\n\n    if (index > -1) {\n      this.activeAnimations.splice(index, 1);\n    }\n  }\n\n  stopAll() {\n    // _stopAllAnimations\n    this.activeAnimations.forEach(animation => {\n      animation.destroy();\n    });\n    this.activeAnimations = [];\n  }\n  /**\n   * Stop all pan or zoom transitions\n   */\n\n\n  stopAllPan() {\n    this.activeAnimations = this.activeAnimations.filter(animation => {\n      if (animation.props.isPan) {\n        animation.destroy();\n        return false;\n      }\n\n      return true;\n    });\n  }\n\n  stopMainScroll() {\n    this.activeAnimations = this.activeAnimations.filter(animation => {\n      if (animation.props.isMainScroll) {\n        animation.destroy();\n        return false;\n      }\n\n      return true;\n    });\n  }\n  /**\n   * Returns true if main scroll transition is running\n   */\n  // isMainScrollRunning() {\n  //   return this.activeAnimations.some((animation) => {\n  //     return animation.props.isMainScroll;\n  //   });\n  // }\n\n  /**\n   * Returns true if any pan or zoom transition is running\n   */\n\n\n  isPanRunning() {\n    return this.activeAnimations.some(animation => {\n      return animation.props.isPan;\n    });\n  }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/**\n * Handles scroll wheel.\n * Can pan and zoom current slide image.\n */\nclass ScrollWheel {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    pswp.events.add(pswp.element, 'wheel',\n    /** @type EventListener */\n    this._onWheel.bind(this));\n  }\n  /**\n   * @private\n   * @param {WheelEvent} e\n   */\n\n\n  _onWheel(e) {\n    e.preventDefault();\n    const {\n      currSlide\n    } = this.pswp;\n    let {\n      deltaX,\n      deltaY\n    } = e;\n\n    if (!currSlide) {\n      return;\n    }\n\n    if (this.pswp.dispatch('wheel', {\n      originalEvent: e\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (e.ctrlKey || this.pswp.options.wheelToZoom) {\n      // zoom\n      if (currSlide.isZoomable()) {\n        let zoomFactor = -deltaY;\n\n        if (e.deltaMode === 1\n        /* DOM_DELTA_LINE */\n        ) {\n          zoomFactor *= 0.05;\n        } else {\n          zoomFactor *= e.deltaMode ? 1 : 0.002;\n        }\n\n        zoomFactor = 2 ** zoomFactor;\n        const destZoomLevel = currSlide.currZoomLevel * zoomFactor;\n        currSlide.zoomTo(destZoomLevel, {\n          x: e.clientX,\n          y: e.clientY\n        });\n      }\n    } else {\n      // pan\n      if (currSlide.isPannable()) {\n        if (e.deltaMode === 1\n        /* DOM_DELTA_LINE */\n        ) {\n          // 18 - average line height\n          deltaX *= 18;\n          deltaY *= 18;\n        }\n\n        currSlide.panTo(currSlide.pan.x - deltaX, currSlide.pan.y - deltaY);\n      }\n    }\n  }\n\n}\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\n * @template T\n * @typedef {import('../types.js').Methods<T>} Methods<T>\n */\n\n/**\n * @typedef {Object} UIElementMarkupProps\n * @prop {boolean} [isCustomSVG]\n * @prop {string} inner\n * @prop {string} [outlineID]\n * @prop {number | string} [size]\n */\n\n/**\n * @typedef {Object} UIElementData\n * @prop {DefaultUIElements | string} [name]\n * @prop {string} [className]\n * @prop {UIElementMarkup} [html]\n * @prop {boolean} [isButton]\n * @prop {keyof HTMLElementTagNameMap} [tagName]\n * @prop {string} [title]\n * @prop {string} [ariaLabel]\n * @prop {(element: HTMLElement, pswp: PhotoSwipe) => void} [onInit]\n * @prop {Methods<PhotoSwipe> | ((e: MouseEvent, element: HTMLElement, pswp: PhotoSwipe) => void)} [onClick]\n * @prop {'bar' | 'wrapper' | 'root'} [appendTo]\n * @prop {number} [order]\n */\n\n/** @typedef {'arrowPrev' | 'arrowNext' | 'close' | 'zoom' | 'counter'} DefaultUIElements */\n\n/** @typedef {string | UIElementMarkupProps} UIElementMarkup */\n\n/**\n * @param {UIElementMarkup} [htmlData]\n * @returns {string}\n */\n\nfunction addElementHTML(htmlData) {\n  if (typeof htmlData === 'string') {\n    // Allow developers to provide full svg,\n    // For example:\n    // <svg viewBox=\"0 0 32 32\" width=\"32\" height=\"32\" aria-hidden=\"true\" class=\"pswp__icn\">\n    //   <path d=\"...\" />\n    //   <circle ... />\n    // </svg>\n    // Can also be any HTML string.\n    return htmlData;\n  }\n\n  if (!htmlData || !htmlData.isCustomSVG) {\n    return '';\n  }\n\n  const svgData = htmlData;\n  let out = '<svg aria-hidden=\"true\" class=\"pswp__icn\" viewBox=\"0 0 %d %d\" width=\"%d\" height=\"%d\">'; // replace all %d with size\n\n  out = out.split('%d').join(\n  /** @type {string} */\n  svgData.size || 32); // Icons may contain outline/shadow,\n  // to make it we \"clone\" base icon shape and add border to it.\n  // Icon itself and border are styled via CSS.\n  //\n  // Property shadowID defines ID of element that should be cloned.\n\n  if (svgData.outlineID) {\n    out += '<use class=\"pswp__icn-shadow\" xlink:href=\"#' + svgData.outlineID + '\"/>';\n  }\n\n  out += svgData.inner;\n  out += '</svg>';\n  return out;\n}\n\nclass UIElement {\n  /**\n   * @param {PhotoSwipe} pswp\n   * @param {UIElementData} data\n   */\n  constructor(pswp, data) {\n    var _container;\n\n    const name = data.name || data.className;\n    let elementHTML = data.html; // @ts-expect-error lookup only by `data.name` maybe?\n\n    if (pswp.options[name] === false) {\n      // exit if element is disabled from options\n      return;\n    } // Allow to override SVG icons from options\n    // @ts-expect-error lookup only by `data.name` maybe?\n\n\n    if (typeof pswp.options[name + 'SVG'] === 'string') {\n      // arrowPrevSVG\n      // arrowNextSVG\n      // closeSVG\n      // zoomSVG\n      // @ts-expect-error lookup only by `data.name` maybe?\n      elementHTML = pswp.options[name + 'SVG'];\n    }\n\n    pswp.dispatch('uiElementCreate', {\n      data\n    });\n    let className = '';\n\n    if (data.isButton) {\n      className += 'pswp__button ';\n      className += data.className || `pswp__button--${data.name}`;\n    } else {\n      className += data.className || `pswp__${data.name}`;\n    }\n\n    let tagName = data.isButton ? data.tagName || 'button' : data.tagName || 'div';\n    tagName =\n    /** @type {keyof HTMLElementTagNameMap} */\n    tagName.toLowerCase();\n    /** @type {HTMLElement} */\n\n    const element = createElement(className, tagName);\n\n    if (data.isButton) {\n      if (tagName === 'button') {\n        /** @type {HTMLButtonElement} */\n        element.type = 'button';\n      }\n\n      let {\n        title\n      } = data;\n      const {\n        ariaLabel\n      } = data; // @ts-expect-error lookup only by `data.name` maybe?\n\n      if (typeof pswp.options[name + 'Title'] === 'string') {\n        // @ts-expect-error lookup only by `data.name` maybe?\n        title = pswp.options[name + 'Title'];\n      }\n\n      if (title) {\n        element.title = title;\n      }\n\n      const ariaText = ariaLabel || title;\n\n      if (ariaText) {\n        element.setAttribute('aria-label', ariaText);\n      }\n    }\n\n    element.innerHTML = addElementHTML(elementHTML);\n\n    if (data.onInit) {\n      data.onInit(element, pswp);\n    }\n\n    if (data.onClick) {\n      element.onclick = e => {\n        if (typeof data.onClick === 'string') {\n          // @ts-ignore\n          pswp[data.onClick]();\n        } else if (typeof data.onClick === 'function') {\n          data.onClick(e, element, pswp);\n        }\n      };\n    } // Top bar is default position\n\n\n    const appendTo = data.appendTo || 'bar';\n    /** @type {HTMLElement | undefined} root element by default */\n\n    let container = pswp.element;\n\n    if (appendTo === 'bar') {\n      if (!pswp.topBar) {\n        pswp.topBar = createElement('pswp__top-bar pswp__hide-on-close', 'div', pswp.scrollWrap);\n      }\n\n      container = pswp.topBar;\n    } else {\n      // element outside of top bar gets a secondary class\n      // that makes element fade out on close\n      element.classList.add('pswp__hide-on-close');\n\n      if (appendTo === 'wrapper') {\n        container = pswp.scrollWrap;\n      }\n    }\n\n    (_container = container) === null || _container === void 0 || _container.appendChild(pswp.applyFilters('uiElement', element, data));\n  }\n\n}\n\n/*\n  Backward and forward arrow buttons\n */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/**\n *\n * @param {HTMLElement} element\n * @param {PhotoSwipe} pswp\n * @param {boolean} [isNextButton]\n */\nfunction initArrowButton(element, pswp, isNextButton) {\n  element.classList.add('pswp__button--arrow'); // TODO: this should point to a unique id for this instance\n\n  element.setAttribute('aria-controls', 'pswp__items');\n  pswp.on('change', () => {\n    if (!pswp.options.loop) {\n      if (isNextButton) {\n        /** @type {HTMLButtonElement} */\n        element.disabled = !(pswp.currIndex < pswp.getNumItems() - 1);\n      } else {\n        /** @type {HTMLButtonElement} */\n        element.disabled = !(pswp.currIndex > 0);\n      }\n    }\n  });\n}\n/** @type {UIElementData} */\n\n\nconst arrowPrev = {\n  name: 'arrowPrev',\n  className: 'pswp__button--arrow--prev',\n  title: 'Previous',\n  order: 10,\n  isButton: true,\n  appendTo: 'wrapper',\n  html: {\n    isCustomSVG: true,\n    size: 60,\n    inner: '<path d=\"M29 43l-3 3-16-16 16-16 3 3-13 13 13 13z\" id=\"pswp__icn-arrow\"/>',\n    outlineID: 'pswp__icn-arrow'\n  },\n  onClick: 'prev',\n  onInit: initArrowButton\n};\n/** @type {UIElementData} */\n\nconst arrowNext = {\n  name: 'arrowNext',\n  className: 'pswp__button--arrow--next',\n  title: 'Next',\n  order: 11,\n  isButton: true,\n  appendTo: 'wrapper',\n  html: {\n    isCustomSVG: true,\n    size: 60,\n    inner: '<use xlink:href=\"#pswp__icn-arrow\"/>',\n    outlineID: 'pswp__icn-arrow'\n  },\n  onClick: 'next',\n  onInit: (el, pswp) => {\n    initArrowButton(el, pswp, true);\n  }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst closeButton = {\n  name: 'close',\n  title: 'Close',\n  order: 20,\n  isButton: true,\n  html: {\n    isCustomSVG: true,\n    inner: '<path d=\"M24 10l-2-2-6 6-6-6-2 2 6 6-6 6 2 2 6-6 6 6 2-2-6-6z\" id=\"pswp__icn-close\"/>',\n    outlineID: 'pswp__icn-close'\n  },\n  onClick: 'close'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst zoomButton = {\n  name: 'zoom',\n  title: 'Zoom',\n  order: 10,\n  isButton: true,\n  html: {\n    isCustomSVG: true,\n    // eslint-disable-next-line max-len\n    inner: '<path d=\"M17.426 19.926a6 6 0 1 1 1.5-1.5L23 22.5 21.5 24l-4.074-4.074z\" id=\"pswp__icn-zoom\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-h\" d=\"M11 16v-2h6v2z\"/>' + '<path fill=\"currentColor\" class=\"pswp__zoom-icn-bar-v\" d=\"M13 12h2v6h-2z\"/>',\n    outlineID: 'pswp__icn-zoom'\n  },\n  onClick: 'toggleZoom'\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst loadingIndicator = {\n  name: 'preloader',\n  appendTo: 'bar',\n  order: 7,\n  html: {\n    isCustomSVG: true,\n    // eslint-disable-next-line max-len\n    inner: '<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.2 16a5.2 5.2 0 1 1-5.2-5.2V8a8 8 0 1 0 8 8h-2.8Z\" id=\"pswp__icn-loading\"/>',\n    outlineID: 'pswp__icn-loading'\n  },\n  onInit: (indicatorElement, pswp) => {\n    /** @type {boolean | undefined} */\n    let isVisible;\n    /** @type {NodeJS.Timeout | null} */\n\n    let delayTimeout = null;\n    /**\n     * @param {string} className\n     * @param {boolean} add\n     */\n\n    const toggleIndicatorClass = (className, add) => {\n      indicatorElement.classList.toggle('pswp__preloader--' + className, add);\n    };\n    /**\n     * @param {boolean} visible\n     */\n\n\n    const setIndicatorVisibility = visible => {\n      if (isVisible !== visible) {\n        isVisible = visible;\n        toggleIndicatorClass('active', visible);\n      }\n    };\n\n    const updatePreloaderVisibility = () => {\n      var _pswp$currSlide;\n\n      if (!((_pswp$currSlide = pswp.currSlide) !== null && _pswp$currSlide !== void 0 && _pswp$currSlide.content.isLoading())) {\n        setIndicatorVisibility(false);\n\n        if (delayTimeout) {\n          clearTimeout(delayTimeout);\n          delayTimeout = null;\n        }\n\n        return;\n      }\n\n      if (!delayTimeout) {\n        // display loading indicator with delay\n        delayTimeout = setTimeout(() => {\n          var _pswp$currSlide2;\n\n          setIndicatorVisibility(Boolean((_pswp$currSlide2 = pswp.currSlide) === null || _pswp$currSlide2 === void 0 ? void 0 : _pswp$currSlide2.content.isLoading()));\n          delayTimeout = null;\n        }, pswp.options.preloaderDelay);\n      }\n    };\n\n    pswp.on('change', updatePreloaderVisibility);\n    pswp.on('loadComplete', e => {\n      if (pswp.currSlide === e.slide) {\n        updatePreloaderVisibility();\n      }\n    }); // expose the method\n\n    if (pswp.ui) {\n      pswp.ui.updatePreloaderVisibility = updatePreloaderVisibility;\n    }\n  }\n};\n\n/** @type {import('./ui-element.js').UIElementData} UIElementData */\nconst counterIndicator = {\n  name: 'counter',\n  order: 5,\n  onInit: (counterElement, pswp) => {\n    pswp.on('change', () => {\n      counterElement.innerText = pswp.currIndex + 1 + pswp.options.indexIndicatorSep + pswp.getNumItems();\n    });\n  }\n};\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./ui-element.js').UIElementData} UIElementData */\n\n/**\n * Set special class on element when image is zoomed.\n *\n * By default, it is used to adjust\n * zoom icon and zoom cursor via CSS.\n *\n * @param {HTMLElement} el\n * @param {boolean} isZoomedIn\n */\n\nfunction setZoomedIn(el, isZoomedIn) {\n  el.classList.toggle('pswp--zoomed-in', isZoomedIn);\n}\n\nclass UI {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    this.isRegistered = false;\n    /** @type {UIElementData[]} */\n\n    this.uiElementsData = [];\n    /** @type {(UIElement | UIElementData)[]} */\n\n    this.items = [];\n    /** @type {() => void} */\n\n    this.updatePreloaderVisibility = () => {};\n    /**\n     * @private\n     * @type {number | undefined}\n     */\n\n\n    this._lastUpdatedZoomLevel = undefined;\n  }\n\n  init() {\n    const {\n      pswp\n    } = this;\n    this.isRegistered = false;\n    this.uiElementsData = [closeButton, arrowPrev, arrowNext, zoomButton, loadingIndicator, counterIndicator];\n    pswp.dispatch('uiRegister'); // sort by order\n\n    this.uiElementsData.sort((a, b) => {\n      // default order is 0\n      return (a.order || 0) - (b.order || 0);\n    });\n    this.items = [];\n    this.isRegistered = true;\n    this.uiElementsData.forEach(uiElementData => {\n      this.registerElement(uiElementData);\n    });\n    pswp.on('change', () => {\n      var _pswp$element;\n\n      (_pswp$element = pswp.element) === null || _pswp$element === void 0 || _pswp$element.classList.toggle('pswp--one-slide', pswp.getNumItems() === 1);\n    });\n    pswp.on('zoomPanUpdate', () => this._onZoomPanUpdate());\n  }\n  /**\n   * @param {UIElementData} elementData\n   */\n\n\n  registerElement(elementData) {\n    if (this.isRegistered) {\n      this.items.push(new UIElement(this.pswp, elementData));\n    } else {\n      this.uiElementsData.push(elementData);\n    }\n  }\n  /**\n   * Fired each time zoom or pan position is changed.\n   * Update classes that control visibility of zoom button and cursor icon.\n   *\n   * @private\n   */\n\n\n  _onZoomPanUpdate() {\n    const {\n      template,\n      currSlide,\n      options\n    } = this.pswp;\n\n    if (this.pswp.opener.isClosing || !template || !currSlide) {\n      return;\n    }\n\n    let {\n      currZoomLevel\n    } = currSlide; // if not open yet - check against initial zoom level\n\n    if (!this.pswp.opener.isOpen) {\n      currZoomLevel = currSlide.zoomLevels.initial;\n    }\n\n    if (currZoomLevel === this._lastUpdatedZoomLevel) {\n      return;\n    }\n\n    this._lastUpdatedZoomLevel = currZoomLevel;\n    const currZoomLevelDiff = currSlide.zoomLevels.initial - currSlide.zoomLevels.secondary; // Initial and secondary zoom levels are almost equal\n\n    if (Math.abs(currZoomLevelDiff) < 0.01 || !currSlide.isZoomable()) {\n      // disable zoom\n      setZoomedIn(template, false);\n      template.classList.remove('pswp--zoom-allowed');\n      return;\n    }\n\n    template.classList.add('pswp--zoom-allowed');\n    const potentialZoomLevel = currZoomLevel === currSlide.zoomLevels.initial ? currSlide.zoomLevels.secondary : currSlide.zoomLevels.initial;\n    setZoomedIn(template, potentialZoomLevel <= currZoomLevel);\n\n    if (options.imageClickAction === 'zoom' || options.imageClickAction === 'zoom-or-close') {\n      template.classList.add('pswp--click-to-zoom');\n    }\n  }\n\n}\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {{ x: number; y: number; w: number; innerRect?: { w: number; h: number; x: number; y: number } }} Bounds */\n\n/**\n * @param {HTMLElement} el\n * @returns Bounds\n */\nfunction getBoundsByElement(el) {\n  const thumbAreaRect = el.getBoundingClientRect();\n  return {\n    x: thumbAreaRect.left,\n    y: thumbAreaRect.top,\n    w: thumbAreaRect.width\n  };\n}\n/**\n * @param {HTMLElement} el\n * @param {number} imageWidth\n * @param {number} imageHeight\n * @returns Bounds\n */\n\n\nfunction getCroppedBoundsByElement(el, imageWidth, imageHeight) {\n  const thumbAreaRect = el.getBoundingClientRect(); // fill image into the area\n  // (do they same as object-fit:cover does to retrieve coordinates)\n\n  const hRatio = thumbAreaRect.width / imageWidth;\n  const vRatio = thumbAreaRect.height / imageHeight;\n  const fillZoomLevel = hRatio > vRatio ? hRatio : vRatio;\n  const offsetX = (thumbAreaRect.width - imageWidth * fillZoomLevel) / 2;\n  const offsetY = (thumbAreaRect.height - imageHeight * fillZoomLevel) / 2;\n  /**\n   * Coordinates of the image,\n   * as if it was not cropped,\n   * height is calculated automatically\n   *\n   * @type {Bounds}\n   */\n\n  const bounds = {\n    x: thumbAreaRect.left + offsetX,\n    y: thumbAreaRect.top + offsetY,\n    w: imageWidth * fillZoomLevel\n  }; // Coordinates of inner crop area\n  // relative to the image\n\n  bounds.innerRect = {\n    w: thumbAreaRect.width,\n    h: thumbAreaRect.height,\n    x: offsetX,\n    y: offsetY\n  };\n  return bounds;\n}\n/**\n * Get dimensions of thumbnail image\n * (click on which opens photoswipe or closes photoswipe to)\n *\n * @param {number} index\n * @param {SlideData} itemData\n * @param {PhotoSwipe} instance PhotoSwipe instance\n * @returns {Bounds | undefined}\n */\n\n\nfunction getThumbBounds(index, itemData, instance) {\n  // legacy event, before filters were introduced\n  const event = instance.dispatch('thumbBounds', {\n    index,\n    itemData,\n    instance\n  }); // @ts-expect-error\n\n  if (event.thumbBounds) {\n    // @ts-expect-error\n    return event.thumbBounds;\n  }\n\n  const {\n    element\n  } = itemData;\n  /** @type {Bounds | undefined} */\n\n  let thumbBounds;\n  /** @type {HTMLElement | null | undefined} */\n\n  let thumbnail;\n\n  if (element && instance.options.thumbSelector !== false) {\n    const thumbSelector = instance.options.thumbSelector || 'img';\n    thumbnail = element.matches(thumbSelector) ? element :\n    /** @type {HTMLElement | null} */\n    element.querySelector(thumbSelector);\n  }\n\n  thumbnail = instance.applyFilters('thumbEl', thumbnail, itemData, index);\n\n  if (thumbnail) {\n    if (!itemData.thumbCropped) {\n      thumbBounds = getBoundsByElement(thumbnail);\n    } else {\n      thumbBounds = getCroppedBoundsByElement(thumbnail, itemData.width || itemData.w || 0, itemData.height || itemData.h || 0);\n    }\n  }\n\n  return instance.applyFilters('thumbBounds', thumbBounds, itemData, index);\n}\n\n/** @typedef {import('../lightbox/lightbox.js').default} PhotoSwipeLightbox */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('../photoswipe.js').PhotoSwipeOptions} PhotoSwipeOptions */\n\n/** @typedef {import('../photoswipe.js').DataSource} DataSource */\n\n/** @typedef {import('../ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('../slide/content.js').default} ContentDefault */\n\n/** @typedef {import('../slide/slide.js').default} Slide */\n\n/** @typedef {import('../slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('../slide/zoom-level.js').default} ZoomLevel */\n\n/** @typedef {import('../slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/**\n * Allow adding an arbitrary props to the Content\n * https://photoswipe.com/custom-content/#using-webp-image-format\n * @typedef {ContentDefault & Record<string, any>} Content\n */\n\n/** @typedef {{ x?: number; y?: number }} Point */\n\n/**\n * @typedef {Object} PhotoSwipeEventsMap https://photoswipe.com/events/\n *\n *\n * https://photoswipe.com/adding-ui-elements/\n *\n * @prop {undefined} uiRegister\n * @prop {{ data: UIElementData }} uiElementCreate\n *\n *\n * https://photoswipe.com/events/#initialization-events\n *\n * @prop {undefined} beforeOpen\n * @prop {undefined} firstUpdate\n * @prop {undefined} initialLayout\n * @prop {undefined} change\n * @prop {undefined} afterInit\n * @prop {undefined} bindEvents\n *\n *\n * https://photoswipe.com/events/#opening-or-closing-transition-events\n *\n * @prop {undefined} openingAnimationStart\n * @prop {undefined} openingAnimationEnd\n * @prop {undefined} closingAnimationStart\n * @prop {undefined} closingAnimationEnd\n *\n *\n * https://photoswipe.com/events/#closing-events\n *\n * @prop {undefined} close\n * @prop {undefined} destroy\n *\n *\n * https://photoswipe.com/events/#pointer-and-gesture-events\n *\n * @prop {{ originalEvent: PointerEvent }} pointerDown\n * @prop {{ originalEvent: PointerEvent }} pointerMove\n * @prop {{ originalEvent: PointerEvent }} pointerUp\n * @prop {{ bgOpacity: number }} pinchClose can be default prevented\n * @prop {{ panY: number }} verticalDrag can be default prevented\n *\n *\n * https://photoswipe.com/events/#slide-content-events\n *\n * @prop {{ content: Content }} contentInit\n * @prop {{ content: Content; isLazy: boolean }} contentLoad can be default prevented\n * @prop {{ content: Content; isLazy: boolean }} contentLoadImage can be default prevented\n * @prop {{ content: Content; slide: Slide; isError?: boolean }} loadComplete\n * @prop {{ content: Content; slide: Slide }} loadError\n * @prop {{ content: Content; width: number; height: number }} contentResize can be default prevented\n * @prop {{ content: Content; width: number; height: number; slide: Slide }} imageSizeChange\n * @prop {{ content: Content }} contentLazyLoad can be default prevented\n * @prop {{ content: Content }} contentAppend can be default prevented\n * @prop {{ content: Content }} contentActivate can be default prevented\n * @prop {{ content: Content }} contentDeactivate can be default prevented\n * @prop {{ content: Content }} contentRemove can be default prevented\n * @prop {{ content: Content }} contentDestroy can be default prevented\n *\n *\n * undocumented\n *\n * @prop {{ point: Point; originalEvent: PointerEvent }} imageClickAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} bgClickAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} tapAction can be default prevented\n * @prop {{ point: Point; originalEvent: PointerEvent }} doubleTapAction can be default prevented\n *\n * @prop {{ originalEvent: KeyboardEvent }} keydown can be default prevented\n * @prop {{ x: number; dragging: boolean }} moveMainScroll\n * @prop {{ slide: Slide }} firstZoomPan\n * @prop {{ slide: Slide | undefined, data: SlideData, index: number }} gettingData\n * @prop {undefined} beforeResize\n * @prop {undefined} resize\n * @prop {undefined} viewportSize\n * @prop {undefined} updateScrollOffset\n * @prop {{ slide: Slide }} slideInit\n * @prop {{ slide: Slide }} afterSetContent\n * @prop {{ slide: Slide }} slideLoad\n * @prop {{ slide: Slide }} appendHeavy can be default prevented\n * @prop {{ slide: Slide }} appendHeavyContent\n * @prop {{ slide: Slide }} slideActivate\n * @prop {{ slide: Slide }} slideDeactivate\n * @prop {{ slide: Slide }} slideDestroy\n * @prop {{ destZoomLevel: number, centerPoint: Point | undefined, transitionDuration: number | false | undefined }} beforeZoomTo\n * @prop {{ slide: Slide }} zoomPanUpdate\n * @prop {{ slide: Slide }} initialZoomPan\n * @prop {{ slide: Slide }} calcSlideSize\n * @prop {undefined} resolutionChanged\n * @prop {{ originalEvent: WheelEvent }} wheel can be default prevented\n * @prop {{ content: Content }} contentAppendImage can be default prevented\n * @prop {{ index: number; itemData: SlideData }} lazyLoadSlide can be default prevented\n * @prop {undefined} lazyLoad\n * @prop {{ slide: Slide }} calcBounds\n * @prop {{ zoomLevels: ZoomLevel, slideData: SlideData }} zoomLevelsUpdate\n *\n *\n * legacy\n *\n * @prop {undefined} init\n * @prop {undefined} initialZoomIn\n * @prop {undefined} initialZoomOut\n * @prop {undefined} initialZoomInEnd\n * @prop {undefined} initialZoomOutEnd\n * @prop {{ dataSource: DataSource | undefined, numItems: number }} numItems\n * @prop {{ itemData: SlideData; index: number }} itemData\n * @prop {{ index: number, itemData: SlideData, instance: PhotoSwipe }} thumbBounds\n */\n\n/**\n * @typedef {Object} PhotoSwipeFiltersMap https://photoswipe.com/filters/\n *\n * @prop {(numItems: number, dataSource: DataSource | undefined) => number} numItems\n * Modify the total amount of slides. Example on Data sources page.\n * https://photoswipe.com/filters/#numitems\n *\n * @prop {(itemData: SlideData, index: number) => SlideData} itemData\n * Modify slide item data. Example on Data sources page.\n * https://photoswipe.com/filters/#itemdata\n *\n * @prop {(itemData: SlideData, element: HTMLElement, linkEl: HTMLAnchorElement) => SlideData} domItemData\n * Modify item data when it's parsed from DOM element. Example on Data sources page.\n * https://photoswipe.com/filters/#domitemdata\n *\n * @prop {(clickedIndex: number, e: MouseEvent, instance: PhotoSwipeLightbox) => number} clickedIndex\n * Modify clicked gallery item index.\n * https://photoswipe.com/filters/#clickedindex\n *\n * @prop {(placeholderSrc: string | false, content: Content) => string | false} placeholderSrc\n * Modify placeholder image source.\n * https://photoswipe.com/filters/#placeholdersrc\n *\n * @prop {(isContentLoading: boolean, content: Content) => boolean} isContentLoading\n * Modify if the content is currently loading.\n * https://photoswipe.com/filters/#iscontentloading\n *\n * @prop {(isContentZoomable: boolean, content: Content) => boolean} isContentZoomable\n * Modify if the content can be zoomed.\n * https://photoswipe.com/filters/#iscontentzoomable\n *\n * @prop {(useContentPlaceholder: boolean, content: Content) => boolean} useContentPlaceholder\n * Modify if the placeholder should be used for the content.\n * https://photoswipe.com/filters/#usecontentplaceholder\n *\n * @prop {(isKeepingPlaceholder: boolean, content: Content) => boolean} isKeepingPlaceholder\n * Modify if the placeholder should be kept after the content is loaded.\n * https://photoswipe.com/filters/#iskeepingplaceholder\n *\n *\n * @prop {(contentErrorElement: HTMLElement, content: Content) => HTMLElement} contentErrorElement\n * Modify an element when the content has error state (for example, if image cannot be loaded).\n * https://photoswipe.com/filters/#contenterrorelement\n *\n * @prop {(element: HTMLElement, data: UIElementData) => HTMLElement} uiElement\n * Modify a UI element that's being created.\n * https://photoswipe.com/filters/#uielement\n *\n * @prop {(thumbnail: HTMLElement | null | undefined, itemData: SlideData, index: number) => HTMLElement} thumbEl\n * Modify the thumbnail element from which opening zoom animation starts or ends.\n * https://photoswipe.com/filters/#thumbel\n *\n * @prop {(thumbBounds: Bounds | undefined, itemData: SlideData, index: number) => Bounds} thumbBounds\n * Modify the thumbnail bounds from which opening zoom animation starts or ends.\n * https://photoswipe.com/filters/#thumbbounds\n *\n * @prop {(srcsetSizesWidth: number, content: Content) => number} srcsetSizesWidth\n *\n * @prop {(preventPointerEvent: boolean, event: PointerEvent, pointerType: string) => boolean} preventPointerEvent\n *\n */\n\n/**\n * @template {keyof PhotoSwipeFiltersMap} T\n * @typedef {{ fn: PhotoSwipeFiltersMap[T], priority: number }} Filter\n */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {PhotoSwipeEventsMap[T] extends undefined ? PhotoSwipeEvent<T> : PhotoSwipeEvent<T> & PhotoSwipeEventsMap[T]} AugmentedEvent\n */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {(event: AugmentedEvent<T>) => void} EventCallback\n */\n\n/**\n * Base PhotoSwipe event object\n *\n * @template {keyof PhotoSwipeEventsMap} T\n */\nclass PhotoSwipeEvent {\n  /**\n   * @param {T} type\n   * @param {PhotoSwipeEventsMap[T]} [details]\n   */\n  constructor(type, details) {\n    this.type = type;\n    this.defaultPrevented = false;\n\n    if (details) {\n      Object.assign(this, details);\n    }\n  }\n\n  preventDefault() {\n    this.defaultPrevented = true;\n  }\n\n}\n/**\n * PhotoSwipe base class that can listen and dispatch for events.\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox, extended by base.js\n */\n\n\nclass Eventable {\n  constructor() {\n    /**\n     * @type {{ [T in keyof PhotoSwipeEventsMap]?: ((event: AugmentedEvent<T>) => void)[] }}\n     */\n    this._listeners = {};\n    /**\n     * @type {{ [T in keyof PhotoSwipeFiltersMap]?: Filter<T>[] }}\n     */\n\n    this._filters = {};\n    /** @type {PhotoSwipe | undefined} */\n\n    this.pswp = undefined;\n    /** @type {PhotoSwipeOptions | undefined} */\n\n    this.options = undefined;\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {PhotoSwipeFiltersMap[T]} fn\n   * @param {number} priority\n   */\n\n\n  addFilter(name, fn, priority = 100) {\n    var _this$_filters$name, _this$_filters$name2, _this$pswp;\n\n    if (!this._filters[name]) {\n      this._filters[name] = [];\n    }\n\n    (_this$_filters$name = this._filters[name]) === null || _this$_filters$name === void 0 || _this$_filters$name.push({\n      fn,\n      priority\n    });\n    (_this$_filters$name2 = this._filters[name]) === null || _this$_filters$name2 === void 0 || _this$_filters$name2.sort((f1, f2) => f1.priority - f2.priority);\n    (_this$pswp = this.pswp) === null || _this$pswp === void 0 || _this$pswp.addFilter(name, fn, priority);\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {PhotoSwipeFiltersMap[T]} fn\n   */\n\n\n  removeFilter(name, fn) {\n    if (this._filters[name]) {\n      // @ts-expect-error\n      this._filters[name] = this._filters[name].filter(filter => filter.fn !== fn);\n    }\n\n    if (this.pswp) {\n      this.pswp.removeFilter(name, fn);\n    }\n  }\n  /**\n   * @template {keyof PhotoSwipeFiltersMap} T\n   * @param {T} name\n   * @param {Parameters<PhotoSwipeFiltersMap[T]>} args\n   * @returns {Parameters<PhotoSwipeFiltersMap[T]>[0]}\n   */\n\n\n  applyFilters(name, ...args) {\n    var _this$_filters$name3;\n\n    (_this$_filters$name3 = this._filters[name]) === null || _this$_filters$name3 === void 0 || _this$_filters$name3.forEach(filter => {\n      // @ts-expect-error\n      args[0] = filter.fn.apply(this, args);\n    });\n    return args[0];\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {EventCallback<T>} fn\n   */\n\n\n  on(name, fn) {\n    var _this$_listeners$name, _this$pswp2;\n\n    if (!this._listeners[name]) {\n      this._listeners[name] = [];\n    }\n\n    (_this$_listeners$name = this._listeners[name]) === null || _this$_listeners$name === void 0 || _this$_listeners$name.push(fn); // When binding events to lightbox,\n    // also bind events to PhotoSwipe Core,\n    // if it's open.\n\n    (_this$pswp2 = this.pswp) === null || _this$pswp2 === void 0 || _this$pswp2.on(name, fn);\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {EventCallback<T>} fn\n   */\n\n\n  off(name, fn) {\n    var _this$pswp3;\n\n    if (this._listeners[name]) {\n      // @ts-expect-error\n      this._listeners[name] = this._listeners[name].filter(listener => fn !== listener);\n    }\n\n    (_this$pswp3 = this.pswp) === null || _this$pswp3 === void 0 || _this$pswp3.off(name, fn);\n  }\n  /**\n   * @template {keyof PhotoSwipeEventsMap} T\n   * @param {T} name\n   * @param {PhotoSwipeEventsMap[T]} [details]\n   * @returns {AugmentedEvent<T>}\n   */\n\n\n  dispatch(name, details) {\n    var _this$_listeners$name2;\n\n    if (this.pswp) {\n      return this.pswp.dispatch(name, details);\n    }\n\n    const event =\n    /** @type {AugmentedEvent<T>} */\n    new PhotoSwipeEvent(name, details);\n    (_this$_listeners$name2 = this._listeners[name]) === null || _this$_listeners$name2 === void 0 || _this$_listeners$name2.forEach(listener => {\n      listener.call(this, event);\n    });\n    return event;\n  }\n\n}\n\nclass Placeholder {\n  /**\n   * @param {string | false} imageSrc\n   * @param {HTMLElement} container\n   */\n  constructor(imageSrc, container) {\n    // Create placeholder\n    // (stretched thumbnail or simple div behind the main image)\n\n    /** @type {HTMLImageElement | HTMLDivElement | null} */\n    this.element = createElement('pswp__img pswp__img--placeholder', imageSrc ? 'img' : 'div', container);\n\n    if (imageSrc) {\n      const imgEl =\n      /** @type {HTMLImageElement} */\n      this.element;\n      imgEl.decoding = 'async';\n      imgEl.alt = '';\n      imgEl.src = imageSrc;\n      imgEl.setAttribute('role', 'presentation');\n    }\n\n    this.element.setAttribute('aria-hidden', 'true');\n  }\n  /**\n   * @param {number} width\n   * @param {number} height\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.element.tagName === 'IMG') {\n      // Use transform scale() to modify img placeholder size\n      // (instead of changing width/height directly).\n      // This helps with performance, specifically in iOS15 Safari.\n      setWidthHeight(this.element, 250, 'auto');\n      this.element.style.transformOrigin = '0 0';\n      this.element.style.transform = toTransformString(0, 0, width / 250);\n    } else {\n      setWidthHeight(this.element, width, height);\n    }\n  }\n\n  destroy() {\n    var _this$element;\n\n    if ((_this$element = this.element) !== null && _this$element !== void 0 && _this$element.parentNode) {\n      this.element.remove();\n    }\n\n    this.element = null;\n  }\n\n}\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../util/util.js').LoadState} LoadState */\n\nclass Content {\n  /**\n   * @param {SlideData} itemData Slide data\n   * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\n   * @param {number} index\n   */\n  constructor(itemData, instance, index) {\n    this.instance = instance;\n    this.data = itemData;\n    this.index = index;\n    /** @type {HTMLImageElement | HTMLDivElement | undefined} */\n\n    this.element = undefined;\n    /** @type {Placeholder | undefined} */\n\n    this.placeholder = undefined;\n    /** @type {Slide | undefined} */\n\n    this.slide = undefined;\n    this.displayedImageWidth = 0;\n    this.displayedImageHeight = 0;\n    this.width = Number(this.data.w) || Number(this.data.width) || 0;\n    this.height = Number(this.data.h) || Number(this.data.height) || 0;\n    this.isAttached = false;\n    this.hasSlide = false;\n    this.isDecoding = false;\n    /** @type {LoadState} */\n\n    this.state = LOAD_STATE.IDLE;\n\n    if (this.data.type) {\n      this.type = this.data.type;\n    } else if (this.data.src) {\n      this.type = 'image';\n    } else {\n      this.type = 'html';\n    }\n\n    this.instance.dispatch('contentInit', {\n      content: this\n    });\n  }\n\n  removePlaceholder() {\n    if (this.placeholder && !this.keepPlaceholder()) {\n      // With delay, as image might be loaded, but not rendered\n      setTimeout(() => {\n        if (this.placeholder) {\n          this.placeholder.destroy();\n          this.placeholder = undefined;\n        }\n      }, 1000);\n    }\n  }\n  /**\n   * Preload content\n   *\n   * @param {boolean} isLazy\n   * @param {boolean} [reload]\n   */\n\n\n  load(isLazy, reload) {\n    if (this.slide && this.usePlaceholder()) {\n      if (!this.placeholder) {\n        const placeholderSrc = this.instance.applyFilters('placeholderSrc', // use  image-based placeholder only for the first slide,\n        // as rendering (even small stretched thumbnail) is an expensive operation\n        this.data.msrc && this.slide.isFirstSlide ? this.data.msrc : false, this);\n        this.placeholder = new Placeholder(placeholderSrc, this.slide.container);\n      } else {\n        const placeholderEl = this.placeholder.element; // Add placeholder to DOM if it was already created\n\n        if (placeholderEl && !placeholderEl.parentElement) {\n          this.slide.container.prepend(placeholderEl);\n        }\n      }\n    }\n\n    if (this.element && !reload) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentLoad', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.isImageContent()) {\n      this.element = createElement('pswp__img', 'img'); // Start loading only after width is defined, as sizes might depend on it.\n      // Due to Safari feature, we must define sizes before srcset.\n\n      if (this.displayedImageWidth) {\n        this.loadImage(isLazy);\n      }\n    } else {\n      this.element = createElement('pswp__content', 'div');\n      this.element.innerHTML = this.data.html || '';\n    }\n\n    if (reload && this.slide) {\n      this.slide.updateContentSize(true);\n    }\n  }\n  /**\n   * Preload image\n   *\n   * @param {boolean} isLazy\n   */\n\n\n  loadImage(isLazy) {\n    var _this$data$src, _this$data$alt;\n\n    if (!this.isImageContent() || !this.element || this.instance.dispatch('contentLoadImage', {\n      content: this,\n      isLazy\n    }).defaultPrevented) {\n      return;\n    }\n\n    const imageElement =\n    /** @type HTMLImageElement */\n    this.element;\n    this.updateSrcsetSizes();\n\n    if (this.data.srcset) {\n      imageElement.srcset = this.data.srcset;\n    }\n\n    imageElement.src = (_this$data$src = this.data.src) !== null && _this$data$src !== void 0 ? _this$data$src : '';\n    imageElement.alt = (_this$data$alt = this.data.alt) !== null && _this$data$alt !== void 0 ? _this$data$alt : '';\n    this.state = LOAD_STATE.LOADING;\n\n    if (imageElement.complete) {\n      this.onLoaded();\n    } else {\n      imageElement.onload = () => {\n        this.onLoaded();\n      };\n\n      imageElement.onerror = () => {\n        this.onError();\n      };\n    }\n  }\n  /**\n   * Assign slide to content\n   *\n   * @param {Slide} slide\n   */\n\n\n  setSlide(slide) {\n    this.slide = slide;\n    this.hasSlide = true;\n    this.instance = slide.pswp; // todo: do we need to unset slide?\n  }\n  /**\n   * Content load success handler\n   */\n\n\n  onLoaded() {\n    this.state = LOAD_STATE.LOADED;\n\n    if (this.slide && this.element) {\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        content: this\n      }); // if content is reloaded\n\n      if (this.slide.isActive && this.slide.heavyAppended && !this.element.parentNode) {\n        this.append();\n        this.slide.updateContentSize(true);\n      }\n\n      if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n        this.removePlaceholder();\n      }\n    }\n  }\n  /**\n   * Content load error handler\n   */\n\n\n  onError() {\n    this.state = LOAD_STATE.ERROR;\n\n    if (this.slide) {\n      this.displayError();\n      this.instance.dispatch('loadComplete', {\n        slide: this.slide,\n        isError: true,\n        content: this\n      });\n      this.instance.dispatch('loadError', {\n        slide: this.slide,\n        content: this\n      });\n    }\n  }\n  /**\n   * @returns {Boolean} If the content is currently loading\n   */\n\n\n  isLoading() {\n    return this.instance.applyFilters('isContentLoading', this.state === LOAD_STATE.LOADING, this);\n  }\n  /**\n   * @returns {Boolean} If the content is in error state\n   */\n\n\n  isError() {\n    return this.state === LOAD_STATE.ERROR;\n  }\n  /**\n   * @returns {boolean} If the content is image\n   */\n\n\n  isImageContent() {\n    return this.type === 'image';\n  }\n  /**\n   * Update content size\n   *\n   * @param {Number} width\n   * @param {Number} height\n   */\n\n\n  setDisplayedSize(width, height) {\n    if (!this.element) {\n      return;\n    }\n\n    if (this.placeholder) {\n      this.placeholder.setDisplayedSize(width, height);\n    }\n\n    if (this.instance.dispatch('contentResize', {\n      content: this,\n      width,\n      height\n    }).defaultPrevented) {\n      return;\n    }\n\n    setWidthHeight(this.element, width, height);\n\n    if (this.isImageContent() && !this.isError()) {\n      const isInitialSizeUpdate = !this.displayedImageWidth && width;\n      this.displayedImageWidth = width;\n      this.displayedImageHeight = height;\n\n      if (isInitialSizeUpdate) {\n        this.loadImage(false);\n      } else {\n        this.updateSrcsetSizes();\n      }\n\n      if (this.slide) {\n        this.instance.dispatch('imageSizeChange', {\n          slide: this.slide,\n          width,\n          height,\n          content: this\n        });\n      }\n    }\n  }\n  /**\n   * @returns {boolean} If the content can be zoomed\n   */\n\n\n  isZoomable() {\n    return this.instance.applyFilters('isContentZoomable', this.isImageContent() && this.state !== LOAD_STATE.ERROR, this);\n  }\n  /**\n   * Update image srcset sizes attribute based on width and height\n   */\n\n\n  updateSrcsetSizes() {\n    // Handle srcset sizes attribute.\n    //\n    // Never lower quality, if it was increased previously.\n    // Chrome does this automatically, Firefox and Safari do not,\n    // so we store largest used size in dataset.\n    if (!this.isImageContent() || !this.element || !this.data.srcset) {\n      return;\n    }\n\n    const image =\n    /** @type HTMLImageElement */\n    this.element;\n    const sizesWidth = this.instance.applyFilters('srcsetSizesWidth', this.displayedImageWidth, this);\n\n    if (!image.dataset.largestUsedSize || sizesWidth > parseInt(image.dataset.largestUsedSize, 10)) {\n      image.sizes = sizesWidth + 'px';\n      image.dataset.largestUsedSize = String(sizesWidth);\n    }\n  }\n  /**\n   * @returns {boolean} If content should use a placeholder (from msrc by default)\n   */\n\n\n  usePlaceholder() {\n    return this.instance.applyFilters('useContentPlaceholder', this.isImageContent(), this);\n  }\n  /**\n   * Preload content with lazy-loading param\n   */\n\n\n  lazyLoad() {\n    if (this.instance.dispatch('contentLazyLoad', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.load(true);\n  }\n  /**\n   * @returns {boolean} If placeholder should be kept after content is loaded\n   */\n\n\n  keepPlaceholder() {\n    return this.instance.applyFilters('isKeepingPlaceholder', this.isLoading(), this);\n  }\n  /**\n   * Destroy the content\n   */\n\n\n  destroy() {\n    this.hasSlide = false;\n    this.slide = undefined;\n\n    if (this.instance.dispatch('contentDestroy', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    this.remove();\n\n    if (this.placeholder) {\n      this.placeholder.destroy();\n      this.placeholder = undefined;\n    }\n\n    if (this.isImageContent() && this.element) {\n      this.element.onload = null;\n      this.element.onerror = null;\n      this.element = undefined;\n    }\n  }\n  /**\n   * Display error message\n   */\n\n\n  displayError() {\n    if (this.slide) {\n      var _this$instance$option, _this$instance$option2;\n\n      let errorMsgEl = createElement('pswp__error-msg', 'div');\n      errorMsgEl.innerText = (_this$instance$option = (_this$instance$option2 = this.instance.options) === null || _this$instance$option2 === void 0 ? void 0 : _this$instance$option2.errorMsg) !== null && _this$instance$option !== void 0 ? _this$instance$option : '';\n      errorMsgEl =\n      /** @type {HTMLDivElement} */\n      this.instance.applyFilters('contentErrorElement', errorMsgEl, this);\n      this.element = createElement('pswp__content pswp__error-msg-container', 'div');\n      this.element.appendChild(errorMsgEl);\n      this.slide.container.innerText = '';\n      this.slide.container.appendChild(this.element);\n      this.slide.updateContentSize(true);\n      this.removePlaceholder();\n    }\n  }\n  /**\n   * Append the content\n   */\n\n\n  append() {\n    if (this.isAttached || !this.element) {\n      return;\n    }\n\n    this.isAttached = true;\n\n    if (this.state === LOAD_STATE.ERROR) {\n      this.displayError();\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppend', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    const supportsDecode = ('decode' in this.element);\n\n    if (this.isImageContent()) {\n      // Use decode() on nearby slides\n      //\n      // Nearby slide images are in DOM and not hidden via display:none.\n      // However, they are placed offscreen (to the left and right side).\n      //\n      // Some browsers do not composite the image until it's actually visible,\n      // using decode() helps.\n      //\n      // You might ask \"why dont you just decode() and then append all images\",\n      // that's because I want to show image before it's fully loaded,\n      // as browser can render parts of image while it is loading.\n      // We do not do this in Safari due to partial loading bug.\n      if (supportsDecode && this.slide && (!this.slide.isActive || isSafari())) {\n        this.isDecoding = true; // purposefully using finally instead of then,\n        // as if srcset sizes changes dynamically - it may cause decode error\n\n        /** @type {HTMLImageElement} */\n\n        this.element.decode().catch(() => {}).finally(() => {\n          this.isDecoding = false;\n          this.appendImage();\n        });\n      } else {\n        this.appendImage();\n      }\n    } else if (this.slide && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n  }\n  /**\n   * Activate the slide,\n   * active slide is generally the current one,\n   * meaning the user can see it.\n   */\n\n\n  activate() {\n    if (this.instance.dispatch('contentActivate', {\n      content: this\n    }).defaultPrevented || !this.slide) {\n      return;\n    }\n\n    if (this.isImageContent() && this.isDecoding && !isSafari()) {\n      // add image to slide when it becomes active,\n      // even if it's not finished decoding\n      this.appendImage();\n    } else if (this.isError()) {\n      this.load(false, true); // try to reload\n    }\n\n    if (this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'false');\n    }\n  }\n  /**\n   * Deactivate the content\n   */\n\n\n  deactivate() {\n    this.instance.dispatch('contentDeactivate', {\n      content: this\n    });\n\n    if (this.slide && this.slide.holderElement) {\n      this.slide.holderElement.setAttribute('aria-hidden', 'true');\n    }\n  }\n  /**\n   * Remove the content from DOM\n   */\n\n\n  remove() {\n    this.isAttached = false;\n\n    if (this.instance.dispatch('contentRemove', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    }\n\n    if (this.element && this.element.parentNode) {\n      this.element.remove();\n    }\n\n    if (this.placeholder && this.placeholder.element) {\n      this.placeholder.element.remove();\n    }\n  }\n  /**\n   * Append the image content to slide container\n   */\n\n\n  appendImage() {\n    if (!this.isAttached) {\n      return;\n    }\n\n    if (this.instance.dispatch('contentAppendImage', {\n      content: this\n    }).defaultPrevented) {\n      return;\n    } // ensure that element exists and is not already appended\n\n\n    if (this.slide && this.element && !this.element.parentNode) {\n      this.slide.container.appendChild(this.element);\n    }\n\n    if (this.state === LOAD_STATE.LOADED || this.state === LOAD_STATE.ERROR) {\n      this.removePlaceholder();\n    }\n  }\n\n}\n\n/** @typedef {import('./content.js').default} Content */\n\n/** @typedef {import('./slide.js').default} Slide */\n\n/** @typedef {import('./slide.js').SlideData} SlideData */\n\n/** @typedef {import('../core/base.js').default} PhotoSwipeBase */\n\n/** @typedef {import('../photoswipe.js').default} PhotoSwipe */\n\nconst MIN_SLIDES_TO_CACHE = 5;\n/**\n * Lazy-load an image\n * This function is used both by Lightbox and PhotoSwipe core,\n * thus it can be called before dialog is opened.\n *\n * @param {SlideData} itemData Data about the slide\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox instance\n * @param {number} index\n * @returns {Content} Image that is being decoded or false.\n */\n\nfunction lazyLoadData(itemData, instance, index) {\n  const content = instance.createContentFromData(itemData, index);\n  /** @type {ZoomLevel | undefined} */\n\n  let zoomLevel;\n  const {\n    options\n  } = instance; // We need to know dimensions of the image to preload it,\n  // as it might use srcset, and we need to define sizes\n\n  if (options) {\n    zoomLevel = new ZoomLevel(options, itemData, -1);\n    let viewportSize;\n\n    if (instance.pswp) {\n      viewportSize = instance.pswp.viewportSize;\n    } else {\n      viewportSize = getViewportSize(options, instance);\n    }\n\n    const panAreaSize = getPanAreaSize(options, viewportSize, itemData, index);\n    zoomLevel.update(content.width, content.height, panAreaSize);\n  }\n\n  content.lazyLoad();\n\n  if (zoomLevel) {\n    content.setDisplayedSize(Math.ceil(content.width * zoomLevel.initial), Math.ceil(content.height * zoomLevel.initial));\n  }\n\n  return content;\n}\n/**\n * Lazy-loads specific slide.\n * This function is used both by Lightbox and PhotoSwipe core,\n * thus it can be called before dialog is opened.\n *\n * By default, it loads image based on viewport size and initial zoom level.\n *\n * @param {number} index Slide index\n * @param {PhotoSwipeBase} instance PhotoSwipe or PhotoSwipeLightbox eventable instance\n * @returns {Content | undefined}\n */\n\nfunction lazyLoadSlide(index, instance) {\n  const itemData = instance.getItemData(index);\n\n  if (instance.dispatch('lazyLoadSlide', {\n    index,\n    itemData\n  }).defaultPrevented) {\n    return;\n  }\n\n  return lazyLoadData(itemData, instance, index);\n}\n\nclass ContentLoader {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp; // Total amount of cached images\n\n    this.limit = Math.max(pswp.options.preload[0] + pswp.options.preload[1] + 1, MIN_SLIDES_TO_CACHE);\n    /** @type {Content[]} */\n\n    this._cachedItems = [];\n  }\n  /**\n   * Lazy load nearby slides based on `preload` option.\n   *\n   * @param {number} [diff] Difference between slide indexes that was changed recently, or 0.\n   */\n\n\n  updateLazy(diff) {\n    const {\n      pswp\n    } = this;\n\n    if (pswp.dispatch('lazyLoad').defaultPrevented) {\n      return;\n    }\n\n    const {\n      preload\n    } = pswp.options;\n    const isForward = diff === undefined ? true : diff >= 0;\n    let i; // preload[1] - num items to preload in forward direction\n\n    for (i = 0; i <= preload[1]; i++) {\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? i : -i));\n    } // preload[0] - num items to preload in backward direction\n\n\n    for (i = 1; i <= preload[0]; i++) {\n      this.loadSlideByIndex(pswp.currIndex + (isForward ? -i : i));\n    }\n  }\n  /**\n   * @param {number} initialIndex\n   */\n\n\n  loadSlideByIndex(initialIndex) {\n    const index = this.pswp.getLoopedIndex(initialIndex); // try to get cached content\n\n    let content = this.getContentByIndex(index);\n\n    if (!content) {\n      // no cached content, so try to load from scratch:\n      content = lazyLoadSlide(index, this.pswp); // if content can be loaded, add it to cache:\n\n      if (content) {\n        this.addToCache(content);\n      }\n    }\n  }\n  /**\n   * @param {Slide} slide\n   * @returns {Content}\n   */\n\n\n  getContentBySlide(slide) {\n    let content = this.getContentByIndex(slide.index);\n\n    if (!content) {\n      // create content if not found in cache\n      content = this.pswp.createContentFromData(slide.data, slide.index);\n      this.addToCache(content);\n    } // assign slide to content\n\n\n    content.setSlide(slide);\n    return content;\n  }\n  /**\n   * @param {Content} content\n   */\n\n\n  addToCache(content) {\n    // move to the end of array\n    this.removeByIndex(content.index);\n\n    this._cachedItems.push(content);\n\n    if (this._cachedItems.length > this.limit) {\n      // Destroy the first content that's not attached\n      const indexToRemove = this._cachedItems.findIndex(item => {\n        return !item.isAttached && !item.hasSlide;\n      });\n\n      if (indexToRemove !== -1) {\n        const removedItem = this._cachedItems.splice(indexToRemove, 1)[0];\n\n        removedItem.destroy();\n      }\n    }\n  }\n  /**\n   * Removes an image from cache, does not destroy() it, just removes.\n   *\n   * @param {number} index\n   */\n\n\n  removeByIndex(index) {\n    const indexToRemove = this._cachedItems.findIndex(item => item.index === index);\n\n    if (indexToRemove !== -1) {\n      this._cachedItems.splice(indexToRemove, 1);\n    }\n  }\n  /**\n   * @param {number} index\n   * @returns {Content | undefined}\n   */\n\n\n  getContentByIndex(index) {\n    return this._cachedItems.find(content => content.index === index);\n  }\n\n  destroy() {\n    this._cachedItems.forEach(content => content.destroy());\n\n    this._cachedItems = [];\n  }\n\n}\n\n/** @typedef {import(\"../photoswipe.js\").default} PhotoSwipe */\n\n/** @typedef {import(\"../slide/slide.js\").SlideData} SlideData */\n\n/**\n * PhotoSwipe base class that can retrieve data about every slide.\n * Shared by PhotoSwipe Core and PhotoSwipe Lightbox\n */\n\nclass PhotoSwipeBase extends Eventable {\n  /**\n   * Get total number of slides\n   *\n   * @returns {number}\n   */\n  getNumItems() {\n    var _this$options;\n\n    let numItems = 0;\n    const dataSource = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.dataSource;\n\n    if (dataSource && 'length' in dataSource) {\n      // may be an array or just object with length property\n      numItems = dataSource.length;\n    } else if (dataSource && 'gallery' in dataSource) {\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      if (dataSource.items) {\n        numItems = dataSource.items.length;\n      }\n    } // legacy event, before filters were introduced\n\n\n    const event = this.dispatch('numItems', {\n      dataSource,\n      numItems\n    });\n    return this.applyFilters('numItems', event.numItems, dataSource);\n  }\n  /**\n   * @param {SlideData} slideData\n   * @param {number} index\n   * @returns {Content}\n   */\n\n\n  createContentFromData(slideData, index) {\n    return new Content(slideData, this, index);\n  }\n  /**\n   * Get item data by index.\n   *\n   * \"item data\" should contain normalized information that PhotoSwipe needs to generate a slide.\n   * For example, it may contain properties like\n   * `src`, `srcset`, `w`, `h`, which will be used to generate a slide with image.\n   *\n   * @param {number} index\n   * @returns {SlideData}\n   */\n\n\n  getItemData(index) {\n    var _this$options2;\n\n    const dataSource = (_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.dataSource;\n    /** @type {SlideData | HTMLElement} */\n\n    let dataSourceItem = {};\n\n    if (Array.isArray(dataSource)) {\n      // Datasource is an array of elements\n      dataSourceItem = dataSource[index];\n    } else if (dataSource && 'gallery' in dataSource) {\n      // dataSource has gallery property,\n      // thus it was created by Lightbox, based on\n      // gallery and children options\n      // query DOM elements\n      if (!dataSource.items) {\n        dataSource.items = this._getGalleryDOMElements(dataSource.gallery);\n      }\n\n      dataSourceItem = dataSource.items[index];\n    }\n\n    let itemData = dataSourceItem;\n\n    if (itemData instanceof Element) {\n      itemData = this._domElementToItemData(itemData);\n    } // Dispatching the itemData event,\n    // it's a legacy verion before filters were introduced\n\n\n    const event = this.dispatch('itemData', {\n      itemData: itemData || {},\n      index\n    });\n    return this.applyFilters('itemData', event.itemData, index);\n  }\n  /**\n   * Get array of gallery DOM elements,\n   * based on childSelector and gallery element.\n   *\n   * @param {HTMLElement} galleryElement\n   * @returns {HTMLElement[]}\n   */\n\n\n  _getGalleryDOMElements(galleryElement) {\n    var _this$options3, _this$options4;\n\n    if ((_this$options3 = this.options) !== null && _this$options3 !== void 0 && _this$options3.children || (_this$options4 = this.options) !== null && _this$options4 !== void 0 && _this$options4.childSelector) {\n      return getElementsFromOption(this.options.children, this.options.childSelector, galleryElement) || [];\n    }\n\n    return [galleryElement];\n  }\n  /**\n   * Converts DOM element to item data object.\n   *\n   * @param {HTMLElement} element DOM element\n   * @returns {SlideData}\n   */\n\n\n  _domElementToItemData(element) {\n    /** @type {SlideData} */\n    const itemData = {\n      element\n    };\n    const linkEl =\n    /** @type {HTMLAnchorElement} */\n    element.tagName === 'A' ? element : element.querySelector('a');\n\n    if (linkEl) {\n      // src comes from data-pswp-src attribute,\n      // if it's empty link href is used\n      itemData.src = linkEl.dataset.pswpSrc || linkEl.href;\n\n      if (linkEl.dataset.pswpSrcset) {\n        itemData.srcset = linkEl.dataset.pswpSrcset;\n      }\n\n      itemData.width = linkEl.dataset.pswpWidth ? parseInt(linkEl.dataset.pswpWidth, 10) : 0;\n      itemData.height = linkEl.dataset.pswpHeight ? parseInt(linkEl.dataset.pswpHeight, 10) : 0; // support legacy w & h properties\n\n      itemData.w = itemData.width;\n      itemData.h = itemData.height;\n\n      if (linkEl.dataset.pswpType) {\n        itemData.type = linkEl.dataset.pswpType;\n      }\n\n      const thumbnailEl = element.querySelector('img');\n\n      if (thumbnailEl) {\n        var _thumbnailEl$getAttri;\n\n        // msrc is URL to placeholder image that's displayed before large image is loaded\n        // by default it's displayed only for the first slide\n        itemData.msrc = thumbnailEl.currentSrc || thumbnailEl.src;\n        itemData.alt = (_thumbnailEl$getAttri = thumbnailEl.getAttribute('alt')) !== null && _thumbnailEl$getAttri !== void 0 ? _thumbnailEl$getAttri : '';\n      }\n\n      if (linkEl.dataset.pswpCropped || linkEl.dataset.cropped) {\n        itemData.thumbCropped = true;\n      }\n    }\n\n    return this.applyFilters('domItemData', itemData, element, linkEl);\n  }\n  /**\n   * Lazy-load by slide data\n   *\n   * @param {SlideData} itemData Data about the slide\n   * @param {number} index\n   * @returns {Content} Image that is being decoded or false.\n   */\n\n\n  lazyLoadData(itemData, index) {\n    return lazyLoadData(itemData, this, index);\n  }\n\n}\n\n/** @typedef {import('./photoswipe.js').default} PhotoSwipe */\n\n/** @typedef {import('./slide/get-thumb-bounds.js').Bounds} Bounds */\n\n/** @typedef {import('./util/animations.js').AnimationProps} AnimationProps */\n// some browsers do not paint\n// elements which opacity is set to 0,\n// since we need to pre-render elements for the animation -\n// we set it to the minimum amount\n\nconst MIN_OPACITY = 0.003;\n/**\n * Manages opening and closing transitions of the PhotoSwipe.\n *\n * It can perform zoom, fade or no transition.\n */\n\nclass Opener {\n  /**\n   * @param {PhotoSwipe} pswp\n   */\n  constructor(pswp) {\n    this.pswp = pswp;\n    this.isClosed = true;\n    this.isOpen = false;\n    this.isClosing = false;\n    this.isOpening = false;\n    /**\n     * @private\n     * @type {number | false | undefined}\n     */\n\n    this._duration = undefined;\n    /** @private */\n\n    this._useAnimation = false;\n    /** @private */\n\n    this._croppedZoom = false;\n    /** @private */\n\n    this._animateRootOpacity = false;\n    /** @private */\n\n    this._animateBgOpacity = false;\n    /**\n     * @private\n     * @type { HTMLDivElement | HTMLImageElement | null | undefined }\n     */\n\n    this._placeholder = undefined;\n    /**\n     * @private\n     * @type { HTMLDivElement | undefined }\n     */\n\n    this._opacityElement = undefined;\n    /**\n     * @private\n     * @type { HTMLDivElement | undefined }\n     */\n\n    this._cropContainer1 = undefined;\n    /**\n     * @private\n     * @type { HTMLElement | null | undefined }\n     */\n\n    this._cropContainer2 = undefined;\n    /**\n     * @private\n     * @type {Bounds | undefined}\n     */\n\n    this._thumbBounds = undefined;\n    this._prepareOpen = this._prepareOpen.bind(this); // Override initial zoom and pan position\n\n    pswp.on('firstZoomPan', this._prepareOpen);\n  }\n\n  open() {\n    this._prepareOpen();\n\n    this._start();\n  }\n\n  close() {\n    if (this.isClosed || this.isClosing || this.isOpening) {\n      // if we close during opening animation\n      // for now do nothing,\n      // browsers aren't good at changing the direction of the CSS transition\n      return;\n    }\n\n    const slide = this.pswp.currSlide;\n    this.isOpen = false;\n    this.isOpening = false;\n    this.isClosing = true;\n    this._duration = this.pswp.options.hideAnimationDuration;\n\n    if (slide && slide.currZoomLevel * slide.width >= this.pswp.options.maxWidthToAnimate) {\n      this._duration = 0;\n    }\n\n    this._applyStartProps();\n\n    setTimeout(() => {\n      this._start();\n    }, this._croppedZoom ? 30 : 0);\n  }\n  /** @private */\n\n\n  _prepareOpen() {\n    this.pswp.off('firstZoomPan', this._prepareOpen);\n\n    if (!this.isOpening) {\n      const slide = this.pswp.currSlide;\n      this.isOpening = true;\n      this.isClosing = false;\n      this._duration = this.pswp.options.showAnimationDuration;\n\n      if (slide && slide.zoomLevels.initial * slide.width >= this.pswp.options.maxWidthToAnimate) {\n        this._duration = 0;\n      }\n\n      this._applyStartProps();\n    }\n  }\n  /** @private */\n\n\n  _applyStartProps() {\n    const {\n      pswp\n    } = this;\n    const slide = this.pswp.currSlide;\n    const {\n      options\n    } = pswp;\n\n    if (options.showHideAnimationType === 'fade') {\n      options.showHideOpacity = true;\n      this._thumbBounds = undefined;\n    } else if (options.showHideAnimationType === 'none') {\n      options.showHideOpacity = false;\n      this._duration = 0;\n      this._thumbBounds = undefined;\n    } else if (this.isOpening && pswp._initialThumbBounds) {\n      // Use initial bounds if defined\n      this._thumbBounds = pswp._initialThumbBounds;\n    } else {\n      this._thumbBounds = this.pswp.getThumbBounds();\n    }\n\n    this._placeholder = slide === null || slide === void 0 ? void 0 : slide.getPlaceholderElement();\n    pswp.animations.stopAll(); // Discard animations when duration is less than 50ms\n\n    this._useAnimation = Boolean(this._duration && this._duration > 50);\n    this._animateZoom = Boolean(this._thumbBounds) && (slide === null || slide === void 0 ? void 0 : slide.content.usePlaceholder()) && (!this.isClosing || !pswp.mainScroll.isShifted());\n\n    if (!this._animateZoom) {\n      this._animateRootOpacity = true;\n\n      if (this.isOpening && slide) {\n        slide.zoomAndPanToInitial();\n        slide.applyCurrentZoomPan();\n      }\n    } else {\n      var _options$showHideOpac;\n\n      this._animateRootOpacity = (_options$showHideOpac = options.showHideOpacity) !== null && _options$showHideOpac !== void 0 ? _options$showHideOpac : false;\n    }\n\n    this._animateBgOpacity = !this._animateRootOpacity && this.pswp.options.bgOpacity > MIN_OPACITY;\n    this._opacityElement = this._animateRootOpacity ? pswp.element : pswp.bg;\n\n    if (!this._useAnimation) {\n      this._duration = 0;\n      this._animateZoom = false;\n      this._animateBgOpacity = false;\n      this._animateRootOpacity = true;\n\n      if (this.isOpening) {\n        if (pswp.element) {\n          pswp.element.style.opacity = String(MIN_OPACITY);\n        }\n\n        pswp.applyBgOpacity(1);\n      }\n\n      return;\n    }\n\n    if (this._animateZoom && this._thumbBounds && this._thumbBounds.innerRect) {\n      var _this$pswp$currSlide;\n\n      // Properties are used when animation from cropped thumbnail\n      this._croppedZoom = true;\n      this._cropContainer1 = this.pswp.container;\n      this._cropContainer2 = (_this$pswp$currSlide = this.pswp.currSlide) === null || _this$pswp$currSlide === void 0 ? void 0 : _this$pswp$currSlide.holderElement;\n\n      if (pswp.container) {\n        pswp.container.style.overflow = 'hidden';\n        pswp.container.style.width = pswp.viewportSize.x + 'px';\n      }\n    } else {\n      this._croppedZoom = false;\n    }\n\n    if (this.isOpening) {\n      // Apply styles before opening transition\n      if (this._animateRootOpacity) {\n        if (pswp.element) {\n          pswp.element.style.opacity = String(MIN_OPACITY);\n        }\n\n        pswp.applyBgOpacity(1);\n      } else {\n        if (this._animateBgOpacity && pswp.bg) {\n          pswp.bg.style.opacity = String(MIN_OPACITY);\n        }\n\n        if (pswp.element) {\n          pswp.element.style.opacity = '1';\n        }\n      }\n\n      if (this._animateZoom) {\n        this._setClosedStateZoomPan();\n\n        if (this._placeholder) {\n          // tell browser that we plan to animate the placeholder\n          this._placeholder.style.willChange = 'transform'; // hide placeholder to allow hiding of\n          // elements that overlap it (such as icons over the thumbnail)\n\n          this._placeholder.style.opacity = String(MIN_OPACITY);\n        }\n      }\n    } else if (this.isClosing) {\n      // hide nearby slides to make sure that\n      // they are not painted during the transition\n      if (pswp.mainScroll.itemHolders[0]) {\n        pswp.mainScroll.itemHolders[0].el.style.display = 'none';\n      }\n\n      if (pswp.mainScroll.itemHolders[2]) {\n        pswp.mainScroll.itemHolders[2].el.style.display = 'none';\n      }\n\n      if (this._croppedZoom) {\n        if (pswp.mainScroll.x !== 0) {\n          // shift the main scroller to zero position\n          pswp.mainScroll.resetPosition();\n          pswp.mainScroll.resize();\n        }\n      }\n    }\n  }\n  /** @private */\n\n\n  _start() {\n    if (this.isOpening && this._useAnimation && this._placeholder && this._placeholder.tagName === 'IMG') {\n      // To ensure smooth animation\n      // we wait till the current slide image placeholder is decoded,\n      // but no longer than 250ms,\n      // and no shorter than 50ms\n      // (just using requestanimationframe is not enough in Firefox,\n      // for some reason)\n      new Promise(resolve => {\n        let decoded = false;\n        let isDelaying = true;\n        decodeImage(\n        /** @type {HTMLImageElement} */\n        this._placeholder).finally(() => {\n          decoded = true;\n\n          if (!isDelaying) {\n            resolve(true);\n          }\n        });\n        setTimeout(() => {\n          isDelaying = false;\n\n          if (decoded) {\n            resolve(true);\n          }\n        }, 50);\n        setTimeout(resolve, 250);\n      }).finally(() => this._initiate());\n    } else {\n      this._initiate();\n    }\n  }\n  /** @private */\n\n\n  _initiate() {\n    var _this$pswp$element, _this$pswp$element2;\n\n    (_this$pswp$element = this.pswp.element) === null || _this$pswp$element === void 0 || _this$pswp$element.style.setProperty('--pswp-transition-duration', this._duration + 'ms');\n    this.pswp.dispatch(this.isOpening ? 'openingAnimationStart' : 'closingAnimationStart'); // legacy event\n\n    this.pswp.dispatch(\n    /** @type {'initialZoomIn' | 'initialZoomOut'} */\n    'initialZoom' + (this.isOpening ? 'In' : 'Out'));\n    (_this$pswp$element2 = this.pswp.element) === null || _this$pswp$element2 === void 0 || _this$pswp$element2.classList.toggle('pswp--ui-visible', this.isOpening);\n\n    if (this.isOpening) {\n      if (this._placeholder) {\n        // unhide the placeholder\n        this._placeholder.style.opacity = '1';\n      }\n\n      this._animateToOpenState();\n    } else if (this.isClosing) {\n      this._animateToClosedState();\n    }\n\n    if (!this._useAnimation) {\n      this._onAnimationComplete();\n    }\n  }\n  /** @private */\n\n\n  _onAnimationComplete() {\n    const {\n      pswp\n    } = this;\n    this.isOpen = this.isOpening;\n    this.isClosed = this.isClosing;\n    this.isOpening = false;\n    this.isClosing = false;\n    pswp.dispatch(this.isOpen ? 'openingAnimationEnd' : 'closingAnimationEnd'); // legacy event\n\n    pswp.dispatch(\n    /** @type {'initialZoomInEnd' | 'initialZoomOutEnd'} */\n    'initialZoom' + (this.isOpen ? 'InEnd' : 'OutEnd'));\n\n    if (this.isClosed) {\n      pswp.destroy();\n    } else if (this.isOpen) {\n      var _pswp$currSlide;\n\n      if (this._animateZoom && pswp.container) {\n        pswp.container.style.overflow = 'visible';\n        pswp.container.style.width = '100%';\n      }\n\n      (_pswp$currSlide = pswp.currSlide) === null || _pswp$currSlide === void 0 || _pswp$currSlide.applyCurrentZoomPan();\n    }\n  }\n  /** @private */\n\n\n  _animateToOpenState() {\n    const {\n      pswp\n    } = this;\n\n    if (this._animateZoom) {\n      if (this._croppedZoom && this._cropContainer1 && this._cropContainer2) {\n        this._animateTo(this._cropContainer1, 'transform', 'translate3d(0,0,0)');\n\n        this._animateTo(this._cropContainer2, 'transform', 'none');\n      }\n\n      if (pswp.currSlide) {\n        pswp.currSlide.zoomAndPanToInitial();\n\n        this._animateTo(pswp.currSlide.container, 'transform', pswp.currSlide.getCurrentTransform());\n      }\n    }\n\n    if (this._animateBgOpacity && pswp.bg) {\n      this._animateTo(pswp.bg, 'opacity', String(pswp.options.bgOpacity));\n    }\n\n    if (this._animateRootOpacity && pswp.element) {\n      this._animateTo(pswp.element, 'opacity', '1');\n    }\n  }\n  /** @private */\n\n\n  _animateToClosedState() {\n    const {\n      pswp\n    } = this;\n\n    if (this._animateZoom) {\n      this._setClosedStateZoomPan(true);\n    } // do not animate opacity if it's already at 0\n\n\n    if (this._animateBgOpacity && pswp.bgOpacity > 0.01 && pswp.bg) {\n      this._animateTo(pswp.bg, 'opacity', '0');\n    }\n\n    if (this._animateRootOpacity && pswp.element) {\n      this._animateTo(pswp.element, 'opacity', '0');\n    }\n  }\n  /**\n   * @private\n   * @param {boolean} [animate]\n   */\n\n\n  _setClosedStateZoomPan(animate) {\n    if (!this._thumbBounds) return;\n    const {\n      pswp\n    } = this;\n    const {\n      innerRect\n    } = this._thumbBounds;\n    const {\n      currSlide,\n      viewportSize\n    } = pswp;\n\n    if (this._croppedZoom && innerRect && this._cropContainer1 && this._cropContainer2) {\n      const containerOnePanX = -viewportSize.x + (this._thumbBounds.x - innerRect.x) + innerRect.w;\n      const containerOnePanY = -viewportSize.y + (this._thumbBounds.y - innerRect.y) + innerRect.h;\n      const containerTwoPanX = viewportSize.x - innerRect.w;\n      const containerTwoPanY = viewportSize.y - innerRect.h;\n\n      if (animate) {\n        this._animateTo(this._cropContainer1, 'transform', toTransformString(containerOnePanX, containerOnePanY));\n\n        this._animateTo(this._cropContainer2, 'transform', toTransformString(containerTwoPanX, containerTwoPanY));\n      } else {\n        setTransform(this._cropContainer1, containerOnePanX, containerOnePanY);\n        setTransform(this._cropContainer2, containerTwoPanX, containerTwoPanY);\n      }\n    }\n\n    if (currSlide) {\n      equalizePoints(currSlide.pan, innerRect || this._thumbBounds);\n      currSlide.currZoomLevel = this._thumbBounds.w / currSlide.width;\n\n      if (animate) {\n        this._animateTo(currSlide.container, 'transform', currSlide.getCurrentTransform());\n      } else {\n        currSlide.applyCurrentZoomPan();\n      }\n    }\n  }\n  /**\n   * @private\n   * @param {HTMLElement} target\n   * @param {'transform' | 'opacity'} prop\n   * @param {string} propValue\n   */\n\n\n  _animateTo(target, prop, propValue) {\n    if (!this._duration) {\n      target.style[prop] = propValue;\n      return;\n    }\n\n    const {\n      animations\n    } = this.pswp;\n    /** @type {AnimationProps} */\n\n    const animProps = {\n      duration: this._duration,\n      easing: this.pswp.options.easing,\n      onComplete: () => {\n        if (!animations.activeAnimations.length) {\n          this._onAnimationComplete();\n        }\n      },\n      target\n    };\n    animProps[prop] = propValue;\n    animations.startTransition(animProps);\n  }\n\n}\n\n/**\n * @template T\n * @typedef {import('./types.js').Type<T>} Type<T>\n */\n\n/** @typedef {import('./slide/slide.js').SlideData} SlideData */\n\n/** @typedef {import('./slide/zoom-level.js').ZoomLevelOption} ZoomLevelOption */\n\n/** @typedef {import('./ui/ui-element.js').UIElementData} UIElementData */\n\n/** @typedef {import('./main-scroll.js').ItemHolder} ItemHolder */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeEventsMap} PhotoSwipeEventsMap */\n\n/** @typedef {import('./core/eventable.js').PhotoSwipeFiltersMap} PhotoSwipeFiltersMap */\n\n/** @typedef {import('./slide/get-thumb-bounds').Bounds} Bounds */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {import('./core/eventable.js').EventCallback<T>} EventCallback<T>\n */\n\n/**\n * @template {keyof PhotoSwipeEventsMap} T\n * @typedef {import('./core/eventable.js').AugmentedEvent<T>} AugmentedEvent<T>\n */\n\n/** @typedef {{ x: number; y: number; id?: string | number }} Point */\n\n/** @typedef {{ top: number; bottom: number; left: number; right: number }} Padding */\n\n/** @typedef {SlideData[]} DataSourceArray */\n\n/** @typedef {{ gallery: HTMLElement; items?: HTMLElement[] }} DataSourceObject */\n\n/** @typedef {DataSourceArray | DataSourceObject} DataSource */\n\n/** @typedef {(point: Point, originalEvent: PointerEvent) => void} ActionFn */\n\n/** @typedef {'close' | 'next' | 'zoom' | 'zoom-or-close' | 'toggle-controls'} ActionType */\n\n/** @typedef {Type<PhotoSwipe> | { default: Type<PhotoSwipe> }} PhotoSwipeModule */\n\n/** @typedef {PhotoSwipeModule | Promise<PhotoSwipeModule> | (() => Promise<PhotoSwipeModule>)} PhotoSwipeModuleOption */\n\n/**\n * @typedef {string | NodeListOf<HTMLElement> | HTMLElement[] | HTMLElement} ElementProvider\n */\n\n/** @typedef {Partial<PreparedPhotoSwipeOptions>} PhotoSwipeOptions https://photoswipe.com/options/ */\n\n/**\n * @typedef {Object} PreparedPhotoSwipeOptions\n *\n * @prop {DataSource} [dataSource]\n * Pass an array of any items via dataSource option. Its length will determine amount of slides\n * (which may be modified further from numItems event).\n *\n * Each item should contain data that you need to generate slide\n * (for image slide it would be src (image URL), width (image width), height, srcset, alt).\n *\n * If these properties are not present in your initial array, you may \"pre-parse\" each item from itemData filter.\n *\n * @prop {number} bgOpacity\n * Background backdrop opacity, always define it via this option and not via CSS rgba color.\n *\n * @prop {number} spacing\n * Spacing between slides. Defined as ratio relative to the viewport width (0.1 = 10% of viewport).\n *\n * @prop {boolean} allowPanToNext\n * Allow swipe navigation to the next slide when the current slide is zoomed. Does not apply to mouse events.\n *\n * @prop {boolean} loop\n * If set to true you'll be able to swipe from the last to the first image.\n * Option is always false when there are less than 3 slides.\n *\n * @prop {boolean} [wheelToZoom]\n * By default PhotoSwipe zooms image with ctrl-wheel, if you enable this option - image will zoom just via wheel.\n *\n * @prop {boolean} pinchToClose\n * Pinch touch gesture to close the gallery.\n *\n * @prop {boolean} closeOnVerticalDrag\n * Vertical drag gesture to close the PhotoSwipe.\n *\n * @prop {Padding} [padding]\n * Slide area padding (in pixels).\n *\n * @prop {(viewportSize: Point, itemData: SlideData, index: number) => Padding} [paddingFn]\n * The option is checked frequently, so make sure it's performant. Overrides padding option if defined. For example:\n *\n * @prop {number | false} hideAnimationDuration\n * Transition duration in milliseconds, can be 0.\n *\n * @prop {number | false} showAnimationDuration\n * Transition duration in milliseconds, can be 0.\n *\n * @prop {number | false} zoomAnimationDuration\n * Transition duration in milliseconds, can be 0.\n *\n * @prop {string} easing\n * String, 'cubic-bezier(.4,0,.22,1)'. CSS easing function for open/close/zoom transitions.\n *\n * @prop {boolean} escKey\n * Esc key to close.\n *\n * @prop {boolean} arrowKeys\n * Left/right arrow keys for navigation.\n *\n * @prop {boolean} trapFocus\n * Trap focus within PhotoSwipe element while it's open.\n *\n * @prop {boolean} returnFocus\n * Restore focus the last active element after PhotoSwipe is closed.\n *\n * @prop {boolean} clickToCloseNonZoomable\n * If image is not zoomable (for example, smaller than viewport) it can be closed by clicking on it.\n *\n * @prop {ActionType | ActionFn | false} imageClickAction\n * Refer to click and tap actions page.\n *\n * @prop {ActionType | ActionFn | false} bgClickAction\n * Refer to click and tap actions page.\n *\n * @prop {ActionType | ActionFn | false} tapAction\n * Refer to click and tap actions page.\n *\n * @prop {ActionType | ActionFn | false} doubleTapAction\n * Refer to click and tap actions page.\n *\n * @prop {number} preloaderDelay\n * Delay before the loading indicator will be displayed,\n * if image is loaded during it - the indicator will not be displayed at all. Can be zero.\n *\n * @prop {string} indexIndicatorSep\n * Used for slide count indicator (\"1 of 10 \").\n *\n * @prop {(options: PhotoSwipeOptions, pswp: PhotoSwipeBase) => Point} [getViewportSizeFn]\n * A function that should return slide viewport width and height, in format {x: 100, y: 100}.\n *\n * @prop {string} errorMsg\n * Message to display when the image wasn't able to load. If you need to display HTML - use contentErrorElement filter.\n *\n * @prop {[number, number]} preload\n * Lazy loading of nearby slides based on direction of movement. Should be an array with two integers,\n * first one - number of items to preload before the current image, second one - after the current image.\n * Two nearby images are always loaded.\n *\n * @prop {string} [mainClass]\n * Class that will be added to the root element of PhotoSwipe, may contain multiple separated by space.\n * Example on Styling page.\n *\n * @prop {HTMLElement} [appendToEl]\n * Element to which PhotoSwipe dialog will be appended when it opens.\n *\n * @prop {number} maxWidthToAnimate\n * Maximum width of image to animate, if initial rendered image width\n * is larger than this value - the opening/closing transition will be automatically disabled.\n *\n * @prop {string} [closeTitle]\n * Translating\n *\n * @prop {string} [zoomTitle]\n * Translating\n *\n * @prop {string} [arrowPrevTitle]\n * Translating\n *\n * @prop {string} [arrowNextTitle]\n * Translating\n *\n * @prop {'zoom' | 'fade' | 'none'} [showHideAnimationType]\n * To adjust opening or closing transition type use lightbox option `showHideAnimationType` (`String`).\n * It supports three values - `zoom` (default), `fade` (default if there is no thumbnail) and `none`.\n *\n * Animations are automatically disabled if user `(prefers-reduced-motion: reduce)`.\n *\n * @prop {number} index\n * Defines start slide index.\n *\n * @prop {(e: MouseEvent) => number} [getClickedIndexFn]\n *\n * @prop {boolean} [arrowPrev]\n * @prop {boolean} [arrowNext]\n * @prop {boolean} [zoom]\n * @prop {boolean} [close]\n * @prop {boolean} [counter]\n *\n * @prop {string} [arrowPrevSVG]\n * @prop {string} [arrowNextSVG]\n * @prop {string} [zoomSVG]\n * @prop {string} [closeSVG]\n * @prop {string} [counterSVG]\n *\n * @prop {string} [arrowPrevTitle]\n * @prop {string} [arrowNextTitle]\n * @prop {string} [zoomTitle]\n * @prop {string} [closeTitle]\n * @prop {string} [counterTitle]\n *\n * @prop {ZoomLevelOption} [initialZoomLevel]\n * @prop {ZoomLevelOption} [secondaryZoomLevel]\n * @prop {ZoomLevelOption} [maxZoomLevel]\n *\n * @prop {boolean} [mouseMovePan]\n * @prop {Point | null} [initialPointerPos]\n * @prop {boolean} [showHideOpacity]\n *\n * @prop {PhotoSwipeModuleOption} [pswpModule]\n * @prop {() => Promise<any>} [openPromise]\n * @prop {boolean} [preloadFirstSlide]\n * @prop {ElementProvider} [gallery]\n * @prop {string} [gallerySelector]\n * @prop {ElementProvider} [children]\n * @prop {string} [childSelector]\n * @prop {string | false} [thumbSelector]\n */\n\n/** @type {PreparedPhotoSwipeOptions} */\n\nconst defaultOptions = {\n  allowPanToNext: true,\n  spacing: 0.1,\n  loop: true,\n  pinchToClose: true,\n  closeOnVerticalDrag: true,\n  hideAnimationDuration: 333,\n  showAnimationDuration: 333,\n  zoomAnimationDuration: 333,\n  escKey: true,\n  arrowKeys: true,\n  trapFocus: true,\n  returnFocus: true,\n  maxWidthToAnimate: 4000,\n  clickToCloseNonZoomable: true,\n  imageClickAction: 'zoom-or-close',\n  bgClickAction: 'close',\n  tapAction: 'toggle-controls',\n  doubleTapAction: 'zoom',\n  indexIndicatorSep: ' / ',\n  preloaderDelay: 2000,\n  bgOpacity: 0.8,\n  index: 0,\n  errorMsg: 'The image cannot be loaded',\n  preload: [1, 2],\n  easing: 'cubic-bezier(.4,0,.22,1)'\n};\n/**\n * PhotoSwipe Core\n */\n\nclass PhotoSwipe extends PhotoSwipeBase {\n  /**\n   * @param {PhotoSwipeOptions} [options]\n   */\n  constructor(options) {\n    super();\n    this.options = this._prepareOptions(options || {});\n    /**\n     * offset of viewport relative to document\n     *\n     * @type {Point}\n     */\n\n    this.offset = {\n      x: 0,\n      y: 0\n    };\n    /**\n     * @type {Point}\n     * @private\n     */\n\n    this._prevViewportSize = {\n      x: 0,\n      y: 0\n    };\n    /**\n     * Size of scrollable PhotoSwipe viewport\n     *\n     * @type {Point}\n     */\n\n    this.viewportSize = {\n      x: 0,\n      y: 0\n    };\n    /**\n     * background (backdrop) opacity\n     */\n\n    this.bgOpacity = 1;\n    this.currIndex = 0;\n    this.potentialIndex = 0;\n    this.isOpen = false;\n    this.isDestroying = false;\n    this.hasMouse = false;\n    /**\n     * @private\n     * @type {SlideData}\n     */\n\n    this._initialItemData = {};\n    /** @type {Bounds | undefined} */\n\n    this._initialThumbBounds = undefined;\n    /** @type {HTMLDivElement | undefined} */\n\n    this.topBar = undefined;\n    /** @type {HTMLDivElement | undefined} */\n\n    this.element = undefined;\n    /** @type {HTMLDivElement | undefined} */\n\n    this.template = undefined;\n    /** @type {HTMLDivElement | undefined} */\n\n    this.container = undefined;\n    /** @type {HTMLElement | undefined} */\n\n    this.scrollWrap = undefined;\n    /** @type {Slide | undefined} */\n\n    this.currSlide = undefined;\n    this.events = new DOMEvents();\n    this.animations = new Animations();\n    this.mainScroll = new MainScroll(this);\n    this.gestures = new Gestures(this);\n    this.opener = new Opener(this);\n    this.keyboard = new Keyboard(this);\n    this.contentLoader = new ContentLoader(this);\n  }\n  /** @returns {boolean} */\n\n\n  init() {\n    if (this.isOpen || this.isDestroying) {\n      return false;\n    }\n\n    this.isOpen = true;\n    this.dispatch('init'); // legacy\n\n    this.dispatch('beforeOpen');\n\n    this._createMainStructure(); // add classes to the root element of PhotoSwipe\n\n\n    let rootClasses = 'pswp--open';\n\n    if (this.gestures.supportsTouch) {\n      rootClasses += ' pswp--touch';\n    }\n\n    if (this.options.mainClass) {\n      rootClasses += ' ' + this.options.mainClass;\n    }\n\n    if (this.element) {\n      this.element.className += ' ' + rootClasses;\n    }\n\n    this.currIndex = this.options.index || 0;\n    this.potentialIndex = this.currIndex;\n    this.dispatch('firstUpdate'); // starting index can be modified here\n    // initialize scroll wheel handler to block the scroll\n\n    this.scrollWheel = new ScrollWheel(this); // sanitize index\n\n    if (Number.isNaN(this.currIndex) || this.currIndex < 0 || this.currIndex >= this.getNumItems()) {\n      this.currIndex = 0;\n    }\n\n    if (!this.gestures.supportsTouch) {\n      // enable mouse features if no touch support detected\n      this.mouseDetected();\n    } // causes forced synchronous layout\n\n\n    this.updateSize();\n    this.offset.y = window.pageYOffset;\n    this._initialItemData = this.getItemData(this.currIndex);\n    this.dispatch('gettingData', {\n      index: this.currIndex,\n      data: this._initialItemData,\n      slide: undefined\n    }); // *Layout* - calculate size and position of elements here\n\n    this._initialThumbBounds = this.getThumbBounds();\n    this.dispatch('initialLayout');\n    this.on('openingAnimationEnd', () => {\n      const {\n        itemHolders\n      } = this.mainScroll; // Add content to the previous and next slide\n\n      if (itemHolders[0]) {\n        itemHolders[0].el.style.display = 'block';\n        this.setContent(itemHolders[0], this.currIndex - 1);\n      }\n\n      if (itemHolders[2]) {\n        itemHolders[2].el.style.display = 'block';\n        this.setContent(itemHolders[2], this.currIndex + 1);\n      }\n\n      this.appendHeavy();\n      this.contentLoader.updateLazy();\n      this.events.add(window, 'resize', this._handlePageResize.bind(this));\n      this.events.add(window, 'scroll', this._updatePageScrollOffset.bind(this));\n      this.dispatch('bindEvents');\n    }); // set content for center slide (first time)\n\n    if (this.mainScroll.itemHolders[1]) {\n      this.setContent(this.mainScroll.itemHolders[1], this.currIndex);\n    }\n\n    this.dispatch('change');\n    this.opener.open();\n    this.dispatch('afterInit');\n    return true;\n  }\n  /**\n   * Get looped slide index\n   * (for example, -1 will return the last slide)\n   *\n   * @param {number} index\n   * @returns {number}\n   */\n\n\n  getLoopedIndex(index) {\n    const numSlides = this.getNumItems();\n\n    if (this.options.loop) {\n      if (index > numSlides - 1) {\n        index -= numSlides;\n      }\n\n      if (index < 0) {\n        index += numSlides;\n      }\n    }\n\n    return clamp(index, 0, numSlides - 1);\n  }\n\n  appendHeavy() {\n    this.mainScroll.itemHolders.forEach(itemHolder => {\n      var _itemHolder$slide;\n\n      (_itemHolder$slide = itemHolder.slide) === null || _itemHolder$slide === void 0 || _itemHolder$slide.appendHeavy();\n    });\n  }\n  /**\n   * Change the slide\n   * @param {number} index New index\n   */\n\n\n  goTo(index) {\n    this.mainScroll.moveIndexBy(this.getLoopedIndex(index) - this.potentialIndex);\n  }\n  /**\n   * Go to the next slide.\n   */\n\n\n  next() {\n    this.goTo(this.potentialIndex + 1);\n  }\n  /**\n   * Go to the previous slide.\n   */\n\n\n  prev() {\n    this.goTo(this.potentialIndex - 1);\n  }\n  /**\n   * @see slide/slide.js zoomTo\n   *\n   * @param {Parameters<Slide['zoomTo']>} args\n   */\n\n\n  zoomTo(...args) {\n    var _this$currSlide;\n\n    (_this$currSlide = this.currSlide) === null || _this$currSlide === void 0 || _this$currSlide.zoomTo(...args);\n  }\n  /**\n   * @see slide/slide.js toggleZoom\n   */\n\n\n  toggleZoom() {\n    var _this$currSlide2;\n\n    (_this$currSlide2 = this.currSlide) === null || _this$currSlide2 === void 0 || _this$currSlide2.toggleZoom();\n  }\n  /**\n   * Close the gallery.\n   * After closing transition ends - destroy it\n   */\n\n\n  close() {\n    if (!this.opener.isOpen || this.isDestroying) {\n      return;\n    }\n\n    this.isDestroying = true;\n    this.dispatch('close');\n    this.events.removeAll();\n    this.opener.close();\n  }\n  /**\n   * Destroys the gallery:\n   * - instantly closes the gallery\n   * - unbinds events,\n   * - cleans intervals and timeouts\n   * - removes elements from DOM\n   */\n\n\n  destroy() {\n    var _this$element;\n\n    if (!this.isDestroying) {\n      this.options.showHideAnimationType = 'none';\n      this.close();\n      return;\n    }\n\n    this.dispatch('destroy');\n    this._listeners = {};\n\n    if (this.scrollWrap) {\n      this.scrollWrap.ontouchmove = null;\n      this.scrollWrap.ontouchend = null;\n    }\n\n    (_this$element = this.element) === null || _this$element === void 0 || _this$element.remove();\n    this.mainScroll.itemHolders.forEach(itemHolder => {\n      var _itemHolder$slide2;\n\n      (_itemHolder$slide2 = itemHolder.slide) === null || _itemHolder$slide2 === void 0 || _itemHolder$slide2.destroy();\n    });\n    this.contentLoader.destroy();\n    this.events.removeAll();\n  }\n  /**\n   * Refresh/reload content of a slide by its index\n   *\n   * @param {number} slideIndex\n   */\n\n\n  refreshSlideContent(slideIndex) {\n    this.contentLoader.removeByIndex(slideIndex);\n    this.mainScroll.itemHolders.forEach((itemHolder, i) => {\n      var _this$currSlide$index, _this$currSlide3;\n\n      let potentialHolderIndex = ((_this$currSlide$index = (_this$currSlide3 = this.currSlide) === null || _this$currSlide3 === void 0 ? void 0 : _this$currSlide3.index) !== null && _this$currSlide$index !== void 0 ? _this$currSlide$index : 0) - 1 + i;\n\n      if (this.canLoop()) {\n        potentialHolderIndex = this.getLoopedIndex(potentialHolderIndex);\n      }\n\n      if (potentialHolderIndex === slideIndex) {\n        // set the new slide content\n        this.setContent(itemHolder, slideIndex, true); // activate the new slide if it's current\n\n        if (i === 1) {\n          var _itemHolder$slide3;\n\n          this.currSlide = itemHolder.slide;\n          (_itemHolder$slide3 = itemHolder.slide) === null || _itemHolder$slide3 === void 0 || _itemHolder$slide3.setIsActive(true);\n        }\n      }\n    });\n    this.dispatch('change');\n  }\n  /**\n   * Set slide content\n   *\n   * @param {ItemHolder} holder mainScroll.itemHolders array item\n   * @param {number} index Slide index\n   * @param {boolean} [force] If content should be set even if index wasn't changed\n   */\n\n\n  setContent(holder, index, force) {\n    if (this.canLoop()) {\n      index = this.getLoopedIndex(index);\n    }\n\n    if (holder.slide) {\n      if (holder.slide.index === index && !force) {\n        // exit if holder already contains this slide\n        // this could be common when just three slides are used\n        return;\n      } // destroy previous slide\n\n\n      holder.slide.destroy();\n      holder.slide = undefined;\n    } // exit if no loop and index is out of bounds\n\n\n    if (!this.canLoop() && (index < 0 || index >= this.getNumItems())) {\n      return;\n    }\n\n    const itemData = this.getItemData(index);\n    holder.slide = new Slide(itemData, index, this); // set current slide\n\n    if (index === this.currIndex) {\n      this.currSlide = holder.slide;\n    }\n\n    holder.slide.append(holder.el);\n  }\n  /** @returns {Point} */\n\n\n  getViewportCenterPoint() {\n    return {\n      x: this.viewportSize.x / 2,\n      y: this.viewportSize.y / 2\n    };\n  }\n  /**\n   * Update size of all elements.\n   * Executed on init and on page resize.\n   *\n   * @param {boolean} [force] Update size even if size of viewport was not changed.\n   */\n\n\n  updateSize(force) {\n    // let item;\n    // let itemIndex;\n    if (this.isDestroying) {\n      // exit if PhotoSwipe is closed or closing\n      // (to avoid errors, as resize event might be delayed)\n      return;\n    } //const newWidth = this.scrollWrap.clientWidth;\n    //const newHeight = this.scrollWrap.clientHeight;\n\n\n    const newViewportSize = getViewportSize(this.options, this);\n\n    if (!force && pointsEqual(newViewportSize, this._prevViewportSize)) {\n      // Exit if dimensions were not changed\n      return;\n    } //this._prevViewportSize.x = newWidth;\n    //this._prevViewportSize.y = newHeight;\n\n\n    equalizePoints(this._prevViewportSize, newViewportSize);\n    this.dispatch('beforeResize');\n    equalizePoints(this.viewportSize, this._prevViewportSize);\n\n    this._updatePageScrollOffset();\n\n    this.dispatch('viewportSize'); // Resize slides only after opener animation is finished\n    // and don't re-calculate size on inital size update\n\n    this.mainScroll.resize(this.opener.isOpen);\n\n    if (!this.hasMouse && window.matchMedia('(any-hover: hover)').matches) {\n      this.mouseDetected();\n    }\n\n    this.dispatch('resize');\n  }\n  /**\n   * @param {number} opacity\n   */\n\n\n  applyBgOpacity(opacity) {\n    this.bgOpacity = Math.max(opacity, 0);\n\n    if (this.bg) {\n      this.bg.style.opacity = String(this.bgOpacity * this.options.bgOpacity);\n    }\n  }\n  /**\n   * Whether mouse is detected\n   */\n\n\n  mouseDetected() {\n    if (!this.hasMouse) {\n      var _this$element2;\n\n      this.hasMouse = true;\n      (_this$element2 = this.element) === null || _this$element2 === void 0 || _this$element2.classList.add('pswp--has_mouse');\n    }\n  }\n  /**\n   * Page resize event handler\n   *\n   * @private\n   */\n\n\n  _handlePageResize() {\n    this.updateSize(); // In iOS webview, if element size depends on document size,\n    // it'll be measured incorrectly in resize event\n    //\n    // https://bugs.webkit.org/show_bug.cgi?id=170595\n    // https://hackernoon.com/onresize-event-broken-in-mobile-safari-d8469027bf4d\n\n    if (/iPhone|iPad|iPod/i.test(window.navigator.userAgent)) {\n      setTimeout(() => {\n        this.updateSize();\n      }, 500);\n    }\n  }\n  /**\n   * Page scroll offset is used\n   * to get correct coordinates\n   * relative to PhotoSwipe viewport.\n   *\n   * @private\n   */\n\n\n  _updatePageScrollOffset() {\n    this.setScrollOffset(0, window.pageYOffset);\n  }\n  /**\n   * @param {number} x\n   * @param {number} y\n   */\n\n\n  setScrollOffset(x, y) {\n    this.offset.x = x;\n    this.offset.y = y;\n    this.dispatch('updateScrollOffset');\n  }\n  /**\n   * Create main HTML structure of PhotoSwipe,\n   * and add it to DOM\n   *\n   * @private\n   */\n\n\n  _createMainStructure() {\n    // root DOM element of PhotoSwipe (.pswp)\n    this.element = createElement('pswp', 'div');\n    this.element.setAttribute('tabindex', '-1');\n    this.element.setAttribute('role', 'dialog'); // template is legacy prop\n\n    this.template = this.element; // Background is added as a separate element,\n    // as animating opacity is faster than animating rgba()\n\n    this.bg = createElement('pswp__bg', 'div', this.element);\n    this.scrollWrap = createElement('pswp__scroll-wrap', 'section', this.element);\n    this.container = createElement('pswp__container', 'div', this.scrollWrap); // aria pattern: carousel\n\n    this.scrollWrap.setAttribute('aria-roledescription', 'carousel');\n    this.container.setAttribute('aria-live', 'off');\n    this.container.setAttribute('id', 'pswp__items');\n    this.mainScroll.appendHolders();\n    this.ui = new UI(this);\n    this.ui.init(); // append to DOM\n\n    (this.options.appendToEl || document.body).appendChild(this.element);\n  }\n  /**\n   * Get position and dimensions of small thumbnail\n   *   {x:,y:,w:}\n   *\n   * Height is optional (calculated based on the large image)\n   *\n   * @returns {Bounds | undefined}\n   */\n\n\n  getThumbBounds() {\n    return getThumbBounds(this.currIndex, this.currSlide ? this.currSlide.data : this._initialItemData, this);\n  }\n  /**\n   * If the PhotoSwipe can have continuous loop\n   * @returns Boolean\n   */\n\n\n  canLoop() {\n    return this.options.loop && this.getNumItems() > 2;\n  }\n  /**\n   * @private\n   * @param {PhotoSwipeOptions} options\n   * @returns {PreparedPhotoSwipeOptions}\n   */\n\n\n  _prepareOptions(options) {\n    if (window.matchMedia('(prefers-reduced-motion), (update: slow)').matches) {\n      options.showHideAnimationType = 'none';\n      options.zoomAnimationDuration = 0;\n    }\n    /** @type {PreparedPhotoSwipeOptions} */\n\n\n    return { ...defaultOptions,\n      ...options\n    };\n  }\n\n}\n\nexport { PhotoSwipe as default };\n//# sourceMappingURL=photoswipe.esm.js.map\n","/* Handles turning regular file uploads on the page into a fancy multiple file upload using AJAX. */\nimport { makeEl } from \"./dom\";\n\nfunction bytesToMegabytes(value) {\n    return value / 1024.0 / 1024.0;\n}\n\n/** Simple class that represents our little progress bar / info field for each uploaded file. */\nclass ProgressWidget {\n    constructor(element, fileName) {\n        this.progress = element.querySelector('progress');\n        this.infoField = element.querySelector('.js-upload-info');\n        this.fileName = fileName;\n    }\n\n    /** Set the progress amount to a given amount, updating the progress bar. */\n    update(progress, text) {\n        this.progress.setAttribute('value', String(progress));\n        this.infoField.innerText = `${this.fileName} Uploading: ${progress}% (${text})...`;\n    }\n\n    /** Finish the upload successfully, hiding the progress bar and updating the status text. */\n    finish() {\n        this.progress.classList.add('is-hidden');\n        this.infoField.innerText = `${this.fileName} Upload complete!`;\n    }\n\n    /** Finish the upload with an error, hiding the progress bar and updating the status text to the given error. */\n    error(message) {\n        this.progress.classList.add('is-hidden');\n        this.infoField.innerText = this.fileName + ' ' + message;\n    }\n}\n\nclass AjaxFileUploadWidget {\n    constructor(rootElem) {\n        this.duplicated = false;\n        this.rootElem = rootElem;\n        this.fileField = rootElem.querySelector('input[type=file]');\n        this.fileLabel = rootElem.querySelector('.file-label');\n        this.nameField = rootElem.querySelector('.file-name');\n        this.submitButton = rootElem.querySelector('input[type=submit]');\n    }\n\n    attach() {\n        // Update file name displayed to the user\n        this.fileField.addEventListener('change', e => {\n            this.nameField.innerText =\n                Array.prototype.map.call(this.fileField.files, (f => f.name)).join(', '); // TODO: This may not work on all browsers?\n        });\n\n        this.submitButton.addEventListener('click', e => {\n            e.preventDefault();\n            this.onSubmit();\n        });\n    }\n\n    doUpload(file, url) {\n        const xhr = new XMLHttpRequest();\n        const formData = new FormData();\n        const csrfToken = document.querySelector('meta[name=csrf-token]').getAttribute('content');\n        const progressWidget = this.makeProgressWidget(file.name);\n\n        formData.append('attachment', file);\n        xhr.upload.addEventListener('progress', e => {\n            if (e.lengthComputable) {\n                const percent = Math.round((e.loaded / e.total) * 100);\n\n                if (e.loaded === e.total) {\n                    progressWidget.update(percent, `Done, processing ${bytesToMegabytes(e.total).toFixed(2)} MB`)\n                } else {\n                    progressWidget.update(percent, `${bytesToMegabytes(e.loaded).toFixed(2)}/${bytesToMegabytes(e.total).toFixed(2)} MB`);\n                }\n            }\n        });\n\n        xhr.addEventListener('load', _ => {\n            if (xhr.status < 200 || xhr.status > 299) {\n                const response = JSON.parse(xhr.response);\n                if (response.errors) {\n                    progressWidget.error(`Upload error occurred (${response.errors.join(', ')},) please try again!`);\n                } else {\n                    progressWidget.error(\n                        `Upload error occurred (${xhr.status} ${xhr.statusText},) please try again!`\n                    );\n                }\n            } else {\n                progressWidget.finish();\n            }\n        });\n\n        xhr.addEventListener('error', _ => {\n            progressWidget.error('Upload error occurred, please try again!')\n        });\n\n        xhr.open('POST', url, true);\n        xhr.setRequestHeader('X-CSRF-Token', csrfToken);\n        xhr.send(formData);\n    }\n\n    onSubmit() {\n        if (this.fileField.files.length === 0 || !this.fileField.files[0]) {\n            return;\n        }\n\n        for (let i = 0; i < this.fileField.files.length; i++) {\n            this.doUpload(this.fileField.files[i], this.rootElem.getAttribute('action'));\n        }\n\n        this.fileField.files.length = 0;\n        this.nameField.innerText = 'Select more files...';\n    }\n\n    makeProgressWidget(fileName) {\n        const element = makeEl(`\n            <div>\n                <span class=\"js-upload-info\"></span>\n                <progress class=\"progress is-success\" value=\"0\" max=\"100\"></progress>\n            </div>\n        `);\n\n        return new ProgressWidget(\n            this.rootElem.appendChild(element),\n            fileName\n        );\n    }\n}\n\nfunction setupFileUpload(rootElem) {\n    new AjaxFileUploadWidget(rootElem)\n        .attach();\n}\n\nfunction setupFileUploads() {\n    const uploadContainers = document.querySelectorAll('.js-file-upload');\n\n    for (const uploadContainer of uploadContainers) {\n        setupFileUpload(uploadContainer);\n    }\n}\n\nexport { setupFileUploads };\n","/* Handles fetching a list of autocomplete possibilities and displaying matching ones\n * when you type into an input field. */\nimport { clearEl, makeEl, escape } from './dom';\n\nclass InputAutocomplete {\n    // the element should be a container which contains the input and the .dropdown-menu menu\n    constructor(element) {\n        this.inputElement = element.querySelector('input');\n        this.dropdownItemsElement = element.querySelector('.dropdown-content');\n        this.autocompleteItems = null;\n        this.autocompleteUrl = element.dataset.autocompleteSource;\n    }\n\n    attach() {\n        this.inputElement.addEventListener('keyup', e => {\n            this._search(this.inputElement.value);\n        });\n\n        this.inputElement.addEventListener('focusin', e => {\n            if (this.inputElement.value) {\n                this._search(this.inputElement.value);\n            }\n        });\n\n        this.inputElement.addEventListener('focusout', e => {\n            setTimeout(() => this.dropdownItemsElement.parentElement.style = '', 100);\n        });\n    }\n\n    _search(searchString) {\n        const tags = searchString.toLowerCase().split(',');\n        const lastTag = tags[tags.length - 1].trim();\n\n        if (lastTag === '') {\n            return;\n        }\n\n        this._loadAutocompleteItems().then(items => {\n            // Find matching results\n            const matchingItems = [];\n            for (const item of items) {\n                if (item.toLowerCase().indexOf(lastTag) === 0) {\n                    matchingItems.push(item);\n                }\n            }\n\n            // Load them into the dropdown and make sure it's displayed.\n            clearEl(this.dropdownItemsElement);\n\n            for (const result of matchingItems) {\n                const suggestionEl = makeEl(`<a class=\"dropdown-item\" href=\"#\">${escape(result)}</a>`);\n\n                suggestionEl.addEventListener('click', e => {\n                    e.preventDefault();\n                    // Add the stupid tag?\n                    this.inputElement.dispatchEvent(\n                        new CustomEvent('tagadded', { details: { tag: result } })\n                    );\n                    // Clear the search string from the input\n                    this.inputElement.value = this.inputElement.value.substring(0, this.inputElement.value.lastIndexOf(lastTag));\n                    this.inputElement.value += result;\n                    this.dropdownItemsElement.style = '';\n                });\n\n                this.dropdownItemsElement.appendChild(suggestionEl);\n            }\n\n            this.dropdownItemsElement.parentElement.style = 'display: inline-block !important;';\n        });\n    }\n\n    _loadAutocompleteItems() {\n        if (this.autocompleteItems !== null) {\n            return Promise.resolve(this.autocompleteItems);\n        }\n\n        return fetch(this.autocompleteUrl)\n                .then(r => r.json())\n                .then(j => {\n                    this.autocompleteItems = j;\n                    return j;\n                });\n    }\n}\n\nfunction setupInputAutocomplete() {\n    for (const element of document.querySelectorAll('.js-input-autocomplete')) {\n        new InputAutocomplete(element)\n            .attach();\n    }\n}\n\nexport { setupInputAutocomplete };","/* Handles calling other parts of the JavaScript code when the DOM is ready. */\nimport { setupUjs } from \"./ujs\";\nimport { setupSorting } from \"./sort\";\nimport { setupTagsInput } from './tag_input';\nimport { setupPhotoGallery } from \"./gallery\";\nimport { setupFileUploads } from \"./file-upload\";\nimport { setupAdminCollapse } from \"./admin-tools\";\nimport { setupCookieAccept } from \"./cookie-notice\";\nimport { setupInputAutocomplete } from \"./input_autocomplete\";\n\nfunction whenReady() {\n    setupUjs();\n    setupSorting();\n    setupTagsInput();\n    setupPhotoGallery();\n    setupFileUploads();\n    setupAdminCollapse();\n    setupCookieAccept();\n    setupInputAutocomplete();\n}\n\nif (document.readyState !== 'loading') {\n    whenReady();\n} else {\n    document.addEventListener('DOMContentLoaded', whenReady);\n}\n","/* Handles collapsing the admin tools bar, so that admins can view the site as a normal user. */\nfunction setupAdminCollapse() {\n    const main = document.querySelector('main');\n    const adminToolsBox = document.querySelector('#admin-tools');\n\n    if (!adminToolsBox) {\n        return;\n    }\n\n    const collapseButton = adminToolsBox.querySelector('#admin-tools-collapse');\n\n    collapseButton.addEventListener('click', (e) => {\n        main.classList.remove('main--admin');\n        main.classList.add('main--user');\n\n        adminToolsBox.parentNode.removeChild(adminToolsBox);\n    });\n}\n\nexport { setupAdminCollapse };\n","function setupCookieAccept() {\n    const acceptButton = document.getElementById('accept-cookies');\n\n    if (!acceptButton) return;\n\n    const cookiesAccepted = localStorage.getItem('cookies-accepted') === 'true';\n\n    if (!cookiesAccepted) {\n        document.querySelector('.modal').classList.add('is-active');\n    }\n\n    acceptButton.addEventListener('click', () => {\n        localStorage.setItem('cookies-accepted', 'true');\n        document.querySelector('.modal').classList.remove('is-active');\n    });\n}\n\nexport { setupCookieAccept };","/* Handles the fancy photo gallery for Works, using PhotoSwipe. */\nimport { makeEl } from './dom';\nimport PhotoSwipeLightbox from './vendor/photoswipe-lightbox.esm';\nimport PhotoSwipe from './vendor/photoswipe.esm';\n\nfunction setupPhotoGallery() {\n    if (document.querySelector('#gallery')) {\n        new PhotoSwipeLightbox({\n            gallery: '#gallery',\n            children: 'a.gallery__attachment',\n            pswpModule: PhotoSwipe\n        }).init();\n    }\n\n    [].forEach.call(document.querySelectorAll('div[data-video-src]'), el => {\n        el.addEventListener('click', e => {\n            e.preventDefault();\n            const video = makeEl(\n                `<video controls=\"controls\">\n                        <source src=\"${el.dataset.videoSrc}\" />\n                      </video>`\n            );\n            el.replaceWith(video);\n            video.play();\n        })\n    });\n}\n\nexport { setupPhotoGallery };"],"names":["ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread2","target","i","arguments","length","source","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","Symbol","iterator","constructor","prototype","value","configurable","writable","_extends","assign","hasOwnProperty","call","this","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","userAgent","pattern","window","navigator","match","IE11OrLess","Edge","FireFox","Safari","IOS","ChromeForAndroid","captureMode","capture","passive","on","el","event","fn","addEventListener","off","removeEventListener","matches","selector","substring","msMatchesSelector","webkitMatchesSelector","_","getParentOrHost","host","document","nodeType","parentNode","closest","ctx","includeCTX","_throttleTimeout","R_SPACE","toggleClass","name","state","classList","className","replace","css","prop","val","style","defaultView","getComputedStyle","currentStyle","matrix","selfOnly","appliedTransforms","transform","matrixFn","DOMMatrix","WebKitCSSMatrix","CSSMatrix","MSCSSMatrix","find","tagName","list","getElementsByTagName","n","getWindowScrollingElement","scrollingElement","documentElement","getRect","relativeToContainingBlock","relativeToNonStaticParent","undoScale","container","getBoundingClientRect","elRect","top","left","bottom","right","height","width","innerHeight","innerWidth","containerRect","parseInt","elMatrix","scaleX","a","scaleY","d","isScrolledPast","elSide","parentSide","parent","getParentAutoScrollElement","elSideVal","parentSideVal","getChild","childNum","options","includeDragEl","currentChild","children","display","Sortable","ghost","dragged","draggable","lastChild","last","lastElementChild","previousElementSibling","index","nodeName","toUpperCase","clone","getRelativeScrollOffset","offsetLeft","offsetTop","winScroller","scrollLeft","scrollTop","includeSelf","elem","gotSelf","clientWidth","scrollWidth","clientHeight","scrollHeight","elemCSS","overflowX","overflowY","body","isRectEqual","rect1","rect2","Math","round","throttle","callback","ms","args","setTimeout","scrollBy","x","y","Polymer","$","jQuery","Zepto","dom","cloneNode","getChildContainingRectFromElement","ghostEl","rect","Array","from","child","_rect$left","_rect$top","_rect$right","_rect$bottom","animated","childRect","min","Infinity","max","expando","Date","getTime","AnimationStateManager","animationCallbackId","animationStates","captureAnimationState","animation","slice","fromRect","thisAnimationDuration","childMatrix","f","e","addAnimationState","removeAnimationState","splice","arr","Number","indexOfObject","animateAll","_this","clearTimeout","animating","animationTime","time","toRect","prevFromRect","prevToRect","animatingRect","targetMatrix","sqrt","pow","calculateRealTime","animate","animationResetTimer","currentRect","duration","translateX","translateY","animatingX","animatingY","forRepaintDummy","offsetWidth","repaint","easing","plugins","defaults","initializeByDefault","PluginManager","mount","plugin","option","p","pluginName","concat","pluginEvent","eventName","sortable","evt","eventCanceled","cancel","eventNameGlobal","initializePlugins","initialized","modified","modifyOption","getEventProperties","eventProperties","modifiedValue","optionListeners","_excluded","_ref","undefined","originalEvent","data","bind","dragEl","parentEl","rootEl","nextEl","lastDownEl","cloneEl","cloneHidden","dragStarted","moved","putSortable","activeSortable","active","oldIndex","oldDraggableIndex","newIndex","newDraggableIndex","hideGhostForTarget","_hideGhostForTarget","unhideGhostForTarget","_unhideGhostForTarget","cloneNowHidden","cloneNowShown","dispatchSortableEvent","_dispatchEvent","info","targetEl","toEl","fromEl","extraEventProperties","onName","charAt","substr","CustomEvent","createEvent","initEvent","bubbles","cancelable","to","item","pullMode","lastPutMode","allEventProperties","dispatchEvent","activeGroup","tapEvt","touchEvt","lastDx","lastDy","tapDistanceLeft","tapDistanceTop","lastTarget","lastDirection","targetMoveDistance","ghostRelativeParent","awaitingDragStarted","ignoreNextClick","sortables","pastFirstInvertThresh","isCircumstantialInvert","ghostRelativeParentInitialScroll","_silent","savedInputChecked","documentExists","PositionGhostAbsolutely","CSSFloatProperty","supportDraggable","createElement","supportCssPointerEvents","cssText","pointerEvents","_detectDirection","elCSS","elWidth","paddingLeft","paddingRight","borderLeftWidth","borderRightWidth","child1","child2","firstChildCSS","secondChildCSS","firstChildWidth","marginLeft","marginRight","secondChildWidth","flexDirection","gridTemplateColumns","split","touchingSideChild2","clear","_prepareGroup","toFn","pull","sameGroup","group","otherGroup","join","originalGroup","checkPull","checkPut","put","revertClone","preventDefault","stopPropagation","stopImmediatePropagation","nearestEmptyInsertDetectEvent","touches","nearest","clientX","clientY","some","threshold","emptyInsertThreshold","insideHorizontally","insideVertically","ret","_onDragOver","_checkOutsideTargetEl","_isOutsideThisEl","toString","sort","disabled","store","handle","test","swapThreshold","invertSwap","invertedSwapThreshold","removeCloneOnHide","direction","ghostClass","chosenClass","dragClass","ignore","preventOnFilter","setData","dataTransfer","textContent","dropBubble","dragoverBubble","dataIdAttr","delay","delayOnTouchOnly","touchStartThreshold","devicePixelRatio","forceFallback","fallbackClass","fallbackOnBody","fallbackTolerance","fallbackOffset","supportPointer","nativeDraggable","_onTapStart","get","_onMove","dragRect","targetRect","willInsertAfter","retVal","onMoveFn","onMove","draggedRect","related","relatedRect","_disableDraggable","_unsilent","_generateId","str","src","href","sum","charCodeAt","_nextTick","_cancelNextTick","id","contains","_getDirection","type","touch","pointerType","originalTarget","shadowRoot","path","composedPath","root","inputs","idx","checked","_saveInputCheckedState","button","isContentEditable","criteria","trim","_prepareDragStart","dragStartFn","ownerDocument","nextSibling","_lastX","_lastY","_onDrop","_disableDelayedDragEvents","_triggerDragStart","_disableDelayedDrag","_delayedDragTouchMoveHandler","_dragStartTimer","abs","floor","_onTouchMove","_onDragStart","selection","empty","getSelection","removeAllRanges","err","_dragStarted","fallback","_appendGhost","_nulling","_emulateDragOver","elementFromPoint","ghostMatrix","relativeScrollOffset","dx","dy","b","c","cssMatrix","appendChild","removeAttribute","_hideClone","cloneId","insertBefore","_loopId","setInterval","effectAllowed","_dragStartId","revert","vertical","isOwner","canSort","fromSortable","completedFired","dragOverEvent","_ignoreWhileAnimating","completed","elLastChild","lastElRect","childContainingRect","spacer","_ghostIsLast","changed","firstElRect","_ghostIsFirst","firstChild","targetBeforeFirstSwap","sibling","differentLevel","differentRowCol","dragElS1Opp","dragElS2Opp","dragElOppLength","targetS1Opp","targetS2Opp","targetOppLength","_dragElInRowColumn","side1","scrolledPastTop","scrollBefore","isLastTarget","mouseOnAxis","targetLength","targetS1","targetS2","invert","_getInsertDirection","_getSwapDirection","dragIndex","nextElementSibling","after","moveVector","extra","axis","insertion","_showClone","_offMoveEvents","_offUpEvents","clearInterval","removeChild","save","handleEvent","dropEffect","_globalDragOver","toArray","order","getAttribute","useAnimation","items","set","destroy","querySelectorAll","utils","is","extend","dst","nextTick","cancelNextTick","detectDirection","element","_len","_key","create","version","scrollEl","scrollRootEl","lastAutoScrollX","lastAutoScrollY","touchEvt$1","pointerElemChangedInterval","autoScrolls","scrolling","clearAutoScrolls","autoScroll","pid","clearPointerElemChangedInterval","isFallback","scroll","scrollCustomFn","sens","scrollSensitivity","speed","scrollSpeed","scrollThisInstance","scrollFn","layersOut","currentParent","canScrollX","canScrollY","scrollPosX","scrollPosY","vx","vy","layer","scrollOffsetY","scrollOffsetX","bubbleScroll","drop","toSortable","changedTouches","onSpill","Revert","Remove","setupSorting","_step3","_iterator3","_createForOfIteratorHelper","_loop","onEnd","_step4","_iterator4","s","done","querySelector","setAttribute","String","sorting","grid","innerText","add","_step","_iterator","dataset","ordinal","remove","_step2","payload","_iterator2","csrfToken","fetch","location","method","JSON","stringify","headers","then","res","setupAggregateSorting","makeEl","html","template","innerHTML","content","escape","unsafe","startIndex","dragStart","_ref2","_ref3","_ref4","parentSortable","AutoScroll","forceAutoScrollFallback","_handleAutoScroll","_handleFallbackAutoScroll","dragOverCompleted","dragOverBubble","nulling","ogElemScroller","newElem","TagsInput","_createClass","_classCallCheck","tags","maxTags","inputNode","containerNode","_this2","_step5","_iterator5","tag","addTag","_handleInputKeyUp","_handleContainerClick","updateHiddenInputValue","details","node","toLowerCase","tagValue","previousSibling","deleteTagNode","appendToEl","setWidthHeight","w","h","LOAD_STATE","getElementsFromOption","legacySelector","elements","Element","NodeList","isArray","isSafari","vendor","PhotoSwipeEvent$1","PhotoSwipeEvent","defaultPrevented","Eventable$1","Eventable","_listeners","_filters","pswp","_this$_filters$name","_this$_filters$name2","_this$pswp","priority","f1","f2","addFilter","removeFilter","_this$_filters$name3","_this3","_len2","_key2","_this$_listeners$name","_this$pswp2","_this$pswp3","listener","_this$_listeners$name2","_this4","dispatch","Placeholder$1","Placeholder","imageSrc","imgEl","decoding","alt","scale","propValue","transformOrigin","_this$element","Content$1","Content","itemData","instance","placeholder","slide","displayedImageWidth","displayedImageHeight","isAttached","hasSlide","isDecoding","_this5","keepPlaceholder","isLazy","reload","usePlaceholder","placeholderEl","parentElement","prepend","placeholderSrc","applyFilters","msrc","isFirstSlide","isImageContent","loadImage","updateContentSize","_this$data$src","_this$data$alt","_this6","imageElement","updateSrcsetSizes","srcset","complete","onLoaded","onload","onerror","onError","isActive","heavyAppended","append","removePlaceholder","displayError","isError","setDisplayedSize","isInitialSizeUpdate","image","sizesWidth","largestUsedSize","sizes","load","isLoading","_this$instance$option","_this$instance$option2","errorMsgEl","errorMsg","_this7","supportsDecode","decode","appendImage","holderElement","parsePaddingOption","viewportSize","paddingValue","paddingFn","padding","legacyPropName","ZoomLevel$1","ZoomLevel","panAreaSize","elementSize","fit","fill","vFill","initial","secondary","maxWidth","maxHeight","hRatio","vRatio","_getInitial","_getSecondary","_getMax","zoomLevels","slideData","optionPrefix","optionName","optionValue","currZoomLevel","_parseZoomLevelOption","lazyLoadData","zoomLevel","createContentFromData","getViewportSizeFn","newViewportSize","getViewportSize","getPanAreaSize","update","lazyLoad","ceil","_this$options","numItems","dataSource","_getGalleryDOMElements","gallery","_this$options2","dataSourceItem","_domElementToItemData","galleryElement","_this$options3","_this$options4","childSelector","linkEl","pswpSrc","pswpSrcset","pswpWidth","pswpHeight","pswpType","_thumbnailEl$getAttri","thumbnailEl","currentSrc","pswpCropped","cropped","thumbCropped","PhotoSwipeLightbox","_PhotoSwipeBase$","_this8","_callSuper","_uid","shouldOpen","_preloadedContent","onThumbnailsClick","_inherits","PhotoSwipeBase","_this9","gallerySelector","ctrlKey","metaKey","altKey","shiftKey","specialKeyUsed","initialPoint","clickedIndex","getClickedIndex","currentTarget","loadAndOpen","getClickedIndexFn","clickedTarget","clickedChildIndex","findIndex","galleryElements","initialPointerPos","preload","_this10","promiseArray","pswpModuleType","_typeof2","pswpModule","goTo","Promise","resolve","Error","openPromise","preloadFirstSlide","getItemData","lazyLoadSlide","uid","all","iterableModules","mainModule","_openPhotoswipe","module","_this11","contentLoader","addToCache","init","_this12","equalizePoints","p1","p2","roundPoint","getDistanceBetween","pointsEqual","clamp","toTransformString","setTransform","defaultCSSEasing","setTransitionStyle","ease","transition","supportsPassive","DOMEvents","_pool","_toggleListener","_this13","poolItem","unbind","skipPool","_this14","methodName","eType","eventOptions","PanBounds","center","_updateAxis","reset","elSize","panOffset","Slide","currIndex","currentResolution","pan","opener","isOpen","getContentBySlide","bounds","prevDisplayedWidth","prevDisplayedHeight","activate","deactivate","calculateSize","appendHeavy","zoomAndPanToInitial","applyCurrentZoomPan","mainScroll","isShifted","panTo","force","scaleMultiplier","sizeChanged","_this$content$placeho","destZoomLevel","centerPoint","transitionDuration","ignoreBounds","_this15","isZoomable","animations","stopAllPan","prevZoomLevel","setZoomLevel","calculateZoomToPanOffset","finishTransition","_setResolution","startTransition","isPan","getCurrentTransform","onComplete","zoomTo","zoomAnimationDuration","point","getViewportCenterPoint","zoomFactor","correctPan","panX","panY","Boolean","_applyZoomTransform","currSlide","zoom","newResolution","DragHandler","gestures","startPan","stopAll","_this$gestures","prevP1","dragAxis","closeOnVerticalDrag","isMultitouch","_setPanWithFriction","bgOpacity","_getVerticalDragRatio","applyBgOpacity","_panOrMoveMainScroll","velocity","_this$pswp4","indexDiff","currentSlideVisibilityRatio","getCurrSlideX","moveIndexBy","correctZoomPan","_finishPanGestureForAxis","_this16","panPos","restoreBgOpacity","projectedPosition","initialVelocity","decelerationRate","project","vDragRatio","projectedVDragRatio","close","correctedPanPosition","dampingRatio","initialBgOpacity","totalPanDist","startSpring","start","end","onUpdate","pos","animationProgressRatio","_this$gestures2","_this$pswp5","delta","newMainScrollX","isPannable","moveTo","newPan","allowPanToNext","currSlideMainScrollX","mainScrollShiftDiff","isLeftToRight","isRightToLeft","_this$pswp$currSlide$","_this$pswp$currSlide","potentialPan","customFriction","getZoomPointsCenter","ZoomHandler","_startPan","_startZoomPoint","_zoomPoint","_wasOverFitZoomLevel","_startZoomLevel","_this$gestures3","startP1","startP2","minZoomLevel","maxZoomLevel","pinchToClose","_calculatePanForZoomLevel","ignoreGesture","destinationZoomLevel","currZoomLevelNeedsChange","initialPan","destinationPan","panNeedsChange","naturalFrequency","now","newZoomLevel","didTapOnMainContent","TapHandler","targetClassList","isImageClick","isBackgroundClick","_doClickOrTapAction","actionName","_this$gestures$pswp$e","actionFullName","toggleZoom","clickToCloseNonZoomable","toggle","Gestures","_this17","prevP2","_lastStartP1","_intervalP1","_numActivePoints","_ongoingPointers","_touchEventEnabled","_pointerEventEnabled","PointerEvent","supportsTouch","maxTouchPoints","_intervalTime","_velocityCalculated","isDragging","isZooming","raf","_tapTimer","drag","tapHandler","events","scrollWrap","_onClick","_bindEvents","ontouchmove","ontouchend","pref","down","up","cancelEvent","onPointerDown","onPointerMove","onPointerUp","isMousePointer","mouseDetected","_preventPointerEventBehaviour","_updatePoints","_clearTapTimer","_finishDrag","_updateStartPoints","_rafStopLoop","_rafRenderLoop","_calculateDragDirection","_updateVelocity","_finishTap","change","_updatePrevPoints","requestAnimationFrame","_getVelocity","_this18","tapDelay","doubleTapAction","doubleTap","tap","click","displacement","cancelAnimationFrame","pointerEvent","pointerIndex","ongoingPointer","pointerId","_convertEventPosToPoint","touchEvent","diff","axisToCheck","pageX","offset","pageY","identifier","MainScroll","slideWidth","_currPositionIndex","_prevPositionIndex","_containerShiftIndex","itemHolders","resizeSlides","_this19","newSlideWidth","spacing","slideWidthChanged","itemHolder","resize","getNumItems","velocityX","_this20","potentialIndex","numSlides","canLoop","getLoopedIndex","distance","stopMainScroll","destinationX","isMainScroll","updateCurrItem","currDiff","currDistance","_this$itemHolders$","positionDifference","tempHolder","diffAbs","_itemHolder$slide","shift","setContent","pop","unshift","resetPosition","setIsActive","updateLazy","dragging","newSlideIndexOffset","KeyboardKeyCodesMap","Escape","z","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","Tab","getKeyboardEventKey","isKeySupported","Keyboard","_this21","_wasFocused","trapFocus","_focusRoot","_onFocusIn","_onKeyDown","lastActiveElement","activeElement","returnFocus","focus","keydownAction","isForward","keyCode","escKey","arrowKeys","CSSAnimation","props","_props$prop","_this22","_props$onFinish","onFinish","_props$duration","_props$easing","DEFAULT_EASING","_target","_onComplete","_finished","_onTransitionEnd","_helperTimeout","_finalizeAnimation","SpringEaser","_dampingRatio","_naturalFrequency","_dampedFrequency","deltaPosition","deltaTime","coeff","naturalDumpingPow","E","dumpedFCos","cos","dumpedFSin","sin","SpringAnimation","_this23","_raf","_props$onFinish2","easer","prevTime","animationLoop","easeFrame","Animations","activeAnimations","_start","isSpring","_this24","stop","ScrollWheel","_onWheel","deltaX","deltaY","wheelToZoom","deltaMode","UIElement","_container","elementHTML","isButton","title","ariaLabel","ariaText","htmlData","isCustomSVG","svgData","out","size","outlineID","inner","addElementHTML","onInit","onClick","onclick","appendTo","topBar","initArrowButton","isNextButton","loop","arrowPrev","arrowNext","closeButton","zoomButton","loadingIndicator","indicatorElement","isVisible","delayTimeout","setIndicatorVisibility","visible","updatePreloaderVisibility","_pswp$currSlide","_pswp$currSlide2","preloaderDelay","ui","counterIndicator","counterElement","indexIndicatorSep","setZoomedIn","isZoomedIn","UI","isRegistered","uiElementsData","_lastUpdatedZoomLevel","_this25","uiElementData","registerElement","_pswp$element","_onZoomPanUpdate","elementData","_this$pswp6","isClosing","currZoomLevelDiff","imageClickAction","_this26","_len3","_key3","_this27","_this28","_this29","_this30","ContentLoader","limit","_cachedItems","loadSlideByIndex","initialIndex","getContentByIndex","setSlide","removeByIndex","indexToRemove","_Eventable","MIN_OPACITY","Opener","isClosed","isOpening","_duration","_useAnimation","_croppedZoom","_animateRootOpacity","_animateBgOpacity","_placeholder","_opacityElement","_cropContainer1","_cropContainer2","_thumbBounds","_prepareOpen","_this31","hideAnimationDuration","maxWidthToAnimate","_applyStartProps","showAnimationDuration","_options$showHideOpac","showHideAnimationType","showHideOpacity","_initialThumbBounds","getThumbBounds","getPlaceholderElement","_animateZoom","bg","opacity","innerRect","overflow","_setClosedStateZoomPan","willChange","_this32","img","decoded","isDelaying","reject","_initiate","_this$pswp$element","_this$pswp$element2","setProperty","_animateToOpenState","_animateToClosedState","_onAnimationComplete","_animateTo","containerOnePanX","containerOnePanY","containerTwoPanX","containerTwoPanY","_this33","animProps","defaultOptions","bgClickAction","tapAction","PhotoSwipe","_PhotoSwipeBase","_this34","_prepareOptions","_prevViewportSize","isDestroying","hasMouse","_initialItemData","keyboard","_this35","_createMainStructure","rootClasses","mainClass","scrollWheel","isNaN","updateSize","pageYOffset","_handlePageResize","_updatePageScrollOffset","open","_this$currSlide4","_this$currSlide","_this$currSlide2","removeAll","_itemHolder$slide2","slideIndex","_this36","_this$currSlide$index","_this$currSlide3","_itemHolder$slide3","potentialHolderIndex","holder","matchMedia","_this$element2","_this37","setScrollOffset","appendHolders","thumbBounds","thumbnail","thumbAreaRect","thumbSelector","imageWidth","imageHeight","fillZoomLevel","offsetX","offsetY","getCroppedBoundsByElement","_objectSpread","bytesToMegabytes","ProgressWidget","fileName","progress","infoField","text","message","AjaxFileUploadWidget","rootElem","duplicated","fileField","fileLabel","nameField","submitButton","_this38","map","files","onSubmit","file","url","xhr","XMLHttpRequest","formData","FormData","progressWidget","makeProgressWidget","upload","lengthComputable","percent","loaded","total","toFixed","status","response","parse","errors","error","statusText","finish","setRequestHeader","send","doUpload","InputAutocomplete","inputElement","dropdownItemsElement","autocompleteItems","autocompleteUrl","autocompleteSource","_this39","_search","searchString","_this40","lastTag","_loadAutocompleteItems","_step8","matchingItems","_iterator8","_ref5","clearEl","_loop2","result","_matchingItems","_i","suggestionEl","lastIndexOf","_this41","r","json","j","whenReady","main","adminToolsBox","acceptButton","_step6","_iterator6","attach","setupTagsInput","video","videoSrc","replaceWith","play","_step7","_iterator7","uploadContainer","setupFileUploads","getElementById","localStorage","getItem","setItem","_step9","_iterator9","setupInputAutocomplete","readyState"],"mappings":"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","x_google_ignoreList":[0]}