PageSourceSearch

https://femalemuscle.com/wp-content/themes/blogus/js/swiper-bundle.js?ver=7.0.5

js femalemuscle.com collected 2026-09-24 23:46:18 UTC 320,846 bytes, 9,511 lines download raw bytes

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

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.