PageSourceSearch

https://l10martialarts.com/wp-content/themes/market-muscles-llc-wp…/assets/js/plugins/swiper.min.js?ver=7.1.3

js l10martialarts.com collected 2026-10-09 22:30:16 UTC 320,185 bytes, 9,251 lines download raw bytes

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

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