PageSourceSearch

https://sunrisexp.com/assets/swiper11/swiper-bundle.js

js sunrisexp.com collected 2026-10-08 07:19:32 UTC 333,773 bytes, 9,513 lines download raw bytes

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

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.