PageSourceSearch

https://www.ntu.org/content/public/js/bundle.min.js

js ntu.org collected 2026-10-02 03:45:31 UTC 429,055 bytes, 15,300 lines download raw bytes

1/******/ (function(modules) { // webpackBootstrap
2/******/ 	// The module cache
3/******/ 	var installedModules = {};
4/******/
5/******/ 	// The require function
6/******/ 	function __webpack_require__(moduleId) {
7/******/
8/******/ 		// Check if module is in cache
9/******/ 		if(installedModules[moduleId]) {
10/******/ 			return installedModules[moduleId].exports;
11/******/ 		}
12/******/ 		// Create a new module (and put it into the cache)
13/******/ 		var module = installedModules[moduleId] = {
14/******/ 			i: moduleId,
15/******/ 			l: false,
16/******/ 			exports: {}
17/******/ 		};
18/******/
19/******/ 		// Execute the module function
20/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21/******/
22/******/ 		// Flag the module as loaded
23/******/ 		module.l = true;
24/******/
25/******/ 		// Return the exports of the module
26/******/ 		return module.exports;
27/******/ 	}
28/******/
29/******/
30/******/ 	// expose the modules object (__webpack_modules__)
31/******/ 	__webpack_require__.m = modules;
32/******/
33/******/ 	// expose the module cache
34/******/ 	__webpack_require__.c = installedModules;
35/******/
36/******/ 	// define getter function for harmony exports
37/******/ 	__webpack_require__.d = function(exports, name, getter) {
38/******/ 		if(!__webpack_require__.o(exports, name)) {
39/******/ 			Object.defineProperty(exports, name, {
40/******/ 				configurable: false,
41/******/ 				enumerable: true,
42/******/ 				get: getter
43/******/ 			});
44/******/ 		}
45/******/ 	};
46/******/
47/******/ 	// getDefaultExport function for compatibility with non-harmony modules
48/******/ 	__webpack_require__.n = function(module) {
49/******/ 		var getter = module && module.__esModule ?
50/******/ 			function getDefault() { return module['default']; } :
51/******/ 			function getModuleExports() { return module; };
52/******/ 		__webpack_require__.d(getter, 'a', getter);
53/******/ 		return getter;
54/******/ 	};
55/******/
56/******/ 	// Object.prototype.hasOwnProperty.call
57/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58/******/
59/******/ 	// __webpack_public_path__
60/******/ 	__webpack_require__.p = "";
61/******/
62/******/ 	// Load entry module and return exports
63/******/ 	return __webpack_require__(__webpack_require__.s = 9);
64/******/ })
65/************************************************************************/
66/******/ ([
67/* 0 */
68/***/ (function(module, exports, __webpack_require__) {
69
70/* WEBPACK VAR INJECTION */(function(global) {module.exports = global["jQuery"] = __webpack_require__(11);
71/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(10)))
72
73/***/ }),
74/* 1 */
75/***/ (function(module, exports, __webpack_require__) {
76
77var __WEBPACK_AMD_DEFINE_RESULT__;/*!
78 * getSize v2.0.2
79 * measure size of elements
80 * MIT license
81 */
82
83/*jshint browser: true, strict: true, undef: true, unused: true */
84/*global define: false, module: false, console: false */
85
86( function( window, factory ) {
87  'use strict';
88
89  if ( true ) {
90    // AMD
91    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {
92      return factory();
93    }).call(exports, __webpack_require__, exports, module),
94				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
95  } else if ( typeof module == 'object' && module.exports ) {
96    // CommonJS
97    module.exports = factory();
98  } else {
99    // browser global
100    window.getSize = factory();
101  }
102
103})( window, function factory() {
104'use strict';
105
106// -------------------------- helpers -------------------------- //
107
108// get a number from a string, not a percentage
109function getStyleSize( value ) {
110  var num = parseFloat( value );
111  // not a percent like '100%', and a number
112  var isValid = value.indexOf('%') == -1 && !isNaN( num );
113  return isValid && num;
114}
115
116function noop() {}
117
118var logError = typeof console == 'undefined' ? noop :
119  function( message ) {
120    console.error( message );
121  };
122
123// -------------------------- measurements -------------------------- //
124
125var measurements = [
126  'paddingLeft',
127  'paddingRight',
128  'paddingTop',
129  'paddingBottom',
130  'marginLeft',
131  'marginRight',
132  'marginTop',
133  'marginBottom',
134  'borderLeftWidth',
135  'borderRightWidth',
136  'borderTopWidth',
137  'borderBottomWidth'
138];
139
140var measurementsLength = measurements.length;
141
142function getZeroSize() {
143  var size = {
144    width: 0,
145    height: 0,
146    innerWidth: 0,
147    innerHeight: 0,
148    outerWidth: 0,
149    outerHeight: 0
150  };
151  for ( var i=0; i < measurementsLength; i++ ) {
152    var measurement = measurements[i];
153    size[ measurement ] = 0;
154  }
155  return size;
156}
157
158// -------------------------- getStyle -------------------------- //
159
160/**
161 * getStyle, get style of element, check for Firefox bug
162 * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
163 */
164function getStyle( elem ) {
165  var style = getComputedStyle( elem );
166  if ( !style ) {
167    logError( 'Style returned ' + style +
168      '. Are you running this code in a hidden iframe on Firefox? ' +
169      'See http://bit.ly/getsizebug1' );
170  }
171  return style;
172}
173
174// -------------------------- setup -------------------------- //
175
176var isSetup = false;
177
178var isBoxSizeOuter;
179
180/**
181 * setup
182 * check isBoxSizerOuter
183 * do on first getSize() rather than on page load for Firefox bug
184 */
185function setup() {
186  // setup once
187  if ( isSetup ) {
188    return;
189  }
190  isSetup = true;
191
192  // -------------------------- box sizing -------------------------- //
193
194  /**
195   * WebKit measures the outer-width on style.width on border-box elems
196   * IE & Firefox<29 measures the inner-width
197   */
198  var div = document.createElement('div');
199  div.style.width = '200px';
200  div.style.padding = '1px 2px 3px 4px';
201  div.style.borderStyle = 'solid';
202  div.style.borderWidth = '1px 2px 3px 4px';
203  div.style.boxSizing = 'border-box';
204
205  var body = document.body || document.documentElement;
206  body.appendChild( div );
207  var style = getStyle( div );
208
vendor: 5,790 bytes, lines 209-425
209  getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;
210  body.removeChild( div );
211
212}
213
214// -------------------------- getSize -------------------------- //
215
216function getSize( elem ) {
217  setup();
218
219  // use querySeletor if elem is string
220  if ( typeof elem == 'string' ) {
221    elem = document.querySelector( elem );
222  }
223
224  // do not proceed on non-objects
225  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
226    return;
227  }
228
229  var style = getStyle( elem );
230
231  // if hidden, everything is 0
232  if ( style.display == 'none' ) {
233    return getZeroSize();
234  }
235
236  var size = {};
237  size.width = elem.offsetWidth;
238  size.height = elem.offsetHeight;
239
240  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
241
242  // get all measurements
243  for ( var i=0; i < measurementsLength; i++ ) {
244    var measurement = measurements[i];
245    var value = style[ measurement ];
246    var num = parseFloat( value );
247    // any 'auto', 'medium' value will be 0
248    size[ measurement ] = !isNaN( num ) ? num : 0;
249  }
250
251  var paddingWidth = size.paddingLeft + size.paddingRight;
252  var paddingHeight = size.paddingTop + size.paddingBottom;
253  var marginWidth = size.marginLeft + size.marginRight;
254  var marginHeight = size.marginTop + size.marginBottom;
255  var borderWidth = size.borderLeftWidth + size.borderRightWidth;
256  var borderHeight = size.borderTopWidth + size.borderBottomWidth;
257
258  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
259
260  // overwrite width and height if we can get it from style
261  var styleWidth = getStyleSize( style.width );
262  if ( styleWidth !== false ) {
263    size.width = styleWidth +
264      // add padding and border unless it's already including it
265      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
266  }
267
268  var styleHeight = getStyleSize( style.height );
269  if ( styleHeight !== false ) {
270    size.height = styleHeight +
271      // add padding and border unless it's already including it
272      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
273  }
274
275  size.innerWidth = size.width - ( paddingWidth + borderWidth );
276  size.innerHeight = size.height - ( paddingHeight + borderHeight );
277
278  size.outerWidth = size.width + marginWidth;
279  size.outerHeight = size.height + marginHeight;
280
281  return size;
282}
283
284return getSize;
285
286});
287
288
289/***/ }),
290/* 2 */
291/***/ (function(module, exports, __webpack_require__) {
292
293var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
294 * Outlayer v2.1.1
295 * the brains and guts of a layout library
296 * MIT license
297 */
298
299( function( window, factory ) {
300  'use strict';
301  // universal module definition
302  /* jshint strict: false */ /* globals define, module, require */
303  if ( true ) {
304    // AMD - RequireJS
305    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
306        __webpack_require__(7),
307        __webpack_require__(1),
308        __webpack_require__(6),
309        __webpack_require__(12)
310      ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( EvEmitter, getSize, utils, Item ) {
311        return factory( window, EvEmitter, getSize, utils, Item);
312      }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
313				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
314  } else if ( typeof module == 'object' && module.exports ) {
315    // CommonJS - Browserify, Webpack
316    module.exports = factory(
317      window,
318      require('ev-emitter'),
319      require('get-size'),
320      require('fizzy-ui-utils'),
321      require('./item')
322    );
323  } else {
324    // browser global
325    window.Outlayer = factory(
326      window,
327      window.EvEmitter,
328      window.getSize,
329      window.fizzyUIUtils,
330      window.Outlayer.Item
331    );
332  }
333
334}( window, function factory( window, EvEmitter, getSize, utils, Item ) {
335'use strict';
336
337// ----- vars ----- //
338
339var console = window.console;
340var jQuery = window.jQuery;
341var noop = function() {};
342
343// -------------------------- Outlayer -------------------------- //
344
345// globally unique identifiers
346var GUID = 0;
347// internal store of all Outlayer intances
348var instances = {};
349
350
351/**
352 * @param {Element, String} element
353 * @param {Object} options
354 * @constructor
355 */
356function Outlayer( element, options ) {
357  var queryElement = utils.getQueryElement( element );
358  if ( !queryElement ) {
359    if ( console ) {
360      console.error( 'Bad element for ' + this.constructor.namespace +
361        ': ' + ( queryElement || element ) );
362    }
363    return;
364  }
365  this.element = queryElement;
366  // add jQuery
367  if ( jQuery ) {
368    this.$element = jQuery( this.element );
369  }
370
371  // options
372  this.options = utils.extend( {}, this.constructor.defaults );
373  this.option( options );
374
375  // add id for Outlayer.getFromElement
376  var id = ++GUID;
377  this.element.outlayerGUID = id; // expando
378  instances[ id ] = this; // associate via id
379
380  // kick it off
381  this._create();
382
383  var isInitLayout = this._getOption('initLayout');
384  if ( isInitLayout ) {
385    this.layout();
386  }
387}
388
389// settings are for internal use only
390Outlayer.namespace = 'outlayer';
391Outlayer.Item = Item;
392
393// default options
394Outlayer.defaults = {
395  containerStyle: {
396    position: 'relative'
397  },
398  initLayout: true,
399  originLeft: true,
400  originTop: true,
401  resize: true,
402  resizeContainer: true,
403  // item options
404  transitionDuration: '0.4s',
405  hiddenStyle: {
406    opacity: 0,
407    transform: 'scale(0.001)'
408  },
409  visibleStyle: {
410    opacity: 1,
411    transform: 'scale(1)'
412  }
413};
414
415var proto = Outlayer.prototype;
416// inherit EvEmitter
417utils.extend( proto, EvEmitter.prototype );
418
419/**
420 * set options
421 * @param {Object} opts
422 */
423proto.option = function( opts ) {
424  utils.extend( this.options, opts );
425};
vendor: 13,332 bytes, lines 426-952
426
427/**
428 * get backwards compatible option value, check old name
429 */
430proto._getOption = function( option ) {
431  var oldOption = this.constructor.compatOptions[ option ];
432  return oldOption && this.options[ oldOption ] !== undefined ?
433    this.options[ oldOption ] : this.options[ option ];
434};
435
436Outlayer.compatOptions = {
437  // currentName: oldName
438  initLayout: 'isInitLayout',
439  horizontal: 'isHorizontal',
440  layoutInstant: 'isLayoutInstant',
441  originLeft: 'isOriginLeft',
442  originTop: 'isOriginTop',
443  resize: 'isResizeBound',
444  resizeContainer: 'isResizingContainer'
445};
446
447proto._create = function() {
448  // get items from children
449  this.reloadItems();
450  // elements that affect layout, but are not laid out
451  this.stamps = [];
452  this.stamp( this.options.stamp );
453  // set container style
454  utils.extend( this.element.style, this.options.containerStyle );
455
456  // bind resize method
457  var canBindResize = this._getOption('resize');
458  if ( canBindResize ) {
459    this.bindResize();
460  }
461};
462
463// goes through all children again and gets bricks in proper order
464proto.reloadItems = function() {
465  // collection of item elements
466  this.items = this._itemize( this.element.children );
467};
468
469
470/**
471 * turn elements into Outlayer.Items to be used in layout
472 * @param {Array or NodeList or HTMLElement} elems
473 * @returns {Array} items - collection of new Outlayer Items
474 */
475proto._itemize = function( elems ) {
476
477  var itemElems = this._filterFindItemElements( elems );
478  var Item = this.constructor.Item;
479
480  // create new Outlayer Items for collection
481  var items = [];
482  for ( var i=0; i < itemElems.length; i++ ) {
483    var elem = itemElems[i];
484    var item = new Item( elem, this );
485    items.push( item );
486  }
487
488  return items;
489};
490
491/**
492 * get item elements to be used in layout
493 * @param {Array or NodeList or HTMLElement} elems
494 * @returns {Array} items - item elements
495 */
496proto._filterFindItemElements = function( elems ) {
497  return utils.filterFindElements( elems, this.options.itemSelector );
498};
499
500/**
501 * getter method for getting item elements
502 * @returns {Array} elems - collection of item elements
503 */
504proto.getItemElements = function() {
505  return this.items.map( function( item ) {
506    return item.element;
507  });
508};
509
510// ----- init & layout ----- //
511
512/**
513 * lays out all items
514 */
515proto.layout = function() {
516  this._resetLayout();
517  this._manageStamps();
518
519  // don't animate first layout
520  var layoutInstant = this._getOption('layoutInstant');
521  var isInstant = layoutInstant !== undefined ?
522    layoutInstant : !this._isLayoutInited;
523  this.layoutItems( this.items, isInstant );
524
525  // flag for initalized
526  this._isLayoutInited = true;
527};
528
529// _init is alias for layout
530proto._init = proto.layout;
531
532/**
533 * logic before any new layout
534 */
535proto._resetLayout = function() {
536  this.getSize();
537};
538
539
540proto.getSize = function() {
541  this.size = getSize( this.element );
542};
543
544/**
545 * get measurement from option, for columnWidth, rowHeight, gutter
546 * if option is String -> get element from selector string, & get size of element
547 * if option is Element -> get size of element
548 * else use option as a number
549 *
550 * @param {String} measurement
551 * @param {String} size - width or height
552 * @private
553 */
554proto._getMeasurement = function( measurement, size ) {
555  var option = this.options[ measurement ];
556  var elem;
557  if ( !option ) {
558    // default to 0
559    this[ measurement ] = 0;
560  } else {
561    // use option as an element
562    if ( typeof option == 'string' ) {
563      elem = this.element.querySelector( option );
564    } else if ( option instanceof HTMLElement ) {
565      elem = option;
566    }
567    // use size of element, if element
568    this[ measurement ] = elem ? getSize( elem )[ size ] : option;
569  }
570};
571
572/**
573 * layout a collection of item elements
574 * @api public
575 */
576proto.layoutItems = function( items, isInstant ) {
577  items = this._getItemsForLayout( items );
578
579  this._layoutItems( items, isInstant );
580
581  this._postLayout();
582};
583
584/**
585 * get the items to be laid out
586 * you may want to skip over some items
587 * @param {Array} items
588 * @returns {Array} items
589 */
590proto._getItemsForLayout = function( items ) {
591  return items.filter( function( item ) {
592    return !item.isIgnored;
593  });
594};
595
596/**
597 * layout items
598 * @param {Array} items
599 * @param {Boolean} isInstant
600 */
601proto._layoutItems = function( items, isInstant ) {
602  this._emitCompleteOnItems( 'layout', items );
603
604  if ( !items || !items.length ) {
605    // no items, emit event with empty array
606    return;
607  }
608
609  var queue = [];
610
611  items.forEach( function( item ) {
612    // get x/y object from method
613    var position = this._getItemLayoutPosition( item );
614    // enqueue
615    position.item = item;
616    position.isInstant = isInstant || item.isLayoutInstant;
617    queue.push( position );
618  }, this );
619
620  this._processLayoutQueue( queue );
621};
622
623/**
624 * get item layout position
625 * @param {Outlayer.Item} item
626 * @returns {Object} x and y position
627 */
628proto._getItemLayoutPosition = function( /* item */ ) {
629  return {
630    x: 0,
631    y: 0
632  };
633};
634
635/**
636 * iterate over array and position each item
637 * Reason being - separating this logic prevents 'layout invalidation'
638 * thx @paul_irish
639 * @param {Array} queue
640 */
641proto._processLayoutQueue = function( queue ) {
642  this.updateStagger();
643  queue.forEach( function( obj, i ) {
644    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
645  }, this );
646};
647
648// set stagger from option in milliseconds number
649proto.updateStagger = function() {
650  var stagger = this.options.stagger;
651  if ( stagger === null || stagger === undefined ) {
652    this.stagger = 0;
653    return;
654  }
655  this.stagger = getMilliseconds( stagger );
656  return this.stagger;
657};
658
659/**
660 * Sets position of item in DOM
661 * @param {Outlayer.Item} item
662 * @param {Number} x - horizontal position
663 * @param {Number} y - vertical position
664 * @param {Boolean} isInstant - disables transitions
665 */
666proto._positionItem = function( item, x, y, isInstant, i ) {
667  if ( isInstant ) {
668    // if not transition, just set CSS
669    item.goTo( x, y );
670  } else {
671    item.stagger( i * this.stagger );
672    item.moveTo( x, y );
673  }
674};
675
676/**
677 * Any logic you want to do after each layout,
678 * i.e. size the container
679 */
680proto._postLayout = function() {
681  this.resizeContainer();
682};
683
684proto.resizeContainer = function() {
685  var isResizingContainer = this._getOption('resizeContainer');
686  if ( !isResizingContainer ) {
687    return;
688  }
689  var size = this._getContainerSize();
690  if ( size ) {
691    this._setContainerMeasure( size.width, true );
692    this._setContainerMeasure( size.height, false );
693  }
694};
695
696/**
697 * Sets width or height of container if returned
698 * @returns {Object} size
699 *   @param {Number} width
700 *   @param {Number} height
701 */
702proto._getContainerSize = noop;
703
704/**
705 * @param {Number} measure - size of width or height
706 * @param {Boolean} isWidth
707 */
708proto._setContainerMeasure = function( measure, isWidth ) {
709  if ( measure === undefined ) {
710    return;
711  }
712
713  var elemSize = this.size;
714  // add padding and border width if border box
715  if ( elemSize.isBorderBox ) {
716    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
717      elemSize.borderLeftWidth + elemSize.borderRightWidth :
718      elemSize.paddingBottom + elemSize.paddingTop +
719      elemSize.borderTopWidth + elemSize.borderBottomWidth;
720  }
721
722  measure = Math.max( measure, 0 );
723  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
724};
725
726/**
727 * emit eventComplete on a collection of items events
728 * @param {String} eventName
729 * @param {Array} items - Outlayer.Items
730 */
731proto._emitCompleteOnItems = function( eventName, items ) {
732  var _this = this;
733  function onComplete() {
734    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
735  }
736
737  var count = items.length;
738  if ( !items || !count ) {
739    onComplete();
740    return;
741  }
742
743  var doneCount = 0;
744  function tick() {
745    doneCount++;
746    if ( doneCount == count ) {
747      onComplete();
748    }
749  }
750
751  // bind callback
752  items.forEach( function( item ) {
753    item.once( eventName, tick );
754  });
755};
756
757/**
758 * emits events via EvEmitter and jQuery events
759 * @param {String} type - name of event
760 * @param {Event} event - original event
761 * @param {Array} args - extra arguments
762 */
763proto.dispatchEvent = function( type, event, args ) {
764  // add original event to arguments
765  var emitArgs = event ? [ event ].concat( args ) : args;
766  this.emitEvent( type, emitArgs );
767
768  if ( jQuery ) {
769    // set this.$element
770    this.$element = this.$element || jQuery( this.element );
771    if ( event ) {
772      // create jQuery event
773      var $event = jQuery.Event( event );
774      $event.type = type;
775      this.$element.trigger( $event, args );
776    } else {
777      // just trigger with type if no event available
778      this.$element.trigger( type, args );
779    }
780  }
781};
782
783// -------------------------- ignore & stamps -------------------------- //
784
785
786/**
787 * keep item in collection, but do not lay it out
788 * ignored items do not get skipped in layout
789 * @param {Element} elem
790 */
791proto.ignore = function( elem ) {
792  var item = this.getItem( elem );
793  if ( item ) {
794    item.isIgnored = true;
795  }
796};
797
798/**
799 * return item to layout collection
800 * @param {Element} elem
801 */
802proto.unignore = function( elem ) {
803  var item = this.getItem( elem );
804  if ( item ) {
805    delete item.isIgnored;
806  }
807};
808
809/**
810 * adds elements to stamps
811 * @param {NodeList, Array, Element, or String} elems
812 */
813proto.stamp = function( elems ) {
814  elems = this._find( elems );
815  if ( !elems ) {
816    return;
817  }
818
819  this.stamps = this.stamps.concat( elems );
820  // ignore
821  elems.forEach( this.ignore, this );
822};
823
824/**
825 * removes elements to stamps
826 * @param {NodeList, Array, or Element} elems
827 */
828proto.unstamp = function( elems ) {
829  elems = this._find( elems );
830  if ( !elems ){
831    return;
832  }
833
834  elems.forEach( function( elem ) {
835    // filter out removed stamp elements
836    utils.removeFrom( this.stamps, elem );
837    this.unignore( elem );
838  }, this );
839};
840
841/**
842 * finds child elements
843 * @param {NodeList, Array, Element, or String} elems
844 * @returns {Array} elems
845 */
846proto._find = function( elems ) {
847  if ( !elems ) {
848    return;
849  }
850  // if string, use argument as selector string
851  if ( typeof elems == 'string' ) {
852    elems = this.element.querySelectorAll( elems );
853  }
854  elems = utils.makeArray( elems );
855  return elems;
856};
857
858proto._manageStamps = function() {
859  if ( !this.stamps || !this.stamps.length ) {
860    return;
861  }
862
863  this._getBoundingRect();
864
865  this.stamps.forEach( this._manageStamp, this );
866};
867
868// update boundingLeft / Top
869proto._getBoundingRect = function() {
870  // get bounding rect for container element
871  var boundingRect = this.element.getBoundingClientRect();
872  var size = this.size;
873  this._boundingRect = {
874    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
875    top: boundingRect.top + size.paddingTop + size.borderTopWidth,
876    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
877    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
878  };
879};
880
881/**
882 * @param {Element} stamp
883**/
884proto._manageStamp = noop;
885
886/**
887 * get x/y position of element relative to container element
888 * @param {Element} elem
889 * @returns {Object} offset - has left, top, right, bottom
890 */
891proto._getElementOffset = function( elem ) {
892  var boundingRect = elem.getBoundingClientRect();
893  var thisRect = this._boundingRect;
894  var size = getSize( elem );
895  var offset = {
896    left: boundingRect.left - thisRect.left - size.marginLeft,
897    top: boundingRect.top - thisRect.top - size.marginTop,
898    right: thisRect.right - boundingRect.right - size.marginRight,
899    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
900  };
901  return offset;
902};
903
904// -------------------------- resize -------------------------- //
905
906// enable event handlers for listeners
907// i.e. resize -> onresize
908proto.handleEvent = utils.handleEvent;
909
910/**
911 * Bind layout to window resizing
912 */
913proto.bindResize = function() {
914  window.addEventListener( 'resize', this );
915  this.isResizeBound = true;
916};
917
918/**
919 * Unbind layout to window resizing
920 */
921proto.unbindResize = function() {
922  window.removeEventListener( 'resize', this );
923  this.isResizeBound = false;
924};
925
926proto.onresize = function() {
927  this.resize();
928};
929
930utils.debounceMethod( Outlayer, 'onresize', 100 );
931
932proto.resize = function() {
933  // don't trigger if size did not change
934  // or if resize was unbound. See #9
935  if ( !this.isResizeBound || !this.needsResizeLayout() ) {
936    return;
937  }
938
939  this.layout();
940};
941
942/**
943 * check if layout is needed post layout
944 * @returns Boolean
945 */
946proto.needsResizeLayout = function() {
947  var size = getSize( this.element );
948  // check that this.size and size are there
949  // IE8 triggers resize on body size change, so they might not be
950  var hasSizes = this.size && size;
951  return hasSizes && size.innerWidth !== this.size.innerWidth;
952};
vendor: 17,903 bytes, lines 953-1623
953
954// -------------------------- methods -------------------------- //
955
956/**
957 * add items to Outlayer instance
958 * @param {Array or NodeList or Element} elems
959 * @returns {Array} items - Outlayer.Items
960**/
961proto.addItems = function( elems ) {
962  var items = this._itemize( elems );
963  // add items to collection
964  if ( items.length ) {
965    this.items = this.items.concat( items );
966  }
967  return items;
968};
969
970/**
971 * Layout newly-appended item elements
972 * @param {Array or NodeList or Element} elems
973 */
974proto.appended = function( elems ) {
975  var items = this.addItems( elems );
976  if ( !items.length ) {
977    return;
978  }
979  // layout and reveal just the new items
980  this.layoutItems( items, true );
981  this.reveal( items );
982};
983
984/**
985 * Layout prepended elements
986 * @param {Array or NodeList or Element} elems
987 */
988proto.prepended = function( elems ) {
989  var items = this._itemize( elems );
990  if ( !items.length ) {
991    return;
992  }
993  // add items to beginning of collection
994  var previousItems = this.items.slice(0);
995  this.items = items.concat( previousItems );
996  // start new layout
997  this._resetLayout();
998  this._manageStamps();
999  // layout new stuff without transition
1000  this.layoutItems( items, true );
1001  this.reveal( items );
1002  // layout previous items
1003  this.layoutItems( previousItems );
1004};
1005
1006/**
1007 * reveal a collection of items
1008 * @param {Array of Outlayer.Items} items
1009 */
1010proto.reveal = function( items ) {
1011  this._emitCompleteOnItems( 'reveal', items );
1012  if ( !items || !items.length ) {
1013    return;
1014  }
1015  var stagger = this.updateStagger();
1016  items.forEach( function( item, i ) {
1017    item.stagger( i * stagger );
1018    item.reveal();
1019  });
1020};
1021
1022/**
1023 * hide a collection of items
1024 * @param {Array of Outlayer.Items} items
1025 */
1026proto.hide = function( items ) {
1027  this._emitCompleteOnItems( 'hide', items );
1028  if ( !items || !items.length ) {
1029    return;
1030  }
1031  var stagger = this.updateStagger();
1032  items.forEach( function( item, i ) {
1033    item.stagger( i * stagger );
1034    item.hide();
1035  });
1036};
1037
1038/**
1039 * reveal item elements
1040 * @param {Array}, {Element}, {NodeList} items
1041 */
1042proto.revealItemElements = function( elems ) {
1043  var items = this.getItems( elems );
1044  this.reveal( items );
1045};
1046
1047/**
1048 * hide item elements
1049 * @param {Array}, {Element}, {NodeList} items
1050 */
1051proto.hideItemElements = function( elems ) {
1052  var items = this.getItems( elems );
1053  this.hide( items );
1054};
1055
1056/**
1057 * get Outlayer.Item, given an Element
1058 * @param {Element} elem
1059 * @param {Function} callback
1060 * @returns {Outlayer.Item} item
1061 */
1062proto.getItem = function( elem ) {
1063  // loop through items to get the one that matches
1064  for ( var i=0; i < this.items.length; i++ ) {
1065    var item = this.items[i];
1066    if ( item.element == elem ) {
1067      // return item
1068      return item;
1069    }
1070  }
1071};
1072
1073/**
1074 * get collection of Outlayer.Items, given Elements
1075 * @param {Array} elems
1076 * @returns {Array} items - Outlayer.Items
1077 */
1078proto.getItems = function( elems ) {
1079  elems = utils.makeArray( elems );
1080  var items = [];
1081  elems.forEach( function( elem ) {
1082    var item = this.getItem( elem );
1083    if ( item ) {
1084      items.push( item );
1085    }
1086  }, this );
1087
1088  return items;
1089};
1090
1091/**
1092 * remove element(s) from instance and DOM
1093 * @param {Array or NodeList or Element} elems
1094 */
1095proto.remove = function( elems ) {
1096  var removeItems = this.getItems( elems );
1097
1098  this._emitCompleteOnItems( 'remove', removeItems );
1099
1100  // bail if no items to remove
1101  if ( !removeItems || !removeItems.length ) {
1102    return;
1103  }
1104
1105  removeItems.forEach( function( item ) {
1106    item.remove();
1107    // remove item from collection
1108    utils.removeFrom( this.items, item );
1109  }, this );
1110};
1111
1112// ----- destroy ----- //
1113
1114// remove and disable Outlayer instance
1115proto.destroy = function() {
1116  // clean up dynamic styles
1117  var style = this.element.style;
1118  style.height = '';
1119  style.position = '';
1120  style.width = '';
1121  // destroy items
1122  this.items.forEach( function( item ) {
1123    item.destroy();
1124  });
1125
1126  this.unbindResize();
1127
1128  var id = this.element.outlayerGUID;
1129  delete instances[ id ]; // remove reference to instance by id
1130  delete this.element.outlayerGUID;
1131  // remove data for jQuery
1132  if ( jQuery ) {
1133    jQuery.removeData( this.element, this.constructor.namespace );
1134  }
1135
1136};
1137
1138// -------------------------- data -------------------------- //
1139
1140/**
1141 * get Outlayer instance from element
1142 * @param {Element} elem
1143 * @returns {Outlayer}
1144 */
1145Outlayer.data = function( elem ) {
1146  elem = utils.getQueryElement( elem );
1147  var id = elem && elem.outlayerGUID;
1148  return id && instances[ id ];
1149};
1150
1151
1152// -------------------------- create Outlayer class -------------------------- //
1153
1154/**
1155 * create a layout class
1156 * @param {String} namespace
1157 */
1158Outlayer.create = function( namespace, options ) {
1159  // sub-class Outlayer
1160  var Layout = subclass( Outlayer );
1161  // apply new options and compatOptions
1162  Layout.defaults = utils.extend( {}, Outlayer.defaults );
1163  utils.extend( Layout.defaults, options );
1164  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );
1165
1166  Layout.namespace = namespace;
1167
1168  Layout.data = Outlayer.data;
1169
1170  // sub-class Item
1171  Layout.Item = subclass( Item );
1172
1173  // -------------------------- declarative -------------------------- //
1174
1175  utils.htmlInit( Layout, namespace );
1176
1177  // -------------------------- jQuery bridge -------------------------- //
1178
1179  // make into jQuery plugin
1180  if ( jQuery && jQuery.bridget ) {
1181    jQuery.bridget( namespace, Layout );
1182  }
1183
1184  return Layout;
1185};
1186
1187function subclass( Parent ) {
1188  function SubClass() {
1189    Parent.apply( this, arguments );
1190  }
1191
1192  SubClass.prototype = Object.create( Parent.prototype );
1193  SubClass.prototype.constructor = SubClass;
1194
1195  return SubClass;
1196}
1197
1198// ----- helpers ----- //
1199
1200// how many milliseconds are in each unit
1201var msUnits = {
1202  ms: 1,
1203  s: 1000
1204};
1205
1206// munge time-like parameter into millisecond number
1207// '0.4s' -> 40
1208function getMilliseconds( time ) {
1209  if ( typeof time == 'number' ) {
1210    return time;
1211  }
1212  var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
1213  var num = matches && matches[1];
1214  var unit = matches && matches[2];
1215  if ( !num.length ) {
1216    return 0;
1217  }
1218  num = parseFloat( num );
1219  var mult = msUnits[ unit ] || 1;
1220  return num * mult;
1221}
1222
1223// ----- fin ----- //
1224
1225// back in global
1226Outlayer.Item = Item;
1227
1228return Outlayer;
1229
1230}));
1231
1232
1233/***/ }),
1234/* 3 */
1235/***/ (function(module, exports, __webpack_require__) {
1236
1237var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
1238 * Isotope LayoutMode
1239 */
1240
1241( function( window, factory ) {
1242  // universal module definition
1243  /* jshint strict: false */ /*globals define, module, require */
1244  if ( true ) {
1245    // AMD
1246    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
1247        __webpack_require__(1),
1248        __webpack_require__(2)
1249      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
1250				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
1251				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
1252				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1253  } else if ( typeof module == 'object' && module.exports ) {
1254    // CommonJS
1255    module.exports = factory(
1256      require('get-size'),
1257      require('outlayer')
1258    );
1259  } else {
1260    // browser global
1261    window.Isotope = window.Isotope || {};
1262    window.Isotope.LayoutMode = factory(
1263      window.getSize,
1264      window.Outlayer
1265    );
1266  }
1267
1268}( window, function factory( getSize, Outlayer ) {
1269  'use strict';
1270
1271  // layout mode class
1272  function LayoutMode( isotope ) {
1273    this.isotope = isotope;
1274    // link properties
1275    if ( isotope ) {
1276      this.options = isotope.options[ this.namespace ];
1277      this.element = isotope.element;
1278      this.items = isotope.filteredItems;
1279      this.size = isotope.size;
1280    }
1281  }
1282
1283  var proto = LayoutMode.prototype;
1284
1285  /**
1286   * some methods should just defer to default Outlayer method
1287   * and reference the Isotope instance as `this`
1288  **/
1289  var facadeMethods = [
1290    '_resetLayout',
1291    '_getItemLayoutPosition',
1292    '_manageStamp',
1293    '_getContainerSize',
1294    '_getElementOffset',
1295    'needsResizeLayout',
1296    '_getOption'
1297  ];
1298
1299  facadeMethods.forEach( function( methodName ) {
1300    proto[ methodName ] = function() {
1301      return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
1302    };
1303  });
1304
1305  // -----  ----- //
1306
1307  // for horizontal layout modes, check vertical size
1308  proto.needsVerticalResizeLayout = function() {
1309    // don't trigger if size did not change
1310    var size = getSize( this.isotope.element );
1311    // check that this.size and size are there
1312    // IE8 triggers resize on body size change, so they might not be
1313    var hasSizes = this.isotope.size && size;
1314    return hasSizes && size.innerHeight != this.isotope.size.innerHeight;
1315  };
1316
1317  // ----- measurements ----- //
1318
1319  proto._getMeasurement = function() {
1320    this.isotope._getMeasurement.apply( this, arguments );
1321  };
1322
1323  proto.getColumnWidth = function() {
1324    this.getSegmentSize( 'column', 'Width' );
1325  };
1326
1327  proto.getRowHeight = function() {
1328    this.getSegmentSize( 'row', 'Height' );
1329  };
1330
1331  /**
1332   * get columnWidth or rowHeight
1333   * segment: 'column' or 'row'
1334   * size 'Width' or 'Height'
1335  **/
1336  proto.getSegmentSize = function( segment, size ) {
1337    var segmentName = segment + size;
1338    var outerSize = 'outer' + size;
1339    // columnWidth / outerWidth // rowHeight / outerHeight
1340    this._getMeasurement( segmentName, outerSize );
1341    // got rowHeight or columnWidth, we can chill
1342    if ( this[ segmentName ] ) {
1343      return;
1344    }
1345    // fall back to item of first element
1346    var firstItemSize = this.getFirstItemSize();
1347    this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||
1348      // or size of container
1349      this.isotope.size[ 'inner' + size ];
1350  };
1351
1352  proto.getFirstItemSize = function() {
1353    var firstItem = this.isotope.filteredItems[0];
1354    return firstItem && firstItem.element && getSize( firstItem.element );
1355  };
1356
1357  // ----- methods that should reference isotope ----- //
1358
1359  proto.layout = function() {
1360    this.isotope.layout.apply( this.isotope, arguments );
1361  };
1362
1363  proto.getSize = function() {
1364    this.isotope.getSize();
1365    this.size = this.isotope.size;
1366  };
1367
1368  // -------------------------- create -------------------------- //
1369
1370  LayoutMode.modes = {};
1371
1372  LayoutMode.create = function( namespace, options ) {
1373
1374    function Mode() {
1375      LayoutMode.apply( this, arguments );
1376    }
1377
1378    Mode.prototype = Object.create( proto );
1379    Mode.prototype.constructor = Mode;
1380
1381    // default options
1382    if ( options ) {
1383      Mode.options = options;
1384    }
1385
1386    Mode.prototype.namespace = namespace;
1387    // register in Isotope
1388    LayoutMode.modes[ namespace ] = Mode;
1389
1390    return Mode;
1391  };
1392
1393  return LayoutMode;
1394
1395}));
1396
1397
1398/***/ }),
1399/* 4 */
1400/***/ (function(module, exports, __webpack_require__) {
1401
1402var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
1403 * Isotope v3.0.5
1404 *
1405 * Licensed GPLv3 for open source use
1406 * or Isotope Commercial License for commercial use
1407 *
1408 * https://isotope.metafizzy.co
1409 * Copyright 2017 Metafizzy
1410 */
1411
1412( function( window, factory ) {
1413  // universal module definition
1414  /* jshint strict: false */ /*globals define, module, require */
1415  if ( true ) {
1416    // AMD
1417    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
1418        __webpack_require__(2),
1419        __webpack_require__(1),
1420        __webpack_require__(5),
1421        __webpack_require__(6),
1422        __webpack_require__(17),
1423        __webpack_require__(3),
1424        // include default layout modes
1425        __webpack_require__(13),
1426        __webpack_require__(15),
1427        __webpack_require__(16)
1428      ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {
1429        return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );
1430      }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
1431				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1432  } else if ( typeof module == 'object' && module.exports ) {
1433    // CommonJS
1434    module.exports = factory(
1435      window,
1436      require('outlayer'),
1437      require('get-size'),
1438      require('desandro-matches-selector'),
1439      require('fizzy-ui-utils'),
1440      require('./item'),
1441      require('./layout-mode'),
1442      // include default layout modes
1443      require('./layout-modes/masonry'),
1444      require('./layout-modes/fit-rows'),
1445      require('./layout-modes/vertical')
1446    );
1447  } else {
1448    // browser global
1449    window.Isotope = factory(
1450      window,
1451      window.Outlayer,
1452      window.getSize,
1453      window.matchesSelector,
1454      window.fizzyUIUtils,
1455      window.Isotope.Item,
1456      window.Isotope.LayoutMode
1457    );
1458  }
1459
1460}( window, function factory( window, Outlayer, getSize, matchesSelector, utils,
1461  Item, LayoutMode ) {
1462
1463'use strict';
1464
1465// -------------------------- vars -------------------------- //
1466
1467var jQuery = window.jQuery;
1468
1469// -------------------------- helpers -------------------------- //
1470
1471var trim = String.prototype.trim ?
1472  function( str ) {
1473    return str.trim();
1474  } :
1475  function( str ) {
1476    return str.replace( /^\s+|\s+$/g, '' );
1477  };
1478
1479// -------------------------- isotopeDefinition -------------------------- //
1480
1481  // create an Outlayer layout class
1482  var Isotope = Outlayer.create( 'isotope', {
1483    layoutMode: 'masonry',
1484    isJQueryFiltering: true,
1485    sortAscending: true
1486  });
1487
1488  Isotope.Item = Item;
1489  Isotope.LayoutMode = LayoutMode;
1490
1491  var proto = Isotope.prototype;
1492
1493  proto._create = function() {
1494    this.itemGUID = 0;
1495    // functions that sort items
1496    this._sorters = {};
1497    this._getSorters();
1498    // call super
1499    Outlayer.prototype._create.call( this );
1500
1501    // create layout modes
1502    this.modes = {};
1503    // start filteredItems with all items
1504    this.filteredItems = this.items;
1505    // keep of track of sortBys
1506    this.sortHistory = [ 'original-order' ];
1507    // create from registered layout modes
1508    for ( var name in LayoutMode.modes ) {
1509      this._initLayoutMode( name );
1510    }
1511  };
1512
1513  proto.reloadItems = function() {
1514    // reset item ID counter
1515    this.itemGUID = 0;
1516    // call super
1517    Outlayer.prototype.reloadItems.call( this );
1518  };
1519
1520  proto._itemize = function() {
1521    var items = Outlayer.prototype._itemize.apply( this, arguments );
1522    // assign ID for original-order
1523    for ( var i=0; i < items.length; i++ ) {
1524      var item = items[i];
1525      item.id = this.itemGUID++;
1526    }
1527    this._updateItemsSortData( items );
1528    return items;
1529  };
1530
1531
1532  // -------------------------- layout -------------------------- //
1533
1534  proto._initLayoutMode = function( name ) {
1535    var Mode = LayoutMode.modes[ name ];
1536    // set mode options
1537    // HACK extend initial options, back-fill in default options
1538    var initialOpts = this.options[ name ] || {};
1539    this.options[ name ] = Mode.options ?
1540      utils.extend( Mode.options, initialOpts ) : initialOpts;
1541    // init layout mode instance
1542    this.modes[ name ] = new Mode( this );
1543  };
1544
1545
1546  proto.layout = function() {
1547    // if first time doing layout, do all magic
1548    if ( !this._isLayoutInited && this._getOption('initLayout') ) {
1549      this.arrange();
1550      return;
1551    }
1552    this._layout();
1553  };
1554
1555  // private method to be used in layout() & magic()
1556  proto._layout = function() {
1557    // don't animate first layout
1558    var isInstant = this._getIsInstant();
1559    // layout flow
1560    this._resetLayout();
1561    this._manageStamps();
1562    this.layoutItems( this.filteredItems, isInstant );
1563
1564    // flag for initalized
1565    this._isLayoutInited = true;
1566  };
1567
1568  // filter + sort + layout
1569  proto.arrange = function( opts ) {
1570    // set any options pass
1571    this.option( opts );
1572    this._getIsInstant();
1573    // filter, sort, and layout
1574
1575    // filter
1576    var filtered = this._filter( this.items );
1577    this.filteredItems = filtered.matches;
1578
1579    this._bindArrangeComplete();
1580
1581    if ( this._isInstant ) {
1582      this._noTransition( this._hideReveal, [ filtered ] );
1583    } else {
1584      this._hideReveal( filtered );
1585    }
1586
1587    this._sort();
1588    this._layout();
1589  };
1590  // alias to _init for main plugin method
1591  proto._init = proto.arrange;
1592
1593  proto._hideReveal = function( filtered ) {
1594    this.reveal( filtered.needReveal );
1595    this.hide( filtered.needHide );
1596  };
1597
1598  // HACK
1599  // Don't animate/transition first layout
1600  // Or don't animate/transition other layouts
1601  proto._getIsInstant = function() {
1602    var isLayoutInstant = this._getOption('layoutInstant');
1603    var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
1604      !this._isLayoutInited;
1605    this._isInstant = isInstant;
1606    return isInstant;
1607  };
1608
1609  // listen for layoutComplete, hideComplete and revealComplete
1610  // to trigger arrangeComplete
1611  proto._bindArrangeComplete = function() {
1612    // listen for 3 events to trigger arrangeComplete
1613    var isLayoutComplete, isHideComplete, isRevealComplete;
1614    var _this = this;
1615    function arrangeParallelCallback() {
1616      if ( isLayoutComplete && isHideComplete && isRevealComplete ) {
1617        _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );
1618      }
1619    }
1620    this.once( 'layoutComplete', function() {
1621      isLayoutComplete = true;
1622      arrangeParallelCallback();
1623    });
vendor: 11,725 bytes, lines 1624-2015
1624    this.once( 'hideComplete', function() {
1625      isHideComplete = true;
1626      arrangeParallelCallback();
1627    });
1628    this.once( 'revealComplete', function() {
1629      isRevealComplete = true;
1630      arrangeParallelCallback();
1631    });
1632  };
1633
1634  // -------------------------- filter -------------------------- //
1635
1636  proto._filter = function( items ) {
1637    var filter = this.options.filter;
1638    filter = filter || '*';
1639    var matches = [];
1640    var hiddenMatched = [];
1641    var visibleUnmatched = [];
1642
1643    var test = this._getFilterTest( filter );
1644
1645    // test each item
1646    for ( var i=0; i < items.length; i++ ) {
1647      var item = items[i];
1648      if ( item.isIgnored ) {
1649        continue;
1650      }
1651      // add item to either matched or unmatched group
1652      var isMatched = test( item );
1653      // item.isFilterMatched = isMatched;
1654      // add to matches if its a match
1655      if ( isMatched ) {
1656        matches.push( item );
1657      }
1658      // add to additional group if item needs to be hidden or revealed
1659      if ( isMatched && item.isHidden ) {
1660        hiddenMatched.push( item );
1661      } else if ( !isMatched && !item.isHidden ) {
1662        visibleUnmatched.push( item );
1663      }
1664    }
1665
1666    // return collections of items to be manipulated
1667    return {
1668      matches: matches,
1669      needReveal: hiddenMatched,
1670      needHide: visibleUnmatched
1671    };
1672  };
1673
1674  // get a jQuery, function, or a matchesSelector test given the filter
1675  proto._getFilterTest = function( filter ) {
1676    if ( jQuery && this.options.isJQueryFiltering ) {
1677      // use jQuery
1678      return function( item ) {
1679        return jQuery( item.element ).is( filter );
1680      };
1681    }
1682    if ( typeof filter == 'function' ) {
1683      // use filter as function
1684      return function( item ) {
1685        return filter( item.element );
1686      };
1687    }
1688    // default, use filter as selector string
1689    return function( item ) {
1690      return matchesSelector( item.element, filter );
1691    };
1692  };
1693
1694  // -------------------------- sorting -------------------------- //
1695
1696  /**
1697   * @params {Array} elems
1698   * @public
1699   */
1700  proto.updateSortData = function( elems ) {
1701    // get items
1702    var items;
1703    if ( elems ) {
1704      elems = utils.makeArray( elems );
1705      items = this.getItems( elems );
1706    } else {
1707      // update all items if no elems provided
1708      items = this.items;
1709    }
1710
1711    this._getSorters();
1712    this._updateItemsSortData( items );
1713  };
1714
1715  proto._getSorters = function() {
1716    var getSortData = this.options.getSortData;
1717    for ( var key in getSortData ) {
1718      var sorter = getSortData[ key ];
1719      this._sorters[ key ] = mungeSorter( sorter );
1720    }
1721  };
1722
1723  /**
1724   * @params {Array} items - of Isotope.Items
1725   * @private
1726   */
1727  proto._updateItemsSortData = function( items ) {
1728    // do not update if no items
1729    var len = items && items.length;
1730
1731    for ( var i=0; len && i < len; i++ ) {
1732      var item = items[i];
1733      item.updateSortData();
1734    }
1735  };
1736
1737  // ----- munge sorter ----- //
1738
1739  // encapsulate this, as we just need mungeSorter
1740  // other functions in here are just for munging
1741  var mungeSorter = ( function() {
1742    // add a magic layer to sorters for convienent shorthands
1743    // `.foo-bar` will use the text of .foo-bar querySelector
1744    // `[foo-bar]` will use attribute
1745    // you can also add parser
1746    // `.foo-bar parseInt` will parse that as a number
1747    function mungeSorter( sorter ) {
1748      // if not a string, return function or whatever it is
1749      if ( typeof sorter != 'string' ) {
1750        return sorter;
1751      }
1752      // parse the sorter string
1753      var args = trim( sorter ).split(' ');
1754      var query = args[0];
1755      // check if query looks like [an-attribute]
1756      var attrMatch = query.match( /^\[(.+)\]$/ );
1757      var attr = attrMatch && attrMatch[1];
1758      var getValue = getValueGetter( attr, query );
1759      // use second argument as a parser
1760      var parser = Isotope.sortDataParsers[ args[1] ];
1761      // parse the value, if there was a parser
1762      sorter = parser ? function( elem ) {
1763        return elem && parser( getValue( elem ) );
1764      } :
1765      // otherwise just return value
1766      function( elem ) {
1767        return elem && getValue( elem );
1768      };
1769
1770      return sorter;
1771    }
1772
1773    // get an attribute getter, or get text of the querySelector
1774    function getValueGetter( attr, query ) {
1775      // if query looks like [foo-bar], get attribute
1776      if ( attr ) {
1777        return function getAttribute( elem ) {
1778          return elem.getAttribute( attr );
1779        };
1780      }
1781
1782      // otherwise, assume its a querySelector, and get its text
1783      return function getChildText( elem ) {
1784        var child = elem.querySelector( query );
1785        return child && child.textContent;
1786      };
1787    }
1788
1789    return mungeSorter;
1790  })();
1791
1792  // parsers used in getSortData shortcut strings
1793  Isotope.sortDataParsers = {
1794    'parseInt': function( val ) {
1795      return parseInt( val, 10 );
1796    },
1797    'parseFloat': function( val ) {
1798      return parseFloat( val );
1799    }
1800  };
1801
1802  // ----- sort method ----- //
1803
1804  // sort filteredItem order
1805  proto._sort = function() {
1806    if ( !this.options.sortBy ) {
1807      return;
1808    }
1809    // keep track of sortBy History
1810    var sortBys = utils.makeArray( this.options.sortBy );
1811    if ( !this._getIsSameSortBy( sortBys ) ) {
1812      // concat all sortBy and sortHistory, add to front, oldest goes in last
1813      this.sortHistory = sortBys.concat( this.sortHistory );
1814    }
1815    // sort magic
1816    var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );
1817    this.filteredItems.sort( itemSorter );
1818  };
1819
1820  // check if sortBys is same as start of sortHistory
1821  proto._getIsSameSortBy = function( sortBys ) {
1822    for ( var i=0; i < sortBys.length; i++ ) {
1823      if ( sortBys[i] != this.sortHistory[i] ) {
1824        return false;
1825      }
1826    }
1827    return true;
1828  };
1829
1830  // returns a function used for sorting
1831  function getItemSorter( sortBys, sortAsc ) {
1832    return function sorter( itemA, itemB ) {
1833      // cycle through all sortKeys
1834      for ( var i = 0; i < sortBys.length; i++ ) {
1835        var sortBy = sortBys[i];
1836        var a = itemA.sortData[ sortBy ];
1837        var b = itemB.sortData[ sortBy ];
1838        if ( a > b || a < b ) {
1839          // if sortAsc is an object, use the value given the sortBy key
1840          var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;
1841          var direction = isAscending ? 1 : -1;
1842          return ( a > b ? 1 : -1 ) * direction;
1843        }
1844      }
1845      return 0;
1846    };
1847  }
1848
1849  // -------------------------- methods -------------------------- //
1850
1851  // get layout mode
1852  proto._mode = function() {
1853    var layoutMode = this.options.layoutMode;
1854    var mode = this.modes[ layoutMode ];
1855    if ( !mode ) {
1856      // TODO console.error
1857      throw new Error( 'No layout mode: ' + layoutMode );
1858    }
1859    // HACK sync mode's options
1860    // any options set after init for layout mode need to be synced
1861    mode.options = this.options[ layoutMode ];
1862    return mode;
1863  };
1864
1865  proto._resetLayout = function() {
1866    // trigger original reset layout
1867    Outlayer.prototype._resetLayout.call( this );
1868    this._mode()._resetLayout();
1869  };
1870
1871  proto._getItemLayoutPosition = function( item  ) {
1872    return this._mode()._getItemLayoutPosition( item );
1873  };
1874
1875  proto._manageStamp = function( stamp ) {
1876    this._mode()._manageStamp( stamp );
1877  };
1878
1879  proto._getContainerSize = function() {
1880    return this._mode()._getContainerSize();
1881  };
1882
1883  proto.needsResizeLayout = function() {
1884    return this._mode().needsResizeLayout();
1885  };
1886
1887  // -------------------------- adding & removing -------------------------- //
1888
1889  // HEADS UP overwrites default Outlayer appended
1890  proto.appended = function( elems ) {
1891    var items = this.addItems( elems );
1892    if ( !items.length ) {
1893      return;
1894    }
1895    // filter, layout, reveal new items
1896    var filteredItems = this._filterRevealAdded( items );
1897    // add to filteredItems
1898    this.filteredItems = this.filteredItems.concat( filteredItems );
1899  };
1900
1901  // HEADS UP overwrites default Outlayer prepended
1902  proto.prepended = function( elems ) {
1903    var items = this._itemize( elems );
1904    if ( !items.length ) {
1905      return;
1906    }
1907    // start new layout
1908    this._resetLayout();
1909    this._manageStamps();
1910    // filter, layout, reveal new items
1911    var filteredItems = this._filterRevealAdded( items );
1912    // layout previous items
1913    this.layoutItems( this.filteredItems );
1914    // add to items and filteredItems
1915    this.filteredItems = filteredItems.concat( this.filteredItems );
1916    this.items = items.concat( this.items );
1917  };
1918
1919  proto._filterRevealAdded = function( items ) {
1920    var filtered = this._filter( items );
1921    this.hide( filtered.needHide );
1922    // reveal all new items
1923    this.reveal( filtered.matches );
1924    // layout new items, no transition
1925    this.layoutItems( filtered.matches, true );
1926    return filtered.matches;
1927  };
1928
1929  /**
1930   * Filter, sort, and layout newly-appended item elements
1931   * @param {Array or NodeList or Element} elems
1932   */
1933  proto.insert = function( elems ) {
1934    var items = this.addItems( elems );
1935    if ( !items.length ) {
1936      return;
1937    }
1938    // append item elements
1939    var i, item;
1940    var len = items.length;
1941    for ( i=0; i < len; i++ ) {
1942      item = items[i];
1943      this.element.appendChild( item.element );
1944    }
1945    // filter new stuff
1946    var filteredInsertItems = this._filter( items ).matches;
1947    // set flag
1948    for ( i=0; i < len; i++ ) {
1949      items[i].isLayoutInstant = true;
1950    }
1951    this.arrange();
1952    // reset flag
1953    for ( i=0; i < len; i++ ) {
1954      delete items[i].isLayoutInstant;
1955    }
1956    this.reveal( filteredInsertItems );
1957  };
1958
1959  var _remove = proto.remove;
1960  proto.remove = function( elems ) {
1961    elems = utils.makeArray( elems );
1962    var removeItems = this.getItems( elems );
1963    // do regular thing
1964    _remove.call( this, elems );
1965    // bail if no items to remove
1966    var len = removeItems && removeItems.length;
1967    // remove elems from filteredItems
1968    for ( var i=0; len && i < len; i++ ) {
1969      var item = removeItems[i];
1970      // remove item from collection
1971      utils.removeFrom( this.filteredItems, item );
1972    }
1973  };
1974
1975  proto.shuffle = function() {
1976    // update random sortData
1977    for ( var i=0; i < this.items.length; i++ ) {
1978      var item = this.items[i];
1979      item.sortData.random = Math.random();
1980    }
1981    this.options.sortBy = 'random';
1982    this._sort();
1983    this._layout();
1984  };
1985
1986  /**
1987   * trigger fn without transition
1988   * kind of hacky to have this in the first place
1989   * @param {Function} fn
1990   * @param {Array} args
1991   * @returns ret
1992   * @private
1993   */
1994  proto._noTransition = function( fn, args ) {
1995    // save transitionDuration before disabling
1996    var transitionDuration = this.options.transitionDuration;
1997    // disable transition
1998    this.options.transitionDuration = 0;
1999    // do it
2000    var returnValue = fn.apply( this, args );
2001    // re-enable transition for reveal
2002    this.options.transitionDuration = transitionDuration;
2003    return returnValue;
2004  };
2005
2006  // ----- helper methods ----- //
2007
2008  /**
2009   * getter method for getting filtered item elements
2010   * @returns {Array} elems - collection of item elements
2011   */
2012  proto.getFilteredItemElements = function() {
2013    return this.filteredItems.map( function( item ) {
2014      return item.element;
2015    });
vendor: 10,005 bytes, lines 2016-2388
2016  };
2017
2018  // -----  ----- //
2019
2020  return Isotope;
2021
2022}));
2023
2024
2025/***/ }),
2026/* 5 */
2027/***/ (function(module, exports, __webpack_require__) {
2028
2029var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
2030 * matchesSelector v2.0.2
2031 * matchesSelector( element, '.selector' )
2032 * MIT license
2033 */
2034
2035/*jshint browser: true, strict: true, undef: true, unused: true */
2036
2037( function( window, factory ) {
2038  /*global define: false, module: false */
2039  'use strict';
2040  // universal module definition
2041  if ( true ) {
2042    // AMD
2043    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
2044				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
2045				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
2046				__WEBPACK_AMD_DEFINE_FACTORY__),
2047				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2048  } else if ( typeof module == 'object' && module.exports ) {
2049    // CommonJS
2050    module.exports = factory();
2051  } else {
2052    // browser global
2053    window.matchesSelector = factory();
2054  }
2055
2056}( window, function factory() {
2057  'use strict';
2058
2059  var matchesMethod = ( function() {
2060    var ElemProto = window.Element.prototype;
2061    // check for the standard method name first
2062    if ( ElemProto.matches ) {
2063      return 'matches';
2064    }
2065    // check un-prefixed
2066    if ( ElemProto.matchesSelector ) {
2067      return 'matchesSelector';
2068    }
2069    // check vendor prefixes
2070    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
2071
2072    for ( var i=0; i < prefixes.length; i++ ) {
2073      var prefix = prefixes[i];
2074      var method = prefix + 'MatchesSelector';
2075      if ( ElemProto[ method ] ) {
2076        return method;
2077      }
2078    }
2079  })();
2080
2081  return function matchesSelector( elem, selector ) {
2082    return elem[ matchesMethod ]( selector );
2083  };
2084
2085}));
2086
2087
2088/***/ }),
2089/* 6 */
2090/***/ (function(module, exports, __webpack_require__) {
2091
2092var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
2093 * Fizzy UI utils v2.0.7
2094 * MIT license
2095 */
2096
2097/*jshint browser: true, undef: true, unused: true, strict: true */
2098
2099( function( window, factory ) {
2100  // universal module definition
2101  /*jshint strict: false */ /*globals define, module, require */
2102
2103  if ( true ) {
2104    // AMD
2105    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
2106      __webpack_require__(5)
2107    ], __WEBPACK_AMD_DEFINE_RESULT__ = (function( matchesSelector ) {
2108      return factory( window, matchesSelector );
2109    }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
2110				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2111  } else if ( typeof module == 'object' && module.exports ) {
2112    // CommonJS
2113    module.exports = factory(
2114      window,
2115      require('desandro-matches-selector')
2116    );
2117  } else {
2118    // browser global
2119    window.fizzyUIUtils = factory(
2120      window,
2121      window.matchesSelector
2122    );
2123  }
2124
2125}( window, function factory( window, matchesSelector ) {
2126
2127'use strict';
2128
2129var utils = {};
2130
2131// ----- extend ----- //
2132
2133// extends objects
2134utils.extend = function( a, b ) {
2135  for ( var prop in b ) {
2136    a[ prop ] = b[ prop ];
2137  }
2138  return a;
2139};
2140
2141// ----- modulo ----- //
2142
2143utils.modulo = function( num, div ) {
2144  return ( ( num % div ) + div ) % div;
2145};
2146
2147// ----- makeArray ----- //
2148
2149var arraySlice = Array.prototype.slice;
2150
2151// turn element or nodeList into an array
2152utils.makeArray = function( obj ) {
2153  if ( Array.isArray( obj ) ) {
2154    // use object if already an array
2155    return obj;
2156  }
2157  // return empty array if undefined or null. #6
2158  if ( obj === null || obj === undefined ) {
2159    return [];
2160  }
2161
2162  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
2163  if ( isArrayLike ) {
2164    // convert nodeList to array
2165    return arraySlice.call( obj );
2166  }
2167
2168  // array of single index
2169  return [ obj ];
2170};
2171
2172// ----- removeFrom ----- //
2173
2174utils.removeFrom = function( ary, obj ) {
2175  var index = ary.indexOf( obj );
2176  if ( index != -1 ) {
2177    ary.splice( index, 1 );
2178  }
2179};
2180
2181// ----- getParent ----- //
2182
2183utils.getParent = function( elem, selector ) {
2184  while ( elem.parentNode && elem != document.body ) {
2185    elem = elem.parentNode;
2186    if ( matchesSelector( elem, selector ) ) {
2187      return elem;
2188    }
2189  }
2190};
2191
2192// ----- getQueryElement ----- //
2193
2194// use element as selector string
2195utils.getQueryElement = function( elem ) {
2196  if ( typeof elem == 'string' ) {
2197    return document.querySelector( elem );
2198  }
2199  return elem;
2200};
2201
2202// ----- handleEvent ----- //
2203
2204// enable .ontype to trigger from .addEventListener( elem, 'type' )
2205utils.handleEvent = function( event ) {
2206  var method = 'on' + event.type;
2207  if ( this[ method ] ) {
2208    this[ method ]( event );
2209  }
2210};
2211
2212// ----- filterFindElements ----- //
2213
2214utils.filterFindElements = function( elems, selector ) {
2215  // make array of elems
2216  elems = utils.makeArray( elems );
2217  var ffElems = [];
2218
2219  elems.forEach( function( elem ) {
2220    // check that elem is an actual element
2221    if ( !( elem instanceof HTMLElement ) ) {
2222      return;
2223    }
2224    // add elem if no selector
2225    if ( !selector ) {
2226      ffElems.push( elem );
2227      return;
2228    }
2229    // filter & find items if we have a selector
2230    // filter
2231    if ( matchesSelector( elem, selector ) ) {
2232      ffElems.push( elem );
2233    }
2234    // find children
2235    var childElems = elem.querySelectorAll( selector );
2236    // concat childElems to filterFound array
2237    for ( var i=0; i < childElems.length; i++ ) {
2238      ffElems.push( childElems[i] );
2239    }
2240  });
2241
2242  return ffElems;
2243};
2244
2245// ----- debounceMethod ----- //
2246
2247utils.debounceMethod = function( _class, methodName, threshold ) {
2248  threshold = threshold || 100;
2249  // original method
2250  var method = _class.prototype[ methodName ];
2251  var timeoutName = methodName + 'Timeout';
2252
2253  _class.prototype[ methodName ] = function() {
2254    var timeout = this[ timeoutName ];
2255    clearTimeout( timeout );
2256
2257    var args = arguments;
2258    var _this = this;
2259    this[ timeoutName ] = setTimeout( function() {
2260      method.apply( _this, args );
2261      delete _this[ timeoutName ];
2262    }, threshold );
2263  };
2264};
2265
2266// ----- docReady ----- //
2267
2268utils.docReady = function( callback ) {
2269  var readyState = document.readyState;
2270  if ( readyState == 'complete' || readyState == 'interactive' ) {
2271    // do async to allow for other scripts to run. metafizzy/flickity#441
2272    setTimeout( callback );
2273  } else {
2274    document.addEventListener( 'DOMContentLoaded', callback );
2275  }
2276};
2277
2278// ----- htmlInit ----- //
2279
2280// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
2281utils.toDashed = function( str ) {
2282  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
2283    return $1 + '-' + $2;
2284  }).toLowerCase();
2285};
2286
2287var console = window.console;
2288/**
2289 * allow user to initialize classes via [data-namespace] or .js-namespace class
2290 * htmlInit( Widget, 'widgetName' )
2291 * options are parsed from data-namespace-options
2292 */
2293utils.htmlInit = function( WidgetClass, namespace ) {
2294  utils.docReady( function() {
2295    var dashedNamespace = utils.toDashed( namespace );
2296    var dataAttr = 'data-' + dashedNamespace;
2297    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
2298    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
2299    var elems = utils.makeArray( dataAttrElems )
2300      .concat( utils.makeArray( jsDashElems ) );
2301    var dataOptionsAttr = dataAttr + '-options';
2302    var jQuery = window.jQuery;
2303
2304    elems.forEach( function( elem ) {
2305      var attr = elem.getAttribute( dataAttr ) ||
2306        elem.getAttribute( dataOptionsAttr );
2307      var options;
2308      try {
2309        options = attr && JSON.parse( attr );
2310      } catch ( error ) {
2311        // log error, do not initialize
2312        if ( console ) {
2313          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
2314          ': ' + error );
2315        }
2316        return;
2317      }
2318      // initialize
2319      var instance = new WidgetClass( elem, options );
2320      // make available via $().data('namespace')
2321      if ( jQuery ) {
2322        jQuery.data( elem, namespace, instance );
2323      }
2324    });
2325
2326  });
2327};
2328
2329// -----  ----- //
2330
2331return utils;
2332
2333}));
2334
2335
2336/***/ }),
2337/* 7 */
2338/***/ (function(module, exports, __webpack_require__) {
2339
2340var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
2341 * EvEmitter v1.1.0
2342 * Lil' event emitter
2343 * MIT License
2344 */
2345
2346/* jshint unused: true, undef: true, strict: true */
2347
2348( function( global, factory ) {
2349  // universal module definition
2350  /* jshint strict: false */ /* globals define, module, window */
2351  if ( true ) {
2352    // AMD - RequireJS
2353    !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
2354				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
2355				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
2356				__WEBPACK_AMD_DEFINE_FACTORY__),
2357				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2358  } else if ( typeof module == 'object' && module.exports ) {
2359    // CommonJS - Browserify, Webpack
2360    module.exports = factory();
2361  } else {
2362    // Browser globals
2363    global.EvEmitter = factory();
2364  }
2365
2366}( typeof window != 'undefined' ? window : this, function() {
2367
2368"use strict";
2369
2370function EvEmitter() {}
2371
2372var proto = EvEmitter.prototype;
2373
2374proto.on = function( eventName, listener ) {
2375  if ( !eventName || !listener ) {
2376    return;
2377  }
2378  // set events hash
2379  var events = this._events = this._events || {};
2380  // set listeners array
2381  var listeners = events[ eventName ] = events[ eventName ] || [];
2382  // only add once
2383  if ( listeners.indexOf( listener ) == -1 ) {
2384    listeners.push( listener );
2385  }
2386
2387  return this;
2388};
2389
2390proto.once = function( eventName, listener ) {
2391  if ( !eventName || !listener ) {
2392    return;
2393  }
2394  // add event
2395  this.on( eventName, listener );
2396  // set once flag
2397  // set onceEvents hash
2398  var onceEvents = this._onceEvents = this._onceEvents || {};
2399  // set onceListeners object
2400  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
2401  // set flag
2402  onceListeners[ listener ] = true;
2403
2404  return this;
2405};
2406
2407proto.off = function( eventName, listener ) {
2408  var listeners = this._events && this._events[ eventName ];
2409  if ( !listeners || !listeners.length ) {
2410    return;
2411  }
2412  var index = listeners.indexOf( listener );
2413  if ( index != -1 ) {
2414    listeners.splice( index, 1 );
2415  }
2416
2417  return this;
2418};
2419
2420proto.emitEvent = function( eventName, args ) {
2421  var listeners = this._events && this._events[ eventName ];
2422  if ( !listeners || !listeners.length ) {
2423    return;
2424  }
2425  // copy over to avoid interference if .off() in listener
2426  listeners = listeners.slice(0);
2427  args = args || [];
2428  // once stuff
2429  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
2430
2431  for ( var i=0; i < listeners.length; i++ ) {
2432    var listener = listeners[i]
2433    var isOnce = onceListeners && onceListeners[ listener ];
2434    if ( isOnce ) {
2435      // remove listener
2436      // remove before trigger to prevent recursion
2437      this.off( eventName, listener );
2438      // unset once flag
2439      delete onceListeners[ listener ];
2440    }
2441    // trigger listener
2442    listener.apply( this, args );
2443  }
2444
2445  return this;
2446};
2447
2448proto.allOff = function() {
2449  delete this._events;
2450  delete this._onceEvents;
2451};
2452
2453return EvEmitter;
2454
2455}));
2456
2457
2458/***/ }),
2459/* 8 */
2460/***/ (function(module, exports, __webpack_require__) {
2461
2462"use strict";
2463/* WEBPACK VAR INJECTION */(function($) {
2464
2465Object.defineProperty(exports, "__esModule", {
2466	value: true
2467});
2468
2469var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
2470
2471function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
2472
2473var EqualizeHeight = function () {
2474	function EqualizeHeight($elements) {
2475		_classCallCheck(this, EqualizeHeight);
2476
2477		this.$elements = $elements;
2478
2479		this.initialize();
2480	}
2481
2482	_createClass(EqualizeHeight, [{
2483		key: 'initialize',
2484		value: function initialize() {
2485			this.fixHeight();
2486
2487			$(window).on('load resize', this.fixHeight.bind(this));
2488		}
2489	}, {
2490		key: 'fixHeight',
2491		value: function fixHeight() {
2492			var _this = this;
2493			var height = 0;
2494
2495			this.$elements.each(function () {
2496				var $this = $(this);
2497
2498				_this.setHeight($this, 'auto');
2499
2500				if ($this.outerHeight() > height) {
2501					height = $this.outerHeight();
2502				}
2503			});
2504
2505            this.setHeight(this.$elements, height + 'px');
2506		}
2507	}, {
2508		key: 'setHeight',
2509		value: function setHeight($element, height) {
2510			$element.css({
2511				'height': height
2512			});
2513		}
2514	}]);
2515
2516	return EqualizeHeight;
2517}();
2518
2519exports.default = EqualizeHeight;
2520/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
2521
2522/***/ }),
2523/* 9 */
2524/***/ (function(module, exports, __webpack_require__) {
2525
2526"use strict";
2527/* WEBPACK VAR INJECTION */(function($) {
2528
2529var _isotopeLayout = __webpack_require__(4);
2530
2531var _isotopeLayout2 = _interopRequireDefault(_isotopeLayout);
2532
2533var _Toggles = __webpack_require__(18);
2534
2535var _Toggles2 = _interopRequireDefault(_Toggles);
2536
2537var _Grid = __webpack_require__(19);
2538
2539var _Grid2 = _interopRequireDefault(_Grid);
2540
2541var _FieldController = __webpack_require__(20);
2542
2543var _FieldController2 = _interopRequireDefault(_FieldController);
2544
2545var _ScrollAnimator = __webpack_require__(21);
2546
2547var _ScrollAnimator2 = _interopRequireDefault(_ScrollAnimator);
2548
2549var _EqualizeHeight = __webpack_require__(8);
2550
2551var _EqualizeHeight2 = _interopRequireDefault(_EqualizeHeight);
2552
2553var _stickyHeader = __webpack_require__(22);
2554
2555var _stickyHeader2 = _interopRequireDefault(_stickyHeader);
2556
2557function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2558
2559var $win = $(window);
2560
2561(0, _stickyHeader2.default)();
2562
2563new _Toggles2.default();
2564
2565new _FieldController2.default();
2566
2567new _EqualizeHeight2.default($('.js-masonry .item .item__inner'));
2568
2569new _EqualizeHeight2.default($('.js-masonry-secondary > *'));
2570
2571$win.on('load', function () {
2572	new _ScrollAnimator2.default($('.animate'), {
2573		animatedClass: 'animated',
2574		offset: function offset() {
2575			return $win.outerHeight() / 1;
2576		}
2577	});
2578
2579	$win.trigger('scroll');
2580
2581	if ($('.js-masonry').length) {
2582        new _Grid2.default($('.js-masonry > *'));
2583	}
2584
2585	if ($('.js-masonry-secondary').length) {
2586		var grd = document.querySelector('.js-masonry-secondary');
2587
2588		var $grid = new _isotopeLayout2.default(grd, {
2589			layoutMode: 'fitRows'
2590        });
2591
2592		$('.js-filters [data-filter]').on('click', function (e) {
2593			e.preventDefault();
2594
2595			var filterValue = $(this).data('filter');
2596			
2597			var sCurrFilter = filterValue.replace('.', '').replace('*', '');
2598			$("#txtCurrentCFseo").val(sCurrFilter);
2599			$("#txtPageCount").val(1);
2600			
2601			//$('.js-masonry-secondary > *').addClass('filtered');
2602		    //$grid.arrange({ filter: filterValue });
2603			var href = $(this).attr('href');
2604			self.location = href;
2605		});
2606	}
2607
2608	function checkNextPageExist(source, item, params) {
2609	    params = params ? params : {};
2610	    
2611	    $.ajax({
2612	        url: source,
2613	        data: params,
2614	        dataType: 'html',
2615	        error: function error() {
2616	            console.log('erorr loading new data');
2617	        },
2618	        success: function success(data) {
2619	            if (data == "") {
2620	                //alert("empty");
2621	                $(".js-load-more").css("display", "none");
2622	            }
2623	        }
2624	    });
2625	}
2626
2627	function loadMoreProducts(source, item, params) {
2628		params = params ? params : {};
2629
2630		$.ajax({
2631			url: source,
2632			data: params,
2633			dataType: 'html',
2634			error: function error() {
2635				console.log('erorr loading new data');
2636			},
2637			success: function success(data) {
2638			    //alert(data);
2639				if (item.hasClass('js-masonry-secondary')) {
2640					$grid.insert($(data));
2641
2642					new _EqualizeHeight2.default($('.js-masonry-secondary > *'));
2643
2644					$grid.layout();
2645				} else {
2646					$(data).each(function (i) {
2647						$(this).appendTo(item);
2648					});
2649				}
2650
2651				
2652                if (item.hasClass("project")) {
2653					//alert("project");
2654					var maxHeight = 0;
2655					$(".col--1of3.item .item__inner").each(function() {
2656						maxHeight = maxHeight > $(this).height() ? maxHeight : $(this).height();
2657                    });
2658
2659					if ($(".item-big--large").length > 0) {
2660                        if ($(window).width() >= 1024) { $(".item-big--large .item__inner").css("height", maxHeight);}
2661					}
2662					$(".col--1of3.item .item__inner").each(function() {
2663                        if ($(window).width() >= 1024) { $(".col--1of3.item .item__inner").height(maxHeight); }
2664					});					
2665					if ($(".col.col--1of3 .widget--inline").length > 0) {
2666                        if ($(window).width() >= 1024) { $(".col.col--1of3 .widget--inline").css("height", maxHeight); }
2667					}
2668					if ($(".col--1of3 .form--subscribe").length > 0) {		 	
2669                        if ($(window).width() >= 1024) { $(".col--1of3 .form--subscribe").css("height", maxHeight); }
2670					}
2671
2672				}
2673				else {
2674
2675					//alert("else");
2676					//for /publications/
2677					/*var maxHeight = 0;
2678					$(".col--1of3.item .item__inner").each(function() {
2679						maxHeight = maxHeight > $(this).height() ? maxHeight : $(this).height();
2680					});
2681					if ($(".item-big--large").length > 0) {
2682						if ($(window).width() > 1199) { $(".item-big--large .item__inner").css("height", maxHeight); }
2683					}
2684					$(".col--1of3.item .item__inner").each(function() {
2685						if ($(window).width() > 1199) { $(".col--1of3.item .item__inner").height(maxHeight); }
2686					});
2687					if ($(".col.col--1of3 .widget--inline").length > 0) {
2688						if ($(window).width() > 1199) { $(".col.col--1of3 .widget--inline").css("height", maxHeight); }
2689					}
2690					if ($(".col--1of3 .form--subscribe").length > 0) {		 	
2691						if ($(window).width() > 1199) { $(".col--1of3 .form--subscribe").css("height", maxHeight); }
2692					}*/
2693				}
2694			}
2695		});
2696	}
2697
2698	$('.js-load-more').on('click', function (e) {
2699	    e.preventDefault();    
2700
2701		//console.log("load more"); var myItem = $(".js-masonry-secondary").children().length + 1;
2702		//console.log($(".js-masonry-secondary").children().length);
2703		//$(".cols.js-masonry-secondary .item:last-child .item__inner>a").focus();
2704
2705	    var href = $(this).attr('href');
2706	    var hrefori = $(this).attr('href');
2707		var itemTarget = $(this).data('target-items');
2708		var item = $('[data-load=' + itemTarget + ']');
2709
2710		var myItemProject = 0;
2711		var myItem = 0;
2712		if (item.hasClass("project")) {
2713			var myItemProject = $(".project").children().length + 1;
2714		}
2715		else {
2716			var myItem = $(".js-masonry-secondary").children().length + 1;
2717		}
2718
2719		var iPageCount = $("#txtPageCount").val();
2720		$("#txtPageCount").val(parseInt(iPageCount) + 1);
2721
2722		var sCurrCFseo = $("#txtCurrentCFseo").val();
2723		var sSEOname = $("#txtSEOname").val();
2724		var sSEOtype = $("#txtSEOtype").val();
2725        
2726		var sNextPage = parseInt($("#txtPageCount").val()) + 1;
2727		var hrefNext = hrefori + "?page=" + sNextPage + "&seotype=" + sSEOtype + "&seoname=" + sSEOname + "&currcfseo=" + sCurrCFseo;
2728		checkNextPageExist(hrefNext, item, {});
2729
2730		href += "?page=" + $("#txtPageCount").val() + "&seotype=" + sSEOtype + "&seoname=" + sSEOname + "&currcfseo=" + sCurrCFseo;
2731		loadMoreProducts(href, item, {});
2732
2733		if (item.hasClass("project")) {
2734			$(".cols.project .item:nth-child(" + myItemProject + ") .item__inner>a").focus();
2735		}
2736		else {
2737			$(".cols.js-masonry-secondary .item:nth-child(" + myItem + ") .item__inner>a").focus();
2738		}
2739
2740	});
2741
2742	$('.tax-js-load-more').on('click', function (e) {
2743	    e.preventDefault();
2744
2745	    var href = $(this).attr('href');
2746	    var itemTarget = $(this).data('target-items');
2747		var item = $('[data-load=' + itemTarget + ']');
2748
2749		var myItem = $('[data-load=' + itemTarget + ']').children().length; 
2750
2751	    var sTaxSection = itemTarget.replace('tiles-load', '');
2752
2753	    var iPageCount = $("#txtPageCount" + sTaxSection).val();
2754	    $("#txtPageCount" + sTaxSection).val(parseInt(iPageCount) + 1);
2755
2756	    href += "?page=" + $("#txtPageCount" + sTaxSection).val() + "&taxsection=" + sTaxSection;
2757
2758		loadMoreProducts(href, item, {});
2759
2760
2761	    // for tax basic landing page
2762	    var iTotalPage = $("#txtPageTotal" + sTaxSection).val();
2763	    iPageCount = $("#txtPageCount" + sTaxSection).val();
2764	    if (iPageCount >= iTotalPage) {
2765	        $("#dv-link-more" + sTaxSection).css("display", "none");
2766		}
2767		//console.log(myItem); console.log($(this).data('target-items'));
2768		//$("[data-load='" + itemTarget + "'] .tile:nth-child(3) .tile__inner>a").focus();
2769		$("[data-load='" + itemTarget + "'] .tile:nth-child(" + myItem + ") .tile__inner").focus();
2770	});
2771});
2772
2773$('.btn-burger').on('click', function (e) {
2774	e.preventDefault();
2775
2776	$(this).toggleClass('active');
2777	$('li.dropdown').removeClass('dropdown-expanded');
2778	$('.header .header__content').toggleClass('expanded');
2779});
2780
2781function sidebarPosition() {
2782	var $sidebarElement = $('.js-sidebar-top');
2783	var $sidebar = $('.sidebar');
2784
2785	if ($sidebarElement.length && $sidebar.length) {
2786	    $sidebar.css('margin-top', $sidebarElement.outerHeight(true));
2787	}
2788}
2789
2790$('.footer .footer__cols h6 a').on('click', function (e) {
2791
2792	if ($win.width() < 1200) {
2793		e.preventDefault();
2794
2795		$(this).parent().next('.footer__nav').slideToggle().parent().toggleClass('expanded').siblings().removeClass('expanded').find('.footer__nav').slideUp();
2796	}
2797});
2798
2799if ($('.js-filters').length) {
2800	var filterText = $('.js-filters').find('.filter__body .active a').text();
2801
2802	$('.js-filters .filter__select strong').text(filterText);
2803}
2804
2805$('.js-filters .filter__select').on('click', function (e) {
2806	e.preventDefault();
2807
2808	$(this).closest('.js-filters').toggleClass('expanded');
2809});
2810
2811$('.js-filters .filter__body a').on('click', function (e) {
2812
2813	if (!$(this).closest('.js-alt').length) {
2814		e.preventDefault();
2815		var linkText = $(this).text();
2816
2817		$(this).closest('.js-filters').removeClass('expanded').find('.filter__select strong').text(linkText);
2818
2819		if ($(this).closest('.nav-inline').length) {
2820			$(this).closest('li').addClass('active').siblings().removeClass('active');
2821		}
2822	}
2823});
2824
2825$('.js-link-more').on('click', function (e) {
2826	e.preventDefault();
2827
2828	$(this).closest('ul').toggleClass('visible-list');
2829	if ($(".nav-inline ul li.active")) {
2830		$(".nav-inline ul li.active a").focus();
2831	}
2832	else {
2833		$("ul.visible-list li:nth-child(7) a").focus();
2834	}
2835});
2836
2837	$('.js-link-more').keypress(
2838		function (event) {
2839			console.log(event.which);
2840			if (event.which == 13) {
2841
2842				$(this).closest('ul').toggleClass('visible-list');
2843				if ($(".nav-inline ul li.active")) {
2844					$(".nav-inline ul li.active a").focus();
2845				}
2846				else {
2847					$("ul.visible-list li:nth-child(7) a").focus();
2848				}
2849			}
2850		}
2851	);
2852
2853$(document).on('updateFilter', function () {
2854	$('.js-filters .filter__select strong').text($('.js-filters .filter__body .active a').text());
2855});
2856
2857$('.form--join-link').on('click', function (e) {
2858	e.preventDefault();
2859
2860	$(this).toggleClass('active').closest('.form--join').find('.form__body').slideToggle();
2861});
2862
2863$win.on('load resize', function () {
2864	//sidebarPosition();    // remove to avaoid sidebar to look drop and put the margin-top on the aside tag
2865});
2866/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
2867
2868/***/ }),
2869/* 10 */
2870/***/ (function(module, exports) {
2871
2872var g;
2873
2874// This works in non-strict mode
2875g = (function() {
2876	return this;
2877})();
2878
2879try {
2880	// This works if eval is allowed (see CSP)
2881	g = g || Function("return this")() || (1,eval)("this");
2882} catch(e) {
2883	// This works if the window reference is available
2884	if(typeof window === "object")
2885		g = window;
2886}
2887
2888// g can still be undefined, but nothing to do about it...
2889// We return undefined, instead of nothing here, so it's
2890// easier to handle this case. if(!global) { ...}
2891
2892module.exports = g;
2893
2894
2895/***/ }),
2896/* 11 */
2897/***/ (function(module, exports, __webpack_require__) {
2898
2899var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
2900/*!
2901 * jQuery JavaScript Library v3.5.1
2902 * https://jquery.com/
2903 *
2904 * Includes Sizzle.js
2905 * https://sizzlejs.com/
2906 *
2907 * Copyright JS Foundation and other contributors
2908 * Released under the MIT license
2909 * https://jquery.org/license
2910 *
2911 * Date: 2020-05-04T22:49Z
2912 */
2913(function (global, factory) {
2914
2915	"use strict";
2916
2917	if (typeof module === "object" && typeof module.exports === "object") {
2918
2919		// For CommonJS and CommonJS-like environments where a proper `window`
2920		// is present, execute the factory and get jQuery.
2921		// For environments that do not have a `window` with a `document`
2922		// (such as Node.js), expose a factory as module.exports.
2923		// This accentuates the need for the creation of a real `window`.
2924		// e.g. var jQuery = require("jquery")(window);
2925		// See ticket #14549 for more info.
2926		module.exports = global.document ?
2927			factory(global, true) :
2928			function (w) {
2929				if (!w.document) {
2930					throw new Error("jQuery requires a window with a document");
2931				}
2932				return factory(w);
2933			};
2934	} else {
2935		factory(global);
2936	}
2937
2938	// Pass this if window is not defined yet
2939})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
2940
2941	// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
2942	// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
2943	// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 51,106 bytes, lines 2943-4647
2943ict mode should be common
2944	// enough that all such attempts are guarded in a try block.
2945	"use strict";
2946
2947	var arr = [];
2948
2949	var getProto = Object.getPrototypeOf;
2950
2951	var slice = arr.slice;
2952
2953	var flat = arr.flat ? function (array) {
2954		return arr.flat.call(array);
2955	} : function (array) {
2956		return arr.concat.apply([], array);
2957	};
2958
2959
2960	var push = arr.push;
2961
2962	var indexOf = arr.indexOf;
2963
2964	var class2type = {};
2965
2966	var toString = class2type.toString;
2967
2968	var hasOwn = class2type.hasOwnProperty;
2969
2970	var fnToString = hasOwn.toString;
2971
2972	var ObjectFunctionString = fnToString.call(Object);
2973
2974	var support = {};
2975
2976	var isFunction = function isFunction(obj) {
2977
2978		// Support: Chrome <=57, Firefox <=52
2979		// In some browsers, typeof returns "function" for HTML <object> elements
2980		// (i.e., `typeof document.createElement( "object" ) === "function"`).
2981		// We don't want to classify *any* DOM node as a function.
2982		return typeof obj === "function" && typeof obj.nodeType !== "number";
2983	};
2984
2985
2986	var isWindow = function isWindow(obj) {
2987		return obj != null && obj === obj.window;
2988	};
2989
2990
2991	var document = window.document;
2992
2993
2994
2995	var preservedScriptAttributes = {
2996		type: true,
2997		src: true,
2998		nonce: true,
2999		noModule: true
3000	};
3001
3002	function DOMEval(code, node, doc) {
3003		doc = doc || document;
3004
3005		var i, val,
3006			script = doc.createElement("script");
3007
3008		script.text = code;
3009		if (node) {
3010			for (i in preservedScriptAttributes) {
3011
3012				// Support: Firefox 64+, Edge 18+
3013				// Some browsers don't support the "nonce" property on scripts.
3014				// On the other hand, just using `getAttribute` is not enough as
3015				// the `nonce` attribute is reset to an empty string whenever it
3016				// becomes browsing-context connected.
3017				// See https://github.com/whatwg/html/issues/2369
3018				// See https://html.spec.whatwg.org/#nonce-attributes
3019				// The `node.getAttribute` check was added for the sake of
3020				// `jQuery.globalEval` so that it can fake a nonce-containing node
3021				// via an object.
3022				val = node[i] || node.getAttribute && node.getAttribute(i);
3023				if (val) {
3024					script.setAttribute(i, val);
3025				}
3026			}
3027		}
3028		doc.head.appendChild(script).parentNode.removeChild(script);
3029	}
3030
3031
3032	function toType(obj) {
3033		if (obj == null) {
3034			return obj + "";
3035		}
3036
3037		// Support: Android <=2.3 only (functionish RegExp)
3038		return typeof obj === "object" || typeof obj === "function" ?
3039			class2type[toString.call(obj)] || "object" :
3040			typeof obj;
3041	}
3042	/* global Symbol */
3043	// Defining this global in .eslintrc.json would create a danger of using the global
3044	// unguarded in another place, it seems safer to define global only for this module
3045
3046
3047
3048	var
3049		version = "3.5.1",
3050
3051		// Define a local copy of jQuery
3052		jQuery = function (selector, context) {
3053
3054			// The jQuery object is actually just the init constructor 'enhanced'
3055			// Need init if jQuery is called (just allow error to be thrown if not included)
3056			return new jQuery.fn.init(selector, context);
3057		};
3058
3059	jQuery.fn = jQuery.prototype = {
3060
3061		// The current version of jQuery being used
3062		jquery: version,
3063
3064		constructor: jQuery,
3065
3066		// The default length of a jQuery object is 0
3067		length: 0,
3068
3069		toArray: function () {
3070			return slice.call(this);
3071		},
3072
3073		// Get the Nth element in the matched element set OR
3074		// Get the whole matched element set as a clean array
3075		get: function (num) {
3076
3077			// Return all the elements in a clean array
3078			if (num == null) {
3079				return slice.call(this);
3080			}
3081
3082			// Return just the one element from the set
3083			return num < 0 ? this[num + this.length] : this[num];
3084		},
3085
3086		// Take an array of elements and push it onto the stack
3087		// (returning the new matched element set)
3088		pushStack: function (elems) {
3089
3090			// Build a new jQuery matched element set
3091			var ret = jQuery.merge(this.constructor(), elems);
3092
3093			// Add the old object onto the stack (as a reference)
3094			ret.prevObject = this;
3095
3096			// Return the newly-formed element set
3097			return ret;
3098		},
3099
3100		// Execute a callback for every element in the matched set.
3101		each: function (callback) {
3102			return jQuery.each(this, callback);
3103		},
3104
3105		map: function (callback) {
3106			return this.pushStack(jQuery.map(this, function (elem, i) {
3107				return callback.call(elem, i, elem);
3108			}));
3109		},
3110
3111		slice: function () {
3112			return this.pushStack(slice.apply(this, arguments));
3113		},
3114
3115		first: function () {
3116			return this.eq(0);
3117		},
3118
3119		last: function () {
3120			return this.eq(-1);
3121		},
3122
3123		even: function () {
3124			return this.pushStack(jQuery.grep(this, function (_elem, i) {
3125				return (i + 1) % 2;
3126			}));
3127		},
3128
3129		odd: function () {
3130			return this.pushStack(jQuery.grep(this, function (_elem, i) {
3131				return i % 2;
3132			}));
3133		},
3134
3135		eq: function (i) {
3136			var len = this.length,
3137				j = +i + (i < 0 ? len : 0);
3138			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
3139		},
3140
3141		end: function () {
3142			return this.prevObject || this.constructor();
3143		},
3144
3145		// For internal use only.
3146		// Behaves like an Array's method, not like a jQuery method.
3147		push: push,
3148		sort: arr.sort,
3149		splice: arr.splice
3150	};
3151
3152	jQuery.extend = jQuery.fn.extend = function () {
3153		var options, name, src, copy, copyIsArray, clone,
3154			target = arguments[0] || {},
3155			i = 1,
3156			length = arguments.length,
3157			deep = false;
3158
3159		// Handle a deep copy situation
3160		if (typeof target === "boolean") {
3161			deep = target;
3162
3163			// Skip the boolean and the target
3164			target = arguments[i] || {};
3165			i++;
3166		}
3167
3168		// Handle case when target is a string or something (possible in deep copy)
3169		if (typeof target !== "object" && !isFunction(target)) {
3170			target = {};
3171		}
3172
3173		// Extend jQuery itself if only one argument is passed
3174		if (i === length) {
3175			target = this;
3176			i--;
3177		}
3178
3179		for (; i < length; i++) {
3180
3181			// Only deal with non-null/undefined values
3182			if ((options = arguments[i]) != null) {
3183
3184				// Extend the base object
3185				for (name in options) {
3186					copy = options[name];
3187
3188					// Prevent Object.prototype pollution
3189					// Prevent never-ending loop
3190					if (name === "__proto__" || target === copy) {
3191						continue;
3192					}
3193
3194					// Recurse if we're merging plain objects or arrays
3195					if (deep && copy && (jQuery.isPlainObject(copy) ||
3196						(copyIsArray = Array.isArray(copy)))) {
3197						src = target[name];
3198
3199						// Ensure proper type for the source value
3200						if (copyIsArray && !Array.isArray(src)) {
3201							clone = [];
3202						} else if (!copyIsArray && !jQuery.isPlainObject(src)) {
3203							clone = {};
3204						} else {
3205							clone = src;
3206						}
3207						copyIsArray = false;
3208
3209						// Never move original objects, clone them
3210						target[name] = jQuery.extend(deep, clone, copy);
3211
3212						// Don't bring in undefined values
3213					} else if (copy !== undefined) {
3214						target[name] = copy;
3215					}
3216				}
3217			}
3218		}
3219
3220		// Return the modified object
3221		return target;
3222	};
3223
3224	jQuery.extend({
3225
3226		// Unique for each copy of jQuery on the page
3227		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
3228
3229		// Assume jQuery is ready without the ready module
3230		isReady: true,
3231
3232		error: function (msg) {
3233			throw new Error(msg);
3234		},
3235
3236		noop: function () { },
3237
3238		isPlainObject: function (obj) {
3239			var proto, Ctor;
3240
3241			// Detect obvious negatives
3242			// Use toString instead of jQuery.type to catch host objects
3243			if (!obj || toString.call(obj) !== "[object Object]") {
3244				return false;
3245			}
3246
3247			proto = getProto(obj);
3248
3249			// Objects with no prototype (e.g., `Object.create( null )`) are plain
3250			if (!proto) {
3251				return true;
3252			}
3253
3254			// Objects with prototype are plain iff they were constructed by a global Object function
3255			Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
3256			return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
3257		},
3258
3259		isEmptyObject: function (obj) {
3260			var name;
3261
3262			for (name in obj) {
3263				return false;
3264			}
3265			return true;
3266		},
3267
3268		// Evaluates a script in a provided context; falls back to the global one
3269		// if not specified.
3270		globalEval: function (code, options, doc) {
3271			DOMEval(code, { nonce: options && options.nonce }, doc);
3272		},
3273
3274		each: function (obj, callback) {
3275			var length, i = 0;
3276
3277			if (isArrayLike(obj)) {
3278				length = obj.length;
3279				for (; i < length; i++) {
3280					if (callback.call(obj[i], i, obj[i]) === false) {
3281						break;
3282					}
3283				}
3284			} else {
3285				for (i in obj) {
3286					if (callback.call(obj[i], i, obj[i]) === false) {
3287						break;
3288					}
3289				}
3290			}
3291
3292			return obj;
3293		},
3294
3295		// results is for internal usage only
3296		makeArray: function (arr, results) {
3297			var ret = results || [];
3298
3299			if (arr != null) {
3300				if (isArrayLike(Object(arr))) {
3301					jQuery.merge(ret,
3302						typeof arr === "string" ?
3303							[arr] : arr
3304					);
3305				} else {
3306					push.call(ret, arr);
3307				}
3308			}
3309
3310			return ret;
3311		},
3312
3313		inArray: function (elem, arr, i) {
3314			return arr == null ? -1 : indexOf.call(arr, elem, i);
3315		},
3316
3317		// Support: Android <=4.0 only, PhantomJS 1 only
3318		// push.apply(_, arraylike) throws on ancient WebKit
3319		merge: function (first, second) {
3320			var len = +second.length,
3321				j = 0,
3322				i = first.length;
3323
3324			for (; j < len; j++) {
3325				first[i++] = second[j];
3326			}
3327
3328			first.length = i;
3329
3330			return first;
3331		},
3332
3333		grep: function (elems, callback, invert) {
3334			var callbackInverse,
3335				matches = [],
3336				i = 0,
3337				length = elems.length,
3338				callbackExpect = !invert;
3339
3340			// Go through the array, only saving the items
3341			// that pass the validator function
3342			for (; i < length; i++) {
3343				callbackInverse = !callback(elems[i], i);
3344				if (callbackInverse !== callbackExpect) {
3345					matches.push(elems[i]);
3346				}
3347			}
3348
3349			return matches;
3350		},
3351
3352		// arg is for internal usage only
3353		map: function (elems, callback, arg) {
3354			var length, value,
3355				i = 0,
3356				ret = [];
3357
3358			// Go through the array, translating each of the items to their new values
3359			if (isArrayLike(elems)) {
3360				length = elems.length;
3361				for (; i < length; i++) {
3362					value = callback(elems[i], i, arg);
3363
3364					if (value != null) {
3365						ret.push(value);
3366					}
3367				}
3368
3369				// Go through every key on the object,
3370			} else {
3371				for (i in elems) {
3372					value = callback(elems[i], i, arg);
3373
3374					if (value != null) {
3375						ret.push(value);
3376					}
3377				}
3378			}
3379
3380			// Flatten any nested arrays
3381			return flat(ret);
3382		},
3383
3384		// A global GUID counter for objects
3385		guid: 1,
3386
3387		// jQuery.support is not used in Core but other projects attach their
3388		// properties to it so it needs to exist.
3389		support: support
3390	});
3391
3392	if (typeof Symbol === "function") {
3393		jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
3394	}
3395
3396	// Populate the class2type map
3397	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
3398		function (_i, name) {
3399			class2type["[object " + name + "]"] = name.toLowerCase();
3400		});
3401
3402	function isArrayLike(obj) {
3403
3404		// Support: real iOS 8.2 only (not reproducible in simulator)
3405		// `in` check used to prevent JIT error (gh-2145)
3406		// hasOwn isn't used here due to false negatives
3407		// regarding Nodelist length in IE
3408		var length = !!obj && "length" in obj && obj.length,
3409			type = toType(obj);
3410
3411		if (isFunction(obj) || isWindow(obj)) {
3412			return false;
3413		}
3414
3415		return type === "array" || length === 0 ||
3416			typeof length === "number" && length > 0 && (length - 1) in obj;
3417	}
3418	var Sizzle =
3419		/*!
3420		 * Sizzle CSS Selector Engine v2.3.5
3421		 * https://sizzlejs.com/
3422		 *
3423		 * Copyright JS Foundation and other contributors
3424		 * Released under the MIT license
3425		 * https://js.foundation/
3426		 *
3427		 * Date: 2020-03-14
3428		 */
3429		(function (window) {
3430			var i,
3431				support,
3432				Expr,
3433				getText,
3434				isXML,
3435				tokenize,
3436				compile,
3437				select,
3438				outermostContext,
3439				sortInput,
3440				hasDuplicate,
3441
3442				// Local document vars
3443				setDocument,
3444				document,
3445				docElem,
3446				documentIsHTML,
3447				rbuggyQSA,
3448				rbuggyMatches,
3449				matches,
3450				contains,
3451
3452				// Instance-specific data
3453				expando = "sizzle" + 1 * new Date(),
3454				preferredDoc = window.document,
3455				dirruns = 0,
3456				done = 0,
3457				classCache = createCache(),
3458				tokenCache = createCache(),
3459				compilerCache = createCache(),
3460				nonnativeSelectorCache = createCache(),
3461				sortOrder = function (a, b) {
3462					if (a === b) {
3463						hasDuplicate = true;
3464					}
3465					return 0;
3466				},
3467
3468				// Instance methods
3469				hasOwn = ({}).hasOwnProperty,
3470				arr = [],
3471				pop = arr.pop,
3472				pushNative = arr.push,
3473				push = arr.push,
3474				slice = arr.slice,
3475
3476				// Use a stripped-down indexOf as it's faster than native
3477				// https://jsperf.com/thor-indexof-vs-for/5
3478				indexOf = function (list, elem) {
3479					var i = 0,
3480						len = list.length;
3481					for (; i < len; i++) {
3482						if (list[i] === elem) {
3483							return i;
3484						}
3485					}
3486					return -1;
3487				},
3488
3489				booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
3490					"ismap|loop|multiple|open|readonly|required|scoped",
3491
3492				// Regular expressions
3493
3494				// http://www.w3.org/TR/css3-selectors/#whitespace
3495				whitespace = "[\\x20\\t\\r\\n\\f]",
3496
3497				// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
3498				identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
3499					"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
3500
3501				// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
3502				attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
3503
3504					// Operator (capture 2)
3505					"*([*^$|!~]?=)" + whitespace +
3506
3507					// "Attribute values must be CSS identifiers [capture 5]
3508					// or strings [capture 3 or capture 4]"
3509					"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
3510					whitespace + "*\\]",
3511
3512				pseudos = ":(" + identifier + ")(?:\\((" +
3513
3514					// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
3515					// 1. quoted (capture 3; capture 4 or capture 5)
3516					"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
3517
3518					// 2. simple (capture 6)
3519					"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
3520
3521					// 3. anything else (capture 2)
3522					".*" +
3523					")\\)|)",
3524
3525				// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
3526				rwhitespace = new RegExp(whitespace + "+", "g"),
3527				rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
3528					whitespace + "+$", "g"),
3529
3530				rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
3531				rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
3532					"*"),
3533				rdescend = new RegExp(whitespace + "|>"),
3534
3535				rpseudo = new RegExp(pseudos),
3536				ridentifier = new RegExp("^" + identifier + "$"),
3537
3538				matchExpr = {
3539					"ID": new RegExp("^#(" + identifier + ")"),
3540					"CLASS": new RegExp("^\\.(" + identifier + ")"),
3541					"TAG": new RegExp("^(" + identifier + "|[*])"),
3542					"ATTR": new RegExp("^" + attributes),
3543					"PSEUDO": new RegExp("^" + pseudos),
3544					"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
3545						whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
3546						whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
3547					"bool": new RegExp("^(?:" + booleans + ")$", "i"),
3548
3549					// For use in libraries implementing .is()
3550					// We use this for POS matching in `select`
3551					"needsContext": new RegExp("^" + whitespace +
3552						"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
3553						"*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
3554				},
3555
3556				rhtml = /HTML$/i,
3557				rinputs = /^(?:input|select|textarea|button)$/i,
3558				rheader = /^h\d$/i,
3559
3560				rnative = /^[^{]+\{\s*\[native \w/,
3561
3562				// Easily-parseable/retrievable ID or TAG or CLASS selectors
3563				rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
3564
3565				rsibling = /[+~]/,
3566
3567				// CSS escapes
3568				// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
3569				runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"),
3570				funescape = function (escape, nonHex) {
3571					var high = "0x" + escape.slice(1) - 0x10000;
3572
3573					return nonHex ?
3574
3575						// Strip the backslash prefix from a non-hex escape sequence
3576						nonHex :
3577
3578						// Replace a hexadecimal escape sequence with the encoded Unicode code point
3579						// Support: IE <=11+
3580						// For values outside the Basic Multilingual Plane (BMP), manually construct a
3581						// surrogate pair
3582						high < 0 ?
3583							String.fromCharCode(high + 0x10000) :
3584							String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
3585				},
3586
3587				// CSS string/identifier serialization
3588				// https://drafts.csswg.org/cssom/#common-serializing-idioms
3589				rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
3590				fcssescape = function (ch, asCodePoint) {
3591					if (asCodePoint) {
3592
3593						// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
3594						if (ch === "\0") {
3595							return "\uFFFD";
3596						}
3597
3598						// Control characters and (dependent upon position) numbers get escaped as code points
3599						return ch.slice(0, -1) + "\\" +
3600							ch.charCodeAt(ch.length - 1).toString(16) + " ";
3601					}
3602
3603					// Other potentially-special ASCII characters get backslash-escaped
3604					return "\\" + ch;
3605				},
3606
3607				// Used for iframes
3608				// See setDocument()
3609				// Removing the function wrapper causes a "Permission Denied"
3610				// error in IE
3611				unloadHandler = function () {
3612					setDocument();
3613				},
3614
3615				inDisabledFieldset = addCombinator(
3616					function (elem) {
3617						return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
3618					},
3619					{ dir: "parentNode", next: "legend" }
3620				);
3621
3622			// Optimize for push.apply( _, NodeList )
3623			try {
3624				push.apply(
3625					(arr = slice.call(preferredDoc.childNodes)),
3626					preferredDoc.childNodes
3627				);
3628
3629				// Support: Android<4.0
3630				// Detect silently failing push.apply
3631				// eslint-disable-next-line no-unused-expressions
3632				arr[preferredDoc.childNodes.length].nodeType;
3633			} catch (e) {
3634				push = {
3635					apply: arr.length ?
3636
3637						// Leverage slice if possible
3638						function (target, els) {
3639							pushNative.apply(target, slice.call(els));
3640						} :
3641
3642						// Support: IE<9
3643						// Otherwise append directly
3644						function (target, els) {
3645							var j = target.length,
3646								i = 0;
3647
3648							// Can't trust NodeList.length
3649							while ((target[j++] = els[i++])) { }
3650							target.length = j - 1;
3651						}
3652				};
3653			}
3654
3655			function Sizzle(selector, context, results, seed) {
3656				var m, i, elem, nid, match, groups, newSelector,
3657					newContext = context && context.ownerDocument,
3658
3659					// nodeType defaults to 9, since context defaults to document
3660					nodeType = context ? context.nodeType : 9;
3661
3662				results = results || [];
3663
3664				// Return early from calls with invalid selector or context
3665				if (typeof selector !== "string" || !selector ||
3666					nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
3667
3668					return results;
3669				}
3670
3671				// Try to shortcut find operations (as opposed to filters) in HTML documents
3672				if (!seed) {
3673					setDocument(context);
3674					context = context || document;
3675
3676					if (documentIsHTML) {
3677
3678						// If the selector is sufficiently simple, try using a "get*By*" DOM method
3679						// (excepting DocumentFragment context, where the methods don't exist)
3680						if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
3681
3682							// ID selector
3683							if ((m = match[1])) {
3684
3685								// Document context
3686								if (nodeType === 9) {
3687									if ((elem = context.getElementById(m))) {
3688
3689										// Support: IE, Opera, Webkit
3690										// TODO: identify versions
3691										// getElementById can match elements by name instead of ID
3692										if (elem.id === m) {
3693											results.push(elem);
3694											return results;
3695										}
3696									} else {
3697										return results;
3698									}
3699
3700									// Element context
3701								} else {
3702
3703									// Support: IE, Opera, Webkit
3704									// TODO: identify versions
3705									// getElementById can match elements by name instead of ID
3706									if (newContext && (elem = newContext.getElementById(m)) &&
3707										contains(context, elem) &&
3708										elem.id === m) {
3709
3710										results.push(elem);
3711										return results;
3712									}
3713								}
3714
3715								// Type selector
3716							} else if (match[2]) {
3717								push.apply(results, context.getElementsByTagName(selector));
3718								return results;
3719
3720								// Class selector
3721							} else if ((m = match[3]) && support.getElementsByClassName &&
3722								context.getElementsByClassName) {
3723
3724								push.apply(results, context.getElementsByClassName(m));
3725								return results;
3726							}
3727						}
3728
3729						// Take advantage of querySelectorAll
3730						if (support.qsa &&
3731							!nonnativeSelectorCache[selector + " "] &&
3732							(!rbuggyQSA || !rbuggyQSA.test(selector)) &&
3733
3734							// Support: IE 8 only
3735							// Exclude object elements
3736							(nodeType !== 1 || context.nodeName.toLowerCase() !== "object")) {
3737
3738							newSelector = selector;
3739							newContext = context;
3740
3741							// qSA considers elements outside a scoping root when evaluating child or
3742							// descendant combinators, which is not what we want.
3743							// In such cases, we work around the behavior by prefixing every selector in the
3744							// list with an ID selector referencing the scope context.
3745							// The technique has to be used as well when a leading combinator is used
3746							// as such selectors are not recognized by querySelectorAll.
3747							// Thanks to Andrew Dupont for this technique.
3748							if (nodeType === 1 &&
3749								(rdescend.test(selector) || rcombinators.test(selector))) {
3750
3751								// Expand context for sibling selectors
3752								newContext = rsibling.test(selector) && testContext(context.parentNode) ||
3753									context;
3754
3755								// We can use :scope instead of the ID hack if the browser
3756								// supports it & if we're not changing the context.
3757								if (newContext !== context || !support.scope) {
3758
3759									// Capture the context ID, setting it first if necessary
3760									if ((nid = context.getAttribute("id"))) {
3761										nid = nid.replace(rcssescape, fcssescape);
3762									} else {
3763										context.setAttribute("id", (nid = expando));
3764									}
3765								}
3766
3767								// Prefix every selector in the list
3768								groups = tokenize(selector);
3769								i = groups.length;
3770								while (i--) {
3771									groups[i] = (nid ? "#" + nid : ":scope") + " " +
3772										toSelector(groups[i]);
3773								}
3774								newSelector = groups.join(",");
3775							}
3776
3777							try {
3778								push.apply(results,
3779									newContext.querySelectorAll(newSelector)
3780								);
3781								return results;
3782							} catch (qsaError) {
3783								nonnativeSelectorCache(selector, true);
3784							} finally {
3785								if (nid === expando) {
3786									context.removeAttribute("id");
3787								}
3788							}
3789						}
3790					}
3791				}
3792
3793				// All others
3794				return select(selector.replace(rtrim, "$1"), context, results, seed);
3795			}
3796
3797			/**
3798			 * Create key-value caches of limited size
3799			 * @returns {function(string, object)} Returns the Object data after storing it on itself with
3800			 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
3801			 *	deleting the oldest entry
3802			 */
3803			function createCache() {
3804				var keys = [];
3805
3806				function cache(key, value) {
3807
3808					// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
3809					if (keys.push(key + " ") > Expr.cacheLength) {
3810
3811						// Only keep the most recent entries
3812						delete cache[keys.shift()];
3813					}
3814					return (cache[key + " "] = value);
3815				}
3816				return cache;
3817			}
3818
3819			/**
3820			 * Mark a function for special use by Sizzle
3821			 * @param {Function} fn The function to mark
3822			 */
3823			function markFunction(fn) {
3824				fn[expando] = true;
3825				return fn;
3826			}
3827
3828			/**
3829			 * Support testing using an element
3830			 * @param {Function} fn Passed the created element and returns a boolean result
3831			 */
3832			function assert(fn) {
3833				var el = document.createElement("fieldset");
3834
3835				try {
3836					return !!fn(el);
3837				} catch (e) {
3838					return false;
3839				} finally {
3840
3841					// Remove from its parent by default
3842					if (el.parentNode) {
3843						el.parentNode.removeChild(el);
3844					}
3845
3846					// release memory in IE
3847					el = null;
3848				}
3849			}
3850
3851			/**
3852			 * Adds the same handler for all of the specified attrs
3853			 * @param {String} attrs Pipe-separated list of attributes
3854			 * @param {Function} handler The method that will be applied
3855			 */
3856			function addHandle(attrs, handler) {
3857				var arr = attrs.split("|"),
3858					i = arr.length;
3859
3860				while (i--) {
3861					Expr.attrHandle[arr[i]] = handler;
3862				}
3863			}
3864
3865			/**
3866			 * Checks document order of two siblings
3867			 * @param {Element} a
3868			 * @param {Element} b
3869			 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
3870			 */
3871			function siblingCheck(a, b) {
3872				var cur = b && a,
3873					diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
3874						a.sourceIndex - b.sourceIndex;
3875
3876				// Use IE sourceIndex if available on both nodes
3877				if (diff) {
3878					return diff;
3879				}
3880
3881				// Check if b follows a
3882				if (cur) {
3883					while ((cur = cur.nextSibling)) {
3884						if (cur === b) {
3885							return -1;
3886						}
3887					}
3888				}
3889
3890				return a ? 1 : -1;
3891			}
3892
3893			/**
3894			 * Returns a function to use in pseudos for input types
3895			 * @param {String} type
3896			 */
3897			function createInputPseudo(type) {
3898				return function (elem) {
3899					var name = elem.nodeName.toLowerCase();
3900					return name === "input" && elem.type === type;
3901				};
3902			}
3903
3904			/**
3905			 * Returns a function to use in pseudos for buttons
3906			 * @param {String} type
3907			 */
3908			function createButtonPseudo(type) {
3909				return function (elem) {
3910					var name = elem.nodeName.toLowerCase();
3911					return (name === "input" || name === "button") && elem.type === type;
3912				};
3913			}
3914
3915			/**
3916			 * Returns a function to use in pseudos for :enabled/:disabled
3917			 * @param {Boolean} disabled true for :disabled; false for :enabled
3918			 */
3919			function createDisabledPseudo(disabled) {
3920
3921				// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
3922				return function (elem) {
3923
3924					// Only certain elements can match :enabled or :disabled
3925					// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
3926					// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
3927					if ("form" in elem) {
3928
3929						// Check for inherited disabledness on relevant non-disabled elements:
3930						// * listed form-associated elements in a disabled fieldset
3931						//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
3932						//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
3933						// * option elements in a disabled optgroup
3934						//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
3935						// All such elements have a "form" property.
3936						if (elem.parentNode && elem.disabled === false) {
3937
3938							// Option elements defer to a parent optgroup if present
3939							if ("label" in elem) {
3940								if ("label" in elem.parentNode) {
3941									return elem.parentNode.disabled === disabled;
3942								} else {
3943									return elem.disabled === disabled;
3944								}
3945							}
3946
3947							// Support: IE 6 - 11
3948							// Use the isDisabled shortcut property to check for disabled fieldset ancestors
3949							return elem.isDisabled === disabled ||
3950
3951								// Where there is no isDisabled, check manually
3952								/* jshint -W018 */
3953								elem.isDisabled !== !disabled &&
3954								inDisabledFieldset(elem) === disabled;
3955						}
3956
3957						return elem.disabled === disabled;
3958
3959						// Try to winnow out elements that can't be disabled before trusting the disabled property.
3960						// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
3961						// even exist on them, let alone have a boolean value.
3962					} else if ("label" in elem) {
3963						return elem.disabled === disabled;
3964					}
3965
3966					// Remaining elements are neither :enabled nor :disabled
3967					return false;
3968				};
3969			}
3970
3971			/**
3972			 * Returns a function to use in pseudos for positionals
3973			 * @param {Function} fn
3974			 */
3975			function createPositionalPseudo(fn) {
3976				return markFunction(function (argument) {
3977					argument = +argument;
3978					return markFunction(function (seed, matches) {
3979						var j,
3980							matchIndexes = fn([], seed.length, argument),
3981							i = matchIndexes.length;
3982
3983						// Match elements found at the specified indexes
3984						while (i--) {
3985							if (seed[(j = matchIndexes[i])]) {
3986								seed[j] = !(matches[j] = seed[j]);
3987							}
3988						}
3989					});
3990				});
3991			}
3992
3993			/**
3994			 * Checks a node for validity as a Sizzle context
3995			 * @param {Element|Object=} context
3996			 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
3997			 */
3998			function testContext(context) {
3999				return context && typeof context.getElementsByTagName !== "undefined" && context;
4000			}
4001
4002			// Expose support vars for convenience
4003			support = Sizzle.support = {};
4004
4005			/**
4006			 * Detects XML nodes
4007			 * @param {Element|Object} elem An element or a document
4008			 * @returns {Boolean} True iff elem is a non-HTML XML node
4009			 */
4010			isXML = Sizzle.isXML = function (elem) {
4011				var namespace = elem.namespaceURI,
4012					docElem = (elem.ownerDocument || elem).documentElement;
4013
4014				// Support: IE <=8
4015				// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
4016				// https://bugs.jquery.com/ticket/4833
4017				return !rhtml.test(namespace || docElem && docElem.nodeName || "HTML");
4018			};
4019
4020			/**
4021			 * Sets document-related variables once based on the current document
4022			 * @param {Element|Object} [doc] An element or document object to use to set the document
4023			 * @returns {Object} Returns the current document
4024			 */
4025			setDocument = Sizzle.setDocument = function (node) {
4026				var hasCompare, subWindow,
4027					doc = node ? node.ownerDocument || node : preferredDoc;
4028
4029				// Return early if doc is invalid or already selected
4030				// Support: IE 11+, Edge 17 - 18+
4031				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4032				// two documents; shallow comparisons work.
4033				// eslint-disable-next-line eqeqeq
4034				if (doc == document || doc.nodeType !== 9 || !doc.documentElement) {
4035					return document;
4036				}
4037
4038				// Update global variables
4039				document = doc;
4040				docElem = document.documentElement;
4041				documentIsHTML = !isXML(document);
4042
4043				// Support: IE 9 - 11+, Edge 12 - 18+
4044				// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
4045				// Support: IE 11+, Edge 17 - 18+
4046				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4047				// two documents; shallow comparisons work.
4048				// eslint-disable-next-line eqeqeq
4049				if (preferredDoc != document &&
4050					(subWindow = document.defaultView) && subWindow.top !== subWindow) {
4051
4052					// Support: IE 11, Edge
4053					if (subWindow.addEventListener) {
4054						subWindow.addEventListener("unload", unloadHandler, false);
4055
4056						// Support: IE 9 - 10 only
4057					} else if (subWindow.attachEvent) {
4058						subWindow.attachEvent("onunload", unloadHandler);
4059					}
4060				}
4061
4062				// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
4063				// Safari 4 - 5 only, Opera <=11.6 - 12.x only
4064				// IE/Edge & older browsers don't support the :scope pseudo-class.
4065				// Support: Safari 6.0 only
4066				// Safari 6.0 supports :scope but it's an alias of :root there.
4067				support.scope = assert(function (el) {
4068					docElem.appendChild(el).appendChild(document.createElement("div"));
4069					return typeof el.querySelectorAll !== "undefined" &&
4070						!el.querySelectorAll(":scope fieldset div").length;
4071				});
4072
4073				/* Attributes
4074				---------------------------------------------------------------------- */
4075
4076				// Support: IE<8
4077				// Verify that getAttribute really returns attributes and not properties
4078				// (excepting IE8 booleans)
4079				support.attributes = assert(function (el) {
4080					el.className = "i";
4081					return !el.getAttribute("className");
4082				});
4083
4084				/* getElement(s)By*
4085				---------------------------------------------------------------------- */
4086
4087				// Check if getElementsByTagName("*") returns only elements
4088				support.getElementsByTagName = assert(function (el) {
4089					el.appendChild(document.createComment(""));
4090					return !el.getElementsByTagName("*").length;
4091				});
4092
4093				// Support: IE<9
4094				support.getElementsByClassName = rnative.test(document.getElementsByClassName);
4095
4096				// Support: IE<10
4097				// Check if getElementById returns elements by name
4098				// The broken getElementById methods don't pick up programmatically-set names,
4099				// so use a roundabout getElementsByName test
4100				support.getById = assert(function (el) {
4101					docElem.appendChild(el).id = expando;
4102					return !document.getElementsByName || !document.getElementsByName(expando).length;
4103				});
4104
4105				// ID filter and find
4106				if (support.getById) {
4107					Expr.filter["ID"] = function (id) {
4108						var attrId = id.replace(runescape, funescape);
4109						return function (elem) {
4110							return elem.getAttribute("id") === attrId;
4111						};
4112					};
4113					Expr.find["ID"] = function (id, context) {
4114						if (typeof context.getElementById !== "undefined" && documentIsHTML) {
4115							var elem = context.getElementById(id);
4116							return elem ? [elem] : [];
4117						}
4118					};
4119				} else {
4120					Expr.filter["ID"] = function (id) {
4121						var attrId = id.replace(runescape, funescape);
4122						return function (elem) {
4123							var node = typeof elem.getAttributeNode !== "undefined" &&
4124								elem.getAttributeNode("id");
4125							return node && node.value === attrId;
4126						};
4127					};
4128
4129					// Support: IE 6 - 7 only
4130					// getElementById is not reliable as a find shortcut
4131					Expr.find["ID"] = function (id, context) {
4132						if (typeof context.getElementById !== "undefined" && documentIsHTML) {
4133							var node, i, elems,
4134								elem = context.getElementById(id);
4135
4136							if (elem) {
4137
4138								// Verify the id attribute
4139								node = elem.getAttributeNode("id");
4140								if (node && node.value === id) {
4141									return [elem];
4142								}
4143
4144								// Fall back on getElementsByName
4145								elems = context.getElementsByName(id);
4146								i = 0;
4147								while ((elem = elems[i++])) {
4148									node = elem.getAttributeNode("id");
4149									if (node && node.value === id) {
4150										return [elem];
4151									}
4152								}
4153							}
4154
4155							return [];
4156						}
4157					};
4158				}
4159
4160				// Tag
4161				Expr.find["TAG"] = support.getElementsByTagName ?
4162					function (tag, context) {
4163						if (typeof context.getElementsByTagName !== "undefined") {
4164							return context.getElementsByTagName(tag);
4165
4166							// DocumentFragment nodes don't have gEBTN
4167						} else if (support.qsa) {
4168							return context.querySelectorAll(tag);
4169						}
4170					} :
4171
4172					function (tag, context) {
4173						var elem,
4174							tmp = [],
4175							i = 0,
4176
4177							// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
4178							results = context.getElementsByTagName(tag);
4179
4180						// Filter out possible comments
4181						if (tag === "*") {
4182							while ((elem = results[i++])) {
4183								if (elem.nodeType === 1) {
4184									tmp.push(elem);
4185								}
4186							}
4187
4188							return tmp;
4189						}
4190						return results;
4191					};
4192
4193				// Class
4194				Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
4195					if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
4196						return context.getElementsByClassName(className);
4197					}
4198				};
4199
4200				/* QSA/matchesSelector
4201				---------------------------------------------------------------------- */
4202
4203				// QSA and matchesSelector support
4204
4205				// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
4206				rbuggyMatches = [];
4207
4208				// qSa(:focus) reports false when true (Chrome 21)
4209				// We allow this because of a bug in IE8/9 that throws an error
4210				// whenever `document.activeElement` is accessed on an iframe
4211				// So, we allow :focus to pass through QSA all the time to avoid the IE error
4212				// See https://bugs.jquery.com/ticket/13378
4213				rbuggyQSA = [];
4214
4215				if ((support.qsa = rnative.test(document.querySelectorAll))) {
4216
4217					// Build QSA regex
4218					// Regex strategy adopted from Diego Perini
4219					assert(function (el) {
4220
4221						var input;
4222
4223						// Select is set to empty string on purpose
4224						// This is to test IE's treatment of not explicitly
4225						// setting a boolean content attribute,
4226						// since its presence should be enough
4227						// https://bugs.jquery.com/ticket/12359
4228						docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a>" +
4229							"<select id='" + expando + "-\r\\' msallowcapture=''>" +
4230							"<option selected=''></option></select>";
4231
4232						// Support: IE8, Opera 11-12.16
4233						// Nothing should be selected when empty strings follow ^= or $= or *=
4234						// The test attribute must be unknown in Opera but "safe" for WinRT
4235						// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
4236						if (el.querySelectorAll("[msallowcapture^='']").length) {
4237							rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
4238						}
4239
4240						// Support: IE8
4241						// Boolean attributes and "value" are not treated correctly
4242						if (!el.querySelectorAll("[selected]").length) {
4243							rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
4244						}
4245
4246						// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
4247						if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
4248							rbuggyQSA.push("~=");
4249						}
4250
4251						// Support: IE 11+, Edge 15 - 18+
4252						// IE 11/Edge don't find elements on a `[name='']` query in some cases.
4253						// Adding a temporary attribute to the document before the selection works
4254						// around the issue.
4255						// Interestingly, IE 10 & older don't seem to have the issue.
4256						input = document.createElement("input");
4257						input.setAttribute("name", "");
4258						el.appendChild(input);
4259						if (!el.querySelectorAll("[name='']").length) {
4260							rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" +
4261								whitespace + "*(?:''|\"\")");
4262						}
4263
4264						// Webkit/Opera - :checked should return selected option elements
4265						// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
4266						// IE8 throws error here and will not see later tests
4267						if (!el.querySelectorAll(":checked").length) {
4268							rbuggyQSA.push(":checked");
4269						}
4270
4271						// Support: Safari 8+, iOS 8+
4272						// https://bugs.webkit.org/show_bug.cgi?id=136851
4273						// In-page `selector#id sibling-combinator selector` fails
4274						if (!el.querySelectorAll("a#" + expando + "+*").length) {
4275							rbuggyQSA.push(".#.+[+~]");
4276						}
4277
4278						// Support: Firefox <=3.6 - 5 only
4279						// Old Firefox doesn't throw on a badly-escaped identifier.
4280						el.querySelectorAll("\\\f");
4281						rbuggyQSA.push("[\\r\\n\\f]");
4282					});
4283
4284					assert(function (el) {
4285						el.innerHTML = "<a href='' disabled='disabled'></a>" +
4286							"<select disabled='disabled'><option/></select>";
4287
4288						// Support: Windows 8 Native Apps
4289						// The type and name attributes are restricted during .innerHTML assignment
4290						var input = document.createElement("input");
4291						input.setAttribute("type", "hidden");
4292						el.appendChild(input).setAttribute("name", "D");
4293
4294						// Support: IE8
4295						// Enforce case-sensitivity of name attribute
4296						if (el.querySelectorAll("[name=d]").length) {
4297							rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
4298						}
4299
4300						// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
4301						// IE8 throws error here and will not see later tests
4302						if (el.querySelectorAll(":enabled").length !== 2) {
4303							rbuggyQSA.push(":enabled", ":disabled");
4304						}
4305
4306						// Support: IE9-11+
4307						// IE's :disabled selector does not pick up the children of disabled fieldsets
4308						docElem.appendChild(el).disabled = true;
4309						if (el.querySelectorAll(":disabled").length !== 2) {
4310							rbuggyQSA.push(":enabled", ":disabled");
4311						}
4312
4313						// Support: Opera 10 - 11 only
4314						// Opera 10-11 does not throw on post-comma invalid pseudos
4315						el.querySelectorAll("*,:x");
4316						rbuggyQSA.push(",.*:");
4317					});
4318				}
4319
4320				if ((support.matchesSelector = rnative.test((matches = docElem.matches ||
4321					docElem.webkitMatchesSelector ||
4322					docElem.mozMatchesSelector ||
4323					docElem.oMatchesSelector ||
4324					docElem.msMatchesSelector)))) {
4325
4326					assert(function (el) {
4327
4328						// Check to see if it's possible to do matchesSelector
4329						// on a disconnected node (IE 9)
4330						support.disconnectedMatch = matches.call(el, "*");
4331
4332						// This should fail with an exception
4333						// Gecko does not error, returns false instead
4334						matches.call(el, "[s!='']:x");
4335						rbuggyMatches.push("!=", pseudos);
4336					});
4337				}
4338
4339				rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
4340				rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
4341
4342				/* Contains
4343				---------------------------------------------------------------------- */
4344				hasCompare = rnative.test(docElem.compareDocumentPosition);
4345
4346				// Element contains another
4347				// Purposefully self-exclusive
4348				// As in, an element does not contain itself
4349				contains = hasCompare || rnative.test(docElem.contains) ?
4350					function (a, b) {
4351						var adown = a.nodeType === 9 ? a.documentElement : a,
4352							bup = b && b.parentNode;
4353						return a === bup || !!(bup && bup.nodeType === 1 && (
4354							adown.contains ?
4355								adown.contains(bup) :
4356								a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16
4357						));
4358					} :
4359					function (a, b) {
4360						if (b) {
4361							while ((b = b.parentNode)) {
4362								if (b === a) {
4363									return true;
4364								}
4365							}
4366						}
4367						return false;
4368					};
4369
4370				/* Sorting
4371				---------------------------------------------------------------------- */
4372
4373				// Document order sorting
4374				sortOrder = hasCompare ?
4375					function (a, b) {
4376
4377						// Flag for duplicate removal
4378						if (a === b) {
4379							hasDuplicate = true;
4380							return 0;
4381						}
4382
4383						// Sort on method existence if only one input has compareDocumentPosition
4384						var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
4385						if (compare) {
4386							return compare;
4387						}
4388
4389						// Calculate position if both inputs belong to the same document
4390						// Support: IE 11+, Edge 17 - 18+
4391						// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4392						// two documents; shallow comparisons work.
4393						// eslint-disable-next-line eqeqeq
4394						compare = (a.ownerDocument || a) == (b.ownerDocument || b) ?
4395							a.compareDocumentPosition(b) :
4396
4397							// Otherwise we know they are disconnected
4398							1;
4399
4400						// Disconnected nodes
4401						if (compare & 1 ||
4402							(!support.sortDetached && b.compareDocumentPosition(a) === compare)) {
4403
4404							// Choose the first element that is related to our preferred document
4405							// Support: IE 11+, Edge 17 - 18+
4406							// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4407							// two documents; shallow comparisons work.
4408							// eslint-disable-next-line eqeqeq
4409							if (a == document || a.ownerDocument == preferredDoc &&
4410								contains(preferredDoc, a)) {
4411								return -1;
4412							}
4413
4414							// Support: IE 11+, Edge 17 - 18+
4415							// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4416							// two documents; shallow comparisons work.
4417							// eslint-disable-next-line eqeqeq
4418							if (b == document || b.ownerDocument == preferredDoc &&
4419								contains(preferredDoc, b)) {
4420								return 1;
4421							}
4422
4423							// Maintain original order
4424							return sortInput ?
4425								(indexOf(sortInput, a) - indexOf(sortInput, b)) :
4426								0;
4427						}
4428
4429						return compare & 4 ? -1 : 1;
4430					} :
4431					function (a, b) {
4432
4433						// Exit early if the nodes are identical
4434						if (a === b) {
4435							hasDuplicate = true;
4436							return 0;
4437						}
4438
4439						var cur,
4440							i = 0,
4441							aup = a.parentNode,
4442							bup = b.parentNode,
4443							ap = [a],
4444							bp = [b];
4445
4446						// Parentless nodes are either documents or disconnected
4447						if (!aup || !bup) {
4448
4449							// Support: IE 11+, Edge 17 - 18+
4450							// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4451							// two documents; shallow comparisons work.
4452							/* eslint-disable eqeqeq */
4453							return a == document ? -1 :
4454								b == document ? 1 :
4455									/* eslint-enable eqeqeq */
4456									aup ? -1 :
4457										bup ? 1 :
4458											sortInput ?
4459												(indexOf(sortInput, a) - indexOf(sortInput, b)) :
4460												0;
4461
4462							// If the nodes are siblings, we can do a quick check
4463						} else if (aup === bup) {
4464							return siblingCheck(a, b);
4465						}
4466
4467						// Otherwise we need full lists of their ancestors for comparison
4468						cur = a;
4469						while ((cur = cur.parentNode)) {
4470							ap.unshift(cur);
4471						}
4472						cur = b;
4473						while ((cur = cur.parentNode)) {
4474							bp.unshift(cur);
4475						}
4476
4477						// Walk down the tree looking for a discrepancy
4478						while (ap[i] === bp[i]) {
4479							i++;
4480						}
4481
4482						return i ?
4483
4484							// Do a sibling check if the nodes have a common ancestor
4485							siblingCheck(ap[i], bp[i]) :
4486
4487							// Otherwise nodes in our document sort first
4488							// Support: IE 11+, Edge 17 - 18+
4489							// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4490							// two documents; shallow comparisons work.
4491							/* eslint-disable eqeqeq */
4492							ap[i] == preferredDoc ? -1 :
4493								bp[i] == preferredDoc ? 1 :
4494									/* eslint-enable eqeqeq */
4495									0;
4496					};
4497
4498				return document;
4499			};
4500
4501			Sizzle.matches = function (expr, elements) {
4502				return Sizzle(expr, null, null, elements);
4503			};
4504
4505			Sizzle.matchesSelector = function (elem, expr) {
4506				setDocument(elem);
4507
4508				if (support.matchesSelector && documentIsHTML &&
4509					!nonnativeSelectorCache[expr + " "] &&
4510					(!rbuggyMatches || !rbuggyMatches.test(expr)) &&
4511					(!rbuggyQSA || !rbuggyQSA.test(expr))) {
4512
4513					try {
4514						var ret = matches.call(elem, expr);
4515
4516						// IE 9's matchesSelector returns false on disconnected nodes
4517						if (ret || support.disconnectedMatch ||
4518
4519							// As well, disconnected nodes are said to be in a document
4520							// fragment in IE 9
4521							elem.document && elem.document.nodeType !== 11) {
4522							return ret;
4523						}
4524					} catch (e) {
4525						nonnativeSelectorCache(expr, true);
4526					}
4527				}
4528
4529				return Sizzle(expr, document, null, [elem]).length > 0;
4530			};
4531
4532			Sizzle.contains = function (context, elem) {
4533
4534				// Set document vars if needed
4535				// Support: IE 11+, Edge 17 - 18+
4536				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4537				// two documents; shallow comparisons work.
4538				// eslint-disable-next-line eqeqeq
4539				if ((context.ownerDocument || context) != document) {
4540					setDocument(context);
4541				}
4542				return contains(context, elem);
4543			};
4544
4545			Sizzle.attr = function (elem, name) {
4546
4547				// Set document vars if needed
4548				// Support: IE 11+, Edge 17 - 18+
4549				// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
4550				// two documents; shallow comparisons work.
4551				// eslint-disable-next-line eqeqeq
4552				if ((elem.ownerDocument || elem) != document) {
4553					setDocument(elem);
4554				}
4555
4556				var fn = Expr.attrHandle[name.toLowerCase()],
4557
4558					// Don't get fooled by Object.prototype properties (jQuery #13807)
4559					val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?
4560						fn(elem, name, !documentIsHTML) :
4561						undefined;
4562
4563				return val !== undefined ?
4564					val :
4565					support.attributes || !documentIsHTML ?
4566						elem.getAttribute(name) :
4567						(val = elem.getAttributeNode(name)) && val.specified ?
4568							val.value :
4569							null;
4570			};
4571
4572			Sizzle.escape = function (sel) {
4573				return (sel + "").replace(rcssescape, fcssescape);
4574			};
4575
4576			Sizzle.error = function (msg) {
4577				throw new Error("Syntax error, unrecognized expression: " + msg);
4578			};
4579
4580			/**
4581			 * Document sorting and removing duplicates
4582			 * @param {ArrayLike} results
4583			 */
4584			Sizzle.uniqueSort = function (results) {
4585				var elem,
4586					duplicates = [],
4587					j = 0,
4588					i = 0;
4589
4590				// Unless we *know* we can detect duplicates, assume their presence
4591				hasDuplicate = !support.detectDuplicates;
4592				sortInput = !support.sortStable && results.slice(0);
4593				results.sort(sortOrder);
4594
4595				if (hasDuplicate) {
4596					while ((elem = results[i++])) {
4597						if (elem === results[i]) {
4598							j = duplicates.push(i);
4599						}
4600					}
4601					while (j--) {
4602						results.splice(duplicates[j], 1);
4603					}
4604				}
4605
4606				// Clear input after sorting to release objects
4607				// See https://github.com/jquery/sizzle/pull/225
4608				sortInput = null;
4609
4610				return results;
4611			};
4612
4613			/**
4614			 * Utility function for retrieving the text value of an array of DOM nodes
4615			 * @param {Array|Element} elem
4616			 */
4617			getText = Sizzle.getText = function (elem) {
4618				var node,
4619					ret = "",
4620					i = 0,
4621					nodeType = elem.nodeType;
4622
4623				if (!nodeType) {
4624
4625					// If no nodeType, this is expected to be an array
4626					while ((node = elem[i++])) {
4627
4628						// Do not traverse comment nodes
4629						ret += getText(node);
4630					}
4631				} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
4632
4633					// Use textContent for elements
4634					// innerText usage removed for consistency of new lines (jQuery #11153)
4635					if (typeof elem.textContent === "string") {
4636						return elem.textContent;
4637					} else {
4638
4639						// Traverse its children
4640						for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
4641							ret += getText(elem);
4642						}
4643					}
4644				} else if (nodeType === 3 || nodeType === 4) {
4645					return elem.nodeValue;
4646				}
4647
vendor: 11,352 bytes, lines 4648-5022
4648				// Do not include comment or processing instruction nodes
4649
4650				return ret;
4651			};
4652
4653			Expr = Sizzle.selectors = {
4654
4655				// Can be adjusted by the user
4656				cacheLength: 50,
4657
4658				createPseudo: markFunction,
4659
4660				match: matchExpr,
4661
4662				attrHandle: {},
4663
4664				find: {},
4665
4666				relative: {
4667					">": { dir: "parentNode", first: true },
4668					" ": { dir: "parentNode" },
4669					"+": { dir: "previousSibling", first: true },
4670					"~": { dir: "previousSibling" }
4671				},
4672
4673				preFilter: {
4674					"ATTR": function (match) {
4675						match[1] = match[1].replace(runescape, funescape);
4676
4677						// Move the given value to match[3] whether quoted or unquoted
4678						match[3] = (match[3] || match[4] ||
4679							match[5] || "").replace(runescape, funescape);
4680
4681						if (match[2] === "~=") {
4682							match[3] = " " + match[3] + " ";
4683						}
4684
4685						return match.slice(0, 4);
4686					},
4687
4688					"CHILD": function (match) {
4689
4690						/* matches from matchExpr["CHILD"]
4691							1 type (only|nth|...)
4692							2 what (child|of-type)
4693							3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
4694							4 xn-component of xn+y argument ([+-]?\d*n|)
4695							5 sign of xn-component
4696							6 x of xn-component
4697							7 sign of y-component
4698							8 y of y-component
4699						*/
4700						match[1] = match[1].toLowerCase();
4701
4702						if (match[1].slice(0, 3) === "nth") {
4703
4704							// nth-* requires argument
4705							if (!match[3]) {
4706								Sizzle.error(match[0]);
4707							}
4708
4709							// numeric x and y parameters for Expr.filter.CHILD
4710							// remember that false/true cast respectively to 0/1
4711							match[4] = +(match[4] ?
4712								match[5] + (match[6] || 1) :
4713								2 * (match[3] === "even" || match[3] === "odd"));
4714							match[5] = +((match[7] + match[8]) || match[3] === "odd");
4715
4716							// other types prohibit arguments
4717						} else if (match[3]) {
4718							Sizzle.error(match[0]);
4719						}
4720
4721						return match;
4722					},
4723
4724					"PSEUDO": function (match) {
4725						var excess,
4726							unquoted = !match[6] && match[2];
4727
4728						if (matchExpr["CHILD"].test(match[0])) {
4729							return null;
4730						}
4731
4732						// Accept quoted arguments as-is
4733						if (match[3]) {
4734							match[2] = match[4] || match[5] || "";
4735
4736							// Strip excess characters from unquoted arguments
4737						} else if (unquoted && rpseudo.test(unquoted) &&
4738
4739							// Get excess from tokenize (recursively)
4740							(excess = tokenize(unquoted, true)) &&
4741
4742							// advance to the next closing parenthesis
4743							(excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
4744
4745							// excess is a negative index
4746							match[0] = match[0].slice(0, excess);
4747							match[2] = unquoted.slice(0, excess);
4748						}
4749
4750						// Return only captures needed by the pseudo filter method (type and argument)
4751						return match.slice(0, 3);
4752					}
4753				},
4754
4755				filter: {
4756
4757					"TAG": function (nodeNameSelector) {
4758						var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
4759						return nodeNameSelector === "*" ?
4760							function () {
4761								return true;
4762							} :
4763							function (elem) {
4764								return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
4765							};
4766					},
4767
4768					"CLASS": function (className) {
4769						var pattern = classCache[className + " "];
4770
4771						return pattern ||
4772							(pattern = new RegExp("(^|" + whitespace +
4773								")" + className + "(" + whitespace + "|$)")) && classCache(
4774									className, function (elem) {
4775										return pattern.test(
4776											typeof elem.className === "string" && elem.className ||
4777											typeof elem.getAttribute !== "undefined" &&
4778											elem.getAttribute("class") ||
4779											""
4780										);
4781									});
4782					},
4783
4784					"ATTR": function (name, operator, check) {
4785						return function (elem) {
4786							var result = Sizzle.attr(elem, name);
4787
4788							if (result == null) {
4789								return operator === "!=";
4790							}
4791							if (!operator) {
4792								return true;
4793							}
4794
4795							result += "";
4796
4797							/* eslint-disable max-len */
4798
4799							return operator === "=" ? result === check :
4800								operator === "!=" ? result !== check :
4801									operator === "^=" ? check && result.indexOf(check) === 0 :
4802										operator === "*=" ? check && result.indexOf(check) > -1 :
4803											operator === "$=" ? check && result.slice(-check.length) === check :
4804												operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 :
4805													operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" :
4806														false;
4807							/* eslint-enable max-len */
4808
4809						};
4810					},
4811
4812					"CHILD": function (type, what, _argument, first, last) {
4813						var simple = type.slice(0, 3) !== "nth",
4814							forward = type.slice(-4) !== "last",
4815							ofType = what === "of-type";
4816
4817						return first === 1 && last === 0 ?
4818
4819							// Shortcut for :nth-*(n)
4820							function (elem) {
4821								return !!elem.parentNode;
4822							} :
4823
4824							function (elem, _context, xml) {
4825								var cache, uniqueCache, outerCache, node, nodeIndex, start,
4826									dir = simple !== forward ? "nextSibling" : "previousSibling",
4827									parent = elem.parentNode,
4828									name = ofType && elem.nodeName.toLowerCase(),
4829									useCache = !xml && !ofType,
4830									diff = false;
4831
4832								if (parent) {
4833
4834									// :(first|last|only)-(child|of-type)
4835									if (simple) {
4836										while (dir) {
4837											node = elem;
4838											while ((node = node[dir])) {
4839												if (ofType ?
4840													node.nodeName.toLowerCase() === name :
4841													node.nodeType === 1) {
4842
4843													return false;
4844												}
4845											}
4846
4847											// Reverse direction for :only-* (if we haven't yet done so)
4848											start = dir = type === "only" && !start && "nextSibling";
4849										}
4850										return true;
4851									}
4852
4853									start = [forward ? parent.firstChild : parent.lastChild];
4854
4855									// non-xml :nth-child(...) stores cache data on `parent`
4856									if (forward && useCache) {
4857
4858										// Seek `elem` from a previously-cached index
4859
4860										// ...in a gzip-friendly way
4861										node = parent;
4862										outerCache = node[expando] || (node[expando] = {});
4863
4864										// Support: IE <9 only
4865										// Defend against cloned attroperties (jQuery gh-1709)
4866										uniqueCache = outerCache[node.uniqueID] ||
4867											(outerCache[node.uniqueID] = {});
4868
4869										cache = uniqueCache[type] || [];
4870										nodeIndex = cache[0] === dirruns && cache[1];
4871										diff = nodeIndex && cache[2];
4872										node = nodeIndex && parent.childNodes[nodeIndex];
4873
4874										while ((node = ++nodeIndex && node && node[dir] ||
4875
4876											// Fallback to seeking `elem` from the start
4877											(diff = nodeIndex = 0) || start.pop())) {
4878
4879											// When found, cache indexes on `parent` and break
4880											if (node.nodeType === 1 && ++diff && node === elem) {
4881												uniqueCache[type] = [dirruns, nodeIndex, diff];
4882												break;
4883											}
4884										}
4885
4886									} else {
4887
4888										// Use previously-cached element index if available
4889										if (useCache) {
4890
4891											// ...in a gzip-friendly way
4892											node = elem;
4893											outerCache = node[expando] || (node[expando] = {});
4894
4895											// Support: IE <9 only
4896											// Defend against cloned attroperties (jQuery gh-1709)
4897											uniqueCache = outerCache[node.uniqueID] ||
4898												(outerCache[node.uniqueID] = {});
4899
4900											cache = uniqueCache[type] || [];
4901											nodeIndex = cache[0] === dirruns && cache[1];
4902											diff = nodeIndex;
4903										}
4904
4905										// xml :nth-child(...)
4906										// or :nth-last-child(...) or :nth(-last)?-of-type(...)
4907										if (diff === false) {
4908
4909											// Use the same loop as above to seek `elem` from the start
4910											while ((node = ++nodeIndex && node && node[dir] ||
4911												(diff = nodeIndex = 0) || start.pop())) {
4912
4913												if ((ofType ?
4914													node.nodeName.toLowerCase() === name :
4915													node.nodeType === 1) &&
4916													++diff) {
4917
4918													// Cache the index of each encountered element
4919													if (useCache) {
4920														outerCache = node[expando] ||
4921															(node[expando] = {});
4922
4923														// Support: IE <9 only
4924														// Defend against cloned attroperties (jQuery gh-1709)
4925														uniqueCache = outerCache[node.uniqueID] ||
4926															(outerCache[node.uniqueID] = {});
4927
4928														uniqueCache[type] = [dirruns, diff];
4929													}
4930
4931													if (node === elem) {
4932														break;
4933													}
4934												}
4935											}
4936										}
4937									}
4938
4939									// Incorporate the offset, then check against cycle size
4940									diff -= last;
4941									return diff === first || (diff % first === 0 && diff / first >= 0);
4942								}
4943							};
4944					},
4945
4946					"PSEUDO": function (pseudo, argument) {
4947
4948						// pseudo-class names are case-insensitive
4949						// http://www.w3.org/TR/selectors/#pseudo-classes
4950						// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
4951						// Remember that setFilters inherits from pseudos
4952						var args,
4953							fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] ||
4954								Sizzle.error("unsupported pseudo: " + pseudo);
4955
4956						// The user may use createPseudo to indicate that
4957						// arguments are needed to create the filter function
4958						// just as Sizzle does
4959						if (fn[expando]) {
4960							return fn(argument);
4961						}
4962
4963						// But maintain support for old signatures
4964						if (fn.length > 1) {
4965							args = [pseudo, pseudo, "", argument];
4966							return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
4967								markFunction(function (seed, matches) {
4968									var idx,
4969										matched = fn(seed, argument),
4970										i = matched.length;
4971									while (i--) {
4972										idx = indexOf(seed, matched[i]);
4973										seed[idx] = !(matches[idx] = matched[i]);
4974									}
4975								}) :
4976								function (elem) {
4977									return fn(elem, 0, args);
4978								};
4979						}
4980
4981						return fn;
4982					}
4983				},
4984
4985				pseudos: {
4986
4987					// Potentially complex pseudos
4988					"not": markFunction(function (selector) {
4989
4990						// Trim the selector passed to compile
4991						// to avoid treating leading and trailing
4992						// spaces as combinators
4993						var input = [],
4994							results = [],
4995							matcher = compile(selector.replace(rtrim, "$1"));
4996
4997						return matcher[expando] ?
4998							markFunction(function (seed, matches, _context, xml) {
4999								var elem,
5000									unmatched = matcher(seed, null, xml, []),
5001									i = seed.length;
5002
5003								// Match elements unmatched by `matcher`
5004								while (i--) {
5005									if ((elem = unmatched[i])) {
5006										seed[i] = !(matches[i] = elem);
5007									}
5008								}
5009							}) :
5010							function (elem, _context, xml) {
5011								input[0] = elem;
5012								matcher(input, null, xml, results);
5013
5014								// Don't keep the element (issue #299)
5015								input[0] = null;
5016								return !results.pop();
5017							};
5018					}),
5019
5020					"has": markFunction(function (selector) {
5021						return function (elem) {
5022							return Sizzle(selector, elem).length > 0;
vendor: 5,846 bytes, lines 5023-5210
5023						};
5024					}),
5025
5026					"contains": markFunction(function (text) {
5027						text = text.replace(runescape, funescape);
5028						return function (elem) {
5029							return (elem.textContent || getText(elem)).indexOf(text) > -1;
5030						};
5031					}),
5032
5033					// "Whether an element is represented by a :lang() selector
5034					// is based solely on the element's language value
5035					// being equal to the identifier C,
5036					// or beginning with the identifier C immediately followed by "-".
5037					// The matching of C against the element's language value is performed case-insensitively.
5038					// The identifier C does not have to be a valid language name."
5039					// http://www.w3.org/TR/selectors/#lang-pseudo
5040					"lang": markFunction(function (lang) {
5041
5042						// lang value must be a valid identifier
5043						if (!ridentifier.test(lang || "")) {
5044							Sizzle.error("unsupported lang: " + lang);
5045						}
5046						lang = lang.replace(runescape, funescape).toLowerCase();
5047						return function (elem) {
5048							var elemLang;
5049							do {
5050								if ((elemLang = documentIsHTML ?
5051									elem.lang :
5052									elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) {
5053
5054									elemLang = elemLang.toLowerCase();
5055									return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
5056								}
5057							} while ((elem = elem.parentNode) && elem.nodeType === 1);
5058							return false;
5059						};
5060					}),
5061
5062					// Miscellaneous
5063					"target": function (elem) {
5064						var hash = window.location && window.location.hash;
5065						return hash && hash.slice(1) === elem.id;
5066					},
5067
5068					"root": function (elem) {
5069						return elem === docElem;
5070					},
5071
5072					"focus": function (elem) {
5073						return elem === document.activeElement &&
5074							(!document.hasFocus || document.hasFocus()) &&
5075							!!(elem.type || elem.href || ~elem.tabIndex);
5076					},
5077
5078					// Boolean properties
5079					"enabled": createDisabledPseudo(false),
5080					"disabled": createDisabledPseudo(true),
5081
5082					"checked": function (elem) {
5083
5084						// In CSS3, :checked should return both checked and selected elements
5085						// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
5086						var nodeName = elem.nodeName.toLowerCase();
5087						return (nodeName === "input" && !!elem.checked) ||
5088							(nodeName === "option" && !!elem.selected);
5089					},
5090
5091					"selected": function (elem) {
5092
5093						// Accessing this property makes selected-by-default
5094						// options in Safari work properly
5095						if (elem.parentNode) {
5096							// eslint-disable-next-line no-unused-expressions
5097							elem.parentNode.selectedIndex;
5098						}
5099
5100						return elem.selected === true;
5101					},
5102
5103					// Contents
5104					"empty": function (elem) {
5105
5106						// http://www.w3.org/TR/selectors/#empty-pseudo
5107						// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
5108						//   but not by others (comment: 8; processing instruction: 7; etc.)
5109						// nodeType < 6 works because attributes (2) do not appear as children
5110						for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
5111							if (elem.nodeType < 6) {
5112								return false;
5113							}
5114						}
5115						return true;
5116					},
5117
5118					"parent": function (elem) {
5119						return !Expr.pseudos["empty"](elem);
5120					},
5121
5122					// Element/input types
5123					"header": function (elem) {
5124						return rheader.test(elem.nodeName);
5125					},
5126
5127					"input": function (elem) {
5128						return rinputs.test(elem.nodeName);
5129					},
5130
5131					"button": function (elem) {
5132						var name = elem.nodeName.toLowerCase();
5133						return name === "input" && elem.type === "button" || name === "button";
5134					},
5135
5136					"text": function (elem) {
5137						var attr;
5138						return elem.nodeName.toLowerCase() === "input" &&
5139							elem.type === "text" &&
5140
5141							// Support: IE<8
5142							// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
5143							((attr = elem.getAttribute("type")) == null ||
5144								attr.toLowerCase() === "text");
5145					},
5146
5147					// Position-in-collection
5148					"first": createPositionalPseudo(function () {
5149						return [0];
5150					}),
5151
5152					"last": createPositionalPseudo(function (_matchIndexes, length) {
5153						return [length - 1];
5154					}),
5155
5156					"eq": createPositionalPseudo(function (_matchIndexes, length, argument) {
5157						return [argument < 0 ? argument + length : argument];
5158					}),
5159
5160					"even": createPositionalPseudo(function (matchIndexes, length) {
5161						var i = 0;
5162						for (; i < length; i += 2) {
5163							matchIndexes.push(i);
5164						}
5165						return matchIndexes;
5166					}),
5167
5168					"odd": createPositionalPseudo(function (matchIndexes, length) {
5169						var i = 1;
5170						for (; i < length; i += 2) {
5171							matchIndexes.push(i);
5172						}
5173						return matchIndexes;
5174					}),
5175
5176					"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
5177						var i = argument < 0 ?
5178							argument + length :
5179							argument > length ?
5180								length :
5181								argument;
5182						for (; --i >= 0;) {
5183							matchIndexes.push(i);
5184						}
5185						return matchIndexes;
5186					}),
5187
5188					"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
5189						var i = argument < 0 ? argument + length : argument;
5190						for (; ++i < length;) {
5191							matchIndexes.push(i);
5192						}
5193						return matchIndexes;
5194					})
5195				}
5196			};
5197
5198			Expr.pseudos["nth"] = Expr.pseudos["eq"];
5199
5200			// Add button/input type pseudos
5201			for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
5202				Expr.pseudos[i] = createInputPseudo(i);
5203			}
5204			for (i in { submit: true, reset: true }) {
5205				Expr.pseudos[i] = createButtonPseudo(i);
5206			}
5207
5208			// Easy API for creating new setFilters
5209			function setFilters() { }
5210			setFilters.prototype = Expr.filters = Expr.pseudos;
vendor: 10,294 bytes, lines 5211-5568
5211			Expr.setFilters = new setFilters();
5212
5213			tokenize = Sizzle.tokenize = function (selector, parseOnly) {
5214				var matched, match, tokens, type,
5215					soFar, groups, preFilters,
5216					cached = tokenCache[selector + " "];
5217
5218				if (cached) {
5219					return parseOnly ? 0 : cached.slice(0);
5220				}
5221
5222				soFar = selector;
5223				groups = [];
5224				preFilters = Expr.preFilter;
5225
5226				while (soFar) {
5227
5228					// Comma and first run
5229					if (!matched || (match = rcomma.exec(soFar))) {
5230						if (match) {
5231
5232							// Don't consume trailing commas as valid
5233							soFar = soFar.slice(match[0].length) || soFar;
5234						}
5235						groups.push((tokens = []));
5236					}
5237
5238					matched = false;
5239
5240					// Combinators
5241					if ((match = rcombinators.exec(soFar))) {
5242						matched = match.shift();
5243						tokens.push({
5244							value: matched,
5245
5246							// Cast descendant combinators to space
5247							type: match[0].replace(rtrim, " ")
5248						});
5249						soFar = soFar.slice(matched.length);
5250					}
5251
5252					// Filters
5253					for (type in Expr.filter) {
5254						if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] ||
5255							(match = preFilters[type](match)))) {
5256							matched = match.shift();
5257							tokens.push({
5258								value: matched,
5259								type: type,
5260								matches: match
5261							});
5262							soFar = soFar.slice(matched.length);
5263						}
5264					}
5265
5266					if (!matched) {
5267						break;
5268					}
5269				}
5270
5271				// Return the length of the invalid excess
5272				// if we're just parsing
5273				// Otherwise, throw an error or return tokens
5274				return parseOnly ?
5275					soFar.length :
5276					soFar ?
5277						Sizzle.error(selector) :
5278
5279						// Cache the tokens
5280						tokenCache(selector, groups).slice(0);
5281			};
5282
5283			function toSelector(tokens) {
5284				var i = 0,
5285					len = tokens.length,
5286					selector = "";
5287				for (; i < len; i++) {
5288					selector += tokens[i].value;
5289				}
5290				return selector;
5291			}
5292
5293			function addCombinator(matcher, combinator, base) {
5294				var dir = combinator.dir,
5295					skip = combinator.next,
5296					key = skip || dir,
5297					checkNonElements = base && key === "parentNode",
5298					doneName = done++;
5299
5300				return combinator.first ?
5301
5302					// Check against closest ancestor/preceding element
5303					function (elem, context, xml) {
5304						while ((elem = elem[dir])) {
5305							if (elem.nodeType === 1 || checkNonElements) {
5306								return matcher(elem, context, xml);
5307							}
5308						}
5309						return false;
5310					} :
5311
5312					// Check against all ancestor/preceding elements
5313					function (elem, context, xml) {
5314						var oldCache, uniqueCache, outerCache,
5315							newCache = [dirruns, doneName];
5316
5317						// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
5318						if (xml) {
5319							while ((elem = elem[dir])) {
5320								if (elem.nodeType === 1 || checkNonElements) {
5321									if (matcher(elem, context, xml)) {
5322										return true;
5323									}
5324								}
5325							}
5326						} else {
5327							while ((elem = elem[dir])) {
5328								if (elem.nodeType === 1 || checkNonElements) {
5329									outerCache = elem[expando] || (elem[expando] = {});
5330
5331									// Support: IE <9 only
5332									// Defend against cloned attroperties (jQuery gh-1709)
5333									uniqueCache = outerCache[elem.uniqueID] ||
5334										(outerCache[elem.uniqueID] = {});
5335
5336									if (skip && skip === elem.nodeName.toLowerCase()) {
5337										elem = elem[dir] || elem;
5338									} else if ((oldCache = uniqueCache[key]) &&
5339										oldCache[0] === dirruns && oldCache[1] === doneName) {
5340
5341										// Assign to newCache so results back-propagate to previous elements
5342										return (newCache[2] = oldCache[2]);
5343									} else {
5344
5345										// Reuse newcache so results back-propagate to previous elements
5346										uniqueCache[key] = newCache;
5347
5348										// A match means we're done; a fail means we have to keep checking
5349										if ((newCache[2] = matcher(elem, context, xml))) {
5350											return true;
5351										}
5352									}
5353								}
5354							}
5355						}
5356						return false;
5357					};
5358			}
5359
5360			function elementMatcher(matchers) {
5361				return matchers.length > 1 ?
5362					function (elem, context, xml) {
5363						var i = matchers.length;
5364						while (i--) {
5365							if (!matchers[i](elem, context, xml)) {
5366								return false;
5367							}
5368						}
5369						return true;
5370					} :
5371					matchers[0];
5372			}
5373
5374			function multipleContexts(selector, contexts, results) {
5375				var i = 0,
5376					len = contexts.length;
5377				for (; i < len; i++) {
5378					Sizzle(selector, contexts[i], results);
5379				}
5380				return results;
5381			}
5382
5383			function condense(unmatched, map, filter, context, xml) {
5384				var elem,
5385					newUnmatched = [],
5386					i = 0,
5387					len = unmatched.length,
5388					mapped = map != null;
5389
5390				for (; i < len; i++) {
5391					if ((elem = unmatched[i])) {
5392						if (!filter || filter(elem, context, xml)) {
5393							newUnmatched.push(elem);
5394							if (mapped) {
5395								map.push(i);
5396							}
5397						}
5398					}
5399				}
5400
5401				return newUnmatched;
5402			}
5403
5404			function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
5405				if (postFilter && !postFilter[expando]) {
5406					postFilter = setMatcher(postFilter);
5407				}
5408				if (postFinder && !postFinder[expando]) {
5409					postFinder = setMatcher(postFinder, postSelector);
5410				}
5411				return markFunction(function (seed, results, context, xml) {
5412					var temp, i, elem,
5413						preMap = [],
5414						postMap = [],
5415						preexisting = results.length,
5416
5417						// Get initial elements from seed or context
5418						elems = seed || multipleContexts(
5419							selector || "*",
5420							context.nodeType ? [context] : context,
5421							[]
5422						),
5423
5424						// Prefilter to get matcher input, preserving a map for seed-results synchronization
5425						matcherIn = preFilter && (seed || !selector) ?
5426							condense(elems, preMap, preFilter, context, xml) :
5427							elems,
5428
5429						matcherOut = matcher ?
5430
5431							// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
5432							postFinder || (seed ? preFilter : preexisting || postFilter) ?
5433
5434								// ...intermediate processing is necessary
5435								[] :
5436
5437								// ...otherwise use results directly
5438								results :
5439							matcherIn;
5440
5441					// Find primary matches
5442					if (matcher) {
5443						matcher(matcherIn, matcherOut, context, xml);
5444					}
5445
5446					// Apply postFilter
5447					if (postFilter) {
5448						temp = condense(matcherOut, postMap);
5449						postFilter(temp, [], context, xml);
5450
5451						// Un-match failing elements by moving them back to matcherIn
5452						i = temp.length;
5453						while (i--) {
5454							if ((elem = temp[i])) {
5455								matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
5456							}
5457						}
5458					}
5459
5460					if (seed) {
5461						if (postFinder || preFilter) {
5462							if (postFinder) {
5463
5464								// Get the final matcherOut by condensing this intermediate into postFinder contexts
5465								temp = [];
5466								i = matcherOut.length;
5467								while (i--) {
5468									if ((elem = matcherOut[i])) {
5469
5470										// Restore matcherIn since elem is not yet a final match
5471										temp.push((matcherIn[i] = elem));
5472									}
5473								}
5474								postFinder(null, (matcherOut = []), temp, xml);
5475							}
5476
5477							// Move matched elements from seed to results to keep them synchronized
5478							i = matcherOut.length;
5479							while (i--) {
5480								if ((elem = matcherOut[i]) &&
5481									(temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {
5482
5483									seed[temp] = !(results[temp] = elem);
5484								}
5485							}
5486						}
5487
5488						// Add elements to results, through postFinder if defined
5489					} else {
5490						matcherOut = condense(
5491							matcherOut === results ?
5492								matcherOut.splice(preexisting, matcherOut.length) :
5493								matcherOut
5494						);
5495						if (postFinder) {
5496							postFinder(null, results, matcherOut, xml);
5497						} else {
5498							push.apply(results, matcherOut);
5499						}
5500					}
5501				});
5502			}
5503
5504			function matcherFromTokens(tokens) {
5505				var checkContext, matcher, j,
5506					len = tokens.length,
5507					leadingRelative = Expr.relative[tokens[0].type],
5508					implicitRelative = leadingRelative || Expr.relative[" "],
5509					i = leadingRelative ? 1 : 0,
5510
5511					// The foundational matcher ensures that elements are reachable from top-level context(s)
5512					matchContext = addCombinator(function (elem) {
5513						return elem === checkContext;
5514					}, implicitRelative, true),
5515					matchAnyContext = addCombinator(function (elem) {
5516						return indexOf(checkContext, elem) > -1;
5517					}, implicitRelative, true),
5518					matchers = [function (elem, context, xml) {
5519						var ret = (!leadingRelative && (xml || context !== outermostContext)) || (
5520							(checkContext = context).nodeType ?
5521								matchContext(elem, context, xml) :
5522								matchAnyContext(elem, context, xml));
5523
5524						// Avoid hanging onto element (issue #299)
5525						checkContext = null;
5526						return ret;
5527					}];
5528
5529				for (; i < len; i++) {
5530					if ((matcher = Expr.relative[tokens[i].type])) {
5531						matchers = [addCombinator(elementMatcher(matchers), matcher)];
5532					} else {
5533						matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
5534
5535						// Return special upon seeing a positional matcher
5536						if (matcher[expando]) {
5537
5538							// Find the next relative operator (if any) for proper handling
5539							j = ++i;
5540							for (; j < len; j++) {
5541								if (Expr.relative[tokens[j].type]) {
5542									break;
5543								}
5544							}
5545							return setMatcher(
5546								i > 1 && elementMatcher(matchers),
5547								i > 1 && toSelector(
5548
5549									// If the preceding token was a descendant combinator, insert an implicit any-element `*`
5550									tokens
5551										.slice(0, i - 1)
5552										.concat({ value: tokens[i - 2].type === " " ? "*" : "" })
5553								).replace(rtrim, "$1"),
5554								matcher,
5555								i < j && matcherFromTokens(tokens.slice(i, j)),
5556								j < len && matcherFromTokens((tokens = tokens.slice(j))),
5557								j < len && toSelector(tokens)
5558							);
5559						}
5560						matchers.push(matcher);
5561					}
5562				}
5563
5564				return elementMatcher(matchers);
5565			}
5566
5567			function matcherFromGroupMatchers(elementMatchers, setMatchers) {
5568				var bySet = setMatchers.length > 0,
vendor: 6,944 bytes, lines 5569-5777
5569					byElement = elementMatchers.length > 0,
5570					superMatcher = function (seed, context, xml, results, outermost) {
5571						var elem, j, matcher,
5572							matchedCount = 0,
5573							i = "0",
5574							unmatched = seed && [],
5575							setMatched = [],
5576							contextBackup = outermostContext,
5577
5578							// We must always have either seed elements or outermost context
5579							elems = seed || byElement && Expr.find["TAG"]("*", outermost),
5580
5581							// Use integer dirruns iff this is the outermost matcher
5582							dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
5583							len = elems.length;
5584
5585						if (outermost) {
5586
5587							// Support: IE 11+, Edge 17 - 18+
5588							// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
5589							// two documents; shallow comparisons work.
5590							// eslint-disable-next-line eqeqeq
5591							outermostContext = context == document || context || outermost;
5592						}
5593
5594						// Add elements passing elementMatchers directly to results
5595						// Support: IE<9, Safari
5596						// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
5597						for (; i !== len && (elem = elems[i]) != null; i++) {
5598							if (byElement && elem) {
5599								j = 0;
5600
5601								// Support: IE 11+, Edge 17 - 18+
5602								// IE/Edge sometimes throw a "Permission denied" error when strict-comparing
5603								// two documents; shallow comparisons work.
5604								// eslint-disable-next-line eqeqeq
5605								if (!context && elem.ownerDocument != document) {
5606									setDocument(elem);
5607									xml = !documentIsHTML;
5608								}
5609								while ((matcher = elementMatchers[j++])) {
5610									if (matcher(elem, context || document, xml)) {
5611										results.push(elem);
5612										break;
5613									}
5614								}
5615								if (outermost) {
5616									dirruns = dirrunsUnique;
5617								}
5618							}
5619
5620							// Track unmatched elements for set filters
5621							if (bySet) {
5622
5623								// They will have gone through all possible matchers
5624								if ((elem = !matcher && elem)) {
5625									matchedCount--;
5626								}
5627
5628								// Lengthen the array for every element, matched or not
5629								if (seed) {
5630									unmatched.push(elem);
5631								}
5632							}
5633						}
5634
5635						// `i` is now the count of elements visited above, and adding it to `matchedCount`
5636						// makes the latter nonnegative.
5637						matchedCount += i;
5638
5639						// Apply set filters to unmatched elements
5640						// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
5641						// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
5642						// no element matchers and no seed.
5643						// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
5644						// case, which will result in a "00" `matchedCount` that differs from `i` but is also
5645						// numerically zero.
5646						if (bySet && i !== matchedCount) {
5647							j = 0;
5648							while ((matcher = setMatchers[j++])) {
5649								matcher(unmatched, setMatched, context, xml);
5650							}
5651
5652							if (seed) {
5653
5654								// Reintegrate element matches to eliminate the need for sorting
5655								if (matchedCount > 0) {
5656									while (i--) {
5657										if (!(unmatched[i] || setMatched[i])) {
5658											setMatched[i] = pop.call(results);
5659										}
5660									}
5661								}
5662
5663								// Discard index placeholder values to get only actual matches
5664								setMatched = condense(setMatched);
5665							}
5666
5667							// Add matches to results
5668							push.apply(results, setMatched);
5669
5670							// Seedless set matches succeeding multiple successful matchers stipulate sorting
5671							if (outermost && !seed && setMatched.length > 0 &&
5672								(matchedCount + setMatchers.length) > 1) {
5673
5674								Sizzle.uniqueSort(results);
5675							}
5676						}
5677
5678						// Override manipulation of globals by nested matchers
5679						if (outermost) {
5680							dirruns = dirrunsUnique;
5681							outermostContext = contextBackup;
5682						}
5683
5684						return unmatched;
5685					};
5686
5687				return bySet ?
5688					markFunction(superMatcher) :
5689					superMatcher;
5690			}
5691
5692			compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
5693				var i,
5694					setMatchers = [],
5695					elementMatchers = [],
5696					cached = compilerCache[selector + " "];
5697
5698				if (!cached) {
5699
5700					// Generate a function of recursive functions that can be used to check each element
5701					if (!match) {
5702						match = tokenize(selector);
5703					}
5704					i = match.length;
5705					while (i--) {
5706						cached = matcherFromTokens(match[i]);
5707						if (cached[expando]) {
5708							setMatchers.push(cached);
5709						} else {
5710							elementMatchers.push(cached);
5711						}
5712					}
5713
5714					// Cache the compiled function
5715					cached = compilerCache(
5716						selector,
5717						matcherFromGroupMatchers(elementMatchers, setMatchers)
5718					);
5719
5720					// Save selector and tokenization
5721					cached.selector = selector;
5722				}
5723				return cached;
5724			};
5725
5726			/**
5727			 * A low-level selection function that works with Sizzle's compiled
5728			 *  selector functions
5729			 * @param {String|Function} selector A selector or a pre-compiled
5730			 *  selector function built with Sizzle.compile
5731			 * @param {Element} context
5732			 * @param {Array} [results]
5733			 * @param {Array} [seed] A set of elements to match against
5734			 */
5735			select = Sizzle.select = function (selector, context, results, seed) {
5736				var i, tokens, token, type, find,
5737					compiled = typeof selector === "function" && selector,
5738					match = !seed && tokenize((selector = compiled.selector || selector));
5739
5740				results = results || [];
5741
5742				// Try to minimize operations if there is only one selector in the list and no seed
5743				// (the latter of which guarantees us context)
5744				if (match.length === 1) {
5745
5746					// Reduce context if the leading compound selector is an ID
5747					tokens = match[0] = match[0].slice(0);
5748					if (tokens.length > 2 && (token = tokens[0]).type === "ID" &&
5749						context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
5750
5751						context = (Expr.find["ID"](token.matches[0]
5752							.replace(runescape, funescape), context) || [])[0];
5753						if (!context) {
5754							return results;
5755
5756							// Precompiled matchers will still verify ancestry, so step up a level
5757						} else if (compiled) {
5758							context = context.parentNode;
5759						}
5760
5761						selector = selector.slice(tokens.shift().value.length);
5762					}
5763
5764					// Fetch a seed set for right-to-left matching
5765					i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
5766					while (i--) {
5767						token = tokens[i];
5768
5769						// Abort if we hit a combinator
5770						if (Expr.relative[(type = token.type)]) {
5771							break;
5772						}
5773						if ((find = Expr.find[type])) {
5774
5775							// Search, expanding context for leading sibling combinators
5776							if ((seed = find(
5777								token.matches[0].replace(runescape, funescape),
vendor: 6,909 bytes, lines 5778-6041
5778								rsibling.test(tokens[0].type) && testContext(context.parentNode) ||
5779								context
5780							))) {
5781
5782								// If seed is empty or no tokens remain, we can return early
5783								tokens.splice(i, 1);
5784								selector = seed.length && toSelector(tokens);
5785								if (!selector) {
5786									push.apply(results, seed);
5787									return results;
5788								}
5789
5790								break;
5791							}
5792						}
5793					}
5794				}
5795
5796				// Compile and execute a filtering function if one is not provided
5797				// Provide `match` to avoid retokenization if we modified the selector above
5798				(compiled || compile(selector, match))(
5799					seed,
5800					context,
5801					!documentIsHTML,
5802					results,
5803					!context || rsibling.test(selector) && testContext(context.parentNode) || context
5804				);
5805				return results;
5806			};
5807
5808			// One-time assignments
5809
5810			// Sort stability
5811			support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
5812
5813			// Support: Chrome 14-35+
5814			// Always assume duplicates if they aren't passed to the comparison function
5815			support.detectDuplicates = !!hasDuplicate;
5816
5817			// Initialize against the default document
5818			setDocument();
5819
5820			// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
5821			// Detached nodes confoundingly follow *each other*
5822			support.sortDetached = assert(function (el) {
5823
5824				// Should return 1, but returns 4 (following)
5825				return el.compareDocumentPosition(document.createElement("fieldset")) & 1;
5826			});
5827
5828			// Support: IE<8
5829			// Prevent attribute/property "interpolation"
5830			// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
5831			if (!assert(function (el) {
5832				el.innerHTML = "<a href='#'></a>";
5833				return el.firstChild.getAttribute("href") === "#";
5834			})) {
5835				addHandle("type|href|height|width", function (elem, name, isXML) {
5836					if (!isXML) {
5837						return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
5838					}
5839				});
5840			}
5841
5842			// Support: IE<9
5843			// Use defaultValue in place of getAttribute("value")
5844			if (!support.attributes || !assert(function (el) {
5845				el.innerHTML = "<input/>";
5846				el.firstChild.setAttribute("value", "");
5847				return el.firstChild.getAttribute("value") === "";
5848			})) {
5849				addHandle("value", function (elem, _name, isXML) {
5850					if (!isXML && elem.nodeName.toLowerCase() === "input") {
5851						return elem.defaultValue;
5852					}
5853				});
5854			}
5855
5856			// Support: IE<9
5857			// Use getAttributeNode to fetch booleans when getAttribute lies
5858			if (!assert(function (el) {
5859				return el.getAttribute("disabled") == null;
5860			})) {
5861				addHandle(booleans, function (elem, name, isXML) {
5862					var val;
5863					if (!isXML) {
5864						return elem[name] === true ? name.toLowerCase() :
5865							(val = elem.getAttributeNode(name)) && val.specified ?
5866								val.value :
5867								null;
5868					}
5869				});
5870			}
5871
5872			return Sizzle;
5873
5874		})(window);
5875
5876
5877
5878	jQuery.find = Sizzle;
5879	jQuery.expr = Sizzle.selectors;
5880
5881	// Deprecated
5882	jQuery.expr[":"] = jQuery.expr.pseudos;
5883	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
5884	jQuery.text = Sizzle.getText;
5885	jQuery.isXMLDoc = Sizzle.isXML;
5886	jQuery.contains = Sizzle.contains;
5887	jQuery.escapeSelector = Sizzle.escape;
5888
5889
5890
5891
5892	var dir = function (elem, dir, until) {
5893		var matched = [],
5894			truncate = until !== undefined;
5895
5896		while ((elem = elem[dir]) && elem.nodeType !== 9) {
5897			if (elem.nodeType === 1) {
5898				if (truncate && jQuery(elem).is(until)) {
5899					break;
5900				}
5901				matched.push(elem);
5902			}
5903		}
5904		return matched;
5905	};
5906
5907
5908	var siblings = function (n, elem) {
5909		var matched = [];
5910
5911		for (; n; n = n.nextSibling) {
5912			if (n.nodeType === 1 && n !== elem) {
5913				matched.push(n);
5914			}
5915		}
5916
5917		return matched;
5918	};
5919
5920
5921	var rneedsContext = jQuery.expr.match.needsContext;
5922
5923
5924
5925	function nodeName(elem, name) {
5926
5927		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
5928
5929	};
5930	var rsingleTag = (/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i);
5931
5932
5933
5934	// Implement the identical functionality for filter and not
5935	function winnow(elements, qualifier, not) {
5936		if (isFunction(qualifier)) {
5937			return jQuery.grep(elements, function (elem, i) {
5938				return !!qualifier.call(elem, i, elem) !== not;
5939			});
5940		}
5941
5942		// Single element
5943		if (qualifier.nodeType) {
5944			return jQuery.grep(elements, function (elem) {
5945				return (elem === qualifier) !== not;
5946			});
5947		}
5948
5949		// Arraylike of elements (jQuery, arguments, Array)
5950		if (typeof qualifier !== "string") {
5951			return jQuery.grep(elements, function (elem) {
5952				return (indexOf.call(qualifier, elem) > -1) !== not;
5953			});
5954		}
5955
5956		// Filtered directly for both simple and complex selectors
5957		return jQuery.filter(qualifier, elements, not);
5958	}
5959
5960	jQuery.filter = function (expr, elems, not) {
5961		var elem = elems[0];
5962
5963		if (not) {
5964			expr = ":not(" + expr + ")";
5965		}
5966
5967		if (elems.length === 1 && elem.nodeType === 1) {
5968			return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
5969		}
5970
5971		return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
5972			return elem.nodeType === 1;
5973		}));
5974	};
5975
5976	jQuery.fn.extend({
5977		find: function (selector) {
5978			var i, ret,
5979				len = this.length,
5980				self = this;
5981
5982			if (typeof selector !== "string") {
5983				return this.pushStack(jQuery(selector).filter(function () {
5984					for (i = 0; i < len; i++) {
5985						if (jQuery.contains(self[i], this)) {
5986							return true;
5987						}
5988					}
5989				}));
5990			}
5991
5992			ret = this.pushStack([]);
5993
5994			for (i = 0; i < len; i++) {
5995				jQuery.find(selector, self[i], ret);
5996			}
5997
5998			return len > 1 ? jQuery.uniqueSort(ret) : ret;
5999		},
6000		filter: function (selector) {
6001			return this.pushStack(winnow(this, selector || [], false));
6002		},
6003		not: function (selector) {
6004			return this.pushStack(winnow(this, selector || [], true));
6005		},
6006		is: function (selector) {
6007			return !!winnow(
6008				this,
6009
6010				// If this is a positional/relative selector, check membership in the returned set
6011				// so $("p:first").is("p:last") won't return true for a doc with two "p".
6012				typeof selector === "string" && rneedsContext.test(selector) ?
6013					jQuery(selector) :
6014					selector || [],
6015				false
6016			).length;
6017		}
6018	});
6019
6020
6021	// Initialize a jQuery object
6022
6023
6024	// A central reference to the root jQuery(document)
6025	var rootjQuery,
6026
6027		// A simple way to check for HTML strings
6028		// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
6029		// Strict HTML recognition (#11290: must start with <)
6030		// Shortcut simple #id case for speed
6031		rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
6032
6033		init = jQuery.fn.init = function (selector, context, root) {
6034			var match, elem;
6035
6036			// HANDLE: $(""), $(null), $(undefined), $(false)
6037			if (!selector) {
6038				return this;
6039			}
6040
6041			// Method init() accepts an alternate rootjQuery
vendor: 29,872 bytes, lines 6042-7166
6042			// so migrate can support jQuery.sub (gh-2101)
6043			root = root || rootjQuery;
6044
6045			// Handle HTML strings
6046			if (typeof selector === "string") {
6047				if (selector[0] === "<" &&
6048					selector[selector.length - 1] === ">" &&
6049					selector.length >= 3) {
6050
6051					// Assume that strings that start and end with <> are HTML and skip the regex check
6052					match = [null, selector, null];
6053
6054				} else {
6055					match = rquickExpr.exec(selector);
6056				}
6057
6058				// Match html or make sure no context is specified for #id
6059				if (match && (match[1] || !context)) {
6060
6061					// HANDLE: $(html) -> $(array)
6062					if (match[1]) {
6063						context = context instanceof jQuery ? context[0] : context;
6064
6065						// Option to run scripts is true for back-compat
6066						// Intentionally let the error be thrown if parseHTML is not present
6067						jQuery.merge(this, jQuery.parseHTML(
6068							match[1],
6069							context && context.nodeType ? context.ownerDocument || context : document,
6070							true
6071						));
6072
6073						// HANDLE: $(html, props)
6074						if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
6075							for (match in context) {
6076
6077								// Properties of context are called as methods if possible
6078								if (isFunction(this[match])) {
6079									this[match](context[match]);
6080
6081									// ...and otherwise set as attributes
6082								} else {
6083									this.attr(match, context[match]);
6084								}
6085							}
6086						}
6087
6088						return this;
6089
6090						// HANDLE: $(#id)
6091					} else {
6092						elem = document.getElementById(match[2]);
6093
6094						if (elem) {
6095
6096							// Inject the element directly into the jQuery object
6097							this[0] = elem;
6098							this.length = 1;
6099						}
6100						return this;
6101					}
6102
6103					// HANDLE: $(expr, $(...))
6104				} else if (!context || context.jquery) {
6105					return (context || root).find(selector);
6106
6107					// HANDLE: $(expr, context)
6108					// (which is just equivalent to: $(context).find(expr)
6109				} else {
6110					return this.constructor(context).find(selector);
6111				}
6112
6113				// HANDLE: $(DOMElement)
6114			} else if (selector.nodeType) {
6115				this[0] = selector;
6116				this.length = 1;
6117				return this;
6118
6119				// HANDLE: $(function)
6120				// Shortcut for document ready
6121			} else if (isFunction(selector)) {
6122				return root.ready !== undefined ?
6123					root.ready(selector) :
6124
6125					// Execute immediately if ready is not present
6126					selector(jQuery);
6127			}
6128
6129			return jQuery.makeArray(selector, this);
6130		};
6131
6132	// Give the init function the jQuery prototype for later instantiation
6133	init.prototype = jQuery.fn;
6134
6135	// Initialize central reference
6136	rootjQuery = jQuery(document);
6137
6138
6139	var rparentsprev = /^(?:parents|prev(?:Until|All))/,
6140
6141		// Methods guaranteed to produce a unique set when starting from a unique set
6142		guaranteedUnique = {
6143			children: true,
6144			contents: true,
6145			next: true,
6146			prev: true
6147		};
6148
6149	jQuery.fn.extend({
6150		has: function (target) {
6151			var targets = jQuery(target, this),
6152				l = targets.length;
6153
6154			return this.filter(function () {
6155				var i = 0;
6156				for (; i < l; i++) {
6157					if (jQuery.contains(this, targets[i])) {
6158						return true;
6159					}
6160				}
6161			});
6162		},
6163
6164		closest: function (selectors, context) {
6165			var cur,
6166				i = 0,
6167				l = this.length,
6168				matched = [],
6169				targets = typeof selectors !== "string" && jQuery(selectors);
6170
6171			// Positional selectors never match, since there's no _selection_ context
6172			if (!rneedsContext.test(selectors)) {
6173				for (; i < l; i++) {
6174					for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
6175
6176						// Always skip document fragments
6177						if (cur.nodeType < 11 && (targets ?
6178							targets.index(cur) > -1 :
6179
6180							// Don't pass non-elements to Sizzle
6181							cur.nodeType === 1 &&
6182							jQuery.find.matchesSelector(cur, selectors))) {
6183
6184							matched.push(cur);
6185							break;
6186						}
6187					}
6188				}
6189			}
6190
6191			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
6192		},
6193
6194		// Determine the position of an element within the set
6195		index: function (elem) {
6196
6197			// No argument, return index in parent
6198			if (!elem) {
6199				return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1;
6200			}
6201
6202			// Index in selector
6203			if (typeof elem === "string") {
6204				return indexOf.call(jQuery(elem), this[0]);
6205			}
6206
6207			// Locate the position of the desired element
6208			return indexOf.call(this,
6209
6210				// If it receives a jQuery object, the first element is used
6211				elem.jquery ? elem[0] : elem
6212			);
6213		},
6214
6215		add: function (selector, context) {
6216			return this.pushStack(
6217				jQuery.uniqueSort(
6218					jQuery.merge(this.get(), jQuery(selector, context))
6219				)
6220			);
6221		},
6222
6223		addBack: function (selector) {
6224			return this.add(selector == null ?
6225				this.prevObject : this.prevObject.filter(selector)
6226			);
6227		}
6228	});
6229
6230	function sibling(cur, dir) {
6231		while ((cur = cur[dir]) && cur.nodeType !== 1) { }
6232		return cur;
6233	}
6234
6235	jQuery.each({
6236		parent: function (elem) {
6237			var parent = elem.parentNode;
6238			return parent && parent.nodeType !== 11 ? parent : null;
6239		},
6240		parents: function (elem) {
6241			return dir(elem, "parentNode");
6242		},
6243		parentsUntil: function (elem, _i, until) {
6244			return dir(elem, "parentNode", until);
6245		},
6246		next: function (elem) {
6247			return sibling(elem, "nextSibling");
6248		},
6249		prev: function (elem) {
6250			return sibling(elem, "previousSibling");
6251		},
6252		nextAll: function (elem) {
6253			return dir(elem, "nextSibling");
6254		},
6255		prevAll: function (elem) {
6256			return dir(elem, "previousSibling");
6257		},
6258		nextUntil: function (elem, _i, until) {
6259			return dir(elem, "nextSibling", until);
6260		},
6261		prevUntil: function (elem, _i, until) {
6262			return dir(elem, "previousSibling", until);
6263		},
6264		siblings: function (elem) {
6265			return siblings((elem.parentNode || {}).firstChild, elem);
6266		},
6267		children: function (elem) {
6268			return siblings(elem.firstChild);
6269		},
6270		contents: function (elem) {
6271			if (elem.contentDocument != null &&
6272
6273				// Support: IE 11+
6274				// <object> elements with no `data` attribute has an object
6275				// `contentDocument` with a `null` prototype.
6276				getProto(elem.contentDocument)) {
6277
6278				return elem.contentDocument;
6279			}
6280
6281			// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
6282			// Treat the template element as a regular one in browsers that
6283			// don't support it.
6284			if (nodeName(elem, "template")) {
6285				elem = elem.content || elem;
6286			}
6287
6288			return jQuery.merge([], elem.childNodes);
6289		}
6290	}, function (name, fn) {
6291		jQuery.fn[name] = function (until, selector) {
6292			var matched = jQuery.map(this, fn, until);
6293
6294			if (name.slice(-5) !== "Until") {
6295				selector = until;
6296			}
6297
6298			if (selector && typeof selector === "string") {
6299				matched = jQuery.filter(selector, matched);
6300			}
6301
6302			if (this.length > 1) {
6303
6304				// Remove duplicates
6305				if (!guaranteedUnique[name]) {
6306					jQuery.uniqueSort(matched);
6307				}
6308
6309				// Reverse order for parents* and prev-derivatives
6310				if (rparentsprev.test(name)) {
6311					matched.reverse();
6312				}
6313			}
6314
6315			return this.pushStack(matched);
6316		};
6317	});
6318	var rnothtmlwhite = (/[^\x20\t\r\n\f]+/g);
6319
6320
6321
6322	// Convert String-formatted options into Object-formatted ones
6323	function createOptions(options) {
6324		var object = {};
6325		jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {
6326			object[flag] = true;
6327		});
6328		return object;
6329	}
6330
6331	/*
6332	 * Create a callback list using the following parameters:
6333	 *
6334	 *	options: an optional list of space-separated options that will change how
6335	 *			the callback list behaves or a more traditional option object
6336	 *
6337	 * By default a callback list will act like an event callback list and can be
6338	 * "fired" multiple times.
6339	 *
6340	 * Possible options:
6341	 *
6342	 *	once:			will ensure the callback list can only be fired once (like a Deferred)
6343	 *
6344	 *	memory:			will keep track of previous values and will call any callback added
6345	 *					after the list has been fired right away with the latest "memorized"
6346	 *					values (like a Deferred)
6347	 *
6348	 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
6349	 *
6350	 *	stopOnFalse:	interrupt callings when a callback returns false
6351	 *
6352	 */
6353	jQuery.Callbacks = function (options) {
6354
6355		// Convert options from String-formatted to Object-formatted if needed
6356		// (we check in cache first)
6357		options = typeof options === "string" ?
6358			createOptions(options) :
6359			jQuery.extend({}, options);
6360
6361		var // Flag to know if list is currently firing
6362			firing,
6363
6364			// Last fire value for non-forgettable lists
6365			memory,
6366
6367			// Flag to know if list was already fired
6368			fired,
6369
6370			// Flag to prevent firing
6371			locked,
6372
6373			// Actual callback list
6374			list = [],
6375
6376			// Queue of execution data for repeatable lists
6377			queue = [],
6378
6379			// Index of currently firing callback (modified by add/remove as needed)
6380			firingIndex = -1,
6381
6382			// Fire callbacks
6383			fire = function () {
6384
6385				// Enforce single-firing
6386				locked = locked || options.once;
6387
6388				// Execute callbacks for all pending executions,
6389				// respecting firingIndex overrides and runtime changes
6390				fired = firing = true;
6391				for (; queue.length; firingIndex = -1) {
6392					memory = queue.shift();
6393					while (++firingIndex < list.length) {
6394
6395						// Run callback and check for early termination
6396						if (list[firingIndex].apply(memory[0], memory[1]) === false &&
6397							options.stopOnFalse) {
6398
6399							// Jump to end and forget the data so .add doesn't re-fire
6400							firingIndex = list.length;
6401							memory = false;
6402						}
6403					}
6404				}
6405
6406				// Forget the data if we're done with it
6407				if (!options.memory) {
6408					memory = false;
6409				}
6410
6411				firing = false;
6412
6413				// Clean up if we're done firing for good
6414				if (locked) {
6415
6416					// Keep an empty list if we have data for future add calls
6417					if (memory) {
6418						list = [];
6419
6420						// Otherwise, this object is spent
6421					} else {
6422						list = "";
6423					}
6424				}
6425			},
6426
6427			// Actual Callbacks object
6428			self = {
6429
6430				// Add a callback or a collection of callbacks to the list
6431				add: function () {
6432					if (list) {
6433
6434						// If we have memory from a past run, we should fire after adding
6435						if (memory && !firing) {
6436							firingIndex = list.length - 1;
6437							queue.push(memory);
6438						}
6439
6440						(function add(args) {
6441							jQuery.each(args, function (_, arg) {
6442								if (isFunction(arg)) {
6443									if (!options.unique || !self.has(arg)) {
6444										list.push(arg);
6445									}
6446								} else if (arg && arg.length && toType(arg) !== "string") {
6447
6448									// Inspect recursively
6449									add(arg);
6450								}
6451							});
6452						})(arguments);
6453
6454						if (memory && !firing) {
6455							fire();
6456						}
6457					}
6458					return this;
6459				},
6460
6461				// Remove a callback from the list
6462				remove: function () {
6463					jQuery.each(arguments, function (_, arg) {
6464						var index;
6465						while ((index = jQuery.inArray(arg, list, index)) > -1) {
6466							list.splice(index, 1);
6467
6468							// Handle firing indexes
6469							if (index <= firingIndex) {
6470								firingIndex--;
6471							}
6472						}
6473					});
6474					return this;
6475				},
6476
6477				// Check if a given callback is in the list.
6478				// If no argument is given, return whether or not list has callbacks attached.
6479				has: function (fn) {
6480					return fn ?
6481						jQuery.inArray(fn, list) > -1 :
6482						list.length > 0;
6483				},
6484
6485				// Remove all callbacks from the list
6486				empty: function () {
6487					if (list) {
6488						list = [];
6489					}
6490					return this;
6491				},
6492
6493				// Disable .fire and .add
6494				// Abort any current/pending executions
6495				// Clear all callbacks and values
6496				disable: function () {
6497					locked = queue = [];
6498					list = memory = "";
6499					return this;
6500				},
6501				disabled: function () {
6502					return !list;
6503				},
6504
6505				// Disable .fire
6506				// Also disable .add unless we have memory (since it would have no effect)
6507				// Abort any pending executions
6508				lock: function () {
6509					locked = queue = [];
6510					if (!memory && !firing) {
6511						list = memory = "";
6512					}
6513					return this;
6514				},
6515				locked: function () {
6516					return !!locked;
6517				},
6518
6519				// Call all callbacks with the given context and arguments
6520				fireWith: function (context, args) {
6521					if (!locked) {
6522						args = args || [];
6523						args = [context, args.slice ? args.slice() : args];
6524						queue.push(args);
6525						if (!firing) {
6526							fire();
6527						}
6528					}
6529					return this;
6530				},
6531
6532				// Call all the callbacks with the given arguments
6533				fire: function () {
6534					self.fireWith(this, arguments);
6535					return this;
6536				},
6537
6538				// To know if the callbacks have already been called at least once
6539				fired: function () {
6540					return !!fired;
6541				}
6542			};
6543
6544		return self;
6545	};
6546
6547
6548	function Identity(v) {
6549		return v;
6550	}
6551	function Thrower(ex) {
6552		throw ex;
6553	}
6554
6555	function adoptValue(value, resolve, reject, noValue) {
6556		var method;
6557
6558		try {
6559
6560			// Check for promise aspect first to privilege synchronous behavior
6561			if (value && isFunction((method = value.promise))) {
6562				method.call(value).done(resolve).fail(reject);
6563
6564				// Other thenables
6565			} else if (value && isFunction((method = value.then))) {
6566				method.call(value, resolve, reject);
6567
6568				// Other non-thenables
6569			} else {
6570
6571				// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
6572				// * false: [ value ].slice( 0 ) => resolve( value )
6573				// * true: [ value ].slice( 1 ) => resolve()
6574				resolve.apply(undefined, [value].slice(noValue));
6575			}
6576
6577			// For Promises/A+, convert exceptions into rejections
6578			// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
6579			// Deferred#then to conditionally suppress rejection.
6580		} catch (value) {
6581
6582			// Support: Android 4.0 only
6583			// Strict mode functions invoked without .call/.apply get global-object context
6584			reject.apply(undefined, [value]);
6585		}
6586	}
6587
6588	jQuery.extend({
6589
6590		Deferred: function (func) {
6591			var tuples = [
6592
6593				// action, add listener, callbacks,
6594				// ... .then handlers, argument index, [final state]
6595				["notify", "progress", jQuery.Callbacks("memory"),
6596					jQuery.Callbacks("memory"), 2],
6597				["resolve", "done", jQuery.Callbacks("once memory"),
6598					jQuery.Callbacks("once memory"), 0, "resolved"],
6599				["reject", "fail", jQuery.Callbacks("once memory"),
6600					jQuery.Callbacks("once memory"), 1, "rejected"]
6601			],
6602				state = "pending",
6603				promise = {
6604					state: function () {
6605						return state;
6606					},
6607					always: function () {
6608						deferred.done(arguments).fail(arguments);
6609						return this;
6610					},
6611					"catch": function (fn) {
6612						return promise.then(null, fn);
6613					},
6614
6615					// Keep pipe for back-compat
6616					pipe: function ( /* fnDone, fnFail, fnProgress */) {
6617						var fns = arguments;
6618
6619						return jQuery.Deferred(function (newDefer) {
6620							jQuery.each(tuples, function (_i, tuple) {
6621
6622								// Map tuples (progress, done, fail) to arguments (done, fail, progress)
6623								var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]];
6624
6625								// deferred.progress(function() { bind to newDefer or newDefer.notify })
6626								// deferred.done(function() { bind to newDefer or newDefer.resolve })
6627								// deferred.fail(function() { bind to newDefer or newDefer.reject })
6628								deferred[tuple[1]](function () {
6629									var returned = fn && fn.apply(this, arguments);
6630									if (returned && isFunction(returned.promise)) {
6631										returned.promise()
6632											.progress(newDefer.notify)
6633											.done(newDefer.resolve)
6634											.fail(newDefer.reject);
6635									} else {
6636										newDefer[tuple[0] + "With"](
6637											this,
6638											fn ? [returned] : arguments
6639										);
6640									}
6641								});
6642							});
6643							fns = null;
6644						}).promise();
6645					},
6646					then: function (onFulfilled, onRejected, onProgress) {
6647						var maxDepth = 0;
6648						function resolve(depth, deferred, handler, special) {
6649							return function () {
6650								var that = this,
6651									args = arguments,
6652									mightThrow = function () {
6653										var returned, then;
6654
6655										// Support: Promises/A+ section 2.3.3.3.3
6656										// https://promisesaplus.com/#point-59
6657										// Ignore double-resolution attempts
6658										if (depth < maxDepth) {
6659											return;
6660										}
6661
6662										returned = handler.apply(that, args);
6663
6664										// Support: Promises/A+ section 2.3.1
6665										// https://promisesaplus.com/#point-48
6666										if (returned === deferred.promise()) {
6667											throw new TypeError("Thenable self-resolution");
6668										}
6669
6670										// Support: Promises/A+ sections 2.3.3.1, 3.5
6671										// https://promisesaplus.com/#point-54
6672										// https://promisesaplus.com/#point-75
6673										// Retrieve `then` only once
6674										then = returned &&
6675
6676											// Support: Promises/A+ section 2.3.4
6677											// https://promisesaplus.com/#point-64
6678											// Only check objects and functions for thenability
6679											(typeof returned === "object" ||
6680												typeof returned === "function") &&
6681											returned.then;
6682
6683										// Handle a returned thenable
6684										if (isFunction(then)) {
6685
6686											// Special processors (notify) just wait for resolution
6687											if (special) {
6688												then.call(
6689													returned,
6690													resolve(maxDepth, deferred, Identity, special),
6691													resolve(maxDepth, deferred, Thrower, special)
6692												);
6693
6694												// Normal processors (resolve) also hook into progress
6695											} else {
6696
6697												// ...and disregard older resolution values
6698												maxDepth++;
6699
6700												then.call(
6701													returned,
6702													resolve(maxDepth, deferred, Identity, special),
6703													resolve(maxDepth, deferred, Thrower, special),
6704													resolve(maxDepth, deferred, Identity,
6705														deferred.notifyWith)
6706												);
6707											}
6708
6709											// Handle all other returned values
6710										} else {
6711
6712											// Only substitute handlers pass on context
6713											// and multiple values (non-spec behavior)
6714											if (handler !== Identity) {
6715												that = undefined;
6716												args = [returned];
6717											}
6718
6719											// Process the value(s)
6720											// Default process is resolve
6721											(special || deferred.resolveWith)(that, args);
6722										}
6723									},
6724
6725									// Only normal processors (resolve) catch and reject exceptions
6726									process = special ?
6727										mightThrow :
6728										function () {
6729											try {
6730												mightThrow();
6731											} catch (e) {
6732
6733												if (jQuery.Deferred.exceptionHook) {
6734													jQuery.Deferred.exceptionHook(e,
6735														process.stackTrace);
6736												}
6737
6738												// Support: Promises/A+ section 2.3.3.3.4.1
6739												// https://promisesaplus.com/#point-61
6740												// Ignore post-resolution exceptions
6741												if (depth + 1 >= maxDepth) {
6742
6743													// Only substitute handlers pass on context
6744													// and multiple values (non-spec behavior)
6745													if (handler !== Thrower) {
6746														that = undefined;
6747														args = [e];
6748													}
6749
6750													deferred.rejectWith(that, args);
6751												}
6752											}
6753										};
6754
6755								// Support: Promises/A+ section 2.3.3.3.1
6756								// https://promisesaplus.com/#point-57
6757								// Re-resolve promises immediately to dodge false rejection from
6758								// subsequent errors
6759								if (depth) {
6760									process();
6761								} else {
6762
6763									// Call an optional hook to record the stack, in case of exception
6764									// since it's otherwise lost when execution goes async
6765									if (jQuery.Deferred.getStackHook) {
6766										process.stackTrace = jQuery.Deferred.getStackHook();
6767									}
6768									window.setTimeout(process);
6769								}
6770							};
6771						}
6772
6773						return jQuery.Deferred(function (newDefer) {
6774
6775							// progress_handlers.add( ... )
6776							tuples[0][3].add(
6777								resolve(
6778									0,
6779									newDefer,
6780									isFunction(onProgress) ?
6781										onProgress :
6782										Identity,
6783									newDefer.notifyWith
6784								)
6785							);
6786
6787							// fulfilled_handlers.add( ... )
6788							tuples[1][3].add(
6789								resolve(
6790									0,
6791									newDefer,
6792									isFunction(onFulfilled) ?
6793										onFulfilled :
6794										Identity
6795								)
6796							);
6797
6798							// rejected_handlers.add( ... )
6799							tuples[2][3].add(
6800								resolve(
6801									0,
6802									newDefer,
6803									isFunction(onRejected) ?
6804										onRejected :
6805										Thrower
6806								)
6807							);
6808						}).promise();
6809					},
6810
6811					// Get a promise for this deferred
6812					// If obj is provided, the promise aspect is added to the object
6813					promise: function (obj) {
6814						return obj != null ? jQuery.extend(obj, promise) : promise;
6815					}
6816				},
6817				deferred = {};
6818
6819			// Add list-specific methods
6820			jQuery.each(tuples, function (i, tuple) {
6821				var list = tuple[2],
6822					stateString = tuple[5];
6823
6824				// promise.progress = list.add
6825				// promise.done = list.add
6826				// promise.fail = list.add
6827				promise[tuple[1]] = list.add;
6828
6829				// Handle state
6830				if (stateString) {
6831					list.add(
6832						function () {
6833
6834							// state = "resolved" (i.e., fulfilled)
6835							// state = "rejected"
6836							state = stateString;
6837						},
6838
6839						// rejected_callbacks.disable
6840						// fulfilled_callbacks.disable
6841						tuples[3 - i][2].disable,
6842
6843						// rejected_handlers.disable
6844						// fulfilled_handlers.disable
6845						tuples[3 - i][3].disable,
6846
6847						// progress_callbacks.lock
6848						tuples[0][2].lock,
6849
6850						// progress_handlers.lock
6851						tuples[0][3].lock
6852					);
6853				}
6854
6855				// progress_handlers.fire
6856				// fulfilled_handlers.fire
6857				// rejected_handlers.fire
6858				list.add(tuple[3].fire);
6859
6860				// deferred.notify = function() { deferred.notifyWith(...) }
6861				// deferred.resolve = function() { deferred.resolveWith(...) }
6862				// deferred.reject = function() { deferred.rejectWith(...) }
6863				deferred[tuple[0]] = function () {
6864					deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments);
6865					return this;
6866				};
6867
6868				// deferred.notifyWith = list.fireWith
6869				// deferred.resolveWith = list.fireWith
6870				// deferred.rejectWith = list.fireWith
6871				deferred[tuple[0] + "With"] = list.fireWith;
6872			});
6873
6874			// Make the deferred a promise
6875			promise.promise(deferred);
6876
6877			// Call given func if any
6878			if (func) {
6879				func.call(deferred, deferred);
6880			}
6881
6882			// All done!
6883			return deferred;
6884		},
6885
6886		// Deferred helper
6887		when: function (singleValue) {
6888			var
6889
6890				// count of uncompleted subordinates
6891				remaining = arguments.length,
6892
6893				// count of unprocessed arguments
6894				i = remaining,
6895
6896				// subordinate fulfillment data
6897				resolveContexts = Array(i),
6898				resolveValues = slice.call(arguments),
6899
6900				// the master Deferred
6901				master = jQuery.Deferred(),
6902
6903				// subordinate callback factory
6904				updateFunc = function (i) {
6905					return function (value) {
6906						resolveContexts[i] = this;
6907						resolveValues[i] = arguments.length > 1 ? slice.call(arguments) : value;
6908						if (!(--remaining)) {
6909							master.resolveWith(resolveContexts, resolveValues);
6910						}
6911					};
6912				};
6913
6914			// Single- and empty arguments are adopted like Promise.resolve
6915			if (remaining <= 1) {
6916				adoptValue(singleValue, master.done(updateFunc(i)).resolve, master.reject,
6917					!remaining);
6918
6919				// Use .then() to unwrap secondary thenables (cf. gh-3000)
6920				if (master.state() === "pending" ||
6921					isFunction(resolveValues[i] && resolveValues[i].then)) {
6922
6923					return master.then();
6924				}
6925			}
6926
6927			// Multiple arguments are aggregated like Promise.all array elements
6928			while (i--) {
6929				adoptValue(resolveValues[i], updateFunc(i), master.reject);
6930			}
6931
6932			return master.promise();
6933		}
6934	});
6935
6936
6937	// These usually indicate a programmer mistake during development,
6938	// warn about them ASAP rather than swallowing them by default.
6939	var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
6940
6941	jQuery.Deferred.exceptionHook = function (error, stack) {
6942
6943		// Support: IE 8 - 9 only
6944		// Console exists when dev tools are open, which can happen at any time
6945		if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {
6946			window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
6947		}
6948	};
6949
6950
6951
6952
6953	jQuery.readyException = function (error) {
6954		window.setTimeout(function () {
6955			throw error;
6956		});
6957	};
6958
6959
6960
6961
6962	// The deferred used on DOM ready
6963	var readyList = jQuery.Deferred();
6964
6965	jQuery.fn.ready = function (fn) {
6966
6967		readyList
6968			.then(fn)
6969
6970			// Wrap jQuery.readyException in a function so that the lookup
6971			// happens at the time of error handling instead of callback
6972			// registration.
6973			.catch(function (error) {
6974				jQuery.readyException(error);
6975			});
6976
6977		return this;
6978	};
6979
6980	jQuery.extend({
6981
6982		// Is the DOM ready to be used? Set to true once it occurs.
6983		isReady: false,
6984
6985		// A counter to track how many items to wait for before
6986		// the ready event fires. See #6781
6987		readyWait: 1,
6988
6989		// Handle when the DOM is ready
6990		ready: function (wait) {
6991
6992			// Abort if there are pending holds or we're already ready
6993			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
6994				return;
6995			}
6996
6997			// Remember that the DOM is ready
6998			jQuery.isReady = true;
6999
7000			// If a normal DOM Ready event fired, decrement, and wait if need be
7001			if (wait !== true && --jQuery.readyWait > 0) {
7002				return;
7003			}
7004
7005			// If there are functions bound, to execute
7006			readyList.resolveWith(document, [jQuery]);
7007		}
7008	});
7009
7010	jQuery.ready.then = readyList.then;
7011
7012	// The ready event handler and self cleanup method
7013	function completed() {
7014		document.removeEventListener("DOMContentLoaded", completed);
7015		window.removeEventListener("load", completed);
7016		jQuery.ready();
7017	}
7018
7019	// Catch cases where $(document).ready() is called
7020	// after the browser event has already occurred.
7021	// Support: IE <=9 - 10 only
7022	// Older IE sometimes signals "interactive" too soon
7023	if (document.readyState === "complete" ||
7024		(document.readyState !== "loading" && !document.documentElement.doScroll)) {
7025
7026		// Handle it asynchronously to allow scripts the opportunity to delay ready
7027		window.setTimeout(jQuery.ready);
7028
7029	} else {
7030
7031		// Use the handy event callback
7032		document.addEventListener("DOMContentLoaded", completed);
7033
7034		// A fallback to window.onload, that will always work
7035		window.addEventListener("load", completed);
7036	}
7037
7038
7039
7040
7041	// Multifunctional method to get and set values of a collection
7042	// The value/s can optionally be executed if it's a function
7043	var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
7044		var i = 0,
7045			len = elems.length,
7046			bulk = key == null;
7047
7048		// Sets many values
7049		if (toType(key) === "object") {
7050			chainable = true;
7051			for (i in key) {
7052				access(elems, fn, i, key[i], true, emptyGet, raw);
7053			}
7054
7055			// Sets one value
7056		} else if (value !== undefined) {
7057			chainable = true;
7058
7059			if (!isFunction(value)) {
7060				raw = true;
7061			}
7062
7063			if (bulk) {
7064
7065				// Bulk operations run against the entire set
7066				if (raw) {
7067					fn.call(elems, value);
7068					fn = null;
7069
7070					// ...except when executing function values
7071				} else {
7072					bulk = fn;
7073					fn = function (elem, _key, value) {
7074						return bulk.call(jQuery(elem), value);
7075					};
7076				}
7077			}
7078
7079			if (fn) {
7080				for (; i < len; i++) {
7081					fn(
7082						elems[i], key, raw ?
7083							value :
7084							value.call(elems[i], i, fn(elems[i], key))
7085					);
7086				}
7087			}
7088		}
7089
7090		if (chainable) {
7091			return elems;
7092		}
7093
7094		// Gets
7095		if (bulk) {
7096			return fn.call(elems);
7097		}
7098
7099		return len ? fn(elems[0], key) : emptyGet;
7100	};
7101
7102
7103	// Matches dashed string for camelizing
7104	var rmsPrefix = /^-ms-/,
7105		rdashAlpha = /-([a-z])/g;
7106
7107	// Used by camelCase as callback to replace()
7108	function fcamelCase(_all, letter) {
7109		return letter.toUpperCase();
7110	}
7111
7112	// Convert dashed to camelCase; used by the css and data modules
7113	// Support: IE <=9 - 11, Edge 12 - 15
7114	// Microsoft forgot to hump their vendor prefix (#9572)
7115	function camelCase(string) {
7116		return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
7117	}
7118	var acceptData = function (owner) {
7119
7120		// Accepts only:
7121		//  - Node
7122		//    - Node.ELEMENT_NODE
7123		//    - Node.DOCUMENT_NODE
7124		//  - Object
7125		//    - Any
7126		return owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType);
7127	};
7128
7129
7130
7131
7132	function Data() {
7133		this.expando = jQuery.expando + Data.uid++;
7134	}
7135
7136	Data.uid = 1;
7137
7138	Data.prototype = {
7139
7140		cache: function (owner) {
7141
7142			// Check if the owner object already has a cache
7143			var value = owner[this.expando];
7144
7145			// If not, create one
7146			if (!value) {
7147				value = {};
7148
7149				// We can accept data for non-element nodes in modern browsers,
7150				// but we should not, see #8335.
7151				// Always return an empty object.
7152				if (acceptData(owner)) {
7153
7154					// If it is a node unlikely to be stringify-ed or looped over
7155					// use plain assignment
7156					if (owner.nodeType) {
7157						owner[this.expando] = value;
7158
7159						// Otherwise secure it in a non-enumerable property
7160						// configurable must be true to allow the property to be
7161						// deleted when data is removed
7162					} else {
7163						Object.defineProperty(owner, this.expando, {
7164							value: value,
7165							configurable: true
7166						});
vendor: 5,631 bytes, lines 7167-7387
7167					}
7168				}
7169			}
7170
7171			return value;
7172		},
7173		set: function (owner, data, value) {
7174			var prop,
7175				cache = this.cache(owner);
7176
7177			// Handle: [ owner, key, value ] args
7178			// Always use camelCase key (gh-2257)
7179			if (typeof data === "string") {
7180				cache[camelCase(data)] = value;
7181
7182				// Handle: [ owner, { properties } ] args
7183			} else {
7184
7185				// Copy the properties one-by-one to the cache object
7186				for (prop in data) {
7187					cache[camelCase(prop)] = data[prop];
7188				}
7189			}
7190			return cache;
7191		},
7192		get: function (owner, key) {
7193			return key === undefined ?
7194				this.cache(owner) :
7195
7196				// Always use camelCase key (gh-2257)
7197				owner[this.expando] && owner[this.expando][camelCase(key)];
7198		},
7199		access: function (owner, key, value) {
7200
7201			// In cases where either:
7202			//
7203			//   1. No key was specified
7204			//   2. A string key was specified, but no value provided
7205			//
7206			// Take the "read" path and allow the get method to determine
7207			// which value to return, respectively either:
7208			//
7209			//   1. The entire cache object
7210			//   2. The data stored at the key
7211			//
7212			if (key === undefined ||
7213				((key && typeof key === "string") && value === undefined)) {
7214
7215				return this.get(owner, key);
7216			}
7217
7218			// When the key is not a string, or both a key and value
7219			// are specified, set or extend (existing objects) with either:
7220			//
7221			//   1. An object of properties
7222			//   2. A key and value
7223			//
7224			this.set(owner, key, value);
7225
7226			// Since the "set" path can have two possible entry points
7227			// return the expected data based on which path was taken[*]
7228			return value !== undefined ? value : key;
7229		},
7230		remove: function (owner, key) {
7231			var i,
7232				cache = owner[this.expando];
7233
7234			if (cache === undefined) {
7235				return;
7236			}
7237
7238			if (key !== undefined) {
7239
7240				// Support array or space separated string of keys
7241				if (Array.isArray(key)) {
7242
7243					// If key is an array of keys...
7244					// We always set camelCase keys, so remove that.
7245					key = key.map(camelCase);
7246				} else {
7247					key = camelCase(key);
7248
7249					// If a key with the spaces exists, use it.
7250					// Otherwise, create an array by matching non-whitespace
7251					key = key in cache ?
7252						[key] :
7253						(key.match(rnothtmlwhite) || []);
7254				}
7255
7256				i = key.length;
7257
7258				while (i--) {
7259					delete cache[key[i]];
7260				}
7261			}
7262
7263			// Remove the expando if there's no more data
7264			if (key === undefined || jQuery.isEmptyObject(cache)) {
7265
7266				// Support: Chrome <=35 - 45
7267				// Webkit & Blink performance suffers when deleting properties
7268				// from DOM nodes, so set to undefined instead
7269				// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
7270				if (owner.nodeType) {
7271					owner[this.expando] = undefined;
7272				} else {
7273					delete owner[this.expando];
7274				}
7275			}
7276		},
7277		hasData: function (owner) {
7278			var cache = owner[this.expando];
7279			return cache !== undefined && !jQuery.isEmptyObject(cache);
7280		}
7281	};
7282	var dataPriv = new Data();
7283
7284	var dataUser = new Data();
7285
7286
7287
7288	//	Implementation Summary
7289	//
7290	//	1. Enforce API surface and semantic compatibility with 1.9.x branch
7291	//	2. Improve the module's maintainability by reducing the storage
7292	//		paths to a single mechanism.
7293	//	3. Use the same single mechanism to support "private" and "user" data.
7294	//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
7295	//	5. Avoid exposing implementation details on user objects (eg. expando properties)
7296	//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
7297
7298	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
7299		rmultiDash = /[A-Z]/g;
7300
7301	function getData(data) {
7302		if (data === "true") {
7303			return true;
7304		}
7305
7306		if (data === "false") {
7307			return false;
7308		}
7309
7310		if (data === "null") {
7311			return null;
7312		}
7313
7314		// Only convert to a number if it doesn't change the string
7315		if (data === +data + "") {
7316			return +data;
7317		}
7318
7319		if (rbrace.test(data)) {
7320			return JSON.parse(data);
7321		}
7322
7323		return data;
7324	}
7325
7326	function dataAttr(elem, key, data) {
7327		var name;
7328
7329		// If nothing was found internally, try to fetch any
7330		// data from the HTML5 data-* attribute
7331		if (data === undefined && elem.nodeType === 1) {
7332			name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
7333			data = elem.getAttribute(name);
7334
7335			if (typeof data === "string") {
7336				try {
7337					data = getData(data);
7338				} catch (e) { }
7339
7340				// Make sure we set the data so it isn't changed later
7341				dataUser.set(elem, key, data);
7342			} else {
7343				data = undefined;
7344			}
7345		}
7346		return data;
7347	}
7348
7349	jQuery.extend({
7350		hasData: function (elem) {
7351			return dataUser.hasData(elem) || dataPriv.hasData(elem);
7352		},
7353
7354		data: function (elem, name, data) {
7355			return dataUser.access(elem, name, data);
7356		},
7357
7358		removeData: function (elem, name) {
7359			dataUser.remove(elem, name);
7360		},
7361
7362		// TODO: Now that all calls to _data and _removeData have been replaced
7363		// with direct calls to dataPriv methods, these can be deprecated.
7364		_data: function (elem, name, data) {
7365			return dataPriv.access(elem, name, data);
7366		},
7367
7368		_removeData: function (elem, name) {
7369			dataPriv.remove(elem, name);
7370		}
7371	});
7372
7373	jQuery.fn.extend({
7374		data: function (key, value) {
7375			var i, name, data,
7376				elem = this[0],
7377				attrs = elem && elem.attributes;
7378
7379			// Gets all values
7380			if (key === undefined) {
7381				if (this.length) {
7382					data = dataUser.get(elem);
7383
7384					if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
7385						i = attrs.length;
7386						while (i--) {
7387
vendor: 11,221 bytes, lines 7388-7821
7388							// Support: IE 11 only
7389							// The attrs elements can be null (#14894)
7390							if (attrs[i]) {
7391								name = attrs[i].name;
7392								if (name.indexOf("data-") === 0) {
7393									name = camelCase(name.slice(5));
7394									dataAttr(elem, name, data[name]);
7395								}
7396							}
7397						}
7398						dataPriv.set(elem, "hasDataAttrs", true);
7399					}
7400				}
7401
7402				return data;
7403			}
7404
7405			// Sets multiple values
7406			if (typeof key === "object") {
7407				return this.each(function () {
7408					dataUser.set(this, key);
7409				});
7410			}
7411
7412			return access(this, function (value) {
7413				var data;
7414
7415				// The calling jQuery object (element matches) is not empty
7416				// (and therefore has an element appears at this[ 0 ]) and the
7417				// `value` parameter was not undefined. An empty jQuery object
7418				// will result in `undefined` for elem = this[ 0 ] which will
7419				// throw an exception if an attempt to read a data cache is made.
7420				if (elem && value === undefined) {
7421
7422					// Attempt to get data from the cache
7423					// The key will always be camelCased in Data
7424					data = dataUser.get(elem, key);
7425					if (data !== undefined) {
7426						return data;
7427					}
7428
7429					// Attempt to "discover" the data in
7430					// HTML5 custom data-* attrs
7431					data = dataAttr(elem, key);
7432					if (data !== undefined) {
7433						return data;
7434					}
7435
7436					// We tried really hard, but the data doesn't exist.
7437					return;
7438				}
7439
7440				// Set the data...
7441				this.each(function () {
7442
7443					// We always store the camelCased key
7444					dataUser.set(this, key, value);
7445				});
7446			}, null, value, arguments.length > 1, null, true);
7447		},
7448
7449		removeData: function (key) {
7450			return this.each(function () {
7451				dataUser.remove(this, key);
7452			});
7453		}
7454	});
7455
7456
7457	jQuery.extend({
7458		queue: function (elem, type, data) {
7459			var queue;
7460
7461			if (elem) {
7462				type = (type || "fx") + "queue";
7463				queue = dataPriv.get(elem, type);
7464
7465				// Speed up dequeue by getting out quickly if this is just a lookup
7466				if (data) {
7467					if (!queue || Array.isArray(data)) {
7468						queue = dataPriv.access(elem, type, jQuery.makeArray(data));
7469					} else {
7470						queue.push(data);
7471					}
7472				}
7473				return queue || [];
7474			}
7475		},
7476
7477		dequeue: function (elem, type) {
7478			type = type || "fx";
7479
7480			var queue = jQuery.queue(elem, type),
7481				startLength = queue.length,
7482				fn = queue.shift(),
7483				hooks = jQuery._queueHooks(elem, type),
7484				next = function () {
7485					jQuery.dequeue(elem, type);
7486				};
7487
7488			// If the fx queue is dequeued, always remove the progress sentinel
7489			if (fn === "inprogress") {
7490				fn = queue.shift();
7491				startLength--;
7492			}
7493
7494			if (fn) {
7495
7496				// Add a progress sentinel to prevent the fx queue from being
7497				// automatically dequeued
7498				if (type === "fx") {
7499					queue.unshift("inprogress");
7500				}
7501
7502				// Clear up the last queue stop function
7503				delete hooks.stop;
7504				fn.call(elem, next, hooks);
7505			}
7506
7507			if (!startLength && hooks) {
7508				hooks.empty.fire();
7509			}
7510		},
7511
7512		// Not public - generate a queueHooks object, or return the current one
7513		_queueHooks: function (elem, type) {
7514			var key = type + "queueHooks";
7515			return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
7516				empty: jQuery.Callbacks("once memory").add(function () {
7517					dataPriv.remove(elem, [type + "queue", key]);
7518				})
7519			});
7520		}
7521	});
7522
7523	jQuery.fn.extend({
7524		queue: function (type, data) {
7525			var setter = 2;
7526
7527			if (typeof type !== "string") {
7528				data = type;
7529				type = "fx";
7530				setter--;
7531			}
7532
7533			if (arguments.length < setter) {
7534				return jQuery.queue(this[0], type);
7535			}
7536
7537			return data === undefined ?
7538				this :
7539				this.each(function () {
7540					var queue = jQuery.queue(this, type, data);
7541
7542					// Ensure a hooks for this queue
7543					jQuery._queueHooks(this, type);
7544
7545					if (type === "fx" && queue[0] !== "inprogress") {
7546						jQuery.dequeue(this, type);
7547					}
7548				});
7549		},
7550		dequeue: function (type) {
7551			return this.each(function () {
7552				jQuery.dequeue(this, type);
7553			});
7554		},
7555		clearQueue: function (type) {
7556			return this.queue(type || "fx", []);
7557		},
7558
7559		// Get a promise resolved when queues of a certain type
7560		// are emptied (fx is the type by default)
7561		promise: function (type, obj) {
7562			var tmp,
7563				count = 1,
7564				defer = jQuery.Deferred(),
7565				elements = this,
7566				i = this.length,
7567				resolve = function () {
7568					if (!(--count)) {
7569						defer.resolveWith(elements, [elements]);
7570					}
7571				};
7572
7573			if (typeof type !== "string") {
7574				obj = type;
7575				type = undefined;
7576			}
7577			type = type || "fx";
7578
7579			while (i--) {
7580				tmp = dataPriv.get(elements[i], type + "queueHooks");
7581				if (tmp && tmp.empty) {
7582					count++;
7583					tmp.empty.add(resolve);
7584				}
7585			}
7586			resolve();
7587			return defer.promise(obj);
7588		}
7589	});
7590	var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
7591
7592	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
7593
7594
7595	var cssExpand = ["Top", "Right", "Bottom", "Left"];
7596
7597	var documentElement = document.documentElement;
7598
7599
7600
7601	var isAttached = function (elem) {
7602		return jQuery.contains(elem.ownerDocument, elem);
7603	},
7604		composed = { composed: true };
7605
7606	// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
7607	// Check attachment across shadow DOM boundaries when possible (gh-3504)
7608	// Support: iOS 10.0-10.2 only
7609	// Early iOS 10 versions support `attachShadow` but not `getRootNode`,
7610	// leading to errors. We need to check for `getRootNode`.
7611	if (documentElement.getRootNode) {
7612		isAttached = function (elem) {
7613			return jQuery.contains(elem.ownerDocument, elem) ||
7614				elem.getRootNode(composed) === elem.ownerDocument;
7615		};
7616	}
7617	var isHiddenWithinTree = function (elem, el) {
7618
7619		// isHiddenWithinTree might be called from jQuery#filter function;
7620		// in that case, element will be second argument
7621		elem = el || elem;
7622
7623		// Inline style trumps all
7624		return elem.style.display === "none" ||
7625			elem.style.display === "" &&
7626
7627			// Otherwise, check computed style
7628			// Support: Firefox <=43 - 45
7629			// Disconnected elements can have computed display: none, so first confirm that elem is
7630			// in the document.
7631			isAttached(elem) &&
7632
7633			jQuery.css(elem, "display") === "none";
7634	};
7635
7636
7637
7638	function adjustCSS(elem, prop, valueParts, tween) {
7639		var adjusted, scale,
7640			maxIterations = 20,
7641			currentValue = tween ?
7642				function () {
7643					return tween.cur();
7644				} :
7645				function () {
7646					return jQuery.css(elem, prop, "");
7647				},
7648			initial = currentValue(),
7649			unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
7650
7651			// Starting value computation is required for potential unit mismatches
7652			initialInUnit = elem.nodeType &&
7653				(jQuery.cssNumber[prop] || unit !== "px" && +initial) &&
7654				rcssNum.exec(jQuery.css(elem, prop));
7655
7656		if (initialInUnit && initialInUnit[3] !== unit) {
7657
7658			// Support: Firefox <=54
7659			// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
7660			initial = initial / 2;
7661
7662			// Trust units reported by jQuery.css
7663			unit = unit || initialInUnit[3];
7664
7665			// Iteratively approximate from a nonzero starting point
7666			initialInUnit = +initial || 1;
7667
7668			while (maxIterations--) {
7669
7670				// Evaluate and update our best guess (doubling guesses that zero out).
7671				// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
7672				jQuery.style(elem, prop, initialInUnit + unit);
7673				if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
7674					maxIterations = 0;
7675				}
7676				initialInUnit = initialInUnit / scale;
7677
7678			}
7679
7680			initialInUnit = initialInUnit * 2;
7681			jQuery.style(elem, prop, initialInUnit + unit);
7682
7683			// Make sure we update the tween properties later on
7684			valueParts = valueParts || [];
7685		}
7686
7687		if (valueParts) {
7688			initialInUnit = +initialInUnit || +initial || 0;
7689
7690			// Apply relative offset (+=/-=) if specified
7691			adjusted = valueParts[1] ?
7692				initialInUnit + (valueParts[1] + 1) * valueParts[2] :
7693				+valueParts[2];
7694			if (tween) {
7695				tween.unit = unit;
7696				tween.start = initialInUnit;
7697				tween.end = adjusted;
7698			}
7699		}
7700		return adjusted;
7701	}
7702
7703
7704	var defaultDisplayMap = {};
7705
7706	function getDefaultDisplay(elem) {
7707		var temp,
7708			doc = elem.ownerDocument,
7709			nodeName = elem.nodeName,
7710			display = defaultDisplayMap[nodeName];
7711
7712		if (display) {
7713			return display;
7714		}
7715
7716		temp = doc.body.appendChild(doc.createElement(nodeName));
7717		display = jQuery.css(temp, "display");
7718
7719		temp.parentNode.removeChild(temp);
7720
7721		if (display === "none") {
7722			display = "block";
7723		}
7724		defaultDisplayMap[nodeName] = display;
7725
7726		return display;
7727	}
7728
7729	function showHide(elements, show) {
7730		var display, elem,
7731			values = [],
7732			index = 0,
7733			length = elements.length;
7734
7735		// Determine new display value for elements that need to change
7736		for (; index < length; index++) {
7737			elem = elements[index];
7738			if (!elem.style) {
7739				continue;
7740			}
7741
7742			display = elem.style.display;
7743			if (show) {
7744
7745				// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
7746				// check is required in this first loop unless we have a nonempty display value (either
7747				// inline or about-to-be-restored)
7748				if (display === "none") {
7749					values[index] = dataPriv.get(elem, "display") || null;
7750					if (!values[index]) {
7751						elem.style.display = "";
7752					}
7753				}
7754				if (elem.style.display === "" && isHiddenWithinTree(elem)) {
7755					values[index] = getDefaultDisplay(elem);
7756				}
7757			} else {
7758				if (display !== "none") {
7759					values[index] = "none";
7760
7761					// Remember what we're overwriting
7762					dataPriv.set(elem, "display", display);
7763				}
7764			}
7765		}
7766
7767		// Set the display of the elements in a second loop to avoid constant reflow
7768		for (index = 0; index < length; index++) {
7769			if (values[index] != null) {
7770				elements[index].style.display = values[index];
7771			}
7772		}
7773
7774		return elements;
7775	}
7776
7777	jQuery.fn.extend({
7778		show: function () {
7779			return showHide(this, true);
7780		},
7781		hide: function () {
7782			return showHide(this);
7783		},
7784		toggle: function (state) {
7785			if (typeof state === "boolean") {
7786				return state ? this.show() : this.hide();
7787			}
7788
7789			return this.each(function () {
7790				if (isHiddenWithinTree(this)) {
7791					jQuery(this).show();
7792				} else {
7793					jQuery(this).hide();
7794				}
7795			});
7796		}
7797	});
7798	var rcheckableType = (/^(?:checkbox|radio)$/i);
7799
7800	var rtagName = (/<([a-z][^\/\0>\x20\t\r\n\f]*)/i);
7801
7802	var rscriptType = (/^$|^module$|\/(?:java|ecma)script/i);
7803
7804
7805
7806	(function () {
7807		var fragment = document.createDocumentFragment(),
7808			div = fragment.appendChild(document.createElement("div")),
7809			input = document.createElement("input");
7810
7811		// Support: Android 4.0 - 4.3 only
7812		// Check state lost if the name is set (#11217)
7813		// Support: Windows Web Apps (WWA)
7814		// `name` and `type` must use .setAttribute for WWA (#14901)
7815		input.setAttribute("type", "radio");
7816		input.setAttribute("checked", "checked");
7817		input.setAttribute("name", "t");
7818
7819		div.appendChild(input);
7820
7821		// Support: Android <=4.1 only
vendor: 10,938 bytes, lines 7822-8218
7822		// Older WebKit doesn't clone checked state correctly in fragments
7823		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
7824
7825		// Support: IE <=11 only
7826		// Make sure textarea (and checkbox) defaultValue is properly cloned
7827		div.innerHTML = "<textarea>x</textarea>";
7828		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
7829
7830		// Support: IE <=9 only
7831		// IE <=9 replaces <option> tags with their contents when inserted outside of
7832		// the select element.
7833		div.innerHTML = "<option></option>";
7834		support.option = !!div.lastChild;
7835	})();
7836
7837
7838	// We have to close these tags to support XHTML (#13200)
7839	var wrapMap = {
7840
7841		// XHTML parsers do not magically insert elements in the
7842		// same way that tag soup parsers do. So we cannot shorten
7843		// this by omitting <tbody> or other required elements.
7844		thead: [1, "<table>", "</table>"],
7845		col: [2, "<table><colgroup>", "</colgroup></table>"],
7846		tr: [2, "<table><tbody>", "</tbody></table>"],
7847		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
7848
7849		_default: [0, "", ""]
7850	};
7851
7852	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
7853	wrapMap.th = wrapMap.td;
7854
7855	// Support: IE <=9 only
7856	if (!support.option) {
7857		wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
7858	}
7859
7860
7861	function getAll(context, tag) {
7862
7863		// Support: IE <=9 - 11 only
7864		// Use typeof to avoid zero-argument method invocation on host objects (#15151)
7865		var ret;
7866
7867		if (typeof context.getElementsByTagName !== "undefined") {
7868			ret = context.getElementsByTagName(tag || "*");
7869
7870		} else if (typeof context.querySelectorAll !== "undefined") {
7871			ret = context.querySelectorAll(tag || "*");
7872
7873		} else {
7874			ret = [];
7875		}
7876
7877		if (tag === undefined || tag && nodeName(context, tag)) {
7878			return jQuery.merge([context], ret);
7879		}
7880
7881		return ret;
7882	}
7883
7884
7885	// Mark scripts as having already been evaluated
7886	function setGlobalEval(elems, refElements) {
7887		var i = 0,
7888			l = elems.length;
7889
7890		for (; i < l; i++) {
7891			dataPriv.set(
7892				elems[i],
7893				"globalEval",
7894				!refElements || dataPriv.get(refElements[i], "globalEval")
7895			);
7896		}
7897	}
7898
7899
7900	var rhtml = /<|&#?\w+;/;
7901
7902	function buildFragment(elems, context, scripts, selection, ignored) {
7903		var elem, tmp, tag, wrap, attached, j,
7904			fragment = context.createDocumentFragment(),
7905			nodes = [],
7906			i = 0,
7907			l = elems.length;
7908
7909		for (; i < l; i++) {
7910			elem = elems[i];
7911
7912			if (elem || elem === 0) {
7913
7914				// Add nodes directly
7915				if (toType(elem) === "object") {
7916
7917					// Support: Android <=4.0 only, PhantomJS 1 only
7918					// push.apply(_, arraylike) throws on ancient WebKit
7919					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
7920
7921					// Convert non-html into a text node
7922				} else if (!rhtml.test(elem)) {
7923					nodes.push(context.createTextNode(elem));
7924
7925					// Convert html into DOM nodes
7926				} else {
7927					tmp = tmp || fragment.appendChild(context.createElement("div"));
7928
7929					// Deserialize a standard representation
7930					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
7931					wrap = wrapMap[tag] || wrapMap._default;
7932					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
7933
7934					// Descend through wrappers to the right content
7935					j = wrap[0];
7936					while (j--) {
7937						tmp = tmp.lastChild;
7938					}
7939
7940					// Support: Android <=4.0 only, PhantomJS 1 only
7941					// push.apply(_, arraylike) throws on ancient WebKit
7942					jQuery.merge(nodes, tmp.childNodes);
7943
7944					// Remember the top-level container
7945					tmp = fragment.firstChild;
7946
7947					// Ensure the created nodes are orphaned (#12392)
7948					tmp.textContent = "";
7949				}
7950			}
7951		}
7952
7953		// Remove wrapper from fragment
7954		fragment.textContent = "";
7955
7956		i = 0;
7957		while ((elem = nodes[i++])) {
7958
7959			// Skip elements already in the context collection (trac-4087)
7960			if (selection && jQuery.inArray(elem, selection) > -1) {
7961				if (ignored) {
7962					ignored.push(elem);
7963				}
7964				continue;
7965			}
7966
7967			attached = isAttached(elem);
7968
7969			// Append to fragment
7970			tmp = getAll(fragment.appendChild(elem), "script");
7971
7972			// Preserve script evaluation history
7973			if (attached) {
7974				setGlobalEval(tmp);
7975			}
7976
7977			// Capture executables
7978			if (scripts) {
7979				j = 0;
7980				while ((elem = tmp[j++])) {
7981					if (rscriptType.test(elem.type || "")) {
7982						scripts.push(elem);
7983					}
7984				}
7985			}
7986		}
7987
7988		return fragment;
7989	}
7990
7991
7992	var
7993		rkeyEvent = /^key/,
7994		rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
7995		rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
7996
7997	function returnTrue() {
7998		return true;
7999	}
8000
8001	function returnFalse() {
8002		return false;
8003	}
8004
8005	// Support: IE <=9 - 11+
8006	// focus() and blur() are asynchronous, except when they are no-op.
8007	// So expect focus to be synchronous when the element is already active,
8008	// and blur to be synchronous when the element is not already active.
8009	// (focus and blur are always synchronous in other supported browsers,
8010	// this just defines when we can count on it).
8011	function expectSync(elem, type) {
8012		return (elem === safeActiveElement()) === (type === "focus");
8013	}
8014
8015	// Support: IE <=9 only
8016	// Accessing document.activeElement can throw unexpectedly
8017	// https://bugs.jquery.com/ticket/13393
8018	function safeActiveElement() {
8019		try {
8020			return document.activeElement;
8021		} catch (err) { }
8022	}
8023
8024	function on(elem, types, selector, data, fn, one) {
8025		var origFn, type;
8026
8027		// Types can be a map of types/handlers
8028		if (typeof types === "object") {
8029
8030			// ( types-Object, selector, data )
8031			if (typeof selector !== "string") {
8032
8033				// ( types-Object, data )
8034				data = data || selector;
8035				selector = undefined;
8036			}
8037			for (type in types) {
8038				on(elem, type, selector, data, types[type], one);
8039			}
8040			return elem;
8041		}
8042
8043		if (data == null && fn == null) {
8044
8045			// ( types, fn )
8046			fn = selector;
8047			data = selector = undefined;
8048		} else if (fn == null) {
8049			if (typeof selector === "string") {
8050
8051				// ( types, selector, fn )
8052				fn = data;
8053				data = undefined;
8054			} else {
8055
8056				// ( types, data, fn )
8057				fn = data;
8058				data = selector;
8059				selector = undefined;
8060			}
8061		}
8062		if (fn === false) {
8063			fn = returnFalse;
8064		} else if (!fn) {
8065			return elem;
8066		}
8067
8068		if (one === 1) {
8069			origFn = fn;
8070			fn = function (event) {
8071
8072				// Can use an empty set, since event contains the info
8073				jQuery().off(event);
8074				return origFn.apply(this, arguments);
8075			};
8076
8077			// Use same guid so caller can remove using origFn
8078			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
8079		}
8080		return elem.each(function () {
8081			jQuery.event.add(this, types, fn, data, selector);
8082		});
8083	}
8084
8085	/*
8086	 * Helper functions for managing events -- not part of the public interface.
8087	 * Props to Dean Edwards' addEvent library for many of the ideas.
8088	 */
8089	jQuery.event = {
8090
8091		global: {},
8092
8093		add: function (elem, types, handler, data, selector) {
8094
8095			var handleObjIn, eventHandle, tmp,
8096				events, t, handleObj,
8097				special, handlers, type, namespaces, origType,
8098				elemData = dataPriv.get(elem);
8099
8100			// Only attach events to objects that accept data
8101			if (!acceptData(elem)) {
8102				return;
8103			}
8104
8105			// Caller can pass in an object of custom data in lieu of the handler
8106			if (handler.handler) {
8107				handleObjIn = handler;
8108				handler = handleObjIn.handler;
8109				selector = handleObjIn.selector;
8110			}
8111
8112			// Ensure that invalid selectors throw exceptions at attach time
8113			// Evaluate against documentElement in case elem is a non-element node (e.g., document)
8114			if (selector) {
8115				jQuery.find.matchesSelector(documentElement, selector);
8116			}
8117
8118			// Make sure that the handler has a unique ID, used to find/remove it later
8119			if (!handler.guid) {
8120				handler.guid = jQuery.guid++;
8121			}
8122
8123			// Init the element's event structure and main handler, if this is the first
8124			if (!(events = elemData.events)) {
8125				events = elemData.events = Object.create(null);
8126			}
8127			if (!(eventHandle = elemData.handle)) {
8128				eventHandle = elemData.handle = function (e) {
8129
8130					// Discard the second event of a jQuery.event.trigger() and
8131					// when an event is called after a page has unloaded
8132					return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
8133						jQuery.event.dispatch.apply(elem, arguments) : undefined;
8134				};
8135			}
8136
8137			// Handle multiple events separated by a space
8138			types = (types || "").match(rnothtmlwhite) || [""];
8139			t = types.length;
8140			while (t--) {
8141				tmp = rtypenamespace.exec(types[t]) || [];
8142				type = origType = tmp[1];
8143				namespaces = (tmp[2] || "").split(".").sort();
8144
8145				// There *must* be a type, no attaching namespace-only handlers
8146				if (!type) {
8147					continue;
8148				}
8149
8150				// If event changes its type, use the special event handlers for the changed type
8151				special = jQuery.event.special[type] || {};
8152
8153				// If selector defined, determine special event api type, otherwise given type
8154				type = (selector ? special.delegateType : special.bindType) || type;
8155
8156				// Update special based on newly reset type
8157				special = jQuery.event.special[type] || {};
8158
8159				// handleObj is passed to all event handlers
8160				handleObj = jQuery.extend({
8161					type: type,
8162					origType: origType,
8163					data: data,
8164					handler: handler,
8165					guid: handler.guid,
8166					selector: selector,
8167					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
8168					namespace: namespaces.join(".")
8169				}, handleObjIn);
8170
8171				// Init the event handler queue if we're the first
8172				if (!(handlers = events[type])) {
8173					handlers = events[type] = [];
8174					handlers.delegateCount = 0;
8175
8176					// Only use addEventListener if the special events handler returns false
8177					if (!special.setup ||
8178						special.setup.call(elem, data, namespaces, eventHandle) === false) {
8179
8180						if (elem.addEventListener) {
8181							elem.addEventListener(type, eventHandle);
8182						}
8183					}
8184				}
8185
8186				if (special.add) {
8187					special.add.call(elem, handleObj);
8188
8189					if (!handleObj.handler.guid) {
8190						handleObj.handler.guid = handler.guid;
8191					}
8192				}
8193
8194				// Add to the element's handler list, delegates in front
8195				if (selector) {
8196					handlers.splice(handlers.delegateCount++, 0, handleObj);
8197				} else {
8198					handlers.push(handleObj);
8199				}
8200
8201				// Keep track of which events have ever been used, for event optimization
8202				jQuery.event.global[type] = true;
8203			}
8204
8205		},
8206
8207		// Detach an event or set of events from an element
8208		remove: function (elem, types, handler, selector, mappedTypes) {
8209
8210			var j, origCount, tmp,
8211				events, t, handleObj,
8212				special, handlers, type, namespaces, origType,
8213				elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
8214
8215			if (!elemData || !(events = elemData.events)) {
8216				return;
8217			}
8218
vendor: 4,303 bytes, lines 8219-8357
8219			// Once for each type.namespace in types; type may be omitted
8220			types = (types || "").match(rnothtmlwhite) || [""];
8221			t = types.length;
8222			while (t--) {
8223				tmp = rtypenamespace.exec(types[t]) || [];
8224				type = origType = tmp[1];
8225				namespaces = (tmp[2] || "").split(".").sort();
8226
8227				// Unbind all events (on this namespace, if provided) for the element
8228				if (!type) {
8229					for (type in events) {
8230						jQuery.event.remove(elem, type + types[t], handler, selector, true);
8231					}
8232					continue;
8233				}
8234
8235				special = jQuery.event.special[type] || {};
8236				type = (selector ? special.delegateType : special.bindType) || type;
8237				handlers = events[type] || [];
8238				tmp = tmp[2] &&
8239					new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
8240
8241				// Remove matching events
8242				origCount = j = handlers.length;
8243				while (j--) {
8244					handleObj = handlers[j];
8245
8246					if ((mappedTypes || origType === handleObj.origType) &&
8247						(!handler || handler.guid === handleObj.guid) &&
8248						(!tmp || tmp.test(handleObj.namespace)) &&
8249						(!selector || selector === handleObj.selector ||
8250							selector === "**" && handleObj.selector)) {
8251						handlers.splice(j, 1);
8252
8253						if (handleObj.selector) {
8254							handlers.delegateCount--;
8255						}
8256						if (special.remove) {
8257							special.remove.call(elem, handleObj);
8258						}
8259					}
8260				}
8261
8262				// Remove generic event handler if we removed something and no more handlers exist
8263				// (avoids potential for endless recursion during removal of special event handlers)
8264				if (origCount && !handlers.length) {
8265					if (!special.teardown ||
8266						special.teardown.call(elem, namespaces, elemData.handle) === false) {
8267
8268						jQuery.removeEvent(elem, type, elemData.handle);
8269					}
8270
8271					delete events[type];
8272				}
8273			}
8274
8275			// Remove data and the expando if it's no longer used
8276			if (jQuery.isEmptyObject(events)) {
8277				dataPriv.remove(elem, "handle events");
8278			}
8279		},
8280
8281		dispatch: function (nativeEvent) {
8282
8283			var i, j, ret, matched, handleObj, handlerQueue,
8284				args = new Array(arguments.length),
8285
8286				// Make a writable jQuery.Event from the native event object
8287				event = jQuery.event.fix(nativeEvent),
8288
8289				handlers = (
8290					dataPriv.get(this, "events") || Object.create(null)
8291				)[event.type] || [],
8292				special = jQuery.event.special[event.type] || {};
8293
8294			// Use the fix-ed jQuery.Event rather than the (read-only) native event
8295			args[0] = event;
8296
8297			for (i = 1; i < arguments.length; i++) {
8298				args[i] = arguments[i];
8299			}
8300
8301			event.delegateTarget = this;
8302
8303			// Call the preDispatch hook for the mapped type, and let it bail if desired
8304			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
8305				return;
8306			}
8307
8308			// Determine handlers
8309			handlerQueue = jQuery.event.handlers.call(this, event, handlers);
8310
8311			// Run delegates first; they may want to stop propagation beneath us
8312			i = 0;
8313			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
8314				event.currentTarget = matched.elem;
8315
8316				j = 0;
8317				while ((handleObj = matched.handlers[j++]) &&
8318					!event.isImmediatePropagationStopped()) {
8319
8320					// If the event is namespaced, then each handler is only invoked if it is
8321					// specially universal or its namespaces are a superset of the event's.
8322					if (!event.rnamespace || handleObj.namespace === false ||
8323						event.rnamespace.test(handleObj.namespace)) {
8324
8325						event.handleObj = handleObj;
8326						event.data = handleObj.data;
8327
8328						ret = ((jQuery.event.special[handleObj.origType] || {}).handle ||
8329							handleObj.handler).apply(matched.elem, args);
8330
8331						if (ret !== undefined) {
8332							if ((event.result = ret) === false) {
8333								event.preventDefault();
8334								event.stopPropagation();
8335							}
8336						}
8337					}
8338				}
8339			}
8340
8341			// Call the postDispatch hook for the mapped type
8342			if (special.postDispatch) {
8343				special.postDispatch.call(this, event);
8344			}
8345
8346			return event.result;
8347		},
8348
8349		handlers: function (event, handlers) {
8350			var i, handleObj, sel, matchedHandlers, matchedSelectors,
8351				handlerQueue = [],
8352				delegateCount = handlers.delegateCount,
8353				cur = event.target;
8354
8355			// Find delegate handlers
8356			if (delegateCount &&
8357
vendor: 8,353 bytes, lines 8358-8619
8358				// Support: IE <=9
8359				// Black-hole SVG <use> instance trees (trac-13180)
8360				cur.nodeType &&
8361
8362				// Support: Firefox <=42
8363				// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
8364				// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
8365				// Support: IE 11 only
8366				// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
8367				!(event.type === "click" && event.button >= 1)) {
8368
8369				for (; cur !== this; cur = cur.parentNode || this) {
8370
8371					// Don't check non-elements (#13208)
8372					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
8373					if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
8374						matchedHandlers = [];
8375						matchedSelectors = {};
8376						for (i = 0; i < delegateCount; i++) {
8377							handleObj = handlers[i];
8378
8379							// Don't conflict with Object.prototype properties (#13203)
8380							sel = handleObj.selector + " ";
8381
8382							if (matchedSelectors[sel] === undefined) {
8383								matchedSelectors[sel] = handleObj.needsContext ?
8384									jQuery(sel, this).index(cur) > -1 :
8385									jQuery.find(sel, this, null, [cur]).length;
8386							}
8387							if (matchedSelectors[sel]) {
8388								matchedHandlers.push(handleObj);
8389							}
8390						}
8391						if (matchedHandlers.length) {
8392							handlerQueue.push({ elem: cur, handlers: matchedHandlers });
8393						}
8394					}
8395				}
8396			}
8397
8398			// Add the remaining (directly-bound) handlers
8399			cur = this;
8400			if (delegateCount < handlers.length) {
8401				handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) });
8402			}
8403
8404			return handlerQueue;
8405		},
8406
8407		addProp: function (name, hook) {
8408			Object.defineProperty(jQuery.Event.prototype, name, {
8409				enumerable: true,
8410				configurable: true,
8411
8412				get: isFunction(hook) ?
8413					function () {
8414						if (this.originalEvent) {
8415							return hook(this.originalEvent);
8416						}
8417					} :
8418					function () {
8419						if (this.originalEvent) {
8420							return this.originalEvent[name];
8421						}
8422					},
8423
8424				set: function (value) {
8425					Object.defineProperty(this, name, {
8426						enumerable: true,
8427						configurable: true,
8428						writable: true,
8429						value: value
8430					});
8431				}
8432			});
8433		},
8434
8435		fix: function (originalEvent) {
8436			return originalEvent[jQuery.expando] ?
8437				originalEvent :
8438				new jQuery.Event(originalEvent);
8439		},
8440
8441		special: {
8442			load: {
8443
8444				// Prevent triggered image.load events from bubbling to window.load
8445				noBubble: true
8446			},
8447			click: {
8448
8449				// Utilize native event to ensure correct state for checkable inputs
8450				setup: function (data) {
8451
8452					// For mutual compressibility with _default, replace `this` access with a local var.
8453					// `|| data` is dead code meant only to preserve the variable through minification.
8454					var el = this || data;
8455
8456					// Claim the first handler
8457					if (rcheckableType.test(el.type) &&
8458						el.click && nodeName(el, "input")) {
8459
8460						// dataPriv.set( el, "click", ... )
8461						leverageNative(el, "click", returnTrue);
8462					}
8463
8464					// Return false to allow normal processing in the caller
8465					return false;
8466				},
8467				trigger: function (data) {
8468
8469					// For mutual compressibility with _default, replace `this` access with a local var.
8470					// `|| data` is dead code meant only to preserve the variable through minification.
8471					var el = this || data;
8472
8473					// Force setup before triggering a click
8474					if (rcheckableType.test(el.type) &&
8475						el.click && nodeName(el, "input")) {
8476
8477						leverageNative(el, "click");
8478					}
8479
8480					// Return non-false to allow normal event-path propagation
8481					return true;
8482				},
8483
8484				// For cross-browser consistency, suppress native .click() on links
8485				// Also prevent it if we're currently inside a leveraged native-event stack
8486				_default: function (event) {
8487					var target = event.target;
8488					return rcheckableType.test(target.type) &&
8489						target.click && nodeName(target, "input") &&
8490						dataPriv.get(target, "click") ||
8491						nodeName(target, "a");
8492				}
8493			},
8494
8495			beforeunload: {
8496				postDispatch: function (event) {
8497
8498					// Support: Firefox 20+
8499					// Firefox doesn't alert if the returnValue field is not set.
8500					if (event.result !== undefined && event.originalEvent) {
8501						event.originalEvent.returnValue = event.result;
8502					}
8503				}
8504			}
8505		}
8506	};
8507
8508	// Ensure the presence of an event listener that handles manually-triggered
8509	// synthetic events by interrupting progress until reinvoked in response to
8510	// *native* events that it fires directly, ensuring that state changes have
8511	// already occurred before other listeners are invoked.
8512	function leverageNative(el, type, expectSync) {
8513
8514		// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
8515		if (!expectSync) {
8516			if (dataPriv.get(el, type) === undefined) {
8517				jQuery.event.add(el, type, returnTrue);
8518			}
8519			return;
8520		}
8521
8522		// Register the controller as a special universal handler for all event namespaces
8523		dataPriv.set(el, type, false);
8524		jQuery.event.add(el, type, {
8525			namespace: false,
8526			handler: function (event) {
8527				var notAsync, result,
8528					saved = dataPriv.get(this, type);
8529
8530				if ((event.isTrigger & 1) && this[type]) {
8531
8532					// Interrupt processing of the outer synthetic .trigger()ed event
8533					// Saved data should be false in such cases, but might be a leftover capture object
8534					// from an async native handler (gh-4350)
8535					if (!saved.length) {
8536
8537						// Store arguments for use when handling the inner native event
8538						// There will always be at least one argument (an event object), so this array
8539						// will not be confused with a leftover capture object.
8540						saved = slice.call(arguments);
8541						dataPriv.set(this, type, saved);
8542
8543						// Trigger the native event and capture its result
8544						// Support: IE <=9 - 11+
8545						// focus() and blur() are asynchronous
8546						notAsync = expectSync(this, type);
8547						this[type]();
8548						result = dataPriv.get(this, type);
8549						if (saved !== result || notAsync) {
8550							dataPriv.set(this, type, false);
8551						} else {
8552							result = {};
8553						}
8554						if (saved !== result) {
8555
8556							// Cancel the outer synthetic event
8557							event.stopImmediatePropagation();
8558							event.preventDefault();
8559							return result.value;
8560						}
8561
8562						// If this is an inner synthetic event for an event with a bubbling surrogate
8563						// (focus or blur), assume that the surrogate already propagated from triggering the
8564						// native event and prevent that from happening again here.
8565						// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
8566						// bubbling surrogate propagates *after* the non-bubbling base), but that seems
8567						// less bad than duplication.
8568					} else if ((jQuery.event.special[type] || {}).delegateType) {
8569						event.stopPropagation();
8570					}
8571
8572					// If this is a native event triggered above, everything is now in order
8573					// Fire an inner synthetic event with the original arguments
8574				} else if (saved.length) {
8575
8576					// ...and capture the result
8577					dataPriv.set(this, type, {
8578						value: jQuery.event.trigger(
8579
8580							// Support: IE <=9 - 11+
8581							// Extend with the prototype to reset the above stopImmediatePropagation()
8582							jQuery.extend(saved[0], jQuery.Event.prototype),
8583							saved.slice(1),
8584							this
8585						)
8586					});
8587
8588					// Abort handling of the native event
8589					event.stopImmediatePropagation();
8590				}
8591			}
8592		});
8593	}
8594
8595	jQuery.removeEvent = function (elem, type, handle) {
8596
8597		// This "if" is needed for plain objects
8598		if (elem.removeEventListener) {
8599			elem.removeEventListener(type, handle);
8600		}
8601	};
8602
8603	jQuery.Event = function (src, props) {
8604
8605		// Allow instantiation without the 'new' keyword
8606		if (!(this instanceof jQuery.Event)) {
8607			return new jQuery.Event(src, props);
8608		}
8609
8610		// Event object
8611		if (src && src.type) {
8612			this.originalEvent = src;
8613			this.type = src.type;
8614
8615			// Events bubbling up the document may have been marked as prevented
8616			// by a handler lower down the tree; reflect the correct value.
8617			this.isDefaultPrevented = src.defaultPrevented ||
8618				src.defaultPrevented === undefined &&
8619
vendor: 6,117 bytes, lines 8620-8865
8620				// Support: Android <=2.3 only
8621				src.returnValue === false ?
8622				returnTrue :
8623				returnFalse;
8624
8625			// Create target properties
8626			// Support: Safari <=6 - 7 only
8627			// Target should not be a text node (#504, #13143)
8628			this.target = (src.target && src.target.nodeType === 3) ?
8629				src.target.parentNode :
8630				src.target;
8631
8632			this.currentTarget = src.currentTarget;
8633			this.relatedTarget = src.relatedTarget;
8634
8635			// Event type
8636		} else {
8637			this.type = src;
8638		}
8639
8640		// Put explicitly provided properties onto the event object
8641		if (props) {
8642			jQuery.extend(this, props);
8643		}
8644
8645		// Create a timestamp if incoming event doesn't have one
8646		this.timeStamp = src && src.timeStamp || Date.now();
8647
8648		// Mark it as fixed
8649		this[jQuery.expando] = true;
8650	};
8651
8652	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
8653	// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
8654	jQuery.Event.prototype = {
8655		constructor: jQuery.Event,
8656		isDefaultPrevented: returnFalse,
8657		isPropagationStopped: returnFalse,
8658		isImmediatePropagationStopped: returnFalse,
8659		isSimulated: false,
8660
8661		preventDefault: function () {
8662			var e = this.originalEvent;
8663
8664			this.isDefaultPrevented = returnTrue;
8665
8666			if (e && !this.isSimulated) {
8667				e.preventDefault();
8668			}
8669		},
8670		stopPropagation: function () {
8671			var e = this.originalEvent;
8672
8673			this.isPropagationStopped = returnTrue;
8674
8675			if (e && !this.isSimulated) {
8676				e.stopPropagation();
8677			}
8678		},
8679		stopImmediatePropagation: function () {
8680			var e = this.originalEvent;
8681
8682			this.isImmediatePropagationStopped = returnTrue;
8683
8684			if (e && !this.isSimulated) {
8685				e.stopImmediatePropagation();
8686			}
8687
8688			this.stopPropagation();
8689		}
8690	};
8691
8692	// Includes all common event props including KeyEvent and MouseEvent specific props
8693	jQuery.each({
8694		altKey: true,
8695		bubbles: true,
8696		cancelable: true,
8697		changedTouches: true,
8698		ctrlKey: true,
8699		detail: true,
8700		eventPhase: true,
8701		metaKey: true,
8702		pageX: true,
8703		pageY: true,
8704		shiftKey: true,
8705		view: true,
8706		"char": true,
8707		code: true,
8708		charCode: true,
8709		key: true,
8710		keyCode: true,
8711		button: true,
8712		buttons: true,
8713		clientX: true,
8714		clientY: true,
8715		offsetX: true,
8716		offsetY: true,
8717		pointerId: true,
8718		pointerType: true,
8719		screenX: true,
8720		screenY: true,
8721		targetTouches: true,
8722		toElement: true,
8723		touches: true,
8724
8725		which: function (event) {
8726			var button = event.button;
8727
8728			// Add which for key events
8729			if (event.which == null && rkeyEvent.test(event.type)) {
8730				return event.charCode != null ? event.charCode : event.keyCode;
8731			}
8732
8733			// Add which for click: 1 === left; 2 === middle; 3 === right
8734			if (!event.which && button !== undefined && rmouseEvent.test(event.type)) {
8735				if (button & 1) {
8736					return 1;
8737				}
8738
8739				if (button & 2) {
8740					return 3;
8741				}
8742
8743				if (button & 4) {
8744					return 2;
8745				}
8746
8747				return 0;
8748			}
8749
8750			return event.which;
8751		}
8752	}, jQuery.event.addProp);
8753
8754	jQuery.each({ focus: "focusin", blur: "focusout" }, function (type, delegateType) {
8755		jQuery.event.special[type] = {
8756
8757			// Utilize native event if possible so blur/focus sequence is correct
8758			setup: function () {
8759
8760				// Claim the first handler
8761				// dataPriv.set( this, "focus", ... )
8762				// dataPriv.set( this, "blur", ... )
8763				leverageNative(this, type, expectSync);
8764
8765				// Return false to allow normal processing in the caller
8766				return false;
8767			},
8768			trigger: function () {
8769
8770				// Force setup before trigger
8771				leverageNative(this, type);
8772
8773				// Return non-false to allow normal event-path propagation
8774				return true;
8775			},
8776
8777			delegateType: delegateType
8778		};
8779	});
8780
8781	// Create mouseenter/leave events using mouseover/out and event-time checks
8782	// so that event delegation works in jQuery.
8783	// Do the same for pointerenter/pointerleave and pointerover/pointerout
8784	//
8785	// Support: Safari 7 only
8786	// Safari sends mouseenter too often; see:
8787	// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
8788	// for the description of the bug (it existed in older Chrome versions as well).
8789	jQuery.each({
8790		mouseenter: "mouseover",
8791		mouseleave: "mouseout",
8792		pointerenter: "pointerover",
8793		pointerleave: "pointerout"
8794	}, function (orig, fix) {
8795		jQuery.event.special[orig] = {
8796			delegateType: fix,
8797			bindType: fix,
8798
8799			handle: function (event) {
8800				var ret,
8801					target = this,
8802					related = event.relatedTarget,
8803					handleObj = event.handleObj;
8804
8805				// For mouseenter/leave call the handler if related is outside the target.
8806				// NB: No relatedTarget if the mouse left/entered the browser window
8807				if (!related || (related !== target && !jQuery.contains(target, related))) {
8808					event.type = handleObj.origType;
8809					ret = handleObj.handler.apply(this, arguments);
8810					event.type = fix;
8811				}
8812				return ret;
8813			}
8814		};
8815	});
8816
8817	jQuery.fn.extend({
8818
8819		on: function (types, selector, data, fn) {
8820			return on(this, types, selector, data, fn);
8821		},
8822		one: function (types, selector, data, fn) {
8823			return on(this, types, selector, data, fn, 1);
8824		},
8825		off: function (types, selector, fn) {
8826			var handleObj, type;
8827			if (types && types.preventDefault && types.handleObj) {
8828
8829				// ( event )  dispatched jQuery.Event
8830				handleObj = types.handleObj;
8831				jQuery(types.delegateTarget).off(
8832					handleObj.namespace ?
8833						handleObj.origType + "." + handleObj.namespace :
8834						handleObj.origType,
8835					handleObj.selector,
8836					handleObj.handler
8837				);
8838				return this;
8839			}
8840			if (typeof types === "object") {
8841
8842				// ( types-object [, selector] )
8843				for (type in types) {
8844					this.off(type, selector, types[type]);
8845				}
8846				return this;
8847			}
8848			if (selector === false || typeof selector === "function") {
8849
8850				// ( types [, fn] )
8851				fn = selector;
8852				selector = undefined;
8853			}
8854			if (fn === false) {
8855				fn = returnFalse;
8856			}
8857			return this.each(function () {
8858				jQuery.event.remove(this, types, fn, selector);
8859			});
8860		}
8861	});
8862
8863
8864	var
8865
vendor: 10,179 bytes, lines 8866-9235
8866		// Support: IE <=10 - 11, Edge 12 - 13 only
8867		// In IE/Edge using regex groups here causes severe slowdowns.
8868		// See https://connect.microsoft.com/IE/feedback/details/1736512/
8869		rnoInnerhtml = /<script|<style|<link/i,
8870
8871		// checked="checked" or checked
8872		rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
8873		rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
8874
8875	// Prefer a tbody over its parent table for containing new rows
8876	function manipulationTarget(elem, content) {
8877		if (nodeName(elem, "table") &&
8878			nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
8879
8880			return jQuery(elem).children("tbody")[0] || elem;
8881		}
8882
8883		return elem;
8884	}
8885
8886	// Replace/restore the type attribute of script elements for safe DOM manipulation
8887	function disableScript(elem) {
8888		elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
8889		return elem;
8890	}
8891	function restoreScript(elem) {
8892		if ((elem.type || "").slice(0, 5) === "true/") {
8893			elem.type = elem.type.slice(5);
8894		} else {
8895			elem.removeAttribute("type");
8896		}
8897
8898		return elem;
8899	}
8900
8901	function cloneCopyEvent(src, dest) {
8902		var i, l, type, pdataOld, udataOld, udataCur, events;
8903
8904		if (dest.nodeType !== 1) {
8905			return;
8906		}
8907
8908		// 1. Copy private data: events, handlers, etc.
8909		if (dataPriv.hasData(src)) {
8910			pdataOld = dataPriv.get(src);
8911			events = pdataOld.events;
8912
8913			if (events) {
8914				dataPriv.remove(dest, "handle events");
8915
8916				for (type in events) {
8917					for (i = 0, l = events[type].length; i < l; i++) {
8918						jQuery.event.add(dest, type, events[type][i]);
8919					}
8920				}
8921			}
8922		}
8923
8924		// 2. Copy user data
8925		if (dataUser.hasData(src)) {
8926			udataOld = dataUser.access(src);
8927			udataCur = jQuery.extend({}, udataOld);
8928
8929			dataUser.set(dest, udataCur);
8930		}
8931	}
8932
8933	// Fix IE bugs, see support tests
8934	function fixInput(src, dest) {
8935		var nodeName = dest.nodeName.toLowerCase();
8936
8937		// Fails to persist the checked state of a cloned checkbox or radio button.
8938		if (nodeName === "input" && rcheckableType.test(src.type)) {
8939			dest.checked = src.checked;
8940
8941			// Fails to return the selected option to the default selected state when cloning options
8942		} else if (nodeName === "input" || nodeName === "textarea") {
8943			dest.defaultValue = src.defaultValue;
8944		}
8945	}
8946
8947	function domManip(collection, args, callback, ignored) {
8948
8949		// Flatten any nested arrays
8950		args = flat(args);
8951
8952		var fragment, first, scripts, hasScripts, node, doc,
8953			i = 0,
8954			l = collection.length,
8955			iNoClone = l - 1,
8956			value = args[0],
8957			valueIsFunction = isFunction(value);
8958
8959		// We can't cloneNode fragments that contain checked, in WebKit
8960		if (valueIsFunction ||
8961			(l > 1 && typeof value === "string" &&
8962				!support.checkClone && rchecked.test(value))) {
8963			return collection.each(function (index) {
8964				var self = collection.eq(index);
8965				if (valueIsFunction) {
8966					args[0] = value.call(this, index, self.html());
8967				}
8968				domManip(self, args, callback, ignored);
8969			});
8970		}
8971
8972		if (l) {
8973			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
8974			first = fragment.firstChild;
8975
8976			if (fragment.childNodes.length === 1) {
8977				fragment = first;
8978			}
8979
8980			// Require either new content or an interest in ignored elements to invoke the callback
8981			if (first || ignored) {
8982				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
8983				hasScripts = scripts.length;
8984
8985				// Use the original fragment for the last item
8986				// instead of the first because it can end up
8987				// being emptied incorrectly in certain situations (#8070).
8988				for (; i < l; i++) {
8989					node = fragment;
8990
8991					if (i !== iNoClone) {
8992						node = jQuery.clone(node, true, true);
8993
8994						// Keep references to cloned scripts for later restoration
8995						if (hasScripts) {
8996
8997							// Support: Android <=4.0 only, PhantomJS 1 only
8998							// push.apply(_, arraylike) throws on ancient WebKit
8999							jQuery.merge(scripts, getAll(node, "script"));
9000						}
9001					}
9002
9003					callback.call(collection[i], node, i);
9004				}
9005
9006				if (hasScripts) {
9007					doc = scripts[scripts.length - 1].ownerDocument;
9008
9009					// Reenable scripts
9010					jQuery.map(scripts, restoreScript);
9011
9012					// Evaluate executable scripts on first document insertion
9013					for (i = 0; i < hasScripts; i++) {
9014						node = scripts[i];
9015						if (rscriptType.test(node.type || "") &&
9016							!dataPriv.access(node, "globalEval") &&
9017							jQuery.contains(doc, node)) {
9018
9019							if (node.src && (node.type || "").toLowerCase() !== "module") {
9020
9021								// Optional AJAX dependency, but won't run scripts if not present
9022								if (jQuery._evalUrl && !node.noModule) {
9023									jQuery._evalUrl(node.src, {
9024										nonce: node.nonce || node.getAttribute("nonce")
9025									}, doc);
9026								}
9027							} else {
9028								DOMEval(node.textContent.replace(rcleanScript, ""), node, doc);
9029							}
9030						}
9031					}
9032				}
9033			}
9034		}
9035
9036		return collection;
9037	}
9038
9039	function remove(elem, selector, keepData) {
9040		var node,
9041			nodes = selector ? jQuery.filter(selector, elem) : elem,
9042			i = 0;
9043
9044		for (; (node = nodes[i]) != null; i++) {
9045			if (!keepData && node.nodeType === 1) {
9046				jQuery.cleanData(getAll(node));
9047			}
9048
9049			if (node.parentNode) {
9050				if (keepData && isAttached(node)) {
9051					setGlobalEval(getAll(node, "script"));
9052				}
9053				node.parentNode.removeChild(node);
9054			}
9055		}
9056
9057		return elem;
9058	}
9059
9060	jQuery.extend({
9061		htmlPrefilter: function (html) {
9062			return html;
9063		},
9064
9065		clone: function (elem, dataAndEvents, deepDataAndEvents) {
9066			var i, l, srcElements, destElements,
9067				clone = elem.cloneNode(true),
9068				inPage = isAttached(elem);
9069
9070			// Fix IE cloning issues
9071			if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) &&
9072				!jQuery.isXMLDoc(elem)) {
9073
9074				// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
9075				destElements = getAll(clone);
9076				srcElements = getAll(elem);
9077
9078				for (i = 0, l = srcElements.length; i < l; i++) {
9079					fixInput(srcElements[i], destElements[i]);
9080				}
9081			}
9082
9083			// Copy the events from the original to the clone
9084			if (dataAndEvents) {
9085				if (deepDataAndEvents) {
9086					srcElements = srcElements || getAll(elem);
9087					destElements = destElements || getAll(clone);
9088
9089					for (i = 0, l = srcElements.length; i < l; i++) {
9090						cloneCopyEvent(srcElements[i], destElements[i]);
9091					}
9092				} else {
9093					cloneCopyEvent(elem, clone);
9094				}
9095			}
9096
9097			// Preserve script evaluation history
9098			destElements = getAll(clone, "script");
9099			if (destElements.length > 0) {
9100				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
9101			}
9102
9103			// Return the cloned set
9104			return clone;
9105		},
9106
9107		cleanData: function (elems) {
9108			var data, elem, type,
9109				special = jQuery.event.special,
9110				i = 0;
9111
9112			for (; (elem = elems[i]) !== undefined; i++) {
9113				if (acceptData(elem)) {
9114					if ((data = elem[dataPriv.expando])) {
9115						if (data.events) {
9116							for (type in data.events) {
9117								if (special[type]) {
9118									jQuery.event.remove(elem, type);
9119
9120									// This is a shortcut to avoid jQuery.event.remove's overhead
9121								} else {
9122									jQuery.removeEvent(elem, type, data.handle);
9123								}
9124							}
9125						}
9126
9127						// Support: Chrome <=35 - 45+
9128						// Assign undefined instead of using delete, see Data#remove
9129						elem[dataPriv.expando] = undefined;
9130					}
9131					if (elem[dataUser.expando]) {
9132
9133						// Support: Chrome <=35 - 45+
9134						// Assign undefined instead of using delete, see Data#remove
9135						elem[dataUser.expando] = undefined;
9136					}
9137				}
9138			}
9139		}
9140	});
9141
9142	jQuery.fn.extend({
9143		detach: function (selector) {
9144			return remove(this, selector, true);
9145		},
9146
9147		remove: function (selector) {
9148			return remove(this, selector);
9149		},
9150
9151		text: function (value) {
9152			return access(this, function (value) {
9153				return value === undefined ?
9154					jQuery.text(this) :
9155					this.empty().each(function () {
9156						if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
9157							this.textContent = value;
9158						}
9159					});
9160			}, null, value, arguments.length);
9161		},
9162
9163		append: function () {
9164			return domManip(this, arguments, function (elem) {
9165				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
9166					var target = manipulationTarget(this, elem);
9167					target.appendChild(elem);
9168				}
9169			});
9170		},
9171
9172		prepend: function () {
9173			return domManip(this, arguments, function (elem) {
9174				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
9175					var target = manipulationTarget(this, elem);
9176					target.insertBefore(elem, target.firstChild);
9177				}
9178			});
9179		},
9180
9181		before: function () {
9182			return domManip(this, arguments, function (elem) {
9183				if (this.parentNode) {
9184					this.parentNode.insertBefore(elem, this);
9185				}
9186			});
9187		},
9188
9189		after: function () {
9190			return domManip(this, arguments, function (elem) {
9191				if (this.parentNode) {
9192					this.parentNode.insertBefore(elem, this.nextSibling);
9193				}
9194			});
9195		},
9196
9197		empty: function () {
9198			var elem,
9199				i = 0;
9200
9201			for (; (elem = this[i]) != null; i++) {
9202				if (elem.nodeType === 1) {
9203
9204					// Prevent memory leaks
9205					jQuery.cleanData(getAll(elem, false));
9206
9207					// Remove any remaining nodes
9208					elem.textContent = "";
9209				}
9210			}
9211
9212			return this;
9213		},
9214
9215		clone: function (dataAndEvents, deepDataAndEvents) {
9216			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
9217			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
9218
9219			return this.map(function () {
9220				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
9221			});
9222		},
9223
9224		html: function (value) {
9225			return access(this, function (value) {
9226				var elem = this[0] || {},
9227					i = 0,
9228					l = this.length;
9229
9230				if (value === undefined && elem.nodeType === 1) {
9231					return elem.innerHTML;
9232				}
9233
9234				// See if we can take a shortcut and just use innerHTML
9235				if (typeof value === "string" && !rnoInnerhtml.test(value) &&
vendor: 13,006 bytes, lines 9236-9684
9236					!wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
9237
9238					value = jQuery.htmlPrefilter(value);
9239
9240					try {
9241						for (; i < l; i++) {
9242							elem = this[i] || {};
9243
9244							// Remove element nodes and prevent memory leaks
9245							if (elem.nodeType === 1) {
9246								jQuery.cleanData(getAll(elem, false));
9247								elem.innerHTML = value;
9248							}
9249						}
9250
9251						elem = 0;
9252
9253						// If using innerHTML throws an exception, use the fallback method
9254					} catch (e) { }
9255				}
9256
9257				if (elem) {
9258					this.empty().append(value);
9259				}
9260			}, null, value, arguments.length);
9261		},
9262
9263		replaceWith: function () {
9264			var ignored = [];
9265
9266			// Make the changes, replacing each non-ignored context element with the new content
9267			return domManip(this, arguments, function (elem) {
9268				var parent = this.parentNode;
9269
9270				if (jQuery.inArray(this, ignored) < 0) {
9271					jQuery.cleanData(getAll(this));
9272					if (parent) {
9273						parent.replaceChild(elem, this);
9274					}
9275				}
9276
9277				// Force callback invocation
9278			}, ignored);
9279		}
9280	});
9281
9282	jQuery.each({
9283		appendTo: "append",
9284		prependTo: "prepend",
9285		insertBefore: "before",
9286		insertAfter: "after",
9287		replaceAll: "replaceWith"
9288	}, function (name, original) {
9289		jQuery.fn[name] = function (selector) {
9290			var elems,
9291				ret = [],
9292				insert = jQuery(selector),
9293				last = insert.length - 1,
9294				i = 0;
9295
9296			for (; i <= last; i++) {
9297				elems = i === last ? this : this.clone(true);
9298				jQuery(insert[i])[original](elems);
9299
9300				// Support: Android <=4.0 only, PhantomJS 1 only
9301				// .get() because push.apply(_, arraylike) throws on ancient WebKit
9302				push.apply(ret, elems.get());
9303			}
9304
9305			return this.pushStack(ret);
9306		};
9307	});
9308	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
9309
9310	var getStyles = function (elem) {
9311
9312		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
9313		// IE throws on elements created in popups
9314		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
9315		var view = elem.ownerDocument.defaultView;
9316
9317		if (!view || !view.opener) {
9318			view = window;
9319		}
9320
9321		return view.getComputedStyle(elem);
9322	};
9323
9324	var swap = function (elem, options, callback) {
9325		var ret, name,
9326			old = {};
9327
9328		// Remember the old values, and insert the new ones
9329		for (name in options) {
9330			old[name] = elem.style[name];
9331			elem.style[name] = options[name];
9332		}
9333
9334		ret = callback.call(elem);
9335
9336		// Revert the old values
9337		for (name in options) {
9338			elem.style[name] = old[name];
9339		}
9340
9341		return ret;
9342	};
9343
9344
9345	var rboxStyle = new RegExp(cssExpand.join("|"), "i");
9346
9347
9348
9349	(function () {
9350
9351		// Executing both pixelPosition & boxSizingReliable tests require only one layout
9352		// so they're executed at the same time to save the second computation.
9353		function computeStyleTests() {
9354
9355			// This is a singleton, we need to execute it only once
9356			if (!div) {
9357				return;
9358			}
9359
9360			container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
9361				"margin-top:1px;padding:0;border:0";
9362			div.style.cssText =
9363				"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
9364				"margin:auto;border:1px;padding:1px;" +
9365				"width:60%;top:1%";
9366			documentElement.appendChild(container).appendChild(div);
9367
9368			var divStyle = window.getComputedStyle(div);
9369			pixelPositionVal = divStyle.top !== "1%";
9370
9371			// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
9372			reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
9373
9374			// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
9375			// Some styles come back with percentage values, even though they shouldn't
9376			div.style.right = "60%";
9377			pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
9378
9379			// Support: IE 9 - 11 only
9380			// Detect misreporting of content dimensions for box-sizing:border-box elements
9381			boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
9382
9383			// Support: IE 9 only
9384			// Detect overflow:scroll screwiness (gh-3699)
9385			// Support: Chrome <=64
9386			// Don't get tricked when zoom affects offsetWidth (gh-4029)
9387			div.style.position = "absolute";
9388			scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;
9389
9390			documentElement.removeChild(container);
9391
9392			// Nullify the div so it wouldn't be stored in the memory and
9393			// it will also be a sign that checks already performed
9394			div = null;
9395		}
9396
9397		function roundPixelMeasures(measure) {
9398			return Math.round(parseFloat(measure));
9399		}
9400
9401		var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
9402			reliableTrDimensionsVal, reliableMarginLeftVal,
9403			container = document.createElement("div"),
9404			div = document.createElement("div");
9405
9406		// Finish early in limited (non-browser) environments
9407		if (!div.style) {
9408			return;
9409		}
9410
9411		// Support: IE <=9 - 11 only
9412		// Style of cloned element affects source element cloned (#8908)
9413		div.style.backgroundClip = "content-box";
9414		div.cloneNode(true).style.backgroundClip = "";
9415		support.clearCloneStyle = div.style.backgroundClip === "content-box";
9416
9417		jQuery.extend(support, {
9418			boxSizingReliable: function () {
9419				computeStyleTests();
9420				return boxSizingReliableVal;
9421			},
9422			pixelBoxStyles: function () {
9423				computeStyleTests();
9424				return pixelBoxStylesVal;
9425			},
9426			pixelPosition: function () {
9427				computeStyleTests();
9428				return pixelPositionVal;
9429			},
9430			reliableMarginLeft: function () {
9431				computeStyleTests();
9432				return reliableMarginLeftVal;
9433			},
9434			scrollboxSize: function () {
9435				computeStyleTests();
9436				return scrollboxSizeVal;
9437			},
9438
9439			// Support: IE 9 - 11+, Edge 15 - 18+
9440			// IE/Edge misreport `getComputedStyle` of table rows with width/height
9441			// set in CSS while `offset*` properties report correct values.
9442			// Behavior in IE 9 is more subtle than in newer versions & it passes
9443			// some versions of this test; make sure not to make it pass there!
9444			reliableTrDimensions: function () {
9445				var table, tr, trChild, trStyle;
9446				if (reliableTrDimensionsVal == null) {
9447					table = document.createElement("table");
9448					tr = document.createElement("tr");
9449					trChild = document.createElement("div");
9450
9451					table.style.cssText = "position:absolute;left:-11111px";
9452					tr.style.height = "1px";
9453					trChild.style.height = "9px";
9454
9455					documentElement
9456						.appendChild(table)
9457						.appendChild(tr)
9458						.appendChild(trChild);
9459
9460					trStyle = window.getComputedStyle(tr);
9461					reliableTrDimensionsVal = parseInt(trStyle.height) > 3;
9462
9463					documentElement.removeChild(table);
9464				}
9465				return reliableTrDimensionsVal;
9466			}
9467		});
9468	})();
9469
9470
9471	function curCSS(elem, name, computed) {
9472		var width, minWidth, maxWidth, ret,
9473
9474			// Support: Firefox 51+
9475			// Retrieving style before computed somehow
9476			// fixes an issue with getting wrong values
9477			// on detached elements
9478			style = elem.style;
9479
9480		computed = computed || getStyles(elem);
9481
9482		// getPropertyValue is needed for:
9483		//   .css('filter') (IE 9 only, #12537)
9484		//   .css('--customProperty) (#3144)
9485		if (computed) {
9486			ret = computed.getPropertyValue(name) || computed[name];
9487
9488			if (ret === "" && !isAttached(elem)) {
9489				ret = jQuery.style(elem, name);
9490			}
9491
9492			// A tribute to the "awesome hack by Dean Edwards"
9493			// Android Browser returns percentage for some values,
9494			// but width seems to be reliably pixels.
9495			// This is against the CSSOM draft spec:
9496			// https://drafts.csswg.org/cssom/#resolved-values
9497			if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
9498
9499				// Remember the original values
9500				width = style.width;
9501				minWidth = style.minWidth;
9502				maxWidth = style.maxWidth;
9503
9504				// Put in the new values to get a computed value out
9505				style.minWidth = style.maxWidth = style.width = ret;
9506				ret = computed.width;
9507
9508				// Revert the changed values
9509				style.width = width;
9510				style.minWidth = minWidth;
9511				style.maxWidth = maxWidth;
9512			}
9513		}
9514
9515		return ret !== undefined ?
9516
9517			// Support: IE <=9 - 11 only
9518			// IE returns zIndex value as an integer.
9519			ret + "" :
9520			ret;
9521	}
9522
9523
9524	function addGetHookIf(conditionFn, hookFn) {
9525
9526		// Define the hook, we'll check on the first run if it's really needed.
9527		return {
9528			get: function () {
9529				if (conditionFn()) {
9530
9531					// Hook not needed (or it's not possible to use it due
9532					// to missing dependency), remove it.
9533					delete this.get;
9534					return;
9535				}
9536
9537				// Hook needed; redefine it so that the support test is not executed again.
9538				return (this.get = hookFn).apply(this, arguments);
9539			}
9540		};
9541	}
9542
9543
9544	var cssPrefixes = ["Webkit", "Moz", "ms"],
9545		emptyStyle = document.createElement("div").style,
9546		vendorProps = {};
9547
9548	// Return a vendor-prefixed property or undefined
9549	function vendorPropName(name) {
9550
9551		// Check for vendor prefixed names
9552		var capName = name[0].toUpperCase() + name.slice(1),
9553			i = cssPrefixes.length;
9554
9555		while (i--) {
9556			name = cssPrefixes[i] + capName;
9557			if (name in emptyStyle) {
9558				return name;
9559			}
9560		}
9561	}
9562
9563	// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
9564	function finalPropName(name) {
9565		var final = jQuery.cssProps[name] || vendorProps[name];
9566
9567		if (final) {
9568			return final;
9569		}
9570		if (name in emptyStyle) {
9571			return name;
9572		}
9573		return vendorProps[name] = vendorPropName(name) || name;
9574	}
9575
9576
9577	var
9578
9579		// Swappable if display is none or starts with table
9580		// except "table", "table-cell", or "table-caption"
9581		// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
9582		rdisplayswap = /^(none|table(?!-c[ea]).+)/,
9583		rcustomProp = /^--/,
9584		cssShow = { position: "absolute", visibility: "hidden", display: "block" },
9585		cssNormalTransform = {
9586			letterSpacing: "0",
9587			fontWeight: "400"
9588		};
9589
9590	function setPositiveNumber(_elem, value, subtract) {
9591
9592		// Any relative (+/-) values have already been
9593		// normalized at this point
9594		var matches = rcssNum.exec(value);
9595		return matches ?
9596
9597			// Guard against undefined "subtract", e.g., when used as in cssHooks
9598			Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") :
9599			value;
9600	}
9601
9602	function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
9603		var i = dimension === "width" ? 1 : 0,
9604			extra = 0,
9605			delta = 0;
9606
9607		// Adjustment may not be necessary
9608		if (box === (isBorderBox ? "border" : "content")) {
9609			return 0;
9610		}
9611
9612		for (; i < 4; i += 2) {
9613
9614			// Both box models exclude margin
9615			if (box === "margin") {
9616				delta += jQuery.css(elem, box + cssExpand[i], true, styles);
9617			}
9618
9619			// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
9620			if (!isBorderBox) {
9621
9622				// Add padding
9623				delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
9624
9625				// For "border" or "margin", add border
9626				if (box !== "padding") {
9627					delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
9628
9629					// But still keep track of it otherwise
9630				} else {
9631					extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
9632				}
9633
9634				// If we get here with a border-box (content + padding + border), we're seeking "content" or
9635				// "padding" or "margin"
9636			} else {
9637
9638				// For "content", subtract padding
9639				if (box === "content") {
9640					delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
9641				}
9642
9643				// For "content" or "padding", subtract border
9644				if (box !== "margin") {
9645					delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
9646				}
9647			}
9648		}
9649
9650		// Account for positive content-box scroll gutter when requested by providing computedVal
9651		if (!isBorderBox && computedVal >= 0) {
9652
9653			// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
9654			// Assuming integer scroll gutter, subtract the rest and round down
9655			delta += Math.max(0, Math.ceil(
9656				elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] -
9657				computedVal -
9658				delta -
9659				extra -
9660				0.5
9661
9662				// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
9663				// Use an explicit zero to avoid NaN (gh-3964)
9664			)) || 0;
9665		}
9666
9667		return delta;
9668	}
9669
9670	function getWidthOrHeight(elem, dimension, extra) {
9671
9672		// Start with computed style
9673		var styles = getStyles(elem),
9674
9675			// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
9676			// Fake content-box until we know it's needed to know the true value.
9677			boxSizingNeeded = !support.boxSizingReliable() || extra,
9678			isBorderBox = boxSizingNeeded &&
9679				jQuery.css(elem, "boxSizing", false, styles) === "border-box",
9680			valueIsBorderBox = isBorderBox,
9681
9682			val = curCSS(elem, dimension, styles),
9683			offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
9684
vendor: 7,012 bytes, lines 9685-9915
9685		// Support: Firefox <=54
9686		// Return a confounding non-pixel value or feign ignorance, as appropriate.
9687		if (rnumnonpx.test(val)) {
9688			if (!extra) {
9689				return val;
9690			}
9691			val = "auto";
9692		}
9693
9694
9695		// Support: IE 9 - 11 only
9696		// Use offsetWidth/offsetHeight for when box sizing is unreliable.
9697		// In those cases, the computed value can be trusted to be border-box.
9698		if ((!support.boxSizingReliable() && isBorderBox ||
9699
9700			// Support: IE 10 - 11+, Edge 15 - 18+
9701			// IE/Edge misreport `getComputedStyle` of table rows with width/height
9702			// set in CSS while `offset*` properties report correct values.
9703			// Interestingly, in some cases IE 9 doesn't suffer from this issue.
9704			!support.reliableTrDimensions() && nodeName(elem, "tr") ||
9705
9706			// Fall back to offsetWidth/offsetHeight when value is "auto"
9707			// This happens for inline elements with no explicit setting (gh-3571)
9708			val === "auto" ||
9709
9710			// Support: Android <=4.1 - 4.3 only
9711			// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
9712			!parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") &&
9713
9714			// Make sure the element is visible & connected
9715			elem.getClientRects().length) {
9716
9717			isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";
9718
9719			// Where available, offsetWidth/offsetHeight approximate border box dimensions.
9720			// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
9721			// retrieved value as a content box dimension.
9722			valueIsBorderBox = offsetProp in elem;
9723			if (valueIsBorderBox) {
9724				val = elem[offsetProp];
9725			}
9726		}
9727
9728		// Normalize "" and auto
9729		val = parseFloat(val) || 0;
9730
9731		// Adjust for the element's box model
9732		return (val +
9733			boxModelAdjustment(
9734				elem,
9735				dimension,
9736				extra || (isBorderBox ? "border" : "content"),
9737				valueIsBorderBox,
9738				styles,
9739
9740				// Provide the current computed size to request scroll gutter calculation (gh-3589)
9741				val
9742			)
9743		) + "px";
9744	}
9745
9746	jQuery.extend({
9747
9748		// Add in style property hooks for overriding the default
9749		// behavior of getting and setting a style property
9750		cssHooks: {
9751			opacity: {
9752				get: function (elem, computed) {
9753					if (computed) {
9754
9755						// We should always get a number back from opacity
9756						var ret = curCSS(elem, "opacity");
9757						return ret === "" ? "1" : ret;
9758					}
9759				}
9760			}
9761		},
9762
9763		// Don't automatically add "px" to these possibly-unitless properties
9764		cssNumber: {
9765			"animationIterationCount": true,
9766			"columnCount": true,
9767			"fillOpacity": true,
9768			"flexGrow": true,
9769			"flexShrink": true,
9770			"fontWeight": true,
9771			"gridArea": true,
9772			"gridColumn": true,
9773			"gridColumnEnd": true,
9774			"gridColumnStart": true,
9775			"gridRow": true,
9776			"gridRowEnd": true,
9777			"gridRowStart": true,
9778			"lineHeight": true,
9779			"opacity": true,
9780			"order": true,
9781			"orphans": true,
9782			"widows": true,
9783			"zIndex": true,
9784			"zoom": true
9785		},
9786
9787		// Add in properties whose names you wish to fix before
9788		// setting or getting the value
9789		cssProps: {},
9790
9791		// Get and set the style property on a DOM Node
9792		style: function (elem, name, value, extra) {
9793
9794			// Don't set styles on text and comment nodes
9795			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
9796				return;
9797			}
9798
9799			// Make sure that we're working with the right name
9800			var ret, type, hooks,
9801				origName = camelCase(name),
9802				isCustomProp = rcustomProp.test(name),
9803				style = elem.style;
9804
9805			// Make sure that we're working with the right name. We don't
9806			// want to query the value if it is a CSS custom property
9807			// since they are user-defined.
9808			if (!isCustomProp) {
9809				name = finalPropName(origName);
9810			}
9811
9812			// Gets hook for the prefixed version, then unprefixed version
9813			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
9814
9815			// Check if we're setting a value
9816			if (value !== undefined) {
9817				type = typeof value;
9818
9819				// Convert "+=" or "-=" to relative numbers (#7345)
9820				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
9821					value = adjustCSS(elem, name, ret);
9822
9823					// Fixes bug #9237
9824					type = "number";
9825				}
9826
9827				// Make sure that null and NaN values aren't set (#7116)
9828				if (value == null || value !== value) {
9829					return;
9830				}
9831
9832				// If a number was passed in, add the unit (except for certain CSS properties)
9833				// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
9834				// "px" to a few hardcoded values.
9835				if (type === "number" && !isCustomProp) {
9836					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
9837				}
9838
9839				// background-* props affect original clone's values
9840				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
9841					style[name] = "inherit";
9842				}
9843
9844				// If a hook was provided, use that value, otherwise just set the specified value
9845				if (!hooks || !("set" in hooks) ||
9846					(value = hooks.set(elem, value, extra)) !== undefined) {
9847
9848					if (isCustomProp) {
9849						style.setProperty(name, value);
9850					} else {
9851						style[name] = value;
9852					}
9853				}
9854
9855			} else {
9856
9857				// If a hook was provided get the non-computed value from there
9858				if (hooks && "get" in hooks &&
9859					(ret = hooks.get(elem, false, extra)) !== undefined) {
9860
9861					return ret;
9862				}
9863
9864				// Otherwise just get the value from the style object
9865				return style[name];
9866			}
9867		},
9868
9869		css: function (elem, name, extra, styles) {
9870			var val, num, hooks,
9871				origName = camelCase(name),
9872				isCustomProp = rcustomProp.test(name);
9873
9874			// Make sure that we're working with the right name. We don't
9875			// want to modify the value if it is a CSS custom property
9876			// since they are user-defined.
9877			if (!isCustomProp) {
9878				name = finalPropName(origName);
9879			}
9880
9881			// Try prefixed name followed by the unprefixed name
9882			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
9883
9884			// If a hook was provided get the computed value from there
9885			if (hooks && "get" in hooks) {
9886				val = hooks.get(elem, true, extra);
9887			}
9888
9889			// Otherwise, if a way to get the computed value exists, use that
9890			if (val === undefined) {
9891				val = curCSS(elem, name, styles);
9892			}
9893
9894			// Convert "normal" to computed value
9895			if (val === "normal" && name in cssNormalTransform) {
9896				val = cssNormalTransform[name];
9897			}
9898
9899			// Make numeric if forced or a qualifier was provided and val looks numeric
9900			if (extra === "" || extra) {
9901				num = parseFloat(val);
9902				return extra === true || isFinite(num) ? num || 0 : val;
9903			}
9904
9905			return val;
9906		}
9907	});
9908
9909	jQuery.each(["height", "width"], function (_i, dimension) {
9910		jQuery.cssHooks[dimension] = {
9911			get: function (elem, computed, extra) {
9912				if (computed) {
9913
9914					// Certain elements can have dimension info if we invisibly show them
9915					// but it must have a current display style that would benefit
vendor: 10,269 bytes, lines 9916-10289
9916					return rdisplayswap.test(jQuery.css(elem, "display")) &&
9917
9918						// Support: Safari 8+
9919						// Table columns in Safari have non-zero offsetWidth & zero
9920						// getBoundingClientRect().width unless display is changed.
9921						// Support: IE <=11 only
9922						// Running getBoundingClientRect on a disconnected node
9923						// in IE throws an error.
9924						(!elem.getClientRects().length || !elem.getBoundingClientRect().width) ?
9925						swap(elem, cssShow, function () {
9926							return getWidthOrHeight(elem, dimension, extra);
9927						}) :
9928						getWidthOrHeight(elem, dimension, extra);
9929				}
9930			},
9931
9932			set: function (elem, value, extra) {
9933				var matches,
9934					styles = getStyles(elem),
9935
9936					// Only read styles.position if the test has a chance to fail
9937					// to avoid forcing a reflow.
9938					scrollboxSizeBuggy = !support.scrollboxSize() &&
9939						styles.position === "absolute",
9940
9941					// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
9942					boxSizingNeeded = scrollboxSizeBuggy || extra,
9943					isBorderBox = boxSizingNeeded &&
9944						jQuery.css(elem, "boxSizing", false, styles) === "border-box",
9945					subtract = extra ?
9946						boxModelAdjustment(
9947							elem,
9948							dimension,
9949							extra,
9950							isBorderBox,
9951							styles
9952						) :
9953						0;
9954
9955				// Account for unreliable border-box dimensions by comparing offset* to computed and
9956				// faking a content-box to get border and padding (gh-3699)
9957				if (isBorderBox && scrollboxSizeBuggy) {
9958					subtract -= Math.ceil(
9959						elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] -
9960						parseFloat(styles[dimension]) -
9961						boxModelAdjustment(elem, dimension, "border", false, styles) -
9962						0.5
9963					);
9964				}
9965
9966				// Convert to pixels if value adjustment is needed
9967				if (subtract && (matches = rcssNum.exec(value)) &&
9968					(matches[3] || "px") !== "px") {
9969
9970					elem.style[dimension] = value;
9971					value = jQuery.css(elem, dimension);
9972				}
9973
9974				return setPositiveNumber(elem, value, subtract);
9975			}
9976		};
9977	});
9978
9979	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft,
9980		function (elem, computed) {
9981			if (computed) {
9982				return (parseFloat(curCSS(elem, "marginLeft")) ||
9983					elem.getBoundingClientRect().left -
9984					swap(elem, { marginLeft: 0 }, function () {
9985						return elem.getBoundingClientRect().left;
9986					})
9987				) + "px";
9988			}
9989		}
9990	);
9991
9992	// These hooks are used by animate to expand properties
9993	jQuery.each({
9994		margin: "",
9995		padding: "",
9996		border: "Width"
9997	}, function (prefix, suffix) {
9998		jQuery.cssHooks[prefix + suffix] = {
9999			expand: function (value) {
10000				var i = 0,
10001					expanded = {},
10002
10003					// Assumes a single number if not a string
10004					parts = typeof value === "string" ? value.split(" ") : [value];
10005
10006				for (; i < 4; i++) {
10007					expanded[prefix + cssExpand[i] + suffix] =
10008						parts[i] || parts[i - 2] || parts[0];
10009				}
10010
10011				return expanded;
10012			}
10013		};
10014
10015		if (prefix !== "margin") {
10016			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
10017		}
10018	});
10019
10020	jQuery.fn.extend({
10021		css: function (name, value) {
10022			return access(this, function (elem, name, value) {
10023				var styles, len,
10024					map = {},
10025					i = 0;
10026
10027				if (Array.isArray(name)) {
10028					styles = getStyles(elem);
10029					len = name.length;
10030
10031					for (; i < len; i++) {
10032						map[name[i]] = jQuery.css(elem, name[i], false, styles);
10033					}
10034
10035					return map;
10036				}
10037
10038				return value !== undefined ?
10039					jQuery.style(elem, name, value) :
10040					jQuery.css(elem, name);
10041			}, name, value, arguments.length > 1);
10042		}
10043	});
10044
10045
10046	function Tween(elem, options, prop, end, easing) {
10047		return new Tween.prototype.init(elem, options, prop, end, easing);
10048	}
10049	jQuery.Tween = Tween;
10050
10051	Tween.prototype = {
10052		constructor: Tween,
10053		init: function (elem, options, prop, end, easing, unit) {
10054			this.elem = elem;
10055			this.prop = prop;
10056			this.easing = easing || jQuery.easing._default;
10057			this.options = options;
10058			this.start = this.now = this.cur();
10059			this.end = end;
10060			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
10061		},
10062		cur: function () {
10063			var hooks = Tween.propHooks[this.prop];
10064
10065			return hooks && hooks.get ?
10066				hooks.get(this) :
10067				Tween.propHooks._default.get(this);
10068		},
10069		run: function (percent) {
10070			var eased,
10071				hooks = Tween.propHooks[this.prop];
10072
10073			if (this.options.duration) {
10074				this.pos = eased = jQuery.easing[this.easing](
10075					percent, this.options.duration * percent, 0, 1, this.options.duration
10076				);
10077			} else {
10078				this.pos = eased = percent;
10079			}
10080			this.now = (this.end - this.start) * eased + this.start;
10081
10082			if (this.options.step) {
10083				this.options.step.call(this.elem, this.now, this);
10084			}
10085
10086			if (hooks && hooks.set) {
10087				hooks.set(this);
10088			} else {
10089				Tween.propHooks._default.set(this);
10090			}
10091			return this;
10092		}
10093	};
10094
10095	Tween.prototype.init.prototype = Tween.prototype;
10096
10097	Tween.propHooks = {
10098		_default: {
10099			get: function (tween) {
10100				var result;
10101
10102				// Use a property on the element directly when it is not a DOM element,
10103				// or when there is no matching style property that exists.
10104				if (tween.elem.nodeType !== 1 ||
10105					tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
10106					return tween.elem[tween.prop];
10107				}
10108
10109				// Passing an empty string as a 3rd parameter to .css will automatically
10110				// attempt a parseFloat and fallback to a string if the parse fails.
10111				// Simple values such as "10px" are parsed to Float;
10112				// complex values such as "rotate(1rad)" are returned as-is.
10113				result = jQuery.css(tween.elem, tween.prop, "");
10114
10115				// Empty strings, null, undefined and "auto" are converted to 0.
10116				return !result || result === "auto" ? 0 : result;
10117			},
10118			set: function (tween) {
10119
10120				// Use step hook for back compat.
10121				// Use cssHook if its there.
10122				// Use .style if available and use plain properties where available.
10123				if (jQuery.fx.step[tween.prop]) {
10124					jQuery.fx.step[tween.prop](tween);
10125				} else if (tween.elem.nodeType === 1 && (
10126					jQuery.cssHooks[tween.prop] ||
10127					tween.elem.style[finalPropName(tween.prop)] != null)) {
10128					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
10129				} else {
10130					tween.elem[tween.prop] = tween.now;
10131				}
10132			}
10133		}
10134	};
10135
10136	// Support: IE <=9 only
10137	// Panic based approach to setting things on disconnected nodes
10138	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
10139		set: function (tween) {
10140			if (tween.elem.nodeType && tween.elem.parentNode) {
10141				tween.elem[tween.prop] = tween.now;
10142			}
10143		}
10144	};
10145
10146	jQuery.easing = {
10147		linear: function (p) {
10148			return p;
10149		},
10150		swing: function (p) {
10151			return 0.5 - Math.cos(p * Math.PI) / 2;
10152		},
10153		_default: "swing"
10154	};
10155
10156	jQuery.fx = Tween.prototype.init;
10157
10158	// Back compat <1.8 extension point
10159	jQuery.fx.step = {};
10160
10161
10162
10163
10164	var
10165		fxNow, inProgress,
10166		rfxtypes = /^(?:toggle|show|hide)$/,
10167		rrun = /queueHooks$/;
10168
10169	function schedule() {
10170		if (inProgress) {
10171			if (document.hidden === false && window.requestAnimationFrame) {
10172				window.requestAnimationFrame(schedule);
10173			} else {
10174				window.setTimeout(schedule, jQuery.fx.interval);
10175			}
10176
10177			jQuery.fx.tick();
10178		}
10179	}
10180
10181	// Animations created synchronously will run synchronously
10182	function createFxNow() {
10183		window.setTimeout(function () {
10184			fxNow = undefined;
10185		});
10186		return (fxNow = Date.now());
10187	}
10188
10189	// Generate parameters to create a standard animation
10190	function genFx(type, includeWidth) {
10191		var which,
10192			i = 0,
10193			attrs = { height: type };
10194
10195		// If we include width, step value is 1 to do all cssExpand values,
10196		// otherwise step value is 2 to skip over Left and Right
10197		includeWidth = includeWidth ? 1 : 0;
10198		for (; i < 4; i += 2 - includeWidth) {
10199			which = cssExpand[i];
10200			attrs["margin" + which] = attrs["padding" + which] = type;
10201		}
10202
10203		if (includeWidth) {
10204			attrs.opacity = attrs.width = type;
10205		}
10206
10207		return attrs;
10208	}
10209
10210	function createTween(value, prop, animation) {
10211		var tween,
10212			collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
10213			index = 0,
10214			length = collection.length;
10215		for (; index < length; index++) {
10216			if ((tween = collection[index].call(animation, prop, value))) {
10217
10218				// We're done with this property
10219				return tween;
10220			}
10221		}
10222	}
10223
10224	function defaultPrefilter(elem, props, opts) {
10225		var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
10226			isBox = "width" in props || "height" in props,
10227			anim = this,
10228			orig = {},
10229			style = elem.style,
10230			hidden = elem.nodeType && isHiddenWithinTree(elem),
10231			dataShow = dataPriv.get(elem, "fxshow");
10232
10233		// Queue-skipping animations hijack the fx hooks
10234		if (!opts.queue) {
10235			hooks = jQuery._queueHooks(elem, "fx");
10236			if (hooks.unqueued == null) {
10237				hooks.unqueued = 0;
10238				oldfire = hooks.empty.fire;
10239				hooks.empty.fire = function () {
10240					if (!hooks.unqueued) {
10241						oldfire();
10242					}
10243				};
10244			}
10245			hooks.unqueued++;
10246
10247			anim.always(function () {
10248
10249				// Ensure the complete handler is called before this completes
10250				anim.always(function () {
10251					hooks.unqueued--;
10252					if (!jQuery.queue(elem, "fx").length) {
10253						hooks.empty.fire();
10254					}
10255				});
10256			});
10257		}
10258
10259		// Detect show/hide animations
10260		for (prop in props) {
10261			value = props[prop];
10262			if (rfxtypes.test(value)) {
10263				delete props[prop];
10264				toggle = toggle || value === "toggle";
10265				if (value === (hidden ? "hide" : "show")) {
10266
10267					// Pretend to be hidden if this is a "show" and
10268					// there is still data from a stopped show/hide
10269					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
10270						hidden = true;
10271
10272						// Ignore all other no-op show/hide data
10273					} else {
10274						continue;
10275					}
10276				}
10277				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
10278			}
10279		}
10280
10281		// Bail out if this is a no-op like .hide().hide()
10282		propTween = !jQuery.isEmptyObject(props);
10283		if (!propTween && jQuery.isEmptyObject(orig)) {
10284			return;
10285		}
10286
10287		// Restrict "overflow" and "display" styles during box animations
10288		if (isBox && elem.nodeType === 1) {
10289
vendor: 3,179 bytes, lines 10290-10401
10290			// Support: IE <=9 - 11, Edge 12 - 15
10291			// Record all 3 overflow attributes because IE does not infer the shorthand
10292			// from identically-valued overflowX and overflowY and Edge just mirrors
10293			// the overflowX value there.
10294			opts.overflow = [style.overflow, style.overflowX, style.overflowY];
10295
10296			// Identify a display type, preferring old show/hide data over the CSS cascade
10297			restoreDisplay = dataShow && dataShow.display;
10298			if (restoreDisplay == null) {
10299				restoreDisplay = dataPriv.get(elem, "display");
10300			}
10301			display = jQuery.css(elem, "display");
10302			if (display === "none") {
10303				if (restoreDisplay) {
10304					display = restoreDisplay;
10305				} else {
10306
10307					// Get nonempty value(s) by temporarily forcing visibility
10308					showHide([elem], true);
10309					restoreDisplay = elem.style.display || restoreDisplay;
10310					display = jQuery.css(elem, "display");
10311					showHide([elem]);
10312				}
10313			}
10314
10315			// Animate inline elements as inline-block
10316			if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
10317				if (jQuery.css(elem, "float") === "none") {
10318
10319					// Restore the original display value at the end of pure show/hide animations
10320					if (!propTween) {
10321						anim.done(function () {
10322							style.display = restoreDisplay;
10323						});
10324						if (restoreDisplay == null) {
10325							display = style.display;
10326							restoreDisplay = display === "none" ? "" : display;
10327						}
10328					}
10329					style.display = "inline-block";
10330				}
10331			}
10332		}
10333
10334		if (opts.overflow) {
10335			style.overflow = "hidden";
10336			anim.always(function () {
10337				style.overflow = opts.overflow[0];
10338				style.overflowX = opts.overflow[1];
10339				style.overflowY = opts.overflow[2];
10340			});
10341		}
10342
10343		// Implement show/hide animations
10344		propTween = false;
10345		for (prop in orig) {
10346
10347			// General show/hide setup for this element animation
10348			if (!propTween) {
10349				if (dataShow) {
10350					if ("hidden" in dataShow) {
10351						hidden = dataShow.hidden;
10352					}
10353				} else {
10354					dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay });
10355				}
10356
10357				// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
10358				if (toggle) {
10359					dataShow.hidden = !hidden;
10360				}
10361
10362				// Show elements before animating them
10363				if (hidden) {
10364					showHide([elem], true);
10365				}
10366
10367				/* eslint-disable no-loop-func */
10368
10369				anim.done(function () {
10370
10371					/* eslint-enable no-loop-func */
10372
10373					// The final step of a "hide" animation is actually hiding the element
10374					if (!hidden) {
10375						showHide([elem]);
10376					}
10377					dataPriv.remove(elem, "fxshow");
10378					for (prop in orig) {
10379						jQuery.style(elem, prop, orig[prop]);
10380					}
10381				});
10382			}
10383
10384			// Per-property setup
10385			propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
10386			if (!(prop in dataShow)) {
10387				dataShow[prop] = propTween.start;
10388				if (hidden) {
10389					propTween.end = propTween.start;
10390					propTween.start = 0;
10391				}
10392			}
10393		}
10394	}
10395
10396	function propFilter(props, specialEasing) {
10397		var index, name, easing, value, hooks;
10398
10399		// camelCase, specialEasing and expand cssHook pass
10400		for (index in props) {
10401			name = camelCase(index);
vendor: 16,633 bytes, lines 10402-11061
10402			easing = specialEasing[name];
10403			value = props[index];
10404			if (Array.isArray(value)) {
10405				easing = value[1];
10406				value = props[index] = value[0];
10407			}
10408
10409			if (index !== name) {
10410				props[name] = value;
10411				delete props[index];
10412			}
10413
10414			hooks = jQuery.cssHooks[name];
10415			if (hooks && "expand" in hooks) {
10416				value = hooks.expand(value);
10417				delete props[name];
10418
10419				// Not quite $.extend, this won't overwrite existing keys.
10420				// Reusing 'index' because we have the correct "name"
10421				for (index in value) {
10422					if (!(index in props)) {
10423						props[index] = value[index];
10424						specialEasing[index] = easing;
10425					}
10426				}
10427			} else {
10428				specialEasing[name] = easing;
10429			}
10430		}
10431	}
10432
10433	function Animation(elem, properties, options) {
10434		var result,
10435			stopped,
10436			index = 0,
10437			length = Animation.prefilters.length,
10438			deferred = jQuery.Deferred().always(function () {
10439
10440				// Don't match elem in the :animated selector
10441				delete tick.elem;
10442			}),
10443			tick = function () {
10444				if (stopped) {
10445					return false;
10446				}
10447				var currentTime = fxNow || createFxNow(),
10448					remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
10449
10450					// Support: Android 2.3 only
10451					// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
10452					temp = remaining / animation.duration || 0,
10453					percent = 1 - temp,
10454					index = 0,
10455					length = animation.tweens.length;
10456
10457				for (; index < length; index++) {
10458					animation.tweens[index].run(percent);
10459				}
10460
10461				deferred.notifyWith(elem, [animation, percent, remaining]);
10462
10463				// If there's more to do, yield
10464				if (percent < 1 && length) {
10465					return remaining;
10466				}
10467
10468				// If this was an empty animation, synthesize a final progress notification
10469				if (!length) {
10470					deferred.notifyWith(elem, [animation, 1, 0]);
10471				}
10472
10473				// Resolve the animation and report its conclusion
10474				deferred.resolveWith(elem, [animation]);
10475				return false;
10476			},
10477			animation = deferred.promise({
10478				elem: elem,
10479				props: jQuery.extend({}, properties),
10480				opts: jQuery.extend(true, {
10481					specialEasing: {},
10482					easing: jQuery.easing._default
10483				}, options),
10484				originalProperties: properties,
10485				originalOptions: options,
10486				startTime: fxNow || createFxNow(),
10487				duration: options.duration,
10488				tweens: [],
10489				createTween: function (prop, end) {
10490					var tween = jQuery.Tween(elem, animation.opts, prop, end,
10491						animation.opts.specialEasing[prop] || animation.opts.easing);
10492					animation.tweens.push(tween);
10493					return tween;
10494				},
10495				stop: function (gotoEnd) {
10496					var index = 0,
10497
10498						// If we are going to the end, we want to run all the tweens
10499						// otherwise we skip this part
10500						length = gotoEnd ? animation.tweens.length : 0;
10501					if (stopped) {
10502						return this;
10503					}
10504					stopped = true;
10505					for (; index < length; index++) {
10506						animation.tweens[index].run(1);
10507					}
10508
10509					// Resolve when we played the last frame; otherwise, reject
10510					if (gotoEnd) {
10511						deferred.notifyWith(elem, [animation, 1, 0]);
10512						deferred.resolveWith(elem, [animation, gotoEnd]);
10513					} else {
10514						deferred.rejectWith(elem, [animation, gotoEnd]);
10515					}
10516					return this;
10517				}
10518			}),
10519			props = animation.props;
10520
10521		propFilter(props, animation.opts.specialEasing);
10522
10523		for (; index < length; index++) {
10524			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
10525			if (result) {
10526				if (isFunction(result.stop)) {
10527					jQuery._queueHooks(animation.elem, animation.opts.queue).stop =
10528						result.stop.bind(result);
10529				}
10530				return result;
10531			}
10532		}
10533
10534		jQuery.map(props, createTween, animation);
10535
10536		if (isFunction(animation.opts.start)) {
10537			animation.opts.start.call(elem, animation);
10538		}
10539
10540		// Attach callbacks from options
10541		animation
10542			.progress(animation.opts.progress)
10543			.done(animation.opts.done, animation.opts.complete)
10544			.fail(animation.opts.fail)
10545			.always(animation.opts.always);
10546
10547		jQuery.fx.timer(
10548			jQuery.extend(tick, {
10549				elem: elem,
10550				anim: animation,
10551				queue: animation.opts.queue
10552			})
10553		);
10554
10555		return animation;
10556	}
10557
10558	jQuery.Animation = jQuery.extend(Animation, {
10559
10560		tweeners: {
10561			"*": [function (prop, value) {
10562				var tween = this.createTween(prop, value);
10563				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
10564				return tween;
10565			}]
10566		},
10567
10568		tweener: function (props, callback) {
10569			if (isFunction(props)) {
10570				callback = props;
10571				props = ["*"];
10572			} else {
10573				props = props.match(rnothtmlwhite);
10574			}
10575
10576			var prop,
10577				index = 0,
10578				length = props.length;
10579
10580			for (; index < length; index++) {
10581				prop = props[index];
10582				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
10583				Animation.tweeners[prop].unshift(callback);
10584			}
10585		},
10586
10587		prefilters: [defaultPrefilter],
10588
10589		prefilter: function (callback, prepend) {
10590			if (prepend) {
10591				Animation.prefilters.unshift(callback);
10592			} else {
10593				Animation.prefilters.push(callback);
10594			}
10595		}
10596	});
10597
10598	jQuery.speed = function (speed, easing, fn) {
10599		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
10600			complete: fn || !fn && easing ||
10601				isFunction(speed) && speed,
10602			duration: speed,
10603			easing: fn && easing || easing && !isFunction(easing) && easing
10604		};
10605
10606		// Go to the end state if fx are off
10607		if (jQuery.fx.off) {
10608			opt.duration = 0;
10609
10610		} else {
10611			if (typeof opt.duration !== "number") {
10612				if (opt.duration in jQuery.fx.speeds) {
10613					opt.duration = jQuery.fx.speeds[opt.duration];
10614
10615				} else {
10616					opt.duration = jQuery.fx.speeds._default;
10617				}
10618			}
10619		}
10620
10621		// Normalize opt.queue - true/undefined/null -> "fx"
10622		if (opt.queue == null || opt.queue === true) {
10623			opt.queue = "fx";
10624		}
10625
10626		// Queueing
10627		opt.old = opt.complete;
10628
10629		opt.complete = function () {
10630			if (isFunction(opt.old)) {
10631				opt.old.call(this);
10632			}
10633
10634			if (opt.queue) {
10635				jQuery.dequeue(this, opt.queue);
10636			}
10637		};
10638
10639		return opt;
10640	};
10641
10642	jQuery.fn.extend({
10643		fadeTo: function (speed, to, easing, callback) {
10644
10645			// Show any hidden elements after setting opacity to 0
10646			return this.filter(isHiddenWithinTree).css("opacity", 0).show()
10647
10648				// Animate to the value specified
10649				.end().animate({ opacity: to }, speed, easing, callback);
10650		},
10651		animate: function (prop, speed, easing, callback) {
10652			var empty = jQuery.isEmptyObject(prop),
10653				optall = jQuery.speed(speed, easing, callback),
10654				doAnimation = function () {
10655
10656					// Operate on a copy of prop so per-property easing won't be lost
10657					var anim = Animation(this, jQuery.extend({}, prop), optall);
10658
10659					// Empty animations, or finishing resolves immediately
10660					if (empty || dataPriv.get(this, "finish")) {
10661						anim.stop(true);
10662					}
10663				};
10664			doAnimation.finish = doAnimation;
10665
10666			return empty || optall.queue === false ?
10667				this.each(doAnimation) :
10668				this.queue(optall.queue, doAnimation);
10669		},
10670		stop: function (type, clearQueue, gotoEnd) {
10671			var stopQueue = function (hooks) {
10672				var stop = hooks.stop;
10673				delete hooks.stop;
10674				stop(gotoEnd);
10675			};
10676
10677			if (typeof type !== "string") {
10678				gotoEnd = clearQueue;
10679				clearQueue = type;
10680				type = undefined;
10681			}
10682			if (clearQueue) {
10683				this.queue(type || "fx", []);
10684			}
10685
10686			return this.each(function () {
10687				var dequeue = true,
10688					index = type != null && type + "queueHooks",
10689					timers = jQuery.timers,
10690					data = dataPriv.get(this);
10691
10692				if (index) {
10693					if (data[index] && data[index].stop) {
10694						stopQueue(data[index]);
10695					}
10696				} else {
10697					for (index in data) {
10698						if (data[index] && data[index].stop && rrun.test(index)) {
10699							stopQueue(data[index]);
10700						}
10701					}
10702				}
10703
10704				for (index = timers.length; index--;) {
10705					if (timers[index].elem === this &&
10706						(type == null || timers[index].queue === type)) {
10707
10708						timers[index].anim.stop(gotoEnd);
10709						dequeue = false;
10710						timers.splice(index, 1);
10711					}
10712				}
10713
10714				// Start the next in the queue if the last step wasn't forced.
10715				// Timers currently will call their complete callbacks, which
10716				// will dequeue but only if they were gotoEnd.
10717				if (dequeue || !gotoEnd) {
10718					jQuery.dequeue(this, type);
10719				}
10720			});
10721		},
10722		finish: function (type) {
10723			if (type !== false) {
10724				type = type || "fx";
10725			}
10726			return this.each(function () {
10727				var index,
10728					data = dataPriv.get(this),
10729					queue = data[type + "queue"],
10730					hooks = data[type + "queueHooks"],
10731					timers = jQuery.timers,
10732					length = queue ? queue.length : 0;
10733
10734				// Enable finishing flag on private data
10735				data.finish = true;
10736
10737				// Empty the queue first
10738				jQuery.queue(this, type, []);
10739
10740				if (hooks && hooks.stop) {
10741					hooks.stop.call(this, true);
10742				}
10743
10744				// Look for any active animations, and finish them
10745				for (index = timers.length; index--;) {
10746					if (timers[index].elem === this && timers[index].queue === type) {
10747						timers[index].anim.stop(true);
10748						timers.splice(index, 1);
10749					}
10750				}
10751
10752				// Look for any animations in the old queue and finish them
10753				for (index = 0; index < length; index++) {
10754					if (queue[index] && queue[index].finish) {
10755						queue[index].finish.call(this);
10756					}
10757				}
10758
10759				// Turn off finishing flag
10760				delete data.finish;
10761			});
10762		}
10763	});
10764
10765	jQuery.each(["toggle", "show", "hide"], function (_i, name) {
10766		var cssFn = jQuery.fn[name];
10767		jQuery.fn[name] = function (speed, easing, callback) {
10768			return speed == null || typeof speed === "boolean" ?
10769				cssFn.apply(this, arguments) :
10770				this.animate(genFx(name, true), speed, easing, callback);
10771		};
10772	});
10773
10774	// Generate shortcuts for custom animations
10775	jQuery.each({
10776		slideDown: genFx("show"),
10777		slideUp: genFx("hide"),
10778		slideToggle: genFx("toggle"),
10779		fadeIn: { opacity: "show" },
10780		fadeOut: { opacity: "hide" },
10781		fadeToggle: { opacity: "toggle" }
10782	}, function (name, props) {
10783		jQuery.fn[name] = function (speed, easing, callback) {
10784			return this.animate(props, speed, easing, callback);
10785		};
10786	});
10787
10788	jQuery.timers = [];
10789	jQuery.fx.tick = function () {
10790		var timer,
10791			i = 0,
10792			timers = jQuery.timers;
10793
10794		fxNow = Date.now();
10795
10796		for (; i < timers.length; i++) {
10797			timer = timers[i];
10798
10799			// Run the timer and safely remove it when done (allowing for external removal)
10800			if (!timer() && timers[i] === timer) {
10801				timers.splice(i--, 1);
10802			}
10803		}
10804
10805		if (!timers.length) {
10806			jQuery.fx.stop();
10807		}
10808		fxNow = undefined;
10809	};
10810
10811	jQuery.fx.timer = function (timer) {
10812		jQuery.timers.push(timer);
10813		jQuery.fx.start();
10814	};
10815
10816	jQuery.fx.interval = 13;
10817	jQuery.fx.start = function () {
10818		if (inProgress) {
10819			return;
10820		}
10821
10822		inProgress = true;
10823		schedule();
10824	};
10825
10826	jQuery.fx.stop = function () {
10827		inProgress = null;
10828	};
10829
10830	jQuery.fx.speeds = {
10831		slow: 600,
10832		fast: 200,
10833
10834		// Default speed
10835		_default: 400
10836	};
10837
10838
10839	// Based off of the plugin by Clint Helfers, with permission.
10840	// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
10841	jQuery.fn.delay = function (time, type) {
10842		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
10843		type = type || "fx";
10844
10845		return this.queue(type, function (next, hooks) {
10846			var timeout = window.setTimeout(next, time);
10847			hooks.stop = function () {
10848				window.clearTimeout(timeout);
10849			};
10850		});
10851	};
10852
10853
10854	(function () {
10855		var input = document.createElement("input"),
10856			select = document.createElement("select"),
10857			opt = select.appendChild(document.createElement("option"));
10858
10859		input.type = "checkbox";
10860
10861		// Support: Android <=4.3 only
10862		// Default value for a checkbox should be "on"
10863		support.checkOn = input.value !== "";
10864
10865		// Support: IE <=11 only
10866		// Must access selectedIndex to make default options select
10867		support.optSelected = opt.selected;
10868
10869		// Support: IE <=11 only
10870		// An input loses its value after becoming a radio
10871		input = document.createElement("input");
10872		input.value = "t";
10873		input.type = "radio";
10874		support.radioValue = input.value === "t";
10875	})();
10876
10877
10878	var boolHook,
10879		attrHandle = jQuery.expr.attrHandle;
10880
10881	jQuery.fn.extend({
10882		attr: function (name, value) {
10883			return access(this, jQuery.attr, name, value, arguments.length > 1);
10884		},
10885
10886		removeAttr: function (name) {
10887			return this.each(function () {
10888				jQuery.removeAttr(this, name);
10889			});
10890		}
10891	});
10892
10893	jQuery.extend({
10894		attr: function (elem, name, value) {
10895			var ret, hooks,
10896				nType = elem.nodeType;
10897
10898			// Don't get/set attributes on text, comment and attribute nodes
10899			if (nType === 3 || nType === 8 || nType === 2) {
10900				return;
10901			}
10902
10903			// Fallback to prop when attributes are not supported
10904			if (typeof elem.getAttribute === "undefined") {
10905				return jQuery.prop(elem, name, value);
10906			}
10907
10908			// Attribute hooks are determined by the lowercase version
10909			// Grab necessary hook if one is defined
10910			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
10911				hooks = jQuery.attrHooks[name.toLowerCase()] ||
10912					(jQuery.expr.match.bool.test(name) ? boolHook : undefined);
10913			}
10914
10915			if (value !== undefined) {
10916				if (value === null) {
10917					jQuery.removeAttr(elem, name);
10918					return;
10919				}
10920
10921				if (hooks && "set" in hooks &&
10922					(ret = hooks.set(elem, value, name)) !== undefined) {
10923					return ret;
10924				}
10925
10926				elem.setAttribute(name, value + "");
10927				return value;
10928			}
10929
10930			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
10931				return ret;
10932			}
10933
10934			ret = jQuery.find.attr(elem, name);
10935
10936			// Non-existent attributes return null, we normalize to undefined
10937			return ret == null ? undefined : ret;
10938		},
10939
10940		attrHooks: {
10941			type: {
10942				set: function (elem, value) {
10943					if (!support.radioValue && value === "radio" &&
10944						nodeName(elem, "input")) {
10945						var val = elem.value;
10946						elem.setAttribute("type", value);
10947						if (val) {
10948							elem.value = val;
10949						}
10950						return value;
10951					}
10952				}
10953			}
10954		},
10955
10956		removeAttr: function (elem, value) {
10957			var name,
10958				i = 0,
10959
10960				// Attribute names can contain non-HTML whitespace characters
10961				// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
10962				attrNames = value && value.match(rnothtmlwhite);
10963
10964			if (attrNames && elem.nodeType === 1) {
10965				while ((name = attrNames[i++])) {
10966					elem.removeAttribute(name);
10967				}
10968			}
10969		}
10970	});
10971
10972	// Hooks for boolean attributes
10973	boolHook = {
10974		set: function (elem, value, name) {
10975			if (value === false) {
10976
10977				// Remove boolean attributes when set to false
10978				jQuery.removeAttr(elem, name);
10979			} else {
10980				elem.setAttribute(name, name);
10981			}
10982			return name;
10983		}
10984	};
10985
10986	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (_i, name) {
10987		var getter = attrHandle[name] || jQuery.find.attr;
10988
10989		attrHandle[name] = function (elem, name, isXML) {
10990			var ret, handle,
10991				lowercaseName = name.toLowerCase();
10992
10993			if (!isXML) {
10994
10995				// Avoid an infinite loop by temporarily removing this function from the getter
10996				handle = attrHandle[lowercaseName];
10997				attrHandle[lowercaseName] = ret;
10998				ret = getter(elem, name, isXML) != null ?
10999					lowercaseName :
11000					null;
11001				attrHandle[lowercaseName] = handle;
11002			}
11003			return ret;
11004		};
11005	});
11006
11007
11008
11009
11010	var rfocusable = /^(?:input|select|textarea|button)$/i,
11011		rclickable = /^(?:a|area)$/i;
11012
11013	jQuery.fn.extend({
11014		prop: function (name, value) {
11015			return access(this, jQuery.prop, name, value, arguments.length > 1);
11016		},
11017
11018		removeProp: function (name) {
11019			return this.each(function () {
11020				delete this[jQuery.propFix[name] || name];
11021			});
11022		}
11023	});
11024
11025	jQuery.extend({
11026		prop: function (elem, name, value) {
11027			var ret, hooks,
11028				nType = elem.nodeType;
11029
11030			// Don't get/set properties on text, comment and attribute nodes
11031			if (nType === 3 || nType === 8 || nType === 2) {
11032				return;
11033			}
11034
11035			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
11036
11037				// Fix name and attach hooks
11038				name = jQuery.propFix[name] || name;
11039				hooks = jQuery.propHooks[name];
11040			}
11041
11042			if (value !== undefined) {
11043				if (hooks && "set" in hooks &&
11044					(ret = hooks.set(elem, value, name)) !== undefined) {
11045					return ret;
11046				}
11047
11048				return (elem[name] = value);
11049			}
11050
11051			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
11052				return ret;
11053			}
11054
11055			return elem[name];
11056		},
11057
11058		propHooks: {
11059			tabIndex: {
11060				get: function (elem) {
11061
vendor: 11,821 bytes, lines 11062-11550
11062					// Support: IE <=9 - 11 only
11063					// elem.tabIndex doesn't always return the
11064					// correct value when it hasn't been explicitly set
11065					// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
11066					// Use proper attribute retrieval(#12072)
11067					var tabindex = jQuery.find.attr(elem, "tabindex");
11068
11069					if (tabindex) {
11070						return parseInt(tabindex, 10);
11071					}
11072
11073					if (
11074						rfocusable.test(elem.nodeName) ||
11075						rclickable.test(elem.nodeName) &&
11076						elem.href
11077					) {
11078						return 0;
11079					}
11080
11081					return -1;
11082				}
11083			}
11084		},
11085
11086		propFix: {
11087			"for": "htmlFor",
11088			"class": "className"
11089		}
11090	});
11091
11092	// Support: IE <=11 only
11093	// Accessing the selectedIndex property
11094	// forces the browser to respect setting selected
11095	// on the option
11096	// The getter ensures a default option is selected
11097	// when in an optgroup
11098	// eslint rule "no-unused-expressions" is disabled for this code
11099	// since it considers such accessions noop
11100	if (!support.optSelected) {
11101		jQuery.propHooks.selected = {
11102			get: function (elem) {
11103
11104				/* eslint no-unused-expressions: "off" */
11105
11106				var parent = elem.parentNode;
11107				if (parent && parent.parentNode) {
11108					parent.parentNode.selectedIndex;
11109				}
11110				return null;
11111			},
11112			set: function (elem) {
11113
11114				/* eslint no-unused-expressions: "off" */
11115
11116				var parent = elem.parentNode;
11117				if (parent) {
11118					parent.selectedIndex;
11119
11120					if (parent.parentNode) {
11121						parent.parentNode.selectedIndex;
11122					}
11123				}
11124			}
11125		};
11126	}
11127
11128	jQuery.each([
11129		"tabIndex",
11130		"readOnly",
11131		"maxLength",
11132		"cellSpacing",
11133		"cellPadding",
11134		"rowSpan",
11135		"colSpan",
11136		"useMap",
11137		"frameBorder",
11138		"contentEditable"
11139	], function () {
11140		jQuery.propFix[this.toLowerCase()] = this;
11141	});
11142
11143
11144
11145
11146	// Strip and collapse whitespace according to HTML spec
11147	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
11148	function stripAndCollapse(value) {
11149		var tokens = value.match(rnothtmlwhite) || [];
11150		return tokens.join(" ");
11151	}
11152
11153
11154	function getClass(elem) {
11155		return elem.getAttribute && elem.getAttribute("class") || "";
11156	}
11157
11158	function classesToArray(value) {
11159		if (Array.isArray(value)) {
11160			return value;
11161		}
11162		if (typeof value === "string") {
11163			return value.match(rnothtmlwhite) || [];
11164		}
11165		return [];
11166	}
11167
11168	jQuery.fn.extend({
11169		addClass: function (value) {
11170			var classes, elem, cur, curValue, clazz, j, finalValue,
11171				i = 0;
11172
11173			if (isFunction(value)) {
11174				return this.each(function (j) {
11175					jQuery(this).addClass(value.call(this, j, getClass(this)));
11176				});
11177			}
11178
11179			classes = classesToArray(value);
11180
11181			if (classes.length) {
11182				while ((elem = this[i++])) {
11183					curValue = getClass(elem);
11184					cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " ");
11185
11186					if (cur) {
11187						j = 0;
11188						while ((clazz = classes[j++])) {
11189							if (cur.indexOf(" " + clazz + " ") < 0) {
11190								cur += clazz + " ";
11191							}
11192						}
11193
11194						// Only assign if different to avoid unneeded rendering.
11195						finalValue = stripAndCollapse(cur);
11196						if (curValue !== finalValue) {
11197							elem.setAttribute("class", finalValue);
11198						}
11199					}
11200				}
11201			}
11202
11203			return this;
11204		},
11205
11206		removeClass: function (value) {
11207			var classes, elem, cur, curValue, clazz, j, finalValue,
11208				i = 0;
11209
11210			if (isFunction(value)) {
11211				return this.each(function (j) {
11212					jQuery(this).removeClass(value.call(this, j, getClass(this)));
11213				});
11214			}
11215
11216			if (!arguments.length) {
11217				return this.attr("class", "");
11218			}
11219
11220			classes = classesToArray(value);
11221
11222			if (classes.length) {
11223				while ((elem = this[i++])) {
11224					curValue = getClass(elem);
11225
11226					// This expression is here for better compressibility (see addClass)
11227					cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " ");
11228
11229					if (cur) {
11230						j = 0;
11231						while ((clazz = classes[j++])) {
11232
11233							// Remove *all* instances
11234							while (cur.indexOf(" " + clazz + " ") > -1) {
11235								cur = cur.replace(" " + clazz + " ", " ");
11236							}
11237						}
11238
11239						// Only assign if different to avoid unneeded rendering.
11240						finalValue = stripAndCollapse(cur);
11241						if (curValue !== finalValue) {
11242							elem.setAttribute("class", finalValue);
11243						}
11244					}
11245				}
11246			}
11247
11248			return this;
11249		},
11250
11251		toggleClass: function (value, stateVal) {
11252			var type = typeof value,
11253				isValidValue = type === "string" || Array.isArray(value);
11254
11255			if (typeof stateVal === "boolean" && isValidValue) {
11256				return stateVal ? this.addClass(value) : this.removeClass(value);
11257			}
11258
11259			if (isFunction(value)) {
11260				return this.each(function (i) {
11261					jQuery(this).toggleClass(
11262						value.call(this, i, getClass(this), stateVal),
11263						stateVal
11264					);
11265				});
11266			}
11267
11268			return this.each(function () {
11269				var className, i, self, classNames;
11270
11271				if (isValidValue) {
11272
11273					// Toggle individual class names
11274					i = 0;
11275					self = jQuery(this);
11276					classNames = classesToArray(value);
11277
11278					while ((className = classNames[i++])) {
11279
11280						// Check each className given, space separated list
11281						if (self.hasClass(className)) {
11282							self.removeClass(className);
11283						} else {
11284							self.addClass(className);
11285						}
11286					}
11287
11288					// Toggle whole class name
11289				} else if (value === undefined || type === "boolean") {
11290					className = getClass(this);
11291					if (className) {
11292
11293						// Store className if set
11294						dataPriv.set(this, "__className__", className);
11295					}
11296
11297					// If the element has a class name or if we're passed `false`,
11298					// then remove the whole classname (if there was one, the above saved it).
11299					// Otherwise bring back whatever was previously saved (if anything),
11300					// falling back to the empty string if nothing was stored.
11301					if (this.setAttribute) {
11302						this.setAttribute("class",
11303							className || value === false ?
11304								"" :
11305								dataPriv.get(this, "__className__") || ""
11306						);
11307					}
11308				}
11309			});
11310		},
11311
11312		hasClass: function (selector) {
11313			var className, elem,
11314				i = 0;
11315
11316			className = " " + selector + " ";
11317			while ((elem = this[i++])) {
11318				if (elem.nodeType === 1 &&
11319					(" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
11320					return true;
11321				}
11322			}
11323
11324			return false;
11325		}
11326	});
11327
11328
11329
11330
11331	var rreturn = /\r/g;
11332
11333	jQuery.fn.extend({
11334		val: function (value) {
11335			var hooks, ret, valueIsFunction,
11336				elem = this[0];
11337
11338			if (!arguments.length) {
11339				if (elem) {
11340					hooks = jQuery.valHooks[elem.type] ||
11341						jQuery.valHooks[elem.nodeName.toLowerCase()];
11342
11343					if (hooks &&
11344						"get" in hooks &&
11345						(ret = hooks.get(elem, "value")) !== undefined
11346					) {
11347						return ret;
11348					}
11349
11350					ret = elem.value;
11351
11352					// Handle most common string cases
11353					if (typeof ret === "string") {
11354						return ret.replace(rreturn, "");
11355					}
11356
11357					// Handle cases where value is null/undef or number
11358					return ret == null ? "" : ret;
11359				}
11360
11361				return;
11362			}
11363
11364			valueIsFunction = isFunction(value);
11365
11366			return this.each(function (i) {
11367				var val;
11368
11369				if (this.nodeType !== 1) {
11370					return;
11371				}
11372
11373				if (valueIsFunction) {
11374					val = value.call(this, i, jQuery(this).val());
11375				} else {
11376					val = value;
11377				}
11378
11379				// Treat null/undefined as ""; convert numbers to string
11380				if (val == null) {
11381					val = "";
11382
11383				} else if (typeof val === "number") {
11384					val += "";
11385
11386				} else if (Array.isArray(val)) {
11387					val = jQuery.map(val, function (value) {
11388						return value == null ? "" : value + "";
11389					});
11390				}
11391
11392				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
11393
11394				// If set returns undefined, fall back to normal setting
11395				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
11396					this.value = val;
11397				}
11398			});
11399		}
11400	});
11401
11402	jQuery.extend({
11403		valHooks: {
11404			option: {
11405				get: function (elem) {
11406
11407					var val = jQuery.find.attr(elem, "value");
11408					return val != null ?
11409						val :
11410
11411						// Support: IE <=10 - 11 only
11412						// option.text throws exceptions (#14686, #14858)
11413						// Strip and collapse whitespace
11414						// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
11415						stripAndCollapse(jQuery.text(elem));
11416				}
11417			},
11418			select: {
11419				get: function (elem) {
11420					var value, option, i,
11421						options = elem.options,
11422						index = elem.selectedIndex,
11423						one = elem.type === "select-one",
11424						values = one ? null : [],
11425						max = one ? index + 1 : options.length;
11426
11427					if (index < 0) {
11428						i = max;
11429
11430					} else {
11431						i = one ? index : 0;
11432					}
11433
11434					// Loop through all the selected options
11435					for (; i < max; i++) {
11436						option = options[i];
11437
11438						// Support: IE <=9 only
11439						// IE8-9 doesn't update selected after form reset (#2551)
11440						if ((option.selected || i === index) &&
11441
11442							// Don't return options that are disabled or in a disabled optgroup
11443							!option.disabled &&
11444							(!option.parentNode.disabled ||
11445								!nodeName(option.parentNode, "optgroup"))) {
11446
11447							// Get the specific value for the option
11448							value = jQuery(option).val();
11449
11450							// We don't need an array for one selects
11451							if (one) {
11452								return value;
11453							}
11454
11455							// Multi-Selects return an array
11456							values.push(value);
11457						}
11458					}
11459
11460					return values;
11461				},
11462
11463				set: function (elem, value) {
11464					var optionSet, option,
11465						options = elem.options,
11466						values = jQuery.makeArray(value),
11467						i = options.length;
11468
11469					while (i--) {
11470						option = options[i];
11471
11472						/* eslint-disable no-cond-assign */
11473
11474						if (option.selected =
11475							jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1
11476						) {
11477							optionSet = true;
11478						}
11479
11480						/* eslint-enable no-cond-assign */
11481					}
11482
11483					// Force browsers to behave consistently when non-matching value is set
11484					if (!optionSet) {
11485						elem.selectedIndex = -1;
11486					}
11487					return values;
11488				}
11489			}
11490		}
11491	});
11492
11493	// Radios and checkboxes getter/setter
11494	jQuery.each(["radio", "checkbox"], function () {
11495		jQuery.valHooks[this] = {
11496			set: function (elem, value) {
11497				if (Array.isArray(value)) {
11498					return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1);
11499				}
11500			}
11501		};
11502		if (!support.checkOn) {
11503			jQuery.valHooks[this].get = function (elem) {
11504				return elem.getAttribute("value") === null ? "on" : elem.value;
11505			};
11506		}
11507	});
11508
11509
11510
11511
11512	// Return jQuery for attributes-only inclusion
11513
11514
11515	support.focusin = "onfocusin" in window;
11516
11517
11518	var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
11519		stopPropagationCallback = function (e) {
11520			e.stopPropagation();
11521		};
11522
11523	jQuery.extend(jQuery.event, {
11524
11525		trigger: function (event, data, elem, onlyHandlers) {
11526
11527			var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
11528				eventPath = [elem || document],
11529				type = hasOwn.call(event, "type") ? event.type : event,
11530				namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
11531
11532			cur = lastElement = tmp = elem = elem || document;
11533
11534			// Don't do events on text and comment nodes
11535			if (elem.nodeType === 3 || elem.nodeType === 8) {
11536				return;
11537			}
11538
11539			// focus/blur morphs to focusin/out; ensure we're not firing them right now
11540			if (rfocusMorph.test(type + jQuery.event.triggered)) {
11541				return;
11542			}
11543
11544			if (type.indexOf(".") > -1) {
11545
11546				// Namespaced trigger; create a regexp to match event type in handle()
11547				namespaces = type.split(".");
11548				type = namespaces.shift();
11549				namespaces.sort();
11550			}
vendor: 4,377 bytes, lines 11551-11706
11551			ontype = type.indexOf(":") < 0 && "on" + type;
11552
11553			// Caller can pass in a jQuery.Event object, Object, or just an event type string
11554			event = event[jQuery.expando] ?
11555				event :
11556				new jQuery.Event(type, typeof event === "object" && event);
11557
11558			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
11559			event.isTrigger = onlyHandlers ? 2 : 3;
11560			event.namespace = namespaces.join(".");
11561			event.rnamespace = event.namespace ?
11562				new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") :
11563				null;
11564
11565			// Clean up the event in case it is being reused
11566			event.result = undefined;
11567			if (!event.target) {
11568				event.target = elem;
11569			}
11570
11571			// Clone any incoming data and prepend the event, creating the handler arg list
11572			data = data == null ?
11573				[event] :
11574				jQuery.makeArray(data, [event]);
11575
11576			// Allow special events to draw outside the lines
11577			special = jQuery.event.special[type] || {};
11578			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
11579				return;
11580			}
11581
11582			// Determine event propagation path in advance, per W3C events spec (#9951)
11583			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
11584			if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
11585
11586				bubbleType = special.delegateType || type;
11587				if (!rfocusMorph.test(bubbleType + type)) {
11588					cur = cur.parentNode;
11589				}
11590				for (; cur; cur = cur.parentNode) {
11591					eventPath.push(cur);
11592					tmp = cur;
11593				}
11594
11595				// Only add window if we got to document (e.g., not plain obj or detached DOM)
11596				if (tmp === (elem.ownerDocument || document)) {
11597					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
11598				}
11599			}
11600
11601			// Fire handlers on the event path
11602			i = 0;
11603			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
11604				lastElement = cur;
11605				event.type = i > 1 ?
11606					bubbleType :
11607					special.bindType || type;
11608
11609				// jQuery handler
11610				handle = (
11611					dataPriv.get(cur, "events") || Object.create(null)
11612				)[event.type] &&
11613					dataPriv.get(cur, "handle");
11614				if (handle) {
11615					handle.apply(cur, data);
11616				}
11617
11618				// Native handler
11619				handle = ontype && cur[ontype];
11620				if (handle && handle.apply && acceptData(cur)) {
11621					event.result = handle.apply(cur, data);
11622					if (event.result === false) {
11623						event.preventDefault();
11624					}
11625				}
11626			}
11627			event.type = type;
11628
11629			// If nobody prevented the default action, do it now
11630			if (!onlyHandlers && !event.isDefaultPrevented()) {
11631
11632				if ((!special._default ||
11633					special._default.apply(eventPath.pop(), data) === false) &&
11634					acceptData(elem)) {
11635
11636					// Call a native DOM method on the target with the same name as the event.
11637					// Don't do default actions on window, that's where global variables be (#6170)
11638					if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
11639
11640						// Don't re-trigger an onFOO event when we call its FOO() method
11641						tmp = elem[ontype];
11642
11643						if (tmp) {
11644							elem[ontype] = null;
11645						}
11646
11647						// Prevent re-triggering of the same event, since we already bubbled it above
11648						jQuery.event.triggered = type;
11649
11650						if (event.isPropagationStopped()) {
11651							lastElement.addEventListener(type, stopPropagationCallback);
11652						}
11653
11654						elem[type]();
11655
11656						if (event.isPropagationStopped()) {
11657							lastElement.removeEventListener(type, stopPropagationCallback);
11658						}
11659
11660						jQuery.event.triggered = undefined;
11661
11662						if (tmp) {
11663							elem[ontype] = tmp;
11664						}
11665					}
11666				}
11667			}
11668
11669			return event.result;
11670		},
11671
11672		// Piggyback on a donor event to simulate a different one
11673		// Used only for `focus(in | out)` events
11674		simulate: function (type, elem, event) {
11675			var e = jQuery.extend(
11676				new jQuery.Event(),
11677				event,
11678				{
11679					type: type,
11680					isSimulated: true
11681				}
11682			);
11683
11684			jQuery.event.trigger(e, null, elem);
11685		}
11686
11687	});
11688
11689	jQuery.fn.extend({
11690
11691		trigger: function (type, data) {
11692			return this.each(function () {
11693				jQuery.event.trigger(type, data, this);
11694			});
11695		},
11696		triggerHandler: function (type, data) {
11697			var elem = this[0];
11698			if (elem) {
11699				return jQuery.event.trigger(type, data, elem, true);
11700			}
11701		}
11702	});
11703
11704
11705	// Support: Firefox <=44
11706	// Firefox doesn't have focus(in | out) events
vendor: 1,396 bytes, lines 11707-11742
11707	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
11708	//
11709	// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
11710	// focus(in | out) events fire after focus & blur events,
11711	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
11712	// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
11713	if (!support.focusin) {
11714		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {
11715
11716			// Attach a single capturing handler on the document while someone wants focusin/focusout
11717			var handler = function (event) {
11718				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
11719			};
11720
11721			jQuery.event.special[fix] = {
11722				setup: function () {
11723
11724					// Handle: regular nodes (via `this.ownerDocument`), window
11725					// (via `this.document`) & document (via `this`).
11726					var doc = this.ownerDocument || this.document || this,
11727						attaches = dataPriv.access(doc, fix);
11728
11729					if (!attaches) {
11730						doc.addEventListener(orig, handler, true);
11731					}
11732					dataPriv.access(doc, fix, (attaches || 0) + 1);
11733				},
11734				teardown: function () {
11735					var doc = this.ownerDocument || this.document || this,
11736						attaches = dataPriv.access(doc, fix) - 1;
11737
11738					if (!attaches) {
11739						doc.removeEventListener(orig, handler, true);
11740						dataPriv.remove(doc, fix);
11741
11742					} else {
vendor: 4,301 bytes, lines 11743-11916
11743						dataPriv.access(doc, fix, attaches);
11744					}
11745				}
11746			};
11747		});
11748	}
11749	var location = window.location;
11750
11751	var nonce = { guid: Date.now() };
11752
11753	var rquery = (/\?/);
11754
11755
11756
11757	// Cross-browser xml parsing
11758	jQuery.parseXML = function (data) {
11759		var xml;
11760		if (!data || typeof data !== "string") {
11761			return null;
11762		}
11763
11764		// Support: IE 9 - 11 only
11765		// IE throws on parseFromString with invalid input.
11766		try {
11767			xml = (new window.DOMParser()).parseFromString(data, "text/xml");
11768		} catch (e) {
11769			xml = undefined;
11770		}
11771
11772		if (!xml || xml.getElementsByTagName("parsererror").length) {
11773			jQuery.error("Invalid XML: " + data);
11774		}
11775		return xml;
11776	};
11777
11778
11779	var
11780		rbracket = /\[\]$/,
11781		rCRLF = /\r?\n/g,
11782		rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
11783		rsubmittable = /^(?:input|select|textarea|keygen)/i;
11784
11785	function buildParams(prefix, obj, traditional, add) {
11786		var name;
11787
11788		if (Array.isArray(obj)) {
11789
11790			// Serialize array item.
11791			jQuery.each(obj, function (i, v) {
11792				if (traditional || rbracket.test(prefix)) {
11793
11794					// Treat each array item as a scalar.
11795					add(prefix, v);
11796
11797				} else {
11798
11799					// Item is non-scalar (array or object), encode its numeric index.
11800					buildParams(
11801						prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]",
11802						v,
11803						traditional,
11804						add
11805					);
11806				}
11807			});
11808
11809		} else if (!traditional && toType(obj) === "object") {
11810
11811			// Serialize object item.
11812			for (name in obj) {
11813				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
11814			}
11815
11816		} else {
11817
11818			// Serialize scalar item.
11819			add(prefix, obj);
11820		}
11821	}
11822
11823	// Serialize an array of form elements or a set of
11824	// key/values into a query string
11825	jQuery.param = function (a, traditional) {
11826		var prefix,
11827			s = [],
11828			add = function (key, valueOrFunction) {
11829
11830				// If value is a function, invoke it and use its return value
11831				var value = isFunction(valueOrFunction) ?
11832					valueOrFunction() :
11833					valueOrFunction;
11834
11835				s[s.length] = encodeURIComponent(key) + "=" +
11836					encodeURIComponent(value == null ? "" : value);
11837			};
11838
11839		if (a == null) {
11840			return "";
11841		}
11842
11843		// If an array was passed in, assume that it is an array of form elements.
11844		if (Array.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) {
11845
11846			// Serialize the form elements
11847			jQuery.each(a, function () {
11848				add(this.name, this.value);
11849			});
11850
11851		} else {
11852
11853			// If traditional, encode the "old" way (the way 1.3.2 or older
11854			// did it), otherwise encode params recursively.
11855			for (prefix in a) {
11856				buildParams(prefix, a[prefix], traditional, add);
11857			}
11858		}
11859
11860		// Return the resulting serialization
11861		return s.join("&");
11862	};
11863
11864	jQuery.fn.extend({
11865		serialize: function () {
11866			return jQuery.param(this.serializeArray());
11867		},
11868		serializeArray: function () {
11869			return this.map(function () {
11870
11871				// Can add propHook for "elements" to filter or add form elements
11872				var elements = jQuery.prop(this, "elements");
11873				return elements ? jQuery.makeArray(elements) : this;
11874			})
11875				.filter(function () {
11876					var type = this.type;
11877
11878					// Use .is( ":disabled" ) so that fieldset[disabled] works
11879					return this.name && !jQuery(this).is(":disabled") &&
11880						rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
11881						(this.checked || !rcheckableType.test(type));
11882				})
11883				.map(function (_i, elem) {
11884					var val = jQuery(this).val();
11885
11886					if (val == null) {
11887						return null;
11888					}
11889
11890					if (Array.isArray(val)) {
11891						return jQuery.map(val, function (val) {
11892							return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
11893						});
11894					}
11895
11896					return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
11897				}).get();
11898		}
11899	});
11900
11901
11902	var
11903		r20 = /%20/g,
11904		rhash = /#.*$/,
11905		rantiCache = /([?&])_=[^&]*/,
11906		rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
11907
11908		// #7653, #8125, #8152: local protocol detection
11909		rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
11910		rnoContent = /^(?:GET|HEAD)$/,
11911		rprotocol = /^\/\//,
11912
11913		/* Prefilters
11914		 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
11915		 * 2) These are called:
11916		 *    - BEFORE asking for a transport
vendor: 4,804 bytes, lines 11917-12081
11917		 *    - AFTER param serialization (s.data is a string if s.processData is true)
11918		 * 3) key is the dataType
11919		 * 4) the catchall symbol "*" can be used
11920		 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
11921		 */
11922		prefilters = {},
11923
11924		/* Transports bindings
11925		 * 1) key is the dataType
11926		 * 2) the catchall symbol "*" can be used
11927		 * 3) selection will start with transport dataType and THEN go to "*" if needed
11928		 */
11929		transports = {},
11930
11931		// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
11932		allTypes = "*/".concat("*"),
11933
11934		// Anchor tag for parsing the document origin
11935		originAnchor = document.createElement("a");
11936	originAnchor.href = location.href;
11937
11938	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
11939	function addToPrefiltersOrTransports(structure) {
11940
11941		// dataTypeExpression is optional and defaults to "*"
11942		return function (dataTypeExpression, func) {
11943
11944			if (typeof dataTypeExpression !== "string") {
11945				func = dataTypeExpression;
11946				dataTypeExpression = "*";
11947			}
11948
11949			var dataType,
11950				i = 0,
11951				dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
11952
11953			if (isFunction(func)) {
11954
11955				// For each dataType in the dataTypeExpression
11956				while ((dataType = dataTypes[i++])) {
11957
11958					// Prepend if requested
11959					if (dataType[0] === "+") {
11960						dataType = dataType.slice(1) || "*";
11961						(structure[dataType] = structure[dataType] || []).unshift(func);
11962
11963						// Otherwise append
11964					} else {
11965						(structure[dataType] = structure[dataType] || []).push(func);
11966					}
11967				}
11968			}
11969		};
11970	}
11971
11972	// Base inspection function for prefilters and transports
11973	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
11974
11975		var inspected = {},
11976			seekingTransport = (structure === transports);
11977
11978		function inspect(dataType) {
11979			var selected;
11980			inspected[dataType] = true;
11981			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
11982				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
11983				if (typeof dataTypeOrTransport === "string" &&
11984					!seekingTransport && !inspected[dataTypeOrTransport]) {
11985
11986					options.dataTypes.unshift(dataTypeOrTransport);
11987					inspect(dataTypeOrTransport);
11988					return false;
11989				} else if (seekingTransport) {
11990					return !(selected = dataTypeOrTransport);
11991				}
11992			});
11993			return selected;
11994		}
11995
11996		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
11997	}
11998
11999	// A special extend for ajax options
12000	// that takes "flat" options (not to be deep extended)
12001	// Fixes #9887
12002	function ajaxExtend(target, src) {
12003		var key, deep,
12004			flatOptions = jQuery.ajaxSettings.flatOptions || {};
12005
12006		for (key in src) {
12007			if (src[key] !== undefined) {
12008				(flatOptions[key] ? target : (deep || (deep = {})))[key] = src[key];
12009			}
12010		}
12011		if (deep) {
12012			jQuery.extend(true, target, deep);
12013		}
12014
12015		return target;
12016	}
12017
12018	/* Handles responses to an ajax request:
12019	 * - finds the right dataType (mediates between content-type and expected dataType)
12020	 * - returns the corresponding response
12021	 */
12022	function ajaxHandleResponses(s, jqXHR, responses) {
12023
12024		var ct, type, finalDataType, firstDataType,
12025			contents = s.contents,
12026			dataTypes = s.dataTypes;
12027
12028		// Remove auto dataType and get content-type in the process
12029		while (dataTypes[0] === "*") {
12030			dataTypes.shift();
12031			if (ct === undefined) {
12032				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
12033			}
12034		}
12035
12036		// Check if we're dealing with a known content-type
12037		if (ct) {
12038			for (type in contents) {
12039				if (contents[type] && contents[type].test(ct)) {
12040					dataTypes.unshift(type);
12041					break;
12042				}
12043			}
12044		}
12045
12046		// Check to see if we have a response for the expected dataType
12047		if (dataTypes[0] in responses) {
12048			finalDataType = dataTypes[0];
12049		} else {
12050
12051			// Try convertible dataTypes
12052			for (type in responses) {
12053				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
12054					finalDataType = type;
12055					break;
12056				}
12057				if (!firstDataType) {
12058					firstDataType = type;
12059				}
12060			}
12061
12062			// Or just use first one
12063			finalDataType = finalDataType || firstDataType;
12064		}
12065
12066		// If we found a dataType
12067		// We add the dataType to the list if needed
12068		// and return the corresponding response
12069		if (finalDataType) {
12070			if (finalDataType !== dataTypes[0]) {
12071				dataTypes.unshift(finalDataType);
12072			}
12073			return responses[finalDataType];
12074		}
12075	}
12076
12077	/* Chain conversions given the request and the original response
12078	 * Also sets the responseXXX fields on the jqXHR instance
12079	 */
12080	function ajaxConvert(s, response, jqXHR, isSuccess) {
12081		var conv2, current, conv, tmp, prev,
vendor: 8,924 bytes, lines 12082-12429
12082			converters = {},
12083
12084			// Work with a copy of dataTypes in case we need to modify it for conversion
12085			dataTypes = s.dataTypes.slice();
12086
12087		// Create converters map with lowercased keys
12088		if (dataTypes[1]) {
12089			for (conv in s.converters) {
12090				converters[conv.toLowerCase()] = s.converters[conv];
12091			}
12092		}
12093
12094		current = dataTypes.shift();
12095
12096		// Convert to each sequential dataType
12097		while (current) {
12098
12099			if (s.responseFields[current]) {
12100				jqXHR[s.responseFields[current]] = response;
12101			}
12102
12103			// Apply the dataFilter if provided
12104			if (!prev && isSuccess && s.dataFilter) {
12105				response = s.dataFilter(response, s.dataType);
12106			}
12107
12108			prev = current;
12109			current = dataTypes.shift();
12110
12111			if (current) {
12112
12113				// There's only work to do if current dataType is non-auto
12114				if (current === "*") {
12115
12116					current = prev;
12117
12118					// Convert response if prev dataType is non-auto and differs from current
12119				} else if (prev !== "*" && prev !== current) {
12120
12121					// Seek a direct converter
12122					conv = converters[prev + " " + current] || converters["* " + current];
12123
12124					// If none found, seek a pair
12125					if (!conv) {
12126						for (conv2 in converters) {
12127
12128							// If conv2 outputs current
12129							tmp = conv2.split(" ");
12130							if (tmp[1] === current) {
12131
12132								// If prev can be converted to accepted input
12133								conv = converters[prev + " " + tmp[0]] ||
12134									converters["* " + tmp[0]];
12135								if (conv) {
12136
12137									// Condense equivalence converters
12138									if (conv === true) {
12139										conv = converters[conv2];
12140
12141										// Otherwise, insert the intermediate dataType
12142									} else if (converters[conv2] !== true) {
12143										current = tmp[0];
12144										dataTypes.unshift(tmp[1]);
12145									}
12146									break;
12147								}
12148							}
12149						}
12150					}
12151
12152					// Apply converter (if not an equivalence)
12153					if (conv !== true) {
12154
12155						// Unless errors are allowed to bubble, catch and return them
12156						if (conv && s.throws) {
12157							response = conv(response);
12158						} else {
12159							try {
12160								response = conv(response);
12161							} catch (e) {
12162								return {
12163									state: "parsererror",
12164									error: conv ? e : "No conversion from " + prev + " to " + current
12165								};
12166							}
12167						}
12168					}
12169				}
12170			}
12171		}
12172
12173		return { state: "success", data: response };
12174	}
12175
12176	jQuery.extend({
12177
12178		// Counter for holding the number of active queries
12179		active: 0,
12180
12181		// Last-Modified header cache for next request
12182		lastModified: {},
12183		etag: {},
12184
12185		ajaxSettings: {
12186			url: location.href,
12187			type: "GET",
12188			isLocal: rlocalProtocol.test(location.protocol),
12189			global: true,
12190			processData: true,
12191			async: true,
12192			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
12193
12194			/*
12195			timeout: 0,
12196			data: null,
12197			dataType: null,
12198			username: null,
12199			password: null,
12200			cache: null,
12201			throws: false,
12202			traditional: false,
12203			headers: {},
12204			*/
12205
12206			accepts: {
12207				"*": allTypes,
12208				text: "text/plain",
12209				html: "text/html",
12210				xml: "application/xml, text/xml",
12211				json: "application/json, text/javascript"
12212			},
12213
12214			contents: {
12215				xml: /\bxml\b/,
12216				html: /\bhtml/,
12217				json: /\bjson\b/
12218			},
12219
12220			responseFields: {
12221				xml: "responseXML",
12222				text: "responseText",
12223				json: "responseJSON"
12224			},
12225
12226			// Data converters
12227			// Keys separate source (or catchall "*") and destination types with a single space
12228			converters: {
12229
12230				// Convert anything to text
12231				"* text": String,
12232
12233				// Text to html (true = no transformation)
12234				"text html": true,
12235
12236				// Evaluate text as a json expression
12237				"text json": JSON.parse,
12238
12239				// Parse text as xml
12240				"text xml": jQuery.parseXML
12241			},
12242
12243			// For options that shouldn't be deep extended:
12244			// you can add your own custom options here if
12245			// and when you create one that shouldn't be
12246			// deep extended (see ajaxExtend)
12247			flatOptions: {
12248				url: true,
12249				context: true
12250			}
12251		},
12252
12253		// Creates a full fledged settings object into target
12254		// with both ajaxSettings and settings fields.
12255		// If target is omitted, writes into ajaxSettings.
12256		ajaxSetup: function (target, settings) {
12257			return settings ?
12258
12259				// Building a settings object
12260				ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
12261
12262				// Extending ajaxSettings
12263				ajaxExtend(jQuery.ajaxSettings, target);
12264		},
12265
12266		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
12267		ajaxTransport: addToPrefiltersOrTransports(transports),
12268
12269		// Main method
12270		ajax: function (url, options) {
12271
12272			// If url is an object, simulate pre-1.5 signature
12273			if (typeof url === "object") {
12274				options = url;
12275				url = undefined;
12276			}
12277
12278			// Force options to be an object
12279			options = options || {};
12280
12281			var transport,
12282
12283				// URL without anti-cache param
12284				cacheURL,
12285
12286				// Response headers
12287				responseHeadersString,
12288				responseHeaders,
12289
12290				// timeout handle
12291				timeoutTimer,
12292
12293				// Url cleanup var
12294				urlAnchor,
12295
12296				// Request state (becomes false upon send and true upon completion)
12297				completed,
12298
12299				// To know if global events are to be dispatched
12300				fireGlobals,
12301
12302				// Loop variable
12303				i,
12304
12305				// uncached part of the url
12306				uncached,
12307
12308				// Create the final options object
12309				s = jQuery.ajaxSetup({}, options),
12310
12311				// Callbacks context
12312				callbackContext = s.context || s,
12313
12314				// Context for global events is callbackContext if it is a DOM node or jQuery collection
12315				globalEventContext = s.context &&
12316					(callbackContext.nodeType || callbackContext.jquery) ?
12317					jQuery(callbackContext) :
12318					jQuery.event,
12319
12320				// Deferreds
12321				deferred = jQuery.Deferred(),
12322				completeDeferred = jQuery.Callbacks("once memory"),
12323
12324				// Status-dependent callbacks
12325				statusCode = s.statusCode || {},
12326
12327				// Headers (they are sent all at once)
12328				requestHeaders = {},
12329				requestHeadersNames = {},
12330
12331				// Default abort message
12332				strAbort = "canceled",
12333
12334				// Fake xhr
12335				jqXHR = {
12336					readyState: 0,
12337
12338					// Builds headers hashtable if needed
12339					getResponseHeader: function (key) {
12340						var match;
12341						if (completed) {
12342							if (!responseHeaders) {
12343								responseHeaders = {};
12344								while ((match = rheaders.exec(responseHeadersString))) {
12345									responseHeaders[match[1].toLowerCase() + " "] =
12346										(responseHeaders[match[1].toLowerCase() + " "] || [])
12347											.concat(match[2]);
12348								}
12349							}
12350							match = responseHeaders[key.toLowerCase() + " "];
12351						}
12352						return match == null ? null : match.join(", ");
12353					},
12354
12355					// Raw string
12356					getAllResponseHeaders: function () {
12357						return completed ? responseHeadersString : null;
12358					},
12359
12360					// Caches the header
12361					setRequestHeader: function (name, value) {
12362						if (completed == null) {
12363							name = requestHeadersNames[name.toLowerCase()] =
12364								requestHeadersNames[name.toLowerCase()] || name;
12365							requestHeaders[name] = value;
12366						}
12367						return this;
12368					},
12369
12370					// Overrides response content-type header
12371					overrideMimeType: function (type) {
12372						if (completed == null) {
12373							s.mimeType = type;
12374						}
12375						return this;
12376					},
12377
12378					// Status-dependent callbacks
12379					statusCode: function (map) {
12380						var code;
12381						if (map) {
12382							if (completed) {
12383
12384								// Execute the appropriate callbacks
12385								jqXHR.always(map[jqXHR.status]);
12386							} else {
12387
12388								// Lazy-add the new callbacks in a way that preserves old ones
12389								for (code in map) {
12390									statusCode[code] = [statusCode[code], map[code]];
12391								}
12392							}
12393						}
12394						return this;
12395					},
12396
12397					// Cancel the request
12398					abort: function (statusText) {
12399						var finalText = statusText || strAbort;
12400						if (transport) {
12401							transport.abort(finalText);
12402						}
12403						done(0, finalText);
12404						return this;
12405					}
12406				};
12407
12408			// Attach deferreds
12409			deferred.promise(jqXHR);
12410
12411			// Add protocol if not provided (prefilters might expect it)
12412			// Handle falsy url in the settings object (#10093: consistency with old signature)
12413			// We also use the url parameter if available
12414			s.url = ((url || s.url || location.href) + "")
12415				.replace(rprotocol, location.protocol + "//");
12416
12417			// Alias method option to type as per ticket #12004
12418			s.type = options.method || options.type || s.method || s.type;
12419
12420			// Extract dataTypes list
12421			s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
12422
12423			// A cross-domain request is in order when the origin doesn't match the current origin.
12424			if (s.crossDomain == null) {
12425				urlAnchor = document.createElement("a");
12426
12427				// Support: IE <=8 - 11, Edge 12 - 15
12428				// IE throws exception on accessing the href property if url is malformed,
12429				// e.g. http://example.com:80x/
vendor: 24,116 bytes, lines 12430-13324
12430				try {
12431					urlAnchor.href = s.url;
12432
12433					// Support: IE <=8 - 11 only
12434					// Anchor's host property isn't correctly set when s.url is relative
12435					urlAnchor.href = urlAnchor.href;
12436					s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
12437						urlAnchor.protocol + "//" + urlAnchor.host;
12438				} catch (e) {
12439
12440					// If there is an error parsing the URL, assume it is crossDomain,
12441					// it can be rejected by the transport if it is invalid
12442					s.crossDomain = true;
12443				}
12444			}
12445
12446			// Convert data if not already a string
12447			if (s.data && s.processData && typeof s.data !== "string") {
12448				s.data = jQuery.param(s.data, s.traditional);
12449			}
12450
12451			// Apply prefilters
12452			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
12453
12454			// If request was aborted inside a prefilter, stop there
12455			if (completed) {
12456				return jqXHR;
12457			}
12458
12459			// We can fire global events as of now if asked to
12460			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
12461			fireGlobals = jQuery.event && s.global;
12462
12463			// Watch for a new set of requests
12464			if (fireGlobals && jQuery.active++ === 0) {
12465				jQuery.event.trigger("ajaxStart");
12466			}
12467
12468			// Uppercase the type
12469			s.type = s.type.toUpperCase();
12470
12471			// Determine if request has content
12472			s.hasContent = !rnoContent.test(s.type);
12473
12474			// Save the URL in case we're toying with the If-Modified-Since
12475			// and/or If-None-Match header later on
12476			// Remove hash to simplify url manipulation
12477			cacheURL = s.url.replace(rhash, "");
12478
12479			// More options handling for requests with no content
12480			if (!s.hasContent) {
12481
12482				// Remember the hash so we can put it back
12483				uncached = s.url.slice(cacheURL.length);
12484
12485				// If data is available and should be processed, append data to url
12486				if (s.data && (s.processData || typeof s.data === "string")) {
12487					cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
12488
12489					// #9682: remove data so that it's not used in an eventual retry
12490					delete s.data;
12491				}
12492
12493				// Add or update anti-cache param if needed
12494				if (s.cache === false) {
12495					cacheURL = cacheURL.replace(rantiCache, "$1");
12496					uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + (nonce.guid++) +
12497						uncached;
12498				}
12499
12500				// Put hash and anti-cache on the URL that will be requested (gh-1732)
12501				s.url = cacheURL + uncached;
12502
12503				// Change '%20' to '+' if this is encoded form body content (gh-2658)
12504			} else if (s.data && s.processData &&
12505				(s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
12506				s.data = s.data.replace(r20, "+");
12507			}
12508
12509			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
12510			if (s.ifModified) {
12511				if (jQuery.lastModified[cacheURL]) {
12512					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
12513				}
12514				if (jQuery.etag[cacheURL]) {
12515					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
12516				}
12517			}
12518
12519			// Set the correct header, if data is being sent
12520			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
12521				jqXHR.setRequestHeader("Content-Type", s.contentType);
12522			}
12523
12524			// Set the Accepts header for the server, depending on the dataType
12525			jqXHR.setRequestHeader(
12526				"Accept",
12527				s.dataTypes[0] && s.accepts[s.dataTypes[0]] ?
12528					s.accepts[s.dataTypes[0]] +
12529					(s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") :
12530					s.accepts["*"]
12531			);
12532
12533			// Check for headers option
12534			for (i in s.headers) {
12535				jqXHR.setRequestHeader(i, s.headers[i]);
12536			}
12537
12538			// Allow custom headers/mimetypes and early abort
12539			if (s.beforeSend &&
12540				(s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {
12541
12542				// Abort if not done already and return
12543				return jqXHR.abort();
12544			}
12545
12546			// Aborting is no longer a cancellation
12547			strAbort = "abort";
12548
12549			// Install callbacks on deferreds
12550			completeDeferred.add(s.complete);
12551			jqXHR.done(s.success);
12552			jqXHR.fail(s.error);
12553
12554			// Get transport
12555			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
12556
12557			// If no transport, we auto-abort
12558			if (!transport) {
12559				done(-1, "No Transport");
12560			} else {
12561				jqXHR.readyState = 1;
12562
12563				// Send global event
12564				if (fireGlobals) {
12565					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
12566				}
12567
12568				// If request was aborted inside ajaxSend, stop there
12569				if (completed) {
12570					return jqXHR;
12571				}
12572
12573				// Timeout
12574				if (s.async && s.timeout > 0) {
12575					timeoutTimer = window.setTimeout(function () {
12576						jqXHR.abort("timeout");
12577					}, s.timeout);
12578				}
12579
12580				try {
12581					completed = false;
12582					transport.send(requestHeaders, done);
12583				} catch (e) {
12584
12585					// Rethrow post-completion exceptions
12586					if (completed) {
12587						throw e;
12588					}
12589
12590					// Propagate others as results
12591					done(-1, e);
12592				}
12593			}
12594
12595			// Callback for when everything is done
12596			function done(status, nativeStatusText, responses, headers) {
12597				var isSuccess, success, error, response, modified,
12598					statusText = nativeStatusText;
12599
12600				// Ignore repeat invocations
12601				if (completed) {
12602					return;
12603				}
12604
12605				completed = true;
12606
12607				// Clear timeout if it exists
12608				if (timeoutTimer) {
12609					window.clearTimeout(timeoutTimer);
12610				}
12611
12612				// Dereference transport for early garbage collection
12613				// (no matter how long the jqXHR object will be used)
12614				transport = undefined;
12615
12616				// Cache response headers
12617				responseHeadersString = headers || "";
12618
12619				// Set readyState
12620				jqXHR.readyState = status > 0 ? 4 : 0;
12621
12622				// Determine if successful
12623				isSuccess = status >= 200 && status < 300 || status === 304;
12624
12625				// Get response data
12626				if (responses) {
12627					response = ajaxHandleResponses(s, jqXHR, responses);
12628				}
12629
12630				// Use a noop converter for missing script
12631				if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1) {
12632					s.converters["text script"] = function () { };
12633				}
12634
12635				// Convert no matter what (that way responseXXX fields are always set)
12636				response = ajaxConvert(s, response, jqXHR, isSuccess);
12637
12638				// If successful, handle type chaining
12639				if (isSuccess) {
12640
12641					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
12642					if (s.ifModified) {
12643						modified = jqXHR.getResponseHeader("Last-Modified");
12644						if (modified) {
12645							jQuery.lastModified[cacheURL] = modified;
12646						}
12647						modified = jqXHR.getResponseHeader("etag");
12648						if (modified) {
12649							jQuery.etag[cacheURL] = modified;
12650						}
12651					}
12652
12653					// if no content
12654					if (status === 204 || s.type === "HEAD") {
12655						statusText = "nocontent";
12656
12657						// if not modified
12658					} else if (status === 304) {
12659						statusText = "notmodified";
12660
12661						// If we have data, let's convert it
12662					} else {
12663						statusText = response.state;
12664						success = response.data;
12665						error = response.error;
12666						isSuccess = !error;
12667					}
12668				} else {
12669
12670					// Extract error from statusText and normalize for non-aborts
12671					error = statusText;
12672					if (status || !statusText) {
12673						statusText = "error";
12674						if (status < 0) {
12675							status = 0;
12676						}
12677					}
12678				}
12679
12680				// Set data for the fake xhr object
12681				jqXHR.status = status;
12682				jqXHR.statusText = (nativeStatusText || statusText) + "";
12683
12684				// Success/Error
12685				if (isSuccess) {
12686					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
12687				} else {
12688					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
12689				}
12690
12691				// Status-dependent callbacks
12692				jqXHR.statusCode(statusCode);
12693				statusCode = undefined;
12694
12695				if (fireGlobals) {
12696					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError",
12697						[jqXHR, s, isSuccess ? success : error]);
12698				}
12699
12700				// Complete
12701				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
12702
12703				if (fireGlobals) {
12704					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
12705
12706					// Handle the global AJAX counter
12707					if (!(--jQuery.active)) {
12708						jQuery.event.trigger("ajaxStop");
12709					}
12710				}
12711			}
12712
12713			return jqXHR;
12714		},
12715
12716		getJSON: function (url, data, callback) {
12717			return jQuery.get(url, data, callback, "json");
12718		},
12719
12720		getScript: function (url, callback) {
12721			return jQuery.get(url, undefined, callback, "script");
12722		}
12723	});
12724
12725	jQuery.each(["get", "post"], function (_i, method) {
12726		jQuery[method] = function (url, data, callback, type) {
12727
12728			// Shift arguments if data argument was omitted
12729			if (isFunction(data)) {
12730				type = type || callback;
12731				callback = data;
12732				data = undefined;
12733			}
12734
12735			// The url can be an options object (which then must have .url)
12736			return jQuery.ajax(jQuery.extend({
12737				url: url,
12738				type: method,
12739				dataType: type,
12740				data: data,
12741				success: callback
12742			}, jQuery.isPlainObject(url) && url));
12743		};
12744	});
12745
12746	jQuery.ajaxPrefilter(function (s) {
12747		var i;
12748		for (i in s.headers) {
12749			if (i.toLowerCase() === "content-type") {
12750				s.contentType = s.headers[i] || "";
12751			}
12752		}
12753	});
12754
12755
12756	jQuery._evalUrl = function (url, options, doc) {
12757		return jQuery.ajax({
12758			url: url,
12759
12760			// Make this explicit, since user can override this through ajaxSetup (#11264)
12761			type: "GET",
12762			dataType: "script",
12763			cache: true,
12764			async: false,
12765			global: false,
12766
12767			// Only evaluate the response if it is successful (gh-4126)
12768			// dataFilter is not invoked for failure responses, so using it instead
12769			// of the default converter is kludgy but it works.
12770			converters: {
12771				"text script": function () { }
12772			},
12773			dataFilter: function (response) {
12774				jQuery.globalEval(response, options, doc);
12775			}
12776		});
12777	};
12778
12779
12780	jQuery.fn.extend({
12781		wrapAll: function (html) {
12782			var wrap;
12783
12784			if (this[0]) {
12785				if (isFunction(html)) {
12786					html = html.call(this[0]);
12787				}
12788
12789				// The elements to wrap the target around
12790				wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
12791
12792				if (this[0].parentNode) {
12793					wrap.insertBefore(this[0]);
12794				}
12795
12796				wrap.map(function () {
12797					var elem = this;
12798
12799					while (elem.firstElementChild) {
12800						elem = elem.firstElementChild;
12801					}
12802
12803					return elem;
12804				}).append(this);
12805			}
12806
12807			return this;
12808		},
12809
12810		wrapInner: function (html) {
12811			if (isFunction(html)) {
12812				return this.each(function (i) {
12813					jQuery(this).wrapInner(html.call(this, i));
12814				});
12815			}
12816
12817			return this.each(function () {
12818				var self = jQuery(this),
12819					contents = self.contents();
12820
12821				if (contents.length) {
12822					contents.wrapAll(html);
12823
12824				} else {
12825					self.append(html);
12826				}
12827			});
12828		},
12829
12830		wrap: function (html) {
12831			var htmlIsFunction = isFunction(html);
12832
12833			return this.each(function (i) {
12834				jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
12835			});
12836		},
12837
12838		unwrap: function (selector) {
12839			this.parent(selector).not("body").each(function () {
12840				jQuery(this).replaceWith(this.childNodes);
12841			});
12842			return this;
12843		}
12844	});
12845
12846
12847	jQuery.expr.pseudos.hidden = function (elem) {
12848		return !jQuery.expr.pseudos.visible(elem);
12849	};
12850	jQuery.expr.pseudos.visible = function (elem) {
12851		return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
12852	};
12853
12854
12855
12856
12857	jQuery.ajaxSettings.xhr = function () {
12858		try {
12859			return new window.XMLHttpRequest();
12860		} catch (e) { }
12861	};
12862
12863	var xhrSuccessStatus = {
12864
12865		// File protocol always yields status code 0, assume 200
12866		0: 200,
12867
12868		// Support: IE <=9 only
12869		// #1450: sometimes IE returns 1223 when it should be 204
12870		1223: 204
12871	},
12872		xhrSupported = jQuery.ajaxSettings.xhr();
12873
12874	support.cors = !!xhrSupported && ("withCredentials" in xhrSupported);
12875	support.ajax = xhrSupported = !!xhrSupported;
12876
12877	jQuery.ajaxTransport(function (options) {
12878		var callback, errorCallback;
12879
12880		// Cross domain only allowed if supported through XMLHttpRequest
12881		if (support.cors || xhrSupported && !options.crossDomain) {
12882			return {
12883				send: function (headers, complete) {
12884					var i,
12885						xhr = options.xhr();
12886
12887					xhr.open(
12888						options.type,
12889						options.url,
12890						options.async,
12891						options.username,
12892						options.password
12893					);
12894
12895					// Apply custom fields if provided
12896					if (options.xhrFields) {
12897						for (i in options.xhrFields) {
12898							xhr[i] = options.xhrFields[i];
12899						}
12900					}
12901
12902					// Override mime type if needed
12903					if (options.mimeType && xhr.overrideMimeType) {
12904						xhr.overrideMimeType(options.mimeType);
12905					}
12906
12907					// X-Requested-With header
12908					// For cross-domain requests, seeing as conditions for a preflight are
12909					// akin to a jigsaw puzzle, we simply never set it to be sure.
12910					// (it can always be set on a per-request basis or even using ajaxSetup)
12911					// For same-domain requests, won't change header if already provided.
12912					if (!options.crossDomain && !headers["X-Requested-With"]) {
12913						headers["X-Requested-With"] = "XMLHttpRequest";
12914					}
12915
12916					// Set headers
12917					for (i in headers) {
12918						xhr.setRequestHeader(i, headers[i]);
12919					}
12920
12921					// Callback
12922					callback = function (type) {
12923						return function () {
12924							if (callback) {
12925								callback = errorCallback = xhr.onload =
12926									xhr.onerror = xhr.onabort = xhr.ontimeout =
12927									xhr.onreadystatechange = null;
12928
12929								if (type === "abort") {
12930									xhr.abort();
12931								} else if (type === "error") {
12932
12933									// Support: IE <=9 only
12934									// On a manual native abort, IE9 throws
12935									// errors on any property access that is not readyState
12936									if (typeof xhr.status !== "number") {
12937										complete(0, "error");
12938									} else {
12939										complete(
12940
12941											// File: protocol always yields status 0; see #8605, #14207
12942											xhr.status,
12943											xhr.statusText
12944										);
12945									}
12946								} else {
12947									complete(
12948										xhrSuccessStatus[xhr.status] || xhr.status,
12949										xhr.statusText,
12950
12951										// Support: IE <=9 only
12952										// IE9 has no XHR2 but throws on binary (trac-11426)
12953										// For XHR2 non-text, let the caller handle it (gh-2498)
12954										(xhr.responseType || "text") !== "text" ||
12955											typeof xhr.responseText !== "string" ?
12956											{ binary: xhr.response } :
12957											{ text: xhr.responseText },
12958										xhr.getAllResponseHeaders()
12959									);
12960								}
12961							}
12962						};
12963					};
12964
12965					// Listen to events
12966					xhr.onload = callback();
12967					errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
12968
12969					// Support: IE 9 only
12970					// Use onreadystatechange to replace onabort
12971					// to handle uncaught aborts
12972					if (xhr.onabort !== undefined) {
12973						xhr.onabort = errorCallback;
12974					} else {
12975						xhr.onreadystatechange = function () {
12976
12977							// Check readyState before timeout as it changes
12978							if (xhr.readyState === 4) {
12979
12980								// Allow onerror to be called first,
12981								// but that will not handle a native abort
12982								// Also, save errorCallback to a variable
12983								// as xhr.onerror cannot be accessed
12984								window.setTimeout(function () {
12985									if (callback) {
12986										errorCallback();
12987									}
12988								});
12989							}
12990						};
12991					}
12992
12993					// Create the abort callback
12994					callback = callback("abort");
12995
12996					try {
12997
12998						// Do send the request (this may raise an exception)
12999						xhr.send(options.hasContent && options.data || null);
13000					} catch (e) {
13001
13002						// #14683: Only rethrow if this hasn't been notified as an error yet
13003						if (callback) {
13004							throw e;
13005						}
13006					}
13007				},
13008
13009				abort: function () {
13010					if (callback) {
13011						callback();
13012					}
13013				}
13014			};
13015		}
13016	});
13017
13018
13019
13020
13021	// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
13022	jQuery.ajaxPrefilter(function (s) {
13023		if (s.crossDomain) {
13024			s.contents.script = false;
13025		}
13026	});
13027
13028	// Install script dataType
13029	jQuery.ajaxSetup({
13030		accepts: {
13031			script: "text/javascript, application/javascript, " +
13032				"application/ecmascript, application/x-ecmascript"
13033		},
13034		contents: {
13035			script: /\b(?:java|ecma)script\b/
13036		},
13037		converters: {
13038			"text script": function (text) {
13039				jQuery.globalEval(text);
13040				return text;
13041			}
13042		}
13043	});
13044
13045	// Handle cache's special case and crossDomain
13046	jQuery.ajaxPrefilter("script", function (s) {
13047		if (s.cache === undefined) {
13048			s.cache = false;
13049		}
13050		if (s.crossDomain) {
13051			s.type = "GET";
13052		}
13053	});
13054
13055	// Bind script tag hack transport
13056	jQuery.ajaxTransport("script", function (s) {
13057
13058		// This transport only deals with cross domain or forced-by-attrs requests
13059		if (s.crossDomain || s.scriptAttrs) {
13060			var script, callback;
13061			return {
13062				send: function (_, complete) {
13063					script = jQuery("<script>")
13064						.attr(s.scriptAttrs || {})
13065						.prop({ charset: s.scriptCharset, src: s.url })
13066						.on("load error", callback = function (evt) {
13067							script.remove();
13068							callback = null;
13069							if (evt) {
13070								complete(evt.type === "error" ? 404 : 200, evt.type);
13071							}
13072						});
13073
13074					// Use native DOM manipulation to avoid our domManip AJAX trickery
13075					document.head.appendChild(script[0]);
13076				},
13077				abort: function () {
13078					if (callback) {
13079						callback();
13080					}
13081				}
13082			};
13083		}
13084	});
13085
13086
13087
13088
13089	var oldCallbacks = [],
13090		rjsonp = /(=)\?(?=&|$)|\?\?/;
13091
13092	// Default jsonp settings
13093	jQuery.ajaxSetup({
13094		jsonp: "callback",
13095		jsonpCallback: function () {
13096			var callback = oldCallbacks.pop() || (jQuery.expando + "_" + (nonce.guid++));
13097			this[callback] = true;
13098			return callback;
13099		}
13100	});
13101
13102	// Detect, normalize options and install callbacks for jsonp requests
13103	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
13104
13105		var callbackName, overwritten, responseContainer,
13106			jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ?
13107				"url" :
13108				typeof s.data === "string" &&
13109				(s.contentType || "")
13110					.indexOf("application/x-www-form-urlencoded") === 0 &&
13111				rjsonp.test(s.data) && "data"
13112			);
13113
13114		// Handle iff the expected data type is "jsonp" or we have a parameter to set
13115		if (jsonProp || s.dataTypes[0] === "jsonp") {
13116
13117			// Get callback name, remembering preexisting value associated with it
13118			callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ?
13119				s.jsonpCallback() :
13120				s.jsonpCallback;
13121
13122			// Insert callback into url or form data
13123			if (jsonProp) {
13124				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
13125			} else if (s.jsonp !== false) {
13126				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
13127			}
13128
13129			// Use data converter to retrieve json after script execution
13130			s.converters["script json"] = function () {
13131				if (!responseContainer) {
13132					jQuery.error(callbackName + " was not called");
13133				}
13134				return responseContainer[0];
13135			};
13136
13137			// Force json dataType
13138			s.dataTypes[0] = "json";
13139
13140			// Install callback
13141			overwritten = window[callbackName];
13142			window[callbackName] = function () {
13143				responseContainer = arguments;
13144			};
13145
13146			// Clean-up function (fires after converters)
13147			jqXHR.always(function () {
13148
13149				// If previous value didn't exist - remove it
13150				if (overwritten === undefined) {
13151					jQuery(window).removeProp(callbackName);
13152
13153					// Otherwise restore preexisting value
13154				} else {
13155					window[callbackName] = overwritten;
13156				}
13157
13158				// Save back as free
13159				if (s[callbackName]) {
13160
13161					// Make sure that re-using the options doesn't screw things around
13162					s.jsonpCallback = originalSettings.jsonpCallback;
13163
13164					// Save the callback name for future use
13165					oldCallbacks.push(callbackName);
13166				}
13167
13168				// Call if it was a function and we have a response
13169				if (responseContainer && isFunction(overwritten)) {
13170					overwritten(responseContainer[0]);
13171				}
13172
13173				responseContainer = overwritten = undefined;
13174			});
13175
13176			// Delegate to script
13177			return "script";
13178		}
13179	});
13180
13181
13182
13183
13184	// Support: Safari 8 only
13185	// In Safari 8 documents created via document.implementation.createHTMLDocument
13186	// collapse sibling forms: the second one becomes a child of the first one.
13187	// Because of that, this security measure has to be disabled in Safari 8.
13188	// https://bugs.webkit.org/show_bug.cgi?id=137337
13189	support.createHTMLDocument = (function () {
13190		var body = document.implementation.createHTMLDocument("").body;
13191		body.innerHTML = "<form></form><form></form>";
13192		return body.childNodes.length === 2;
13193	})();
13194
13195
13196	// Argument "data" should be string of html
13197	// context (optional): If specified, the fragment will be created in this context,
13198	// defaults to document
13199	// keepScripts (optional): If true, will include scripts passed in the html string
13200	jQuery.parseHTML = function (data, context, keepScripts) {
13201		if (typeof data !== "string") {
13202			return [];
13203		}
13204		if (typeof context === "boolean") {
13205			keepScripts = context;
13206			context = false;
13207		}
13208
13209		var base, parsed, scripts;
13210
13211		if (!context) {
13212
13213			// Stop scripts or inline event handlers from being executed immediately
13214			// by using document.implementation
13215			if (support.createHTMLDocument) {
13216				context = document.implementation.createHTMLDocument("");
13217
13218				// Set the base href for the created document
13219				// so any parsed elements with URLs
13220				// are based on the document's URL (gh-2965)
13221				base = context.createElement("base");
13222				base.href = document.location.href;
13223				context.head.appendChild(base);
13224			} else {
13225				context = document;
13226			}
13227		}
13228
13229		parsed = rsingleTag.exec(data);
13230		scripts = !keepScripts && [];
13231
13232		// Single tag
13233		if (parsed) {
13234			return [context.createElement(parsed[1])];
13235		}
13236
13237		parsed = buildFragment([data], context, scripts);
13238
13239		if (scripts && scripts.length) {
13240			jQuery(scripts).remove();
13241		}
13242
13243		return jQuery.merge([], parsed.childNodes);
13244	};
13245
13246
13247	/**
13248	 * Load a url into a page
13249	 */
13250	jQuery.fn.load = function (url, params, callback) {
13251		var selector, type, response,
13252			self = this,
13253			off = url.indexOf(" ");
13254
13255		if (off > -1) {
13256			selector = stripAndCollapse(url.slice(off));
13257			url = url.slice(0, off);
13258		}
13259
13260		// If it's a function
13261		if (isFunction(params)) {
13262
13263			// We assume that it's the callback
13264			callback = params;
13265			params = undefined;
13266
13267			// Otherwise, build a param string
13268		} else if (params && typeof params === "object") {
13269			type = "POST";
13270		}
13271
13272		// If we have elements to modify, make the request
13273		if (self.length > 0) {
13274			jQuery.ajax({
13275				url: url,
13276
13277				// If "type" variable is undefined, then "GET" method will be used.
13278				// Make value of this field explicit since
13279				// user can override it through ajaxSetup method
13280				type: type || "GET",
13281				dataType: "html",
13282				data: params
13283			}).done(function (responseText) {
13284
13285				// Save response for use in complete callback
13286				response = arguments;
13287
13288				self.html(selector ?
13289
13290					// If a selector was specified, locate the right elements in a dummy div
13291					// Exclude scripts to avoid IE 'Permission Denied' errors
13292					jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
13293
13294					// Otherwise use the full result
13295					responseText);
13296
13297				// If the request succeeds, this function gets "data", "status", "jqXHR"
13298				// but they are ignored because response was set above.
13299				// If it fails, this function gets "jqXHR", "status", "error"
13300			}).always(callback && function (jqXHR, status) {
13301				self.each(function () {
13302					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
13303				});
13304			});
13305		}
13306
13307		return this;
13308	};
13309
13310
13311
13312
13313	jQuery.expr.pseudos.animated = function (elem) {
13314		return jQuery.grep(jQuery.timers, function (fn) {
13315			return elem === fn.elem;
13316		}).length;
13317	};
13318
13319
13320
13321
13322	jQuery.offset = {
13323		setOffset: function (elem, options, i) {
13324			var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, 
vendor: 6,870 bytes, lines 13324-13542
13324calculatePosition,
13325				position = jQuery.css(elem, "position"),
13326				curElem = jQuery(elem),
13327				props = {};
13328
13329			// Set position first, in-case top/left are set even on static elem
13330			if (position === "static") {
13331				elem.style.position = "relative";
13332			}
13333
13334			curOffset = curElem.offset();
13335			curCSSTop = jQuery.css(elem, "top");
13336			curCSSLeft = jQuery.css(elem, "left");
13337			calculatePosition = (position === "absolute" || position === "fixed") &&
13338				(curCSSTop + curCSSLeft).indexOf("auto") > -1;
13339
13340			// Need to be able to calculate position if either
13341			// top or left is auto and position is either absolute or fixed
13342			if (calculatePosition) {
13343				curPosition = curElem.position();
13344				curTop = curPosition.top;
13345				curLeft = curPosition.left;
13346
13347			} else {
13348				curTop = parseFloat(curCSSTop) || 0;
13349				curLeft = parseFloat(curCSSLeft) || 0;
13350			}
13351
13352			if (isFunction(options)) {
13353
13354				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
13355				options = options.call(elem, i, jQuery.extend({}, curOffset));
13356			}
13357
13358			if (options.top != null) {
13359				props.top = (options.top - curOffset.top) + curTop;
13360			}
13361			if (options.left != null) {
13362				props.left = (options.left - curOffset.left) + curLeft;
13363			}
13364
13365			if ("using" in options) {
13366				options.using.call(elem, props);
13367
13368			} else {
13369				if (typeof props.top === "number") {
13370					props.top += "px";
13371				}
13372				if (typeof props.left === "number") {
13373					props.left += "px";
13374				}
13375				curElem.css(props);
13376			}
13377		}
13378	};
13379
13380	jQuery.fn.extend({
13381
13382		// offset() relates an element's border box to the document origin
13383		offset: function (options) {
13384
13385			// Preserve chaining for setter
13386			if (arguments.length) {
13387				return options === undefined ?
13388					this :
13389					this.each(function (i) {
13390						jQuery.offset.setOffset(this, options, i);
13391					});
13392			}
13393
13394			var rect, win,
13395				elem = this[0];
13396
13397			if (!elem) {
13398				return;
13399			}
13400
13401			// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
13402			// Support: IE <=11 only
13403			// Running getBoundingClientRect on a
13404			// disconnected node in IE throws an error
13405			if (!elem.getClientRects().length) {
13406				return { top: 0, left: 0 };
13407			}
13408
13409			// Get document-relative position by adding viewport scroll to viewport-relative gBCR
13410			rect = elem.getBoundingClientRect();
13411			win = elem.ownerDocument.defaultView;
13412			return {
13413				top: rect.top + win.pageYOffset,
13414				left: rect.left + win.pageXOffset
13415			};
13416		},
13417
13418		// position() relates an element's margin box to its offset parent's padding box
13419		// This corresponds to the behavior of CSS absolute positioning
13420		position: function () {
13421			if (!this[0]) {
13422				return;
13423			}
13424
13425			var offsetParent, offset, doc,
13426				elem = this[0],
13427				parentOffset = { top: 0, left: 0 };
13428
13429			// position:fixed elements are offset from the viewport, which itself always has zero offset
13430			if (jQuery.css(elem, "position") === "fixed") {
13431
13432				// Assume position:fixed implies availability of getBoundingClientRect
13433				offset = elem.getBoundingClientRect();
13434
13435			} else {
13436				offset = this.offset();
13437
13438				// Account for the *real* offset parent, which can be the document or its root element
13439				// when a statically positioned element is identified
13440				doc = elem.ownerDocument;
13441				offsetParent = elem.offsetParent || doc.documentElement;
13442				while (offsetParent &&
13443					(offsetParent === doc.body || offsetParent === doc.documentElement) &&
13444					jQuery.css(offsetParent, "position") === "static") {
13445
13446					offsetParent = offsetParent.parentNode;
13447				}
13448				if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
13449
13450					// Incorporate borders into its offset, since they are outside its content origin
13451					parentOffset = jQuery(offsetParent).offset();
13452					parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
13453					parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
13454				}
13455			}
13456
13457			// Subtract parent offsets and element margins
13458			return {
13459				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
13460				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
13461			};
13462		},
13463
13464		// This method will return documentElement in the following cases:
13465		// 1) For the element inside the iframe without offsetParent, this method will return
13466		//    documentElement of the parent window
13467		// 2) For the hidden or detached element
13468		// 3) For body or html element, i.e. in case of the html node - it will return itself
13469		//
13470		// but those exceptions were never presented as a real life use-cases
13471		// and might be considered as more preferable results.
13472		//
13473		// This logic, however, is not guaranteed and can change at any point in the future
13474		offsetParent: function () {
13475			return this.map(function () {
13476				var offsetParent = this.offsetParent;
13477
13478				while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
13479					offsetParent = offsetParent.offsetParent;
13480				}
13481
13482				return offsetParent || documentElement;
13483			});
13484		}
13485	});
13486
13487	// Create scrollLeft and scrollTop methods
13488	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
13489		var top = "pageYOffset" === prop;
13490
13491		jQuery.fn[method] = function (val) {
13492			return access(this, function (elem, method, val) {
13493
13494				// Coalesce documents and windows
13495				var win;
13496				if (isWindow(elem)) {
13497					win = elem;
13498				} else if (elem.nodeType === 9) {
13499					win = elem.defaultView;
13500				}
13501
13502				if (val === undefined) {
13503					return win ? win[prop] : elem[method];
13504				}
13505
13506				if (win) {
13507					win.scrollTo(
13508						!top ? val : win.pageXOffset,
13509						top ? val : win.pageYOffset
13510					);
13511
13512				} else {
13513					elem[method] = val;
13514				}
13515			}, method, val, arguments.length);
13516		};
13517	});
13518
13519	// Support: Safari <=7 - 9.1, Chrome <=37 - 49
13520	// Add the top/left cssHooks using jQuery.fn.position
13521	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
13522	// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
13523	// getComputedStyle returns percent when specified for top/left/bottom/right;
13524	// rather than make the css module depend on the offset module, just check for it here
13525	jQuery.each(["top", "left"], function (_i, prop) {
13526		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition,
13527			function (elem, computed) {
13528				if (computed) {
13529					computed = curCSS(elem, prop);
13530
13531					// If curCSS returns percentage, fallback to offset
13532					return rnumnonpx.test(computed) ?
13533						jQuery(elem).position()[prop] + "px" :
13534						computed;
13535				}
13536			}
13537		);
13538	});
13539
13540
13541	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
13542	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
vendor: 9,830 bytes, lines 13543-13901
13543		jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name },
13544			function (defaultExtra, funcName) {
13545
13546				// Margin is only for outerHeight, outerWidth
13547				jQuery.fn[funcName] = function (margin, value) {
13548					var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
13549						extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
13550
13551					return access(this, function (elem, type, value) {
13552						var doc;
13553
13554						if (isWindow(elem)) {
13555
13556							// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
13557							return funcName.indexOf("outer") === 0 ?
13558								elem["inner" + name] :
13559								elem.document.documentElement["client" + name];
13560						}
13561
13562						// Get document width or height
13563						if (elem.nodeType === 9) {
13564							doc = elem.documentElement;
13565
13566							// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
13567							// whichever is greatest
13568							return Math.max(
13569								elem.body["scroll" + name], doc["scroll" + name],
13570								elem.body["offset" + name], doc["offset" + name],
13571								doc["client" + name]
13572							);
13573						}
13574
13575						return value === undefined ?
13576
13577							// Get width or height on the element, requesting but not forcing parseFloat
13578							jQuery.css(elem, type, extra) :
13579
13580							// Set width or height on the element
13581							jQuery.style(elem, type, value, extra);
13582					}, type, chainable ? margin : undefined, chainable);
13583				};
13584			});
13585	});
13586
13587
13588	jQuery.each([
13589		"ajaxStart",
13590		"ajaxStop",
13591		"ajaxComplete",
13592		"ajaxError",
13593		"ajaxSuccess",
13594		"ajaxSend"
13595	], function (_i, type) {
13596		jQuery.fn[type] = function (fn) {
13597			return this.on(type, fn);
13598		};
13599	});
13600
13601
13602
13603
13604	jQuery.fn.extend({
13605
13606		bind: function (types, data, fn) {
13607			return this.on(types, null, data, fn);
13608		},
13609		unbind: function (types, fn) {
13610			return this.off(types, null, fn);
13611		},
13612
13613		delegate: function (selector, types, data, fn) {
13614			return this.on(types, selector, data, fn);
13615		},
13616		undelegate: function (selector, types, fn) {
13617
13618			// ( namespace ) or ( selector, types [, fn] )
13619			return arguments.length === 1 ?
13620				this.off(selector, "**") :
13621				this.off(types, selector || "**", fn);
13622		},
13623
13624		hover: function (fnOver, fnOut) {
13625			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
13626		}
13627	});
13628
13629	jQuery.each(("blur focus focusin focusout resize scroll click dblclick " +
13630		"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
13631		"change select submit keydown keypress keyup contextmenu").split(" "),
13632		function (_i, name) {
13633
13634			// Handle event binding
13635			jQuery.fn[name] = function (data, fn) {
13636				return arguments.length > 0 ?
13637					this.on(name, null, data, fn) :
13638					this.trigger(name);
13639			};
13640		});
13641
13642
13643
13644
13645	// Support: Android <=4.0 only
13646	// Make sure we trim BOM and NBSP
13647	var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
13648
13649	// Bind a function to a context, optionally partially applying any
13650	// arguments.
13651	// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
13652	// However, it is not slated for removal any time soon
13653	jQuery.proxy = function (fn, context) {
13654		var tmp, args, proxy;
13655
13656		if (typeof context === "string") {
13657			tmp = fn[context];
13658			context = fn;
13659			fn = tmp;
13660		}
13661
13662		// Quick check to determine if target is callable, in the spec
13663		// this throws a TypeError, but we will just return undefined.
13664		if (!isFunction(fn)) {
13665			return undefined;
13666		}
13667
13668		// Simulated bind
13669		args = slice.call(arguments, 2);
13670		proxy = function () {
13671			return fn.apply(context || this, args.concat(slice.call(arguments)));
13672		};
13673
13674		// Set the guid of unique handler to the same of original handler, so it can be removed
13675		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
13676
13677		return proxy;
13678	};
13679
13680	jQuery.holdReady = function (hold) {
13681		if (hold) {
13682			jQuery.readyWait++;
13683		} else {
13684			jQuery.ready(true);
13685		}
13686	};
13687	jQuery.isArray = Array.isArray;
13688	jQuery.parseJSON = JSON.parse;
13689	jQuery.nodeName = nodeName;
13690	jQuery.isFunction = isFunction;
13691	jQuery.isWindow = isWindow;
13692	jQuery.camelCase = camelCase;
13693	jQuery.type = toType;
13694
13695	jQuery.now = Date.now;
13696
13697	jQuery.isNumeric = function (obj) {
13698
13699		// As of jQuery 3.0, isNumeric is limited to
13700		// strings and numbers (primitives or objects)
13701		// that can be coerced to finite numbers (gh-2662)
13702		var type = jQuery.type(obj);
13703		return (type === "number" || type === "string") &&
13704
13705			// parseFloat NaNs numeric-cast false positives ("")
13706			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
13707			// subtraction forces infinities to NaN
13708			!isNaN(obj - parseFloat(obj));
13709	};
13710
13711	jQuery.trim = function (text) {
13712		return text == null ?
13713			"" :
13714			(text + "").replace(rtrim, "");
13715	};
13716
13717
13718
13719	// Register as a named AMD module, since jQuery can be concatenated with other
13720	// files that may use define, but not via a proper concatenation script that
13721	// understands anonymous AMD modules. A named AMD is safest and most robust
13722	// way to register. Lowercase jquery is used because AMD module names are
13723	// derived from file names, and jQuery is normally delivered in a lowercase
13724	// file name. Do this after creating the global so that if an AMD module wants
13725	// to call noConflict to hide this version of jQuery, it will work.
13726
13727	// Note that for maximum portability, libraries that are not jQuery should
13728	// declare themselves as anonymous modules, and avoid setting a global if an
13729	// AMD loader is present. jQuery is a special case. For more information, see
13730	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
13731
13732	if (typeof define === "function" && define.amd) {
13733		define("jquery", [], function () {
13734			return jQuery;
13735		});
13736	}
13737
13738
13739
13740
13741	var
13742
13743		// Map over jQuery in case of overwrite
13744		_jQuery = window.jQuery,
13745
13746		// Map over the $ in case of overwrite
13747		_$ = window.$;
13748
13749	jQuery.noConflict = function (deep) {
13750		if (window.$ === jQuery) {
13751			window.$ = _$;
13752		}
13753
13754		if (deep && window.jQuery === jQuery) {
13755			window.jQuery = _jQuery;
13756		}
13757
13758		return jQuery;
13759	};
13760
13761	// Expose jQuery and $ identifiers, even in AMD
13762	// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
13763	// and CommonJS for browser emulators (#13566)
13764	if (typeof noGlobal === "undefined") {
13765		window.jQuery = window.$ = jQuery;
13766	}
13767
13768
13769
13770
13771	return jQuery;
13772});
13773
13774/***/ }),
13775/* 12 */
13776/***/ (function(module, exports, __webpack_require__) {
13777
13778var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
13779 * Outlayer Item
13780 */
13781
13782( function( window, factory ) {
13783  // universal module definition
13784  /* jshint strict: false */ /* globals define, module, require */
13785  if ( true ) {
13786    // AMD - RequireJS
13787    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
13788        __webpack_require__(7),
13789        __webpack_require__(1)
13790      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
13791				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
13792				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
13793				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
13794  } else if ( typeof module == 'object' && module.exports ) {
13795    // CommonJS - Browserify, Webpack
13796    module.exports = factory(
13797      require('ev-emitter'),
13798      require('get-size')
13799    );
13800  } else {
13801    // browser global
13802    window.Outlayer = {};
13803    window.Outlayer.Item = factory(
13804      window.EvEmitter,
13805      window.getSize
13806    );
13807  }
13808
13809}( window, function factory( EvEmitter, getSize ) {
13810'use strict';
13811
13812// ----- helpers ----- //
13813
13814function isEmptyObj( obj ) {
13815  for ( var prop in obj ) {
13816    return false;
13817  }
13818  prop = null;
13819  return true;
13820}
13821
13822// -------------------------- CSS3 support -------------------------- //
13823
13824
13825var docElemStyle = document.documentElement.style;
13826
13827var transitionProperty = typeof docElemStyle.transition == 'string' ?
13828  'transition' : 'WebkitTransition';
13829var transformProperty = typeof docElemStyle.transform == 'string' ?
13830  'transform' : 'WebkitTransform';
13831
13832var transitionEndEvent = {
13833  WebkitTransition: 'webkitTransitionEnd',
13834  transition: 'transitionend'
13835}[ transitionProperty ];
13836
13837// cache all vendor properties that could have vendor prefix
13838var vendorProperties = {
13839  transform: transformProperty,
13840  transition: transitionProperty,
13841  transitionDuration: transitionProperty + 'Duration',
13842  transitionProperty: transitionProperty + 'Property',
13843  transitionDelay: transitionProperty + 'Delay'
13844};
13845
13846// -------------------------- Item -------------------------- //
13847
13848function Item( element, layout ) {
13849  if ( !element ) {
13850    return;
13851  }
13852
13853  this.element = element;
13854  // parent layout class, i.e. Masonry, Isotope, or Packery
13855  this.layout = layout;
13856  this.position = {
13857    x: 0,
13858    y: 0
13859  };
13860
13861  this._create();
13862}
13863
13864// inherit EvEmitter
13865var proto = Item.prototype = Object.create( EvEmitter.prototype );
13866proto.constructor = Item;
13867
13868proto._create = function() {
13869  // transition objects
13870  this._transn = {
13871    ingProperties: {},
13872    clean: {},
13873    onEnd: {}
13874  };
13875
13876  this.css({
13877    position: 'absolute'
13878  });
13879};
13880
13881// trigger specified handler for event type
13882proto.handleEvent = function( event ) {
13883  var method = 'on' + event.type;
13884  if ( this[ method ] ) {
13885    this[ method ]( event );
13886  }
13887};
13888
13889proto.getSize = function() {
13890  this.size = getSize( this.element );
13891};
13892
13893/**
13894 * apply CSS styles to element
13895 * @param {Object} style
13896 */
13897proto.css = function( style ) {
13898  var elemStyle = this.element.style;
13899
13900  for ( var prop in style ) {
13901    // use vendor property if available
vendor: 6,640 bytes, lines 13902-14119
13902    var supportedProp = vendorProperties[ prop ] || prop;
13903    elemStyle[ supportedProp ] = style[ prop ];
13904  }
13905};
13906
13907 // measure position, and sets it
13908proto.getPosition = function() {
13909  var style = getComputedStyle( this.element );
13910  var isOriginLeft = this.layout._getOption('originLeft');
13911  var isOriginTop = this.layout._getOption('originTop');
13912  var xValue = style[ isOriginLeft ? 'left' : 'right' ];
13913  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
13914  var x = parseFloat( xValue );
13915  var y = parseFloat( yValue );
13916  // convert percent to pixels
13917  var layoutSize = this.layout.size;
13918  if ( xValue.indexOf('%') != -1 ) {
13919    x = ( x / 100 ) * layoutSize.width;
13920  }
13921  if ( yValue.indexOf('%') != -1 ) {
13922    y = ( y / 100 ) * layoutSize.height;
13923  }
13924  // clean up 'auto' or other non-integer values
13925  x = isNaN( x ) ? 0 : x;
13926  y = isNaN( y ) ? 0 : y;
13927  // remove padding from measurement
13928  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
13929  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
13930
13931  this.position.x = x;
13932  this.position.y = y;
13933};
13934
13935// set settled position, apply padding
13936proto.layoutPosition = function() {
13937  var layoutSize = this.layout.size;
13938  var style = {};
13939  var isOriginLeft = this.layout._getOption('originLeft');
13940  var isOriginTop = this.layout._getOption('originTop');
13941
13942  // x
13943  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
13944  var xProperty = isOriginLeft ? 'left' : 'right';
13945  var xResetProperty = isOriginLeft ? 'right' : 'left';
13946
13947  var x = this.position.x + layoutSize[ xPadding ];
13948  // set in percentage or pixels
13949  style[ xProperty ] = this.getXValue( x );
13950  // reset other property
13951  style[ xResetProperty ] = '';
13952
13953  // y
13954  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
13955  var yProperty = isOriginTop ? 'top' : 'bottom';
13956  var yResetProperty = isOriginTop ? 'bottom' : 'top';
13957
13958  var y = this.position.y + layoutSize[ yPadding ];
13959  // set in percentage or pixels
13960  style[ yProperty ] = this.getYValue( y );
13961  // reset other property
13962  style[ yResetProperty ] = '';
13963
13964  this.css( style );
13965  this.emitEvent( 'layout', [ this ] );
13966};
13967
13968proto.getXValue = function( x ) {
13969  var isHorizontal = this.layout._getOption('horizontal');
13970  return this.layout.options.percentPosition && !isHorizontal ?
13971    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
13972};
13973
13974proto.getYValue = function( y ) {
13975  var isHorizontal = this.layout._getOption('horizontal');
13976  return this.layout.options.percentPosition && isHorizontal ?
13977    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
13978};
13979
13980proto._transitionTo = function( x, y ) {
13981  this.getPosition();
13982  // get current x & y from top/left
13983  var curX = this.position.x;
13984  var curY = this.position.y;
13985
13986  var didNotMove = x == this.position.x && y == this.position.y;
13987
13988  // save end position
13989  this.setPosition( x, y );
13990
13991  // if did not move and not transitioning, just go to layout
13992  if ( didNotMove && !this.isTransitioning ) {
13993    this.layoutPosition();
13994    return;
13995  }
13996
13997  var transX = x - curX;
13998  var transY = y - curY;
13999  var transitionStyle = {};
14000  transitionStyle.transform = this.getTranslate( transX, transY );
14001
14002  this.transition({
14003    to: transitionStyle,
14004    onTransitionEnd: {
14005      transform: this.layoutPosition
14006    },
14007    isCleaning: true
14008  });
14009};
14010
14011proto.getTranslate = function( x, y ) {
14012  // flip cooridinates if origin on right or bottom
14013  var isOriginLeft = this.layout._getOption('originLeft');
14014  var isOriginTop = this.layout._getOption('originTop');
14015  x = isOriginLeft ? x : -x;
14016  y = isOriginTop ? y : -y;
14017  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
14018};
14019
14020// non transition + transform support
14021proto.goTo = function( x, y ) {
14022  this.setPosition( x, y );
14023  this.layoutPosition();
14024};
14025
14026proto.moveTo = proto._transitionTo;
14027
14028proto.setPosition = function( x, y ) {
14029  this.position.x = parseFloat( x );
14030  this.position.y = parseFloat( y );
14031};
14032
14033// ----- transition ----- //
14034
14035/**
14036 * @param {Object} style - CSS
14037 * @param {Function} onTransitionEnd
14038 */
14039
14040// non transition, just trigger callback
14041proto._nonTransition = function( args ) {
14042  this.css( args.to );
14043  if ( args.isCleaning ) {
14044    this._removeStyles( args.to );
14045  }
14046  for ( var prop in args.onTransitionEnd ) {
14047    args.onTransitionEnd[ prop ].call( this );
14048  }
14049};
14050
14051/**
14052 * proper transition
14053 * @param {Object} args - arguments
14054 *   @param {Object} to - style to transition to
14055 *   @param {Object} from - style to start transition from
14056 *   @param {Boolean} isCleaning - removes transition styles after transition
14057 *   @param {Function} onTransitionEnd - callback
14058 */
14059proto.transition = function( args ) {
14060  // redirect to nonTransition if no transition duration
14061  if ( !parseFloat( this.layout.options.transitionDuration ) ) {
14062    this._nonTransition( args );
14063    return;
14064  }
14065
14066  var _transition = this._transn;
14067  // keep track of onTransitionEnd callback by css property
14068  for ( var prop in args.onTransitionEnd ) {
14069    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
14070  }
14071  // keep track of properties that are transitioning
14072  for ( prop in args.to ) {
14073    _transition.ingProperties[ prop ] = true;
14074    // keep track of properties to clean up when transition is done
14075    if ( args.isCleaning ) {
14076      _transition.clean[ prop ] = true;
14077    }
14078  }
14079
14080  // set from styles
14081  if ( args.from ) {
14082    this.css( args.from );
14083    // force redraw. http://blog.alexmaccaw.com/css-transitions
14084    var h = this.element.offsetHeight;
14085    // hack for JSHint to hush about unused var
14086    h = null;
14087  }
14088  // enable transition
14089  this.enableTransition( args.to );
14090  // set styles that are transitioning
14091  this.css( args.to );
14092
14093  this.isTransitioning = true;
14094
14095};
14096
14097// dash before all cap letters, including first for
14098// WebkitTransform => -webkit-transform
14099function toDashedAll( str ) {
14100  return str.replace( /([A-Z])/g, function( $1 ) {
14101    return '-' + $1.toLowerCase();
14102  });
14103}
14104
14105var transitionProps = 'opacity,' + toDashedAll( transformProperty );
14106
14107proto.enableTransition = function(/* style */) {
14108  // HACK changing transitionProperty during a transition
14109  // will cause transition to jump
14110  if ( this.isTransitioning ) {
14111    return;
14112  }
14113
14114  // make `transition: foo, bar, baz` from style object
14115  // HACK un-comment this when enableTransition can work
14116  // while a transition is happening
14117  // var transitionValues = [];
14118  // for ( var prop in style ) {
14119  //   // dash-ify camelCased properties like WebkitTransition
vendor: 6,785 bytes, lines 14120-14366
14120  //   prop = vendorProperties[ prop ] || prop;
14121  //   transitionValues.push( toDashedAll( prop ) );
14122  // }
14123  // munge number to millisecond, to match stagger
14124  var duration = this.layout.options.transitionDuration;
14125  duration = typeof duration == 'number' ? duration + 'ms' : duration;
14126  // enable transition styles
14127  this.css({
14128    transitionProperty: transitionProps,
14129    transitionDuration: duration,
14130    transitionDelay: this.staggerDelay || 0
14131  });
14132  // listen for transition end event
14133  this.element.addEventListener( transitionEndEvent, this, false );
14134};
14135
14136// ----- events ----- //
14137
14138proto.onwebkitTransitionEnd = function( event ) {
14139  this.ontransitionend( event );
14140};
14141
14142proto.onotransitionend = function( event ) {
14143  this.ontransitionend( event );
14144};
14145
14146// properties that I munge to make my life easier
14147var dashedVendorProperties = {
14148  '-webkit-transform': 'transform'
14149};
14150
14151proto.ontransitionend = function( event ) {
14152  // disregard bubbled events from children
14153  if ( event.target !== this.element ) {
14154    return;
14155  }
14156  var _transition = this._transn;
14157  // get property name of transitioned property, convert to prefix-free
14158  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
14159
14160  // remove property that has completed transitioning
14161  delete _transition.ingProperties[ propertyName ];
14162  // check if any properties are still transitioning
14163  if ( isEmptyObj( _transition.ingProperties ) ) {
14164    // all properties have completed transitioning
14165    this.disableTransition();
14166  }
14167  // clean style
14168  if ( propertyName in _transition.clean ) {
14169    // clean up style
14170    this.element.style[ event.propertyName ] = '';
14171    delete _transition.clean[ propertyName ];
14172  }
14173  // trigger onTransitionEnd callback
14174  if ( propertyName in _transition.onEnd ) {
14175    var onTransitionEnd = _transition.onEnd[ propertyName ];
14176    onTransitionEnd.call( this );
14177    delete _transition.onEnd[ propertyName ];
14178  }
14179
14180  this.emitEvent( 'transitionEnd', [ this ] );
14181};
14182
14183proto.disableTransition = function() {
14184  this.removeTransitionStyles();
14185  this.element.removeEventListener( transitionEndEvent, this, false );
14186  this.isTransitioning = false;
14187};
14188
14189/**
14190 * removes style property from element
14191 * @param {Object} style
14192**/
14193proto._removeStyles = function( style ) {
14194  // clean up transition styles
14195  var cleanStyle = {};
14196  for ( var prop in style ) {
14197    cleanStyle[ prop ] = '';
14198  }
14199  this.css( cleanStyle );
14200};
14201
14202var cleanTransitionStyle = {
14203  transitionProperty: '',
14204  transitionDuration: '',
14205  transitionDelay: ''
14206};
14207
14208proto.removeTransitionStyles = function() {
14209  // remove transition
14210  this.css( cleanTransitionStyle );
14211};
14212
14213// ----- stagger ----- //
14214
14215proto.stagger = function( delay ) {
14216  delay = isNaN( delay ) ? 0 : delay;
14217  this.staggerDelay = delay + 'ms';
14218};
14219
14220// ----- show/hide/remove ----- //
14221
14222// remove element from DOM
14223proto.removeElem = function() {
14224  this.element.parentNode.removeChild( this.element );
14225  // remove display: none
14226  this.css({ display: '' });
14227  this.emitEvent( 'remove', [ this ] );
14228};
14229
14230proto.remove = function() {
14231  // just remove element if no transition support or no transition
14232  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
14233    this.removeElem();
14234    return;
14235  }
14236
14237  // start transition
14238  this.once( 'transitionEnd', function() {
14239    this.removeElem();
14240  });
14241  this.hide();
14242};
14243
14244proto.reveal = function() {
14245  delete this.isHidden;
14246  // remove display: none
14247  this.css({ display: '' });
14248
14249  var options = this.layout.options;
14250
14251  var onTransitionEnd = {};
14252  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
14253  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
14254
14255  this.transition({
14256    from: options.hiddenStyle,
14257    to: options.visibleStyle,
14258    isCleaning: true,
14259    onTransitionEnd: onTransitionEnd
14260  });
14261};
14262
14263proto.onRevealTransitionEnd = function() {
14264  // check if still visible
14265  // during transition, item may have been hidden
14266  if ( !this.isHidden ) {
14267    this.emitEvent('reveal');
14268  }
14269};
14270
14271/**
14272 * get style property use for hide/reveal transition end
14273 * @param {String} styleProperty - hiddenStyle/visibleStyle
14274 * @returns {String}
14275 */
14276proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
14277  var optionStyle = this.layout.options[ styleProperty ];
14278  // use opacity
14279  if ( optionStyle.opacity ) {
14280    return 'opacity';
14281  }
14282  // get first property
14283  for ( var prop in optionStyle ) {
14284    return prop;
14285  }
14286};
14287
14288proto.hide = function() {
14289  // set flag
14290  this.isHidden = true;
14291  // remove display: none
14292  this.css({ display: '' });
14293
14294  var options = this.layout.options;
14295
14296  var onTransitionEnd = {};
14297  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
14298  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
14299
14300  this.transition({
14301    from: options.visibleStyle,
14302    to: options.hiddenStyle,
14303    // keep hidden stuff hidden
14304    isCleaning: true,
14305    onTransitionEnd: onTransitionEnd
14306  });
14307};
14308
14309proto.onHideTransitionEnd = function() {
14310  // check if still hidden
14311  // during transition, item may have been un-hidden
14312  if ( this.isHidden ) {
14313    this.css({ display: 'none' });
14314    this.emitEvent('hide');
14315  }
14316};
14317
14318proto.destroy = function() {
14319  this.css({
14320    position: '',
14321    left: '',
14322    right: '',
14323    top: '',
14324    bottom: '',
14325    transition: '',
14326    transform: ''
14327  });
14328};
14329
14330return Item;
14331
14332}));
14333
14334
14335/***/ }),
14336/* 13 */
14337/***/ (function(module, exports, __webpack_require__) {
14338
14339var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
14340 * Masonry layout mode
14341 * sub-classes Masonry
14342 * https://masonry.desandro.com
14343 */
14344
14345( function( window, factory ) {
14346  // universal module definition
14347  /* jshint strict: false */ /*globals define, module, require */
14348  if ( true ) {
14349    // AMD
14350    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
14351        __webpack_require__(3),
14352        __webpack_require__(14)
14353      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14354				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14355				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14356				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14357  } else if ( typeof module == 'object' && module.exports ) {
14358    // CommonJS
14359    module.exports = factory(
14360      require('../layout-mode'),
14361      require('masonry-layout')
14362    );
14363  } else {
14364    // browser global
14365    factory(
14366      window.Isotope.LayoutMode,
14367      window.Masonry
14368    );
14369  }
14370
14371}( window, function factory( LayoutMode, Masonry ) {
14372'use strict';
14373
14374// -------------------------- masonryDefinition -------------------------- //
14375
14376  // create an Outlayer layout class
14377  var MasonryMode = LayoutMode.create('masonry');
14378
14379  var proto = MasonryMode.prototype;
14380
14381  var keepModeMethods = {
14382    _getElementOffset: true,
14383    layout: true,
14384    _getMeasurement: true
14385  };
14386
14387  // inherit Masonry prototype
14388  for ( var method in Masonry.prototype ) {
14389    // do not inherit mode methods
14390    if ( !keepModeMethods[ method ] ) {
14391      proto[ method ] = Masonry.prototype[ method ];
14392    }
14393  }
14394
14395  var measureColumns = proto.measureColumns;
14396  proto.measureColumns = function() {
14397    // set items, used if measuring first item
14398    this.items = this.isotope.filteredItems;
14399    measureColumns.call( this );
14400  };
14401
14402  // point to mode options for fitWidth
14403  var _getOption = proto._getOption;
14404  proto._getOption = function( option ) {
14405    if ( option == 'fitWidth' ) {
14406      return this.options.isFitWidth !== undefined ?
14407        this.options.isFitWidth : this.options.fitWidth;
14408    }
14409    return _getOption.apply( this.isotope, arguments );
14410  };
14411
14412  return MasonryMode;
14413
14414}));
14415
14416
14417/***/ }),
14418/* 14 */
14419/***/ (function(module, exports, __webpack_require__) {
14420
14421var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
14422 * Masonry v4.2.1
14423 * Cascading grid layout library
14424 * https://masonry.desandro.com
14425 * MIT License
14426 * by David DeSandro
14427 */
14428
14429( function( window, factory ) {
14430  // universal module definition
14431  /* jshint strict: false */ /*globals define, module, require */
14432  if ( true ) {
14433    // AMD
14434    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
14435        __webpack_require__(2),
14436        __webpack_require__(1)
14437      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14438				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14439				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14440				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14441  } else if ( typeof module == 'object' && module.exports ) {
14442    // CommonJS
14443    module.exports = factory(
14444      require('outlayer'),
14445      require('get-size')
14446    );
14447  } else {
14448    // browser global
14449    window.Masonry = factory(
14450      window.Outlayer,
14451      window.getSize
14452    );
14453  }
14454
14455}( window, function factory( Outlayer, getSize ) {
14456
14457'use strict';
14458
14459// -------------------------- masonryDefinition -------------------------- //
14460
14461  // create an Outlayer layout class
14462  var Masonry = Outlayer.create('masonry');
14463  // isFitWidth -> fitWidth
vendor: 8,661 bytes, lines 14464-14733
14464  Masonry.compatOptions.fitWidth = 'isFitWidth';
14465
14466  var proto = Masonry.prototype;
14467
14468  proto._resetLayout = function() {
14469    this.getSize();
14470    this._getMeasurement( 'columnWidth', 'outerWidth' );
14471    this._getMeasurement( 'gutter', 'outerWidth' );
14472    this.measureColumns();
14473
14474    // reset column Y
14475    this.colYs = [];
14476    for ( var i=0; i < this.cols; i++ ) {
14477      this.colYs.push( 0 );
14478    }
14479
14480    this.maxY = 0;
14481    this.horizontalColIndex = 0;
14482  };
14483
14484  proto.measureColumns = function() {
14485    this.getContainerWidth();
14486    // if columnWidth is 0, default to outerWidth of first item
14487    if ( !this.columnWidth ) {
14488      var firstItem = this.items[0];
14489      var firstItemElem = firstItem && firstItem.element;
14490      // columnWidth fall back to item of first element
14491      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
14492        // if first elem has no width, default to size of container
14493        this.containerWidth;
14494    }
14495
14496    var columnWidth = this.columnWidth += this.gutter;
14497
14498    // calculate columns
14499    var containerWidth = this.containerWidth + this.gutter;
14500    var cols = containerWidth / columnWidth;
14501    // fix rounding errors, typically with gutters
14502    var excess = columnWidth - containerWidth % columnWidth;
14503    // if overshoot is less than a pixel, round up, otherwise floor it
14504    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
14505    cols = Math[ mathMethod ]( cols );
14506    this.cols = Math.max( cols, 1 );
14507  };
14508
14509  proto.getContainerWidth = function() {
14510    // container is parent if fit width
14511    var isFitWidth = this._getOption('fitWidth');
14512    var container = isFitWidth ? this.element.parentNode : this.element;
14513    // check that this.size and size are there
14514    // IE8 triggers resize on body size change, so they might not be
14515    var size = getSize( container );
14516    this.containerWidth = size && size.innerWidth;
14517  };
14518
14519  proto._getItemLayoutPosition = function( item ) {
14520    item.getSize();
14521    // how many columns does this brick span
14522    var remainder = item.size.outerWidth % this.columnWidth;
14523    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
14524    // round if off by 1 pixel, otherwise use ceil
14525    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
14526    colSpan = Math.min( colSpan, this.cols );
14527    // use horizontal or top column position
14528    var colPosMethod = this.options.horizontalOrder ?
14529      '_getHorizontalColPosition' : '_getTopColPosition';
14530    var colPosition = this[ colPosMethod ]( colSpan, item );
14531    // position the brick
14532    var position = {
14533      x: this.columnWidth * colPosition.col,
14534      y: colPosition.y
14535    };
14536    // apply setHeight to necessary columns
14537    var setHeight = colPosition.y + item.size.outerHeight;
14538    var setMax = colSpan + colPosition.col;
14539    for ( var i = colPosition.col; i < setMax; i++ ) {
14540      this.colYs[i] = setHeight;
14541    }
14542
14543    return position;
14544  };
14545
14546  proto._getTopColPosition = function( colSpan ) {
14547    var colGroup = this._getTopColGroup( colSpan );
14548    // get the minimum Y value from the columns
14549    var minimumY = Math.min.apply( Math, colGroup );
14550
14551    return {
14552      col: colGroup.indexOf( minimumY ),
14553      y: minimumY,
14554    };
14555  };
14556
14557  /**
14558   * @param {Number} colSpan - number of columns the element spans
14559   * @returns {Array} colGroup
14560   */
14561  proto._getTopColGroup = function( colSpan ) {
14562    if ( colSpan < 2 ) {
14563      // if brick spans only one column, use all the column Ys
14564      return this.colYs;
14565    }
14566
14567    var colGroup = [];
14568    // how many different places could this brick fit horizontally
14569    var groupCount = this.cols + 1 - colSpan;
14570    // for each group potential horizontal position
14571    for ( var i = 0; i < groupCount; i++ ) {
14572      colGroup[i] = this._getColGroupY( i, colSpan );
14573    }
14574    return colGroup;
14575  };
14576
14577  proto._getColGroupY = function( col, colSpan ) {
14578    if ( colSpan < 2 ) {
14579      return this.colYs[ col ];
14580    }
14581    // make an array of colY values for that one group
14582    var groupColYs = this.colYs.slice( col, col + colSpan );
14583    // and get the max value of the array
14584    return Math.max.apply( Math, groupColYs );
14585  };
14586
14587  // get column position based on horizontal index. #873
14588  proto._getHorizontalColPosition = function( colSpan, item ) {
14589    var col = this.horizontalColIndex % this.cols;
14590    var isOver = colSpan > 1 && col + colSpan > this.cols;
14591    // shift to next row if item can't fit on current row
14592    col = isOver ? 0 : col;
14593    // don't let zero-size items take up space
14594    var hasSize = item.size.outerWidth && item.size.outerHeight;
14595    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
14596
14597    return {
14598      col: col,
14599      y: this._getColGroupY( col, colSpan ),
14600    };
14601  };
14602
14603  proto._manageStamp = function( stamp ) {
14604    var stampSize = getSize( stamp );
14605    var offset = this._getElementOffset( stamp );
14606    // get the columns that this stamp affects
14607    var isOriginLeft = this._getOption('originLeft');
14608    var firstX = isOriginLeft ? offset.left : offset.right;
14609    var lastX = firstX + stampSize.outerWidth;
14610    var firstCol = Math.floor( firstX / this.columnWidth );
14611    firstCol = Math.max( 0, firstCol );
14612    var lastCol = Math.floor( lastX / this.columnWidth );
14613    // lastCol should not go over if multiple of columnWidth #425
14614    lastCol -= lastX % this.columnWidth ? 0 : 1;
14615    lastCol = Math.min( this.cols - 1, lastCol );
14616    // set colYs to bottom of the stamp
14617
14618    var isOriginTop = this._getOption('originTop');
14619    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
14620      stampSize.outerHeight;
14621    for ( var i = firstCol; i <= lastCol; i++ ) {
14622      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
14623    }
14624  };
14625
14626  proto._getContainerSize = function() {
14627    this.maxY = Math.max.apply( Math, this.colYs );
14628    var size = {
14629      height: this.maxY
14630    };
14631
14632    if ( this._getOption('fitWidth') ) {
14633      size.width = this._getContainerFitWidth();
14634    }
14635
14636    return size;
14637  };
14638
14639  proto._getContainerFitWidth = function() {
14640    var unusedCols = 0;
14641    // count unused columns
14642    var i = this.cols;
14643    while ( --i ) {
14644      if ( this.colYs[i] !== 0 ) {
14645        break;
14646      }
14647      unusedCols++;
14648    }
14649    // fit container to columns that have been used
14650    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
14651  };
14652
14653  proto.needsResizeLayout = function() {
14654    var previousWidth = this.containerWidth;
14655    this.getContainerWidth();
14656    return previousWidth != this.containerWidth;
14657  };
14658
14659  return Masonry;
14660
14661}));
14662
14663
14664/***/ }),
14665/* 15 */
14666/***/ (function(module, exports, __webpack_require__) {
14667
14668var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
14669 * fitRows layout mode
14670 */
14671
14672( function( window, factory ) {
14673  // universal module definition
14674  /* jshint strict: false */ /*globals define, module, require */
14675  if ( true ) {
14676    // AMD
14677    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
14678        __webpack_require__(3)
14679      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14680				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14681				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14682				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14683  } else if ( typeof exports == 'object' ) {
14684    // CommonJS
14685    module.exports = factory(
14686      require('../layout-mode')
14687    );
14688  } else {
14689    // browser global
14690    factory(
14691      window.Isotope.LayoutMode
14692    );
14693  }
14694
14695}( window, function factory( LayoutMode ) {
14696'use strict';
14697
14698var FitRows = LayoutMode.create('fitRows');
14699
14700var proto = FitRows.prototype;
14701
14702proto._resetLayout = function() {
14703  this.x = 0;
14704  this.y = 0;
14705  this.maxY = 0;
14706  this._getMeasurement( 'gutter', 'outerWidth' );
14707};
14708
14709proto._getItemLayoutPosition = function( item ) {
14710  item.getSize();
14711
14712  var itemWidth = item.size.outerWidth + this.gutter;
14713  // if this element cannot fit in the current row
14714  var containerWidth = this.isotope.size.innerWidth + this.gutter;
14715  if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {
14716    this.x = 0;
14717    this.y = this.maxY;
14718  }
14719
14720  var position = {
14721    x: this.x,
14722    y: this.y
14723  };
14724
14725  this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );
14726  this.x += itemWidth;
14727
14728  return position;
14729};
14730
14731proto._getContainerSize = function() {
14732  return { height: this.maxY };
14733};
14734
14735return FitRows;
14736
14737}));
14738
14739
14740/***/ }),
14741/* 16 */
14742/***/ (function(module, exports, __webpack_require__) {
14743
14744var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
14745 * vertical layout mode
14746 */
14747
14748( function( window, factory ) {
14749  // universal module definition
14750  /* jshint strict: false */ /*globals define, module, require */
14751  if ( true ) {
14752    // AMD
14753    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
14754        __webpack_require__(3)
14755      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14756				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14757				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14758				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14759  } else if ( typeof module == 'object' && module.exports ) {
14760    // CommonJS
14761    module.exports = factory(
14762      require('../layout-mode')
14763    );
14764  } else {
14765    // browser global
14766    factory(
14767      window.Isotope.LayoutMode
14768    );
14769  }
14770
14771}( window, function factory( LayoutMode ) {
14772'use strict';
14773
14774var Vertical = LayoutMode.create( 'vertical', {
14775  horizontalAlignment: 0
14776});
14777
14778var proto = Vertical.prototype;
14779
14780proto._resetLayout = function() {
14781  this.y = 0;
14782};
14783
14784proto._getItemLayoutPosition = function( item ) {
14785  item.getSize();
14786  var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *
14787    this.options.horizontalAlignment;
14788  var y = this.y;
14789  this.y += item.size.outerHeight;
14790  return { x: x, y: y };
14791};
14792
14793proto._getContainerSize = function() {
14794  return { height: this.y };
14795};
14796
14797return Vertical;
14798
14799}));
14800
14801
14802/***/ }),
14803/* 17 */
14804/***/ (function(module, exports, __webpack_require__) {
14805
14806var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**
14807 * Isotope Item
14808**/
14809
14810( function( window, factory ) {
14811  // universal module definition
14812  /* jshint strict: false */ /*globals define, module, require */
14813  if ( true ) {
14814    // AMD
14815    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [
14816        __webpack_require__(2)
14817      ], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
14818				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
14819				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
14820				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
14821  } else if ( typeof module == 'object' && module.exports ) {
14822    // CommonJS
14823    module.exports = factory(
14824      require('outlayer')
14825    );
14826  } else {
14827    // browser global
14828    window.Isotope = window.Isotope || {};
14829    window.Isotope.Item = factory(
14830      window.Outlayer
14831    );
14832  }
14833
14834}( window, function factory( Outlayer ) {
14835'use strict';
14836
14837// -------------------------- Item -------------------------- //
14838
14839// sub-class Outlayer Item
14840function Item() {
14841  Outlayer.Item.apply( this, arguments );
14842}
14843
14844var proto = Item.prototype = Object.create( Outlayer.Item.prototype );
14845
14846var _create = proto._create;
14847proto._create = function() {
14848  // assign id, used for original-order sorting
14849  this.id = this.layout.itemGUID++;
14850  _create.call( this );
14851  this.sortData = {};
14852};
14853
14854proto.updateSortData = function() {
14855  if ( this.isIgnored ) {
14856    return;
14857  }
14858  // default sorters
14859  this.sortData.id = this.id;
14860  // for backward compatibility
14861  this.sortData['original-order'] = this.id;
14862  this.sortData.random = Math.random();
14863  // go thru getSortData obj and apply the sorters
14864  var getSortData = this.layout.options.getSortData;
14865  var sorters = this.layout._sorters;
14866  for ( var key in getSortData ) {
14867    var sorter = sorters[ key ];
14868    this.sortData[ key ] = sorter( this.element, this );
14869  }
14870};
14871
14872var _destroy = proto.destroy;
14873proto.destroy = function() {
14874  // call super
14875  _destroy.apply( this, arguments );
14876  // reset display, #741
14877  this.css({
14878    display: ''
14879  });
14880};
14881
14882return Item;
14883
14884}));
14885
14886
14887/***/ }),
14888/* 18 */
14889/***/ (function(module, exports, __webpack_require__) {
14890
14891"use strict";
14892/* WEBPACK VAR INJECTION */(function($) {
14893
14894Object.defineProperty(exports, "__esModule", {
14895	value: true
14896});
14897
14898var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
14899
14900function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14901
14902var Toggles = function () {
14903	function Toggles() {
14904		_classCallCheck(this, Toggles);
14905
14906		this.initialize();
14907	}
14908
14909	_createClass(Toggles, [{
14910		key: 'initialize',
14911		value: function initialize() {
14912			var _this2 = this;
14913
14914			$('.js-toggle').on('click', function (e) {
14915				e.preventDefault();
14916
14917				var $this = $(this);
14918				var $target = $this.data('target') ? $($this.data('target')) : $($this.attr('href'));
14919				var activeClass = $this.data('class') ? $this.data('class') : 'active';
14920
14921				$this.add($target).toggleClass(activeClass);
14922
14923				if ($this.data('dispatch')) {
14924					$target.trigger($this.data('dispatch'));
14925				}
14926				if ($(this).hasClass("search__toggle")) {
14927					console.log("open");
14928					$("#q").attr("tabIndex", "0");
14929					$(".search__btn").attr("tabIndex", "0");
14930					$(".search__close.js-toggle").attr("tabIndex", "0");
14931					$("#q").removeAttr("aria-hidden");
14932					$(".search__btn").removeAttr("aria-hidden");
14933					$(".search__close.js-toggle").removeAttr("aria-hidden");
14934				}
14935				else if ($(this).hasClass("search__close")) {
14936					console.log("close");
14937					$("#q").attr("tabIndex", "-1");
14938					$(".search__btn").attr("tabIndex", "-1");
14939					$(".search__close.js-toggle").attr("tabIndex", "-1");
14940					$("#q").attr("aria-hidden", "true");
14941					$(".search__btn").attr("aria-hidden", "true");
14942					$(".search__close.js-toggle").attr("aria-hidden", "true");
14943				}
14944			});
14945
14946			$(document).on('click touchstart', function (e) {
14947				var _this = _this2;
14948				var $target = $(e.target);
14949
14950				$('[data-autoclose]').each(function () {
14951					var $this = $(this);
14952					var element = $this.data('inner-element') ? $this.data('inner-element') : $this.data('target') ? $this.data('target') : $this.attr('href');
14953					var className = $this.data('class') ? $this.data('class') : 'active';
14954
14955					_this.hideElementsOnClick($target, element, className);
14956				});
14957			});
14958		}
14959	}, {
14960		key: 'hideElementsOnClick',
14961		value: function hideElementsOnClick($target, element, className) {
14962			if (!$target.is(element + ', ' + element + ' *, .js-toggle.' + className + ', .js-toggle.' + className + ' *')) {
14963				$('.' + className).removeClass(className);
14964			}
14965		}
14966	}]);
14967
14968	return Toggles;
14969}();
14970
14971exports.default = Toggles;
14972/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
14973
14974/***/ }),
14975/* 19 */
14976/***/ (function(module, exports, __webpack_require__) {
14977
14978"use strict";
14979/* WEBPACK VAR INJECTION */(function($) {
14980
14981Object.defineProperty(exports, "__esModule", {
14982	value: true
14983});
14984
14985var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
14986
14987var _isotopeLayout = __webpack_require__(4);
14988
14989var _isotopeLayout2 = _interopRequireDefault(_isotopeLayout);
14990
14991var _EqualizeHeight = __webpack_require__(8);
14992
14993var _EqualizeHeight2 = _interopRequireDefault(_EqualizeHeight);
14994
14995function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14996
14997function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
14998
14999var Grid = function () {
15000	function Grid($el) {
15001		_classCallCheck(this, Grid);
15002
15003		this.$el = $el;
15004		this.$parent = this.$el.parent();
15005		this.$callout = this.$parent.find('.section-alt').clone();
15006		this.$cachedItems = this.$el.clone();
15007		this.btnSelector = this.$parent.data('btn');
15008		this.$btnParent = $(this.btnSelector).parent();
15009		this.filtersActiveClass = 'active';
15010		this.itemClass = 'isotope-item';
15011		this.forcedClasses = 'animated filtered';
15012		this.currentFilter = '*';
15013
15014		this.initialize();
15015	}
15016
15017	_createClass(Grid, [{
15018		key: 'initialize',
15019		value: function initialize() {
15020			this.fixItems();
15021
15022			this.grid = new _isotopeLayout2.default(this.$el.parent().get(0), {
15023				itemSelector: '.' + this.itemClass
15024			});
15025
15026			this.startFiltration();
15027			this.startAjax();
15028		}
15029	}, {
15030		key: 'fixItems',
15031		value: function fixItems() {
15032			this.$el.addClass(this.itemClass);
15033
15034			new _EqualizeHeight2.default(this.$el.not('.section-alt').find('a'));
15035		}
15036	}, {
15037		key: 'startFiltration',
15038		value: function startFiltration() {
15039			var _this = this;
15040
15041			$(_this.$parent.data('filters') + ' a').on('click', function (e) {
15042				e.preventDefault();
15043
15044				var $this = $(this);
15045
15046				if (!$this.parent().hasClass(_this.filtersActiveClass)) {
15047					_this.currentFilter = $this.data('filter');
15048
15049					$this.parent().addClass(_this.filtersActiveClass).siblings().removeClass(_this.filtersActiveClass);
15050
15051					_this.grid.remove(_this.$parent.children());
15052
15053					_this.$el = _this.$cachedItems.filter(_this.currentFilter).clone();
15054				}
15055			});
15056
15057			_this.grid.on('removeComplete', function () {
15058				_this.addItems(_this.$el);
15059			});
15060		}
15061	}, {
15062		key: 'addItems',
15063		value: function addItems($items, isAjax) {
15064			var _this2 = this;
15065
15066			var $preparedItems = void 0;
15067
15068			$(document).trigger('updateFilter');
15069
15070			if (!$items.filter('.section-alt').length && !isAjax) {
15071				$items = this.addCallout($items);
15072			}
15073
15074			for (var i = 0; i < $items.length; i++) {
15075				$preparedItems = $preparedItems ? $preparedItems.add($($items[i])) : $($items[i]);
15076			}
15077
15078			//alert($preparedItems.length > 0);
15079			if ($items.length) {
15080			    $preparedItems.addClass(this.itemClass + ' ' + this.forcedClasses);
15081
15082			    this.grid.insert($preparedItems);
15083			}
15084
15085			setTimeout(function () {
15086				return _this2.grid.layout();
15087			}, 50);
15088		}
15089	}, {
15090		key: 'addCallout',
15091		value: function addCallout($items) {
15092			var items = [];
15093			var isAdded = false;
15094
15095			for (var i = 0; i < $items.length; i++) {
15096				items.push($($items[i]));
15097
15098				if (i == 2 || i + 1 == $items.length && !isAdded) {
15099					isAdded = true;
15100
15101					items.push(this.$callout.clone());
15102				}
15103			}
15104
15105			return items;
15106		}
15107	}, {
15108		key: 'startAjax',
15109		value: function startAjax() {
15110			var _this = this;
15111
15112			$(document).on('click', _this.btnSelector, function (e) {
15113				e.preventDefault();
15114
15115				var $this = $(this);
15116				var url = $this.attr('href');
15117
15118				$this.remove();
15119
15120				$.ajax(url, {
15121					success: function success(response) {
15122						var $items = $(response);
15123						var $button = $($items[$items.length - 1]).clone();
15124
15125						_this.$el = _this.$cachedItems.add($items.filter('.item'));
15126						_this.$cachedItems = _this.$el.clone();
15127
15128						_this.$btnParent.append($button);
15129
15130						if (_this.currentFilter !== '*') {
15131							_this.currentFilter = '*';
15132
15133							$(_this.$parent.data('filters') + ' li:first-child').addClass(_this.filtersActiveClass).siblings().removeClass(_this.filtersActiveClass);
15134
15135							_this.grid.remove(_this.$parent.children());
15136						} else {
15137							_this.addItems($items.filter(':not(a)'), true);
15138						}
15139					}
15140				});
15141			});
15142		}
15143	}]);
15144
15145	return Grid;
15146}();
15147
15148exports.default = Grid;
15149/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
15150
15151/***/ }),
15152/* 20 */
15153/***/ (function(module, exports, __webpack_require__) {
15154
15155"use strict";
15156/* WEBPACK VAR INJECTION */(function($) {
15157
15158Object.defineProperty(exports, "__esModule", {
15159	value: true
15160});
15161
15162var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
15163
15164function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15165
15166var FieldControler = function () {
15167	function FieldControler() {
15168		_classCallCheck(this, FieldControler);
15169
15170		this.activeClass = 'has-value';
15171
15172		this.attachEvents();
15173	}
15174
15175	_createClass(FieldControler, [{
15176		key: 'attachEvents',
15177		value: function attachEvents() {
15178			var _this = this;
15179
15180			$('.field-container input').on('focus', function () {
15181				var $this = $(this);
15182
15183				$this.siblings('.field-container__border').outerWidth($this.outerWidth() - $this.siblings('label').outerWidth() - 10).closest('.field-container').addClass(_this.activeClass);
15184			}).on('blur', function () {
15185				$(this).closest('.field-container').toggleClass(_this.activeClass, this.value !== '');
15186			});
15187		}
15188	}]);
15189
15190	return FieldControler;
15191}();
15192
15193exports.default = FieldControler;
15194/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
15195
15196/***/ }),
15197/* 21 */
15198/***/ (function(module, exports, __webpack_require__) {
15199
15200"use strict";
15201/* WEBPACK VAR INJECTION */(function($) {
15202
15203Object.defineProperty(exports, "__esModule", {
15204	value: true
15205});
15206
15207var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
15208
15209function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15210
15211var ScrollAnimator = function () {
15212	function ScrollAnimator($el, options) {
15213		_classCallCheck(this, ScrollAnimator);
15214
15215		var _ref = [$el, options];
15216		this.$el = _ref[0];
15217		this.options = _ref[1];
15218
15219		this.$win = $(window);
15220		this.$body = $('body');
15221
15222		this.updateVariables();
15223		this.init();
15224	}
15225
15226	_createClass(ScrollAnimator, [{
15227		key: 'init',
15228		value: function init() {
15229			var _this2 = this;
15230
15231			this.$win.on('load resize', this.updateVariables.bind(this)).on('load scroll', function () {
15232				var realWinST = _this2.$win.scrollTop();
15233				var winHeight = _this2.$win.outerHeight();
15234				var bodyHeight = _this2.$body.outerHeight();
15235				var winST = realWinST + (typeof _this2.options.offset == 'function' ? _this2.options.offset() : 0);
15236
15237				_this2.items.forEach(function (item) {
15238					if (winST >= item.offset || realWinST + winHeight + 10 >= bodyHeight) {
15239						if (typeof _this2.options.onEnter == 'function') {
15240							_this2.options.onEnter(item);
15241						}
15242
15243						item.$el.addClass(_this2.options.animatedClass);
15244					}
15245				});
15246			});
15247		}
15248	}, {
15249		key: 'updateVariables',
15250		value: function updateVariables() {
15251			this.items = this.getItems();
15252		}
15253	}, {
15254		key: 'getItems',
15255		value: function getItems() {
15256			var _this = this;
15257			var items = [];
15258
15259			_this.$el.each(function () {
15260				var $this = $(this);
15261
15262				items.push({
15263					$el: $this,
15264					offset: $this.offset().top
15265				});
15266			});
15267
15268			return items;
15269		}
15270	}]);
15271
15272	return ScrollAnimator;
15273}();
15274
15275exports.default = ScrollAnimator;
15276/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
15277
15278/***/ }),
15279/* 22 */
15280/***/ (function(module, exports, __webpack_require__) {
15281
15282"use strict";
15283/* WEBPACK VAR INJECTION */(function($) {
15284
15285Object.defineProperty(exports, "__esModule", {
15286	value: true
15287});
15288
15289exports.default = function () {
15290	var $header = $('.header');
15291	var $win = $(window);
15292
15293	$win.on('load scroll', function () {
15294		$header.toggleClass('header--collapsed', $win.scrollTop() > 0);
15295	});
15296};
15297/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
15298
15299/***/ })
15300/******/ ]);

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.