PageSourceSearch

https://intourcomgroup.ru/wp-content/plugins/elementor/assets/lib/swiper/v8/swiper.js?ver=8.4.5

js intourcomgroup.ru collected 2026-09-24 13:21:34 UTC 321,251 bytes, 10,702 lines download raw bytes

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

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.