PageSourceSearch

https://tgbus.com/static/js/swiper.js

js tgbus.com collected 2026-10-02 03:26:03 UTC 262,759 bytes, 7,719 lines download raw bytes

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

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.