PageSourceSearch

https://wjg-nettetal.de/wp-content/plugins/divi-modules-pro/public/js/swiper-11.1.14.min.js?ver=11.1.14

js wjg-nettetal.de collected 2026-10-03 01:01:09 UTC 342,407 bytes, 9,706 lines download raw bytes

vendor: 10,771 bytes, lines 1-374
1/**
2 * Swiper 11.1.14
3 * Most modern mobile touch slider and framework with hardware accelerated transitions
4 * https://swiperjs.com
5 *
6 * Copyright 2014-2024 Vladimir Kharlampidi
7 *
8 * Released under the MIT License
9 *
10 * Released on: September 12, 2024
11 */
12
13var Swiper = (function () {
14  'use strict';
15
16  /**
17   * SSR Window 4.0.2
18   * Better handling for window object in SSR environment
19   * https://github.com/nolimits4web/ssr-window
20   *
21   * Copyright 2021, Vladimir Kharlampidi
22   *
23   * Licensed under MIT
24   *
25   * Released on: December 13, 2021
26   */
27  /* eslint-disable no-param-reassign */
28  function isObject$1(obj) {
29    return obj !== null && typeof obj === 'object' && 'constructor' in obj && obj.constructor === Object;
30  }
31  function extend$1(target, src) {
32    if (target === void 0) {
33      target = {};
34    }
35    if (src === void 0) {
36      src = {};
37    }
38    Object.keys(src).forEach(key => {
39      if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject$1(src[key]) && isObject$1(target[key]) && Object.keys(src[key]).length > 0) {
40        extend$1(target[key], src[key]);
41      }
42    });
43  }
44  const hasReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
45  const ssrDocument = {
46    body: {},
47    addEventListener() {},
48    removeEventListener() {},
49    activeElement: {
50      blur() {},
51      nodeName: ''
52    },
53    querySelector() {
54      return null;
55    },
56    querySelectorAll() {
57      return [];
58    },
59    getElementById() {
60      return null;
61    },
62    createEvent() {
63      return {
64        initEvent() {}
65      };
66    },
67    createElement() {
68      return {
69        children: [],
70        childNodes: [],
71        style: {},
72        setAttribute() {},
73        getElementsByTagName() {
74          return [];
75        }
76      };
77    },
78    createElementNS() {
79      return {};
80    },
81    importNode() {
82      return null;
83    },
84    location: {
85      hash: '',
86      host: '',
87      hostname: '',
88      href: '',
89      origin: '',
90      pathname: '',
91      protocol: '',
92      search: ''
93    }
94  };
95  function getDocument() {
96    const doc = typeof document !== 'undefined' ? document : {};
97    extend$1(doc, ssrDocument);
98    return doc;
99  }
100  const ssrWindow = {
101    document: ssrDocument,
102    navigator: {
103      userAgent: ''
104    },
105    location: {
106      hash: '',
107      host: '',
108      hostname: '',
109      href: '',
110      origin: '',
111      pathname: '',
112      protocol: '',
113      search: ''
114    },
115    history: {
116      replaceState() {},
117      pushState() {},
118      go() {},
119      back() {}
120    },
121    CustomEvent: function CustomEvent() {
122      return this;
123    },
124    addEventListener() {},
125    removeEventListener() {},
126    getComputedStyle() {
127      return {
128        getPropertyValue() {
129          return '';
130        }
131      };
132    },
133    Image() {},
134    Date() {},
135    screen: {},
136    setTimeout() {},
137    clearTimeout() {},
138    matchMedia() {
139      return {};
140    },
141    requestAnimationFrame(callback) {
142      if (typeof setTimeout === 'undefined') {
143        callback();
144        return null;
145      }
146      return setTimeout(callback, 0);
147    },
148    cancelAnimationFrame(id) {
149      if (typeof setTimeout === 'undefined') {
150        return;
151      }
152      clearTimeout(id);
153    }
154  };
155  function getWindow() {
156    const win = typeof window !== 'undefined' ? window : {};
157    extend$1(win, ssrWindow);
158    return win;
159  }
160
161  function classesToTokens(classes) {
162    if (classes === void 0) {
163      classes = '';
164    }
165    return classes.trim().split(' ').filter(c => !!c.trim());
166  }
167
168  function deleteProps(obj) {
169    const object = obj;
170    Object.keys(object).forEach(key => {
171      try {
172        object[key] = null;
173      } catch (e) {
174        // no getter for object
175      }
176      try {
177        delete object[key];
178      } catch (e) {
179        // something got wrong
180      }
181    });
182  }
183  function nextTick(callback, delay) {
184    if (delay === void 0) {
185      delay = 0;
186    }
187    return setTimeout(callback, delay);
188  }
189  function now() {
190    return Date.now();
191  }
192  function getComputedStyle$1(el) {
193    const window = getWindow();
194    let style;
195    if (window.getComputedStyle) {
196      style = window.getComputedStyle(el, null);
197    }
198    if (!style && el.currentStyle) {
199      style = el.currentStyle;
200    }
201    if (!style) {
202      style = el.style;
203    }
204    return style;
205  }
206  function getTranslate(el, axis) {
207    if (axis === void 0) {
208      axis = 'x';
209    }
210    const window = getWindow();
211    let matrix;
212    let curTransform;
213    let transformMatrix;
214    const curStyle = getComputedStyle$1(el);
215    if (window.WebKitCSSMatrix) {
216      curTransform = curStyle.transform || curStyle.webkitTransform;
217      if (curTransform.split(',').length > 6) {
218        curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');
219      }
220      // Some old versions of Webkit choke when 'none' is passed; pass
221      // empty string instead in this case
222      transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);
223    } else {
224      transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');
225      matrix = transformMatrix.toString().split(',');
226    }
227    if (axis === 'x') {
228      // Latest Chrome and webkits Fix
229      if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41;
230      // Crazy IE10 Matrix
231      else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
232      // Normal Browsers
233      else curTransform = parseFloat(matrix[4]);
234    }
235    if (axis === 'y') {
236      // Latest Chrome and webkits Fix
237      if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42;
238      // Crazy IE10 Matrix
239      else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
240      // Normal Browsers
241      else curTransform = parseFloat(matrix[5]);
242    }
243    return curTransform || 0;
244  }
245  function isObject(o) {
246    return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';
247  }
248  function isNode(node) {
249    // eslint-disable-next-line
250    if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {
251      return node instanceof HTMLElement;
252    }
253    return node && (node.nodeType === 1 || node.nodeType === 11);
254  }
255  function extend() {
256    const to = Object(arguments.length <= 0 ? undefined : arguments[0]);
257    const noExtend = ['__proto__', 'constructor', 'prototype'];
258    for (let i = 1; i < arguments.length; i += 1) {
259      const nextSource = i < 0 || arguments.length <= i ? undefined : arguments[i];
260      if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {
261        const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);
262        for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
263          const nextKey = keysArray[nextIndex];
264          const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
265          if (desc !== undefined && desc.enumerable) {
266            if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
267              if (nextSource[nextKey].__swiper__) {
268                to[nextKey] = nextSource[nextKey];
269              } else {
270                extend(to[nextKey], nextSource[nextKey]);
271              }
272            } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {
273              to[nextKey] = {};
274              if (nextSource[nextKey].__swiper__) {
275                to[nextKey] = nextSource[nextKey];
276              } else {
277                extend(to[nextKey], nextSource[nextKey]);
278              }
279            } else {
280              to[nextKey] = nextSource[nextKey];
281            }
282          }
283        }
284      }
285    }
286    return to;
287  }
288  function setCSSProperty(el, varName, varValue) {
289    el.style.setProperty(varName, varValue);
290  }
291  function animateCSSModeScroll(_ref) {
292    let {
293      swiper,
294      targetPosition,
295      side
296    } = _ref;
297    const window = getWindow();
298    const startPosition = -swiper.translate;
299    let startTime = null;
300    let time;
301    const duration = swiper.params.speed;
302    swiper.wrapperEl.style.scrollSnapType = 'none';
303    window.cancelAnimationFrame(swiper.cssModeFrameID);
304    const dir = targetPosition > startPosition ? 'next' : 'prev';
305    const isOutOfBound = (current, target) => {
306      return dir === 'next' && current >= target || dir === 'prev' && current <= target;
307    };
308    const animate = () => {
309      time = new Date().getTime();
310      if (startTime === null) {
311        startTime = time;
312      }
313      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
314      const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
315      let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
316      if (isOutOfBound(currentPosition, targetPosition)) {
317        currentPosition = targetPosition;
318      }
319      swiper.wrapperEl.scrollTo({
320        [side]: currentPosition
321      });
322      if (isOutOfBound(currentPosition, targetPosition)) {
323        swiper.wrapperEl.style.overflow = 'hidden';
324        swiper.wrapperEl.style.scrollSnapType = '';
325        setTimeout(() => {
326          swiper.wrapperEl.style.overflow = '';
327          swiper.wrapperEl.scrollTo({
328            [side]: currentPosition
329          });
330        });
331        window.cancelAnimationFrame(swiper.cssModeFrameID);
332        return;
333      }
334      swiper.cssModeFrameID = window.requestAnimationFrame(animate);
335    };
336    animate();
337  }
338  function getSlideTransformEl(slideEl) {
339    return slideEl.querySelector('.swiper-slide-transform') || slideEl.shadowRoot && slideEl.shadowRoot.querySelector('.swiper-slide-transform') || slideEl;
340  }
341  function elementChildren(element, selector) {
342    if (selector === void 0) {
343      selector = '';
344    }
345    const children = [...element.children];
346    if (element instanceof HTMLSlotElement) {
347      children.push(...element.assignedElements());
348    }
349    if (!selector) {
350      return children;
351    }
352    return children.filter(el => el.matches(selector));
353  }
354  function elementIsChildOf(el, parent) {
355    const isChild = parent.contains(el);
356    if (!isChild && parent instanceof HTMLSlotElement) {
357      const children = [...parent.assignedElements()];
358      return children.includes(el);
359    }
360    return isChild;
361  }
362  function showWarning(text) {
363    try {
364      console.warn(text);
365      return;
366    } catch (err) {
367      // err
368    }
369  }
370  function createElement(tag, classes) {
371    if (classes === void 0) {
372      classes = [];
373    }
374    const el = document.createElement(tag);
vendor: 3,772 bytes, lines 375-493
375    el.classList.add(...(Array.isArray(classes) ? classes : classesToTokens(classes)));
376    return el;
377  }
378  function elementOffset(el) {
379    const window = getWindow();
380    const document = getDocument();
381    const box = el.getBoundingClientRect();
382    const body = document.body;
383    const clientTop = el.clientTop || body.clientTop || 0;
384    const clientLeft = el.clientLeft || body.clientLeft || 0;
385    const scrollTop = el === window ? window.scrollY : el.scrollTop;
386    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;
387    return {
388      top: box.top + scrollTop - clientTop,
389      left: box.left + scrollLeft - clientLeft
390    };
391  }
392  function elementPrevAll(el, selector) {
393    const prevEls = [];
394    while (el.previousElementSibling) {
395      const prev = el.previousElementSibling; // eslint-disable-line
396      if (selector) {
397        if (prev.matches(selector)) prevEls.push(prev);
398      } else prevEls.push(prev);
399      el = prev;
400    }
401    return prevEls;
402  }
403  function elementNextAll(el, selector) {
404    const nextEls = [];
405    while (el.nextElementSibling) {
406      const next = el.nextElementSibling; // eslint-disable-line
407      if (selector) {
408        if (next.matches(selector)) nextEls.push(next);
409      } else nextEls.push(next);
410      el = next;
411    }
412    return nextEls;
413  }
414  function elementStyle(el, prop) {
415    const window = getWindow();
416    return window.getComputedStyle(el, null).getPropertyValue(prop);
417  }
418  function elementIndex(el) {
419    let child = el;
420    let i;
421    if (child) {
422      i = 0;
423      // eslint-disable-next-line
424      while ((child = child.previousSibling) !== null) {
425        if (child.nodeType === 1) i += 1;
426      }
427      return i;
428    }
429    return undefined;
430  }
431  function elementParents(el, selector) {
432    const parents = []; // eslint-disable-line
433    let parent = el.parentElement; // eslint-disable-line
434    while (parent) {
435      if (selector) {
436        if (parent.matches(selector)) parents.push(parent);
437      } else {
438        parents.push(parent);
439      }
440      parent = parent.parentElement;
441    }
442    return parents;
443  }
444  function elementTransitionEnd(el, callback) {
445    function fireCallBack(e) {
446      if (e.target !== el) return;
447      callback.call(el, e);
448      el.removeEventListener('transitionend', fireCallBack);
449    }
450    if (callback) {
451      el.addEventListener('transitionend', fireCallBack);
452    }
453  }
454  function elementOuterSize(el, size, includeMargins) {
455    const window = getWindow();
456    if (includeMargins) {
457      return el[size === 'width' ? 'offsetWidth' : 'offsetHeight'] + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-right' : 'margin-top')) + parseFloat(window.getComputedStyle(el, null).getPropertyValue(size === 'width' ? 'margin-left' : 'margin-bottom'));
458    }
459    return el.offsetWidth;
460  }
461  function makeElementsArray(el) {
462    return (Array.isArray(el) ? el : [el]).filter(e => !!e);
463  }
464  function getRotateFix(swiper) {
465    return v => {
466      if (Math.abs(v) > 0 && swiper.browser && swiper.browser.need3dFix && Math.abs(v) % 90 === 0) {
467        return v + 0.001;
468      }
469      return v;
470    };
471  }
472
473  let support;
474  function calcSupport() {
475    const window = getWindow();
476    const document = getDocument();
477    return {
478      smoothScroll: document.documentElement && document.documentElement.style && 'scrollBehavior' in document.documentElement.style,
479      touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch)
480    };
481  }
482  function getSupport() {
483    if (!support) {
484      support = calcSupport();
485    }
486    return support;
487  }
488
489  let deviceCached;
490  function calcDevice(_temp) {
491    let {
492      userAgent
493    } = _temp === void 0 ? {} : _temp;
vendor: 4,996 bytes, lines 494-652
494    const support = getSupport();
495    const window = getWindow();
496    const platform = window.navigator.platform;
497    const ua = userAgent || window.navigator.userAgent;
498    const device = {
499      ios: false,
500      android: false
501    };
502    const screenWidth = window.screen.width;
503    const screenHeight = window.screen.height;
504    const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); // eslint-disable-line
505    let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
506    const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
507    const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
508    const windows = platform === 'Win32';
509    let macos = platform === 'MacIntel';
510
511    // iPadOs 13 fix
512    const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];
513    if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
514      ipad = ua.match(/(Version)\/([\d.]+)/);
515      if (!ipad) ipad = [0, 1, '13_0_0'];
516      macos = false;
517    }
518
519    // Android
520    if (android && !windows) {
521      device.os = 'android';
522      device.android = true;
523    }
524    if (ipad || iphone || ipod) {
525      device.os = 'ios';
526      device.ios = true;
527    }
528
529    // Export object
530    return device;
531  }
532  function getDevice(overrides) {
533    if (overrides === void 0) {
534      overrides = {};
535    }
536    if (!deviceCached) {
537      deviceCached = calcDevice(overrides);
538    }
539    return deviceCached;
540  }
541
542  let browser;
543  function calcBrowser() {
544    const window = getWindow();
545    const device = getDevice();
546    let needPerspectiveFix = false;
547    function isSafari() {
548      const ua = window.navigator.userAgent.toLowerCase();
549      return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;
550    }
551    if (isSafari()) {
552      const ua = String(window.navigator.userAgent);
553      if (ua.includes('Version/')) {
554        const [major, minor] = ua.split('Version/')[1].split(' ')[0].split('.').map(num => Number(num));
555        needPerspectiveFix = major < 16 || major === 16 && minor < 2;
556      }
557    }
558    const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent);
559    const isSafariBrowser = isSafari();
560    const need3dFix = isSafariBrowser || isWebView && device.ios;
561    return {
562      isSafari: needPerspectiveFix || isSafariBrowser,
563      needPerspectiveFix,
564      need3dFix,
565      isWebView
566    };
567  }
568  function getBrowser() {
569    if (!browser) {
570      browser = calcBrowser();
571    }
572    return browser;
573  }
574
575  function Resize(_ref) {
576    let {
577      swiper,
578      on,
579      emit
580    } = _ref;
581    const window = getWindow();
582    let observer = null;
583    let animationFrame = null;
584    const resizeHandler = () => {
585      if (!swiper || swiper.destroyed || !swiper.initialized) return;
586      emit('beforeResize');
587      emit('resize');
588    };
589    const createObserver = () => {
590      if (!swiper || swiper.destroyed || !swiper.initialized) return;
591      observer = new ResizeObserver(entries => {
592        animationFrame = window.requestAnimationFrame(() => {
593          const {
594            width,
595            height
596          } = swiper;
597          let newWidth = width;
598          let newHeight = height;
599          entries.forEach(_ref2 => {
600            let {
601              contentBoxSize,
602              contentRect,
603              target
604            } = _ref2;
605            if (target && target !== swiper.el) return;
606            newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
607            newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
608          });
609          if (newWidth !== width || newHeight !== height) {
610            resizeHandler();
611          }
612        });
613      });
614      observer.observe(swiper.el);
615    };
616    const removeObserver = () => {
617      if (animationFrame) {
618        window.cancelAnimationFrame(animationFrame);
619      }
620      if (observer && observer.unobserve && swiper.el) {
621        observer.unobserve(swiper.el);
622        observer = null;
623      }
624    };
625    const orientationChangeHandler = () => {
626      if (!swiper || swiper.destroyed || !swiper.initialized) return;
627      emit('orientationchange');
628    };
629    on('init', () => {
630      if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {
631        createObserver();
632        return;
633      }
634      window.addEventListener('resize', resizeHandler);
635      window.addEventListener('orientationchange', orientationChangeHandler);
636    });
637    on('destroy', () => {
638      removeObserver();
639      window.removeEventListener('resize', resizeHandler);
640      window.removeEventListener('orientationchange', orientationChangeHandler);
641    });
642  }
643
644  function Observer(_ref) {
645    let {
646      swiper,
647      extendParams,
648      on,
649      emit
650    } = _ref;
651    const observers = [];
652    const window = getWindow
vendor: 9,007 bytes, lines 652-909
652();
653    const attach = function (target, options) {
654      if (options === void 0) {
655        options = {};
656      }
657      const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;
658      const observer = new ObserverFunc(mutations => {
659        // The observerUpdate event should only be triggered
660        // once despite the number of mutations.  Additional
661        // triggers are redundant and are very costly
662        if (swiper.__preventObserver__) return;
663        if (mutations.length === 1) {
664          emit('observerUpdate', mutations[0]);
665          return;
666        }
667        const observerUpdate = function observerUpdate() {
668          emit('observerUpdate', mutations[0]);
669        };
670        if (window.requestAnimationFrame) {
671          window.requestAnimationFrame(observerUpdate);
672        } else {
673          window.setTimeout(observerUpdate, 0);
674        }
675      });
676      observer.observe(target, {
677        attributes: typeof options.attributes === 'undefined' ? true : options.attributes,
678        childList: swiper.isElement || (typeof options.childList === 'undefined' ? true : options).childList,
679        characterData: typeof options.characterData === 'undefined' ? true : options.characterData
680      });
681      observers.push(observer);
682    };
683    const init = () => {
684      if (!swiper.params.observer) return;
685      if (swiper.params.observeParents) {
686        const containerParents = elementParents(swiper.hostEl);
687        for (let i = 0; i < containerParents.length; i += 1) {
688          attach(containerParents[i]);
689        }
690      }
691      // Observe container
692      attach(swiper.hostEl, {
693        childList: swiper.params.observeSlideChildren
694      });
695
696      // Observe wrapper
697      attach(swiper.wrapperEl, {
698        attributes: false
699      });
700    };
701    const destroy = () => {
702      observers.forEach(observer => {
703        observer.disconnect();
704      });
705      observers.splice(0, observers.length);
706    };
707    extendParams({
708      observer: false,
709      observeParents: false,
710      observeSlideChildren: false
711    });
712    on('init', init);
713    on('destroy', destroy);
714  }
715
716  /* eslint-disable no-underscore-dangle */
717
718  var eventsEmitter = {
719    on(events, handler, priority) {
720      const self = this;
721      if (!self.eventsListeners || self.destroyed) return self;
722      if (typeof handler !== 'function') return self;
723      const method = priority ? 'unshift' : 'push';
724      events.split(' ').forEach(event => {
725        if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
726        self.eventsListeners[event][method](handler);
727      });
728      return self;
729    },
730    once(events, handler, priority) {
731      const self = this;
732      if (!self.eventsListeners || self.destroyed) return self;
733      if (typeof handler !== 'function') return self;
734      function onceHandler() {
735        self.off(events, onceHandler);
736        if (onceHandler.__emitterProxy) {
737          delete onceHandler.__emitterProxy;
738        }
739        for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
740          args[_key] = arguments[_key];
741        }
742        handler.apply(self, args);
743      }
744      onceHandler.__emitterProxy = handler;
745      return self.on(events, onceHandler, priority);
746    },
747    onAny(handler, priority) {
748      const self = this;
749      if (!self.eventsListeners || self.destroyed) return self;
750      if (typeof handler !== 'function') return self;
751      const method = priority ? 'unshift' : 'push';
752      if (self.eventsAnyListeners.indexOf(handler) < 0) {
753        self.eventsAnyListeners[method](handler);
754      }
755      return self;
756    },
757    offAny(handler) {
758      const self = this;
759      if (!self.eventsListeners || self.destroyed) return self;
760      if (!self.eventsAnyListeners) return self;
761      const index = self.eventsAnyListeners.indexOf(handler);
762      if (index >= 0) {
763        self.eventsAnyListeners.splice(index, 1);
764      }
765      return self;
766    },
767    off(events, handler) {
768      const self = this;
769      if (!self.eventsListeners || self.destroyed) return self;
770      if (!self.eventsListeners) return self;
771      events.split(' ').forEach(event => {
772        if (typeof handler === 'undefined') {
773          self.eventsListeners[event] = [];
774        } else if (self.eventsListeners[event]) {
775          self.eventsListeners[event].forEach((eventHandler, index) => {
776            if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
777              self.eventsListeners[event].splice(index, 1);
778            }
779          });
780        }
781      });
782      return self;
783    },
784    emit() {
785      const self = this;
786      if (!self.eventsListeners || self.destroyed) return self;
787      if (!self.eventsListeners) return self;
788      let events;
789      let data;
790      let context;
791      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
792        args[_key2] = arguments[_key2];
793      }
794      if (typeof args[0] === 'string' || Array.isArray(args[0])) {
795        events = args[0];
796        data = args.slice(1, args.length);
797        context = self;
798      } else {
799        events = args[0].events;
800        data = args[0].data;
801        context = args[0].context || self;
802      }
803      data.unshift(context);
804      const eventsArray = Array.isArray(events) ? events : events.split(' ');
805      eventsArray.forEach(event => {
806        if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
807          self.eventsAnyListeners.forEach(eventHandler => {
808            eventHandler.apply(context, [event, ...data]);
809          });
810        }
811        if (self.eventsListeners && self.eventsListeners[event]) {
812          self.eventsListeners[event].forEach(eventHandler => {
813            eventHandler.apply(context, data);
814          });
815        }
816      });
817      return self;
818    }
819  };
820
821  function updateSize() {
822    const swiper = this;
823    let width;
824    let height;
825    const el = swiper.el;
826    if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {
827      width = swiper.params.width;
828    } else {
829      width = el.clientWidth;
830    }
831    if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {
832      height = swiper.params.height;
833    } else {
834      height = el.clientHeight;
835    }
836    if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
837      return;
838    }
839
840    // Subtract paddings
841    width = width - parseInt(elementStyle(el, 'padding-left') || 0, 10) - parseInt(elementStyle(el, 'padding-right') || 0, 10);
842    height = height - parseInt(elementStyle(el, 'padding-top') || 0, 10) - parseInt(elementStyle(el, 'padding-bottom') || 0, 10);
843    if (Number.isNaN(width)) width = 0;
844    if (Number.isNaN(height)) height = 0;
845    Object.assign(swiper, {
846      width,
847      height,
848      size: swiper.isHorizontal() ? width : height
849    });
850  }
851
852  function updateSlides() {
853    const swiper = this;
854    function getDirectionPropertyValue(node, label) {
855      return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
856    }
857    const params = swiper.params;
858    const {
859      wrapperEl,
860      slidesEl,
861      size: swiperSize,
862      rtlTranslate: rtl,
863      wrongRTL
864    } = swiper;
865    const isVirtual = swiper.virtual && params.virtual.enabled;
866    const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
867    const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
868    const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
869    let snapGrid = [];
870    const slidesGrid = [];
871    const slidesSizesGrid = [];
872    let offsetBefore = params.slidesOffsetBefore;
873    if (typeof offsetBefore === 'function') {
874      offsetBefore = params.slidesOffsetBefore.call(swiper);
875    }
876    let offsetAfter = params.slidesOffsetAfter;
877    if (typeof offsetAfter === 'function') {
878      offsetAfter = params.slidesOffsetAfter.call(swiper);
879    }
880    const previousSnapGridLength = swiper.snapGrid.length;
881    const previousSlidesGridLength = swiper.slidesGrid.length;
882    let spaceBetween = params.spaceBetween;
883    let slidePosition = -offsetBefore;
884    let prevSlideSize = 0;
885    let index = 0;
886    if (typeof swiperSize === 'undefined') {
887      return;
888    }
889    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
890      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;
891    } else if (typeof spaceBetween === 'string') {
892      spaceBetween = parseFloat(spaceBetween);
893    }
894    swiper.virtualSize = -spaceBetween;
895
896    // reset margins
897    slides.forEach(slideEl => {
898      if (rtl) {
899        slideEl.style.marginLeft = '';
900      } else {
901        slideEl.style.marginRight = '';
902      }
903      slideEl.style.marginBottom = '';
904      slideEl.style.marginTop = '';
905    });
906
907    // reset cssMode offsets
908    if (params.centeredSlides && params.cssMode) {
909      setCSSProperty
909(wrapperEl, '--swiper-centered-offset-before', '');
910      setCSSProperty
vendor: 7,943 bytes, lines 910-1095
910(wrapperEl, '--swiper-centered-offset-after', '');
911    }
912    const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
913    if (gridEnabled) {
914      swiper.grid.initSlides(slides);
915    } else if (swiper.grid) {
916      swiper.grid.unsetSlides();
917    }
918
919    // Calc slides
920    let slideSize;
921    const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {
922      return typeof params.breakpoints[key].slidesPerView !== 'undefined';
923    }).length > 0;
924    for (let i = 0; i < slidesLength; i += 1) {
925      slideSize = 0;
926      let slide;
927      if (slides[i]) slide = slides[i];
928      if (gridEnabled) {
929        swiper.grid.updateSlide(i, slide, slides);
930      }
931      if (slides[i] && elementStyle(slide, 'display') === 'none') continue; // eslint-disable-line
932
933      if (params.slidesPerView === 'auto') {
934        if (shouldResetSlideSize) {
935          slides[i].style[swiper.getDirectionLabel('width')] = ``;
936        }
937        const slideStyles = getComputedStyle(slide);
938        const currentTransform = slide.style.transform;
939        const currentWebKitTransform = slide.style.webkitTransform;
940        if (currentTransform) {
941          slide.style.transform = 'none';
942        }
943        if (currentWebKitTransform) {
944          slide.style.webkitTransform = 'none';
945        }
946        if (params.roundLengths) {
947          slideSize = swiper.isHorizontal() ? elementOuterSize(slide, 'width', true) : elementOuterSize(slide, 'height', true);
948        } else {
949          // eslint-disable-next-line
950          const width = getDirectionPropertyValue(slideStyles, 'width');
951          const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');
952          const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');
953          const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');
954          const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');
955          const boxSizing = slideStyles.getPropertyValue('box-sizing');
956          if (boxSizing && boxSizing === 'border-box') {
957            slideSize = width + marginLeft + marginRight;
958          } else {
959            const {
960              clientWidth,
961              offsetWidth
962            } = slide;
963            slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
964          }
965        }
966        if (currentTransform) {
967          slide.style.transform = currentTransform;
968        }
969        if (currentWebKitTransform) {
970          slide.style.webkitTransform = currentWebKitTransform;
971        }
972        if (params.roundLengths) slideSize = Math.floor(slideSize);
973      } else {
974        slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
975        if (params.roundLengths) slideSize = Math.floor(slideSize);
976        if (slides[i]) {
977          slides[i].style[swiper.getDirectionLabel('width')] = `${slideSize}px`;
978        }
979      }
980      if (slides[i]) {
981        slides[i].swiperSlideSize = slideSize;
982      }
983      slidesSizesGrid.push(slideSize);
984      if (params.centeredSlides) {
985        slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
986        if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
987        if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
988        if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;
989        if (params.roundLengths) slidePosition = Math.floor(slidePosition);
990        if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
991        slidesGrid.push(slidePosition);
992      } else {
993        if (params.roundLengths) slidePosition = Math.floor(slidePosition);
994        if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
995        slidesGrid.push(slidePosition);
996        slidePosition = slidePosition + slideSize + spaceBetween;
997      }
998      swiper.virtualSize += slideSize + spaceBetween;
999      prevSlideSize = slideSize;
1000      index += 1;
1001    }
1002    swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
1003    if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {
1004      wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
1005    }
1006    if (params.setWrapperSize) {
1007      wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
1008    }
1009    if (gridEnabled) {
1010      swiper.grid.updateWrapperSize(slideSize, snapGrid);
1011    }
1012
1013    // Remove last grid elements depending on width
1014    if (!params.centeredSlides) {
1015      const newSlidesGrid = [];
1016      for (let i = 0; i < snapGrid.length; i += 1) {
1017        let slidesGridItem = snapGrid[i];
1018        if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
1019        if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
1020          newSlidesGrid.push(slidesGridItem);
1021        }
1022      }
1023      snapGrid = newSlidesGrid;
1024      if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
1025        snapGrid.push(swiper.virtualSize - swiperSize);
1026      }
1027    }
1028    if (isVirtual && params.loop) {
1029      const size = slidesSizesGrid[0] + spaceBetween;
1030      if (params.slidesPerGroup > 1) {
1031        const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
1032        const groupSize = size * params.slidesPerGroup;
1033        for (let i = 0; i < groups; i += 1) {
1034          snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
1035        }
1036      }
1037      for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
1038        if (params.slidesPerGroup === 1) {
1039          snapGrid.push(snapGrid[snapGrid.length - 1] + size);
1040        }
1041        slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
1042        swiper.virtualSize += size;
1043      }
1044    }
1045    if (snapGrid.length === 0) snapGrid = [0];
1046    if (spaceBetween !== 0) {
1047      const key = swiper.isHorizontal() && rtl ? 'marginLeft' : swiper.getDirectionLabel('marginRight');
1048      slides.filter((_, slideIndex) => {
1049        if (!params.cssMode || params.loop) return true;
1050        if (slideIndex === slides.length - 1) {
1051          return false;
1052        }
1053        return true;
1054      }).forEach(slideEl => {
1055        slideEl.style[key] = `${spaceBetween}px`;
1056      });
1057    }
1058    if (params.centeredSlides && params.centeredSlidesBounds) {
1059      let allSlidesSize = 0;
1060      slidesSizesGrid.forEach(slideSizeValue => {
1061        allSlidesSize += slideSizeValue + (spaceBetween || 0);
1062      });
1063      allSlidesSize -= spaceBetween;
1064      const maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0;
1065      snapGrid = snapGrid.map(snap => {
1066        if (snap <= 0) return -offsetBefore;
1067        if (snap > maxSnap) return maxSnap + offsetAfter;
1068        return snap;
1069      });
1070    }
1071    if (params.centerInsufficientSlides) {
1072      let allSlidesSize = 0;
1073      slidesSizesGrid.forEach(slideSizeValue => {
1074        allSlidesSize += slideSizeValue + (spaceBetween || 0);
1075      });
1076      allSlidesSize -= spaceBetween;
1077      const offsetSize = (params.slidesOffsetBefore || 0) + (params.slidesOffsetAfter || 0);
1078      if (allSlidesSize + offsetSize < swiperSize) {
1079        const allSlidesOffset = (swiperSize - allSlidesSize - offsetSize) / 2;
1080        snapGrid.forEach((snap, snapIndex) => {
1081          snapGrid[snapIndex] = snap - allSlidesOffset;
1082        });
1083        slidesGrid.forEach((snap, snapIndex) => {
1084          slidesGrid[snapIndex] = snap + allSlidesOffset;
1085        });
1086      }
1087    }
1088    Object.assign(swiper, {
1089      slides,
1090      snapGrid,
1091      slidesGrid,
1092      slidesSizesGrid
1093    });
1094    if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
1095      setCSSProperty
1095(wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);
1096      setCSSProperty
vendor: 9,653 bytes, lines 1096-1333
1096(wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
1097      const addToSnapGrid = -swiper.snapGrid[0];
1098      const addToSlidesGrid = -swiper.slidesGrid[0];
1099      swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);
1100      swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);
1101    }
1102    if (slidesLength !== previousSlidesLength) {
1103      swiper.emit('slidesLengthChange');
1104    }
1105    if (snapGrid.length !== previousSnapGridLength) {
1106      if (swiper.params.watchOverflow) swiper.checkOverflow();
1107      swiper.emit('snapGridLengthChange');
1108    }
1109    if (slidesGrid.length !== previousSlidesGridLength) {
1110      swiper.emit('slidesGridLengthChange');
1111    }
1112    if (params.watchSlidesProgress) {
1113      swiper.updateSlidesOffset();
1114    }
1115    swiper.emit('slidesUpdated');
1116    if (!isVirtual && !params.cssMode && (params.effect === 'slide' || params.effect === 'fade')) {
1117      const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
1118      const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
1119      if (slidesLength <= params.maxBackfaceHiddenSlides) {
1120        if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
1121      } else if (hasClassBackfaceClassAdded) {
1122        swiper.el.classList.remove(backFaceHiddenClass);
1123      }
1124    }
1125  }
1126
1127  function updateAutoHeight(speed) {
1128    const swiper = this;
1129    const activeSlides = [];
1130    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1131    let newHeight = 0;
1132    let i;
1133    if (typeof speed === 'number') {
1134      swiper.setTransition(speed);
1135    } else if (speed === true) {
1136      swiper.setTransition(swiper.params.speed);
1137    }
1138    const getSlideByIndex = index => {
1139      if (isVirtual) {
1140        return swiper.slides[swiper.getSlideIndexByData(index)];
1141      }
1142      return swiper.slides[index];
1143    };
1144    // Find slides currently in view
1145    if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {
1146      if (swiper.params.centeredSlides) {
1147        (swiper.visibleSlides || []).forEach(slide => {
1148          activeSlides.push(slide);
1149        });
1150      } else {
1151        for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
1152          const index = swiper.activeIndex + i;
1153          if (index > swiper.slides.length && !isVirtual) break;
1154          activeSlides.push(getSlideByIndex(index));
1155        }
1156      }
1157    } else {
1158      activeSlides.push(getSlideByIndex(swiper.activeIndex));
1159    }
1160
1161    // Find new height from highest slide in view
1162    for (i = 0; i < activeSlides.length; i += 1) {
1163      if (typeof activeSlides[i] !== 'undefined') {
1164        const height = activeSlides[i].offsetHeight;
1165        newHeight = height > newHeight ? height : newHeight;
1166      }
1167    }
1168
1169    // Update Height
1170    if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
1171  }
1172
1173  function updateSlidesOffset() {
1174    const swiper = this;
1175    const slides = swiper.slides;
1176    // eslint-disable-next-line
1177    const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
1178    for (let i = 0; i < slides.length; i += 1) {
1179      slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
1180    }
1181  }
1182
1183  const toggleSlideClasses$1 = (slideEl, condition, className) => {
1184    if (condition && !slideEl.classList.contains(className)) {
1185      slideEl.classList.add(className);
1186    } else if (!condition && slideEl.classList.contains(className)) {
1187      slideEl.classList.remove(className);
1188    }
1189  };
1190  function updateSlidesProgress(translate) {
1191    if (translate === void 0) {
1192      translate = this && this.translate || 0;
1193    }
1194    const swiper = this;
1195    const params = swiper.params;
1196    const {
1197      slides,
1198      rtlTranslate: rtl,
1199      snapGrid
1200    } = swiper;
1201    if (slides.length === 0) return;
1202    if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();
1203    let offsetCenter = -translate;
1204    if (rtl) offsetCenter = translate;
1205    swiper.visibleSlidesIndexes = [];
1206    swiper.visibleSlides = [];
1207    let spaceBetween = params.spaceBetween;
1208    if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
1209      spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
1210    } else if (typeof spaceBetween === 'string') {
1211      spaceBetween = parseFloat(spaceBetween);
1212    }
1213    for (let i = 0; i < slides.length; i += 1) {
1214      const slide = slides[i];
1215      let slideOffset = slide.swiperSlideOffset;
1216      if (params.cssMode && params.centeredSlides) {
1217        slideOffset -= slides[0].swiperSlideOffset;
1218      }
1219      const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1220      const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + spaceBetween);
1221      const slideBefore = -(offsetCenter - slideOffset);
1222      const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
1223      const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
1224      const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
1225      if (isVisible) {
1226        swiper.visibleSlides.push(slide);
1227        swiper.visibleSlidesIndexes.push(i);
1228      }
1229      toggleSlideClasses$1(slide, isVisible, params.slideVisibleClass);
1230      toggleSlideClasses$1(slide, isFullyVisible, params.slideFullyVisibleClass);
1231      slide.progress = rtl ? -slideProgress : slideProgress;
1232      slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
1233    }
1234  }
1235
1236  function updateProgress(translate) {
1237    const swiper = this;
1238    if (typeof translate === 'undefined') {
1239      const multiplier = swiper.rtlTranslate ? -1 : 1;
1240      // eslint-disable-next-line
1241      translate = swiper && swiper.translate && swiper.translate * multiplier || 0;
1242    }
1243    const params = swiper.params;
1244    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1245    let {
1246      progress,
1247      isBeginning,
1248      isEnd,
1249      progressLoop
1250    } = swiper;
1251    const wasBeginning = isBeginning;
1252    const wasEnd = isEnd;
1253    if (translatesDiff === 0) {
1254      progress = 0;
1255      isBeginning = true;
1256      isEnd = true;
1257    } else {
1258      progress = (translate - swiper.minTranslate()) / translatesDiff;
1259      const isBeginningRounded = Math.abs(translate - swiper.minTranslate()) < 1;
1260      const isEndRounded = Math.abs(translate - swiper.maxTranslate()) < 1;
1261      isBeginning = isBeginningRounded || progress <= 0;
1262      isEnd = isEndRounded || progress >= 1;
1263      if (isBeginningRounded) progress = 0;
1264      if (isEndRounded) progress = 1;
1265    }
1266    if (params.loop) {
1267      const firstSlideIndex = swiper.getSlideIndexByData(0);
1268      const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
1269      const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
1270      const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
1271      const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
1272      const translateAbs = Math.abs(translate);
1273      if (translateAbs >= firstSlideTranslate) {
1274        progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
1275      } else {
1276        progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
1277      }
1278      if (progressLoop > 1) progressLoop -= 1;
1279    }
1280    Object.assign(swiper, {
1281      progress,
1282      progressLoop,
1283      isBeginning,
1284      isEnd
1285    });
1286    if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);
1287    if (isBeginning && !wasBeginning) {
1288      swiper.emit('reachBeginning toEdge');
1289    }
1290    if (isEnd && !wasEnd) {
1291      swiper.emit('reachEnd toEdge');
1292    }
1293    if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
1294      swiper.emit('fromEdge');
1295    }
1296    swiper.emit('progress', progress);
1297  }
1298
1299  const toggleSlideClasses = (slideEl, condition, className) => {
1300    if (condition && !slideEl.classList.contains(className)) {
1301      slideEl.classList.add(className);
1302    } else if (!condition && slideEl.classList.contains(className)) {
1303      slideEl.classList.remove(className);
1304    }
1305  };
1306  function updateSlidesClasses() {
1307    const swiper = this;
1308    const {
1309      slides,
1310      params,
1311      slidesEl,
1312      activeIndex
1313    } = swiper;
1314    const isVirtual = swiper.virtual && params.virtual.enabled;
1315    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1316    const getFilteredSlide = selector => {
1317      return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
1318    };
1319    let activeSlide;
1320    let prevSlide;
1321    let nextSlide;
1322    if (isVirtual) {
1323      if (params.loop) {
1324        let slideIndex = activeIndex - swiper.virtual.slidesBefore;
1325        if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
1326        if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
1327        activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
1328      } else {
1329        activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
1330      }
1331    } else {
1332      if (gridEnabled) {
1333        activeSlide = slides.fi
1333lter(slideEl => slideEl.column === activeIndex)[0];
1334        nextSlide = slides.filter(slideEl => slideEl.column === activeIndex + 1)[0];
1335        prevSlide = slides.filter(slideEl => slideEl.column === activeIndex - 1)[0]
vendor: 6,254 bytes, lines 1335-1500
1335;
1336      } else {
1337        activeSlide = slides[activeIndex];
1338      }
1339    }
1340    if (activeSlide) {
1341      if (!gridEnabled) {
1342        // Next Slide
1343        nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1344        if (params.loop && !nextSlide) {
1345          nextSlide = slides[0];
1346        }
1347
1348        // Prev Slide
1349        prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
1350        if (params.loop && !prevSlide === 0) {
1351          prevSlide = slides[slides.length - 1];
1352        }
1353      }
1354    }
1355    slides.forEach(slideEl => {
1356      toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);
1357      toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);
1358      toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);
1359    });
1360    swiper.emitSlidesClasses();
1361  }
1362
1363  const processLazyPreloader = (swiper, imageEl) => {
1364    if (!swiper || swiper.destroyed || !swiper.params) return;
1365    const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
1366    const slideEl = imageEl.closest(slideSelector());
1367    if (slideEl) {
1368      let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1369      if (!lazyEl && swiper.isElement) {
1370        if (slideEl.shadowRoot) {
1371          lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1372        } else {
1373          // init later
1374          requestAnimationFrame(() => {
1375            if (slideEl.shadowRoot) {
1376              lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
1377              if (lazyEl) lazyEl.remove();
1378            }
1379          });
1380        }
1381      }
1382      if (lazyEl) lazyEl.remove();
1383    }
1384  };
1385  const unlazy = (swiper, index) => {
1386    if (!swiper.slides[index]) return;
1387    const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
1388    if (imageEl) imageEl.removeAttribute('loading');
1389  };
1390  const preload = swiper => {
1391    if (!swiper || swiper.destroyed || !swiper.params) return;
1392    let amount = swiper.params.lazyPreloadPrevNext;
1393    const len = swiper.slides.length;
1394    if (!len || !amount || amount < 0) return;
1395    amount = Math.min(amount, len);
1396    const slidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
1397    const activeIndex = swiper.activeIndex;
1398    if (swiper.params.grid && swiper.params.grid.rows > 1) {
1399      const activeColumn = activeIndex;
1400      const preloadColumns = [activeColumn - amount];
1401      preloadColumns.push(...Array.from({
1402        length: amount
1403      }).map((_, i) => {
1404        return activeColumn + slidesPerView + i;
1405      }));
1406      swiper.slides.forEach((slideEl, i) => {
1407        if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
1408      });
1409      return;
1410    }
1411    const slideIndexLastInView = activeIndex + slidesPerView - 1;
1412    if (swiper.params.rewind || swiper.params.loop) {
1413      for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
1414        const realIndex = (i % len + len) % len;
1415        if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
1416      }
1417    } else {
1418      for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
1419        if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
1420          unlazy(swiper, i);
1421        }
1422      }
1423    }
1424  };
1425
1426  function getActiveIndexByTranslate(swiper) {
1427    const {
1428      slidesGrid,
1429      params
1430    } = swiper;
1431    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1432    let activeIndex;
1433    for (let i = 0; i < slidesGrid.length; i += 1) {
1434      if (typeof slidesGrid[i + 1] !== 'undefined') {
1435        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
1436          activeIndex = i;
1437        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {
1438          activeIndex = i + 1;
1439        }
1440      } else if (translate >= slidesGrid[i]) {
1441        activeIndex = i;
1442      }
1443    }
1444    // Normalize slideIndex
1445    if (params.normalizeSlideIndex) {
1446      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;
1447    }
1448    return activeIndex;
1449  }
1450  function updateActiveIndex(newActiveIndex) {
1451    const swiper = this;
1452    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
1453    const {
1454      snapGrid,
1455      params,
1456      activeIndex: previousIndex,
1457      realIndex: previousRealIndex,
1458      snapIndex: previousSnapIndex
1459    } = swiper;
1460    let activeIndex = newActiveIndex;
1461    let snapIndex;
1462    const getVirtualRealIndex = aIndex => {
1463      let realIndex = aIndex - swiper.virtual.slidesBefore;
1464      if (realIndex < 0) {
1465        realIndex = swiper.virtual.slides.length + realIndex;
1466      }
1467      if (realIndex >= swiper.virtual.slides.length) {
1468        realIndex -= swiper.virtual.slides.length;
1469      }
1470      return realIndex;
1471    };
1472    if (typeof activeIndex === 'undefined') {
1473      activeIndex = getActiveIndexByTranslate(swiper);
1474    }
1475    if (snapGrid.indexOf(translate) >= 0) {
1476      snapIndex = snapGrid.indexOf(translate);
1477    } else {
1478      const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
1479      snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
1480    }
1481    if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1482    if (activeIndex === previousIndex && !swiper.params.loop) {
1483      if (snapIndex !== previousSnapIndex) {
1484        swiper.snapIndex = snapIndex;
1485        swiper.emit('snapIndexChange');
1486      }
1487      return;
1488    }
1489    if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
1490      swiper.realIndex = getVirtualRealIndex(activeIndex);
1491      return;
1492    }
1493    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
1494
1495    // Get real index
1496    let realIndex;
1497    if (swiper.virtual && params.virtual.enabled && params.loop) {
1498      realIndex = getVirtualRealIndex(activeIndex);
1499    } else if (gridEnabled) {
1500      const firstSlideInColumn = swiper.slides.fi
1500lter(slideEl => slideEl.column === activeIndex)[0]
vendor: 8,348 bytes, lines 1500-1782
1500;
1501      let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute('data-swiper-slide-index'), 10);
1502      if (Number.isNaN(activeSlideIndex)) {
1503        activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
1504      }
1505      realIndex = Math.floor(activeSlideIndex / params.grid.rows);
1506    } else if (swiper.slides[activeIndex]) {
1507      const slideIndex = swiper.slides[activeIndex].getAttribute('data-swiper-slide-index');
1508      if (slideIndex) {
1509        realIndex = parseInt(slideIndex, 10);
1510      } else {
1511        realIndex = activeIndex;
1512      }
1513    } else {
1514      realIndex = activeIndex;
1515    }
1516    Object.assign(swiper, {
1517      previousSnapIndex,
1518      snapIndex,
1519      previousRealIndex,
1520      realIndex,
1521      previousIndex,
1522      activeIndex
1523    });
1524    if (swiper.initialized) {
1525      preload(swiper);
1526    }
1527    swiper.emit('activeIndexChange');
1528    swiper.emit('snapIndexChange');
1529    if (swiper.initialized || swiper.params.runCallbacksOnInit) {
1530      if (previousRealIndex !== realIndex) {
1531        swiper.emit('realIndexChange');
1532      }
1533      swiper.emit('slideChange');
1534    }
1535  }
1536
1537  function updateClickedSlide(el, path) {
1538    const swiper = this;
1539    const params = swiper.params;
1540    let slide = el.closest(`.${params.slideClass}, swiper-slide`);
1541    if (!slide && swiper.isElement && path && path.length > 1 && path.includes(el)) {
1542      [...path.slice(path.indexOf(el) + 1, path.length)].forEach(pathEl => {
1543        if (!slide && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {
1544          slide = pathEl;
1545        }
1546      });
1547    }
1548    let slideFound = false;
1549    let slideIndex;
1550    if (slide) {
1551      for (let i = 0; i < swiper.slides.length; i += 1) {
1552        if (swiper.slides[i] === slide) {
1553          slideFound = true;
1554          slideIndex = i;
1555          break;
1556        }
1557      }
1558    }
1559    if (slide && slideFound) {
1560      swiper.clickedSlide = slide;
1561      if (swiper.virtual && swiper.params.virtual.enabled) {
1562        swiper.clickedIndex = parseInt(slide.getAttribute('data-swiper-slide-index'), 10);
1563      } else {
1564        swiper.clickedIndex = slideIndex;
1565      }
1566    } else {
1567      swiper.clickedSlide = undefined;
1568      swiper.clickedIndex = undefined;
1569      return;
1570    }
1571    if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {
1572      swiper.slideToClickedSlide();
1573    }
1574  }
1575
1576  var update = {
1577    updateSize,
1578    updateSlides,
1579    updateAutoHeight,
1580    updateSlidesOffset,
1581    updateSlidesProgress,
1582    updateProgress,
1583    updateSlidesClasses,
1584    updateActiveIndex,
1585    updateClickedSlide
1586  };
1587
1588  function getSwiperTranslate(axis) {
1589    if (axis === void 0) {
1590      axis = this.isHorizontal() ? 'x' : 'y';
1591    }
1592    const swiper = this;
1593    const {
1594      params,
1595      rtlTranslate: rtl,
1596      translate,
1597      wrapperEl
1598    } = swiper;
1599    if (params.virtualTranslate) {
1600      return rtl ? -translate : translate;
1601    }
1602    if (params.cssMode) {
1603      return translate;
1604    }
1605    let currentTranslate = getTranslate(wrapperEl, axis);
1606    currentTranslate += swiper.cssOverflowAdjustment();
1607    if (rtl) currentTranslate = -currentTranslate;
1608    return currentTranslate || 0;
1609  }
1610
1611  function setTranslate(translate, byController) {
1612    const swiper = this;
1613    const {
1614      rtlTranslate: rtl,
1615      params,
1616      wrapperEl,
1617      progress
1618    } = swiper;
1619    let x = 0;
1620    let y = 0;
1621    const z = 0;
1622    if (swiper.isHorizontal()) {
1623      x = rtl ? -translate : translate;
1624    } else {
1625      y = translate;
1626    }
1627    if (params.roundLengths) {
1628      x = Math.floor(x);
1629      y = Math.floor(y);
1630    }
1631    swiper.previousTranslate = swiper.translate;
1632    swiper.translate = swiper.isHorizontal() ? x : y;
1633    if (params.cssMode) {
1634      wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;
1635    } else if (!params.virtualTranslate) {
1636      if (swiper.isHorizontal()) {
1637        x -= swiper.cssOverflowAdjustment();
1638      } else {
1639        y -= swiper.cssOverflowAdjustment();
1640      }
1641      wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
1642    }
1643
1644    // Check if we need to update progress
1645    let newProgress;
1646    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
1647    if (translatesDiff === 0) {
1648      newProgress = 0;
1649    } else {
1650      newProgress = (translate - swiper.minTranslate()) / translatesDiff;
1651    }
1652    if (newProgress !== progress) {
1653      swiper.updateProgress(translate);
1654    }
1655    swiper.emit('setTranslate', swiper.translate, byController);
1656  }
1657
1658  function minTranslate() {
1659    return -this.snapGrid[0];
1660  }
1661
1662  function maxTranslate() {
1663    return -this.snapGrid[this.snapGrid.length - 1];
1664  }
1665
1666  function translateTo(translate, speed, runCallbacks, translateBounds, internal) {
1667    if (translate === void 0) {
1668      translate = 0;
1669    }
1670    if (speed === void 0) {
1671      speed = this.params.speed;
1672    }
1673    if (runCallbacks === void 0) {
1674      runCallbacks = true;
1675    }
1676    if (translateBounds === void 0) {
1677      translateBounds = true;
1678    }
1679    const swiper = this;
1680    const {
1681      params,
1682      wrapperEl
1683    } = swiper;
1684    if (swiper.animating && params.preventInteractionOnTransition) {
1685      return false;
1686    }
1687    const minTranslate = swiper.minTranslate();
1688    const maxTranslate = swiper.maxTranslate();
1689    let newTranslate;
1690    if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate;
1691
1692    // Update progress
1693    swiper.updateProgress(newTranslate);
1694    if (params.cssMode) {
1695      const isH = swiper.isHorizontal();
1696      if (speed === 0) {
1697        wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;
1698      } else {
1699        if (!swiper.support.smoothScroll) {
1700          animateCSSModeScroll({
1701            swiper,
1702            targetPosition: -newTranslate,
1703            side: isH ? 'left' : 'top'
1704          });
1705          return true;
1706        }
1707        wrapperEl.scrollTo({
1708          [isH ? 'left' : 'top']: -newTranslate,
1709          behavior: 'smooth'
1710        });
1711      }
1712      return true;
1713    }
1714    if (speed === 0) {
1715      swiper.setTransition(0);
1716      swiper.setTranslate(newTranslate);
1717      if (runCallbacks) {
1718        swiper.emit('beforeTransitionStart', speed, internal);
1719        swiper.emit('transitionEnd');
1720      }
1721    } else {
1722      swiper.setTransition(speed);
1723      swiper.setTranslate(newTranslate);
1724      if (runCallbacks) {
1725        swiper.emit('beforeTransitionStart', speed, internal);
1726        swiper.emit('transitionStart');
1727      }
1728      if (!swiper.animating) {
1729        swiper.animating = true;
1730        if (!swiper.onTranslateToWrapperTransitionEnd) {
1731          swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {
1732            if (!swiper || swiper.destroyed) return;
1733            if (e.target !== this) return;
1734            swiper.wrapperEl.removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1735            swiper.onTranslateToWrapperTransitionEnd = null;
1736            delete swiper.onTranslateToWrapperTransitionEnd;
1737            swiper.animating = false;
1738            if (runCallbacks) {
1739              swiper.emit('transitionEnd');
1740            }
1741          };
1742        }
1743        swiper.wrapperEl.addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);
1744      }
1745    }
1746    return true;
1747  }
1748
1749  var translate = {
1750    getTranslate: getSwiperTranslate,
1751    setTranslate,
1752    minTranslate,
1753    maxTranslate,
1754    translateTo
1755  };
1756
1757  function setTransition(duration, byController) {
1758    const swiper = this;
1759    if (!swiper.params.cssMode) {
1760      swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
1761      swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : '';
1762    }
1763    swiper.emit('setTransition', duration, byController);
1764  }
1765
1766  function transitionEmit(_ref) {
1767    let {
1768      swiper,
1769      runCallbacks,
1770      direction,
1771      step
1772    } = _ref;
1773    const {
1774      activeIndex,
1775      previousIndex
1776    } = swiper;
1777    let dir = direction;
1778    if (!dir) {
1779      if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';
1780    }
1781    swiper.emit(`transition${step}`);
1782    if (runCallbacks && 
vendor: 3,427 bytes, lines 1782-1897
1782activeIndex !== previousIndex) {
1783      if (dir === 'reset') {
1784        swiper.emit(`slideResetTransition${step}`);
1785        return;
1786      }
1787      swiper.emit(`slideChangeTransition${step}`);
1788      if (dir === 'next') {
1789        swiper.emit(`slideNextTransition${step}`);
1790      } else {
1791        swiper.emit(`slidePrevTransition${step}`);
1792      }
1793    }
1794  }
1795
1796  function transitionStart(runCallbacks, direction) {
1797    if (runCallbacks === void 0) {
1798      runCallbacks = true;
1799    }
1800    const swiper = this;
1801    const {
1802      params
1803    } = swiper;
1804    if (params.cssMode) return;
1805    if (params.autoHeight) {
1806      swiper.updateAutoHeight();
1807    }
1808    transitionEmit({
1809      swiper,
1810      runCallbacks,
1811      direction,
1812      step: 'Start'
1813    });
1814  }
1815
1816  function transitionEnd(runCallbacks, direction) {
1817    if (runCallbacks === void 0) {
1818      runCallbacks = true;
1819    }
1820    const swiper = this;
1821    const {
1822      params
1823    } = swiper;
1824    swiper.animating = false;
1825    if (params.cssMode) return;
1826    swiper.setTransition(0);
1827    transitionEmit({
1828      swiper,
1829      runCallbacks,
1830      direction,
1831      step: 'End'
1832    });
1833  }
1834
1835  var transition = {
1836    setTransition,
1837    transitionStart,
1838    transitionEnd
1839  };
1840
1841  function slideTo(index, speed, runCallbacks, internal, initial) {
1842    if (index === void 0) {
1843      index = 0;
1844    }
1845    if (runCallbacks === void 0) {
1846      runCallbacks = true;
1847    }
1848    if (typeof index === 'string') {
1849      index = parseInt(index, 10);
1850    }
1851    const swiper = this;
1852    let slideIndex = index;
1853    if (slideIndex < 0) slideIndex = 0;
1854    const {
1855      params,
1856      snapGrid,
1857      slidesGrid,
1858      previousIndex,
1859      activeIndex,
1860      rtlTranslate: rtl,
1861      wrapperEl,
1862      enabled
1863    } = swiper;
1864    if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {
1865      return false;
1866    }
1867    if ( typeof swiper.params === 'undefined' ) { 
1868      return false;
1869    }
1870    if (typeof speed === 'undefined') {
1871      speed = swiper.params.speed;
1872    }
1873    const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
1874    let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
1875    if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
1876    const translate = -snapGrid[snapIndex];
1877    // Normalize slideIndex
1878    if (params.normalizeSlideIndex) {
1879      for (let i = 0; i < slidesGrid.length; i += 1) {
1880        const normalizedTranslate = -Math.floor(translate * 100);
1881        const normalizedGrid = Math.floor(slidesGrid[i] * 100);
1882        const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
1883        if (typeof slidesGrid[i + 1] !== 'undefined') {
1884          if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
1885            slideIndex = i;
1886          } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
1887            slideIndex = i + 1;
1888          }
1889        } else if (normalizedTranslate >= normalizedGrid) {
1890          slideIndex = i;
1891        }
1892      }
1893    }
1894    // Directions locks
1895    if (swiper.initialized && slideIndex !== activeIndex) {
1896      if (!swiper.allowSlideNext && (rtl ? translate > swiper.translate && translate > swiper.minTranslate() : translate < swiper.translate && translate < swiper.minTranslate())) {
1897        return false;
vendor: 8,697 bytes, lines 1898-2137
1898      }
1899      if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {
1900        if ((activeIndex || 0) !== slideIndex) {
1901          return false;
1902        }
1903      }
1904    }
1905    if (slideIndex !== (previousIndex || 0) && runCallbacks) {
1906      swiper.emit('beforeSlideChangeStart');
1907    }
1908
1909    // Update progress
1910    swiper.updateProgress(translate);
1911    let direction;
1912    if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset';
1913
1914    // initial virtual
1915    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
1916    const isInitialVirtual = isVirtual && initial;
1917    // Update Index
1918    if (!isInitialVirtual && (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate)) {
1919      swiper.updateActiveIndex(slideIndex);
1920      // Update Height
1921      if (params.autoHeight) {
1922        swiper.updateAutoHeight();
1923      }
1924      swiper.updateSlidesClasses();
1925      if (params.effect !== 'slide') {
1926        swiper.setTranslate(translate);
1927      }
1928      if (direction !== 'reset') {
1929        swiper.transitionStart(runCallbacks, direction);
1930        swiper.transitionEnd(runCallbacks, direction);
1931      }
1932      return false;
1933    }
1934    if (params.cssMode) {
1935      const isH = swiper.isHorizontal();
1936      const t = rtl ? translate : -translate;
1937      if (speed === 0) {
1938        if (isVirtual) {
1939          swiper.wrapperEl.style.scrollSnapType = 'none';
1940          swiper._immediateVirtual = true;
1941        }
1942        if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
1943          swiper._cssModeVirtualInitialSet = true;
1944          requestAnimationFrame(() => {
1945            wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1946          });
1947        } else {
1948          wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;
1949        }
1950        if (isVirtual) {
1951          requestAnimationFrame(() => {
1952            swiper.wrapperEl.style.scrollSnapType = '';
1953            swiper._immediateVirtual = false;
1954          });
1955        }
1956      } else {
1957        if (!swiper.support.smoothScroll) {
1958          animateCSSModeScroll({
1959            swiper,
1960            targetPosition: t,
1961            side: isH ? 'left' : 'top'
1962          });
1963          return true;
1964        }
1965        wrapperEl.scrollTo({
1966          [isH ? 'left' : 'top']: t,
1967          behavior: 'smooth'
1968        });
1969      }
1970      return true;
1971    }
1972    swiper.setTransition(speed);
1973    swiper.setTranslate(translate);
1974    swiper.updateActiveIndex(slideIndex);
1975    swiper.updateSlidesClasses();
1976    swiper.emit('beforeTransitionStart', speed, internal);
1977    swiper.transitionStart(runCallbacks, direction);
1978    if (speed === 0) {
1979      swiper.transitionEnd(runCallbacks, direction);
1980    } else if (!swiper.animating) {
1981      swiper.animating = true;
1982      if (!swiper.onSlideToWrapperTransitionEnd) {
1983        swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {
1984          if (!swiper || swiper.destroyed) return;
1985          if (e.target !== this) return;
1986          swiper.wrapperEl.removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1987          swiper.onSlideToWrapperTransitionEnd = null;
1988          delete swiper.onSlideToWrapperTransitionEnd;
1989          swiper.transitionEnd(runCallbacks, direction);
1990        };
1991      }
1992      swiper.wrapperEl.addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);
1993    }
1994    return true;
1995  }
1996
1997  function slideToLoop(index, speed, runCallbacks, internal) {
1998    if (index === void 0) {
1999      index = 0;
2000    }
2001    if (runCallbacks === void 0) {
2002      runCallbacks = true;
2003    }
2004    if (typeof index === 'string') {
2005      const indexAsNumber = parseInt(index, 10);
2006      index = indexAsNumber;
2007    }
2008    const swiper = this;
2009    if (swiper.destroyed) return;
2010    if (typeof speed === 'undefined') {
2011      speed = swiper.params.speed;
2012    }
2013    const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
2014    let newIndex = index;
2015    if (swiper.params.loop) {
2016      if (swiper.virtual && swiper.params.virtual.enabled) {
2017        // eslint-disable-next-line
2018        newIndex = newIndex + swiper.virtual.slidesBefore;
2019      } else {
2020        let targetSlideIndex;
2021        if (gridEnabled) {
2022          const slideIndex = newIndex * swiper.params.grid.rows;
2023          targetSlideIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
2024        } else {
2025          targetSlideIndex = swiper.getSlideIndexByData(newIndex);
2026        }
2027        const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
2028        const {
2029          centeredSlides
2030        } = swiper.params;
2031        let slidesPerView = swiper.params.slidesPerView;
2032        if (slidesPerView === 'auto') {
2033          slidesPerView = swiper.slidesPerViewDynamic();
2034        } else {
2035          slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2036          if (centeredSlides && slidesPerView % 2 === 0) {
2037            slidesPerView = slidesPerView + 1;
2038          }
2039        }
2040        let needLoopFix = cols - targetSlideIndex < slidesPerView;
2041        if (centeredSlides) {
2042          needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
2043        }
2044        if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {
2045          needLoopFix = false;
2046        }
2047        if (needLoopFix) {
2048          const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
2049          swiper.loopFix({
2050            direction,
2051            slideTo: true,
2052            activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2053            slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
2054          });
2055        }
2056        if (gridEnabled) {
2057          const slideIndex = newIndex * swiper.params.grid.rows;
2058          newIndex = swiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex)[0].column;
2059        } else {
2060          newIndex = swiper.getSlideIndexByData(newIndex);
2061        }
2062      }
2063    }
2064    requestAnimationFrame(() => {
2065      swiper.slideTo(newIndex, speed, runCallbacks, internal);
2066    });
2067    return swiper;
2068  }
2069
2070  /* eslint no-unused-vars: "off" */
2071  function slideNext(speed, runCallbacks, internal) {
2072    if (runCallbacks === void 0) {
2073      runCallbacks = true;
2074    }
2075    const swiper = this;
2076    const {
2077      enabled,
2078      params,
2079      animating
2080    } = swiper;
2081    if (!enabled || swiper.destroyed) return swiper;
2082    if (typeof speed === 'undefined') {
2083      speed = swiper.params.speed;
2084    }
2085    let perGroup = params.slidesPerGroup;
2086    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2087      perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);
2088    }
2089    const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
2090    const isVirtual = swiper.virtual && params.virtual.enabled;
2091    if (params.loop) {
2092      if (animating && !isVirtual && params.loopPreventsSliding) return false;
2093      swiper.loopFix({
2094        direction: 'next'
2095      });
2096      // eslint-disable-next-line
2097      swiper._clientLeft = swiper.wrapperEl.clientLeft;
2098      if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
2099        requestAnimationFrame(() => {
2100          swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2101        });
2102        return true;
2103      }
2104    }
2105    if (params.rewind && swiper.isEnd) {
2106      return swiper.slideTo(0, speed, runCallbacks, internal);
2107    }
2108    return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
2109  }
2110
2111  /* eslint no-unused-vars: "off" */
2112  function slidePrev(speed, runCallbacks, internal) {
2113    if (runCallbacks === void 0) {
2114      runCallbacks = true;
2115    }
2116    const swiper = this;
2117    const {
2118      params,
2119      snapGrid,
2120      slidesGrid,
2121      rtlTranslate,
2122      enabled,
2123      animating
2124    } = swiper;
2125    if (!enabled || swiper.destroyed) return swiper;
2126    if (typeof speed === 'undefined') {
2127      speed = swiper.params.speed;
2128    }
2129    const isVirtual = swiper.virtual && params.virtual.enabled;
2130    if (params.loop) {
2131      if (animating && !isVirtual && params.loopPreventsSliding) return false;
2132      swiper.loopFix({
2133        direction: 'prev'
2134      });
2135      // eslint-disable-next-line
2136      swiper._clientLeft = swiper.wrapperEl.clientLeft;
2137    }
vendor: 11,243 bytes, lines 2138-2411
2138    const translate = rtlTranslate ? swiper.translate : -swiper.translate;
2139    function normalize(val) {
2140      if (val < 0) return -Math.floor(Math.abs(val));
2141      return Math.floor(val);
2142    }
2143    const normalizedTranslate = normalize(translate);
2144    const normalizedSnapGrid = snapGrid.map(val => normalize(val));
2145    let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
2146    if (typeof prevSnap === 'undefined' && params.cssMode) {
2147      let prevSnapIndex;
2148      snapGrid.forEach((snap, snapIndex) => {
2149        if (normalizedTranslate >= snap) {
2150          // prevSnap = snap;
2151          prevSnapIndex = snapIndex;
2152        }
2153      });
2154      if (typeof prevSnapIndex !== 'undefined') {
2155        prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
2156      }
2157    }
2158    let prevIndex = 0;
2159    if (typeof prevSnap !== 'undefined') {
2160      prevIndex = slidesGrid.indexOf(prevSnap);
2161      if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
2162      if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
2163        prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;
2164        prevIndex = Math.max(prevIndex, 0);
2165      }
2166    }
2167    if (params.rewind && swiper.isBeginning) {
2168      const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
2169      return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
2170    } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
2171      requestAnimationFrame(() => {
2172        swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2173      });
2174      return true;
2175    }
2176    return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2177  }
2178
2179  /* eslint no-unused-vars: "off" */
2180  function slideReset(speed, runCallbacks, internal) {
2181    if (runCallbacks === void 0) {
2182      runCallbacks = true;
2183    }
2184    const swiper = this;
2185    if (swiper.destroyed) return;
2186    if (typeof speed === 'undefined') {
2187      speed = swiper.params.speed;
2188    }
2189    return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
2190  }
2191
2192  /* eslint no-unused-vars: "off" */
2193  function slideToClosest(speed, runCallbacks, internal, threshold) {
2194    if (runCallbacks === void 0) {
2195      runCallbacks = true;
2196    }
2197    if (threshold === void 0) {
2198      threshold = 0.5;
2199    }
2200    const swiper = this;
2201    if (swiper.destroyed) return;
2202    if (typeof speed === 'undefined') {
2203      speed = swiper.params.speed;
2204    }
2205    let index = swiper.activeIndex;
2206    const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
2207    const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
2208    const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
2209    if (translate >= swiper.snapGrid[snapIndex]) {
2210      // The current translate is on or after the current snap index, so the choice
2211      // is between the current index and the one after it.
2212      const currentSnap = swiper.snapGrid[snapIndex];
2213      const nextSnap = swiper.snapGrid[snapIndex + 1];
2214      if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {
2215        index += swiper.params.slidesPerGroup;
2216      }
2217    } else {
2218      // The current translate is before the current snap index, so the choice
2219      // is between the current index and the one before it.
2220      const prevSnap = swiper.snapGrid[snapIndex - 1];
2221      const currentSnap = swiper.snapGrid[snapIndex];
2222      if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {
2223        index -= swiper.params.slidesPerGroup;
2224      }
2225    }
2226    index = Math.max(index, 0);
2227    index = Math.min(index, swiper.slidesGrid.length - 1);
2228    return swiper.slideTo(index, speed, runCallbacks, internal);
2229  }
2230
2231  function slideToClickedSlide() {
2232    const swiper = this;
2233    if (swiper.destroyed) return;
2234    const {
2235      params,
2236      slidesEl
2237    } = swiper;
2238    const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;
2239    let slideToIndex = swiper.clickedIndex;
2240    let realIndex;
2241    const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
2242    if (params.loop) {
2243      if (swiper.animating) return;
2244      realIndex = parseInt(swiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
2245      if (params.centeredSlides) {
2246        if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {
2247          swiper.loopFix();
2248          slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2249          nextTick(() => {
2250            swiper.slideTo(slideToIndex);
2251          });
2252        } else {
2253          swiper.slideTo(slideToIndex);
2254        }
2255      } else if (slideToIndex > swiper.slides.length - slidesPerView) {
2256        swiper.loopFix();
2257        slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
2258        nextTick(() => {
2259          swiper.slideTo(slideToIndex);
2260        });
2261      } else {
2262        swiper.slideTo(slideToIndex);
2263      }
2264    } else {
2265      swiper.slideTo(slideToIndex);
2266    }
2267  }
2268
2269  var slide = {
2270    slideTo,
2271    slideToLoop,
2272    slideNext,
2273    slidePrev,
2274    slideReset,
2275    slideToClosest,
2276    slideToClickedSlide
2277  };
2278
2279  function loopCreate(slideRealIndex) {
2280    const swiper = this;
2281    const {
2282      params,
2283      slidesEl
2284    } = swiper;
2285    if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2286    const initSlides = () => {
2287      const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
2288      slides.forEach((el, index) => {
2289        el.setAttribute('data-swiper-slide-index', index);
2290      });
2291    };
2292    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2293    const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
2294    const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
2295    const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
2296    const addBlankSlides = amountOfSlides => {
2297      for (let i = 0; i < amountOfSlides; i += 1) {
2298        const slideEl = swiper.isElement ? createElement('swiper-slide', [params.slideBlankClass]) : createElement('div', [params.slideClass, params.slideBlankClass]);
2299        swiper.slidesEl.append(slideEl);
2300      }
2301    };
2302    if (shouldFillGroup) {
2303      if (params.loopAddBlankSlides) {
2304        const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
2305        addBlankSlides(slidesToAdd);
2306        swiper.recalcSlides();
2307        swiper.updateSlides();
2308      } else {
2309        showWarning('Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2310      }
2311      initSlides();
2312    } else if (shouldFillGrid) {
2313      if (params.loopAddBlankSlides) {
2314        const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
2315        addBlankSlides(slidesToAdd);
2316        swiper.recalcSlides();
2317        swiper.updateSlides();
2318      } else {
2319        showWarning('Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)');
2320      }
2321      initSlides();
2322    } else {
2323      initSlides();
2324    }
2325    swiper.loopFix({
2326      slideRealIndex,
2327      direction: params.centeredSlides ? undefined : 'next'
2328    });
2329  }
2330
2331  function loopFix(_temp) {
2332    let {
2333      slideRealIndex,
2334      slideTo = true,
2335      direction,
2336      setTranslate,
2337      activeSlideIndex,
2338      byController,
2339      byMousewheel
2340    } = _temp === void 0 ? {} : _temp;
2341    const swiper = this;
2342    if (!swiper.params.loop) return;
2343    swiper.emit('beforeLoopFix');
2344    const {
2345      slides,
2346      allowSlidePrev,
2347      allowSlideNext,
2348      slidesEl,
2349      params
2350    } = swiper;
2351    const {
2352      centeredSlides
2353    } = params;
2354    swiper.allowSlidePrev = true;
2355    swiper.allowSlideNext = true;
2356    if (swiper.virtual && params.virtual.enabled) {
2357      if (slideTo) {
2358        if (!params.centeredSlides && swiper.snapIndex === 0) {
2359          swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
2360        } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
2361          swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
2362        } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
2363          swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
2364        }
2365      }
2366      swiper.allowSlidePrev = allowSlidePrev;
2367      swiper.allowSlideNext = allowSlideNext;
2368      swiper.emit('loopFix');
2369      return;
2370    }
2371    let slidesPerView = params.slidesPerView;
2372    if (slidesPerView === 'auto') {
2373      slidesPerView = swiper.slidesPerViewDynamic();
2374    } else {
2375      slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
2376      if (centeredSlides && slidesPerView % 2 === 0) {
2377        slidesPerView = slidesPerView + 1;
2378      }
2379    }
2380    const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
2381    let loopedSlides = slidesPerGroup;
2382    if (loopedSlides % slidesPerGroup !== 0) {
2383      loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
2384    }
2385    loopedSlides += params.loopAdditionalSlides;
2386    swiper.loopedSlides = loopedSlides;
2387    const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
2388    if (slides.length < slidesPerView + loopedSlides) {
2389      showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled and not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');
2390    } else if (gridEnabled && params.grid.fill === 'row') {
2391      showWarning('Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`');
2392    }
2393    const prependSlidesIndexes = [];
2394    const appendSlidesIndexes = [];
2395    let activeIndex = swiper.activeIndex;
2396    if (typeof activeSlideIndex === 'undefined') {
2397      activeSlideIndex = swiper.getSlideIndex(slides.filter(el => el.classList.contains(params.slideActiveClass))[0]);
2398    } else {
2399      activeIndex = activeSlideIndex;
2400    }
2401    const isNext = direction === 'next' || !direction;
2402    const isPrev = direction === 'prev' || !direction;
2403    let slidesPrepended = 0;
2404    let slidesAppended = 0;
2405    const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
2406    const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
2407    const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate === 'undefined' ? -slidesPerView / 2 + 0.5 : 0);
2408    // prepend last slides before start
2409    if (activeColIndexWithShift < loopedSlides) {
2410      slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
2411      for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
vendor: 5,443 bytes, lines 2412-2544
2412        const index = i - Math.floor(i / cols) * cols;
2413        if (gridEnabled) {
2414          const colIndexToPrepend = cols - index - 1;
2415          for (let i = slides.length - 1; i >= 0; i -= 1) {
2416            if (slides[i].column === colIndexToPrepend) prependSlidesIndexes.push(i);
2417          }
2418          // slides.forEach((slide, slideIndex) => {
2419          //   if (slide.column === colIndexToPrepend) prependSlidesIndexes.push(slideIndex);
2420          // });
2421        } else {
2422          prependSlidesIndexes.push(cols - index - 1);
2423        }
2424      }
2425    } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
2426      slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
2427      for (let i = 0; i < slidesAppended; i += 1) {
2428        const index = i - Math.floor(i / cols) * cols;
2429        if (gridEnabled) {
2430          slides.forEach((slide, slideIndex) => {
2431            if (slide.column === index) appendSlidesIndexes.push(slideIndex);
2432          });
2433        } else {
2434          appendSlidesIndexes.push(index);
2435        }
2436      }
2437    }
2438    swiper.__preventObserver__ = true;
2439    requestAnimationFrame(() => {
2440      swiper.__preventObserver__ = false;
2441    });
2442    if (isPrev) {
2443      prependSlidesIndexes.forEach(index => {
2444        slides[index].swiperLoopMoveDOM = true;
2445        slidesEl.prepend(slides[index]);
2446        slides[index].swiperLoopMoveDOM = false;
2447      });
2448    }
2449    if (isNext) {
2450      appendSlidesIndexes.forEach(index => {
2451        slides[index].swiperLoopMoveDOM = true;
2452        slidesEl.append(slides[index]);
2453        slides[index].swiperLoopMoveDOM = false;
2454      });
2455    }
2456    swiper.recalcSlides();
2457    if (params.slidesPerView === 'auto') {
2458      swiper.updateSlides();
2459    } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
2460      swiper.slides.forEach((slide, slideIndex) => {
2461        swiper.grid.updateSlide(slideIndex, slide, swiper.slides);
2462      });
2463    }
2464    if (params.watchSlidesProgress) {
2465      swiper.updateSlidesOffset();
2466    }
2467    if (slideTo) {
2468      if (prependSlidesIndexes.length > 0 && isPrev) {
2469        if (typeof slideRealIndex === 'undefined') {
2470          const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2471          const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
2472          const diff = newSlideTranslate - currentSlideTranslate;
2473          if (byMousewheel) {
2474            swiper.setTranslate(swiper.translate - diff);
2475          } else {
2476            swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);
2477            if (setTranslate) {
2478              swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2479              swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2480            }
2481          }
2482        } else {
2483          if (setTranslate) {
2484            const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
2485            swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
2486            swiper.touchEventsData.currentTranslate = swiper.translate;
2487          }
2488        }
2489      } else if (appendSlidesIndexes.length > 0 && isNext) {
2490        if (typeof slideRealIndex === 'undefined') {
2491          const currentSlideTranslate = swiper.slidesGrid[activeIndex];
2492          const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
2493          const diff = newSlideTranslate - currentSlideTranslate;
2494          if (byMousewheel) {
2495            swiper.setTranslate(swiper.translate - diff);
2496          } else {
2497            swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
2498            if (setTranslate) {
2499              swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
2500              swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
2501            }
2502          }
2503        } else {
2504          const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
2505          swiper.slideTo(swiper.activeIndex - shift, 0, false, true);
2506        }
2507      }
2508    }
2509    swiper.allowSlidePrev = allowSlidePrev;
2510    swiper.allowSlideNext = allowSlideNext;
2511    if (swiper.controller && swiper.controller.control && !byController) {
2512      const loopParams = {
2513        slideRealIndex,
2514        direction,
2515        setTranslate,
2516        activeSlideIndex,
2517        byController: true
2518      };
2519      if (Array.isArray(swiper.controller.control)) {
2520        swiper.controller.control.forEach(c => {
2521          if (!c.destroyed && c.params.loop) c.loopFix({
2522            ...loopParams,
2523            slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo : false
2524          });
2525        });
2526      } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
2527        swiper.controller.control.loopFix({
2528          ...loopParams,
2529          slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo : false
2530        });
2531      }
2532    }
2533    swiper.emit('loopFix');
2534  }
2535
2536  function loopDestroy() {
2537    const swiper = this;
2538    const {
2539      params,
2540      slidesEl
2541    } = swiper;
2542    if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
2543    swiper.recalcSlides();
2544    const newSlidesOrder = [];
vendor: 5,514 bytes, lines 2545-2710
2545    swiper.slides.forEach(slideEl => {
2546      const index = typeof slideEl.swiperSlideIndex === 'undefined' ? slideEl.getAttribute('data-swiper-slide-index') * 1 : slideEl.swiperSlideIndex;
2547      newSlidesOrder[index] = slideEl;
2548    });
2549    swiper.slides.forEach(slideEl => {
2550      slideEl.removeAttribute('data-swiper-slide-index');
2551    });
2552    newSlidesOrder.forEach(slideEl => {
2553      slidesEl.append(slideEl);
2554    });
2555    swiper.recalcSlides();
2556    swiper.slideTo(swiper.realIndex, 0);
2557  }
2558
2559  var loop = {
2560    loopCreate,
2561    loopFix,
2562    loopDestroy
2563  };
2564
2565  function setGrabCursor(moving) {
2566    const swiper = this;
2567    if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
2568    const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;
2569    if (swiper.isElement) {
2570      swiper.__preventObserver__ = true;
2571    }
2572    el.style.cursor = 'move';
2573    el.style.cursor = moving ? 'grabbing' : 'grab';
2574    if (swiper.isElement) {
2575      requestAnimationFrame(() => {
2576        swiper.__preventObserver__ = false;
2577      });
2578    }
2579  }
2580
2581  function unsetGrabCursor() {
2582    const swiper = this;
2583    if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
2584      return;
2585    }
2586    if (swiper.isElement) {
2587      swiper.__preventObserver__ = true;
2588    }
2589    swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';
2590    if (swiper.isElement) {
2591      requestAnimationFrame(() => {
2592        swiper.__preventObserver__ = false;
2593      });
2594    }
2595  }
2596
2597  var grabCursor = {
2598    setGrabCursor,
2599    unsetGrabCursor
2600  };
2601
2602  // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
2603  function closestElement(selector, base) {
2604    if (base === void 0) {
2605      base = this;
2606    }
2607    function __closestFrom(el) {
2608      if (!el || el === getDocument() || el === getWindow()) return null;
2609      if (el.assignedSlot) el = el.assignedSlot;
2610      const found = el.closest(selector);
2611      if (!found && !el.getRootNode) {
2612        return null;
2613      }
2614      return found || __closestFrom(el.getRootNode().host);
2615    }
2616    return __closestFrom(base);
2617  }
2618  function preventEdgeSwipe(swiper, event, startX) {
2619    const window = getWindow();
2620    const {
2621      params
2622    } = swiper;
2623    const edgeSwipeDetection = params.edgeSwipeDetection;
2624    const edgeSwipeThreshold = params.edgeSwipeThreshold;
2625    if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
2626      if (edgeSwipeDetection === 'prevent') {
2627        event.preventDefault();
2628        return true;
2629      }
2630      return false;
2631    }
2632    return true;
2633  }
2634  function onTouchStart(event) {
2635    const swiper = this;
2636    const document = getDocument();
2637    let e = event;
2638    if (e.originalEvent) e = e.originalEvent;
2639    const data = swiper.touchEventsData;
2640    if (e.type === 'pointerdown') {
2641      if (data.pointerId !== null && data.pointerId !== e.pointerId) {
2642        return;
2643      }
2644      data.pointerId = e.pointerId;
2645    } else if (e.type === 'touchstart' && e.targetTouches.length === 1) {
2646      data.touchId = e.targetTouches[0].identifier;
2647    }
2648    if (e.type === 'touchstart') {
2649      // don't proceed touch event
2650      preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
2651      return;
2652    }
2653    const {
2654      params,
2655      touches,
2656      enabled
2657    } = swiper;
2658    if (!enabled) return;
2659    if (!params.simulateTouch && e.pointerType === 'mouse') return;
2660    if (swiper.animating && params.preventInteractionOnTransition) {
2661      return;
2662    }
2663    if (!swiper.animating && params.cssMode && params.loop) {
2664      swiper.loopFix();
2665    }
2666    let targetEl = e.target;
2667    if (params.touchEventsTarget === 'wrapper') {
2668      if (!elementIsChildOf(targetEl, swiper.wrapperEl)) return;
2669    }
2670    if ('which' in e && e.which === 3) return;
2671    if ('button' in e && e.button > 0) return;
2672    if (data.isTouched && data.isMoved) return;
2673
2674    // change target el for shadow root component
2675    const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
2676    // eslint-disable-next-line
2677    const eventPath = e.composedPath ? e.composedPath() : e.path;
2678    if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
2679      targetEl = eventPath[0];
2680    }
2681    const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
2682    const isTargetShadow = !!(e.target && e.target.shadowRoot);
2683
2684    // use closestElement for shadow root element to get the actual closest for nested shadow root element
2685    if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
2686      swiper.allowClick = true;
2687      return;
2688    }
2689    if (params.swipeHandler) {
2690      if (!targetEl.closest(params.swipeHandler)) return;
2691    }
2692    touches.currentX = e.pageX;
2693    touches.currentY = e.pageY;
2694    const startX = touches.currentX;
2695    const startY = touches.currentY;
2696
2697    // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
2698
2699    if (!preventEdgeSwipe(swiper, e, startX)) {
2700      return;
2701    }
2702    Object.assign(data, {
2703      isTouched: true,
2704      isMoved: false,
2705      allowTouchCallbacks: true,
2706      isScrolling: undefined,
2707      startMoving: undefined
2708    });
2709    touches.startX = startX;
2710    touches.startY = startY;
vendor: 4,317 bytes, lines 2711-2825
2711    data.touchStartTime = now();
2712    swiper.allowClick = true;
2713    swiper.updateSize();
2714    swiper.swipeDirection = undefined;
2715    if (params.threshold > 0) data.allowThresholdMove = false;
2716    let preventDefault = true;
2717    if (targetEl.matches(data.focusableElements)) {
2718      preventDefault = false;
2719      if (targetEl.nodeName === 'SELECT') {
2720        data.isTouched = false;
2721      }
2722    }
2723    if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== targetEl && (e.pointerType === 'mouse' || e.pointerType !== 'mouse' && !targetEl.matches(data.focusableElements))) {
2724      document.activeElement.blur();
2725    }
2726    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
2727    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
2728      e.preventDefault();
2729    }
2730    if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
2731      swiper.freeMode.onTouchStart();
2732    }
2733    swiper.emit('touchStart', e);
2734  }
2735
2736  function onTouchMove(event) {
2737    const document = getDocument();
2738    const swiper = this;
2739    const data = swiper.touchEventsData;
2740    const {
2741      params,
2742      touches,
2743      rtlTranslate: rtl,
2744      enabled
2745    } = swiper;
2746    if (!enabled) return;
2747    if (!params.simulateTouch && event.pointerType === 'mouse') return;
2748    let e = event;
2749    if (e.originalEvent) e = e.originalEvent;
2750    if (e.type === 'pointermove') {
2751      if (data.touchId !== null) return; // return from pointer if we use touch
2752      const id = e.pointerId;
2753      if (id !== data.pointerId) return;
2754    }
2755    let targetTouch;
2756    if (e.type === 'touchmove') {
2757      targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0];
2758      if (!targetTouch || targetTouch.identifier !== data.touchId) return;
2759    } else {
2760      targetTouch = e;
2761    }
2762    if (!data.isTouched) {
2763      if (data.startMoving && data.isScrolling) {
2764        swiper.emit('touchMoveOpposite', e);
2765      }
2766      return;
2767    }
2768    const pageX = targetTouch.pageX;
2769    const pageY = targetTouch.pageY;
2770    if (e.preventedByNestedSwiper) {
2771      touches.startX = pageX;
2772      touches.startY = pageY;
2773      return;
2774    }
2775    if (!swiper.allowTouchMove) {
2776      if (!e.target.matches(data.focusableElements)) {
2777        swiper.allowClick = false;
2778      }
2779      if (data.isTouched) {
2780        Object.assign(touches, {
2781          startX: pageX,
2782          startY: pageY,
2783          currentX: pageX,
2784          currentY: pageY
2785        });
2786        data.touchStartTime = now();
2787      }
2788      return;
2789    }
2790    if (params.touchReleaseOnEdges && !params.loop) {
2791      if (swiper.isVertical()) {
2792        // Vertical
2793        if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
2794          data.isTouched = false;
2795          data.isMoved = false;
2796          return;
2797        }
2798      } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {
2799        return;
2800      }
2801    }
2802    if (document.activeElement && document.activeElement.matches(data.focusableElements) && document.activeElement !== e.target && e.pointerType !== 'mouse') {
2803      document.activeElement.blur();
2804    }
2805    if (document.activeElement) {
2806      if (e.target === document.activeElement && e.target.matches(data.focusableElements)) {
2807        data.isMoved = true;
2808        swiper.allowClick = false;
2809        return;
2810      }
2811    }
2812    if (data.allowTouchCallbacks) {
2813      swiper.emit('touchMove', e);
2814    }
2815    touches.previousX = touches.currentX;
2816    touches.previousY = touches.currentY;
2817    touches.currentX = pageX;
2818    touches.currentY = pageY;
2819    const diffX = touches.currentX - touches.startX;
2820    const diffY = touches.currentY - touches.startY;
2821    if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
2822    if (typeof data.isScrolling === 'undefined') {
2823      let touchAngle;
2824      if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
2825        data.isScrolling = false;
vendor: 7,483 bytes, lines 2826-3008
2826      } else {
2827        // eslint-disable-next-line
2828        if (diffX * diffX + diffY * diffY >= 25) {
2829          touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
2830          data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
2831        }
2832      }
2833    }
2834    if (data.isScrolling) {
2835      swiper.emit('touchMoveOpposite', e);
2836    }
2837    if (typeof data.startMoving === 'undefined') {
2838      if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
2839        data.startMoving = true;
2840      }
2841    }
2842    if (data.isScrolling || e.type === 'touchmove' && data.preventTouchMoveFromPointerMove) {
2843      data.isTouched = false;
2844      return;
2845    }
2846    if (!data.startMoving) {
2847      return;
2848    }
2849    swiper.allowClick = false;
2850    if (!params.cssMode && e.cancelable) {
2851      e.preventDefault();
2852    }
2853    if (params.touchMoveStopPropagation && !params.nested) {
2854      e.stopPropagation();
2855    }
2856    let diff = swiper.isHorizontal() ? diffX : diffY;
2857    let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
2858    if (params.oneWayMovement) {
2859      diff = Math.abs(diff) * (rtl ? 1 : -1);
2860      touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
2861    }
2862    touches.diff = diff;
2863    diff *= params.touchRatio;
2864    if (rtl) {
2865      diff = -diff;
2866      touchesDiff = -touchesDiff;
2867    }
2868    const prevTouchesDirection = swiper.touchesDirection;
2869    swiper.swipeDirection = diff > 0 ? 'prev' : 'next';
2870    swiper.touchesDirection = touchesDiff > 0 ? 'prev' : 'next';
2871    const isLoop = swiper.params.loop && !params.cssMode;
2872    const allowLoopFix = swiper.touchesDirection === 'next' && swiper.allowSlideNext || swiper.touchesDirection === 'prev' && swiper.allowSlidePrev;
2873    if (!data.isMoved) {
2874      if (isLoop && allowLoopFix) {
2875        swiper.loopFix({
2876          direction: swiper.swipeDirection
2877        });
2878      }
2879      data.startTranslate = swiper.getTranslate();
2880      swiper.setTransition(0);
2881      if (swiper.animating) {
2882        const evt = new window.CustomEvent('transitionend', {
2883          bubbles: true,
2884          cancelable: true,
2885          detail: {
2886            bySwiperTouchMove: true
2887          }
2888        });
2889        swiper.wrapperEl.dispatchEvent(evt);
2890      }
2891      data.allowMomentumBounce = false;
2892      // Grab Cursor
2893      if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
2894        swiper.setGrabCursor(true);
2895      }
2896      swiper.emit('sliderFirstMove', e);
2897    }
2898    let loopFixed;
2899    new Date().getTime();
2900    if (data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
2901      Object.assign(touches, {
2902        startX: pageX,
2903        startY: pageY,
2904        currentX: pageX,
2905        currentY: pageY,
2906        startTranslate: data.currentTranslate
2907      });
2908      data.loopSwapReset = true;
2909      data.startTranslate = data.currentTranslate;
2910      return;
2911    }
2912    swiper.emit('sliderMove', e);
2913    data.isMoved = true;
2914    data.currentTranslate = diff + data.startTranslate;
2915    let disableParentSwiper = true;
2916    let resistanceRatio = params.resistanceRatio;
2917    if (params.touchReleaseOnEdges) {
2918      resistanceRatio = 0;
2919    }
2920    if (diff > 0) {
2921      if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] - (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween : 0) - swiper.params.spaceBetween : swiper.minTranslate())) {
2922        swiper.loopFix({
2923          direction: 'prev',
2924          setTranslate: true,
2925          activeSlideIndex: 0
2926        });
2927      }
2928      if (data.currentTranslate > swiper.minTranslate()) {
2929        disableParentSwiper = false;
2930        if (params.resistance) {
2931          data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
2932        }
2933      }
2934    } else if (diff < 0) {
2935      if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween + (params.slidesPerView !== 'auto' && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween : 0) : swiper.maxTranslate())) {
2936        swiper.loopFix({
2937          direction: 'next',
2938          setTranslate: true,
2939          activeSlideIndex: swiper.slides.length - (params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
2940        });
2941      }
2942      if (data.currentTranslate < swiper.maxTranslate()) {
2943        disableParentSwiper = false;
2944        if (params.resistance) {
2945          data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
2946        }
2947      }
2948    }
2949    if (disableParentSwiper) {
2950      e.preventedByNestedSwiper = true;
2951    }
2952
2953    // Directions locks
2954    if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {
2955      data.currentTranslate = data.startTranslate;
2956    }
2957    if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {
2958      data.currentTranslate = data.startTranslate;
2959    }
2960    if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
2961      data.currentTranslate = data.startTranslate;
2962    }
2963
2964    // Threshold
2965    if (params.threshold > 0) {
2966      if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
2967        if (!data.allowThresholdMove) {
2968          data.allowThresholdMove = true;
2969          touches.startX = touches.currentX;
2970          touches.startY = touches.currentY;
2971          data.currentTranslate = data.startTranslate;
2972          touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
2973          return;
2974        }
2975      } else {
2976        data.currentTranslate = data.startTranslate;
2977        return;
2978      }
2979    }
2980    if (!params.followFinger || params.cssMode) return;
2981
2982    // Update active index in free mode
2983    if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
2984      swiper.updateActiveIndex();
2985      swiper.updateSlidesClasses();
2986    }
2987    if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
2988      swiper.freeMode.onTouchMove();
2989    }
2990    // Update progress
2991    swiper.updateProgress(data.currentTranslate);
2992    // Update translate
2993    swiper.setTranslate(data.currentTranslate);
2994  }
2995
2996  function onTouchEnd(event) {
2997    const swiper = this;
2998    const data = swiper.touchEventsData;
2999    let e = event;
3000    if (e.originalEvent) e = e.originalEvent;
3001    let targetTouch;
3002    const isTouchEvent = e.type === 'touchend' || e.type === 'touchcancel';
3003    if (!isTouchEvent) {
3004      if (data.touchId !== null) return; // return from pointer if we use touch
3005      if (e.pointerId !== data.pointerId) return;
3006      targetTouch = e;
3007    } else {
3008      targetTouch = [...e.changedTouches].filter(t => t.identifier === data.touchId)[0]
vendor: 8,866 bytes, lines 3008-3271
3008;
3009      if (!targetTouch || targetTouch.identifier !== data.touchId) return;
3010    }
3011    if (['pointercancel', 'pointerout', 'pointerleave', 'contextmenu'].includes(e.type)) {
3012      const proceed = ['pointercancel', 'contextmenu'].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
3013      if (!proceed) {
3014        return;
3015      }
3016    }
3017    data.pointerId = null;
3018    data.touchId = null;
3019    const {
3020      params,
3021      touches,
3022      rtlTranslate: rtl,
3023      slidesGrid,
3024      enabled
3025    } = swiper;
3026    if (!enabled) return;
3027    if (!params.simulateTouch && e.pointerType === 'mouse') return;
3028    if (data.allowTouchCallbacks) {
3029      swiper.emit('touchEnd', e);
3030    }
3031    data.allowTouchCallbacks = false;
3032    if (!data.isTouched) {
3033      if (data.isMoved && params.grabCursor) {
3034        swiper.setGrabCursor(false);
3035      }
3036      data.isMoved = false;
3037      data.startMoving = false;
3038      return;
3039    }
3040
3041    // Return Grab Cursor
3042    if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
3043      swiper.setGrabCursor(false);
3044    }
3045
3046    // Time diff
3047    const touchEndTime = now();
3048    const timeDiff = touchEndTime - data.touchStartTime;
3049
3050    // Tap, doubleTap, Click
3051    if (swiper.allowClick) {
3052      const pathTree = e.path || e.composedPath && e.composedPath();
3053      swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
3054      swiper.emit('tap click', e);
3055      if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
3056        swiper.emit('doubleTap doubleClick', e);
3057      }
3058    }
3059    data.lastClickTime = now();
3060    nextTick(() => {
3061      if (!swiper.destroyed) swiper.allowClick = true;
3062    });
3063    if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
3064      data.isTouched = false;
3065      data.isMoved = false;
3066      data.startMoving = false;
3067      return;
3068    }
3069    data.isTouched = false;
3070    data.isMoved = false;
3071    data.startMoving = false;
3072    let currentPos;
3073    if (params.followFinger) {
3074      currentPos = rtl ? swiper.translate : -swiper.translate;
3075    } else {
3076      currentPos = -data.currentTranslate;
3077    }
3078    if (params.cssMode) {
3079      return;
3080    }
3081    if (params.freeMode && params.freeMode.enabled) {
3082      swiper.freeMode.onTouchEnd({
3083        currentPos
3084      });
3085      return;
3086    }
3087
3088    // Find current slide
3089    const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
3090    let stopIndex = 0;
3091    let groupSize = swiper.slidesSizesGrid[0];
3092    for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
3093      const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3094      if (typeof slidesGrid[i + increment] !== 'undefined') {
3095        if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {
3096          stopIndex = i;
3097          groupSize = slidesGrid[i + increment] - slidesGrid[i];
3098        }
3099      } else if (swipeToLast || currentPos >= slidesGrid[i]) {
3100        stopIndex = i;
3101        groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
3102      }
3103    }
3104    let rewindFirstIndex = null;
3105    let rewindLastIndex = null;
3106    if (params.rewind) {
3107      if (swiper.isBeginning) {
3108        rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
3109      } else if (swiper.isEnd) {
3110        rewindFirstIndex = 0;
3111      }
3112    }
3113    // Find current slide size
3114    const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
3115    const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
3116    if (timeDiff > params.longSwipesMs) {
3117      // Long touches
3118      if (!params.longSwipes) {
3119        swiper.slideTo(swiper.activeIndex);
3120        return;
3121      }
3122      if (swiper.swipeDirection === 'next') {
3123        if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);else swiper.slideTo(stopIndex);
3124      }
3125      if (swiper.swipeDirection === 'prev') {
3126        if (ratio > 1 - params.longSwipesRatio) {
3127          swiper.slideTo(stopIndex + increment);
3128        } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
3129          swiper.slideTo(rewindLastIndex);
3130        } else {
3131          swiper.slideTo(stopIndex);
3132        }
3133      }
3134    } else {
3135      // Short swipes
3136      if (!params.shortSwipes) {
3137        swiper.slideTo(swiper.activeIndex);
3138        return;
3139      }
3140      const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
3141      if (!isNavButtonTarget) {
3142        if (swiper.swipeDirection === 'next') {
3143          swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
3144        }
3145        if (swiper.swipeDirection === 'prev') {
3146          swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
3147        }
3148      } else if (e.target === swiper.navigation.nextEl) {
3149        swiper.slideTo(stopIndex + increment);
3150      } else {
3151        swiper.slideTo(stopIndex);
3152      }
3153    }
3154  }
3155
3156  function onResize() {
3157    const swiper = this;
3158    const {
3159      params,
3160      el
3161    } = swiper;
3162    if (el && el.offsetWidth === 0) return;
3163
3164    // Breakpoints
3165    if (params.breakpoints) {
3166      swiper.setBreakpoint();
3167    }
3168
3169    // Save locks
3170    const {
3171      allowSlideNext,
3172      allowSlidePrev,
3173      snapGrid
3174    } = swiper;
3175    const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
3176
3177    // Disable locks on resize
3178    swiper.allowSlideNext = true;
3179    swiper.allowSlidePrev = true;
3180    swiper.updateSize();
3181    swiper.updateSlides();
3182    swiper.updateSlidesClasses();
3183    const isVirtualLoop = isVirtual && params.loop;
3184    if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
3185      swiper.slideTo(swiper.slides.length - 1, 0, false, true);
3186    } else {
3187      if (swiper.params.loop && !isVirtual) {
3188        swiper.slideToLoop(swiper.realIndex, 0, false, true);
3189      } else {
3190        swiper.slideTo(swiper.activeIndex, 0, false, true);
3191      }
3192    }
3193    if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3194      clearTimeout(swiper.autoplay.resizeTimeout);
3195      swiper.autoplay.resizeTimeout = setTimeout(() => {
3196        if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
3197          swiper.autoplay.resume();
3198        }
3199      }, 500);
3200    }
3201    // Return locks after resize
3202    swiper.allowSlidePrev = allowSlidePrev;
3203    swiper.allowSlideNext = allowSlideNext;
3204    if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
3205      swiper.checkOverflow();
3206    }
3207  }
3208
3209  function onClick(e) {
3210    const swiper = this;
3211    if (!swiper.enabled) return;
3212    if (!swiper.allowClick) {
3213      if (swiper.params.preventClicks) e.preventDefault();
3214      if (swiper.params.preventClicksPropagation && swiper.animating) {
3215        e.stopPropagation();
3216        e.stopImmediatePropagation();
3217      }
3218    }
3219  }
3220
3221  function onScroll() {
3222    const swiper = this;
3223    const {
3224      wrapperEl,
3225      rtlTranslate,
3226      enabled
3227    } = swiper;
3228    if (!enabled) return;
3229    swiper.previousTranslate = swiper.translate;
3230    if (swiper.isHorizontal()) {
3231      swiper.translate = -wrapperEl.scrollLeft;
3232    } else {
3233      swiper.translate = -wrapperEl.scrollTop;
3234    }
3235    // eslint-disable-next-line
3236    if (swiper.translate === 0) swiper.translate = 0;
3237    swiper.updateActiveIndex();
3238    swiper.updateSlidesClasses();
3239    let newProgress;
3240    const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
3241    if (translatesDiff === 0) {
3242      newProgress = 0;
3243    } else {
3244      newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
3245    }
3246    if (newProgress !== swiper.progress) {
3247      swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
3248    }
3249    swiper.emit('setTranslate', swiper.translate, false);
3250  }
3251
3252  function onLoad(e) {
3253    const swiper = this;
3254    processLazyPreloader(swiper, e.target);
3255    if (swiper.params.cssMode || swiper.params.slidesPerView !== 'auto' && !swiper.params.autoHeight) {
3256      return;
3257    }
3258    swiper.update();
3259  }
3260
3261  function onDocumentTouchStart() {
3262    const swiper = this;
3263    if (swiper.documentTouchHandlerProceeded) return;
3264    swiper.documentTouchHandlerProceeded = true;
3265    if (swiper.params.touchReleaseOnEdges) {
3266      swiper.el.style.touchAction = 'auto';
3267    }
3268  }
3269
3270  const events = (swiper, method) => {
3271    const document = getDocument
vendor: 3,137 bytes, lines 3271-3383
3271();
3272    const {
3273      params,
3274      el,
3275      wrapperEl,
3276      device
3277    } = swiper;
3278    const capture = !!params.nested;
3279    const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
3280    const swiperMethod = method;
3281    if (!el || typeof el === 'string') return;
3282
3283    // Touch Events
3284    document[domMethod]('touchstart', swiper.onDocumentTouchStart, {
3285      passive: false,
3286      capture
3287    });
3288    el[domMethod]('touchstart', swiper.onTouchStart, {
3289      passive: false
3290    });
3291    el[domMethod]('pointerdown', swiper.onTouchStart, {
3292      passive: false
3293    });
3294    document[domMethod]('touchmove', swiper.onTouchMove, {
3295      passive: false,
3296      capture
3297    });
3298    document[domMethod]('pointermove', swiper.onTouchMove, {
3299      passive: false,
3300      capture
3301    });
3302    document[domMethod]('touchend', swiper.onTouchEnd, {
3303      passive: true
3304    });
3305    document[domMethod]('pointerup', swiper.onTouchEnd, {
3306      passive: true
3307    });
3308    document[domMethod]('pointercancel', swiper.onTouchEnd, {
3309      passive: true
3310    });
3311    document[domMethod]('touchcancel', swiper.onTouchEnd, {
3312      passive: true
3313    });
3314    document[domMethod]('pointerout', swiper.onTouchEnd, {
3315      passive: true
3316    });
3317    document[domMethod]('pointerleave', swiper.onTouchEnd, {
3318      passive: true
3319    });
3320    document[domMethod]('contextmenu', swiper.onTouchEnd, {
3321      passive: true
3322    });
3323
3324    // Prevent Links Clicks
3325    if (params.preventClicks || params.preventClicksPropagation) {
3326      el[domMethod]('click', swiper.onClick, true);
3327    }
3328    if (params.cssMode) {
3329      wrapperEl[domMethod]('scroll', swiper.onScroll);
3330    }
3331
3332    // Resize handler
3333    if (params.updateOnWindowResize) {
3334      swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);
3335    } else {
3336      swiper[swiperMethod]('observerUpdate', onResize, true);
3337    }
3338
3339    // Images loader
3340    el[domMethod]('load', swiper.onLoad, {
3341      capture: true
3342    });
3343  };
3344  function attachEvents() {
3345    const swiper = this;
3346    const {
3347      params
3348    } = swiper;
3349    swiper.onTouchStart = onTouchStart.bind(swiper);
3350    swiper.onTouchMove = onTouchMove.bind(swiper);
3351    swiper.onTouchEnd = onTouchEnd.bind(swiper);
3352    swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
3353    if (params.cssMode) {
3354      swiper.onScroll = onScroll.bind(swiper);
3355    }
3356    swiper.onClick = onClick.bind(swiper);
3357    swiper.onLoad = onLoad.bind(swiper);
3358    events(swiper, 'on');
3359  }
3360  function detachEvents() {
3361    const swiper = this;
3362    events(swiper, 'off');
3363  }
3364  var events$1 = {
3365    attachEvents,
3366    detachEvents
3367  };
3368
3369  const isGridEnabled = (swiper, params) => {
3370    return swiper.grid && params.grid && params.grid.rows > 1;
3371  };
3372  function setBreakpoint() {
3373    const swiper = this;
3374    const {
3375      realIndex,
3376      initialized,
3377      params,
3378      el
3379    } = swiper;
3380    const breakpoints = params.breakpoints;
3381    if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return;
3382
3383    // Get breakpoint for window width and update parameters
vendor: 3,397 bytes, lines 3384-3463
3384    const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);
3385    if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
3386    const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;
3387    const breakpointParams = breakpointOnlyParams || swiper.originalParams;
3388    const wasMultiRow = isGridEnabled(swiper, params);
3389    const isMultiRow = isGridEnabled(swiper, breakpointParams);
3390    const wasGrabCursor = swiper.params.grabCursor;
3391    const isGrabCursor = breakpointParams.grabCursor;
3392    const wasEnabled = params.enabled;
3393    if (wasMultiRow && !isMultiRow) {
3394      el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
3395      swiper.emitContainerClasses();
3396    } else if (!wasMultiRow && isMultiRow) {
3397      el.classList.add(`${params.containerModifierClass}grid`);
3398      if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {
3399        el.classList.add(`${params.containerModifierClass}grid-column`);
3400      }
3401      swiper.emitContainerClasses();
3402    }
3403    if (wasGrabCursor && !isGrabCursor) {
3404      swiper.unsetGrabCursor();
3405    } else if (!wasGrabCursor && isGrabCursor) {
3406      swiper.setGrabCursor();
3407    }
3408
3409    // Toggle navigation, pagination, scrollbar
3410    ['navigation', 'pagination', 'scrollbar'].forEach(prop => {
3411      if (typeof breakpointParams[prop] === 'undefined') return;
3412      const wasModuleEnabled = params[prop] && params[prop].enabled;
3413      const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
3414      if (wasModuleEnabled && !isModuleEnabled) {
3415        swiper[prop].disable();
3416      }
3417      if (!wasModuleEnabled && isModuleEnabled) {
3418        swiper[prop].enable();
3419      }
3420    });
3421    const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
3422    const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
3423    const wasLoop = params.loop;
3424    if (directionChanged && initialized) {
3425      swiper.changeDirection();
3426    }
3427    extend(swiper.params, breakpointParams);
3428    const isEnabled = swiper.params.enabled;
3429    const hasLoop = swiper.params.loop;
3430    Object.assign(swiper, {
3431      allowTouchMove: swiper.params.allowTouchMove,
3432      allowSlideNext: swiper.params.allowSlideNext,
3433      allowSlidePrev: swiper.params.allowSlidePrev
3434    });
3435    if (wasEnabled && !isEnabled) {
3436      swiper.disable();
3437    } else if (!wasEnabled && isEnabled) {
3438      swiper.enable();
3439    }
3440    swiper.currentBreakpoint = breakpoint;
3441    swiper.emit('_beforeBreakpoint', breakpointParams);
3442    if (initialized) {
3443      if (needsReLoop) {
3444        swiper.loopDestroy();
3445        swiper.loopCreate(realIndex);
3446        swiper.updateSlides();
3447      } else if (!wasLoop && hasLoop) {
3448        swiper.loopCreate(realIndex);
3449        swiper.updateSlides();
3450      } else if (wasLoop && !hasLoop) {
3451        swiper.loopDestroy();
3452      }
3453    }
3454    swiper.emit('breakpoint', breakpointParams);
3455  }
3456
3457  function getBreakpoint(breakpoints, base, containerEl) {
3458    if (base === void 0) {
3459      base = 'window';
3460    }
3461    if (!breakpoints || base === 'container' && !containerEl) return undefined;
3462    let breakpoint = false;
3463    const window = getWindow
vendor: 7,245 bytes, lines 3463-3732
3463();
3464    const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;
3465    const points = Object.keys(breakpoints).map(point => {
3466      if (typeof point === 'string' && point.indexOf('@') === 0) {
3467        const minRatio = parseFloat(point.substr(1));
3468        const value = currentHeight * minRatio;
3469        return {
3470          value,
3471          point
3472        };
3473      }
3474      return {
3475        value: point,
3476        point
3477      };
3478    });
3479    points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
3480    for (let i = 0; i < points.length; i += 1) {
3481      const {
3482        point,
3483        value
3484      } = points[i];
3485      if (base === 'window') {
3486        if (window.matchMedia(`(min-width: ${value}px)`).matches) {
3487          breakpoint = point;
3488        }
3489      } else if (value <= containerEl.clientWidth) {
3490        breakpoint = point;
3491      }
3492    }
3493    return breakpoint || 'max';
3494  }
3495
3496  var breakpoints = {
3497    setBreakpoint,
3498    getBreakpoint
3499  };
3500
3501  function prepareClasses(entries, prefix) {
3502    const resultClasses = [];
3503    entries.forEach(item => {
3504      if (typeof item === 'object') {
3505        Object.keys(item).forEach(classNames => {
3506          if (item[classNames]) {
3507            resultClasses.push(prefix + classNames);
3508          }
3509        });
3510      } else if (typeof item === 'string') {
3511        resultClasses.push(prefix + item);
3512      }
3513    });
3514    return resultClasses;
3515  }
3516  function addClasses() {
3517    const swiper = this;
3518    const {
3519      classNames,
3520      params,
3521      rtl,
3522      el,
3523      device
3524    } = swiper;
3525    // prettier-ignore
3526    const suffixes = prepareClasses(['initialized', params.direction, {
3527      'free-mode': swiper.params.freeMode && params.freeMode.enabled
3528    }, {
3529      'autoheight': params.autoHeight
3530    }, {
3531      'rtl': rtl
3532    }, {
3533      'grid': params.grid && params.grid.rows > 1
3534    }, {
3535      'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'
3536    }, {
3537      'android': device.android
3538    }, {
3539      'ios': device.ios
3540    }, {
3541      'css-mode': params.cssMode
3542    }, {
3543      'centered': params.cssMode && params.centeredSlides
3544    }, {
3545      'watch-progress': params.watchSlidesProgress
3546    }], params.containerModifierClass);
3547    classNames.push(...suffixes);
3548    el.classList.add(...classNames);
3549    swiper.emitContainerClasses();
3550  }
3551
3552  function removeClasses() {
3553    const swiper = this;
3554    const {
3555      el,
3556      classNames
3557    } = swiper;
3558    if (!el || typeof el === 'string') return;
3559    el.classList.remove(...classNames);
3560    swiper.emitContainerClasses();
3561  }
3562
3563  var classes = {
3564    addClasses,
3565    removeClasses
3566  };
3567
3568  function checkOverflow() {
3569    const swiper = this;
3570    const {
3571      isLocked: wasLocked,
3572      params
3573    } = swiper;
3574    const {
3575      slidesOffsetBefore
3576    } = params;
3577    if (slidesOffsetBefore) {
3578      const lastSlideIndex = swiper.slides.length - 1;
3579      const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
3580      swiper.isLocked = swiper.size > lastSlideRightEdge;
3581    } else {
3582      swiper.isLocked = swiper.snapGrid.length === 1;
3583    }
3584    if (params.allowSlideNext === true) {
3585      swiper.allowSlideNext = !swiper.isLocked;
3586    }
3587    if (params.allowSlidePrev === true) {
3588      swiper.allowSlidePrev = !swiper.isLocked;
3589    }
3590    if (wasLocked && wasLocked !== swiper.isLocked) {
3591      swiper.isEnd = false;
3592    }
3593    if (wasLocked !== swiper.isLocked) {
3594      swiper.emit(swiper.isLocked ? 'lock' : 'unlock');
3595    }
3596  }
3597  var checkOverflow$1 = {
3598    checkOverflow
3599  };
3600
3601  var defaults = {
3602    init: true,
3603    direction: 'horizontal',
3604    oneWayMovement: false,
3605    swiperElementNodeName: 'SWIPER-CONTAINER',
3606    touchEventsTarget: 'wrapper',
3607    initialSlide: 0,
3608    speed: 300,
3609    cssMode: false,
3610    updateOnWindowResize: true,
3611    resizeObserver: true,
3612    nested: false,
3613    createElements: false,
3614    eventsPrefix: 'swiper',
3615    enabled: true,
3616    focusableElements: 'input, select, option, textarea, button, video, label',
3617    // Overrides
3618    width: null,
3619    height: null,
3620    //
3621    preventInteractionOnTransition: false,
3622    // ssr
3623    userAgent: null,
3624    url: null,
3625    // To support iOS's swipe-to-go-back gesture (when being used in-app).
3626    edgeSwipeDetection: false,
3627    edgeSwipeThreshold: 20,
3628    // Autoheight
3629    autoHeight: false,
3630    // Set wrapper width
3631    setWrapperSize: false,
3632    // Virtual Translate
3633    virtualTranslate: false,
3634    // Effects
3635    effect: 'slide',
3636    // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
3637
3638    // Breakpoints
3639    breakpoints: undefined,
3640    breakpointsBase: 'window',
3641    // Slides grid
3642    spaceBetween: 0,
3643    slidesPerView: 1,
3644    slidesPerGroup: 1,
3645    slidesPerGroupSkip: 0,
3646    slidesPerGroupAuto: false,
3647    centeredSlides: false,
3648    centeredSlidesBounds: false,
3649    slidesOffsetBefore: 0,
3650    // in px
3651    slidesOffsetAfter: 0,
3652    // in px
3653    normalizeSlideIndex: true,
3654    centerInsufficientSlides: false,
3655    // Disable swiper and hide navigation when container not overflow
3656    watchOverflow: true,
3657    // Round length
3658    roundLengths: false,
3659    // Touches
3660    touchRatio: 1,
3661    touchAngle: 45,
3662    simulateTouch: true,
3663    shortSwipes: true,
3664    longSwipes: true,
3665    longSwipesRatio: 0.5,
3666    longSwipesMs: 300,
3667    followFinger: true,
3668    allowTouchMove: true,
3669    threshold: 5,
3670    touchMoveStopPropagation: false,
3671    touchStartPreventDefault: true,
3672    touchStartForcePreventDefault: false,
3673    touchReleaseOnEdges: false,
3674    // Unique Navigation Elements
3675    uniqueNavElements: true,
3676    // Resistance
3677    resistance: true,
3678    resistanceRatio: 0.85,
3679    // Progress
3680    watchSlidesProgress: false,
3681    // Cursor
3682    grabCursor: false,
3683    // Clicks
3684    preventClicks: true,
3685    preventClicksPropagation: true,
3686    slideToClickedSlide: false,
3687    // loop
3688    loop: false,
3689    loopAddBlankSlides: true,
3690    loopAdditionalSlides: 0,
3691    loopPreventsSliding: true,
3692    // rewind
3693    rewind: false,
3694    // Swiping/no swiping
3695    allowSlidePrev: true,
3696    allowSlideNext: true,
3697    swipeHandler: null,
3698    // '.swipe-handler',
3699    noSwiping: true,
3700    noSwipingClass: 'swiper-no-swiping',
3701    noSwipingSelector: null,
3702    // Passive Listeners
3703    passiveListeners: true,
3704    maxBackfaceHiddenSlides: 10,
3705    // NS
3706    containerModifierClass: 'swiper-',
3707    // NEW
3708    slideClass: 'swiper-slide',
3709    slideBlankClass: 'swiper-slide-blank',
3710    slideActiveClass: 'swiper-slide-active',
3711    slideVisibleClass: 'swiper-slide-visible',
3712    slideFullyVisibleClass: 'swiper-slide-fully-visible',
3713    slideNextClass: 'swiper-slide-next',
3714    slidePrevClass: 'swiper-slide-prev',
3715    wrapperClass: 'swiper-wrapper',
3716    lazyPreloaderClass: 'swiper-lazy-preloader',
3717    lazyPreloadPrevNext: 0,
3718    // Callbacks
3719    runCallbacksOnInit: true,
3720    // Internals
3721    _emitClasses: false
3722  };
3723
3724  function moduleExtendParams(params, allModulesParams) {
3725    return function extendParams(obj) {
3726      if (obj === void 0) {
3727        obj = {};
3728      }
3729      const moduleParamName = Object.keys(obj)[0];
3730      const moduleParams = obj[moduleParamName];
3731      if (typeof moduleParams !== 'object' || moduleParams === null) {
3732        extend
vendor: 1,554 bytes, lines 3732-3781
3732(allModulesParams, obj);
3733        return;
3734      }
3735      if (params[moduleParamName] === true) {
3736        params[moduleParamName] = {
3737          enabled: true
3738        };
3739      }
3740      if (moduleParamName === 'navigation' && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
3741        params[moduleParamName].auto = true;
3742      }
3743      if (['pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
3744        params[moduleParamName].auto = true;
3745      }
3746      if (!(moduleParamName in params && 'enabled' in moduleParams)) {
3747        extend(allModulesParams, obj);
3748        return;
3749      }
3750      if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {
3751        params[moduleParamName].enabled = true;
3752      }
3753      if (!params[moduleParamName]) params[moduleParamName] = {
3754        enabled: false
3755      };
3756      extend(allModulesParams, obj);
3757    };
3758  }
3759
3760  /* eslint no-param-reassign: "off" */
3761  const prototypes = {
3762    eventsEmitter,
3763    update,
3764    translate,
3765    transition,
3766    slide,
3767    loop,
3768    grabCursor,
3769    events: events$1,
3770    breakpoints,
3771    checkOverflow: checkOverflow$1,
3772    classes
3773  };
3774  const extendedDefaults = {};
3775  class Swiper {
3776    constructor() {
3777      let el;
3778      let params;
3779      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
3780        args[_key] = arguments[_key];
3781      }
vendor: 2,062 bytes, lines 3782-3839
3782      if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {
3783        params = args[0];
3784      } else {
3785        [el, params] = args;
3786      }
3787      if (!params) params = {};
3788      params = extend({}, params);
3789      if (el && !params.el) params.el = el;
3790      const document = getDocument();
3791      if (params.el && typeof params.el === 'string' && document.querySelectorAll(params.el).length > 1) {
3792        const swipers = [];
3793        document.querySelectorAll(params.el).forEach(containerEl => {
3794          const newParams = extend({}, params, {
3795            el: containerEl
3796          });
3797          swipers.push(new Swiper(newParams));
3798        });
3799        // eslint-disable-next-line no-constructor-return
3800        return swipers;
3801      }
3802
3803      // Swiper Instance
3804      const swiper = this;
3805      swiper.__swiper__ = true;
3806      swiper.support = getSupport();
3807      swiper.device = getDevice({
3808        userAgent: params.userAgent
3809      });
3810      swiper.browser = getBrowser();
3811      swiper.eventsListeners = {};
3812      swiper.eventsAnyListeners = [];
3813      swiper.modules = [...swiper.__modules__];
3814      if (params.modules && Array.isArray(params.modules)) {
3815        swiper.modules.push(...params.modules);
3816      }
3817      const allModulesParams = {};
3818      swiper.modules.forEach(mod => {
3819        mod({
3820          params,
3821          swiper,
3822          extendParams: moduleExtendParams(params, allModulesParams),
3823          on: swiper.on.bind(swiper),
3824          once: swiper.once.bind(swiper),
3825          off: swiper.off.bind(swiper),
3826          emit: swiper.emit.bind(swiper)
3827        });
3828      });
3829
3830      // Extend defaults with modules params
3831      const swiperParams = extend({}, defaults, allModulesParams);
3832
3833      // Extend defaults with passed params
3834      swiper.params = extend({}, swiperParams, extendedDefaults, params);
3835      swiper.originalParams = extend({}, swiper.params);
3836      swiper.passedParams = extend({}, params);
3837
3838      // add event listeners
3839      if (swiper.params && swiper.params.on) {
vendor: 3,531 bytes, lines 3840-3960
3840        Object.keys(swiper.params.on).forEach(eventName => {
3841          swiper.on(eventName, swiper.params.on[eventName]);
3842        });
3843      }
3844      if (swiper.params && swiper.params.onAny) {
3845        swiper.onAny(swiper.params.onAny);
3846      }
3847
3848      // Extend Swiper
3849      Object.assign(swiper, {
3850        enabled: swiper.params.enabled,
3851        el,
3852        // Classes
3853        classNames: [],
3854        // Slides
3855        slides: [],
3856        slidesGrid: [],
3857        snapGrid: [],
3858        slidesSizesGrid: [],
3859        // isDirection
3860        isHorizontal() {
3861          return swiper.params.direction === 'horizontal';
3862        },
3863        isVertical() {
3864          return swiper.params.direction === 'vertical';
3865        },
3866        // Indexes
3867        activeIndex: 0,
3868        realIndex: 0,
3869        //
3870        isBeginning: true,
3871        isEnd: false,
3872        // Props
3873        translate: 0,
3874        previousTranslate: 0,
3875        progress: 0,
3876        velocity: 0,
3877        animating: false,
3878        cssOverflowAdjustment() {
3879          // Returns 0 unless `translate` is > 2**23
3880          // Should be subtracted from css values to prevent overflow
3881          return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
3882        },
3883        // Locks
3884        allowSlideNext: swiper.params.allowSlideNext,
3885        allowSlidePrev: swiper.params.allowSlidePrev,
3886        // Touch Events
3887        touchEventsData: {
3888          isTouched: undefined,
3889          isMoved: undefined,
3890          allowTouchCallbacks: undefined,
3891          touchStartTime: undefined,
3892          isScrolling: undefined,
3893          currentTranslate: undefined,
3894          startTranslate: undefined,
3895          allowThresholdMove: undefined,
3896          // Form elements to match
3897          focusableElements: swiper.params.focusableElements,
3898          // Last click time
3899          lastClickTime: 0,
3900          clickTimeout: undefined,
3901          // Velocities
3902          velocities: [],
3903          allowMomentumBounce: undefined,
3904          startMoving: undefined,
3905          pointerId: null,
3906          touchId: null
3907        },
3908        // Clicks
3909        allowClick: true,
3910        // Touches
3911        allowTouchMove: swiper.params.allowTouchMove,
3912        touches: {
3913          startX: 0,
3914          startY: 0,
3915          currentX: 0,
3916          currentY: 0,
3917          diff: 0
3918        },
3919        // Images
3920        imagesToLoad: [],
3921        imagesLoaded: 0
3922      });
3923      swiper.emit('_swiper');
3924
3925      // Init
3926      if (swiper.params.init) {
3927        swiper.init();
3928      }
3929
3930      // Return app instance
3931      // eslint-disable-next-line no-constructor-return
3932      return swiper;
3933    }
3934    getDirectionLabel(property) {
3935      if (this.isHorizontal()) {
3936        return property;
3937      }
3938      // prettier-ignore
3939      return {
3940        'width': 'height',
3941        'margin-top': 'margin-left',
3942        'margin-bottom ': 'margin-right',
3943        'margin-left': 'margin-top',
3944        'margin-right': 'margin-bottom',
3945        'padding-left': 'padding-top',
3946        'padding-right': 'padding-bottom',
3947        'marginRight': 'marginBottom'
3948      }[property];
3949    }
3950    getSlideIndex(slideEl) {
3951      const {
3952        slidesEl,
3953        params
3954      } = this;
3955      const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3956      const firstSlideIndex = elementIndex(slides[0]);
3957      return elementIndex(slideEl) - firstSlideIndex;
3958    }
3959    getSlideIndexByData(index) {
3960      return this.getSlideIndex(this.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === index)[0])
vendor: 8,478 bytes, lines 3960-4204
3960;
3961    }
3962    recalcSlides() {
3963      const swiper = this;
3964      const {
3965        slidesEl,
3966        params
3967      } = swiper;
3968      swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
3969    }
3970    enable() {
3971      const swiper = this;
3972      if (swiper.enabled) return;
3973      swiper.enabled = true;
3974      if (swiper.params.grabCursor) {
3975        swiper.setGrabCursor();
3976      }
3977      swiper.emit('enable');
3978    }
3979    disable() {
3980      const swiper = this;
3981      if (!swiper.enabled) return;
3982      swiper.enabled = false;
3983      if (swiper.params.grabCursor) {
3984        swiper.unsetGrabCursor();
3985      }
3986      swiper.emit('disable');
3987    }
3988    setProgress(progress, speed) {
3989      const swiper = this;
3990      progress = Math.min(Math.max(progress, 0), 1);
3991      const min = swiper.minTranslate();
3992      const max = swiper.maxTranslate();
3993      const current = (max - min) * progress + min;
3994      swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);
3995      swiper.updateActiveIndex();
3996      swiper.updateSlidesClasses();
3997    }
3998    emitContainerClasses() {
3999      const swiper = this;
4000      if (!swiper.params._emitClasses || !swiper.el) return;
4001      const cls = swiper.el.className.split(' ').filter(className => {
4002        return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
4003      });
4004      swiper.emit('_containerClasses', cls.join(' '));
4005    }
4006    getSlideClasses(slideEl) {
4007      const swiper = this;
4008      if (swiper.destroyed) return '';
4009      return slideEl.className.split(' ').filter(className => {
4010        return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;
4011      }).join(' ');
4012    }
4013    emitSlidesClasses() {
4014      const swiper = this;
4015      if (!swiper.params._emitClasses || !swiper.el) return;
4016      const updates = [];
4017      swiper.slides.forEach(slideEl => {
4018        const classNames = swiper.getSlideClasses(slideEl);
4019        updates.push({
4020          slideEl,
4021          classNames
4022        });
4023        swiper.emit('_slideClass', slideEl, classNames);
4024      });
4025      swiper.emit('_slideClasses', updates);
4026    }
4027    slidesPerViewDynamic(view, exact) {
4028      if (view === void 0) {
4029        view = 'current';
4030      }
4031      if (exact === void 0) {
4032        exact = false;
4033      }
4034      const swiper = this;
4035      const {
4036        params,
4037        slides,
4038        slidesGrid,
4039        slidesSizesGrid,
4040        size: swiperSize,
4041        activeIndex
4042      } = swiper;
4043      let spv = 1;
4044      if (typeof params.slidesPerView === 'number') return params.slidesPerView;
4045      if (params.centeredSlides) {
4046        let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;
4047        let breakLoop;
4048        for (let i = activeIndex + 1; i < slides.length; i += 1) {
4049          if (slides[i] && !breakLoop) {
4050            slideSize += Math.ceil(slides[i].swiperSlideSize);
4051            spv += 1;
4052            if (slideSize > swiperSize) breakLoop = true;
4053          }
4054        }
4055        for (let i = activeIndex - 1; i >= 0; i -= 1) {
4056          if (slides[i] && !breakLoop) {
4057            slideSize += slides[i].swiperSlideSize;
4058            spv += 1;
4059            if (slideSize > swiperSize) breakLoop = true;
4060          }
4061        }
4062      } else {
4063        // eslint-disable-next-line
4064        if (view === 'current') {
4065          for (let i = activeIndex + 1; i < slides.length; i += 1) {
4066            const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
4067            if (slideInView) {
4068              spv += 1;
4069            }
4070          }
4071        } else {
4072          // previous
4073          for (let i = activeIndex - 1; i >= 0; i -= 1) {
4074            const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
4075            if (slideInView) {
4076              spv += 1;
4077            }
4078          }
4079        }
4080      }
4081      return spv;
4082    }
4083    update() {
4084      const swiper = this;
4085      if (!swiper || swiper.destroyed) return;
4086      const {
4087        snapGrid,
4088        params
4089      } = swiper;
4090      // Breakpoints
4091      if (params.breakpoints) {
4092        swiper.setBreakpoint();
4093      }
4094      [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach(imageEl => {
4095        if (imageEl.complete) {
4096          processLazyPreloader(swiper, imageEl);
4097        }
4098      });
4099      swiper.updateSize();
4100      swiper.updateSlides();
4101      swiper.updateProgress();
4102      swiper.updateSlidesClasses();
4103      function setTranslate() {
4104        const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
4105        const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
4106        swiper.setTranslate(newTranslate);
4107        swiper.updateActiveIndex();
4108        swiper.updateSlidesClasses();
4109      }
4110      let translated;
4111      if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
4112        setTranslate();
4113        if (params.autoHeight) {
4114          swiper.updateAutoHeight();
4115        }
4116      } else {
4117        if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
4118          const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
4119          translated = swiper.slideTo(slides.length - 1, 0, false, true);
4120        } else {
4121          translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
4122        }
4123        if (!translated) {
4124          setTranslate();
4125        }
4126      }
4127      if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
4128        swiper.checkOverflow();
4129      }
4130      swiper.emit('update');
4131    }
4132    changeDirection(newDirection, needUpdate) {
4133      if (needUpdate === void 0) {
4134        needUpdate = true;
4135      }
4136      const swiper = this;
4137      const currentDirection = swiper.params.direction;
4138      if (!newDirection) {
4139        // eslint-disable-next-line
4140        newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';
4141      }
4142      if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {
4143        return swiper;
4144      }
4145      swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
4146      swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
4147      swiper.emitContainerClasses();
4148      swiper.params.direction = newDirection;
4149      swiper.slides.forEach(slideEl => {
4150        if (newDirection === 'vertical') {
4151          slideEl.style.width = '';
4152        } else {
4153          slideEl.style.height = '';
4154        }
4155      });
4156      swiper.emit('changeDirection');
4157      if (needUpdate) swiper.update();
4158      return swiper;
4159    }
4160    changeLanguageDirection(direction) {
4161      const swiper = this;
4162      if (swiper.rtl && direction === 'rtl' || !swiper.rtl && direction === 'ltr') return;
4163      swiper.rtl = direction === 'rtl';
4164      swiper.rtlTranslate = swiper.params.direction === 'horizontal' && swiper.rtl;
4165      if (swiper.rtl) {
4166        swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
4167        swiper.el.dir = 'rtl';
4168      } else {
4169        swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
4170        swiper.el.dir = 'ltr';
4171      }
4172      swiper.update();
4173    }
4174    mount(element) {
4175      const swiper = this;
4176      if (swiper.mounted) return true;
4177
4178      // Find el
4179      let el = element || swiper.params.el;
4180      if (typeof el === 'string') {
4181        el = document.querySelector(el);
4182      }
4183      if (!el) {
4184        return false;
4185      }
4186      el.swiper = swiper;
4187      if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {
4188        swiper.isElement = true;
4189      }
4190      const getWrapperSelector = () => {
4191        return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;
4192      };
4193      const getWrapper = () => {
4194        if (el && el.shadowRoot && el.shadowRoot.querySelector) {
4195          const res = el.shadowRoot.querySelector(getWrapperSelector());
4196          // Children needs to return slot items
4197          return res;
4198        }
4199        return elementChildren(el, getWrapperSelector())[0];
4200      };
4201      // Find Wrapper
4202      let wrapperEl = getWrapper();
4203      if (!wrapperEl && swiper.params.createElements) {
4204        wrapperEl = createElement
4204('div', swiper.params.wrapperClass);
4205        el.append(wrapperEl);
4206        elementChildren(el, `.${swiper.params.slideClass}`).forEach(slideEl => {
4207          wrapperEl.append(slideEl);
4208        });
4209      }
4210      Object.assign(swiper, {
4211        el,
4212        wrapperEl,
4213        slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
4214        hostEl: swiper.isElement ? el.parentNode.host : el,
4215        mounted: true,
4216        // RTL
4217        rtl: el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl',
4218        rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || elementStyle(el, 'direction') === 'rtl'),
4219        wrongRTL: elementStyle(wrapperEl, 'display') === '-webkit-box'
4220      });
4221      return true;
4222    }
4223    init(el) {
4224      const swiper = this;
4225      if (swiper.initialized) return swiper;
4226      const mounted = swiper.mount(el);
4227      if (mounted === false) return swiper;
4228      swiper.emit('beforeInit');
4229
4230      // Set breakpoint
4231      if (swiper.params.breakpoints) {
4232        swiper.setBreakpoint();
4233      }
4234
4235      // Add Classes
4236      swiper.addClasses();
4237
4238      // Update size
4239      swiper.updateSize();
4240
4241      // Update slides
4242      swiper.updateSlides();
4243      if (swiper.params.watchOverflow) {
4244        swiper.checkOverflow();
4245      }
4246
4247      // Set Grab Cursor
4248      if (swiper.params.grabCursor && swiper.enabled) {
4249        swiper.setGrabCursor();
4250      }
4251
4252      // Slide To Initial Slide
4253      if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
4254        swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
4255      } else {
4256        swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
4257      }
4258
4259      // Create loop
4260      if (swiper.params.loop) {
4261        swiper.loopCreate();
4262      }
4263
4264      // Attach events
4265      swiper.attachEvents();
4266      const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')];
4267      if (swiper.isElement) {
4268        lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]'));
4269      }
4270      lazyElements.forEach(imageEl => {
4271        if (imageEl.complete) {
4272          processLazyPreloader(swiper, imageEl);
4273        } else {
4274          imageEl.addEventListener('load', e => {
4275            processLazyPreloader(swiper, e.target);
4276          });
4277        }
4278      });
4279      preload(swiper);
4280
4281      // Init Flag
4282      swiper.initialized = true;
4283      preload(swiper);
4284
4285      // Emit
4286      swiper.emit('init');
4287      swiper.emit('afterInit');
4288      return swiper;
4289    }
4290    destroy(deleteInstance, cleanStyles) {
4291      if (deleteInstance === void 0) {
4292        deleteInstance = true;
4293      }
4294      if (cleanStyles === void 0) {
4295        cleanStyles = true;
4296      }
4297      const swiper = this;
4298      const {
4299        params,
4300        el,
4301        wrapperEl,
4302        slides
4303      } = swiper;
4304      if (typeof swiper.params === 'undefined' || swiper.destroyed) {
4305        return null;
4306      }
4307      swiper.emit('beforeDestroy');
4308
4309      // Init Flag
4310      swiper.initialized = false;
4311
4312      // Detach events
4313      swiper.detachEvents();
4314
4315      // Destroy loop
4316      if (params.loop) {
4317        swiper.loopDestroy();
4318      }
4319
4320      // Cleanup styles
4321      if (cleanStyles) {
4322        swiper.removeClasses();
4323        if (el && typeof el !== 'string') {
4324          el.removeAttribute('style');
4325        }
4326        if (wrapperEl) {
4327          wrapperEl.removeAttribute('style');
4328        }
4329        if (slides && slides.length) {
vendor: 5,540 bytes, lines 4330-4507
4330          slides.forEach(slideEl => {
4331            slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
4332            slideEl.removeAttribute('style');
4333            slideEl.removeAttribute('data-swiper-slide-index');
4334          });
4335        }
4336      }
4337      swiper.emit('destroy');
4338
4339      // Detach emitter events
4340      Object.keys(swiper.eventsListeners).forEach(eventName => {
4341        swiper.off(eventName);
4342      });
4343      if (deleteInstance !== false) {
4344        if (swiper.el && typeof swiper.el !== 'string') {
4345          swiper.el.swiper = null;
4346        }
4347        deleteProps(swiper);
4348      }
4349      swiper.destroyed = true;
4350      return null;
4351    }
4352    static extendDefaults(newDefaults) {
4353      extend(extendedDefaults, newDefaults);
4354    }
4355    static get extendedDefaults() {
4356      return extendedDefaults;
4357    }
4358    static get defaults() {
4359      return defaults;
4360    }
4361    static installModule(mod) {
4362      if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];
4363      const modules = Swiper.prototype.__modules__;
4364      if (typeof mod === 'function' && modules.indexOf(mod) < 0) {
4365        modules.push(mod);
4366      }
4367    }
4368    static use(module) {
4369      if (Array.isArray(module)) {
4370        module.forEach(m => Swiper.installModule(m));
4371        return Swiper;
4372      }
4373      Swiper.installModule(module);
4374      return Swiper;
4375    }
4376  }
4377  Object.keys(prototypes).forEach(prototypeGroup => {
4378    Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {
4379      Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
4380    });
4381  });
4382  Swiper.use([Resize, Observer]);
4383
4384  function Virtual(_ref) {
4385    let {
4386      swiper,
4387      extendParams,
4388      on,
4389      emit
4390    } = _ref;
4391    extendParams({
4392      virtual: {
4393        enabled: false,
4394        slides: [],
4395        cache: true,
4396        renderSlide: null,
4397        renderExternal: null,
4398        renderExternalUpdate: true,
4399        addSlidesBefore: 0,
4400        addSlidesAfter: 0
4401      }
4402    });
4403    let cssModeTimeout;
4404    const document = getDocument();
4405    swiper.virtual = {
4406      cache: {},
4407      from: undefined,
4408      to: undefined,
4409      slides: [],
4410      offset: 0,
4411      slidesGrid: []
4412    };
4413    const tempDOM = document.createElement('div');
4414    function renderSlide(slide, index) {
4415      const params = swiper.params.virtual;
4416      if (params.cache && swiper.virtual.cache[index]) {
4417        return swiper.virtual.cache[index];
4418      }
4419      // eslint-disable-next-line
4420      let slideEl;
4421      if (params.renderSlide) {
4422        slideEl = params.renderSlide.call(swiper, slide, index);
4423        if (typeof slideEl === 'string') {
4424          tempDOM.innerHTML = slideEl;
4425          slideEl = tempDOM.children[0];
4426        }
4427      } else if (swiper.isElement) {
4428        slideEl = createElement('swiper-slide');
4429      } else {
4430        slideEl = createElement('div', swiper.params.slideClass);
4431      }
4432      slideEl.setAttribute('data-swiper-slide-index', index);
4433      if (!params.renderSlide) {
4434        slideEl.innerHTML = slide;
4435      }
4436      if (params.cache) {
4437        swiper.virtual.cache[index] = slideEl;
4438      }
4439      return slideEl;
4440    }
4441    function update(force, beforeInit) {
4442      const {
4443        slidesPerView,
4444        slidesPerGroup,
4445        centeredSlides,
4446        loop: isLoop,
4447        initialSlide
4448      } = swiper.params;
4449      if (beforeInit && !isLoop && initialSlide > 0) {
4450        return;
4451      }
4452      const {
4453        addSlidesBefore,
4454        addSlidesAfter
4455      } = swiper.params.virtual;
4456      const {
4457        from: previousFrom,
4458        to: previousTo,
4459        slides,
4460        slidesGrid: previousSlidesGrid,
4461        offset: previousOffset
4462      } = swiper.virtual;
4463      if (!swiper.params.cssMode) {
4464        swiper.updateActiveIndex();
4465      }
4466      const activeIndex = swiper.activeIndex || 0;
4467      let offsetProp;
4468      if (swiper.rtlTranslate) offsetProp = 'right';else offsetProp = swiper.isHorizontal() ? 'left' : 'top';
4469      let slidesAfter;
4470      let slidesBefore;
4471      if (centeredSlides) {
4472        slidesAfter = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesAfter;
4473        slidesBefore = Math.floor(slidesPerView / 2) + slidesPerGroup + addSlidesBefore;
4474      } else {
4475        slidesAfter = slidesPerView + (slidesPerGroup - 1) + addSlidesAfter;
4476        slidesBefore = (isLoop ? slidesPerView : slidesPerGroup) + addSlidesBefore;
4477      }
4478      let from = activeIndex - slidesBefore;
4479      let to = activeIndex + slidesAfter;
4480      if (!isLoop) {
4481        from = Math.max(from, 0);
4482        to = Math.min(to, slides.length - 1);
4483      }
4484      let offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
4485      if (isLoop && activeIndex >= slidesBefore) {
4486        from -= slidesBefore;
4487        if (!centeredSlides) offset += swiper.slidesGrid[0];
4488      } else if (isLoop && activeIndex < slidesBefore) {
4489        from = -slidesBefore;
4490        if (centeredSlides) offset += swiper.slidesGrid[0];
4491      }
4492      Object.assign(swiper.virtual, {
4493        from,
4494        to,
4495        offset,
4496        slidesGrid: swiper.slidesGrid,
4497        slidesBefore,
4498        slidesAfter
4499      });
4500      function onRendered() {
4501        swiper.updateSlides();
4502        swiper.updateProgress();
4503        swiper.updateSlidesClasses();
4504        emit('virtualUpdate');
4505      }
4506      if (previousFrom === from && previousTo === to && !force) {
4507        if (swiper.slidesGrid !== previousSlidesGrid && offset !== previousOffset) {
vendor: 1,316 bytes, lines 4508-4549
4508          swiper.slides.forEach(slideEl => {
4509            slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
4510          });
4511        }
4512        swiper.updateProgress();
4513        emit('virtualUpdate');
4514        return;
4515      }
4516      if (swiper.params.virtual.renderExternal) {
4517        swiper.params.virtual.renderExternal.call(swiper, {
4518          offset,
4519          from,
4520          to,
4521          slides: function getSlides() {
4522            const slidesToRender = [];
4523            for (let i = from; i <= to; i += 1) {
4524              slidesToRender.push(slides[i]);
4525            }
4526            return slidesToRender;
4527          }()
4528        });
4529        if (swiper.params.virtual.renderExternalUpdate) {
4530          onRendered();
4531        } else {
4532          emit('virtualUpdate');
4533        }
4534        return;
4535      }
4536      const prependIndexes = [];
4537      const appendIndexes = [];
4538      const getSlideIndex = index => {
4539        let slideIndex = index;
4540        if (index < 0) {
4541          slideIndex = slides.length + index;
4542        } else if (slideIndex >= slides.length) {
4543          // eslint-disable-next-line
4544          slideIndex = slideIndex - slides.length;
4545        }
4546        return slideIndex;
4547      };
4548      if (force) {
4549        swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}
4549, swiper-slide`)).forEach(slideEl => {
4550          slideEl.remove();
4551        });
4552      } else {
4553        for (let i = previousFrom; i <= previousTo; i += 1) {
4554          if (i < from || i > to) {
4555            const slideIndex = getSlideIndex(i);
4556            swiper.slides.filter(el => el.matches(`.${swiper.params.slideClass}[data-swiper-slide-index="${slideIndex}"], swiper-slide[data-swiper-slide-index="${slideIndex}"]`)).forEach(slideEl => {
4557              slideEl.remove();
4558            });
4559          }
4560        }
4561      }
4562      const loopFrom = isLoop ? -slides.length : 0;
4563      const loopTo = isLoop ? slides.length * 2 : slides.length;
4564      for (let i = loopFrom; i < loopTo; i += 1) {
4565        if (i >= from && i <= to) {
4566          const slideIndex = getSlideIndex(i);
4567          if (typeof previousTo === 'undefined' || force) {
4568            appendIndexes.push(slideIndex);
4569          } else {
4570            if (i > previousTo) appendIndexes.push(slideIndex);
4571            if (i < previousFrom) prependIndexes.push(slideIndex);
4572          }
4573        }
4574      }
4575      appendIndexes.forEach(index => {
4576        swiper.slidesEl.append(renderSlide(slides[index], index));
4577      });
4578      if (isLoop) {
4579        for (let i = prependIndexes.length - 1; i >= 0; i -= 1) {
4580          const index = prependIndexes[i];
4581          swiper.slidesEl.prepend(renderSlide(slides[index], index));
4582        }
4583      } else {
4584        prependIndexes.sort((a, b) => b - a);
4585        prependIndexes.forEach(index => {
4586          swiper.slidesEl.prepend(renderSlide(slides[index], index));
4587        });
4588      }
4589      elementChildren(swiper.slidesEl, '.swiper-slide, swiper-slide').forEach(sli
vendor: 5,044 bytes, lines 4589-4719
4589deEl => {
4590        slideEl.style[offsetProp] = `${offset - Math.abs(swiper.cssOverflowAdjustment())}px`;
4591      });
4592      onRendered();
4593    }
4594    function appendSlide(slides) {
4595      if (typeof slides === 'object' && 'length' in slides) {
4596        for (let i = 0; i < slides.length; i += 1) {
4597          if (slides[i]) swiper.virtual.slides.push(slides[i]);
4598        }
4599      } else {
4600        swiper.virtual.slides.push(slides);
4601      }
4602      update(true);
4603    }
4604    function prependSlide(slides) {
4605      const activeIndex = swiper.activeIndex;
4606      let newActiveIndex = activeIndex + 1;
4607      let numberOfNewSlides = 1;
4608      if (Array.isArray(slides)) {
4609        for (let i = 0; i < slides.length; i += 1) {
4610          if (slides[i]) swiper.virtual.slides.unshift(slides[i]);
4611        }
4612        newActiveIndex = activeIndex + slides.length;
4613        numberOfNewSlides = slides.length;
4614      } else {
4615        swiper.virtual.slides.unshift(slides);
4616      }
4617      if (swiper.params.virtual.cache) {
4618        const cache = swiper.virtual.cache;
4619        const newCache = {};
4620        Object.keys(cache).forEach(cachedIndex => {
4621          const cachedEl = cache[cachedIndex];
4622          const cachedElIndex = cachedEl.getAttribute('data-swiper-slide-index');
4623          if (cachedElIndex) {
4624            cachedEl.setAttribute('data-swiper-slide-index', parseInt(cachedElIndex, 10) + numberOfNewSlides);
4625          }
4626          newCache[parseInt(cachedIndex, 10) + numberOfNewSlides] = cachedEl;
4627        });
4628        swiper.virtual.cache = newCache;
4629      }
4630      update(true);
4631      swiper.slideTo(newActiveIndex, 0);
4632    }
4633    function removeSlide(slidesIndexes) {
4634      if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
4635      let activeIndex = swiper.activeIndex;
4636      if (Array.isArray(slidesIndexes)) {
4637        for (let i = slidesIndexes.length - 1; i >= 0; i -= 1) {
4638          if (swiper.params.virtual.cache) {
4639            delete swiper.virtual.cache[slidesIndexes[i]];
4640            // shift cache indexes
4641            Object.keys(swiper.virtual.cache).forEach(key => {
4642              if (key > slidesIndexes) {
4643                swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
4644                swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
4645                delete swiper.virtual.cache[key];
4646              }
4647            });
4648          }
4649          swiper.virtual.slides.splice(slidesIndexes[i], 1);
4650          if (slidesIndexes[i] < activeIndex) activeIndex -= 1;
4651          activeIndex = Math.max(activeIndex, 0);
4652        }
4653      } else {
4654        if (swiper.params.virtual.cache) {
4655          delete swiper.virtual.cache[slidesIndexes];
4656          // shift cache indexes
4657          Object.keys(swiper.virtual.cache).forEach(key => {
4658            if (key > slidesIndexes) {
4659              swiper.virtual.cache[key - 1] = swiper.virtual.cache[key];
4660              swiper.virtual.cache[key - 1].setAttribute('data-swiper-slide-index', key - 1);
4661              delete swiper.virtual.cache[key];
4662            }
4663          });
4664        }
4665        swiper.virtual.slides.splice(slidesIndexes, 1);
4666        if (slidesIndexes < activeIndex) activeIndex -= 1;
4667        activeIndex = Math.max(activeIndex, 0);
4668      }
4669      update(true);
4670      swiper.slideTo(activeIndex, 0);
4671    }
4672    function removeAllSlides() {
4673      swiper.virtual.slides = [];
4674      if (swiper.params.virtual.cache) {
4675        swiper.virtual.cache = {};
4676      }
4677      update(true);
4678      swiper.slideTo(0, 0);
4679    }
4680    on('beforeInit', () => {
4681      if (!swiper.params.virtual.enabled) return;
4682      let domSlidesAssigned;
4683      if (typeof swiper.passedParams.virtual.slides === 'undefined') {
4684        const slides = [...swiper.slidesEl.children].filter(el => el.matches(`.${swiper.params.slideClass}, swiper-slide`));
4685        if (slides && slides.length) {
4686          swiper.virtual.slides = [...slides];
4687          domSlidesAssigned = true;
4688          slides.forEach((slideEl, slideIndex) => {
4689            slideEl.setAttribute('data-swiper-slide-index', slideIndex);
4690            swiper.virtual.cache[slideIndex] = slideEl;
4691            slideEl.remove();
4692          });
4693        }
4694      }
4695      if (!domSlidesAssigned) {
4696        swiper.virtual.slides = swiper.params.virtual.slides;
4697      }
4698      swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);
4699      swiper.params.watchSlidesProgress = true;
4700      swiper.originalParams.watchSlidesProgress = true;
4701      update(false, true);
4702    });
4703    on('setTranslate', () => {
4704      if (!swiper.params.virtual.enabled) return;
4705      if (swiper.params.cssMode && !swiper._immediateVirtual) {
4706        clearTimeout(cssModeTimeout);
4707        cssModeTimeout = setTimeout(() => {
4708          update();
4709        }, 100);
4710      } else {
4711        update();
4712      }
4713    });
4714    on('init update resize', () => {
4715      if (!swiper.params.virtual.enabled) return;
4716      if (swiper.params.cssMode) {
4717        setCSSProperty(swiper.wrapperEl, '--swiper-virtual-size', `${swiper.virtualSize}px`);
4718      }
4719    });
vendor: 4,242 bytes, lines 4720-4824
4720    Object.assign(swiper.virtual, {
4721      appendSlide,
4722      prependSlide,
4723      removeSlide,
4724      removeAllSlides,
4725      update
4726    });
4727  }
4728
4729  /* eslint-disable consistent-return */
4730  function Keyboard(_ref) {
4731    let {
4732      swiper,
4733      extendParams,
4734      on,
4735      emit
4736    } = _ref;
4737    const document = getDocument();
4738    const window = getWindow();
4739    swiper.keyboard = {
4740      enabled: false
4741    };
4742    extendParams({
4743      keyboard: {
4744        enabled: false,
4745        onlyInViewport: true,
4746        pageUpDown: true
4747      }
4748    });
4749    function handle(event) {
4750      if (!swiper.enabled) return;
4751      const {
4752        rtlTranslate: rtl
4753      } = swiper;
4754      let e = event;
4755      if (e.originalEvent) e = e.originalEvent; // jquery fix
4756      const kc = e.keyCode || e.charCode;
4757      const pageUpDown = swiper.params.keyboard.pageUpDown;
4758      const isPageUp = pageUpDown && kc === 33;
4759      const isPageDown = pageUpDown && kc === 34;
4760      const isArrowLeft = kc === 37;
4761      const isArrowRight = kc === 39;
4762      const isArrowUp = kc === 38;
4763      const isArrowDown = kc === 40;
4764      // Directions locks
4765      if (!swiper.allowSlideNext && (swiper.isHorizontal() && isArrowRight || swiper.isVertical() && isArrowDown || isPageDown)) {
4766        return false;
4767      }
4768      if (!swiper.allowSlidePrev && (swiper.isHorizontal() && isArrowLeft || swiper.isVertical() && isArrowUp || isPageUp)) {
4769        return false;
4770      }
4771      if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) {
4772        return undefined;
4773      }
4774      if (document.activeElement && document.activeElement.nodeName && (document.activeElement.nodeName.toLowerCase() === 'input' || document.activeElement.nodeName.toLowerCase() === 'textarea')) {
4775        return undefined;
4776      }
4777      if (swiper.params.keyboard.onlyInViewport && (isPageUp || isPageDown || isArrowLeft || isArrowRight || isArrowUp || isArrowDown)) {
4778        let inView = false;
4779        // Check that swiper should be inside of visible area of window
4780        if (elementParents(swiper.el, `.${swiper.params.slideClass}, swiper-slide`).length > 0 && elementParents(swiper.el, `.${swiper.params.slideActiveClass}`).length === 0) {
4781          return undefined;
4782        }
4783        const el = swiper.el;
4784        const swiperWidth = el.clientWidth;
4785        const swiperHeight = el.clientHeight;
4786        const windowWidth = window.innerWidth;
4787        const windowHeight = window.innerHeight;
4788        const swiperOffset = elementOffset(el);
4789        if (rtl) swiperOffset.left -= el.scrollLeft;
4790        const swiperCoord = [[swiperOffset.left, swiperOffset.top], [swiperOffset.left + swiperWidth, swiperOffset.top], [swiperOffset.left, swiperOffset.top + swiperHeight], [swiperOffset.left + swiperWidth, swiperOffset.top + swiperHeight]];
4791        for (let i = 0; i < swiperCoord.length; i += 1) {
4792          const point = swiperCoord[i];
4793          if (point[0] >= 0 && point[0] <= windowWidth && point[1] >= 0 && point[1] <= windowHeight) {
4794            if (point[0] === 0 && point[1] === 0) continue; // eslint-disable-line
4795            inView = true;
4796          }
4797        }
4798        if (!inView) return undefined;
4799      }
4800      if (swiper.isHorizontal()) {
4801        if (isPageUp || isPageDown || isArrowLeft || isArrowRight) {
4802          if (e.preventDefault) e.preventDefault();else e.returnValue = false;
4803        }
4804        if ((isPageDown || isArrowRight) && !rtl || (isPageUp || isArrowLeft) && rtl) swiper.slideNext();
4805        if ((isPageUp || isArrowLeft) && !rtl || (isPageDown || isArrowRight) && rtl) swiper.slidePrev();
4806      } else {
4807        if (isPageUp || isPageDown || isArrowUp || isArrowDown) {
4808          if (e.preventDefault) e.preventDefault();else e.returnValue = false;
4809        }
4810        if (isPageDown || isArrowDown) swiper.slideNext();
4811        if (isPageUp || isArrowUp) swiper.slidePrev();
4812      }
4813      emit('keyPress', kc);
4814      return undefined;
4815    }
4816    function enable() {
4817      if (swiper.keyboard.enabled) return;
4818      document.addEventListener('keydown', handle);
4819      swiper.keyboard.enabled = true;
4820    }
4821    function disable() {
4822      if (!swiper.keyboard.enabled) return;
4823      document.removeEventListener('keydown', handle);
4824      swiper.keyboard.enabled = false;
vendor: 28,471 bytes, lines 4825-5593
4825    }
4826    on('init', () => {
4827      if (swiper.params.keyboard.enabled) {
4828        enable();
4829      }
4830    });
4831    on('destroy', () => {
4832      if (swiper.keyboard.enabled) {
4833        disable();
4834      }
4835    });
4836    Object.assign(swiper.keyboard, {
4837      enable,
4838      disable
4839    });
4840  }
4841
4842  /* eslint-disable consistent-return */
4843  function Mousewheel(_ref) {
4844    let {
4845      swiper,
4846      extendParams,
4847      on,
4848      emit
4849    } = _ref;
4850    const window = getWindow();
4851    extendParams({
4852      mousewheel: {
4853        enabled: false,
4854        releaseOnEdges: false,
4855        invert: false,
4856        forceToAxis: false,
4857        sensitivity: 1,
4858        eventsTarget: 'container',
4859        thresholdDelta: null,
4860        thresholdTime: null,
4861        noMousewheelClass: 'swiper-no-mousewheel'
4862      }
4863    });
4864    swiper.mousewheel = {
4865      enabled: false
4866    };
4867    let timeout;
4868    let lastScrollTime = now();
4869    let lastEventBeforeSnap;
4870    const recentWheelEvents = [];
4871    function normalize(e) {
4872      // Reasonable defaults
4873      const PIXEL_STEP = 10;
4874      const LINE_HEIGHT = 40;
4875      const PAGE_HEIGHT = 800;
4876      let sX = 0;
4877      let sY = 0; // spinX, spinY
4878      let pX = 0;
4879      let pY = 0; // pixelX, pixelY
4880
4881      // Legacy
4882      if ('detail' in e) {
4883        sY = e.detail;
4884      }
4885      if ('wheelDelta' in e) {
4886        sY = -e.wheelDelta / 120;
4887      }
4888      if ('wheelDeltaY' in e) {
4889        sY = -e.wheelDeltaY / 120;
4890      }
4891      if ('wheelDeltaX' in e) {
4892        sX = -e.wheelDeltaX / 120;
4893      }
4894
4895      // side scrolling on FF with DOMMouseScroll
4896      if ('axis' in e && e.axis === e.HORIZONTAL_AXIS) {
4897        sX = sY;
4898        sY = 0;
4899      }
4900      pX = sX * PIXEL_STEP;
4901      pY = sY * PIXEL_STEP;
4902      if ('deltaY' in e) {
4903        pY = e.deltaY;
4904      }
4905      if ('deltaX' in e) {
4906        pX = e.deltaX;
4907      }
4908      if (e.shiftKey && !pX) {
4909        // if user scrolls with shift he wants horizontal scroll
4910        pX = pY;
4911        pY = 0;
4912      }
4913      if ((pX || pY) && e.deltaMode) {
4914        if (e.deltaMode === 1) {
4915          // delta in LINE units
4916          pX *= LINE_HEIGHT;
4917          pY *= LINE_HEIGHT;
4918        } else {
4919          // delta in PAGE units
4920          pX *= PAGE_HEIGHT;
4921          pY *= PAGE_HEIGHT;
4922        }
4923      }
4924
4925      // Fall-back if spin cannot be determined
4926      if (pX && !sX) {
4927        sX = pX < 1 ? -1 : 1;
4928      }
4929      if (pY && !sY) {
4930        sY = pY < 1 ? -1 : 1;
4931      }
4932      return {
4933        spinX: sX,
4934        spinY: sY,
4935        pixelX: pX,
4936        pixelY: pY
4937      };
4938    }
4939    function handleMouseEnter() {
4940      if (!swiper.enabled) return;
4941      swiper.mouseEntered = true;
4942    }
4943    function handleMouseLeave() {
4944      if (!swiper.enabled) return;
4945      swiper.mouseEntered = false;
4946    }
4947    function animateSlider(newEvent) {
4948      if (swiper.params.mousewheel.thresholdDelta && newEvent.delta < swiper.params.mousewheel.thresholdDelta) {
4949        // Prevent if delta of wheel scroll delta is below configured threshold
4950        return false;
4951      }
4952      if (swiper.params.mousewheel.thresholdTime && now() - lastScrollTime < swiper.params.mousewheel.thresholdTime) {
4953        // Prevent if time between scrolls is below configured threshold
4954        return false;
4955      }
4956
4957      // If the movement is NOT big enough and
4958      // if the last time the user scrolled was too close to the current one (avoid continuously triggering the slider):
4959      //   Don't go any further (avoid insignificant scroll movement).
4960      if (newEvent.delta >= 6 && now() - lastScrollTime < 60) {
4961        // Return false as a default
4962        return true;
4963      }
4964      // If user is scrolling towards the end:
4965      //   If the slider hasn't hit the latest slide or
4966      //   if the slider is a loop and
4967      //   if the slider isn't moving right now:
4968      //     Go to next slide and
4969      //     emit a scroll event.
4970      // Else (the user is scrolling towards the beginning) and
4971      // if the slider hasn't hit the first slide or
4972      // if the slider is a loop and
4973      // if the slider isn't moving right now:
4974      //   Go to prev slide and
4975      //   emit a scroll event.
4976      if (newEvent.direction < 0) {
4977        if ((!swiper.isEnd || swiper.params.loop) && !swiper.animating) {
4978          swiper.slideNext();
4979          emit('scroll', newEvent.raw);
4980        }
4981      } else if ((!swiper.isBeginning || swiper.params.loop) && !swiper.animating) {
4982        swiper.slidePrev();
4983        emit('scroll', newEvent.raw);
4984      }
4985      // If you got here is because an animation has been triggered so store the current time
4986      lastScrollTime = new window.Date().getTime();
4987      // Return false as a default
4988      return false;
4989    }
4990    function releaseScroll(newEvent) {
4991      const params = swiper.params.mousewheel;
4992      if (newEvent.direction < 0) {
4993        if (swiper.isEnd && !swiper.params.loop && params.releaseOnEdges) {
4994          // Return true to animate scroll on edges
4995          return true;
4996        }
4997      } else if (swiper.isBeginning && !swiper.params.loop && params.releaseOnEdges) {
4998        // Return true to animate scroll on edges
4999        return true;
5000      }
5001      return false;
5002    }
5003    function handle(event) {
5004      let e = event;
5005      let disableParentSwiper = true;
5006      if (!swiper.enabled) return;
5007
5008      // Ignore event if the target or its parents have the swiper-no-mousewheel class
5009      if (event.target.closest(`.${swiper.params.mousewheel.noMousewheelClass}`)) return;
5010      const params = swiper.params.mousewheel;
5011      if (swiper.params.cssMode) {
5012        e.preventDefault();
5013      }
5014      let targetEl = swiper.el;
5015      if (swiper.params.mousewheel.eventsTarget !== 'container') {
5016        targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
5017      }
5018      const targetElContainsTarget = targetEl && targetEl.contains(e.target);
5019      if (!swiper.mouseEntered && !targetElContainsTarget && !params.releaseOnEdges) return true;
5020      if (e.originalEvent) e = e.originalEvent; // jquery fix
5021      let delta = 0;
5022      const rtlFactor = swiper.rtlTranslate ? -1 : 1;
5023      const data = normalize(e);
5024      if (params.forceToAxis) {
5025        if (swiper.isHorizontal()) {
5026          if (Math.abs(data.pixelX) > Math.abs(data.pixelY)) delta = -data.pixelX * rtlFactor;else return true;
5027        } else if (Math.abs(data.pixelY) > Math.abs(data.pixelX)) delta = -data.pixelY;else return true;
5028      } else {
5029        delta = Math.abs(data.pixelX) > Math.abs(data.pixelY) ? -data.pixelX * rtlFactor : -data.pixelY;
5030      }
5031      if (delta === 0) return true;
5032      if (params.invert) delta = -delta;
5033
5034      // Get the scroll positions
5035      let positions = swiper.getTranslate() + delta * params.sensitivity;
5036      if (positions >= swiper.minTranslate()) positions = swiper.minTranslate();
5037      if (positions <= swiper.maxTranslate()) positions = swiper.maxTranslate();
5038
5039      // When loop is true:
5040      //     the disableParentSwiper will be true.
5041      // When loop is false:
5042      //     if the scroll positions is not on edge,
5043      //     then the disableParentSwiper will be true.
5044      //     if the scroll on edge positions,
5045      //     then the disableParentSwiper will be false.
5046      disableParentSwiper = swiper.params.loop ? true : !(positions === swiper.minTranslate() || positions === swiper.maxTranslate());
5047      if (disableParentSwiper && swiper.params.nested) e.stopPropagation();
5048      if (!swiper.params.freeMode || !swiper.params.freeMode.enabled) {
5049        // Register the new event in a variable which stores the relevant data
5050        const newEvent = {
5051          time: now(),
5052          delta: Math.abs(delta),
5053          direction: Math.sign(delta),
5054          raw: event
5055        };
5056
5057        // Keep the most recent events
5058        if (recentWheelEvents.length >= 2) {
5059          recentWheelEvents.shift(); // only store the last N events
5060        }
5061
5062        const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
5063        recentWheelEvents.push(newEvent);
5064
5065        // If there is at least one previous recorded event:
5066        //   If direction has changed or
5067        //   if the scroll is quicker than the previous one:
5068        //     Animate the slider.
5069        // Else (this is the first time the wheel is moved):
5070        //     Animate the slider.
5071        if (prevEvent) {
5072          if (newEvent.direction !== prevEvent.direction || newEvent.delta > prevEvent.delta || newEvent.time > prevEvent.time + 150) {
5073            animateSlider(newEvent);
5074          }
5075        } else {
5076          animateSlider(newEvent);
5077        }
5078
5079        // If it's time to release the scroll:
5080        //   Return now so you don't hit the preventDefault.
5081        if (releaseScroll(newEvent)) {
5082          return true;
5083        }
5084      } else {
5085        // Freemode or scrollContainer:
5086
5087        // If we recently snapped after a momentum scroll, then ignore wheel events
5088        // to give time for the deceleration to finish. Stop ignoring after 500 msecs
5089        // or if it's a new scroll (larger delta or inverse sign as last event before
5090        // an end-of-momentum snap).
5091        const newEvent = {
5092          time: now(),
5093          delta: Math.abs(delta),
5094          direction: Math.sign(delta)
5095        };
5096        const ignoreWheelEvents = lastEventBeforeSnap && newEvent.time < lastEventBeforeSnap.time + 500 && newEvent.delta <= lastEventBeforeSnap.delta && newEvent.direction === lastEventBeforeSnap.direction;
5097        if (!ignoreWheelEvents) {
5098          lastEventBeforeSnap = undefined;
5099          let position = swiper.getTranslate() + delta * params.sensitivity;
5100          const wasBeginning = swiper.isBeginning;
5101          const wasEnd = swiper.isEnd;
5102          if (position >= swiper.minTranslate()) position = swiper.minTranslate();
5103          if (position <= swiper.maxTranslate()) position = swiper.maxTranslate();
5104          swiper.setTransition(0);
5105          swiper.setTranslate(position);
5106          swiper.updateProgress();
5107          swiper.updateActiveIndex();
5108          swiper.updateSlidesClasses();
5109          if (!wasBeginning && swiper.isBeginning || !wasEnd && swiper.isEnd) {
5110            swiper.updateSlidesClasses();
5111          }
5112          if (swiper.params.loop) {
5113            swiper.loopFix({
5114              direction: newEvent.direction < 0 ? 'next' : 'prev',
5115              byMousewheel: true
5116            });
5117          }
5118          if (swiper.params.freeMode.sticky) {
5119            // When wheel scrolling starts with sticky (aka snap) enabled, then detect
5120            // the end of a momentum scroll by storing recent (N=15?) wheel events.
5121            // 1. do all N events have decreasing or same (absolute value) delta?
5122            // 2. did all N events arrive in the last M (M=500?) msecs?
5123            // 3. does the earliest event have an (absolute value) delta that's
5124            //    at least P (P=1?) larger than the most recent event's delta?
5125            // 4. does the latest event have a delta that's smaller than Q (Q=6?) pixels?
5126            // If 1-4 are "yes" then we're near the end of a momentum scroll deceleration.
5127            // Snap immediately and ignore remaining wheel events in this scroll.
5128            // See comment above for "remaining wheel events in this scroll" determination.
5129            // If 1-4 aren't satisfied, then wait to snap until 500ms after the last event.
5130            clearTimeout(timeout);
5131            timeout = undefined;
5132            if (recentWheelEvents.length >= 15) {
5133              recentWheelEvents.shift(); // only store the last N events
5134            }
5135
5136            const prevEvent = recentWheelEvents.length ? recentWheelEvents[recentWheelEvents.length - 1] : undefined;
5137            const firstEvent = recentWheelEvents[0];
5138            recentWheelEvents.push(newEvent);
5139            if (prevEvent && (newEvent.delta > prevEvent.delta || newEvent.direction !== prevEvent.direction)) {
5140              // Increasing or reverse-sign delta means the user started scrolling again. Clear the wheel event log.
5141              recentWheelEvents.splice(0);
5142            } else if (recentWheelEvents.length >= 15 && newEvent.time - firstEvent.time < 500 && firstEvent.delta - newEvent.delta >= 1 && newEvent.delta <= 6) {
5143              // We're at the end of the deceleration of a momentum scroll, so there's no need
5144              // to wait for more events. Snap ASAP on the next tick.
5145              // Also, because there's some remaining momentum we'll bias the snap in the
5146              // direction of the ongoing scroll because it's better UX for the scroll to snap
5147              // in the same direction as the scroll instead of reversing to snap.  Therefore,
5148              // if it's already scrolled more than 20% in the current direction, keep going.
5149              const snapToThreshold = delta > 0 ? 0.8 : 0.2;
5150              lastEventBeforeSnap = newEvent;
5151              recentWheelEvents.splice(0);
5152              timeout = nextTick(() => {
5153                if (swiper.destroyed || !swiper.params) return;
5154                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5155              }, 0); // no delay; move on next tick
5156            }
5157
5158            if (!timeout) {
5159              // if we get here, then we haven't detected the end of a momentum scroll, so
5160              // we'll consider a scroll "complete" when there haven't been any wheel events
5161              // for 500ms.
5162              timeout = nextTick(() => {
5163                if (swiper.destroyed || !swiper.params) return;
5164                const snapToThreshold = 0.5;
5165                lastEventBeforeSnap = newEvent;
5166                recentWheelEvents.splice(0);
5167                swiper.slideToClosest(swiper.params.speed, true, undefined, snapToThreshold);
5168              }, 500);
5169            }
5170          }
5171
5172          // Emit event
5173          if (!ignoreWheelEvents) emit('scroll', e);
5174
5175          // Stop autoplay
5176          if (swiper.params.autoplay && swiper.params.autoplayDisableOnInteraction) swiper.autoplay.stop();
5177          // Return page scroll on edge positions
5178          if (params.releaseOnEdges && (position === swiper.minTranslate() || position === swiper.maxTranslate())) {
5179            return true;
5180          }
5181        }
5182      }
5183      if (e.preventDefault) e.preventDefault();else e.returnValue = false;
5184      return false;
5185    }
5186    function events(method) {
5187      let targetEl = swiper.el;
5188      if (swiper.params.mousewheel.eventsTarget !== 'container') {
5189        targetEl = document.querySelector(swiper.params.mousewheel.eventsTarget);
5190      }
5191      targetEl[method]('mouseenter', handleMouseEnter);
5192      targetEl[method]('mouseleave', handleMouseLeave);
5193      targetEl[method]('wheel', handle);
5194    }
5195    function enable() {
5196      if (swiper.params.cssMode) {
5197        swiper.wrapperEl.removeEventListener('wheel', handle);
5198        return true;
5199      }
5200      if (swiper.mousewheel.enabled) return false;
5201      events('addEventListener');
5202      swiper.mousewheel.enabled = true;
5203      return true;
5204    }
5205    function disable() {
5206      if (swiper.params.cssMode) {
5207        swiper.wrapperEl.addEventListener(event, handle);
5208        return true;
5209      }
5210      if (!swiper.mousewheel.enabled) return false;
5211      events('removeEventListener');
5212      swiper.mousewheel.enabled = false;
5213      return true;
5214    }
5215    on('init', () => {
5216      if (!swiper.params.mousewheel.enabled && swiper.params.cssMode) {
5217        disable();
5218      }
5219      if (swiper.params.mousewheel.enabled) enable();
5220    });
5221    on('destroy', () => {
5222      if (swiper.params.cssMode) {
5223        enable();
5224      }
5225      if (swiper.mousewheel.enabled) disable();
5226    });
5227    Object.assign(swiper.mousewheel, {
5228      enable,
5229      disable
5230    });
5231  }
5232
5233  function createElementIfNotDefined(swiper, originalParams, params, checkProps) {
5234    if (swiper.params.createElements) {
5235      Object.keys(checkProps).forEach(key => {
5236        if (!params[key] && params.auto === true) {
5237          let element = elementChildren(swiper.el, `.${checkProps[key]}`)[0];
5238          if (!element) {
5239            element = createElement('div', checkProps[key]);
5240            element.className = checkProps[key];
5241            swiper.el.append(element);
5242          }
5243          params[key] = element;
5244          originalParams[key] = element;
5245        }
5246      });
5247    }
5248    return params;
5249  }
5250
5251  function Navigation(_ref) {
5252    let {
5253      swiper,
5254      extendParams,
5255      on,
5256      emit
5257    } = _ref;
5258    extendParams({
5259      navigation: {
5260        nextEl: null,
5261        prevEl: null,
5262        hideOnClick: false,
5263        disabledClass: 'swiper-button-disabled',
5264        hiddenClass: 'swiper-button-hidden',
5265        lockClass: 'swiper-button-lock',
5266        navigationDisabledClass: 'swiper-navigation-disabled'
5267      }
5268    });
5269    swiper.navigation = {
5270      nextEl: null,
5271      prevEl: null
5272    };
5273    function getEl(el) {
5274      let res;
5275      if (el && typeof el === 'string' && swiper.isElement) {
5276        res = swiper.el.querySelector(el) || swiper.hostEl.querySelector(el);
5277        if (res) return res;
5278      }
5279      if (el) {
5280        if (typeof el === 'string') res = [...document.querySelectorAll(el)];
5281        if (swiper.params.uniqueNavElements && typeof el === 'string' && res && res.length > 1 && swiper.el.querySelectorAll(el).length === 1) {
5282          res = swiper.el.querySelector(el);
5283        } else if (res && res.length === 1) {
5284          res = res[0];
5285        }
5286      }
5287      if (el && !res) return el;
5288      // if (Array.isArray(res) && res.length === 1) res = res[0];
5289      return res;
5290    }
5291    function toggleEl(el, disabled) {
5292      const params = swiper.params.navigation;
5293      el = makeElementsArray(el);
5294      el.forEach(subEl => {
5295        if (subEl) {
5296          subEl.classList[disabled ? 'add' : 'remove'](...params.disabledClass.split(' '));
5297          if (subEl.tagName === 'BUTTON') subEl.disabled = disabled;
5298          if (swiper.params.watchOverflow && swiper.enabled) {
5299            subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
5300          }
5301        }
5302      });
5303    }
5304    function update() {
5305      // Update Navigation Buttons
5306      const {
5307        nextEl,
5308        prevEl
5309      } = swiper.navigation;
5310      if (swiper.params.loop) {
5311        toggleEl(prevEl, false);
5312        toggleEl(nextEl, false);
5313        return;
5314      }
5315      toggleEl(prevEl, swiper.isBeginning && !swiper.params.rewind);
5316      toggleEl(nextEl, swiper.isEnd && !swiper.params.rewind);
5317    }
5318    function onPrevClick(e) {
5319      e.preventDefault();
5320      if (swiper.isBeginning && !swiper.params.loop && !swiper.params.rewind) return;
5321      swiper.slidePrev();
5322      emit('navigationPrev');
5323    }
5324    function onNextClick(e) {
5325      e.preventDefault();
5326      if (swiper.isEnd && !swiper.params.loop && !swiper.params.rewind) return;
5327      swiper.slideNext();
5328      emit('navigationNext');
5329    }
5330    function init() {
5331      const params = swiper.params.navigation;
5332      swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {
5333        nextEl: 'swiper-button-next',
5334        prevEl: 'swiper-button-prev'
5335      });
5336      if (!(params.nextEl || params.prevEl)) return;
5337      let nextEl = getEl(params.nextEl);
5338      let prevEl = getEl(params.prevEl);
5339      Object.assign(swiper.navigation, {
5340        nextEl,
5341        prevEl
5342      });
5343      nextEl = makeElementsArray(nextEl);
5344      prevEl = makeElementsArray(prevEl);
5345      const initButton = (el, dir) => {
5346        if (el) {
5347          el.addEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
5348        }
5349        if (!swiper.enabled && el) {
5350          el.classList.add(...params.lockClass.split(' '));
5351        }
5352      };
5353      nextEl.forEach(el => initButton(el, 'next'));
5354      prevEl.forEach(el => initButton(el, 'prev'));
5355    }
5356    function destroy() {
5357      let {
5358        nextEl,
5359        prevEl
5360      } = swiper.navigation;
5361      nextEl = makeElementsArray(nextEl);
5362      prevEl = makeElementsArray(prevEl);
5363      const destroyButton = (el, dir) => {
5364        el.removeEventListener('click', dir === 'next' ? onNextClick : onPrevClick);
5365        el.classList.remove(...swiper.params.navigation.disabledClass.split(' '));
5366      };
5367      nextEl.forEach(el => destroyButton(el, 'next'));
5368      prevEl.forEach(el => destroyButton(el, 'prev'));
5369    }
5370    on('init', () => {
5371      if (swiper.params.navigation.enabled === false) {
5372        // eslint-disable-next-line
5373        disable();
5374      } else {
5375        init();
5376        update();
5377      }
5378    });
5379    on('toEdge fromEdge lock unlock', () => {
5380      update();
5381    });
5382    on('destroy', () => {
5383      destroy();
5384    });
5385    on('enable disable', () => {
5386      let {
5387        nextEl,
5388        prevEl
5389      } = swiper.navigation;
5390      nextEl = makeElementsArray(nextEl);
5391      prevEl = makeElementsArray(prevEl);
5392      if (swiper.enabled) {
5393        update();
5394        return;
5395      }
5396      [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.add(swiper.params.navigation.lockClass));
5397    });
5398    on('click', (_s, e) => {
5399      let {
5400        nextEl,
5401        prevEl
5402      } = swiper.navigation;
5403      nextEl = makeElementsArray(nextEl);
5404      prevEl = makeElementsArray(prevEl);
5405      const targetEl = e.target;
5406      let targetIsButton = prevEl.includes(targetEl) || nextEl.includes(targetEl);
5407      if (swiper.isElement && !targetIsButton) {
5408        const path = e.path || e.composedPath && e.composedPath();
5409        if (path) {
5410          targetIsButton = path.find(pathEl => nextEl.includes(pathEl) || prevEl.includes(pathEl));
5411        }
5412      }
5413      if (swiper.params.navigation.hideOnClick && !targetIsButton) {
5414        if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;
5415        let isHidden;
5416        if (nextEl.length) {
5417          isHidden = nextEl[0].classList.contains(swiper.params.navigation.hiddenClass);
5418        } else if (prevEl.length) {
5419          isHidden = prevEl[0].classList.contains(swiper.params.navigation.hiddenClass);
5420        }
5421        if (isHidden === true) {
5422          emit('navigationShow');
5423        } else {
5424          emit('navigationHide');
5425        }
5426        [...nextEl, ...prevEl].filter(el => !!el).forEach(el => el.classList.toggle(swiper.params.navigation.hiddenClass));
5427      }
5428    });
5429    const enable = () => {
5430      swiper.el.classList.remove(...swiper.params.navigation.navigationDisabledClass.split(' '));
5431      init();
5432      update();
5433    };
5434    const disable = () => {
5435      swiper.el.classList.add(...swiper.params.navigation.navigationDisabledClass.split(' '));
5436      destroy();
5437    };
5438    Object.assign(swiper.navigation, {
5439      enable,
5440      disable,
5441      update,
5442      init,
5443      destroy
5444    });
5445  }
5446
5447  function classesToSelector(classes) {
5448    if (classes === void 0) {
5449      classes = '';
5450    }
5451    return `.${classes.trim().replace(/([\.:!+\/])/g, '\\$1') // eslint-disable-line
5452  .replace(/ /g, '.')}`;
5453  }
5454
5455  function Pagination(_ref) {
5456    let {
5457      swiper,
5458      extendParams,
5459      on,
5460      emit
5461    } = _ref;
5462    const pfx = 'swiper-pagination';
5463    extendParams({
5464      pagination: {
5465        el: null,
5466        bulletElement: 'span',
5467        clickable: false,
5468        hideOnClick: false,
5469        renderBullet: null,
5470        renderProgressbar: null,
5471        renderFraction: null,
5472        renderCustom: null,
5473        progressbarOpposite: false,
5474        type: 'bullets',
5475        // 'bullets' or 'progressbar' or 'fraction' or 'custom'
5476        dynamicBullets: false,
5477        dynamicMainBullets: 1,
5478        formatFractionCurrent: number => number,
5479        formatFractionTotal: number => number,
5480        bulletClass: `${pfx}-bullet`,
5481        bulletActiveClass: `${pfx}-bullet-active`,
5482        modifierClass: `${pfx}-`,
5483        currentClass: `${pfx}-current`,
5484        totalClass: `${pfx}-total`,
5485        hiddenClass: `${pfx}-hidden`,
5486        progressbarFillClass: `${pfx}-progressbar-fill`,
5487        progressbarOppositeClass: `${pfx}-progressbar-opposite`,
5488        clickableClass: `${pfx}-clickable`,
5489        lockClass: `${pfx}-lock`,
5490        horizontalClass: `${pfx}-horizontal`,
5491        verticalClass: `${pfx}-vertical`,
5492        paginationDisabledClass: `${pfx}-disabled`
5493      }
5494    });
5495    swiper.pagination = {
5496      el: null,
5497      bullets: []
5498    };
5499    let bulletSize;
5500    let dynamicBulletIndex = 0;
5501    function isPaginationDisabled() {
5502      return !swiper.params.pagination.el || !swiper.pagination.el || Array.isArray(swiper.pagination.el) && swiper.pagination.el.length === 0;
5503    }
5504    function setSideBullets(bulletEl, position) {
5505      const {
5506        bulletActiveClass
5507      } = swiper.params.pagination;
5508      if (!bulletEl) return;
5509      bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
5510      if (bulletEl) {
5511        bulletEl.classList.add(`${bulletActiveClass}-${position}`);
5512        bulletEl = bulletEl[`${position === 'prev' ? 'previous' : 'next'}ElementSibling`];
5513        if (bulletEl) {
5514          bulletEl.classList.add(`${bulletActiveClass}-${position}-${position}`);
5515        }
5516      }
5517    }
5518    function getMoveDirection(prevIndex, nextIndex, length) {
5519      prevIndex = prevIndex % length;
5520      nextIndex = nextIndex % length;
5521      if (nextIndex === prevIndex + 1) {
5522        return 'next';
5523      } else if (nextIndex === prevIndex - 1) {
5524        return 'previous';
5525      }
5526      return;
5527    }
5528    function onBulletClick(e) {
5529      const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));
5530      if (!bulletEl) {
5531        return;
5532      }
5533      e.preventDefault();
5534      const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;
5535      if (swiper.params.loop) {
5536        if (swiper.realIndex === index) return;
5537        const moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length);
5538        if (moveDirection === 'next') {
5539          swiper.slideNext();
5540        } else if (moveDirection === 'previous') {
5541          swiper.slidePrev();
5542        } else {
5543          swiper.slideToLoop(index);
5544        }
5545      } else {
5546        swiper.slideTo(index);
5547      }
5548    }
5549    function update() {
5550      // Render || Update Pagination bullets/items
5551      const rtl = swiper.rtl;
5552      const params = swiper.params.pagination;
5553      if (isPaginationDisabled()) return;
5554      let el = swiper.pagination.el;
5555      el = makeElementsArray(el);
5556      // Current/Total
5557      let current;
5558      let previousIndex;
5559      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;
5560      const total = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5561      if (swiper.params.loop) {
5562        previousIndex = swiper.previousRealIndex || 0;
5563        current = swiper.params.slidesPerGroup > 1 ? Math.floor(swiper.realIndex / swiper.params.slidesPerGroup) : swiper.realIndex;
5564      } else if (typeof swiper.snapIndex !== 'undefined') {
5565        current = swiper.snapIndex;
5566        previousIndex = swiper.previousSnapIndex;
5567      } else {
5568        previousIndex = swiper.previousIndex || 0;
5569        current = swiper.activeIndex || 0;
5570      }
5571      // Types
5572      if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {
5573        const bullets = swiper.pagination.bullets;
5574        let firstIndex;
5575        let lastIndex;
5576        let midIndex;
5577        if (params.dynamicBullets) {
5578          bulletSize = elementOuterSize(bullets[0], swiper.isHorizontal() ? 'width' : 'height', true);
5579          el.forEach(subEl => {
5580            subEl.style[swiper.isHorizontal() ? 'width' : 'height'] = `${bulletSize * (params.dynamicMainBullets + 4)}px`;
5581          });
5582          if (params.dynamicMainBullets > 1 && previousIndex !== undefined) {
5583            dynamicBulletIndex += current - (previousIndex || 0);
5584            if (dynamicBulletIndex > params.dynamicMainBullets - 1) {
5585              dynamicBulletIndex = params.dynamicMainBullets - 1;
5586            } else if (dynamicBulletIndex < 0) {
5587              dynamicBulletIndex = 0;
5588            }
5589          }
5590          firstIndex = Math.max(current - dynamicBulletIndex, 0);
5591          lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);
5592          midIndex = (lastIndex + firstIndex) / 2;
5593        }
vendor: 5,261 bytes, lines 5594-5704
5594        bullets.forEach(bulletEl => {
5595          const classesToRemove = [...['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`)].map(s => typeof s === 'string' && s.includes(' ') ? s.split(' ') : s).flat();
5596          bulletEl.classList.remove(...classesToRemove);
5597        });
5598        if (el.length > 1) {
5599          bullets.forEach(bullet => {
5600            const bulletIndex = elementIndex(bullet);
5601            if (bulletIndex === current) {
5602              bullet.classList.add(...params.bulletActiveClass.split(' '));
5603            } else if (swiper.isElement) {
5604              bullet.setAttribute('part', 'bullet');
5605            }
5606            if (params.dynamicBullets) {
5607              if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {
5608                bullet.classList.add(...`${params.bulletActiveClass}-main`.split(' '));
5609              }
5610              if (bulletIndex === firstIndex) {
5611                setSideBullets(bullet, 'prev');
5612              }
5613              if (bulletIndex === lastIndex) {
5614                setSideBullets(bullet, 'next');
5615              }
5616            }
5617          });
5618        } else {
5619          const bullet = bullets[current];
5620          if (bullet) {
5621            bullet.classList.add(...params.bulletActiveClass.split(' '));
5622          }
5623          if (swiper.isElement) {
5624            bullets.forEach((bulletEl, bulletIndex) => {
5625              bulletEl.setAttribute('part', bulletIndex === current ? 'bullet-active' : 'bullet');
5626            });
5627          }
5628          if (params.dynamicBullets) {
5629            const firstDisplayedBullet = bullets[firstIndex];
5630            const lastDisplayedBullet = bullets[lastIndex];
5631            for (let i = firstIndex; i <= lastIndex; i += 1) {
5632              if (bullets[i]) {
5633                bullets[i].classList.add(...`${params.bulletActiveClass}-main`.split(' '));
5634              }
5635            }
5636            setSideBullets(firstDisplayedBullet, 'prev');
5637            setSideBullets(lastDisplayedBullet, 'next');
5638          }
5639        }
5640        if (params.dynamicBullets) {
5641          const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);
5642          const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;
5643          const offsetProp = rtl ? 'right' : 'left';
5644          bullets.forEach(bullet => {
5645            bullet.style[swiper.isHorizontal() ? offsetProp : 'top'] = `${bulletsOffset}px`;
5646          });
5647        }
5648      }
5649      el.forEach((subEl, subElIndex) => {
5650        if (params.type === 'fraction') {
5651          subEl.querySelectorAll(classesToSelector(params.currentClass)).forEach(fractionEl => {
5652            fractionEl.textContent = params.formatFractionCurrent(current + 1);
5653          });
5654          subEl.querySelectorAll(classesToSelector(params.totalClass)).forEach(totalEl => {
5655            totalEl.textContent = params.formatFractionTotal(total);
5656          });
5657        }
5658        if (params.type === 'progressbar') {
5659          let progressbarDirection;
5660          if (params.progressbarOpposite) {
5661            progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';
5662          } else {
5663            progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';
5664          }
5665          const scale = (current + 1) / total;
5666          let scaleX = 1;
5667          let scaleY = 1;
5668          if (progressbarDirection === 'horizontal') {
5669            scaleX = scale;
5670          } else {
5671            scaleY = scale;
5672          }
5673          subEl.querySelectorAll(classesToSelector(params.progressbarFillClass)).forEach(progressEl => {
5674            progressEl.style.transform = `translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`;
5675            progressEl.style.transitionDuration = `${swiper.params.speed}ms`;
5676          });
5677        }
5678        if (params.type === 'custom' && params.renderCustom) {
5679          subEl.innerHTML = params.renderCustom(swiper, current + 1, total);
5680          if (subElIndex === 0) emit('paginationRender', subEl);
5681        } else {
5682          if (subElIndex === 0) emit('paginationRender', subEl);
5683          emit('paginationUpdate', subEl);
5684        }
5685        if (swiper.params.watchOverflow && swiper.enabled) {
5686          subEl.classList[swiper.isLocked ? 'add' : 'remove'](params.lockClass);
5687        }
5688      });
5689    }
5690    function render() {
5691      // Render Container
5692      const params = swiper.params.pagination;
5693      if (isPaginationDisabled()) return;
5694      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.grid && swiper.params.grid.rows > 1 ? swiper.slides.length / Math.ceil(swiper.params.grid.rows) : swiper.slides.length;
5695      let el = swiper.pagination.el;
5696      el = makeElementsArray(el);
5697      let paginationHTML = '';
5698      if (params.type === 'bullets') {
5699        let numberOfBullets = swiper.params.loop ? Math.ceil(slidesLength / swiper.params.slidesPerGroup) : swiper.snapGrid.length;
5700        if (swiper.params.freeMode && swiper.params.freeMode.enabled && numberOfBullets > slidesLength) {
5701          numberOfBullets = slidesLength;
5702        }
5703        for (let i = 0; i < numberOfBullets; i += 1) {
5704          if (params.renderBullet) {
vendor: 12,634 bytes, lines 5705-6073
5705            paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);
5706          } else {
5707            // prettier-ignore
5708            paginationHTML += `<${params.bulletElement} ${swiper.isElement ? 'part="bullet"' : ''} class="${params.bulletClass}"></${params.bulletElement}>`;
5709          }
5710        }
5711      }
5712      if (params.type === 'fraction') {
5713        if (params.renderFraction) {
5714          paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);
5715        } else {
5716          paginationHTML = `<span class="${params.currentClass}"></span>` + ' / ' + `<span class="${params.totalClass}"></span>`;
5717        }
5718      }
5719      if (params.type === 'progressbar') {
5720        if (params.renderProgressbar) {
5721          paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);
5722        } else {
5723          paginationHTML = `<span class="${params.progressbarFillClass}"></span>`;
5724        }
5725      }
5726      swiper.pagination.bullets = [];
5727      el.forEach(subEl => {
5728		  subEl.setAttribute( 'role', 'tablist' );
5729		  subEl.setAttribute('tabindex', '0');
5730        if (params.type !== 'custom') {
5731          subEl.innerHTML = paginationHTML || '';
5732        }
5733        if (params.type === 'bullets') {
5734          swiper.pagination.bullets.push(...subEl.querySelectorAll(classesToSelector(params.bulletClass)));
5735        }
5736      });
5737      if (params.type !== 'custom') {
5738        emit('paginationRender', el[0]);
5739      }
5740    }
5741    function init() {
5742      swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {
5743        el: 'swiper-pagination'
5744      });
5745      const params = swiper.params.pagination;
5746      if (!params.el) return;
5747      let el;
5748      if (typeof params.el === 'string' && swiper.isElement) {
5749        el = swiper.el.querySelector(params.el);
5750      }
5751      if (!el && typeof params.el === 'string') {
5752        el = [...document.querySelectorAll(params.el)];
5753      }
5754      if (!el) {
5755        el = params.el;
5756      }
5757      if (!el || el.length === 0) return;
5758      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && Array.isArray(el) && el.length > 1) {
5759        el = [...swiper.el.querySelectorAll(params.el)];
5760        // check if it belongs to another nested Swiper
5761        if (el.length > 1) {
5762          el = el.filter(subEl => {
5763            if (elementParents(subEl, '.swiper')[0] !== swiper.el) return false;
5764            return true;
5765          })[0];
5766        }
5767      }
5768      if (Array.isArray(el) && el.length === 1) el = el[0];
5769      Object.assign(swiper.pagination, {
5770        el
5771      });
5772      el = makeElementsArray(el);
5773      el.forEach(subEl => {
5774        if (params.type === 'bullets' && params.clickable) {
5775          subEl.classList.add(...(params.clickableClass || '').split(' '));
5776        }
5777        subEl.classList.add(params.modifierClass + params.type);
5778        subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5779        if (params.type === 'bullets' && params.dynamicBullets) {
5780          subEl.classList.add(`${params.modifierClass}${params.type}-dynamic`);
5781          dynamicBulletIndex = 0;
5782          if (params.dynamicMainBullets < 1) {
5783            params.dynamicMainBullets = 1;
5784          }
5785        }
5786        if (params.type === 'progressbar' && params.progressbarOpposite) {
5787          subEl.classList.add(params.progressbarOppositeClass);
5788        }
5789        if (params.clickable) {
5790          subEl.addEventListener('click', onBulletClick);
5791        }
5792        if (!swiper.enabled) {
5793          subEl.classList.add(params.lockClass);
5794        }
5795      });
5796    }
5797    function destroy() {
5798      const params = swiper.params.pagination;
5799      if (isPaginationDisabled()) return;
5800      let el = swiper.pagination.el;
5801      if (el) {
5802        el = makeElementsArray(el);
5803        el.forEach(subEl => {
5804          subEl.classList.remove(params.hiddenClass);
5805          subEl.classList.remove(params.modifierClass + params.type);
5806          subEl.classList.remove(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5807          if (params.clickable) {
5808            subEl.classList.remove(...(params.clickableClass || '').split(' '));
5809            subEl.removeEventListener('click', onBulletClick);
5810          }
5811        });
5812      }
5813      if (swiper.pagination.bullets) swiper.pagination.bullets.forEach(subEl => subEl.classList.remove(...params.bulletActiveClass.split(' ')));
5814    }
5815    on('changeDirection', () => {
5816      if (!swiper.pagination || !swiper.pagination.el) return;
5817      const params = swiper.params.pagination;
5818      let {
5819        el
5820      } = swiper.pagination;
5821      el = makeElementsArray(el);
5822      el.forEach(subEl => {
5823        subEl.classList.remove(params.horizontalClass, params.verticalClass);
5824        subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
5825      });
5826    });
5827    on('init', () => {
5828      if (swiper.params.pagination.enabled === false) {
5829        // eslint-disable-next-line
5830        disable();
5831      } else {
5832        init();
5833        render();
5834        update();
5835      }
5836    });
5837    on('activeIndexChange', () => {
5838      if (typeof swiper.snapIndex === 'undefined') {
5839        update();
5840      }
5841    });
5842    on('snapIndexChange', () => {
5843      update();
5844    });
5845    on('snapGridLengthChange', () => {
5846      render();
5847      update();
5848    });
5849    on('destroy', () => {
5850      destroy();
5851    });
5852    on('enable disable', () => {
5853      let {
5854        el
5855      } = swiper.pagination;
5856      if (el) {
5857        el = makeElementsArray(el);
5858        el.forEach(subEl => subEl.classList[swiper.enabled ? 'remove' : 'add'](swiper.params.pagination.lockClass));
5859      }
5860    });
5861    on('lock unlock', () => {
5862      update();
5863    });
5864    on('click', (_s, e) => {
5865      const targetEl = e.target;
5866      const el = makeElementsArray(swiper.pagination.el);
5867      if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && el && el.length > 0 && !targetEl.classList.contains(swiper.params.pagination.bulletClass)) {
5868        if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;
5869        const isHidden = el[0].classList.contains(swiper.params.pagination.hiddenClass);
5870        if (isHidden === true) {
5871          emit('paginationShow');
5872        } else {
5873          emit('paginationHide');
5874        }
5875        el.forEach(subEl => subEl.classList.toggle(swiper.params.pagination.hiddenClass));
5876      }
5877    });
5878    const enable = () => {
5879      swiper.el.classList.remove(swiper.params.pagination.paginationDisabledClass);
5880      let {
5881        el
5882      } = swiper.pagination;
5883      if (el) {
5884        el = makeElementsArray(el);
5885        el.forEach(subEl => subEl.classList.remove(swiper.params.pagination.paginationDisabledClass));
5886      }
5887      init();
5888      render();
5889      update();
5890    };
5891    const disable = () => {
5892      swiper.el.classList.add(swiper.params.pagination.paginationDisabledClass);
5893      let {
5894        el
5895      } = swiper.pagination;
5896      if (el) {
5897        el = makeElementsArray(el);
5898        el.forEach(subEl => subEl.classList.add(swiper.params.pagination.paginationDisabledClass));
5899      }
5900      destroy();
5901    };
5902    Object.assign(swiper.pagination, {
5903      enable,
5904      disable,
5905      render,
5906      update,
5907      init,
5908      destroy
5909    });
5910  }
5911
5912  function Scrollbar(_ref) {
5913    let {
5914      swiper,
5915      extendParams,
5916      on,
5917      emit
5918    } = _ref;
5919    const document = getDocument();
5920    let isTouched = false;
5921    let timeout = null;
5922    let dragTimeout = null;
5923    let dragStartPos;
5924    let dragSize;
5925    let trackSize;
5926    let divider;
5927    extendParams({
5928      scrollbar: {
5929        el: null,
5930        dragSize: 'auto',
5931        hide: false,
5932        draggable: false,
5933        snapOnRelease: true,
5934        lockClass: 'swiper-scrollbar-lock',
5935        dragClass: 'swiper-scrollbar-drag',
5936        scrollbarDisabledClass: 'swiper-scrollbar-disabled',
5937        horizontalClass: `swiper-scrollbar-horizontal`,
5938        verticalClass: `swiper-scrollbar-vertical`
5939      }
5940    });
5941    swiper.scrollbar = {
5942      el: null,
5943      dragEl: null
5944    };
5945    function setTranslate() {
5946      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5947      const {
5948        scrollbar,
5949        rtlTranslate: rtl
5950      } = swiper;
5951      const {
5952        dragEl,
5953        el
5954      } = scrollbar;
5955      const params = swiper.params.scrollbar;
5956      const progress = swiper.params.loop ? swiper.progressLoop : swiper.progress;
5957      let newSize = dragSize;
5958      let newPos = (trackSize - dragSize) * progress;
5959      if (rtl) {
5960        newPos = -newPos;
5961        if (newPos > 0) {
5962          newSize = dragSize - newPos;
5963          newPos = 0;
5964        } else if (-newPos + dragSize > trackSize) {
5965          newSize = trackSize + newPos;
5966        }
5967      } else if (newPos < 0) {
5968        newSize = dragSize + newPos;
5969        newPos = 0;
5970      } else if (newPos + dragSize > trackSize) {
5971        newSize = trackSize - newPos;
5972      }
5973      if (swiper.isHorizontal()) {
5974        dragEl.style.transform = `translate3d(${newPos}px, 0, 0)`;
5975        dragEl.style.width = `${newSize}px`;
5976      } else {
5977        dragEl.style.transform = `translate3d(0px, ${newPos}px, 0)`;
5978        dragEl.style.height = `${newSize}px`;
5979      }
5980      if (params.hide) {
5981        clearTimeout(timeout);
5982        el.style.opacity = 1;
5983        timeout = setTimeout(() => {
5984          el.style.opacity = 0;
5985          el.style.transitionDuration = '400ms';
5986        }, 1000);
5987      }
5988    }
5989    function setTransition(duration) {
5990      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5991      swiper.scrollbar.dragEl.style.transitionDuration = `${duration}ms`;
5992    }
5993    function updateSize() {
5994      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
5995      const {
5996        scrollbar
5997      } = swiper;
5998      const {
5999        dragEl,
6000        el
6001      } = scrollbar;
6002      dragEl.style.width = '';
6003      dragEl.style.height = '';
6004      trackSize = swiper.isHorizontal() ? el.offsetWidth : el.offsetHeight;
6005      divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));
6006      if (swiper.params.scrollbar.dragSize === 'auto') {
6007        dragSize = trackSize * divider;
6008      } else {
6009        dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);
6010      }
6011      if (swiper.isHorizontal()) {
6012        dragEl.style.width = `${dragSize}px`;
6013      } else {
6014        dragEl.style.height = `${dragSize}px`;
6015      }
6016      if (divider >= 1) {
6017        el.style.display = 'none';
6018      } else {
6019        el.style.display = '';
6020      }
6021      if (swiper.params.scrollbar.hide) {
6022        el.style.opacity = 0;
6023      }
6024      if (swiper.params.watchOverflow && swiper.enabled) {
6025        scrollbar.el.classList[swiper.isLocked ? 'add' : 'remove'](swiper.params.scrollbar.lockClass);
6026      }
6027    }
6028    function getPointerPosition(e) {
6029      return swiper.isHorizontal() ? e.clientX : e.clientY;
6030    }
6031    function setDragPosition(e) {
6032      const {
6033        scrollbar,
6034        rtlTranslate: rtl
6035      } = swiper;
6036      const {
6037        el
6038      } = scrollbar;
6039      let positionRatio;
6040      positionRatio = (getPointerPosition(e) - elementOffset(el)[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);
6041      positionRatio = Math.max(Math.min(positionRatio, 1), 0);
6042      if (rtl) {
6043        positionRatio = 1 - positionRatio;
6044      }
6045      const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;
6046      swiper.updateProgress(position);
6047      swiper.setTranslate(position);
6048      swiper.updateActiveIndex();
6049      swiper.updateSlidesClasses();
6050    }
6051    function onDragStart(e) {
6052      const params = swiper.params.scrollbar;
6053      const {
6054        scrollbar,
6055        wrapperEl
6056      } = swiper;
6057      const {
6058        el,
6059        dragEl
6060      } = scrollbar;
6061      isTouched = true;
6062      dragStartPos = e.target === dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;
6063      e.preventDefault();
6064      e.stopPropagation();
6065      wrapperEl.style.transitionDuration = '100ms';
6066      dragEl.style.transitionDuration = '100ms';
6067      setDragPosition(e);
6068      clearTimeout(dragTimeout);
6069      el.style.transitionDuration = '0ms';
6070      if (params.hide) {
6071        el.style.opacity = 1;
6072      }
6073      if (swiper.params.cssMode) {
vendor: 6,010 bytes, lines 6074-6261
6074        swiper.wrapperEl.style['scroll-snap-type'] = 'none';
6075      }
6076      emit('scrollbarDragStart', e);
6077    }
6078    function onDragMove(e) {
6079      const {
6080        scrollbar,
6081        wrapperEl
6082      } = swiper;
6083      const {
6084        el,
6085        dragEl
6086      } = scrollbar;
6087      if (!isTouched) return;
6088      if (e.preventDefault && e.cancelable) e.preventDefault();else e.returnValue = false;
6089      setDragPosition(e);
6090      wrapperEl.style.transitionDuration = '0ms';
6091      el.style.transitionDuration = '0ms';
6092      dragEl.style.transitionDuration = '0ms';
6093      emit('scrollbarDragMove', e);
6094    }
6095    function onDragEnd(e) {
6096      const params = swiper.params.scrollbar;
6097      const {
6098        scrollbar,
6099        wrapperEl
6100      } = swiper;
6101      const {
6102        el
6103      } = scrollbar;
6104      if (!isTouched) return;
6105      isTouched = false;
6106      if (swiper.params.cssMode) {
6107        swiper.wrapperEl.style['scroll-snap-type'] = '';
6108        wrapperEl.style.transitionDuration = '';
6109      }
6110      if (params.hide) {
6111        clearTimeout(dragTimeout);
6112        dragTimeout = nextTick(() => {
6113          el.style.opacity = 0;
6114          el.style.transitionDuration = '400ms';
6115        }, 1000);
6116      }
6117      emit('scrollbarDragEnd', e);
6118      if (params.snapOnRelease) {
6119        swiper.slideToClosest();
6120      }
6121    }
6122    function events(method) {
6123      const {
6124        scrollbar,
6125        params
6126      } = swiper;
6127      const el = scrollbar.el;
6128      if (!el) return;
6129      const target = el;
6130      const activeListener = params.passiveListeners ? {
6131        passive: false,
6132        capture: false
6133      } : false;
6134      const passiveListener = params.passiveListeners ? {
6135        passive: true,
6136        capture: false
6137      } : false;
6138      if (!target) return;
6139      const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';
6140      target[eventMethod]('pointerdown', onDragStart, activeListener);
6141      document[eventMethod]('pointermove', onDragMove, activeListener);
6142      document[eventMethod]('pointerup', onDragEnd, passiveListener);
6143    }
6144    function enableDraggable() {
6145      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6146      events('on');
6147    }
6148    function disableDraggable() {
6149      if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;
6150      events('off');
6151    }
6152    function init() {
6153      const {
6154        scrollbar,
6155        el: swiperEl
6156      } = swiper;
6157      swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {
6158        el: 'swiper-scrollbar'
6159      });
6160      const params = swiper.params.scrollbar;
6161      if (!params.el) return;
6162      let el;
6163      if (typeof params.el === 'string' && swiper.isElement) {
6164        el = swiper.el.querySelector(params.el);
6165      }
6166      if (!el && typeof params.el === 'string') {
6167        el = document.querySelectorAll(params.el);
6168        if (!el.length) return;
6169      } else if (!el) {
6170        el = params.el;
6171      }
6172      if (swiper.params.uniqueNavElements && typeof params.el === 'string' && el.length > 1 && swiperEl.querySelectorAll(params.el).length === 1) {
6173        el = swiperEl.querySelector(params.el);
6174      }
6175      if (el.length > 0) el = el[0];
6176      el.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
6177      let dragEl;
6178      if (el) {
6179        dragEl = el.querySelector(classesToSelector(swiper.params.scrollbar.dragClass));
6180        if (!dragEl) {
6181          dragEl = createElement('div', swiper.params.scrollbar.dragClass);
6182          el.append(dragEl);
6183        }
6184      }
6185      Object.assign(scrollbar, {
6186        el,
6187        dragEl
6188      });
6189      if (params.draggable) {
6190        enableDraggable();
6191      }
6192      if (el) {
6193        el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));
6194      }
6195    }
6196    function destroy() {
6197      const params = swiper.params.scrollbar;
6198      const el = swiper.scrollbar.el;
6199      if (el) {
6200        el.classList.remove(...classesToTokens(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass));
6201      }
6202      disableDraggable();
6203    }
6204    on('changeDirection', () => {
6205      if (!swiper.scrollbar || !swiper.scrollbar.el) return;
6206      const params = swiper.params.scrollbar;
6207      let {
6208        el
6209      } = swiper.scrollbar;
6210      el = makeElementsArray(el);
6211      el.forEach(subEl => {
6212        subEl.classList.remove(params.horizontalClass, params.verticalClass);
6213        subEl.classList.add(swiper.isHorizontal() ? params.horizontalClass : params.verticalClass);
6214      });
6215    });
6216    on('init', () => {
6217      if (swiper.params.scrollbar.enabled === false) {
6218        // eslint-disable-next-line
6219        disable();
6220      } else {
6221        init();
6222        updateSize();
6223        setTranslate();
6224      }
6225    });
6226    on('update resize observerUpdate lock unlock changeDirection', () => {
6227      updateSize();
6228    });
6229    on('setTranslate', () => {
6230      setTranslate();
6231    });
6232    on('setTransition', (_s, duration) => {
6233      setTransition(duration);
6234    });
6235    on('enable disable', () => {
6236      const {
6237        el
6238      } = swiper.scrollbar;
6239      if (el) {
6240        el.classList[swiper.enabled ? 'remove' : 'add'](...classesToTokens(swiper.params.scrollbar.lockClass));
6241      }
6242    });
6243    on('destroy', () => {
6244      destroy();
6245    });
6246    const enable = () => {
6247      swiper.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6248      if (swiper.scrollbar.el) {
6249        swiper.scrollbar.el.classList.remove(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6250      }
6251      init();
6252      updateSize();
6253      setTranslate();
6254    };
6255    const disable = () => {
6256      swiper.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6257      if (swiper.scrollbar.el) {
6258        swiper.scrollbar.el.classList.add(...classesToTokens(swiper.params.scrollbar.scrollbarDisabledClass));
6259      }
6260      destroy();
6261    };
vendor: 57,397 bytes, lines 6262-7862
6262    Object.assign(swiper.scrollbar, {
6263      enable,
6264      disable,
6265      updateSize,
6266      setTranslate,
6267      init,
6268      destroy
6269    });
6270  }
6271
6272  function Parallax(_ref) {
6273    let {
6274      swiper,
6275      extendParams,
6276      on
6277    } = _ref;
6278    extendParams({
6279      parallax: {
6280        enabled: false
6281      }
6282    });
6283    const elementsSelector = '[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]';
6284    const setTransform = (el, progress) => {
6285      const {
6286        rtl
6287      } = swiper;
6288      const rtlFactor = rtl ? -1 : 1;
6289      const p = el.getAttribute('data-swiper-parallax') || '0';
6290      let x = el.getAttribute('data-swiper-parallax-x');
6291      let y = el.getAttribute('data-swiper-parallax-y');
6292      const scale = el.getAttribute('data-swiper-parallax-scale');
6293      const opacity = el.getAttribute('data-swiper-parallax-opacity');
6294      const rotate = el.getAttribute('data-swiper-parallax-rotate');
6295      if (x || y) {
6296        x = x || '0';
6297        y = y || '0';
6298      } else if (swiper.isHorizontal()) {
6299        x = p;
6300        y = '0';
6301      } else {
6302        y = p;
6303        x = '0';
6304      }
6305      if (x.indexOf('%') >= 0) {
6306        x = `${parseInt(x, 10) * progress * rtlFactor}%`;
6307      } else {
6308        x = `${x * progress * rtlFactor}px`;
6309      }
6310      if (y.indexOf('%') >= 0) {
6311        y = `${parseInt(y, 10) * progress}%`;
6312      } else {
6313        y = `${y * progress}px`;
6314      }
6315      if (typeof opacity !== 'undefined' && opacity !== null) {
6316        const currentOpacity = opacity - (opacity - 1) * (1 - Math.abs(progress));
6317        el.style.opacity = currentOpacity;
6318      }
6319      let transform = `translate3d(${x}, ${y}, 0px)`;
6320      if (typeof scale !== 'undefined' && scale !== null) {
6321        const currentScale = scale - (scale - 1) * (1 - Math.abs(progress));
6322        transform += ` scale(${currentScale})`;
6323      }
6324      if (rotate && typeof rotate !== 'undefined' && rotate !== null) {
6325        const currentRotate = rotate * progress * -1;
6326        transform += ` rotate(${currentRotate}deg)`;
6327      }
6328      el.style.transform = transform;
6329    };
6330    const setTranslate = () => {
6331      const {
6332        el,
6333        slides,
6334        progress,
6335        snapGrid,
6336        isElement
6337      } = swiper;
6338      const elements = elementChildren(el, elementsSelector);
6339      if (swiper.isElement) {
6340        elements.push(...elementChildren(swiper.hostEl, elementsSelector));
6341      }
6342      elements.forEach(subEl => {
6343        setTransform(subEl, progress);
6344      });
6345      slides.forEach((slideEl, slideIndex) => {
6346        let slideProgress = slideEl.progress;
6347        if (swiper.params.slidesPerGroup > 1 && swiper.params.slidesPerView !== 'auto') {
6348          slideProgress += Math.ceil(slideIndex / 2) - progress * (snapGrid.length - 1);
6349        }
6350        slideProgress = Math.min(Math.max(slideProgress, -1), 1);
6351        slideEl.querySelectorAll(`${elementsSelector}, [data-swiper-parallax-rotate]`).forEach(subEl => {
6352          setTransform(subEl, slideProgress);
6353        });
6354      });
6355    };
6356    const setTransition = function (duration) {
6357      if (duration === void 0) {
6358        duration = swiper.params.speed;
6359      }
6360      const {
6361        el,
6362        hostEl
6363      } = swiper;
6364      const elements = [...el.querySelectorAll(elementsSelector)];
6365      if (swiper.isElement) {
6366        elements.push(...hostEl.querySelectorAll(elementsSelector));
6367      }
6368      elements.forEach(parallaxEl => {
6369        let parallaxDuration = parseInt(parallaxEl.getAttribute('data-swiper-parallax-duration'), 10) || duration;
6370        if (duration === 0) parallaxDuration = 0;
6371        parallaxEl.style.transitionDuration = `${parallaxDuration}ms`;
6372      });
6373    };
6374    on('beforeInit', () => {
6375      if (!swiper.params.parallax.enabled) return;
6376      swiper.params.watchSlidesProgress = true;
6377      swiper.originalParams.watchSlidesProgress = true;
6378    });
6379    on('init', () => {
6380      if (!swiper.params.parallax.enabled) return;
6381      setTranslate();
6382    });
6383    on('setTranslate', () => {
6384      if (!swiper.params.parallax.enabled) return;
6385      setTranslate();
6386    });
6387    on('setTransition', (_swiper, duration) => {
6388      if (!swiper.params.parallax.enabled) return;
6389      setTransition(duration);
6390    });
6391  }
6392
6393  function Zoom(_ref) {
6394    let {
6395      swiper,
6396      extendParams,
6397      on,
6398      emit
6399    } = _ref;
6400    const window = getWindow();
6401    extendParams({
6402      zoom: {
6403        enabled: false,
6404        limitToOriginalSize: false,
6405        maxRatio: 3,
6406        minRatio: 1,
6407        toggle: true,
6408        containerClass: 'swiper-zoom-container',
6409        zoomedSlideClass: 'swiper-slide-zoomed'
6410      }
6411    });
6412    swiper.zoom = {
6413      enabled: false
6414    };
6415    let currentScale = 1;
6416    let isScaling = false;
6417    let fakeGestureTouched;
6418    let fakeGestureMoved;
6419    const evCache = [];
6420    const gesture = {
6421      originX: 0,
6422      originY: 0,
6423      slideEl: undefined,
6424      slideWidth: undefined,
6425      slideHeight: undefined,
6426      imageEl: undefined,
6427      imageWrapEl: undefined,
6428      maxRatio: 3
6429    };
6430    const image = {
6431      isTouched: undefined,
6432      isMoved: undefined,
6433      currentX: undefined,
6434      currentY: undefined,
6435      minX: undefined,
6436      minY: undefined,
6437      maxX: undefined,
6438      maxY: undefined,
6439      width: undefined,
6440      height: undefined,
6441      startX: undefined,
6442      startY: undefined,
6443      touchesStart: {},
6444      touchesCurrent: {}
6445    };
6446    const velocity = {
6447      x: undefined,
6448      y: undefined,
6449      prevPositionX: undefined,
6450      prevPositionY: undefined,
6451      prevTime: undefined
6452    };
6453    let scale = 1;
6454    Object.defineProperty(swiper.zoom, 'scale', {
6455      get() {
6456        return scale;
6457      },
6458      set(value) {
6459        if (scale !== value) {
6460          const imageEl = gesture.imageEl;
6461          const slideEl = gesture.slideEl;
6462          emit('zoomChange', value, imageEl, slideEl);
6463        }
6464        scale = value;
6465      }
6466    });
6467    function getDistanceBetweenTouches() {
6468      if (evCache.length < 2) return 1;
6469      const x1 = evCache[0].pageX;
6470      const y1 = evCache[0].pageY;
6471      const x2 = evCache[1].pageX;
6472      const y2 = evCache[1].pageY;
6473      const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
6474      return distance;
6475    }
6476    function getMaxRatio() {
6477      const params = swiper.params.zoom;
6478      const maxRatio = gesture.imageWrapEl.getAttribute('data-swiper-zoom') || params.maxRatio;
6479      if (params.limitToOriginalSize && gesture.imageEl && gesture.imageEl.naturalWidth) {
6480        const imageMaxRatio = gesture.imageEl.naturalWidth / gesture.imageEl.offsetWidth;
6481        return Math.min(imageMaxRatio, maxRatio);
6482      }
6483      return maxRatio;
6484    }
6485    function getScaleOrigin() {
6486      if (evCache.length < 2) return {
6487        x: null,
6488        y: null
6489      };
6490      const box = gesture.imageEl.getBoundingClientRect();
6491      return [(evCache[0].pageX + (evCache[1].pageX - evCache[0].pageX) / 2 - box.x - window.scrollX) / currentScale, (evCache[0].pageY + (evCache[1].pageY - evCache[0].pageY) / 2 - box.y - window.scrollY) / currentScale];
6492    }
6493    function getSlideSelector() {
6494      return swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
6495    }
6496    function eventWithinSlide(e) {
6497      const slideSelector = getSlideSelector();
6498      if (e.target.matches(slideSelector)) return true;
6499      if (swiper.slides.filter(slideEl => slideEl.contains(e.target)).length > 0) return true;
6500      return false;
6501    }
6502    function eventWithinZoomContainer(e) {
6503      const selector = `.${swiper.params.zoom.containerClass}`;
6504      if (e.target.matches(selector)) return true;
6505      if ([...swiper.hostEl.querySelectorAll(selector)].filter(containerEl => containerEl.contains(e.target)).length > 0) return true;
6506      return false;
6507    }
6508
6509    // Events
6510    function onGestureStart(e) {
6511      if (e.pointerType === 'mouse') {
6512        evCache.splice(0, evCache.length);
6513      }
6514      if (!eventWithinSlide(e)) return;
6515      const params = swiper.params.zoom;
6516      fakeGestureTouched = false;
6517      fakeGestureMoved = false;
6518      evCache.push(e);
6519      if (evCache.length < 2) {
6520        return;
6521      }
6522      fakeGestureTouched = true;
6523      gesture.scaleStart = getDistanceBetweenTouches();
6524      if (!gesture.slideEl) {
6525        gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
6526        if (!gesture.slideEl) gesture.slideEl = swiper.slides[swiper.activeIndex];
6527        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6528        if (imageEl) {
6529          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6530        }
6531        gesture.imageEl = imageEl;
6532        if (imageEl) {
6533          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6534        } else {
6535          gesture.imageWrapEl = undefined;
6536        }
6537        if (!gesture.imageWrapEl) {
6538          gesture.imageEl = undefined;
6539          return;
6540        }
6541        gesture.maxRatio = getMaxRatio();
6542      }
6543      if (gesture.imageEl) {
6544        const [originX, originY] = getScaleOrigin();
6545        gesture.originX = originX;
6546        gesture.originY = originY;
6547        gesture.imageEl.style.transitionDuration = '0ms';
6548      }
6549      isScaling = true;
6550    }
6551    function onGestureChange(e) {
6552      if (!eventWithinSlide(e)) return;
6553      const params = swiper.params.zoom;
6554      const zoom = swiper.zoom;
6555      const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
6556      if (pointerIndex >= 0) evCache[pointerIndex] = e;
6557      if (evCache.length < 2) {
6558        return;
6559      }
6560      fakeGestureMoved = true;
6561      gesture.scaleMove = getDistanceBetweenTouches();
6562      if (!gesture.imageEl) {
6563        return;
6564      }
6565      zoom.scale = gesture.scaleMove / gesture.scaleStart * currentScale;
6566      if (zoom.scale > gesture.maxRatio) {
6567        zoom.scale = gesture.maxRatio - 1 + (zoom.scale - gesture.maxRatio + 1) ** 0.5;
6568      }
6569      if (zoom.scale < params.minRatio) {
6570        zoom.scale = params.minRatio + 1 - (params.minRatio - zoom.scale + 1) ** 0.5;
6571      }
6572      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6573    }
6574    function onGestureEnd(e) {
6575      if (!eventWithinSlide(e)) return;
6576      if (e.pointerType === 'mouse' && e.type === 'pointerout') return;
6577      const params = swiper.params.zoom;
6578      const zoom = swiper.zoom;
6579      const pointerIndex = evCache.findIndex(cachedEv => cachedEv.pointerId === e.pointerId);
6580      if (pointerIndex >= 0) evCache.splice(pointerIndex, 1);
6581      if (!fakeGestureTouched || !fakeGestureMoved) {
6582        return;
6583      }
6584      fakeGestureTouched = false;
6585      fakeGestureMoved = false;
6586      if (!gesture.imageEl) return;
6587      zoom.scale = Math.max(Math.min(zoom.scale, gesture.maxRatio), params.minRatio);
6588      gesture.imageEl.style.transitionDuration = `${swiper.params.speed}ms`;
6589      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6590      currentScale = zoom.scale;
6591      isScaling = false;
6592      if (zoom.scale > 1 && gesture.slideEl) {
6593        gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
6594      } else if (zoom.scale <= 1 && gesture.slideEl) {
6595        gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
6596      }
6597      if (zoom.scale === 1) {
6598        gesture.originX = 0;
6599        gesture.originY = 0;
6600        gesture.slideEl = undefined;
6601      }
6602    }
6603    let allowTouchMoveTimeout;
6604    function allowTouchMove() {
6605      swiper.touchEventsData.preventTouchMoveFromPointerMove = false;
6606    }
6607    function preventTouchMove() {
6608      clearTimeout(allowTouchMoveTimeout);
6609      swiper.touchEventsData.preventTouchMoveFromPointerMove = true;
6610      allowTouchMoveTimeout = setTimeout(() => {
6611        if (swiper.destroyed) return;
6612        allowTouchMove();
6613      });
6614    }
6615    function onTouchStart(e) {
6616      const device = swiper.device;
6617      if (!gesture.imageEl) return;
6618      if (image.isTouched) return;
6619      if (device.android && e.cancelable) e.preventDefault();
6620      image.isTouched = true;
6621      const event = evCache.length > 0 ? evCache[0] : e;
6622      image.touchesStart.x = event.pageX;
6623      image.touchesStart.y = event.pageY;
6624    }
6625    function onTouchMove(e) {
6626      if (!eventWithinSlide(e) || !eventWithinZoomContainer(e)) {
6627        return;
6628      }
6629      const zoom = swiper.zoom;
6630      if (!gesture.imageEl) {
6631        return;
6632      }
6633      if (!image.isTouched || !gesture.slideEl) {
6634        return;
6635      }
6636      if (!image.isMoved) {
6637        image.width = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;
6638        image.height = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;
6639        image.startX = getTranslate(gesture.imageWrapEl, 'x') || 0;
6640        image.startY = getTranslate(gesture.imageWrapEl, 'y') || 0;
6641        gesture.slideWidth = gesture.slideEl.offsetWidth;
6642        gesture.slideHeight = gesture.slideEl.offsetHeight;
6643        gesture.imageWrapEl.style.transitionDuration = '0ms';
6644      }
6645      // Define if we need image drag
6646      const scaledWidth = image.width * zoom.scale;
6647      const scaledHeight = image.height * zoom.scale;
6648      image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
6649      image.maxX = -image.minX;
6650      image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
6651      image.maxY = -image.minY;
6652      image.touchesCurrent.x = evCache.length > 0 ? evCache[0].pageX : e.pageX;
6653      image.touchesCurrent.y = evCache.length > 0 ? evCache[0].pageY : e.pageY;
6654      const touchesDiff = Math.max(Math.abs(image.touchesCurrent.x - image.touchesStart.x), Math.abs(image.touchesCurrent.y - image.touchesStart.y));
6655      if (touchesDiff > 5) {
6656        swiper.allowClick = false;
6657      }
6658      if (!image.isMoved && !isScaling) {
6659        if (swiper.isHorizontal() && (Math.floor(image.minX) === Math.floor(image.startX) && image.touchesCurrent.x < image.touchesStart.x || Math.floor(image.maxX) === Math.floor(image.startX) && image.touchesCurrent.x > image.touchesStart.x)) {
6660          image.isTouched = false;
6661          allowTouchMove();
6662          return;
6663        }
6664        if (!swiper.isHorizontal() && (Math.floor(image.minY) === Math.floor(image.startY) && image.touchesCurrent.y < image.touchesStart.y || Math.floor(image.maxY) === Math.floor(image.startY) && image.touchesCurrent.y > image.touchesStart.y)) {
6665          image.isTouched = false;
6666          allowTouchMove();
6667          return;
6668        }
6669      }
6670      if (e.cancelable) {
6671        e.preventDefault();
6672      }
6673      e.stopPropagation();
6674      preventTouchMove();
6675      image.isMoved = true;
6676      const scaleRatio = (zoom.scale - currentScale) / (gesture.maxRatio - swiper.params.zoom.minRatio);
6677      const {
6678        originX,
6679        originY
6680      } = gesture;
6681      image.currentX = image.touchesCurrent.x - image.touchesStart.x + image.startX + scaleRatio * (image.width - originX * 2);
6682      image.currentY = image.touchesCurrent.y - image.touchesStart.y + image.startY + scaleRatio * (image.height - originY * 2);
6683      if (image.currentX < image.minX) {
6684        image.currentX = image.minX + 1 - (image.minX - image.currentX + 1) ** 0.8;
6685      }
6686      if (image.currentX > image.maxX) {
6687        image.currentX = image.maxX - 1 + (image.currentX - image.maxX + 1) ** 0.8;
6688      }
6689      if (image.currentY < image.minY) {
6690        image.currentY = image.minY + 1 - (image.minY - image.currentY + 1) ** 0.8;
6691      }
6692      if (image.currentY > image.maxY) {
6693        image.currentY = image.maxY - 1 + (image.currentY - image.maxY + 1) ** 0.8;
6694      }
6695
6696      // Velocity
6697      if (!velocity.prevPositionX) velocity.prevPositionX = image.touchesCurrent.x;
6698      if (!velocity.prevPositionY) velocity.prevPositionY = image.touchesCurrent.y;
6699      if (!velocity.prevTime) velocity.prevTime = Date.now();
6700      velocity.x = (image.touchesCurrent.x - velocity.prevPositionX) / (Date.now() - velocity.prevTime) / 2;
6701      velocity.y = (image.touchesCurrent.y - velocity.prevPositionY) / (Date.now() - velocity.prevTime) / 2;
6702      if (Math.abs(image.touchesCurrent.x - velocity.prevPositionX) < 2) velocity.x = 0;
6703      if (Math.abs(image.touchesCurrent.y - velocity.prevPositionY) < 2) velocity.y = 0;
6704      velocity.prevPositionX = image.touchesCurrent.x;
6705      velocity.prevPositionY = image.touchesCurrent.y;
6706      velocity.prevTime = Date.now();
6707      gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
6708    }
6709    function onTouchEnd() {
6710      const zoom = swiper.zoom;
6711      if (!gesture.imageEl) return;
6712      if (!image.isTouched || !image.isMoved) {
6713        image.isTouched = false;
6714        image.isMoved = false;
6715        return;
6716      }
6717      image.isTouched = false;
6718      image.isMoved = false;
6719      let momentumDurationX = 300;
6720      let momentumDurationY = 300;
6721      const momentumDistanceX = velocity.x * momentumDurationX;
6722      const newPositionX = image.currentX + momentumDistanceX;
6723      const momentumDistanceY = velocity.y * momentumDurationY;
6724      const newPositionY = image.currentY + momentumDistanceY;
6725
6726      // Fix duration
6727      if (velocity.x !== 0) momentumDurationX = Math.abs((newPositionX - image.currentX) / velocity.x);
6728      if (velocity.y !== 0) momentumDurationY = Math.abs((newPositionY - image.currentY) / velocity.y);
6729      const momentumDuration = Math.max(momentumDurationX, momentumDurationY);
6730      image.currentX = newPositionX;
6731      image.currentY = newPositionY;
6732      // Define if we need image drag
6733      const scaledWidth = image.width * zoom.scale;
6734      const scaledHeight = image.height * zoom.scale;
6735      image.minX = Math.min(gesture.slideWidth / 2 - scaledWidth / 2, 0);
6736      image.maxX = -image.minX;
6737      image.minY = Math.min(gesture.slideHeight / 2 - scaledHeight / 2, 0);
6738      image.maxY = -image.minY;
6739      image.currentX = Math.max(Math.min(image.currentX, image.maxX), image.minX);
6740      image.currentY = Math.max(Math.min(image.currentY, image.maxY), image.minY);
6741      gesture.imageWrapEl.style.transitionDuration = `${momentumDuration}ms`;
6742      gesture.imageWrapEl.style.transform = `translate3d(${image.currentX}px, ${image.currentY}px,0)`;
6743    }
6744    function onTransitionEnd() {
6745      const zoom = swiper.zoom;
6746      if (gesture.slideEl && swiper.activeIndex !== swiper.slides.indexOf(gesture.slideEl)) {
6747        if (gesture.imageEl) {
6748          gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
6749        }
6750        if (gesture.imageWrapEl) {
6751          gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
6752        }
6753        gesture.slideEl.classList.remove(`${swiper.params.zoom.zoomedSlideClass}`);
6754        zoom.scale = 1;
6755        currentScale = 1;
6756        gesture.slideEl = undefined;
6757        gesture.imageEl = undefined;
6758        gesture.imageWrapEl = undefined;
6759        gesture.originX = 0;
6760        gesture.originY = 0;
6761      }
6762    }
6763    function zoomIn(e) {
6764      const zoom = swiper.zoom;
6765      const params = swiper.params.zoom;
6766      if (!gesture.slideEl) {
6767        if (e && e.target) {
6768          gesture.slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
6769        }
6770        if (!gesture.slideEl) {
6771          if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
6772            gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
6773          } else {
6774            gesture.slideEl = swiper.slides[swiper.activeIndex];
6775          }
6776        }
6777        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6778        if (imageEl) {
6779          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6780        }
6781        gesture.imageEl = imageEl;
6782        if (imageEl) {
6783          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6784        } else {
6785          gesture.imageWrapEl = undefined;
6786        }
6787      }
6788      if (!gesture.imageEl || !gesture.imageWrapEl) return;
6789      if (swiper.params.cssMode) {
6790        swiper.wrapperEl.style.overflow = 'hidden';
6791        swiper.wrapperEl.style.touchAction = 'none';
6792      }
6793      gesture.slideEl.classList.add(`${params.zoomedSlideClass}`);
6794      let touchX;
6795      let touchY;
6796      let offsetX;
6797      let offsetY;
6798      let diffX;
6799      let diffY;
6800      let translateX;
6801      let translateY;
6802      let imageWidth;
6803      let imageHeight;
6804      let scaledWidth;
6805      let scaledHeight;
6806      let translateMinX;
6807      let translateMinY;
6808      let translateMaxX;
6809      let translateMaxY;
6810      let slideWidth;
6811      let slideHeight;
6812      if (typeof image.touchesStart.x === 'undefined' && e) {
6813        touchX = e.pageX;
6814        touchY = e.pageY;
6815      } else {
6816        touchX = image.touchesStart.x;
6817        touchY = image.touchesStart.y;
6818      }
6819      const forceZoomRatio = typeof e === 'number' ? e : null;
6820      if (currentScale === 1 && forceZoomRatio) {
6821        touchX = undefined;
6822        touchY = undefined;
6823        image.touchesStart.x = undefined;
6824        image.touchesStart.y = undefined;
6825      }
6826      const maxRatio = getMaxRatio();
6827      zoom.scale = forceZoomRatio || maxRatio;
6828      currentScale = forceZoomRatio || maxRatio;
6829      if (e && !(currentScale === 1 && forceZoomRatio)) {
6830        slideWidth = gesture.slideEl.offsetWidth;
6831        slideHeight = gesture.slideEl.offsetHeight;
6832        offsetX = elementOffset(gesture.slideEl).left + window.scrollX;
6833        offsetY = elementOffset(gesture.slideEl).top + window.scrollY;
6834        diffX = offsetX + slideWidth / 2 - touchX;
6835        diffY = offsetY + slideHeight / 2 - touchY;
6836        imageWidth = gesture.imageEl.offsetWidth || gesture.imageEl.clientWidth;
6837        imageHeight = gesture.imageEl.offsetHeight || gesture.imageEl.clientHeight;
6838        scaledWidth = imageWidth * zoom.scale;
6839        scaledHeight = imageHeight * zoom.scale;
6840        translateMinX = Math.min(slideWidth / 2 - scaledWidth / 2, 0);
6841        translateMinY = Math.min(slideHeight / 2 - scaledHeight / 2, 0);
6842        translateMaxX = -translateMinX;
6843        translateMaxY = -translateMinY;
6844        translateX = diffX * zoom.scale;
6845        translateY = diffY * zoom.scale;
6846        if (translateX < translateMinX) {
6847          translateX = translateMinX;
6848        }
6849        if (translateX > translateMaxX) {
6850          translateX = translateMaxX;
6851        }
6852        if (translateY < translateMinY) {
6853          translateY = translateMinY;
6854        }
6855        if (translateY > translateMaxY) {
6856          translateY = translateMaxY;
6857        }
6858      } else {
6859        translateX = 0;
6860        translateY = 0;
6861      }
6862      if (forceZoomRatio && zoom.scale === 1) {
6863        gesture.originX = 0;
6864        gesture.originY = 0;
6865      }
6866      gesture.imageWrapEl.style.transitionDuration = '300ms';
6867      gesture.imageWrapEl.style.transform = `translate3d(${translateX}px, ${translateY}px,0)`;
6868      gesture.imageEl.style.transitionDuration = '300ms';
6869      gesture.imageEl.style.transform = `translate3d(0,0,0) scale(${zoom.scale})`;
6870    }
6871    function zoomOut() {
6872      const zoom = swiper.zoom;
6873      const params = swiper.params.zoom;
6874      if (!gesture.slideEl) {
6875        if (swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual) {
6876          gesture.slideEl = elementChildren(swiper.slidesEl, `.${swiper.params.slideActiveClass}`)[0];
6877        } else {
6878          gesture.slideEl = swiper.slides[swiper.activeIndex];
6879        }
6880        let imageEl = gesture.slideEl.querySelector(`.${params.containerClass}`);
6881        if (imageEl) {
6882          imageEl = imageEl.querySelectorAll('picture, img, svg, canvas, .swiper-zoom-target')[0];
6883        }
6884        gesture.imageEl = imageEl;
6885        if (imageEl) {
6886          gesture.imageWrapEl = elementParents(gesture.imageEl, `.${params.containerClass}`)[0];
6887        } else {
6888          gesture.imageWrapEl = undefined;
6889        }
6890      }
6891      if (!gesture.imageEl || !gesture.imageWrapEl) return;
6892      if (swiper.params.cssMode) {
6893        swiper.wrapperEl.style.overflow = '';
6894        swiper.wrapperEl.style.touchAction = '';
6895      }
6896      zoom.scale = 1;
6897      currentScale = 1;
6898      image.touchesStart.x = undefined;
6899      image.touchesStart.y = undefined;
6900      gesture.imageWrapEl.style.transitionDuration = '300ms';
6901      gesture.imageWrapEl.style.transform = 'translate3d(0,0,0)';
6902      gesture.imageEl.style.transitionDuration = '300ms';
6903      gesture.imageEl.style.transform = 'translate3d(0,0,0) scale(1)';
6904      gesture.slideEl.classList.remove(`${params.zoomedSlideClass}`);
6905      gesture.slideEl = undefined;
6906      gesture.originX = 0;
6907      gesture.originY = 0;
6908    }
6909
6910    // Toggle Zoom
6911    function zoomToggle(e) {
6912      const zoom = swiper.zoom;
6913      if (zoom.scale && zoom.scale !== 1) {
6914        // Zoom Out
6915        zoomOut();
6916      } else {
6917        // Zoom In
6918        zoomIn(e);
6919      }
6920    }
6921    function getListeners() {
6922      const passiveListener = swiper.params.passiveListeners ? {
6923        passive: true,
6924        capture: false
6925      } : false;
6926      const activeListenerWithCapture = swiper.params.passiveListeners ? {
6927        passive: false,
6928        capture: true
6929      } : true;
6930      return {
6931        passiveListener,
6932        activeListenerWithCapture
6933      };
6934    }
6935
6936    // Attach/Detach Events
6937    function enable() {
6938      const zoom = swiper.zoom;
6939      if (zoom.enabled) return;
6940      zoom.enabled = true;
6941      const {
6942        passiveListener,
6943        activeListenerWithCapture
6944      } = getListeners();
6945
6946      // Scale image
6947      swiper.wrapperEl.addEventListener('pointerdown', onGestureStart, passiveListener);
6948      swiper.wrapperEl.addEventListener('pointermove', onGestureChange, activeListenerWithCapture);
6949      ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
6950        swiper.wrapperEl.addEventListener(eventName, onGestureEnd, passiveListener);
6951      });
6952
6953      // Move image
6954      swiper.wrapperEl.addEventListener('pointermove', onTouchMove, activeListenerWithCapture);
6955    }
6956    function disable() {
6957      const zoom = swiper.zoom;
6958      if (!zoom.enabled) return;
6959      zoom.enabled = false;
6960      const {
6961        passiveListener,
6962        activeListenerWithCapture
6963      } = getListeners();
6964
6965      // Scale image
6966      swiper.wrapperEl.removeEventListener('pointerdown', onGestureStart, passiveListener);
6967      swiper.wrapperEl.removeEventListener('pointermove', onGestureChange, activeListenerWithCapture);
6968      ['pointerup', 'pointercancel', 'pointerout'].forEach(eventName => {
6969        swiper.wrapperEl.removeEventListener(eventName, onGestureEnd, passiveListener);
6970      });
6971
6972      // Move image
6973      swiper.wrapperEl.removeEventListener('pointermove', onTouchMove, activeListenerWithCapture);
6974    }
6975    on('init', () => {
6976      if (swiper.params.zoom.enabled) {
6977        enable();
6978      }
6979    });
6980    on('destroy', () => {
6981      disable();
6982    });
6983    on('touchStart', (_s, e) => {
6984      if (!swiper.zoom.enabled) return;
6985      onTouchStart(e);
6986    });
6987    on('touchEnd', (_s, e) => {
6988      if (!swiper.zoom.enabled) return;
6989      onTouchEnd();
6990    });
6991    on('doubleTap', (_s, e) => {
6992      if (!swiper.animating && swiper.params.zoom.enabled && swiper.zoom.enabled && swiper.params.zoom.toggle) {
6993        zoomToggle(e);
6994      }
6995    });
6996    on('transitionEnd', () => {
6997      if (swiper.zoom.enabled && swiper.params.zoom.enabled) {
6998        onTransitionEnd();
6999      }
7000    });
7001    on('slideChange', () => {
7002      if (swiper.zoom.enabled && swiper.params.zoom.enabled && swiper.params.cssMode) {
7003        onTransitionEnd();
7004      }
7005    });
7006    Object.assign(swiper.zoom, {
7007      enable,
7008      disable,
7009      in: zoomIn,
7010      out: zoomOut,
7011      toggle: zoomToggle
7012    });
7013  }
7014
7015  /* eslint no-bitwise: ["error", { "allow": [">>"] }] */
7016  function Controller(_ref) {
7017    let {
7018      swiper,
7019      extendParams,
7020      on
7021    } = _ref;
7022    extendParams({
7023      controller: {
7024        control: undefined,
7025        inverse: false,
7026        by: 'slide' // or 'container'
7027      }
7028    });
7029
7030    swiper.controller = {
7031      control: undefined
7032    };
7033    function LinearSpline(x, y) {
7034      const binarySearch = function search() {
7035        let maxIndex;
7036        let minIndex;
7037        let guess;
7038        return (array, val) => {
7039          minIndex = -1;
7040          maxIndex = array.length;
7041          while (maxIndex - minIndex > 1) {
7042            guess = maxIndex + minIndex >> 1;
7043            if (array[guess] <= val) {
7044              minIndex = guess;
7045            } else {
7046              maxIndex = guess;
7047            }
7048          }
7049          return maxIndex;
7050        };
7051      }();
7052      this.x = x;
7053      this.y = y;
7054      this.lastIndex = x.length - 1;
7055      // Given an x value (x2), return the expected y2 value:
7056      // (x1,y1) is the known point before given value,
7057      // (x3,y3) is the known point after given value.
7058      let i1;
7059      let i3;
7060      this.interpolate = function interpolate(x2) {
7061        if (!x2) return 0;
7062
7063        // Get the indexes of x1 and x3 (the array indexes before and after given x2):
7064        i3 = binarySearch(this.x, x2);
7065        i1 = i3 - 1;
7066
7067        // We have our indexes i1 & i3, so we can calculate already:
7068        // y2 := ((x2−x1) × (y3−y1)) ÷ (x3−x1) + y1
7069        return (x2 - this.x[i1]) * (this.y[i3] - this.y[i1]) / (this.x[i3] - this.x[i1]) + this.y[i1];
7070      };
7071      return this;
7072    }
7073    function getInterpolateFunction(c) {
7074      swiper.controller.spline = swiper.params.loop ? new LinearSpline(swiper.slidesGrid, c.slidesGrid) : new LinearSpline(swiper.snapGrid, c.snapGrid);
7075    }
7076    function setTranslate(_t, byController) {
7077      const controlled = swiper.controller.control;
7078      let multiplier;
7079      let controlledTranslate;
7080      const Swiper = swiper.constructor;
7081      function setControlledTranslate(c) {
7082        if (c.destroyed) return;
7083
7084        // this will create an Interpolate function based on the snapGrids
7085        // x is the Grid of the scrolled scroller and y will be the controlled scroller
7086        // it makes sense to create this only once and recall it for the interpolation
7087        // the function does a lot of value caching for performance
7088        const translate = swiper.rtlTranslate ? -swiper.translate : swiper.translate;
7089        if (swiper.params.controller.by === 'slide') {
7090          getInterpolateFunction(c);
7091          // i am not sure why the values have to be multiplicated this way, tried to invert the snapGrid
7092          // but it did not work out
7093          controlledTranslate = -swiper.controller.spline.interpolate(-translate);
7094        }
7095        if (!controlledTranslate || swiper.params.controller.by === 'container') {
7096          multiplier = (c.maxTranslate() - c.minTranslate()) / (swiper.maxTranslate() - swiper.minTranslate());
7097          if (Number.isNaN(multiplier) || !Number.isFinite(multiplier)) {
7098            multiplier = 1;
7099          }
7100          controlledTranslate = (translate - swiper.minTranslate()) * multiplier + c.minTranslate();
7101        }
7102        if (swiper.params.controller.inverse) {
7103          controlledTranslate = c.maxTranslate() - controlledTranslate;
7104        }
7105        c.updateProgress(controlledTranslate);
7106        c.setTranslate(controlledTranslate, swiper);
7107        c.updateActiveIndex();
7108        c.updateSlidesClasses();
7109      }
7110      if (Array.isArray(controlled)) {
7111        for (let i = 0; i < controlled.length; i += 1) {
7112          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
7113            setControlledTranslate(controlled[i]);
7114          }
7115        }
7116      } else if (controlled instanceof Swiper && byController !== controlled) {
7117        setControlledTranslate(controlled);
7118      }
7119    }
7120    function setTransition(duration, byController) {
7121      const Swiper = swiper.constructor;
7122      const controlled = swiper.controller.control;
7123      let i;
7124      function setControlledTransition(c) {
7125        if (c.destroyed) return;
7126        c.setTransition(duration, swiper);
7127        if (duration !== 0) {
7128          c.transitionStart();
7129          if (c.params.autoHeight) {
7130            nextTick(() => {
7131              c.updateAutoHeight();
7132            });
7133          }
7134          elementTransitionEnd(c.wrapperEl, () => {
7135            if (!controlled) return;
7136            c.transitionEnd();
7137          });
7138        }
7139      }
7140      if (Array.isArray(controlled)) {
7141        for (i = 0; i < controlled.length; i += 1) {
7142          if (controlled[i] !== byController && controlled[i] instanceof Swiper) {
7143            setControlledTransition(controlled[i]);
7144          }
7145        }
7146      } else if (controlled instanceof Swiper && byController !== controlled) {
7147        setControlledTransition(controlled);
7148      }
7149    }
7150    function removeSpline() {
7151      if (!swiper.controller.control) return;
7152      if (swiper.controller.spline) {
7153        swiper.controller.spline = undefined;
7154        delete swiper.controller.spline;
7155      }
7156    }
7157    on('beforeInit', () => {
7158      if (typeof window !== 'undefined' && (
7159      // eslint-disable-line
7160      typeof swiper.params.controller.control === 'string' || swiper.params.controller.control instanceof HTMLElement)) {
7161        const controlElements = typeof swiper.params.controller.control === 'string' ? [...document.querySelectorAll(swiper.params.controller.control)] : [swiper.params.controller.control];
7162        controlElements.forEach(controlElement => {
7163          if (!swiper.controller.control) swiper.controller.control = [];
7164          if (controlElement && controlElement.swiper) {
7165            swiper.controller.control.push(controlElement.swiper);
7166          } else if (controlElement) {
7167            const eventName = `${swiper.params.eventsPrefix}init`;
7168            const onControllerSwiper = e => {
7169              swiper.controller.control.push(e.detail[0]);
7170              swiper.update();
7171              controlElement.removeEventListener(eventName, onControllerSwiper);
7172            };
7173            controlElement.addEventListener(eventName, onControllerSwiper);
7174          }
7175        });
7176        return;
7177      }
7178      swiper.controller.control = swiper.params.controller.control;
7179    });
7180    on('update', () => {
7181      removeSpline();
7182    });
7183    on('resize', () => {
7184      removeSpline();
7185    });
7186    on('observerUpdate', () => {
7187      removeSpline();
7188    });
7189    on('setTranslate', (_s, translate, byController) => {
7190      if (!swiper.controller.control || swiper.controller.control.destroyed) return;
7191      swiper.controller.setTranslate(translate, byController);
7192    });
7193    on('setTransition', (_s, duration, byController) => {
7194      if (!swiper.controller.control || swiper.controller.control.destroyed) return;
7195      swiper.controller.setTransition(duration, byController);
7196    });
7197    Object.assign(swiper.controller, {
7198      setTranslate,
7199      setTransition
7200    });
7201  }
7202
7203  function A11y(_ref) {
7204    let {
7205      swiper,
7206      extendParams,
7207      on
7208    } = _ref;
7209    extendParams({
7210      a11y: {
7211        enabled: true,
7212        notificationClass: 'swiper-notification',
7213        prevSlideMessage: 'Previous slide',
7214        nextSlideMessage: 'Next slide',
7215        firstSlideMessage: 'This is the first slide',
7216        lastSlideMessage: 'This is the last slide',
7217        paginationBulletMessage: 'Go to slide {{index}}',
7218        slideLabelMessage: '{{index}} / {{slidesLength}}',
7219        containerMessage: null,
7220        containerRoleDescriptionMessage: null,
7221        containerRole: null,
7222        itemRoleDescriptionMessage: null,
7223        slideRole: 'group',
7224        id: null,
7225        scrollOnFocus: true
7226      }
7227    });
7228    swiper.a11y = {
7229      clicked: false
7230    };
7231    let liveRegion = null;
7232    let preventFocusHandler;
7233    let focusTargetSlideEl;
7234    let visibilityChangedTimestamp = new Date().getTime();
7235    function notify(message) {
7236      const notification = liveRegion;
7237      if (notification.length === 0) return;
7238      notification.innerHTML = '';
7239      notification.innerHTML = message;
7240    }
7241    function getRandomNumber(size) {
7242      if (size === void 0) {
7243        size = 16;
7244      }
7245      const randomChar = () => Math.round(16 * Math.random()).toString(16);
7246      return 'x'.repeat(size).replace(/x/g, randomChar);
7247    }
7248    function makeElFocusable(el) {
7249      el = makeElementsArray(el);
7250      el.forEach(subEl => {
7251        subEl.setAttribute('tabIndex', '0');
7252      });
7253    }
7254    function makeElNotFocusable(el) {
7255      el = makeElementsArray(el);
7256      el.forEach(subEl => {
7257        subEl.setAttribute('tabIndex', '-1');
7258      });
7259    }
7260    function addElRole(el, role) {
7261      el = makeElementsArray(el);
7262      el.forEach(subEl => {
7263        subEl.setAttribute('role', role);
7264      });
7265    }
7266    function addElRoleDescription(el, description) {
7267      el = makeElementsArray(el);
7268      el.forEach(subEl => {
7269        subEl.setAttribute('aria-roledescription', description);
7270      });
7271    }
7272    function addElControls(el, controls) {
7273      el = makeElementsArray(el);
7274      el.forEach(subEl => {
7275        subEl.setAttribute('aria-controls', controls);
7276      });
7277    }
7278    function addElLabel(el, label) {
7279      el = makeElementsArray(el);
7280      el.forEach(subEl => {
7281        subEl.setAttribute('aria-label', label);
7282      });
7283    }
7284    function addElId(el, id) {
7285      el = makeElementsArray(el);
7286      el.forEach(subEl => {
7287        subEl.setAttribute('id', id);
7288      });
7289    }
7290    function addElLive(el, live) {
7291      el = makeElementsArray(el);
7292      el.forEach(subEl => {
7293        subEl.setAttribute('aria-live', live);
7294      });
7295    }
7296    function disableEl(el) {
7297      el = makeElementsArray(el);
7298      el.forEach(subEl => {
7299        subEl.setAttribute('aria-disabled', true);
7300      });
7301    }
7302    function enableEl(el) {
7303      el = makeElementsArray(el);
7304      el.forEach(subEl => {
7305        subEl.setAttribute('aria-disabled', false);
7306      });
7307    }
7308    function onEnterOrSpaceKey(e) {
7309      if (e.keyCode !== 13 && e.keyCode !== 32) return;
7310      const params = swiper.params.a11y;
7311      const targetEl = e.target;
7312      if (swiper.pagination && swiper.pagination.el && (targetEl === swiper.pagination.el || swiper.pagination.el.contains(e.target))) {
7313        if (!e.target.matches(classesToSelector(swiper.params.pagination.bulletClass))) return;
7314      }
7315      if (swiper.navigation && swiper.navigation.prevEl && swiper.navigation.nextEl) {
7316        const prevEls = makeElementsArray(swiper.navigation.prevEl);
7317        const nextEls = makeElementsArray(swiper.navigation.nextEl);
7318        if (nextEls.includes(targetEl)) {
7319          if (!(swiper.isEnd && !swiper.params.loop)) {
7320            swiper.slideNext();
7321          }
7322          if (swiper.isEnd) {
7323            notify(params.lastSlideMessage);
7324          } else {
7325            notify(params.nextSlideMessage);
7326          }
7327        }
7328        if (prevEls.includes(targetEl)) {
7329          if (!(swiper.isBeginning && !swiper.params.loop)) {
7330            swiper.slidePrev();
7331          }
7332          if (swiper.isBeginning) {
7333            notify(params.firstSlideMessage);
7334          } else {
7335            notify(params.prevSlideMessage);
7336          }
7337        }
7338      }
7339      if (swiper.pagination && targetEl.matches(classesToSelector(swiper.params.pagination.bulletClass))) {
7340        targetEl.click();
7341      }
7342    }
7343    function updateNavigation() {
7344      if (swiper.params.loop || swiper.params.rewind || !swiper.navigation) return;
7345      const {
7346        nextEl,
7347        prevEl
7348      } = swiper.navigation;
7349      if (prevEl) {
7350        if (swiper.isBeginning) {
7351          disableEl(prevEl);
7352          makeElNotFocusable(prevEl);
7353        } else {
7354          enableEl(prevEl);
7355          makeElFocusable(prevEl);
7356        }
7357      }
7358      if (nextEl) {
7359        if (swiper.isEnd) {
7360          disableEl(nextEl);
7361          makeElNotFocusable(nextEl);
7362        } else {
7363          enableEl(nextEl);
7364          makeElFocusable(nextEl);
7365        }
7366      }
7367    }
7368    function hasPagination() {
7369      return swiper.pagination && swiper.pagination.bullets && swiper.pagination.bullets.length;
7370    }
7371    function hasClickablePagination() {
7372      return hasPagination() && swiper.params.pagination.clickable;
7373    }
7374    function updatePagination() {
7375      const params = swiper.params.a11y;
7376      if (!hasPagination()) return;
7377      swiper.pagination.bullets.forEach(bulletEl => {
7378        if (swiper.params.pagination.clickable) {
7379          makeElNotFocusable(bulletEl);
7380          if (!swiper.params.pagination.renderBullet) {
7381            addElRole(bulletEl, 'button');
7382            addElLabel(bulletEl, params.paginationBulletMessage.replace(/\{\{index\}\}/, elementIndex(bulletEl) + 1));
7383          }
7384        }
7385        if (bulletEl.matches(classesToSelector(swiper.params.pagination.bulletActiveClass))) {
7386          bulletEl.setAttribute('aria-selected', 'true');
7387        } else {
7388          bulletEl.setAttribute('aria-selected', 'false');
7389        }
7390      });
7391    }
7392    const initNavEl = (el, wrapperId, message) => {
7393      makeElFocusable(el);
7394      if (el.tagName !== 'BUTTON') {
7395        addElRole(el, 'button');
7396        el.addEventListener('keydown', onEnterOrSpaceKey);
7397      }
7398      addElLabel(el, message);
7399      addElControls(el, wrapperId);
7400    };
7401    const handlePointerDown = e => {
7402      if (focusTargetSlideEl && focusTargetSlideEl !== e.target && !focusTargetSlideEl.contains(e.target)) {
7403        preventFocusHandler = true;
7404      }
7405      swiper.a11y.clicked = true;
7406    };
7407    const handlePointerUp = () => {
7408      preventFocusHandler = false;
7409      requestAnimationFrame(() => {
7410        requestAnimationFrame(() => {
7411          if (!swiper.destroyed) {
7412            swiper.a11y.clicked = false;
7413          }
7414        });
7415      });
7416    };
7417    const onVisibilityChange = e => {
7418      visibilityChangedTimestamp = new Date().getTime();
7419    };
7420    const handleFocus = e => {
7421      if (swiper.a11y.clicked || !swiper.params.a11y.scrollOnFocus) return;
7422      if (new Date().getTime() - visibilityChangedTimestamp < 100) return;
7423      const slideEl = e.target.closest(`.${swiper.params.slideClass}, swiper-slide`);
7424      if (!slideEl || !swiper.slides.includes(slideEl)) return;
7425      focusTargetSlideEl = slideEl;
7426      const isActive = swiper.slides.indexOf(slideEl) === swiper.activeIndex;
7427      const isVisible = swiper.params.watchSlidesProgress && swiper.visibleSlides && swiper.visibleSlides.includes(slideEl);
7428      if (isActive || isVisible) return;
7429      if (e.sourceCapabilities && e.sourceCapabilities.firesTouchEvents) return;
7430      if (swiper.isHorizontal()) {
7431        swiper.el.scrollLeft = 0;
7432      } else {
7433        swiper.el.scrollTop = 0;
7434      }
7435      requestAnimationFrame(() => {
7436        if (preventFocusHandler) return;
7437        if (swiper.params.loop) {
7438          swiper.slideToLoop(parseInt(slideEl.getAttribute('data-swiper-slide-index')), 0);
7439        } else {
7440          swiper.slideTo(swiper.slides.indexOf(slideEl), 0);
7441        }
7442        preventFocusHandler = false;
7443      });
7444    };
7445    const initSlides = () => {
7446      const params = swiper.params.a11y;
7447      if (params.itemRoleDescriptionMessage) {
7448        addElRoleDescription(swiper.slides, params.itemRoleDescriptionMessage);
7449      }
7450      if (params.slideRole) {
7451        addElRole(swiper.slides, params.slideRole);
7452      }
7453      const slidesLength = swiper.slides.length;
7454      if (params.slideLabelMessage) {
7455        swiper.slides.forEach((slideEl, index) => {
7456          const slideIndex = swiper.params.loop ? parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10) : index;
7457          const ariaLabelMessage = params.slideLabelMessage.replace(/\{\{index\}\}/, slideIndex + 1).replace(/\{\{slidesLength\}\}/, slidesLength);
7458          addElLabel(slideEl, ariaLabelMessage);
7459        });
7460      }
7461    };
7462    const init = () => {
7463      const params = swiper.params.a11y;
7464      swiper.el.append(liveRegion);
7465
7466      // Container
7467      const containerEl = swiper.el;
7468      if (params.containerRoleDescriptionMessage) {
7469        addElRoleDescription(containerEl, params.containerRoleDescriptionMessage);
7470      }
7471      if (params.containerMessage) {
7472        addElLabel(containerEl, params.containerMessage);
7473      }
7474      if (params.containerRole) {
7475        addElRole(containerEl, params.containerRole);
7476      }
7477			
7478      if (hasReducedMotion.matches) {
7479        swiper.params.autoplay = false;
7480      }
7481
7482      // Wrapper
7483      const wrapperEl = swiper.wrapperEl;
7484      const wrapperId = params.id || wrapperEl.getAttribute('id') || `swiper-wrapper-${getRandomNumber(16)}`;
7485      const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';
7486      addElId(wrapperEl, wrapperId);
7487      addElLive(wrapperEl, live);
7488
7489      // Slide
7490      initSlides();
7491
7492      // Navigation
7493      let {
7494        nextEl,
7495        prevEl
7496      } = swiper.navigation ? swiper.navigation : {};
7497      nextEl = makeElementsArray(nextEl);
7498      prevEl = makeElementsArray(prevEl);
7499      if (nextEl) {
7500        nextEl.forEach(el => initNavEl(el, wrapperId, params.nextSlideMessage));
7501      }
7502      if (prevEl) {
7503        prevEl.forEach(el => initNavEl(el, wrapperId, params.prevSlideMessage));
7504      }
7505
7506      // Pagination
7507      if (hasClickablePagination()) {
7508        const paginationEl = makeElementsArray(swiper.pagination.el);
7509        paginationEl.forEach(el => {
7510          el.addEventListener('keydown', onEnterOrSpaceKey);
7511        });
7512      }
7513
7514      // Tab focus
7515      const document = getDocument();
7516      document.addEventListener('visibilitychange', onVisibilityChange);
7517      swiper.el.addEventListener('focus', handleFocus, true);
7518      swiper.el.addEventListener('focus', handleFocus, true);
7519      swiper.el.addEventListener('pointerdown', handlePointerDown, true);
7520      swiper.el.addEventListener('pointerup', handlePointerUp, true);
7521    };
7522    function destroy() {
7523      if (liveRegion) liveRegion.remove();
7524      let {
7525        nextEl,
7526        prevEl
7527      } = swiper.navigation ? swiper.navigation : {};
7528      nextEl = makeElementsArray(nextEl);
7529      prevEl = makeElementsArray(prevEl);
7530      if (nextEl) {
7531        nextEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
7532      }
7533      if (prevEl) {
7534        prevEl.forEach(el => el.removeEventListener('keydown', onEnterOrSpaceKey));
7535      }
7536
7537      // Pagination
7538      if (hasClickablePagination()) {
7539        const paginationEl = makeElementsArray(swiper.pagination.el);
7540        paginationEl.forEach(el => {
7541          el.removeEventListener('keydown', onEnterOrSpaceKey);
7542        });
7543      }
7544      const document = getDocument();
7545      document.removeEventListener('visibilitychange', onVisibilityChange);
7546      // Tab focus
7547      if (swiper.el && typeof swiper.el !== 'string') {
7548        swiper.el.removeEventListener('focus', handleFocus, true);
7549        swiper.el.removeEventListener('pointerdown', handlePointerDown, true);
7550        swiper.el.removeEventListener('pointerup', handlePointerUp, true);
7551      }
7552    }
7553    on('beforeInit', () => {
7554      liveRegion = createElement('span', swiper.params.a11y.notificationClass);
7555      liveRegion.setAttribute('aria-live', 'assertive');
7556      liveRegion.setAttribute('aria-atomic', 'true');
7557    });
7558    on('afterInit', () => {
7559      if (!swiper.params.a11y.enabled) return;
7560      init();
7561    });
7562    on('slidesLengthChange snapGridLengthChange slidesGridLengthChange', () => {
7563      if (!swiper.params.a11y.enabled) return;
7564      initSlides();
7565    });
7566    on('fromEdge toEdge afterInit lock unlock', () => {
7567      if (!swiper.params.a11y.enabled) return;
7568      updateNavigation();
7569    });
7570    on('paginationUpdate', () => {
7571      if (!swiper.params.a11y.enabled) return;
7572      updatePagination();
7573    });
7574    on('destroy', () => {
7575      if (!swiper.params.a11y.enabled) return;
7576      destroy();
7577    });
7578  }
7579
7580  function History(_ref) {
7581    let {
7582      swiper,
7583      extendParams,
7584      on
7585    } = _ref;
7586    extendParams({
7587      history: {
7588        enabled: false,
7589        root: '',
7590        replaceState: false,
7591        key: 'slides',
7592        keepQuery: false
7593      }
7594    });
7595    let initialized = false;
7596    let paths = {};
7597    const slugify = text => {
7598      return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
7599    };
7600    const getPathValues = urlOverride => {
7601      const window = getWindow();
7602      let location;
7603      if (urlOverride) {
7604        location = new URL(urlOverride);
7605      } else {
7606        location = window.location;
7607      }
7608      const pathArray = location.pathname.slice(1).split('/').filter(part => part !== '');
7609      const total = pathArray.length;
7610      const key = pathArray[total - 2];
7611      const value = pathArray[total - 1];
7612      return {
7613        key,
7614        value
7615      };
7616    };
7617    const setHistory = (key, index) => {
7618      const window = getWindow();
7619      if (!initialized || !swiper.params.history.enabled) return;
7620      let location;
7621      if (swiper.params.url) {
7622        location = new URL(swiper.params.url);
7623      } else {
7624        location = window.location;
7625      }
7626      const slide = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${index}"]`) : swiper.slides[index];
7627      let value = slugify(slide.getAttribute('data-history'));
7628      if (swiper.params.history.root.length > 0) {
7629        let root = swiper.params.history.root;
7630        if (root[root.length - 1] === '/') root = root.slice(0, root.length - 1);
7631        value = `${root}/${key ? `${key}/` : ''}${value}`;
7632      } else if (!location.pathname.includes(key)) {
7633        value = `${key ? `${key}/` : ''}${value}`;
7634      }
7635      if (swiper.params.history.keepQuery) {
7636        value += location.search;
7637      }
7638      const currentState = window.history.state;
7639      if (currentState && currentState.value === value) {
7640        return;
7641      }
7642      if (swiper.params.history.replaceState) {
7643        window.history.replaceState({
7644          value
7645        }, null, value);
7646      } else {
7647        window.history.pushState({
7648          value
7649        }, null, value);
7650      }
7651    };
7652    const scrollToSlide = (speed, value, runCallbacks) => {
7653      if (value) {
7654        for (let i = 0, length = swiper.slides.length; i < length; i += 1) {
7655          const slide = swiper.slides[i];
7656          const slideHistory = slugify(slide.getAttribute('data-history'));
7657          if (slideHistory === value) {
7658            const index = swiper.getSlideIndex(slide);
7659            swiper.slideTo(index, speed, runCallbacks);
7660          }
7661        }
7662      } else {
7663        swiper.slideTo(0, speed, runCallbacks);
7664      }
7665    };
7666    const setHistoryPopState = () => {
7667      paths = getPathValues(swiper.params.url);
7668      scrollToSlide(swiper.params.speed, paths.value, false);
7669    };
7670    const init = () => {
7671      const window = getWindow();
7672      if (!swiper.params.history) return;
7673      if (!window.history || !window.history.pushState) {
7674        swiper.params.history.enabled = false;
7675        swiper.params.hashNavigation.enabled = true;
7676        return;
7677      }
7678      initialized = true;
7679      paths = getPathValues(swiper.params.url);
7680      if (!paths.key && !paths.value) {
7681        if (!swiper.params.history.replaceState) {
7682          window.addEventListener('popstate', setHistoryPopState);
7683        }
7684        return;
7685      }
7686      scrollToSlide(0, paths.value, swiper.params.runCallbacksOnInit);
7687      if (!swiper.params.history.replaceState) {
7688        window.addEventListener('popstate', setHistoryPopState);
7689      }
7690    };
7691    const destroy = () => {
7692      const window = getWindow();
7693      if (!swiper.params.history.replaceState) {
7694        window.removeEventListener('popstate', setHistoryPopState);
7695      }
7696    };
7697    on('init', () => {
7698      if (swiper.params.history.enabled) {
7699        init();
7700      }
7701    });
7702    on('destroy', () => {
7703      if (swiper.params.history.enabled) {
7704        destroy();
7705      }
7706    });
7707    on('transitionEnd _freeModeNoMomentumRelease', () => {
7708      if (initialized) {
7709        setHistory(swiper.params.history.key, swiper.activeIndex);
7710      }
7711    });
7712    on('slideChange', () => {
7713      if (initialized && swiper.params.cssMode) {
7714        setHistory(swiper.params.history.key, swiper.activeIndex);
7715      }
7716    });
7717  }
7718
7719  function HashNavigation(_ref) {
7720    let {
7721      swiper,
7722      extendParams,
7723      emit,
7724      on
7725    } = _ref;
7726    let initialized = false;
7727    const document = getDocument();
7728    const window = getWindow();
7729    extendParams({
7730      hashNavigation: {
7731        enabled: false,
7732        replaceState: false,
7733        watchState: false,
7734        getSlideIndex(_s, hash) {
7735          if (swiper.virtual && swiper.params.virtual.enabled) {
7736            const slideWithHash = swiper.slides.filter(slideEl => slideEl.getAttribute('data-hash') === hash)[0];
7737            if (!slideWithHash) return 0;
7738            const index = parseInt(slideWithHash.getAttribute('data-swiper-slide-index'), 10);
7739            return index;
7740          }
7741          return swiper.getSlideIndex(elementChildren(swiper.slidesEl, `.${swiper.params.slideClass}[data-hash="${hash}"], swiper-slide[data-hash="${hash}"]`)[0]);
7742        }
7743      }
7744    });
7745    const onHashChange = () => {
7746      emit('hashChange');
7747      const newHash = document.location.hash.replace('#', '');
7748      const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
7749      const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') : '';
7750      if (newHash !== activeSlideHash) {
7751        const newIndex = swiper.params.hashNavigation.getSlideIndex(swiper, newHash);
7752        if (typeof newIndex === 'undefined' || Number.isNaN(newIndex)) return;
7753        swiper.slideTo(newIndex);
7754      }
7755    };
7756    const setHash = () => {
7757      if (!initialized || !swiper.params.hashNavigation.enabled) return;
7758      const activeSlideEl = swiper.virtual && swiper.params.virtual.enabled ? swiper.slidesEl.querySelector(`[data-swiper-slide-index="${swiper.activeIndex}"]`) : swiper.slides[swiper.activeIndex];
7759      const activeSlideHash = activeSlideEl ? activeSlideEl.getAttribute('data-hash') || activeSlideEl.getAttribute('data-history') : '';
7760      if (swiper.params.hashNavigation.replaceState && window.history && window.history.replaceState) {
7761        window.history.replaceState(null, null, `#${activeSlideHash}` || '');
7762        emit('hashSet');
7763      } else {
7764        document.location.hash = activeSlideHash || '';
7765        emit('hashSet');
7766      }
7767    };
7768    const init = () => {
7769      if (!swiper.params.hashNavigation.enabled || swiper.params.history && swiper.params.history.enabled) return;
7770      initialized = true;
7771      const hash = document.location.hash.replace('#', '');
7772      if (hash) {
7773        const speed = 0;
7774        const index = swiper.params.hashNavigation.getSlideIndex(swiper, hash);
7775        swiper.slideTo(index || 0, speed, swiper.params.runCallbacksOnInit, true);
7776      }
7777      if (swiper.params.hashNavigation.watchState) {
7778        window.addEventListener('hashchange', onHashChange);
7779      }
7780    };
7781    const destroy = () => {
7782      if (swiper.params.hashNavigation.watchState) {
7783        window.removeEventListener('hashchange', onHashChange);
7784      }
7785    };
7786    on('init', () => {
7787      if (swiper.params.hashNavigation.enabled) {
7788        init();
7789      }
7790    });
7791    on('destroy', () => {
7792      if (swiper.params.hashNavigation.enabled) {
7793        destroy();
7794      }
7795    });
7796    on('transitionEnd _freeModeNoMomentumRelease', () => {
7797      if (initialized) {
7798        setHash();
7799      }
7800    });
7801    on('slideChange', () => {
7802      if (initialized && swiper.params.cssMode) {
7803        setHash();
7804      }
7805    });
7806  }
7807
7808  /* eslint no-underscore-dangle: "off" */
7809  /* eslint no-use-before-define: "off" */
7810  function Autoplay(_ref) {
7811    let {
7812      swiper,
7813      extendParams,
7814      on,
7815      emit,
7816      params
7817    } = _ref;
7818    swiper.autoplay = {
7819      running: false,
7820      paused: false,
7821      timeLeft: 0
7822    };
7823    extendParams({
7824      autoplay: {
7825        enabled: false,
7826        delay: 3000,
7827        waitForTransition: true,
7828        disableOnInteraction: false,
7829        stopOnLastSlide: false,
7830        reverseDirection: false,
7831        pauseOnMouseEnter: false
7832      }
7833    });
7834    let timeout;
7835    let raf;
7836    let autoplayDelayTotal = params && params.autoplay ? params.autoplay.delay : 3000;
7837    let autoplayDelayCurrent = params && params.autoplay ? params.autoplay.delay : 3000;
7838    let autoplayTimeLeft;
7839    let autoplayStartTime = new Date().getTime();
7840    let wasPaused;
7841    let isTouched;
7842    let pausedByTouch;
7843    let touchStartTimeout;
7844    let slideChanged;
7845    let pausedByInteraction;
7846    let pausedByPointerEnter;
7847    function onTransitionEnd(e) {
7848      if (!swiper || swiper.destroyed || !swiper.wrapperEl) return;
7849      if (e.target !== swiper.wrapperEl) return;
7850      swiper.wrapperEl.removeEventListener('transitionend', onTransitionEnd);
7851      if (pausedByPointerEnter || e.detail && e.detail.bySwiperTouchMove) {
7852        return;
7853      }
7854      resume();
7855    }
7856    const calcTimeLeft = () => {
7857      if (swiper.destroyed || !swiper.autoplay.running) return;
7858      if (swiper.autoplay.paused) {
7859        wasPaused = true;
7860      } else if (wasPaused) {
7861        autoplayDelayCurrent = autoplayTimeLeft;
7862        wasPaused = false;
vendor: 4,427 bytes, lines 7863-7982
7863      }
7864      const timeLeft = swiper.autoplay.paused ? autoplayTimeLeft : autoplayStartTime + autoplayDelayCurrent - new Date().getTime();
7865      swiper.autoplay.timeLeft = timeLeft;
7866      emit('autoplayTimeLeft', timeLeft, timeLeft / autoplayDelayTotal);
7867      raf = requestAnimationFrame(() => {
7868        calcTimeLeft();
7869      });
7870    };
7871    const getSlideDelay = () => {
7872      let activeSlideEl;
7873      if (swiper.virtual && swiper.params.virtual.enabled) {
7874        activeSlideEl = swiper.slides.filter(slideEl => slideEl.classList.contains('swiper-slide-active'))[0];
7875      } else {
7876        activeSlideEl = swiper.slides[swiper.activeIndex];
7877      }
7878      if (!activeSlideEl) return undefined;
7879      const currentSlideDelay = parseInt(activeSlideEl.getAttribute('data-swiper-autoplay'), 10);
7880      return currentSlideDelay;
7881    };
7882    const run = delayForce => {
7883      if (swiper.destroyed || !swiper.autoplay.running) return;
7884      cancelAnimationFrame(raf);
7885      calcTimeLeft();
7886      let delay = typeof delayForce === 'undefined' ? swiper.params.autoplay.delay : delayForce;
7887      autoplayDelayTotal = swiper.params.autoplay.delay;
7888      autoplayDelayCurrent = swiper.params.autoplay.delay;
7889      const currentSlideDelay = getSlideDelay();
7890      if (!Number.isNaN(currentSlideDelay) && currentSlideDelay > 0 && typeof delayForce === 'undefined') {
7891        delay = currentSlideDelay;
7892        autoplayDelayTotal = currentSlideDelay;
7893        autoplayDelayCurrent = currentSlideDelay;
7894      }
7895      autoplayTimeLeft = delay;
7896      const speed = swiper.params.speed;
7897      const proceed = () => {
7898        if (!swiper || swiper.destroyed) return;
7899        if (swiper.params.autoplay.reverseDirection) {
7900          if (!swiper.isBeginning || swiper.params.loop || swiper.params.rewind) {
7901            swiper.slidePrev(speed, true, true);
7902            emit('autoplay');
7903          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7904            swiper.slideTo(swiper.slides.length - 1, speed, true, true);
7905            emit('autoplay');
7906          }
7907        } else {
7908          if (!swiper.isEnd || swiper.params.loop || swiper.params.rewind) {
7909            swiper.slideNext(speed, true, true);
7910            emit('autoplay');
7911          } else if (!swiper.params.autoplay.stopOnLastSlide) {
7912            swiper.slideTo(0, speed, true, true);
7913            emit('autoplay');
7914          }
7915        }
7916        if (swiper.params.cssMode) {
7917          autoplayStartTime = new Date().getTime();
7918          requestAnimationFrame(() => {
7919            run();
7920          });
7921        }
7922      };
7923      if (delay > 0) {
7924        clearTimeout(timeout);
7925        timeout = setTimeout(() => {
7926          proceed();
7927        }, delay);
7928      } else {
7929        requestAnimationFrame(() => {
7930          proceed();
7931        });
7932      }
7933
7934      // eslint-disable-next-line
7935      return delay;
7936    };
7937    const start = () => {
7938      autoplayStartTime = new Date().getTime();
7939      swiper.autoplay.running = true;
7940      run();
7941      emit('autoplayStart');
7942    };
7943    const stop = () => {
7944      swiper.autoplay.running = false;
7945      clearTimeout(timeout);
7946      cancelAnimationFrame(raf);
7947      emit('autoplayStop');
7948    };
7949    const pause = (internal, reset) => {
7950      if (swiper.destroyed || !swiper.autoplay.running) return;
7951      clearTimeout(timeout);
7952      if (!internal) {
7953        pausedByInteraction = true;
7954      }
7955      const proceed = () => {
7956        emit('autoplayPause');
7957        if (swiper.params.autoplay.waitForTransition) {
7958          swiper.wrapperEl.addEventListener('transitionend', onTransitionEnd);
7959        } else {
7960          resume();
7961        }
7962      };
7963      swiper.autoplay.paused = true;
7964      if (reset) {
7965        if (slideChanged) {
7966          autoplayTimeLeft = swiper.params.autoplay.delay;
7967        }
7968        slideChanged = false;
7969        proceed();
7970        return;
7971      }
7972      const delay = autoplayTimeLeft || swiper.params.autoplay.delay;
7973      autoplayTimeLeft = delay - (new Date().getTime() - autoplayStartTime);
7974      if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop) return;
7975      if (autoplayTimeLeft < 0) autoplayTimeLeft = 0;
7976      proceed();
7977    };
7978    const resume = () => {
7979      if (swiper.isEnd && autoplayTimeLeft < 0 && !swiper.params.loop || swiper.destroyed || !swiper.autoplay.running) return;
7980      autoplayStartTime = new Date().getTime();
7981      if (pausedByInteraction) {
7982        pausedByInteraction = false;
vendor: 20,091 bytes, lines 7983-8543
7983        run(autoplayTimeLeft);
7984      } else {
7985        run();
7986      }
7987      swiper.autoplay.paused = false;
7988      emit('autoplayResume');
7989    };
7990    const onVisibilityChange = () => {
7991      if (swiper.destroyed || !swiper.autoplay.running) return;
7992      const document = getDocument();
7993      if (document.visibilityState === 'hidden') {
7994        pausedByInteraction = true;
7995        pause(true);
7996      }
7997      if (document.visibilityState === 'visible') {
7998        resume();
7999      }
8000    };
8001    const onPointerEnter = e => {
8002      if (e.pointerType !== 'mouse') return;
8003      pausedByInteraction = true;
8004      pausedByPointerEnter = true;
8005      if (swiper.animating || swiper.autoplay.paused) return;
8006      pause(true);
8007    };
8008    const onPointerLeave = e => {
8009      if (e.pointerType !== 'mouse') return;
8010      pausedByPointerEnter = false;
8011      if (swiper.autoplay.paused) {
8012        resume();
8013      }
8014    };
8015    const attachMouseEvents = () => {
8016      if (swiper.params.autoplay.pauseOnMouseEnter) {
8017        swiper.el.addEventListener('pointerenter', onPointerEnter);
8018        swiper.el.addEventListener('pointerleave', onPointerLeave);
8019      }
8020    };
8021    const detachMouseEvents = () => {
8022      if (swiper.el && typeof swiper.el !== 'string') {
8023        swiper.el.removeEventListener('pointerenter', onPointerEnter);
8024        swiper.el.removeEventListener('pointerleave', onPointerLeave);
8025      }
8026    };
8027    const attachDocumentEvents = () => {
8028      const document = getDocument();
8029      document.addEventListener('visibilitychange', onVisibilityChange);
8030    };
8031    const detachDocumentEvents = () => {
8032      const document = getDocument();
8033      document.removeEventListener('visibilitychange', onVisibilityChange);
8034    };
8035    on('init', () => {
8036      if (swiper.params.autoplay.enabled) {
8037        attachMouseEvents();
8038        attachDocumentEvents();
8039        start();
8040      }
8041    });
8042    on('destroy', () => {
8043      detachMouseEvents();
8044      detachDocumentEvents();
8045      if (swiper.autoplay.running) {
8046        stop();
8047      }
8048    });
8049    on('_freeModeStaticRelease', () => {
8050      if (pausedByTouch || pausedByInteraction) {
8051        resume();
8052      }
8053    });
8054    on('_freeModeNoMomentumRelease', () => {
8055      if (!swiper.params.autoplay.disableOnInteraction) {
8056        pause(true, true);
8057      } else {
8058        stop();
8059      }
8060    });
8061    on('beforeTransitionStart', (_s, speed, internal) => {
8062      if (swiper.destroyed || !swiper.autoplay.running) return;
8063      if (internal || !swiper.params.autoplay.disableOnInteraction) {
8064        pause(true, true);
8065      } else {
8066        stop();
8067      }
8068    });
8069    on('sliderFirstMove', () => {
8070      if (swiper.destroyed || !swiper.autoplay.running) return;
8071      if (swiper.params.autoplay.disableOnInteraction) {
8072        stop();
8073        return;
8074      }
8075      isTouched = true;
8076      pausedByTouch = false;
8077      pausedByInteraction = false;
8078      touchStartTimeout = setTimeout(() => {
8079        pausedByInteraction = true;
8080        pausedByTouch = true;
8081        pause(true);
8082      }, 200);
8083    });
8084    on('touchEnd', () => {
8085      if (swiper.destroyed || !swiper.autoplay.running || !isTouched) return;
8086      clearTimeout(touchStartTimeout);
8087      clearTimeout(timeout);
8088      if (swiper.params.autoplay.disableOnInteraction) {
8089        pausedByTouch = false;
8090        isTouched = false;
8091        return;
8092      }
8093      if (pausedByTouch && swiper.params.cssMode) resume();
8094      pausedByTouch = false;
8095      isTouched = false;
8096    });
8097    on('slideChange', () => {
8098      if (swiper.destroyed || !swiper.autoplay.running) return;
8099      slideChanged = true;
8100    });
8101    Object.assign(swiper.autoplay, {
8102      start,
8103      stop,
8104      pause,
8105      resume
8106    });
8107  }
8108
8109  function Thumb(_ref) {
8110    let {
8111      swiper,
8112      extendParams,
8113      on
8114    } = _ref;
8115    extendParams({
8116      thumbs: {
8117        swiper: null,
8118        multipleActiveThumbs: true,
8119        autoScrollOffset: 0,
8120        slideThumbActiveClass: 'swiper-slide-thumb-active',
8121        thumbsContainerClass: 'swiper-thumbs'
8122      }
8123    });
8124    let initialized = false;
8125    let swiperCreated = false;
8126    swiper.thumbs = {
8127      swiper: null
8128    };
8129    function onThumbClick() {
8130      const thumbsSwiper = swiper.thumbs.swiper;
8131      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8132      const clickedIndex = thumbsSwiper.clickedIndex;
8133      const clickedSlide = thumbsSwiper.clickedSlide;
8134      if (clickedSlide && clickedSlide.classList.contains(swiper.params.thumbs.slideThumbActiveClass)) return;
8135      if (typeof clickedIndex === 'undefined' || clickedIndex === null) return;
8136      let slideToIndex;
8137      if (thumbsSwiper.params.loop) {
8138        slideToIndex = parseInt(thumbsSwiper.clickedSlide.getAttribute('data-swiper-slide-index'), 10);
8139      } else {
8140        slideToIndex = clickedIndex;
8141      }
8142      if (swiper.params.loop) {
8143        swiper.slideToLoop(slideToIndex);
8144      } else {
8145        swiper.slideTo(slideToIndex);
8146      }
8147    }
8148    function init() {
8149      const {
8150        thumbs: thumbsParams
8151      } = swiper.params;
8152      if (initialized) return false;
8153      initialized = true;
8154      const SwiperClass = swiper.constructor;
8155      if (thumbsParams.swiper instanceof SwiperClass) {
8156        swiper.thumbs.swiper = thumbsParams.swiper;
8157        Object.assign(swiper.thumbs.swiper.originalParams, {
8158          watchSlidesProgress: true,
8159          slideToClickedSlide: false
8160        });
8161        Object.assign(swiper.thumbs.swiper.params, {
8162          watchSlidesProgress: true,
8163          slideToClickedSlide: false
8164        });
8165        swiper.thumbs.swiper.update();
8166      } else if (isObject(thumbsParams.swiper)) {
8167        const thumbsSwiperParams = Object.assign({}, thumbsParams.swiper);
8168        Object.assign(thumbsSwiperParams, {
8169          watchSlidesProgress: true,
8170          slideToClickedSlide: false
8171        });
8172        swiper.thumbs.swiper = new SwiperClass(thumbsSwiperParams);
8173        swiperCreated = true;
8174      }
8175      swiper.thumbs.swiper.el.classList.add(swiper.params.thumbs.thumbsContainerClass);
8176      swiper.thumbs.swiper.on('tap', onThumbClick);
8177      return true;
8178    }
8179    function update(initial) {
8180      const thumbsSwiper = swiper.thumbs.swiper;
8181      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8182      const slidesPerView = thumbsSwiper.params.slidesPerView === 'auto' ? thumbsSwiper.slidesPerViewDynamic() : thumbsSwiper.params.slidesPerView;
8183
8184      // Activate thumbs
8185      let thumbsToActivate = 1;
8186      const thumbActiveClass = swiper.params.thumbs.slideThumbActiveClass;
8187      if (swiper.params.slidesPerView > 1 && !swiper.params.centeredSlides) {
8188        thumbsToActivate = swiper.params.slidesPerView;
8189      }
8190      if (!swiper.params.thumbs.multipleActiveThumbs) {
8191        thumbsToActivate = 1;
8192      }
8193      thumbsToActivate = Math.floor(thumbsToActivate);
8194      thumbsSwiper.slides.forEach(slideEl => slideEl.classList.remove(thumbActiveClass));
8195      if (thumbsSwiper.params.loop || thumbsSwiper.params.virtual && thumbsSwiper.params.virtual.enabled) {
8196        for (let i = 0; i < thumbsToActivate; i += 1) {
8197          elementChildren(thumbsSwiper.slidesEl, `[data-swiper-slide-index="${swiper.realIndex + i}"]`).forEach(slideEl => {
8198            slideEl.classList.add(thumbActiveClass);
8199          });
8200        }
8201      } else {
8202        for (let i = 0; i < thumbsToActivate; i += 1) {
8203          if (thumbsSwiper.slides[swiper.realIndex + i]) {
8204            thumbsSwiper.slides[swiper.realIndex + i].classList.add(thumbActiveClass);
8205          }
8206        }
8207      }
8208      const autoScrollOffset = swiper.params.thumbs.autoScrollOffset;
8209      const useOffset = autoScrollOffset && !thumbsSwiper.params.loop;
8210      if (swiper.realIndex !== thumbsSwiper.realIndex || useOffset) {
8211        const currentThumbsIndex = thumbsSwiper.activeIndex;
8212        let newThumbsIndex;
8213        let direction;
8214        if (thumbsSwiper.params.loop) {
8215          const newThumbsSlide = thumbsSwiper.slides.filter(slideEl => slideEl.getAttribute('data-swiper-slide-index') === `${swiper.realIndex}`)[0];
8216          newThumbsIndex = thumbsSwiper.slides.indexOf(newThumbsSlide);
8217          direction = swiper.activeIndex > swiper.previousIndex ? 'next' : 'prev';
8218        } else {
8219          newThumbsIndex = swiper.realIndex;
8220          direction = newThumbsIndex > swiper.previousIndex ? 'next' : 'prev';
8221        }
8222        if (useOffset) {
8223          newThumbsIndex += direction === 'next' ? autoScrollOffset : -1 * autoScrollOffset;
8224        }
8225        if (thumbsSwiper.visibleSlidesIndexes && thumbsSwiper.visibleSlidesIndexes.indexOf(newThumbsIndex) < 0) {
8226          if (thumbsSwiper.params.centeredSlides) {
8227            if (newThumbsIndex > currentThumbsIndex) {
8228              newThumbsIndex = newThumbsIndex - Math.floor(slidesPerView / 2) + 1;
8229            } else {
8230              newThumbsIndex = newThumbsIndex + Math.floor(slidesPerView / 2) - 1;
8231            }
8232          } else if (newThumbsIndex > currentThumbsIndex && thumbsSwiper.params.slidesPerGroup === 1) ;
8233          thumbsSwiper.slideTo(newThumbsIndex, initial ? 0 : undefined);
8234        }
8235      }
8236    }
8237    on('beforeInit', () => {
8238      const {
8239        thumbs
8240      } = swiper.params;
8241      if (!thumbs || !thumbs.swiper) return;
8242      if (typeof thumbs.swiper === 'string' || thumbs.swiper instanceof HTMLElement) {
8243        const document = getDocument();
8244        const getThumbsElementAndInit = () => {
8245          const thumbsElement = typeof thumbs.swiper === 'string' ? document.querySelector(thumbs.swiper) : thumbs.swiper;
8246          if (thumbsElement && thumbsElement.swiper) {
8247            thumbs.swiper = thumbsElement.swiper;
8248            init();
8249            update(true);
8250          } else if (thumbsElement) {
8251            const eventName = `${swiper.params.eventsPrefix}init`;
8252            const onThumbsSwiper = e => {
8253              thumbs.swiper = e.detail[0];
8254              thumbsElement.removeEventListener(eventName, onThumbsSwiper);
8255              init();
8256              update(true);
8257              thumbs.swiper.update();
8258              swiper.update();
8259            };
8260            thumbsElement.addEventListener(eventName, onThumbsSwiper);
8261          }
8262          return thumbsElement;
8263        };
8264        const watchForThumbsToAppear = () => {
8265          if (swiper.destroyed) return;
8266          const thumbsElement = getThumbsElementAndInit();
8267          if (!thumbsElement) {
8268            requestAnimationFrame(watchForThumbsToAppear);
8269          }
8270        };
8271        requestAnimationFrame(watchForThumbsToAppear);
8272      } else {
8273        init();
8274        update(true);
8275      }
8276    });
8277    on('slideChange update resize observerUpdate', () => {
8278      update();
8279    });
8280    on('setTransition', (_s, duration) => {
8281      const thumbsSwiper = swiper.thumbs.swiper;
8282      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8283      thumbsSwiper.setTransition(duration);
8284    });
8285    on('beforeDestroy', () => {
8286      const thumbsSwiper = swiper.thumbs.swiper;
8287      if (!thumbsSwiper || thumbsSwiper.destroyed) return;
8288      if (swiperCreated) {
8289        thumbsSwiper.destroy();
8290      }
8291    });
8292    Object.assign(swiper.thumbs, {
8293      init,
8294      update
8295    });
8296  }
8297
8298  function freeMode(_ref) {
8299    let {
8300      swiper,
8301      extendParams,
8302      emit,
8303      once
8304    } = _ref;
8305    extendParams({
8306      freeMode: {
8307        enabled: false,
8308        momentum: true,
8309        momentumRatio: 1,
8310        momentumBounce: true,
8311        momentumBounceRatio: 1,
8312        momentumVelocityRatio: 1,
8313        sticky: false,
8314        minimumVelocity: 0.02
8315      }
8316    });
8317    function onTouchStart() {
8318      if (swiper.params.cssMode) return;
8319      const translate = swiper.getTranslate();
8320      swiper.setTranslate(translate);
8321      swiper.setTransition(0);
8322      swiper.touchEventsData.velocities.length = 0;
8323      swiper.freeMode.onTouchEnd({
8324        currentPos: swiper.rtl ? swiper.translate : -swiper.translate
8325      });
8326    }
8327    function onTouchMove() {
8328      if (swiper.params.cssMode) return;
8329      const {
8330        touchEventsData: data,
8331        touches
8332      } = swiper;
8333      // Velocity
8334      if (data.velocities.length === 0) {
8335        data.velocities.push({
8336          position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
8337          time: data.touchStartTime
8338        });
8339      }
8340      data.velocities.push({
8341        position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
8342        time: now()
8343      });
8344    }
8345    function onTouchEnd(_ref2) {
8346      let {
8347        currentPos
8348      } = _ref2;
8349      if (swiper.params.cssMode) return;
8350      const {
8351        params,
8352        wrapperEl,
8353        rtlTranslate: rtl,
8354        snapGrid,
8355        touchEventsData: data
8356      } = swiper;
8357      // Time diff
8358      const touchEndTime = now();
8359      const timeDiff = touchEndTime - data.touchStartTime;
8360      if (currentPos < -swiper.minTranslate()) {
8361        swiper.slideTo(swiper.activeIndex);
8362        return;
8363      }
8364      if (currentPos > -swiper.maxTranslate()) {
8365        if (swiper.slides.length < snapGrid.length) {
8366          swiper.slideTo(snapGrid.length - 1);
8367        } else {
8368          swiper.slideTo(swiper.slides.length - 1);
8369        }
8370        return;
8371      }
8372      if (params.freeMode.momentum) {
8373        if (data.velocities.length > 1) {
8374          const lastMoveEvent = data.velocities.pop();
8375          const velocityEvent = data.velocities.pop();
8376          const distance = lastMoveEvent.position - velocityEvent.position;
8377          const time = lastMoveEvent.time - velocityEvent.time;
8378          swiper.velocity = distance / time;
8379          swiper.velocity /= 2;
8380          if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {
8381            swiper.velocity = 0;
8382          }
8383          // this implies that the user stopped moving a finger then released.
8384          // There would be no events with distance zero, so the last event is stale.
8385          if (time > 150 || now() - lastMoveEvent.time > 300) {
8386            swiper.velocity = 0;
8387          }
8388        } else {
8389          swiper.velocity = 0;
8390        }
8391        swiper.velocity *= params.freeMode.momentumVelocityRatio;
8392        data.velocities.length = 0;
8393        let momentumDuration = 1000 * params.freeMode.momentumRatio;
8394        const momentumDistance = swiper.velocity * momentumDuration;
8395        let newPosition = swiper.translate + momentumDistance;
8396        if (rtl) newPosition = -newPosition;
8397        let doBounce = false;
8398        let afterBouncePosition;
8399        const bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;
8400        let needsLoopFix;
8401        if (newPosition < swiper.maxTranslate()) {
8402          if (params.freeMode.momentumBounce) {
8403            if (newPosition + swiper.maxTranslate() < -bounceAmount) {
8404              newPosition = swiper.maxTranslate() - bounceAmount;
8405            }
8406            afterBouncePosition = swiper.maxTranslate();
8407            doBounce = true;
8408            data.allowMomentumBounce = true;
8409          } else {
8410            newPosition = swiper.maxTranslate();
8411          }
8412          if (params.loop && params.centeredSlides) needsLoopFix = true;
8413        } else if (newPosition > swiper.minTranslate()) {
8414          if (params.freeMode.momentumBounce) {
8415            if (newPosition - swiper.minTranslate() > bounceAmount) {
8416              newPosition = swiper.minTranslate() + bounceAmount;
8417            }
8418            afterBouncePosition = swiper.minTranslate();
8419            doBounce = true;
8420            data.allowMomentumBounce = true;
8421          } else {
8422            newPosition = swiper.minTranslate();
8423          }
8424          if (params.loop && params.centeredSlides) needsLoopFix = true;
8425        } else if (params.freeMode.sticky) {
8426          let nextSlide;
8427          for (let j = 0; j < snapGrid.length; j += 1) {
8428            if (snapGrid[j] > -newPosition) {
8429              nextSlide = j;
8430              break;
8431            }
8432          }
8433          if (Math.abs(snapGrid[nextSlide] - newPosition) < Math.abs(snapGrid[nextSlide - 1] - newPosition) || swiper.swipeDirection === 'next') {
8434            newPosition = snapGrid[nextSlide];
8435          } else {
8436            newPosition = snapGrid[nextSlide - 1];
8437          }
8438          newPosition = -newPosition;
8439        }
8440        if (needsLoopFix) {
8441          once('transitionEnd', () => {
8442            swiper.loopFix();
8443          });
8444        }
8445        // Fix duration
8446        if (swiper.velocity !== 0) {
8447          if (rtl) {
8448            momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
8449          } else {
8450            momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
8451          }
8452          if (params.freeMode.sticky) {
8453            // If freeMode.sticky is active and the user ends a swipe with a slow-velocity
8454            // event, then durations can be 20+ seconds to slide one (or zero!) slides.
8455            // It's easy to see this when simulating touch with mouse events. To fix this,
8456            // limit single-slide swipes to the default slide duration. This also has the
8457            // nice side effect of matching slide speed if the user stopped moving before
8458            // lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
8459            // For faster swipes, also apply limits (albeit higher ones).
8460            const moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
8461            const currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
8462            if (moveDistance < currentSlideSize) {
8463              momentumDuration = params.speed;
8464            } else if (moveDistance < 2 * currentSlideSize) {
8465              momentumDuration = params.speed * 1.5;
8466            } else {
8467              momentumDuration = params.speed * 2.5;
8468            }
8469          }
8470        } else if (params.freeMode.sticky) {
8471          swiper.slideToClosest();
8472          return;
8473        }
8474        if (params.freeMode.momentumBounce && doBounce) {
8475          swiper.updateProgress(afterBouncePosition);
8476          swiper.setTransition(momentumDuration);
8477          swiper.setTranslate(newPosition);
8478          swiper.transitionStart(true, swiper.swipeDirection);
8479          swiper.animating = true;
8480          elementTransitionEnd(wrapperEl, () => {
8481            if (!swiper || swiper.destroyed || !data.allowMomentumBounce) return;
8482            emit('momentumBounce');
8483            swiper.setTransition(params.speed);
8484            setTimeout(() => {
8485              swiper.setTranslate(afterBouncePosition);
8486              elementTransitionEnd(wrapperEl, () => {
8487                if (!swiper || swiper.destroyed) return;
8488                swiper.transitionEnd();
8489              });
8490            }, 0);
8491          });
8492        } else if (swiper.velocity) {
8493          emit('_freeModeNoMomentumRelease');
8494          swiper.updateProgress(newPosition);
8495          swiper.setTransition(momentumDuration);
8496          swiper.setTranslate(newPosition);
8497          swiper.transitionStart(true, swiper.swipeDirection);
8498          if (!swiper.animating) {
8499            swiper.animating = true;
8500            elementTransitionEnd(wrapperEl, () => {
8501              if (!swiper || swiper.destroyed) return;
8502              swiper.transitionEnd();
8503            });
8504          }
8505        } else {
8506          swiper.updateProgress(newPosition);
8507        }
8508        swiper.updateActiveIndex();
8509        swiper.updateSlidesClasses();
8510      } else if (params.freeMode.sticky) {
8511        swiper.slideToClosest();
8512        return;
8513      } else if (params.freeMode) {
8514        emit('_freeModeNoMomentumRelease');
8515      }
8516      if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {
8517        emit('_freeModeStaticRelease');
8518        swiper.updateProgress();
8519        swiper.updateActiveIndex();
8520        swiper.updateSlidesClasses();
8521      }
8522    }
8523    Object.assign(swiper, {
8524      freeMode: {
8525        onTouchStart,
8526        onTouchMove,
8527        onTouchEnd
8528      }
8529    });
8530  }
8531
8532  function Grid(_ref) {
8533    let {
8534      swiper,
8535      extendParams,
8536      on
8537    } = _ref;
8538    extendParams({
8539      grid: {
8540        rows: 1,
8541        fill: 'column'
8542      }
8543    });
vendor: 1,326 bytes, lines 8544-8578
8544    let slidesNumberEvenToRows;
8545    let slidesPerRow;
8546    let numFullColumns;
8547    let wasMultiRow;
8548    const getSpaceBetween = () => {
8549      let spaceBetween = swiper.params.spaceBetween;
8550      if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {
8551        spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiper.size;
8552      } else if (typeof spaceBetween === 'string') {
8553        spaceBetween = parseFloat(spaceBetween);
8554      }
8555      return spaceBetween;
8556    };
8557    const initSlides = slides => {
8558      const {
8559        slidesPerView
8560      } = swiper.params;
8561      const {
8562        rows,
8563        fill
8564      } = swiper.params.grid;
8565      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
8566      numFullColumns = Math.floor(slidesLength / rows);
8567      if (Math.floor(slidesLength / rows) === slidesLength / rows) {
8568        slidesNumberEvenToRows = slidesLength;
8569      } else {
8570        slidesNumberEvenToRows = Math.ceil(slidesLength / rows) * rows;
8571      }
8572      if (slidesPerView !== 'auto' && fill === 'row') {
8573        slidesNumberEvenToRows = Math.max(slidesNumberEvenToRows, slidesPerView * rows);
8574      }
8575      slidesPerRow = slidesNumberEvenToRows / rows;
8576    };
8577    const unsetSlides = () => {
8578      if (swiper.slides) {
vendor: 39,832 bytes, lines 8579-9706
8579        swiper.slides.forEach(slide => {
8580          if (slide.swiperSlideGridSet) {
8581            slide.style.height = '';
8582            slide.style[swiper.getDirectionLabel('margin-top')] = '';
8583          }
8584        });
8585      }
8586    };
8587    const updateSlide = (i, slide, slides) => {
8588      const {
8589        slidesPerGroup
8590      } = swiper.params;
8591      const spaceBetween = getSpaceBetween();
8592      const {
8593        rows,
8594        fill
8595      } = swiper.params.grid;
8596      const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : slides.length;
8597      // Set slides order
8598      let newSlideOrderIndex;
8599      let column;
8600      let row;
8601      if (fill === 'row' && slidesPerGroup > 1) {
8602        const groupIndex = Math.floor(i / (slidesPerGroup * rows));
8603        const slideIndexInGroup = i - rows * slidesPerGroup * groupIndex;
8604        const columnsInGroup = groupIndex === 0 ? slidesPerGroup : Math.min(Math.ceil((slidesLength - groupIndex * rows * slidesPerGroup) / rows), slidesPerGroup);
8605        row = Math.floor(slideIndexInGroup / columnsInGroup);
8606        column = slideIndexInGroup - row * columnsInGroup + groupIndex * slidesPerGroup;
8607        newSlideOrderIndex = column + row * slidesNumberEvenToRows / rows;
8608        slide.style.order = newSlideOrderIndex;
8609      } else if (fill === 'column') {
8610        column = Math.floor(i / rows);
8611        row = i - column * rows;
8612        if (column > numFullColumns || column === numFullColumns && row === rows - 1) {
8613          row += 1;
8614          if (row >= rows) {
8615            row = 0;
8616            column += 1;
8617          }
8618        }
8619      } else {
8620        row = Math.floor(i / slidesPerRow);
8621        column = i - row * slidesPerRow;
8622      }
8623      slide.row = row;
8624      slide.column = column;
8625      slide.style.height = `calc((100% - ${(rows - 1) * spaceBetween}px) / ${rows})`;
8626      slide.style[swiper.getDirectionLabel('margin-top')] = row !== 0 ? spaceBetween && `${spaceBetween}px` : '';
8627      slide.swiperSlideGridSet = true;
8628    };
8629    const updateWrapperSize = (slideSize, snapGrid) => {
8630      const {
8631        centeredSlides,
8632        roundLengths
8633      } = swiper.params;
8634      const spaceBetween = getSpaceBetween();
8635      const {
8636        rows
8637      } = swiper.params.grid;
8638      swiper.virtualSize = (slideSize + spaceBetween) * slidesNumberEvenToRows;
8639      swiper.virtualSize = Math.ceil(swiper.virtualSize / rows) - spaceBetween;
8640      if (!swiper.params.cssMode) {
8641        swiper.wrapperEl.style[swiper.getDirectionLabel('width')] = `${swiper.virtualSize + spaceBetween}px`;
8642      }
8643      if (centeredSlides) {
8644        const newSlidesGrid = [];
8645        for (let i = 0; i < snapGrid.length; i += 1) {
8646          let slidesGridItem = snapGrid[i];
8647          if (roundLengths) slidesGridItem = Math.floor(slidesGridItem);
8648          if (snapGrid[i] < swiper.virtualSize + snapGrid[0]) newSlidesGrid.push(slidesGridItem);
8649        }
8650        snapGrid.splice(0, snapGrid.length);
8651        snapGrid.push(...newSlidesGrid);
8652      }
8653    };
8654    const onInit = () => {
8655      wasMultiRow = swiper.params.grid && swiper.params.grid.rows > 1;
8656    };
8657    const onUpdate = () => {
8658      const {
8659        params,
8660        el
8661      } = swiper;
8662      const isMultiRow = params.grid && params.grid.rows > 1;
8663      if (wasMultiRow && !isMultiRow) {
8664        el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
8665        numFullColumns = 1;
8666        swiper.emitContainerClasses();
8667      } else if (!wasMultiRow && isMultiRow) {
8668        el.classList.add(`${params.containerModifierClass}grid`);
8669        if (params.grid.fill === 'column') {
8670          el.classList.add(`${params.containerModifierClass}grid-column`);
8671        }
8672        swiper.emitContainerClasses();
8673      }
8674      wasMultiRow = isMultiRow;
8675    };
8676    on('init', onInit);
8677    on('update', onUpdate);
8678    swiper.grid = {
8679      initSlides,
8680      unsetSlides,
8681      updateSlide,
8682      updateWrapperSize
8683    };
8684  }
8685
8686  function appendSlide(slides) {
8687    const swiper = this;
8688    const {
8689      params,
8690      slidesEl
8691    } = swiper;
8692    if (params.loop) {
8693      swiper.loopDestroy();
8694    }
8695    const appendElement = slideEl => {
8696      if (typeof slideEl === 'string') {
8697        const tempDOM = document.createElement('div');
8698        tempDOM.innerHTML = slideEl;
8699        slidesEl.append(tempDOM.children[0]);
8700        tempDOM.innerHTML = '';
8701      } else {
8702        slidesEl.append(slideEl);
8703      }
8704    };
8705    if (typeof slides === 'object' && 'length' in slides) {
8706      for (let i = 0; i < slides.length; i += 1) {
8707        if (slides[i]) appendElement(slides[i]);
8708      }
8709    } else {
8710      appendElement(slides);
8711    }
8712    swiper.recalcSlides();
8713    if (params.loop) {
8714      swiper.loopCreate();
8715    }
8716    if (!params.observer || swiper.isElement) {
8717      swiper.update();
8718    }
8719  }
8720
8721  function prependSlide(slides) {
8722    const swiper = this;
8723    const {
8724      params,
8725      activeIndex,
8726      slidesEl
8727    } = swiper;
8728    if (params.loop) {
8729      swiper.loopDestroy();
8730    }
8731    let newActiveIndex = activeIndex + 1;
8732    const prependElement = slideEl => {
8733      if (typeof slideEl === 'string') {
8734        const tempDOM = document.createElement('div');
8735        tempDOM.innerHTML = slideEl;
8736        slidesEl.prepend(tempDOM.children[0]);
8737        tempDOM.innerHTML = '';
8738      } else {
8739        slidesEl.prepend(slideEl);
8740      }
8741    };
8742    if (typeof slides === 'object' && 'length' in slides) {
8743      for (let i = 0; i < slides.length; i += 1) {
8744        if (slides[i]) prependElement(slides[i]);
8745      }
8746      newActiveIndex = activeIndex + slides.length;
8747    } else {
8748      prependElement(slides);
8749    }
8750    swiper.recalcSlides();
8751    if (params.loop) {
8752      swiper.loopCreate();
8753    }
8754    if (!params.observer || swiper.isElement) {
8755      swiper.update();
8756    }
8757    swiper.slideTo(newActiveIndex, 0, false);
8758  }
8759
8760  function addSlide(index, slides) {
8761    const swiper = this;
8762    const {
8763      params,
8764      activeIndex,
8765      slidesEl
8766    } = swiper;
8767    let activeIndexBuffer = activeIndex;
8768    if (params.loop) {
8769      activeIndexBuffer -= swiper.loopedSlides;
8770      swiper.loopDestroy();
8771      swiper.recalcSlides();
8772    }
8773    const baseLength = swiper.slides.length;
8774    if (index <= 0) {
8775      swiper.prependSlide(slides);
8776      return;
8777    }
8778    if (index >= baseLength) {
8779      swiper.appendSlide(slides);
8780      return;
8781    }
8782    let newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + 1 : activeIndexBuffer;
8783    const slidesBuffer = [];
8784    for (let i = baseLength - 1; i >= index; i -= 1) {
8785      const currentSlide = swiper.slides[i];
8786      currentSlide.remove();
8787      slidesBuffer.unshift(currentSlide);
8788    }
8789    if (typeof slides === 'object' && 'length' in slides) {
8790      for (let i = 0; i < slides.length; i += 1) {
8791        if (slides[i]) slidesEl.append(slides[i]);
8792      }
8793      newActiveIndex = activeIndexBuffer > index ? activeIndexBuffer + slides.length : activeIndexBuffer;
8794    } else {
8795      slidesEl.append(slides);
8796    }
8797    for (let i = 0; i < slidesBuffer.length; i += 1) {
8798      slidesEl.append(slidesBuffer[i]);
8799    }
8800    swiper.recalcSlides();
8801    if (params.loop) {
8802      swiper.loopCreate();
8803    }
8804    if (!params.observer || swiper.isElement) {
8805      swiper.update();
8806    }
8807    if (params.loop) {
8808      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
8809    } else {
8810      swiper.slideTo(newActiveIndex, 0, false);
8811    }
8812  }
8813
8814  function removeSlide(slidesIndexes) {
8815    const swiper = this;
8816    const {
8817      params,
8818      activeIndex
8819    } = swiper;
8820    let activeIndexBuffer = activeIndex;
8821    if (params.loop) {
8822      activeIndexBuffer -= swiper.loopedSlides;
8823      swiper.loopDestroy();
8824    }
8825    let newActiveIndex = activeIndexBuffer;
8826    let indexToRemove;
8827    if (typeof slidesIndexes === 'object' && 'length' in slidesIndexes) {
8828      for (let i = 0; i < slidesIndexes.length; i += 1) {
8829        indexToRemove = slidesIndexes[i];
8830        if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
8831        if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
8832      }
8833      newActiveIndex = Math.max(newActiveIndex, 0);
8834    } else {
8835      indexToRemove = slidesIndexes;
8836      if (swiper.slides[indexToRemove]) swiper.slides[indexToRemove].remove();
8837      if (indexToRemove < newActiveIndex) newActiveIndex -= 1;
8838      newActiveIndex = Math.max(newActiveIndex, 0);
8839    }
8840    swiper.recalcSlides();
8841    if (params.loop) {
8842      swiper.loopCreate();
8843    }
8844    if (!params.observer || swiper.isElement) {
8845      swiper.update();
8846    }
8847    if (params.loop) {
8848      swiper.slideTo(newActiveIndex + swiper.loopedSlides, 0, false);
8849    } else {
8850      swiper.slideTo(newActiveIndex, 0, false);
8851    }
8852  }
8853
8854  function removeAllSlides() {
8855    const swiper = this;
8856    const slidesIndexes = [];
8857    for (let i = 0; i < swiper.slides.length; i += 1) {
8858      slidesIndexes.push(i);
8859    }
8860    swiper.removeSlide(slidesIndexes);
8861  }
8862
8863  function Manipulation(_ref) {
8864    let {
8865      swiper
8866    } = _ref;
8867    Object.assign(swiper, {
8868      appendSlide: appendSlide.bind(swiper),
8869      prependSlide: prependSlide.bind(swiper),
8870      addSlide: addSlide.bind(swiper),
8871      removeSlide: removeSlide.bind(swiper),
8872      removeAllSlides: removeAllSlides.bind(swiper)
8873    });
8874  }
8875
8876  function effectInit(params) {
8877    const {
8878      effect,
8879      swiper,
8880      on,
8881      setTranslate,
8882      setTransition,
8883      overwriteParams,
8884      perspective,
8885      recreateShadows,
8886      getEffectParams
8887    } = params;
8888    on('beforeInit', () => {
8889      if (swiper.params.effect !== effect) return;
8890      swiper.classNames.push(`${swiper.params.containerModifierClass}${effect}`);
8891      if (perspective && perspective()) {
8892        swiper.classNames.push(`${swiper.params.containerModifierClass}3d`);
8893      }
8894      const overwriteParamsResult = overwriteParams ? overwriteParams() : {};
8895      Object.assign(swiper.params, overwriteParamsResult);
8896      Object.assign(swiper.originalParams, overwriteParamsResult);
8897    });
8898    on('setTranslate', () => {
8899      if (swiper.params.effect !== effect) return;
8900      setTranslate();
8901    });
8902    on('setTransition', (_s, duration) => {
8903      if (swiper.params.effect !== effect) return;
8904      setTransition(duration);
8905    });
8906    on('transitionEnd', () => {
8907      if (swiper.params.effect !== effect) return;
8908      if (recreateShadows) {
8909        if (!getEffectParams || !getEffectParams().slideShadows) return;
8910        // remove shadows
8911        swiper.slides.forEach(slideEl => {
8912          slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => shadowEl.remove());
8913        });
8914        // create new one
8915        recreateShadows();
8916      }
8917    });
8918    let requireUpdateOnVirtual;
8919    on('virtualUpdate', () => {
8920      if (swiper.params.effect !== effect) return;
8921      if (!swiper.slides.length) {
8922        requireUpdateOnVirtual = true;
8923      }
8924      requestAnimationFrame(() => {
8925        if (requireUpdateOnVirtual && swiper.slides && swiper.slides.length) {
8926          setTranslate();
8927          requireUpdateOnVirtual = false;
8928        }
8929      });
8930    });
8931  }
8932
8933  function effectTarget(effectParams, slideEl) {
8934    const transformEl = getSlideTransformEl(slideEl);
8935    if (transformEl !== slideEl) {
8936      transformEl.style.backfaceVisibility = 'hidden';
8937      transformEl.style['-webkit-backface-visibility'] = 'hidden';
8938    }
8939    return transformEl;
8940  }
8941
8942  function effectVirtualTransitionEnd(_ref) {
8943    let {
8944      swiper,
8945      duration,
8946      transformElements,
8947      allSlides
8948    } = _ref;
8949    const {
8950      activeIndex
8951    } = swiper;
8952    const getSlide = el => {
8953      if (!el.parentElement) {
8954        // assume shadow root
8955        const slide = swiper.slides.filter(slideEl => slideEl.shadowRoot && slideEl.shadowRoot === el.parentNode)[0];
8956        return slide;
8957      }
8958      return el.parentElement;
8959    };
8960    if (swiper.params.virtualTranslate && duration !== 0) {
8961      let eventTriggered = false;
8962      let transitionEndTarget;
8963      if (allSlides) {
8964        transitionEndTarget = transformElements;
8965      } else {
8966        transitionEndTarget = transformElements.filter(transformEl => {
8967          const el = transformEl.classList.contains('swiper-slide-transform') ? getSlide(transformEl) : transformEl;
8968          return swiper.getSlideIndex(el) === activeIndex;
8969        });
8970      }
8971      transitionEndTarget.forEach(el => {
8972        elementTransitionEnd(el, () => {
8973          if (eventTriggered) return;
8974          if (!swiper || swiper.destroyed) return;
8975          eventTriggered = true;
8976          swiper.animating = false;
8977          const evt = new window.CustomEvent('transitionend', {
8978            bubbles: true,
8979            cancelable: true
8980          });
8981          swiper.wrapperEl.dispatchEvent(evt);
8982        });
8983      });
8984    }
8985  }
8986
8987  function EffectFade(_ref) {
8988    let {
8989      swiper,
8990      extendParams,
8991      on
8992    } = _ref;
8993    extendParams({
8994      fadeEffect: {
8995        crossFade: false
8996      }
8997    });
8998    const setTranslate = () => {
8999      const {
9000        slides
9001      } = swiper;
9002      const params = swiper.params.fadeEffect;
9003      for (let i = 0; i < slides.length; i += 1) {
9004        const slideEl = swiper.slides[i];
9005        const offset = slideEl.swiperSlideOffset;
9006        let tx = -offset;
9007        if (!swiper.params.virtualTranslate) tx -= swiper.translate;
9008        let ty = 0;
9009        if (!swiper.isHorizontal()) {
9010          ty = tx;
9011          tx = 0;
9012        }
9013        const slideOpacity = swiper.params.fadeEffect.crossFade ? Math.max(1 - Math.abs(slideEl.progress), 0) : 1 + Math.min(Math.max(slideEl.progress, -1), 0);
9014        const targetEl = effectTarget(params, slideEl);
9015        targetEl.style.opacity = slideOpacity;
9016        targetEl.style.transform = `translate3d(${tx}px, ${ty}px, 0px)`;
9017      }
9018    };
9019    const setTransition = duration => {
9020      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9021      transformElements.forEach(el => {
9022        el.style.transitionDuration = `${duration}ms`;
9023      });
9024      effectVirtualTransitionEnd({
9025        swiper,
9026        duration,
9027        transformElements,
9028        allSlides: true
9029      });
9030    };
9031    effectInit({
9032      effect: 'fade',
9033      swiper,
9034      on,
9035      setTranslate,
9036      setTransition,
9037      overwriteParams: () => ({
9038        slidesPerView: 1,
9039        slidesPerGroup: 1,
9040        watchSlidesProgress: true,
9041        spaceBetween: 0,
9042        virtualTranslate: !swiper.params.cssMode
9043      })
9044    });
9045  }
9046
9047  function EffectCube(_ref) {
9048    let {
9049      swiper,
9050      extendParams,
9051      on
9052    } = _ref;
9053    extendParams({
9054      cubeEffect: {
9055        slideShadows: true,
9056        shadow: true,
9057        shadowOffset: 20,
9058        shadowScale: 0.94
9059      }
9060    });
9061    const createSlideShadows = (slideEl, progress, isHorizontal) => {
9062      let shadowBefore = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
9063      let shadowAfter = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
9064      if (!shadowBefore) {
9065        shadowBefore = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'left' : 'top'}`.split(' '));
9066        slideEl.append(shadowBefore);
9067      }
9068      if (!shadowAfter) {
9069        shadowAfter = createElement('div', `swiper-slide-shadow-cube swiper-slide-shadow-${isHorizontal ? 'right' : 'bottom'}`.split(' '));
9070        slideEl.append(shadowAfter);
9071      }
9072      if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
9073      if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
9074    };
9075    const recreateShadows = () => {
9076      // create new ones
9077      const isHorizontal = swiper.isHorizontal();
9078      swiper.slides.forEach(slideEl => {
9079        const progress = Math.max(Math.min(slideEl.progress, 1), -1);
9080        createSlideShadows(slideEl, progress, isHorizontal);
9081      });
9082    };
9083    const setTranslate = () => {
9084      const {
9085        el,
9086        wrapperEl,
9087        slides,
9088        width: swiperWidth,
9089        height: swiperHeight,
9090        rtlTranslate: rtl,
9091        size: swiperSize,
9092        browser
9093      } = swiper;
9094      const r = getRotateFix(swiper);
9095      const params = swiper.params.cubeEffect;
9096      const isHorizontal = swiper.isHorizontal();
9097      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
9098      let wrapperRotate = 0;
9099      let cubeShadowEl;
9100      if (params.shadow) {
9101        if (isHorizontal) {
9102          cubeShadowEl = swiper.wrapperEl.querySelector('.swiper-cube-shadow');
9103          if (!cubeShadowEl) {
9104            cubeShadowEl = createElement('div', 'swiper-cube-shadow');
9105            swiper.wrapperEl.append(cubeShadowEl);
9106          }
9107          cubeShadowEl.style.height = `${swiperWidth}px`;
9108        } else {
9109          cubeShadowEl = el.querySelector('.swiper-cube-shadow');
9110          if (!cubeShadowEl) {
9111            cubeShadowEl = createElement('div', 'swiper-cube-shadow');
9112            el.append(cubeShadowEl);
9113          }
9114        }
9115      }
9116      for (let i = 0; i < slides.length; i += 1) {
9117        const slideEl = slides[i];
9118        let slideIndex = i;
9119        if (isVirtual) {
9120          slideIndex = parseInt(slideEl.getAttribute('data-swiper-slide-index'), 10);
9121        }
9122        let slideAngle = slideIndex * 90;
9123        let round = Math.floor(slideAngle / 360);
9124        if (rtl) {
9125          slideAngle = -slideAngle;
9126          round = Math.floor(-slideAngle / 360);
9127        }
9128        const progress = Math.max(Math.min(slideEl.progress, 1), -1);
9129        let tx = 0;
9130        let ty = 0;
9131        let tz = 0;
9132        if (slideIndex % 4 === 0) {
9133          tx = -round * 4 * swiperSize;
9134          tz = 0;
9135        } else if ((slideIndex - 1) % 4 === 0) {
9136          tx = 0;
9137          tz = -round * 4 * swiperSize;
9138        } else if ((slideIndex - 2) % 4 === 0) {
9139          tx = swiperSize + round * 4 * swiperSize;
9140          tz = swiperSize;
9141        } else if ((slideIndex - 3) % 4 === 0) {
9142          tx = -swiperSize;
9143          tz = 3 * swiperSize + swiperSize * 4 * round;
9144        }
9145        if (rtl) {
9146          tx = -tx;
9147        }
9148        if (!isHorizontal) {
9149          ty = tx;
9150          tx = 0;
9151        }
9152        const transform = `rotateX(${r(isHorizontal ? 0 : -slideAngle)}deg) rotateY(${r(isHorizontal ? slideAngle : 0)}deg) translate3d(${tx}px, ${ty}px, ${tz}px)`;
9153        if (progress <= 1 && progress > -1) {
9154          wrapperRotate = slideIndex * 90 + progress * 90;
9155          if (rtl) wrapperRotate = -slideIndex * 90 - progress * 90;
9156        }
9157        slideEl.style.transform = transform;
9158        if (params.slideShadows) {
9159          createSlideShadows(slideEl, progress, isHorizontal);
9160        }
9161      }
9162      wrapperEl.style.transformOrigin = `50% 50% -${swiperSize / 2}px`;
9163      wrapperEl.style['-webkit-transform-origin'] = `50% 50% -${swiperSize / 2}px`;
9164      if (params.shadow) {
9165        if (isHorizontal) {
9166          cubeShadowEl.style.transform = `translate3d(0px, ${swiperWidth / 2 + params.shadowOffset}px, ${-swiperWidth / 2}px) rotateX(89.99deg) rotateZ(0deg) scale(${params.shadowScale})`;
9167        } else {
9168          const shadowAngle = Math.abs(wrapperRotate) - Math.floor(Math.abs(wrapperRotate) / 90) * 90;
9169          const multiplier = 1.5 - (Math.sin(shadowAngle * 2 * Math.PI / 360) / 2 + Math.cos(shadowAngle * 2 * Math.PI / 360) / 2);
9170          const scale1 = params.shadowScale;
9171          const scale2 = params.shadowScale / multiplier;
9172          const offset = params.shadowOffset;
9173          cubeShadowEl.style.transform = `scale3d(${scale1}, 1, ${scale2}) translate3d(0px, ${swiperHeight / 2 + offset}px, ${-swiperHeight / 2 / scale2}px) rotateX(-89.99deg)`;
9174        }
9175      }
9176      const zFactor = (browser.isSafari || browser.isWebView) && browser.needPerspectiveFix ? -swiperSize / 2 : 0;
9177      wrapperEl.style.transform = `translate3d(0px,0,${zFactor}px) rotateX(${r(swiper.isHorizontal() ? 0 : wrapperRotate)}deg) rotateY(${r(swiper.isHorizontal() ? -wrapperRotate : 0)}deg)`;
9178      wrapperEl.style.setProperty('--swiper-cube-translate-z', `${zFactor}px`);
9179    };
9180    const setTransition = duration => {
9181      const {
9182        el,
9183        slides
9184      } = swiper;
9185      slides.forEach(slideEl => {
9186        slideEl.style.transitionDuration = `${duration}ms`;
9187        slideEl.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(subEl => {
9188          subEl.style.transitionDuration = `${duration}ms`;
9189        });
9190      });
9191      if (swiper.params.cubeEffect.shadow && !swiper.isHorizontal()) {
9192        const shadowEl = el.querySelector('.swiper-cube-shadow');
9193        if (shadowEl) shadowEl.style.transitionDuration = `${duration}ms`;
9194      }
9195    };
9196    effectInit({
9197      effect: 'cube',
9198      swiper,
9199      on,
9200      setTranslate,
9201      setTransition,
9202      recreateShadows,
9203      getEffectParams: () => swiper.params.cubeEffect,
9204      perspective: () => true,
9205      overwriteParams: () => ({
9206        slidesPerView: 1,
9207        slidesPerGroup: 1,
9208        watchSlidesProgress: true,
9209        resistanceRatio: 0,
9210        spaceBetween: 0,
9211        centeredSlides: false,
9212        virtualTranslate: true
9213      })
9214    });
9215  }
9216
9217  function createShadow(suffix, slideEl, side) {
9218    const shadowClass = `swiper-slide-shadow${side ? `-${side}` : ''}${suffix ? ` swiper-slide-shadow-${suffix}` : ''}`;
9219    const shadowContainer = getSlideTransformEl(slideEl);
9220    let shadowEl = shadowContainer.querySelector(`.${shadowClass.split(' ').join('.')}`);
9221    if (!shadowEl) {
9222      shadowEl = createElement('div', shadowClass.split(' '));
9223      shadowContainer.append(shadowEl);
9224    }
9225    return shadowEl;
9226  }
9227
9228  function EffectFlip(_ref) {
9229    let {
9230      swiper,
9231      extendParams,
9232      on
9233    } = _ref;
9234    extendParams({
9235      flipEffect: {
9236        slideShadows: true,
9237        limitRotation: true
9238      }
9239    });
9240    const createSlideShadows = (slideEl, progress) => {
9241      let shadowBefore = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
9242      let shadowAfter = swiper.isHorizontal() ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
9243      if (!shadowBefore) {
9244        shadowBefore = createShadow('flip', slideEl, swiper.isHorizontal() ? 'left' : 'top');
9245      }
9246      if (!shadowAfter) {
9247        shadowAfter = createShadow('flip', slideEl, swiper.isHorizontal() ? 'right' : 'bottom');
9248      }
9249      if (shadowBefore) shadowBefore.style.opacity = Math.max(-progress, 0);
9250      if (shadowAfter) shadowAfter.style.opacity = Math.max(progress, 0);
9251    };
9252    const recreateShadows = () => {
9253      // Set shadows
9254      swiper.params.flipEffect;
9255      swiper.slides.forEach(slideEl => {
9256        let progress = slideEl.progress;
9257        if (swiper.params.flipEffect.limitRotation) {
9258          progress = Math.max(Math.min(slideEl.progress, 1), -1);
9259        }
9260        createSlideShadows(slideEl, progress);
9261      });
9262    };
9263    const setTranslate = () => {
9264      const {
9265        slides,
9266        rtlTranslate: rtl
9267      } = swiper;
9268      const params = swiper.params.flipEffect;
9269      const rotateFix = getRotateFix(swiper);
9270      for (let i = 0; i < slides.length; i += 1) {
9271        const slideEl = slides[i];
9272        let progress = slideEl.progress;
9273        if (swiper.params.flipEffect.limitRotation) {
9274          progress = Math.max(Math.min(slideEl.progress, 1), -1);
9275        }
9276        const offset = slideEl.swiperSlideOffset;
9277        const rotate = -180 * progress;
9278        let rotateY = rotate;
9279        let rotateX = 0;
9280        let tx = swiper.params.cssMode ? -offset - swiper.translate : -offset;
9281        let ty = 0;
9282        if (!swiper.isHorizontal()) {
9283          ty = tx;
9284          tx = 0;
9285          rotateX = -rotateY;
9286          rotateY = 0;
9287        } else if (rtl) {
9288          rotateY = -rotateY;
9289        }
9290        slideEl.style.zIndex = -Math.abs(Math.round(progress)) + slides.length;
9291        if (params.slideShadows) {
9292          createSlideShadows(slideEl, progress);
9293        }
9294        const transform = `translate3d(${tx}px, ${ty}px, 0px) rotateX(${rotateFix(rotateX)}deg) rotateY(${rotateFix(rotateY)}deg)`;
9295        const targetEl = effectTarget(params, slideEl);
9296        targetEl.style.transform = transform;
9297      }
9298    };
9299    const setTransition = duration => {
9300      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9301      transformElements.forEach(el => {
9302        el.style.transitionDuration = `${duration}ms`;
9303        el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
9304          shadowEl.style.transitionDuration = `${duration}ms`;
9305        });
9306      });
9307      effectVirtualTransitionEnd({
9308        swiper,
9309        duration,
9310        transformElements
9311      });
9312    };
9313    effectInit({
9314      effect: 'flip',
9315      swiper,
9316      on,
9317      setTranslate,
9318      setTransition,
9319      recreateShadows,
9320      getEffectParams: () => swiper.params.flipEffect,
9321      perspective: () => true,
9322      overwriteParams: () => ({
9323        slidesPerView: 1,
9324        slidesPerGroup: 1,
9325        watchSlidesProgress: true,
9326        spaceBetween: 0,
9327        virtualTranslate: !swiper.params.cssMode
9328      })
9329    });
9330  }
9331
9332  function EffectCoverflow(_ref) {
9333    let {
9334      swiper,
9335      extendParams,
9336      on
9337    } = _ref;
9338    extendParams({
9339      coverflowEffect: {
9340        rotate: 50,
9341        stretch: 0,
9342        depth: 100,
9343        scale: 1,
9344        modifier: 1,
9345        slideShadows: true
9346      }
9347    });
9348    const setTranslate = () => {
9349      const {
9350        width: swiperWidth,
9351        height: swiperHeight,
9352        slides,
9353        slidesSizesGrid
9354      } = swiper;
9355      const params = swiper.params.coverflowEffect;
9356      const isHorizontal = swiper.isHorizontal();
9357      const transform = swiper.translate;
9358      const center = isHorizontal ? -transform + swiperWidth / 2 : -transform + swiperHeight / 2;
9359      const rotate = isHorizontal ? params.rotate : -params.rotate;
9360      const translate = params.depth;
9361      const r = getRotateFix(swiper);
9362      // Each slide offset from center
9363      for (let i = 0, length = slides.length; i < length; i += 1) {
9364        const slideEl = slides[i];
9365        const slideSize = slidesSizesGrid[i];
9366        const slideOffset = slideEl.swiperSlideOffset;
9367        const centerOffset = (center - slideOffset - slideSize / 2) / slideSize;
9368        const offsetMultiplier = typeof params.modifier === 'function' ? params.modifier(centerOffset) : centerOffset * params.modifier;
9369        let rotateY = isHorizontal ? rotate * offsetMultiplier : 0;
9370        let rotateX = isHorizontal ? 0 : rotate * offsetMultiplier;
9371        // var rotateZ = 0
9372        let translateZ = -translate * Math.abs(offsetMultiplier);
9373        let stretch = params.stretch;
9374        // Allow percentage to make a relative stretch for responsive sliders
9375        if (typeof stretch === 'string' && stretch.indexOf('%') !== -1) {
9376          stretch = parseFloat(params.stretch) / 100 * slideSize;
9377        }
9378        let translateY = isHorizontal ? 0 : stretch * offsetMultiplier;
9379        let translateX = isHorizontal ? stretch * offsetMultiplier : 0;
9380        let scale = 1 - (1 - params.scale) * Math.abs(offsetMultiplier);
9381
9382        // Fix for ultra small values
9383        if (Math.abs(translateX) < 0.001) translateX = 0;
9384        if (Math.abs(translateY) < 0.001) translateY = 0;
9385        if (Math.abs(translateZ) < 0.001) translateZ = 0;
9386        if (Math.abs(rotateY) < 0.001) rotateY = 0;
9387        if (Math.abs(rotateX) < 0.001) rotateX = 0;
9388        if (Math.abs(scale) < 0.001) scale = 0;
9389        const slideTransform = `translate3d(${translateX}px,${translateY}px,${translateZ}px)  rotateX(${r(rotateX)}deg) rotateY(${r(rotateY)}deg) scale(${scale})`;
9390        const targetEl = effectTarget(params, slideEl);
9391        targetEl.style.transform = slideTransform;
9392        slideEl.style.zIndex = -Math.abs(Math.round(offsetMultiplier)) + 1;
9393        if (params.slideShadows) {
9394          // Set shadows
9395          let shadowBeforeEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-left') : slideEl.querySelector('.swiper-slide-shadow-top');
9396          let shadowAfterEl = isHorizontal ? slideEl.querySelector('.swiper-slide-shadow-right') : slideEl.querySelector('.swiper-slide-shadow-bottom');
9397          if (!shadowBeforeEl) {
9398            shadowBeforeEl = createShadow('coverflow', slideEl, isHorizontal ? 'left' : 'top');
9399          }
9400          if (!shadowAfterEl) {
9401            shadowAfterEl = createShadow('coverflow', slideEl, isHorizontal ? 'right' : 'bottom');
9402          }
9403          if (shadowBeforeEl) shadowBeforeEl.style.opacity = offsetMultiplier > 0 ? offsetMultiplier : 0;
9404          if (shadowAfterEl) shadowAfterEl.style.opacity = -offsetMultiplier > 0 ? -offsetMultiplier : 0;
9405        }
9406      }
9407    };
9408    const setTransition = duration => {
9409      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9410      transformElements.forEach(el => {
9411        el.style.transitionDuration = `${duration}ms`;
9412        el.querySelectorAll('.swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left').forEach(shadowEl => {
9413          shadowEl.style.transitionDuration = `${duration}ms`;
9414        });
9415      });
9416    };
9417    effectInit({
9418      effect: 'coverflow',
9419      swiper,
9420      on,
9421      setTranslate,
9422      setTransition,
9423      perspective: () => true,
9424      overwriteParams: () => ({
9425        watchSlidesProgress: true
9426      })
9427    });
9428  }
9429
9430  function EffectCreative(_ref) {
9431    let {
9432      swiper,
9433      extendParams,
9434      on
9435    } = _ref;
9436    extendParams({
9437      creativeEffect: {
9438        limitProgress: 1,
9439        shadowPerProgress: false,
9440        progressMultiplier: 1,
9441        perspective: true,
9442        prev: {
9443          translate: [0, 0, 0],
9444          rotate: [0, 0, 0],
9445          opacity: 1,
9446          scale: 1
9447        },
9448        next: {
9449          translate: [0, 0, 0],
9450          rotate: [0, 0, 0],
9451          opacity: 1,
9452          scale: 1
9453        }
9454      }
9455    });
9456    const getTranslateValue = value => {
9457      if (typeof value === 'string') return value;
9458      return `${value}px`;
9459    };
9460    const setTranslate = () => {
9461      const {
9462        slides,
9463        wrapperEl,
9464        slidesSizesGrid
9465      } = swiper;
9466      const params = swiper.params.creativeEffect;
9467      const {
9468        progressMultiplier: multiplier
9469      } = params;
9470      const isCenteredSlides = swiper.params.centeredSlides;
9471      const rotateFix = getRotateFix(swiper);
9472      if (isCenteredSlides) {
9473        const margin = slidesSizesGrid[0] / 2 - swiper.params.slidesOffsetBefore || 0;
9474        wrapperEl.style.transform = `translateX(calc(50% - ${margin}px))`;
9475      }
9476      for (let i = 0; i < slides.length; i += 1) {
9477        const slideEl = slides[i];
9478        const slideProgress = slideEl.progress;
9479        const progress = Math.min(Math.max(slideEl.progress, -params.limitProgress), params.limitProgress);
9480        let originalProgress = progress;
9481        if (!isCenteredSlides) {
9482          originalProgress = Math.min(Math.max(slideEl.originalProgress, -params.limitProgress), params.limitProgress);
9483        }
9484        const offset = slideEl.swiperSlideOffset;
9485        const t = [swiper.params.cssMode ? -offset - swiper.translate : -offset, 0, 0];
9486        const r = [0, 0, 0];
9487        let custom = false;
9488        if (!swiper.isHorizontal()) {
9489          t[1] = t[0];
9490          t[0] = 0;
9491        }
9492        let data = {
9493          translate: [0, 0, 0],
9494          rotate: [0, 0, 0],
9495          scale: 1,
9496          opacity: 1
9497        };
9498        if (progress < 0) {
9499          data = params.next;
9500          custom = true;
9501        } else if (progress > 0) {
9502          data = params.prev;
9503          custom = true;
9504        }
9505        // set translate
9506        t.forEach((value, index) => {
9507          t[index] = `calc(${value}px + (${getTranslateValue(data.translate[index])} * ${Math.abs(progress * multiplier)}))`;
9508        });
9509        // set rotates
9510        r.forEach((value, index) => {
9511          let val = data.rotate[index] * Math.abs(progress * multiplier);
9512          r[index] = val;
9513        });
9514        slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
9515        const translateString = t.join(', ');
9516        const rotateString = `rotateX(${rotateFix(r[0])}deg) rotateY(${rotateFix(r[1])}deg) rotateZ(${rotateFix(r[2])}deg)`;
9517        const scaleString = originalProgress < 0 ? `scale(${1 + (1 - data.scale) * originalProgress * multiplier})` : `scale(${1 - (1 - data.scale) * originalProgress * multiplier})`;
9518        const opacityString = originalProgress < 0 ? 1 + (1 - data.opacity) * originalProgress * multiplier : 1 - (1 - data.opacity) * originalProgress * multiplier;
9519        const transform = `translate3d(${translateString}) ${rotateString} ${scaleString}`;
9520
9521        // Set shadows
9522        if (custom && data.shadow || !custom) {
9523          let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
9524          if (!shadowEl && data.shadow) {
9525            shadowEl = createShadow('creative', slideEl);
9526          }
9527          if (shadowEl) {
9528            const shadowOpacity = params.shadowPerProgress ? progress * (1 / params.limitProgress) : progress;
9529            shadowEl.style.opacity = Math.min(Math.max(Math.abs(shadowOpacity), 0), 1);
9530          }
9531        }
9532        const targetEl = effectTarget(params, slideEl);
9533        targetEl.style.transform = transform;
9534        targetEl.style.opacity = opacityString;
9535        if (data.origin) {
9536          targetEl.style.transformOrigin = data.origin;
9537        }
9538      }
9539    };
9540    const setTransition = duration => {
9541      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9542      transformElements.forEach(el => {
9543        el.style.transitionDuration = `${duration}ms`;
9544        el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
9545          shadowEl.style.transitionDuration = `${duration}ms`;
9546        });
9547      });
9548      effectVirtualTransitionEnd({
9549        swiper,
9550        duration,
9551        transformElements,
9552        allSlides: true
9553      });
9554    };
9555    effectInit({
9556      effect: 'creative',
9557      swiper,
9558      on,
9559      setTranslate,
9560      setTransition,
9561      perspective: () => swiper.params.creativeEffect.perspective,
9562      overwriteParams: () => ({
9563        watchSlidesProgress: true,
9564        virtualTranslate: !swiper.params.cssMode
9565      })
9566    });
9567  }
9568
9569  function EffectCards(_ref) {
9570    let {
9571      swiper,
9572      extendParams,
9573      on
9574    } = _ref;
9575    extendParams({
9576      cardsEffect: {
9577        slideShadows: true,
9578        rotate: true,
9579        perSlideRotate: 2,
9580        perSlideOffset: 8
9581      }
9582    });
9583    const setTranslate = () => {
9584      const {
9585        slides,
9586        activeIndex,
9587        rtlTranslate: rtl
9588      } = swiper;
9589      const params = swiper.params.cardsEffect;
9590      const {
9591        startTranslate,
9592        isTouched
9593      } = swiper.touchEventsData;
9594      const currentTranslate = rtl ? -swiper.translate : swiper.translate;
9595      for (let i = 0; i < slides.length; i += 1) {
9596        const slideEl = slides[i];
9597        const slideProgress = slideEl.progress;
9598        const progress = Math.min(Math.max(slideProgress, -4), 4);
9599        let offset = slideEl.swiperSlideOffset;
9600        if (swiper.params.centeredSlides && !swiper.params.cssMode) {
9601          swiper.wrapperEl.style.transform = `translateX(${swiper.minTranslate()}px)`;
9602        }
9603        if (swiper.params.centeredSlides && swiper.params.cssMode) {
9604          offset -= slides[0].swiperSlideOffset;
9605        }
9606        let tX = swiper.params.cssMode ? -offset - swiper.translate : -offset;
9607        let tY = 0;
9608        const tZ = -100 * Math.abs(progress);
9609        let scale = 1;
9610        let rotate = -params.perSlideRotate * progress;
9611        let tXAdd = params.perSlideOffset - Math.abs(progress) * 0.75;
9612        const slideIndex = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.from + i : i;
9613        const isSwipeToNext = (slideIndex === activeIndex || slideIndex === activeIndex - 1) && progress > 0 && progress < 1 && (isTouched || swiper.params.cssMode) && currentTranslate < startTranslate;
9614        const isSwipeToPrev = (slideIndex === activeIndex || slideIndex === activeIndex + 1) && progress < 0 && progress > -1 && (isTouched || swiper.params.cssMode) && currentTranslate > startTranslate;
9615        if (isSwipeToNext || isSwipeToPrev) {
9616          const subProgress = (1 - Math.abs((Math.abs(progress) - 0.5) / 0.5)) ** 0.5;
9617          rotate += -28 * progress * subProgress;
9618          scale += -0.5 * subProgress;
9619          tXAdd += 96 * subProgress;
9620          tY = `${-25 * subProgress * Math.abs(progress)}%`;
9621        }
9622        if (progress < 0) {
9623          // next
9624          tX = `calc(${tX}px ${rtl ? '-' : '+'} (${tXAdd * Math.abs(progress)}%))`;
9625        } else if (progress > 0) {
9626          // prev
9627          tX = `calc(${tX}px ${rtl ? '-' : '+'} (-${tXAdd * Math.abs(progress)}%))`;
9628        } else {
9629          tX = `${tX}px`;
9630        }
9631        if (!swiper.isHorizontal()) {
9632          const prevY = tY;
9633          tY = tX;
9634          tX = prevY;
9635        }
9636        const scaleString = progress < 0 ? `${1 + (1 - scale) * progress}` : `${1 - (1 - scale) * progress}`;
9637
9638        /* eslint-disable */
9639        const transform = `
9640        translate3d(${tX}, ${tY}, ${tZ}px)
9641        rotateZ(${params.rotate ? rtl ? -rotate : rotate : 0}deg)
9642        scale(${scaleString})
9643      `;
9644        /* eslint-enable */
9645
9646        if (params.slideShadows) {
9647          // Set shadows
9648          let shadowEl = slideEl.querySelector('.swiper-slide-shadow');
9649          if (!shadowEl) {
9650            shadowEl = createShadow('cards', slideEl);
9651          }
9652          if (shadowEl) shadowEl.style.opacity = Math.min(Math.max((Math.abs(progress) - 0.5) / 0.5, 0), 1);
9653        }
9654        slideEl.style.zIndex = -Math.abs(Math.round(slideProgress)) + slides.length;
9655        const targetEl = effectTarget(params, slideEl);
9656        targetEl.style.transform = transform;
9657      }
9658    };
9659    const setTransition = duration => {
9660      const transformElements = swiper.slides.map(slideEl => getSlideTransformEl(slideEl));
9661      transformElements.forEach(el => {
9662        el.style.transitionDuration = `${duration}ms`;
9663        el.querySelectorAll('.swiper-slide-shadow').forEach(shadowEl => {
9664          shadowEl.style.transitionDuration = `${duration}ms`;
9665        });
9666      });
9667      effectVirtualTransitionEnd({
9668        swiper,
9669        duration,
9670        transformElements
9671      });
9672    };
9673    effectInit({
9674      effect: 'cards',
9675      swiper,
9676      on,
9677      setTranslate,
9678      setTransition,
9679      perspective: () => true,
9680      overwriteParams: () => ({
9681        watchSlidesProgress: true,
9682        virtualTranslate: !swiper.params.cssMode
9683      })
9684    });
9685  }
9686
9687  /**
9688   * Swiper 11.1.14
9689   * Most modern mobile touch slider and framework with hardware accelerated transitions
9690   * https://swiperjs.com
9691   *
9692   * Copyright 2014-2024 Vladimir Kharlampidi
9693   *
9694   * Released under the MIT License
9695   *
9696   * Released on: September 12, 2024
9697   */
9698
9699
9700  // Swiper Class
9701  const modules = [Virtual, Keyboard, Mousewheel, Navigation, Pagination, Scrollbar, Parallax, Zoom, Controller, A11y, History, HashNavigation, Autoplay, Thumb, freeMode, Grid, Manipulation, EffectFade, EffectCube, EffectFlip, EffectCoverflow, EffectCreative, EffectCards];
9702  Swiper.use(modules);
9703
9704  return Swiper;
9705
9706})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.