PageSourceSearch

https://www.accessbankplc.com/scripts/js/swiper.js

js accessbankplc.com collected 2026-09-24 07:00:54 UTC 315,714 bytes, 9,395 lines download raw bytes

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