PageSourceSearch

https://www.durhamnephrology.com/wp-content/themes/durham/js/bundle.js

js durhamnephrology.com collected 2026-10-02 19:09:15 UTC 496,572 bytes, 16,924 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 = 2);
64/******/ })
65/************************************************************************/
66/******/ ([
67/* 0 */
68/***/ (function(module, exports, __webpack_require__) {
69
70/* WEBPACK VAR INJECTION */(function(global) {module.exports = global["jQuery"] = __webpack_require__(3);
71/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
72
73/***/ }),
74/* 1 */
75/***/ (function(module, exports) {
76
77var g;
78
79// This works in non-strict mode
80g = (function() {
81	return this;
82})();
83
84try {
85	// This works if eval is allowed (see CSP)
86	g = g || Function("return this")() || (1,eval)("this");
87} catch(e) {
88	// This works if the window reference is available
89	if(typeof window === "object")
90		g = window;
91}
92
93// g can still be undefined, but nothing to do about it...
94// We return undefined, instead of nothing here, so it's
95// easier to handle this case. if(!global) { ...}
96
97module.exports = g;
98
99
100/***/ }),
101/* 2 */
102/***/ (function(module, exports, __webpack_require__) {
103
104"use strict";
105/* WEBPACK VAR INJECTION */(function($) {
106
107__webpack_require__(4);
108
109var _aos = __webpack_require__(6);
110
111var _aos2 = _interopRequireDefault(_aos);
112
113function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
114
115var $win = $(window);
116var $doc = $(document);
117
118var $sliderIntro = $('.slider-intro');
119var $body = $('body');
120var $navTrigger = $('.nav-trigger');
121var $close = $('.close');
122var $navMenu = $('.nav-mobile');
123var $header = $('.header');
124
125$doc.ready(function () {
126	$('.collapsible').collapse();
127
128	_aos2.default.init();
129	
130	
131	
132	var a = setInterval(function() {
133		if (document.readyState == "complete") {
134			// clear the interval
135			//insert code here
136			$('.owl-carousel').show();
137			$sliderIntro.owlCarousel({
138				loop: true,
139				items: 1,
140				autoplay: true
141			});
142			clearInterval(a);
143			// finally your page is loaded.
144		}
145	}, 100);
146	
147	
148	$navTrigger.on('click', function () {
149		$navMenu.toggleClass('open');
150		$body.toggleClass('overflow-hidden');
151	});
152
153	$close.on('click', function () {
154		$navMenu.toggleClass('open');
155		$body.toggleClass('overflow-hidden');
156	});
157
158	$win.on('scroll', function () {
159		var scrolltop = $win.scrollTop();
160
161		$header.toggleClass('scrolled', scrolltop > 0);
162	});
163});
164/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0)))
165
166/***/ }),
167/* 3 */
168/***/ (function(module, exports, __webpack_require__) {
169
170var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
171 * jQuery JavaScript Library v3.2.1
172 * https://jquery.com/
173 *
174 * Includes Sizzle.js
175 * https://sizzlejs.com/
176 *
177 * Copyright JS Foundation and other contributors
178 * Released under the MIT license
179 * https://jquery.org/license
180 *
181 * Date: 2017-03-20T18:59Z
182 */
183( function( global, factory ) {
184
185	"use strict";
186
187	if ( typeof module === "object" && typeof module.exports === "object" ) {
188
189		// For CommonJS and CommonJS-like environments where a proper `window`
190		// is present, execute the factory and get jQuery.
191		// For environments that do not have a `window` with a `document`
192		// (such as Node.js), expose a factory as module.exports.
193		// This accentuates the need for the creation of a real `window`.
194		// e.g. var jQuery = require("jquery")(window);
195		// See ticket #14549 for more info.
196		module.exports = global.document ?
197			factory( global, true ) :
198			function( w ) {
199				if ( !w.document ) {
200					throw new Error( "jQuery requires a window with a document" );
201				}
202				return factory( w );
203			};
204	} else {
205		factory( global );
206	}
207
208// Pass this if window is not defined yet
209} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
210
211// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
212// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
213// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 11,277 bytes, lines 213-700
213ict mode should be common
214// enough that all such attempts are guarded in a try block.
215"use strict";
216
217var arr = [];
218
219var document = window.document;
220
221var getProto = Object.getPrototypeOf;
222
223var slice = arr.slice;
224
225var concat = arr.concat;
226
227var push = arr.push;
228
229var indexOf = arr.indexOf;
230
231var class2type = {};
232
233var toString = class2type.toString;
234
235var hasOwn = class2type.hasOwnProperty;
236
237var fnToString = hasOwn.toString;
238
239var ObjectFunctionString = fnToString.call( Object );
240
241var support = {};
242
243
244
245	function DOMEval( code, doc ) {
246		doc = doc || document;
247
248		var script = doc.createElement( "script" );
249
250		script.text = code;
251		doc.head.appendChild( script ).parentNode.removeChild( script );
252	}
253/* global Symbol */
254// Defining this global in .eslintrc.json would create a danger of using the global
255// unguarded in another place, it seems safer to define global only for this module
256
257
258
259var
260	version = "3.2.1",
261
262	// Define a local copy of jQuery
263	jQuery = function( selector, context ) {
264
265		// The jQuery object is actually just the init constructor 'enhanced'
266		// Need init if jQuery is called (just allow error to be thrown if not included)
267		return new jQuery.fn.init( selector, context );
268	},
269
270	// Support: Android <=4.0 only
271	// Make sure we trim BOM and NBSP
272	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
273
274	// Matches dashed string for camelizing
275	rmsPrefix = /^-ms-/,
276	rdashAlpha = /-([a-z])/g,
277
278	// Used by jQuery.camelCase as callback to replace()
279	fcamelCase = function( all, letter ) {
280		return letter.toUpperCase();
281	};
282
283jQuery.fn = jQuery.prototype = {
284
285	// The current version of jQuery being used
286	jquery: version,
287
288	constructor: jQuery,
289
290	// The default length of a jQuery object is 0
291	length: 0,
292
293	toArray: function() {
294		return slice.call( this );
295	},
296
297	// Get the Nth element in the matched element set OR
298	// Get the whole matched element set as a clean array
299	get: function( num ) {
300
301		// Return all the elements in a clean array
302		if ( num == null ) {
303			return slice.call( this );
304		}
305
306		// Return just the one element from the set
307		return num < 0 ? this[ num + this.length ] : this[ num ];
308	},
309
310	// Take an array of elements and push it onto the stack
311	// (returning the new matched element set)
312	pushStack: function( elems ) {
313
314		// Build a new jQuery matched element set
315		var ret = jQuery.merge( this.constructor(), elems );
316
317		// Add the old object onto the stack (as a reference)
318		ret.prevObject = this;
319
320		// Return the newly-formed element set
321		return ret;
322	},
323
324	// Execute a callback for every element in the matched set.
325	each: function( callback ) {
326		return jQuery.each( this, callback );
327	},
328
329	map: function( callback ) {
330		return this.pushStack( jQuery.map( this, function( elem, i ) {
331			return callback.call( elem, i, elem );
332		} ) );
333	},
334
335	slice: function() {
336		return this.pushStack( slice.apply( this, arguments ) );
337	},
338
339	first: function() {
340		return this.eq( 0 );
341	},
342
343	last: function() {
344		return this.eq( -1 );
345	},
346
347	eq: function( i ) {
348		var len = this.length,
349			j = +i + ( i < 0 ? len : 0 );
350		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
351	},
352
353	end: function() {
354		return this.prevObject || this.constructor();
355	},
356
357	// For internal use only.
358	// Behaves like an Array's method, not like a jQuery method.
359	push: push,
360	sort: arr.sort,
361	splice: arr.splice
362};
363
364jQuery.extend = jQuery.fn.extend = function() {
365	var options, name, src, copy, copyIsArray, clone,
366		target = arguments[ 0 ] || {},
367		i = 1,
368		length = arguments.length,
369		deep = false;
370
371	// Handle a deep copy situation
372	if ( typeof target === "boolean" ) {
373		deep = target;
374
375		// Skip the boolean and the target
376		target = arguments[ i ] || {};
377		i++;
378	}
379
380	// Handle case when target is a string or something (possible in deep copy)
381	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
382		target = {};
383	}
384
385	// Extend jQuery itself if only one argument is passed
386	if ( i === length ) {
387		target = this;
388		i--;
389	}
390
391	for ( ; i < length; i++ ) {
392
393		// Only deal with non-null/undefined values
394		if ( ( options = arguments[ i ] ) != null ) {
395
396			// Extend the base object
397			for ( name in options ) {
398				src = target[ name ];
399				copy = options[ name ];
400
401				// Prevent never-ending loop
402				if ( target === copy ) {
403					continue;
404				}
405
406				// Recurse if we're merging plain objects or arrays
407				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
408					( copyIsArray = Array.isArray( copy ) ) ) ) {
409
410					if ( copyIsArray ) {
411						copyIsArray = false;
412						clone = src && Array.isArray( src ) ? src : [];
413
414					} else {
415						clone = src && jQuery.isPlainObject( src ) ? src : {};
416					}
417
418					// Never move original objects, clone them
419					target[ name ] = jQuery.extend( deep, clone, copy );
420
421				// Don't bring in undefined values
422				} else if ( copy !== undefined ) {
423					target[ name ] = copy;
424				}
425			}
426		}
427	}
428
429	// Return the modified object
430	return target;
431};
432
433jQuery.extend( {
434
435	// Unique for each copy of jQuery on the page
436	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
437
438	// Assume jQuery is ready without the ready module
439	isReady: true,
440
441	error: function( msg ) {
442		throw new Error( msg );
443	},
444
445	noop: function() {},
446
447	isFunction: function( obj ) {
448		return jQuery.type( obj ) === "function";
449	},
450
451	isWindow: function( obj ) {
452		return obj != null && obj === obj.window;
453	},
454
455	isNumeric: function( obj ) {
456
457		// As of jQuery 3.0, isNumeric is limited to
458		// strings and numbers (primitives or objects)
459		// that can be coerced to finite numbers (gh-2662)
460		var type = jQuery.type( obj );
461		return ( type === "number" || type === "string" ) &&
462
463			// parseFloat NaNs numeric-cast false positives ("")
464			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
465			// subtraction forces infinities to NaN
466			!isNaN( obj - parseFloat( obj ) );
467	},
468
469	isPlainObject: function( obj ) {
470		var proto, Ctor;
471
472		// Detect obvious negatives
473		// Use toString instead of jQuery.type to catch host objects
474		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
475			return false;
476		}
477
478		proto = getProto( obj );
479
480		// Objects with no prototype (e.g., `Object.create( null )`) are plain
481		if ( !proto ) {
482			return true;
483		}
484
485		// Objects with prototype are plain iff they were constructed by a global Object function
486		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
487		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
488	},
489
490	isEmptyObject: function( obj ) {
491
492		/* eslint-disable no-unused-vars */
493		// See https://github.com/eslint/eslint/issues/6125
494		var name;
495
496		for ( name in obj ) {
497			return false;
498		}
499		return true;
500	},
501
502	type: function( obj ) {
503		if ( obj == null ) {
504			return obj + "";
505		}
506
507		// Support: Android <=2.3 only (functionish RegExp)
508		return typeof obj === "object" || typeof obj === "function" ?
509			class2type[ toString.call( obj ) ] || "object" :
510			typeof obj;
511	},
512
513	// Evaluates a script in a global context
514	globalEval: function( code ) {
515		DOMEval( code );
516	},
517
518	// Convert dashed to camelCase; used by the css and data modules
519	// Support: IE <=9 - 11, Edge 12 - 13
520	// Microsoft forgot to hump their vendor prefix (#9572)
521	camelCase: function( string ) {
522		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
523	},
524
525	each: function( obj, callback ) {
526		var length, i = 0;
527
528		if ( isArrayLike( obj ) ) {
529			length = obj.length;
530			for ( ; i < length; i++ ) {
531				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
532					break;
533				}
534			}
535		} else {
536			for ( i in obj ) {
537				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
538					break;
539				}
540			}
541		}
542
543		return obj;
544	},
545
546	// Support: Android <=4.0 only
547	trim: function( text ) {
548		return text == null ?
549			"" :
550			( text + "" ).replace( rtrim, "" );
551	},
552
553	// results is for internal usage only
554	makeArray: function( arr, results ) {
555		var ret = results || [];
556
557		if ( arr != null ) {
558			if ( isArrayLike( Object( arr ) ) ) {
559				jQuery.merge( ret,
560					typeof arr === "string" ?
561					[ arr ] : arr
562				);
563			} else {
564				push.call( ret, arr );
565			}
566		}
567
568		return ret;
569	},
570
571	inArray: function( elem, arr, i ) {
572		return arr == null ? -1 : indexOf.call( arr, elem, i );
573	},
574
575	// Support: Android <=4.0 only, PhantomJS 1 only
576	// push.apply(_, arraylike) throws on ancient WebKit
577	merge: function( first, second ) {
578		var len = +second.length,
579			j = 0,
580			i = first.length;
581
582		for ( ; j < len; j++ ) {
583			first[ i++ ] = second[ j ];
584		}
585
586		first.length = i;
587
588		return first;
589	},
590
591	grep: function( elems, callback, invert ) {
592		var callbackInverse,
593			matches = [],
594			i = 0,
595			length = elems.length,
596			callbackExpect = !invert;
597
598		// Go through the array, only saving the items
599		// that pass the validator function
600		for ( ; i < length; i++ ) {
601			callbackInverse = !callback( elems[ i ], i );
602			if ( callbackInverse !== callbackExpect ) {
603				matches.push( elems[ i ] );
604			}
605		}
606
607		return matches;
608	},
609
610	// arg is for internal usage only
611	map: function( elems, callback, arg ) {
612		var length, value,
613			i = 0,
614			ret = [];
615
616		// Go through the array, translating each of the items to their new values
617		if ( isArrayLike( elems ) ) {
618			length = elems.length;
619			for ( ; i < length; i++ ) {
620				value = callback( elems[ i ], i, arg );
621
622				if ( value != null ) {
623					ret.push( value );
624				}
625			}
626
627		// Go through every key on the object,
628		} else {
629			for ( i in elems ) {
630				value = callback( elems[ i ], i, arg );
631
632				if ( value != null ) {
633					ret.push( value );
634				}
635			}
636		}
637
638		// Flatten any nested arrays
639		return concat.apply( [], ret );
640	},
641
642	// A global GUID counter for objects
643	guid: 1,
644
645	// Bind a function to a context, optionally partially applying any
646	// arguments.
647	proxy: function( fn, context ) {
648		var tmp, args, proxy;
649
650		if ( typeof context === "string" ) {
651			tmp = fn[ context ];
652			context = fn;
653			fn = tmp;
654		}
655
656		// Quick check to determine if target is callable, in the spec
657		// this throws a TypeError, but we will just return undefined.
658		if ( !jQuery.isFunction( fn ) ) {
659			return undefined;
660		}
661
662		// Simulated bind
663		args = slice.call( arguments, 2 );
664		proxy = function() {
665			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
666		};
667
668		// Set the guid of unique handler to the same of original handler, so it can be removed
669		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
670
671		return proxy;
672	},
673
674	now: Date.now,
675
676	// jQuery.support is not used in Core but other projects attach their
677	// properties to it so it needs to exist.
678	support: support
679} );
680
681if ( typeof Symbol === "function" ) {
682	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
683}
684
685// Populate the class2type map
686jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
687function( i, name ) {
688	class2type[ "[object " + name + "]" ] = name.toLowerCase();
689} );
690
691function isArrayLike( obj ) {
692
693	// Support: real iOS 8.2 only (not reproducible in simulator)
694	// `in` check used to prevent JIT error (gh-2145)
695	// hasOwn isn't used here due to false negatives
696	// regarding Nodelist length in IE
697	var length = !!obj && "length" in obj && obj.length,
698		type = jQuery.type( obj );
699
700	if ( type === "function" || jQuery.
vendor: 31,442 bytes, lines 700-1797
700isWindow( obj ) ) {
701		return false;
702	}
703
704	return type === "array" || length === 0 ||
705		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
706}
707var Sizzle =
708/*!
709 * Sizzle CSS Selector Engine v2.3.3
710 * https://sizzlejs.com/
711 *
712 * Copyright jQuery Foundation and other contributors
713 * Released under the MIT license
714 * http://jquery.org/license
715 *
716 * Date: 2016-08-08
717 */
718(function( window ) {
719
720var i,
721	support,
722	Expr,
723	getText,
724	isXML,
725	tokenize,
726	compile,
727	select,
728	outermostContext,
729	sortInput,
730	hasDuplicate,
731
732	// Local document vars
733	setDocument,
734	document,
735	docElem,
736	documentIsHTML,
737	rbuggyQSA,
738	rbuggyMatches,
739	matches,
740	contains,
741
742	// Instance-specific data
743	expando = "sizzle" + 1 * new Date(),
744	preferredDoc = window.document,
745	dirruns = 0,
746	done = 0,
747	classCache = createCache(),
748	tokenCache = createCache(),
749	compilerCache = createCache(),
750	sortOrder = function( a, b ) {
751		if ( a === b ) {
752			hasDuplicate = true;
753		}
754		return 0;
755	},
756
757	// Instance methods
758	hasOwn = ({}).hasOwnProperty,
759	arr = [],
760	pop = arr.pop,
761	push_native = arr.push,
762	push = arr.push,
763	slice = arr.slice,
764	// Use a stripped-down indexOf as it's faster than native
765	// https://jsperf.com/thor-indexof-vs-for/5
766	indexOf = function( list, elem ) {
767		var i = 0,
768			len = list.length;
769		for ( ; i < len; i++ ) {
770			if ( list[i] === elem ) {
771				return i;
772			}
773		}
774		return -1;
775	},
776
777	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
778
779	// Regular expressions
780
781	// http://www.w3.org/TR/css3-selectors/#whitespace
782	whitespace = "[\\x20\\t\\r\\n\\f]",
783
784	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
785	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
786
787	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
788	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
789		// Operator (capture 2)
790		"*([*^$|!~]?=)" + whitespace +
791		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
792		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
793		"*\\]",
794
795	pseudos = ":(" + identifier + ")(?:\\((" +
796		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
797		// 1. quoted (capture 3; capture 4 or capture 5)
798		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
799		// 2. simple (capture 6)
800		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
801		// 3. anything else (capture 2)
802		".*" +
803		")\\)|)",
804
805	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
806	rwhitespace = new RegExp( whitespace + "+", "g" ),
807	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
808
809	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
810	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
811
812	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
813
814	rpseudo = new RegExp( pseudos ),
815	ridentifier = new RegExp( "^" + identifier + "$" ),
816
817	matchExpr = {
818		"ID": new RegExp( "^#(" + identifier + ")" ),
819		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
820		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
821		"ATTR": new RegExp( "^" + attributes ),
822		"PSEUDO": new RegExp( "^" + pseudos ),
823		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
824			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
825			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
826		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
827		// For use in libraries implementing .is()
828		// We use this for POS matching in `select`
829		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
830			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
831	},
832
833	rinputs = /^(?:input|select|textarea|button)$/i,
834	rheader = /^h\d$/i,
835
836	rnative = /^[^{]+\{\s*\[native \w/,
837
838	// Easily-parseable/retrievable ID or TAG or CLASS selectors
839	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
840
841	rsibling = /[+~]/,
842
843	// CSS escapes
844	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
845	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
846	funescape = function( _, escaped, escapedWhitespace ) {
847		var high = "0x" + escaped - 0x10000;
848		// NaN means non-codepoint
849		// Support: Firefox<24
850		// Workaround erroneous numeric interpretation of +"0x"
851		return high !== high || escapedWhitespace ?
852			escaped :
853			high < 0 ?
854				// BMP codepoint
855				String.fromCharCode( high + 0x10000 ) :
856				// Supplemental Plane codepoint (surrogate pair)
857				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
858	},
859
860	// CSS string/identifier serialization
861	// https://drafts.csswg.org/cssom/#common-serializing-idioms
862	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
863	fcssescape = function( ch, asCodePoint ) {
864		if ( asCodePoint ) {
865
866			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
867			if ( ch === "\0" ) {
868				return "\uFFFD";
869			}
870
871			// Control characters and (dependent upon position) numbers get escaped as code points
872			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
873		}
874
875		// Other potentially-special ASCII characters get backslash-escaped
876		return "\\" + ch;
877	},
878
879	// Used for iframes
880	// See setDocument()
881	// Removing the function wrapper causes a "Permission Denied"
882	// error in IE
883	unloadHandler = function() {
884		setDocument();
885	},
886
887	disabledAncestor = addCombinator(
888		function( elem ) {
889			return elem.disabled === true && ("form" in elem || "label" in elem);
890		},
891		{ dir: "parentNode", next: "legend" }
892	);
893
894// Optimize for push.apply( _, NodeList )
895try {
896	push.apply(
897		(arr = slice.call( preferredDoc.childNodes )),
898		preferredDoc.childNodes
899	);
900	// Support: Android<4.0
901	// Detect silently failing push.apply
902	arr[ preferredDoc.childNodes.length ].nodeType;
903} catch ( e ) {
904	push = { apply: arr.length ?
905
906		// Leverage slice if possible
907		function( target, els ) {
908			push_native.apply( target, slice.call(els) );
909		} :
910
911		// Support: IE<9
912		// Otherwise append directly
913		function( target, els ) {
914			var j = target.length,
915				i = 0;
916			// Can't trust NodeList.length
917			while ( (target[j++] = els[i++]) ) {}
918			target.length = j - 1;
919		}
920	};
921}
922
923function Sizzle( selector, context, results, seed ) {
924	var m, i, elem, nid, match, groups, newSelector,
925		newContext = context && context.ownerDocument,
926
927		// nodeType defaults to 9, since context defaults to document
928		nodeType = context ? context.nodeType : 9;
929
930	results = results || [];
931
932	// Return early from calls with invalid selector or context
933	if ( typeof selector !== "string" || !selector ||
934		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
935
936		return results;
937	}
938
939	// Try to shortcut find operations (as opposed to filters) in HTML documents
940	if ( !seed ) {
941
942		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
943			setDocument( context );
944		}
945		context = context || document;
946
947		if ( documentIsHTML ) {
948
949			// If the selector is sufficiently simple, try using a "get*By*" DOM method
950			// (excepting DocumentFragment context, where the methods don't exist)
951			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
952
953				// ID selector
954				if ( (m = match[1]) ) {
955
956					// Document context
957					if ( nodeType === 9 ) {
958						if ( (elem = context.getElementById( m )) ) {
959
960							// Support: IE, Opera, Webkit
961							// TODO: identify versions
962							// getElementById can match elements by name instead of ID
963							if ( elem.id === m ) {
964								results.push( elem );
965								return results;
966							}
967						} else {
968							return results;
969						}
970
971					// Element context
972					} else {
973
974						// Support: IE, Opera, Webkit
975						// TODO: identify versions
976						// getElementById can match elements by name instead of ID
977						if ( newContext && (elem = newContext.getElementById( m )) &&
978							contains( context, elem ) &&
979							elem.id === m ) {
980
981							results.push( elem );
982							return results;
983						}
984					}
985
986				// Type selector
987				} else if ( match[2] ) {
988					push.apply( results, context.getElementsByTagName( selector ) );
989					return results;
990
991				// Class selector
992				} else if ( (m = match[3]) && support.getElementsByClassName &&
993					context.getElementsByClassName ) {
994
995					push.apply( results, context.getElementsByClassName( m ) );
996					return results;
997				}
998			}
999
1000			// Take advantage of querySelectorAll
1001			if ( support.qsa &&
1002				!compilerCache[ selector + " " ] &&
1003				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
1004
1005				if ( nodeType !== 1 ) {
1006					newContext = context;
1007					newSelector = selector;
1008
1009				// qSA looks outside Element context, which is not what we want
1010				// Thanks to Andrew Dupont for this workaround technique
1011				// Support: IE <=8
1012				// Exclude object elements
1013				} else if ( context.nodeName.toLowerCase() !== "object" ) {
1014
1015					// Capture the context ID, setting it first if necessary
1016					if ( (nid = context.getAttribute( "id" )) ) {
1017						nid = nid.replace( rcssescape, fcssescape );
1018					} else {
1019						context.setAttribute( "id", (nid = expando) );
1020					}
1021
1022					// Prefix every selector in the list
1023					groups = tokenize( selector );
1024					i = groups.length;
1025					while ( i-- ) {
1026						groups[i] = "#" + nid + " " + toSelector( groups[i] );
1027					}
1028					newSelector = groups.join( "," );
1029
1030					// Expand context for sibling selectors
1031					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
1032						context;
1033				}
1034
1035				if ( newSelector ) {
1036					try {
1037						push.apply( results,
1038							newContext.querySelectorAll( newSelector )
1039						);
1040						return results;
1041					} catch ( qsaError ) {
1042					} finally {
1043						if ( nid === expando ) {
1044							context.removeAttribute( "id" );
1045						}
1046					}
1047				}
1048			}
1049		}
1050	}
1051
1052	// All others
1053	return select( selector.replace( rtrim, "$1" ), context, results, seed );
1054}
1055
1056/**
1057 * Create key-value caches of limited size
1058 * @returns {function(string, object)} Returns the Object data after storing it on itself with
1059 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
1060 *	deleting the oldest entry
1061 */
1062function createCache() {
1063	var keys = [];
1064
1065	function cache( key, value ) {
1066		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
1067		if ( keys.push( key + " " ) > Expr.cacheLength ) {
1068			// Only keep the most recent entries
1069			delete cache[ keys.shift() ];
1070		}
1071		return (cache[ key + " " ] = value);
1072	}
1073	return cache;
1074}
1075
1076/**
1077 * Mark a function for special use by Sizzle
1078 * @param {Function} fn The function to mark
1079 */
1080function markFunction( fn ) {
1081	fn[ expando ] = true;
1082	return fn;
1083}
1084
1085/**
1086 * Support testing using an element
1087 * @param {Function} fn Passed the created element and returns a boolean result
1088 */
1089function assert( fn ) {
1090	var el = document.createElement("fieldset");
1091
1092	try {
1093		return !!fn( el );
1094	} catch (e) {
1095		return false;
1096	} finally {
1097		// Remove from its parent by default
1098		if ( el.parentNode ) {
1099			el.parentNode.removeChild( el );
1100		}
1101		// release memory in IE
1102		el = null;
1103	}
1104}
1105
1106/**
1107 * Adds the same handler for all of the specified attrs
1108 * @param {String} attrs Pipe-separated list of attributes
1109 * @param {Function} handler The method that will be applied
1110 */
1111function addHandle( attrs, handler ) {
1112	var arr = attrs.split("|"),
1113		i = arr.length;
1114
1115	while ( i-- ) {
1116		Expr.attrHandle[ arr[i] ] = handler;
1117	}
1118}
1119
1120/**
1121 * Checks document order of two siblings
1122 * @param {Element} a
1123 * @param {Element} b
1124 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
1125 */
1126function siblingCheck( a, b ) {
1127	var cur = b && a,
1128		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
1129			a.sourceIndex - b.sourceIndex;
1130
1131	// Use IE sourceIndex if available on both nodes
1132	if ( diff ) {
1133		return diff;
1134	}
1135
1136	// Check if b follows a
1137	if ( cur ) {
1138		while ( (cur = cur.nextSibling) ) {
1139			if ( cur === b ) {
1140				return -1;
1141			}
1142		}
1143	}
1144
1145	return a ? 1 : -1;
1146}
1147
1148/**
1149 * Returns a function to use in pseudos for input types
1150 * @param {String} type
1151 */
1152function createInputPseudo( type ) {
1153	return function( elem ) {
1154		var name = elem.nodeName.toLowerCase();
1155		return name === "input" && elem.type === type;
1156	};
1157}
1158
1159/**
1160 * Returns a function to use in pseudos for buttons
1161 * @param {String} type
1162 */
1163function createButtonPseudo( type ) {
1164	return function( elem ) {
1165		var name = elem.nodeName.toLowerCase();
1166		return (name === "input" || name === "button") && elem.type === type;
1167	};
1168}
1169
1170/**
1171 * Returns a function to use in pseudos for :enabled/:disabled
1172 * @param {Boolean} disabled true for :disabled; false for :enabled
1173 */
1174function createDisabledPseudo( disabled ) {
1175
1176	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1177	return function( elem ) {
1178
1179		// Only certain elements can match :enabled or :disabled
1180		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1181		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1182		if ( "form" in elem ) {
1183
1184			// Check for inherited disabledness on relevant non-disabled elements:
1185			// * listed form-associated elements in a disabled fieldset
1186			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1187			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1188			// * option elements in a disabled optgroup
1189			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1190			// All such elements have a "form" property.
1191			if ( elem.parentNode && elem.disabled === false ) {
1192
1193				// Option elements defer to a parent optgroup if present
1194				if ( "label" in elem ) {
1195					if ( "label" in elem.parentNode ) {
1196						return elem.parentNode.disabled === disabled;
1197					} else {
1198						return elem.disabled === disabled;
1199					}
1200				}
1201
1202				// Support: IE 6 - 11
1203				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1204				return elem.isDisabled === disabled ||
1205
1206					// Where there is no isDisabled, check manually
1207					/* jshint -W018 */
1208					elem.isDisabled !== !disabled &&
1209						disabledAncestor( elem ) === disabled;
1210			}
1211
1212			return elem.disabled === disabled;
1213
1214		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1215		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1216		// even exist on them, let alone have a boolean value.
1217		} else if ( "label" in elem ) {
1218			return elem.disabled === disabled;
1219		}
1220
1221		// Remaining elements are neither :enabled nor :disabled
1222		return false;
1223	};
1224}
1225
1226/**
1227 * Returns a function to use in pseudos for positionals
1228 * @param {Function} fn
1229 */
1230function createPositionalPseudo( fn ) {
1231	return markFunction(function( argument ) {
1232		argument = +argument;
1233		return markFunction(function( seed, matches ) {
1234			var j,
1235				matchIndexes = fn( [], seed.length, argument ),
1236				i = matchIndexes.length;
1237
1238			// Match elements found at the specified indexes
1239			while ( i-- ) {
1240				if ( seed[ (j = matchIndexes[i]) ] ) {
1241					seed[j] = !(matches[j] = seed[j]);
1242				}
1243			}
1244		});
1245	});
1246}
1247
1248/**
1249 * Checks a node for validity as a Sizzle context
1250 * @param {Element|Object=} context
1251 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1252 */
1253function testContext( context ) {
1254	return context && typeof context.getElementsByTagName !== "undefined" && context;
1255}
1256
1257// Expose support vars for convenience
1258support = Sizzle.support = {};
1259
1260/**
1261 * Detects XML nodes
1262 * @param {Element|Object} elem An element or a document
1263 * @returns {Boolean} True iff elem is a non-HTML XML node
1264 */
1265isXML = Sizzle.isXML = function( elem ) {
1266	// documentElement is verified for cases where it doesn't yet exist
1267	// (such as loading iframes in IE - #4833)
1268	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1269	return documentElement ? documentElement.nodeName !== "HTML" : false;
1270};
1271
1272/**
1273 * Sets document-related variables once based on the current document
1274 * @param {Element|Object} [doc] An element or document object to use to set the document
1275 * @returns {Object} Returns the current document
1276 */
1277setDocument = Sizzle.setDocument = function( node ) {
1278	var hasCompare, subWindow,
1279		doc = node ? node.ownerDocument || node : preferredDoc;
1280
1281	// Return early if doc is invalid or already selected
1282	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1283		return document;
1284	}
1285
1286	// Update global variables
1287	document = doc;
1288	docElem = document.documentElement;
1289	documentIsHTML = !isXML( document );
1290
1291	// Support: IE 9-11, Edge
1292	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1293	if ( preferredDoc !== document &&
1294		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1295
1296		// Support: IE 11, Edge
1297		if ( subWindow.addEventListener ) {
1298			subWindow.addEventListener( "unload", unloadHandler, false );
1299
1300		// Support: IE 9 - 10 only
1301		} else if ( subWindow.attachEvent ) {
1302			subWindow.attachEvent( "onunload", unloadHandler );
1303		}
1304	}
1305
1306	/* Attributes
1307	---------------------------------------------------------------------- */
1308
1309	// Support: IE<8
1310	// Verify that getAttribute really returns attributes and not properties
1311	// (excepting IE8 booleans)
1312	support.attributes = assert(function( el ) {
1313		el.className = "i";
1314		return !el.getAttribute("className");
1315	});
1316
1317	/* getElement(s)By*
1318	---------------------------------------------------------------------- */
1319
1320	// Check if getElementsByTagName("*") returns only elements
1321	support.getElementsByTagName = assert(function( el ) {
1322		el.appendChild( document.createComment("") );
1323		return !el.getElementsByTagName("*").length;
1324	});
1325
1326	// Support: IE<9
1327	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1328
1329	// Support: IE<10
1330	// Check if getElementById returns elements by name
1331	// The broken getElementById methods don't pick up programmatically-set names,
1332	// so use a roundabout getElementsByName test
1333	support.getById = assert(function( el ) {
1334		docElem.appendChild( el ).id = expando;
1335		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1336	});
1337
1338	// ID filter and find
1339	if ( support.getById ) {
1340		Expr.filter["ID"] = function( id ) {
1341			var attrId = id.replace( runescape, funescape );
1342			return function( elem ) {
1343				return elem.getAttribute("id") === attrId;
1344			};
1345		};
1346		Expr.find["ID"] = function( id, context ) {
1347			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1348				var elem = context.getElementById( id );
1349				return elem ? [ elem ] : [];
1350			}
1351		};
1352	} else {
1353		Expr.filter["ID"] =  function( id ) {
1354			var attrId = id.replace( runescape, funescape );
1355			return function( elem ) {
1356				var node = typeof elem.getAttributeNode !== "undefined" &&
1357					elem.getAttributeNode("id");
1358				return node && node.value === attrId;
1359			};
1360		};
1361
1362		// Support: IE 6 - 7 only
1363		// getElementById is not reliable as a find shortcut
1364		Expr.find["ID"] = function( id, context ) {
1365			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1366				var node, i, elems,
1367					elem = context.getElementById( id );
1368
1369				if ( elem ) {
1370
1371					// Verify the id attribute
1372					node = elem.getAttributeNode("id");
1373					if ( node && node.value === id ) {
1374						return [ elem ];
1375					}
1376
1377					// Fall back on getElementsByName
1378					elems = context.getElementsByName( id );
1379					i = 0;
1380					while ( (elem = elems[i++]) ) {
1381						node = elem.getAttributeNode("id");
1382						if ( node && node.value === id ) {
1383							return [ elem ];
1384						}
1385					}
1386				}
1387
1388				return [];
1389			}
1390		};
1391	}
1392
1393	// Tag
1394	Expr.find["TAG"] = support.getElementsByTagName ?
1395		function( tag, context ) {
1396			if ( typeof context.getElementsByTagName !== "undefined" ) {
1397				return context.getElementsByTagName( tag );
1398
1399			// DocumentFragment nodes don't have gEBTN
1400			} else if ( support.qsa ) {
1401				return context.querySelectorAll( tag );
1402			}
1403		} :
1404
1405		function( tag, context ) {
1406			var elem,
1407				tmp = [],
1408				i = 0,
1409				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1410				results = context.getElementsByTagName( tag );
1411
1412			// Filter out possible comments
1413			if ( tag === "*" ) {
1414				while ( (elem = results[i++]) ) {
1415					if ( elem.nodeType === 1 ) {
1416						tmp.push( elem );
1417					}
1418				}
1419
1420				return tmp;
1421			}
1422			return results;
1423		};
1424
1425	// Class
1426	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1427		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1428			return context.getElementsByClassName( className );
1429		}
1430	};
1431
1432	/* QSA/matchesSelector
1433	---------------------------------------------------------------------- */
1434
1435	// QSA and matchesSelector support
1436
1437	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1438	rbuggyMatches = [];
1439
1440	// qSa(:focus) reports false when true (Chrome 21)
1441	// We allow this because of a bug in IE8/9 that throws an error
1442	// whenever `document.activeElement` is accessed on an iframe
1443	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1444	// See https://bugs.jquery.com/ticket/13378
1445	rbuggyQSA = [];
1446
1447	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1448		// Build QSA regex
1449		// Regex strategy adopted from Diego Perini
1450		assert(function( el ) {
1451			// Select is set to empty string on purpose
1452			// This is to test IE's treatment of not explicitly
1453			// setting a boolean content attribute,
1454			// since its presence should be enough
1455			// https://bugs.jquery.com/ticket/12359
1456			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1457				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1458				"<option selected=''></option></select>";
1459
1460			// Support: IE8, Opera 11-12.16
1461			// Nothing should be selected when empty strings follow ^= or $= or *=
1462			// The test attribute must be unknown in Opera but "safe" for WinRT
1463			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1464			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1465				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1466			}
1467
1468			// Support: IE8
1469			// Boolean attributes and "value" are not treated correctly
1470			if ( !el.querySelectorAll("[selected]").length ) {
1471				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1472			}
1473
1474			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1475			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1476				rbuggyQSA.push("~=");
1477			}
1478
1479			// Webkit/Opera - :checked should return selected option elements
1480			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1481			// IE8 throws error here and will not see later tests
1482			if ( !el.querySelectorAll(":checked").length ) {
1483				rbuggyQSA.push(":checked");
1484			}
1485
1486			// Support: Safari 8+, iOS 8+
1487			// https://bugs.webkit.org/show_bug.cgi?id=136851
1488			// In-page `selector#id sibling-combinator selector` fails
1489			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1490				rbuggyQSA.push(".#.+[+~]");
1491			}
1492		});
1493
1494		assert(function( el ) {
1495			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1496				"<select disabled='disabled'><option/></select>";
1497
1498			// Support: Windows 8 Native Apps
1499			// The type and name attributes are restricted during .innerHTML assignment
1500			var input = document.createElement("input");
1501			input.setAttribute( "type", "hidden" );
1502			el.appendChild( input ).setAttribute( "name", "D" );
1503
1504			// Support: IE8
1505			// Enforce case-sensitivity of name attribute
1506			if ( el.querySelectorAll("[name=d]").length ) {
1507				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1508			}
1509
1510			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1511			// IE8 throws error here and will not see later tests
1512			if ( el.querySelectorAll(":enabled").length !== 2 ) {
1513				rbuggyQSA.push( ":enabled", ":disabled" );
1514			}
1515
1516			// Support: IE9-11+
1517			// IE's :disabled selector does not pick up the children of disabled fieldsets
1518			docElem.appendChild( el ).disabled = true;
1519			if ( el.querySelectorAll(":disabled").length !== 2 ) {
1520				rbuggyQSA.push( ":enabled", ":disabled" );
1521			}
1522
1523			// Opera 10-11 does not throw on post-comma invalid pseudos
1524			el.querySelectorAll("*,:x");
1525			rbuggyQSA.push(",.*:");
1526		});
1527	}
1528
1529	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1530		docElem.webkitMatchesSelector ||
1531		docElem.mozMatchesSelector ||
1532		docElem.oMatchesSelector ||
1533		docElem.msMatchesSelector) )) ) {
1534
1535		assert(function( el ) {
1536			// Check to see if it's possible to do matchesSelector
1537			// on a disconnected node (IE 9)
1538			support.disconnectedMatch = matches.call( el, "*" );
1539
1540			// This should fail with an exception
1541			// Gecko does not error, returns false instead
1542			matches.call( el, "[s!='']:x" );
1543			rbuggyMatches.push( "!=", pseudos );
1544		});
1545	}
1546
1547	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1548	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1549
1550	/* Contains
1551	---------------------------------------------------------------------- */
1552	hasCompare = rnative.test( docElem.compareDocumentPosition );
1553
1554	// Element contains another
1555	// Purposefully self-exclusive
1556	// As in, an element does not contain itself
1557	contains = hasCompare || rnative.test( docElem.contains ) ?
1558		function( a, b ) {
1559			var adown = a.nodeType === 9 ? a.documentElement : a,
1560				bup = b && b.parentNode;
1561			return a === bup || !!( bup && bup.nodeType === 1 && (
1562				adown.contains ?
1563					adown.contains( bup ) :
1564					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1565			));
1566		} :
1567		function( a, b ) {
1568			if ( b ) {
1569				while ( (b = b.parentNode) ) {
1570					if ( b === a ) {
1571						return true;
1572					}
1573				}
1574			}
1575			return false;
1576		};
1577
1578	/* Sorting
1579	---------------------------------------------------------------------- */
1580
1581	// Document order sorting
1582	sortOrder = hasCompare ?
1583	function( a, b ) {
1584
1585		// Flag for duplicate removal
1586		if ( a === b ) {
1587			hasDuplicate = true;
1588			return 0;
1589		}
1590
1591		// Sort on method existence if only one input has compareDocumentPosition
1592		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1593		if ( compare ) {
1594			return compare;
1595		}
1596
1597		// Calculate position if both inputs belong to the same document
1598		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1599			a.compareDocumentPosition( b ) :
1600
1601			// Otherwise we know they are disconnected
1602			1;
1603
1604		// Disconnected nodes
1605		if ( compare & 1 ||
1606			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1607
1608			// Choose the first element that is related to our preferred document
1609			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1610				return -1;
1611			}
1612			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1613				return 1;
1614			}
1615
1616			// Maintain original order
1617			return sortInput ?
1618				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1619				0;
1620		}
1621
1622		return compare & 4 ? -1 : 1;
1623	} :
1624	function( a, b ) {
1625		// Exit early if the nodes are identical
1626		if ( a === b ) {
1627			hasDuplicate = true;
1628			return 0;
1629		}
1630
1631		var cur,
1632			i = 0,
1633			aup = a.parentNode,
1634			bup = b.parentNode,
1635			ap = [ a ],
1636			bp = [ b ];
1637
1638		// Parentless nodes are either documents or disconnected
1639		if ( !aup || !bup ) {
1640			return a === document ? -1 :
1641				b === document ? 1 :
1642				aup ? -1 :
1643				bup ? 1 :
1644				sortInput ?
1645				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1646				0;
1647
1648		// If the nodes are siblings, we can do a quick check
1649		} else if ( aup === bup ) {
1650			return siblingCheck( a, b );
1651		}
1652
1653		// Otherwise we need full lists of their ancestors for comparison
1654		cur = a;
1655		while ( (cur = cur.parentNode) ) {
1656			ap.unshift( cur );
1657		}
1658		cur = b;
1659		while ( (cur = cur.parentNode) ) {
1660			bp.unshift( cur );
1661		}
1662
1663		// Walk down the tree looking for a discrepancy
1664		while ( ap[i] === bp[i] ) {
1665			i++;
1666		}
1667
1668		return i ?
1669			// Do a sibling check if the nodes have a common ancestor
1670			siblingCheck( ap[i], bp[i] ) :
1671
1672			// Otherwise nodes in our document sort first
1673			ap[i] === preferredDoc ? -1 :
1674			bp[i] === preferredDoc ? 1 :
1675			0;
1676	};
1677
1678	return document;
1679};
1680
1681Sizzle.matches = function( expr, elements ) {
1682	return Sizzle( expr, null, null, elements );
1683};
1684
1685Sizzle.matchesSelector = function( elem, expr ) {
1686	// Set document vars if needed
1687	if ( ( elem.ownerDocument || elem ) !== document ) {
1688		setDocument( elem );
1689	}
1690
1691	// Make sure that attribute selectors are quoted
1692	expr = expr.replace( rattributeQuotes, "='$1']" );
1693
1694	if ( support.matchesSelector && documentIsHTML &&
1695		!compilerCache[ expr + " " ] &&
1696		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1697		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1698
1699		try {
1700			var ret = matches.call( elem, expr );
1701
1702			// IE 9's matchesSelector returns false on disconnected nodes
1703			if ( ret || support.disconnectedMatch ||
1704					// As well, disconnected nodes are said to be in a document
1705					// fragment in IE 9
1706					elem.document && elem.document.nodeType !== 11 ) {
1707				return ret;
1708			}
1709		} catch (e) {}
1710	}
1711
1712	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1713};
1714
1715Sizzle.contains = function( context, elem ) {
1716	// Set document vars if needed
1717	if ( ( context.ownerDocument || context ) !== document ) {
1718		setDocument( context );
1719	}
1720	return contains( context, elem );
1721};
1722
1723Sizzle.attr = function( elem, name ) {
1724	// Set document vars if needed
1725	if ( ( elem.ownerDocument || elem ) !== document ) {
1726		setDocument( elem );
1727	}
1728
1729	var fn = Expr.attrHandle[ name.toLowerCase() ],
1730		// Don't get fooled by Object.prototype properties (jQuery #13807)
1731		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1732			fn( elem, name, !documentIsHTML ) :
1733			undefined;
1734
1735	return val !== undefined ?
1736		val :
1737		support.attributes || !documentIsHTML ?
1738			elem.getAttribute( name ) :
1739			(val = elem.getAttributeNode(name)) && val.specified ?
1740				val.value :
1741				null;
1742};
1743
1744Sizzle.escape = function( sel ) {
1745	return (sel + "").replace( rcssescape, fcssescape );
1746};
1747
1748Sizzle.error = function( msg ) {
1749	throw new Error( "Syntax error, unrecognized expression: " + msg );
1750};
1751
1752/**
1753 * Document sorting and removing duplicates
1754 * @param {ArrayLike} results
1755 */
1756Sizzle.uniqueSort = function( results ) {
1757	var elem,
1758		duplicates = [],
1759		j = 0,
1760		i = 0;
1761
1762	// Unless we *know* we can detect duplicates, assume their presence
1763	hasDuplicate = !support.detectDuplicates;
1764	sortInput = !support.sortStable && results.slice( 0 );
1765	results.sort( sortOrder );
1766
1767	if ( hasDuplicate ) {
1768		while ( (elem = results[i++]) ) {
1769			if ( elem === results[ i ] ) {
1770				j = duplicates.push( i );
1771			}
1772		}
1773		while ( j-- ) {
1774			results.splice( duplicates[ j ], 1 );
1775		}
1776	}
1777
1778	// Clear input after sorting to release objects
1779	// See https://github.com/jquery/sizzle/pull/225
1780	sortInput = null;
1781
1782	return results;
1783};
1784
1785/**
1786 * Utility function for retrieving the text value of an array of DOM nodes
1787 * @param {Array|Element} elem
1788 */
1789getText = Sizzle.getText = function( elem ) {
1790	var node,
1791		ret = "",
1792		i = 0,
1793		nodeType = elem.nodeType;
1794
1795	if ( !nodeType ) {
1796		// If no nodeType, this is expected to be an array
1797		while ( (node = elem[i++]) ) {
vendor: 11,976 bytes, lines 1798-2196
1798			// Do not traverse comment nodes
1799			ret += getText( node );
1800		}
1801	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1802		// Use textContent for elements
1803		// innerText usage removed for consistency of new lines (jQuery #11153)
1804		if ( typeof elem.textContent === "string" ) {
1805			return elem.textContent;
1806		} else {
1807			// Traverse its children
1808			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1809				ret += getText( elem );
1810			}
1811		}
1812	} else if ( nodeType === 3 || nodeType === 4 ) {
1813		return elem.nodeValue;
1814	}
1815	// Do not include comment or processing instruction nodes
1816
1817	return ret;
1818};
1819
1820Expr = Sizzle.selectors = {
1821
1822	// Can be adjusted by the user
1823	cacheLength: 50,
1824
1825	createPseudo: markFunction,
1826
1827	match: matchExpr,
1828
1829	attrHandle: {},
1830
1831	find: {},
1832
1833	relative: {
1834		">": { dir: "parentNode", first: true },
1835		" ": { dir: "parentNode" },
1836		"+": { dir: "previousSibling", first: true },
1837		"~": { dir: "previousSibling" }
1838	},
1839
1840	preFilter: {
1841		"ATTR": function( match ) {
1842			match[1] = match[1].replace( runescape, funescape );
1843
1844			// Move the given value to match[3] whether quoted or unquoted
1845			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1846
1847			if ( match[2] === "~=" ) {
1848				match[3] = " " + match[3] + " ";
1849			}
1850
1851			return match.slice( 0, 4 );
1852		},
1853
1854		"CHILD": function( match ) {
1855			/* matches from matchExpr["CHILD"]
1856				1 type (only|nth|...)
1857				2 what (child|of-type)
1858				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1859				4 xn-component of xn+y argument ([+-]?\d*n|)
1860				5 sign of xn-component
1861				6 x of xn-component
1862				7 sign of y-component
1863				8 y of y-component
1864			*/
1865			match[1] = match[1].toLowerCase();
1866
1867			if ( match[1].slice( 0, 3 ) === "nth" ) {
1868				// nth-* requires argument
1869				if ( !match[3] ) {
1870					Sizzle.error( match[0] );
1871				}
1872
1873				// numeric x and y parameters for Expr.filter.CHILD
1874				// remember that false/true cast respectively to 0/1
1875				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1876				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1877
1878			// other types prohibit arguments
1879			} else if ( match[3] ) {
1880				Sizzle.error( match[0] );
1881			}
1882
1883			return match;
1884		},
1885
1886		"PSEUDO": function( match ) {
1887			var excess,
1888				unquoted = !match[6] && match[2];
1889
1890			if ( matchExpr["CHILD"].test( match[0] ) ) {
1891				return null;
1892			}
1893
1894			// Accept quoted arguments as-is
1895			if ( match[3] ) {
1896				match[2] = match[4] || match[5] || "";
1897
1898			// Strip excess characters from unquoted arguments
1899			} else if ( unquoted && rpseudo.test( unquoted ) &&
1900				// Get excess from tokenize (recursively)
1901				(excess = tokenize( unquoted, true )) &&
1902				// advance to the next closing parenthesis
1903				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1904
1905				// excess is a negative index
1906				match[0] = match[0].slice( 0, excess );
1907				match[2] = unquoted.slice( 0, excess );
1908			}
1909
1910			// Return only captures needed by the pseudo filter method (type and argument)
1911			return match.slice( 0, 3 );
1912		}
1913	},
1914
1915	filter: {
1916
1917		"TAG": function( nodeNameSelector ) {
1918			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1919			return nodeNameSelector === "*" ?
1920				function() { return true; } :
1921				function( elem ) {
1922					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1923				};
1924		},
1925
1926		"CLASS": function( className ) {
1927			var pattern = classCache[ className + " " ];
1928
1929			return pattern ||
1930				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1931				classCache( className, function( elem ) {
1932					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1933				});
1934		},
1935
1936		"ATTR": function( name, operator, check ) {
1937			return function( elem ) {
1938				var result = Sizzle.attr( elem, name );
1939
1940				if ( result == null ) {
1941					return operator === "!=";
1942				}
1943				if ( !operator ) {
1944					return true;
1945				}
1946
1947				result += "";
1948
1949				return operator === "=" ? result === check :
1950					operator === "!=" ? result !== check :
1951					operator === "^=" ? check && result.indexOf( check ) === 0 :
1952					operator === "*=" ? check && result.indexOf( check ) > -1 :
1953					operator === "$=" ? check && result.slice( -check.length ) === check :
1954					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1955					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1956					false;
1957			};
1958		},
1959
1960		"CHILD": function( type, what, argument, first, last ) {
1961			var simple = type.slice( 0, 3 ) !== "nth",
1962				forward = type.slice( -4 ) !== "last",
1963				ofType = what === "of-type";
1964
1965			return first === 1 && last === 0 ?
1966
1967				// Shortcut for :nth-*(n)
1968				function( elem ) {
1969					return !!elem.parentNode;
1970				} :
1971
1972				function( elem, context, xml ) {
1973					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1974						dir = simple !== forward ? "nextSibling" : "previousSibling",
1975						parent = elem.parentNode,
1976						name = ofType && elem.nodeName.toLowerCase(),
1977						useCache = !xml && !ofType,
1978						diff = false;
1979
1980					if ( parent ) {
1981
1982						// :(first|last|only)-(child|of-type)
1983						if ( simple ) {
1984							while ( dir ) {
1985								node = elem;
1986								while ( (node = node[ dir ]) ) {
1987									if ( ofType ?
1988										node.nodeName.toLowerCase() === name :
1989										node.nodeType === 1 ) {
1990
1991										return false;
1992									}
1993								}
1994								// Reverse direction for :only-* (if we haven't yet done so)
1995								start = dir = type === "only" && !start && "nextSibling";
1996							}
1997							return true;
1998						}
1999
2000						start = [ forward ? parent.firstChild : parent.lastChild ];
2001
2002						// non-xml :nth-child(...) stores cache data on `parent`
2003						if ( forward && useCache ) {
2004
2005							// Seek `elem` from a previously-cached index
2006
2007							// ...in a gzip-friendly way
2008							node = parent;
2009							outerCache = node[ expando ] || (node[ expando ] = {});
2010
2011							// Support: IE <9 only
2012							// Defend against cloned attroperties (jQuery gh-1709)
2013							uniqueCache = outerCache[ node.uniqueID ] ||
2014								(outerCache[ node.uniqueID ] = {});
2015
2016							cache = uniqueCache[ type ] || [];
2017							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2018							diff = nodeIndex && cache[ 2 ];
2019							node = nodeIndex && parent.childNodes[ nodeIndex ];
2020
2021							while ( (node = ++nodeIndex && node && node[ dir ] ||
2022
2023								// Fallback to seeking `elem` from the start
2024								(diff = nodeIndex = 0) || start.pop()) ) {
2025
2026								// When found, cache indexes on `parent` and break
2027								if ( node.nodeType === 1 && ++diff && node === elem ) {
2028									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
2029									break;
2030								}
2031							}
2032
2033						} else {
2034							// Use previously-cached element index if available
2035							if ( useCache ) {
2036								// ...in a gzip-friendly way
2037								node = elem;
2038								outerCache = node[ expando ] || (node[ expando ] = {});
2039
2040								// Support: IE <9 only
2041								// Defend against cloned attroperties (jQuery gh-1709)
2042								uniqueCache = outerCache[ node.uniqueID ] ||
2043									(outerCache[ node.uniqueID ] = {});
2044
2045								cache = uniqueCache[ type ] || [];
2046								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
2047								diff = nodeIndex;
2048							}
2049
2050							// xml :nth-child(...)
2051							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
2052							if ( diff === false ) {
2053								// Use the same loop as above to seek `elem` from the start
2054								while ( (node = ++nodeIndex && node && node[ dir ] ||
2055									(diff = nodeIndex = 0) || start.pop()) ) {
2056
2057									if ( ( ofType ?
2058										node.nodeName.toLowerCase() === name :
2059										node.nodeType === 1 ) &&
2060										++diff ) {
2061
2062										// Cache the index of each encountered element
2063										if ( useCache ) {
2064											outerCache = node[ expando ] || (node[ expando ] = {});
2065
2066											// Support: IE <9 only
2067											// Defend against cloned attroperties (jQuery gh-1709)
2068											uniqueCache = outerCache[ node.uniqueID ] ||
2069												(outerCache[ node.uniqueID ] = {});
2070
2071											uniqueCache[ type ] = [ dirruns, diff ];
2072										}
2073
2074										if ( node === elem ) {
2075											break;
2076										}
2077									}
2078								}
2079							}
2080						}
2081
2082						// Incorporate the offset, then check against cycle size
2083						diff -= last;
2084						return diff === first || ( diff % first === 0 && diff / first >= 0 );
2085					}
2086				};
2087		},
2088
2089		"PSEUDO": function( pseudo, argument ) {
2090			// pseudo-class names are case-insensitive
2091			// http://www.w3.org/TR/selectors/#pseudo-classes
2092			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
2093			// Remember that setFilters inherits from pseudos
2094			var args,
2095				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
2096					Sizzle.error( "unsupported pseudo: " + pseudo );
2097
2098			// The user may use createPseudo to indicate that
2099			// arguments are needed to create the filter function
2100			// just as Sizzle does
2101			if ( fn[ expando ] ) {
2102				return fn( argument );
2103			}
2104
2105			// But maintain support for old signatures
2106			if ( fn.length > 1 ) {
2107				args = [ pseudo, pseudo, "", argument ];
2108				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
2109					markFunction(function( seed, matches ) {
2110						var idx,
2111							matched = fn( seed, argument ),
2112							i = matched.length;
2113						while ( i-- ) {
2114							idx = indexOf( seed, matched[i] );
2115							seed[ idx ] = !( matches[ idx ] = matched[i] );
2116						}
2117					}) :
2118					function( elem ) {
2119						return fn( elem, 0, args );
2120					};
2121			}
2122
2123			return fn;
2124		}
2125	},
2126
2127	pseudos: {
2128		// Potentially complex pseudos
2129		"not": markFunction(function( selector ) {
2130			// Trim the selector passed to compile
2131			// to avoid treating leading and trailing
2132			// spaces as combinators
2133			var input = [],
2134				results = [],
2135				matcher = compile( selector.replace( rtrim, "$1" ) );
2136
2137			return matcher[ expando ] ?
2138				markFunction(function( seed, matches, context, xml ) {
2139					var elem,
2140						unmatched = matcher( seed, null, xml, [] ),
2141						i = seed.length;
2142
2143					// Match elements unmatched by `matcher`
2144					while ( i-- ) {
2145						if ( (elem = unmatched[i]) ) {
2146							seed[i] = !(matches[i] = elem);
2147						}
2148					}
2149				}) :
2150				function( elem, context, xml ) {
2151					input[0] = elem;
2152					matcher( input, null, xml, results );
2153					// Don't keep the element (issue #299)
2154					input[0] = null;
2155					return !results.pop();
2156				};
2157		}),
2158
2159		"has": markFunction(function( selector ) {
2160			return function( elem ) {
2161				return Sizzle( selector, elem ).length > 0;
2162			};
2163		}),
2164
2165		"contains": markFunction(function( text ) {
2166			text = text.replace( runescape, funescape );
2167			return function( elem ) {
2168				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2169			};
2170		}),
2171
2172		// "Whether an element is represented by a :lang() selector
2173		// is based solely on the element's language value
2174		// being equal to the identifier C,
2175		// or beginning with the identifier C immediately followed by "-".
2176		// The matching of C against the element's language value is performed case-insensitively.
2177		// The identifier C does not have to be a valid language name."
2178		// http://www.w3.org/TR/selectors/#lang-pseudo
2179		"lang": markFunction( function( lang ) {
2180			// lang value must be a valid identifier
2181			if ( !ridentifier.test(lang || "") ) {
2182				Sizzle.error( "unsupported lang: " + lang );
2183			}
2184			lang = lang.replace( runescape, funescape ).toLowerCase();
2185			return function( elem ) {
2186				var elemLang;
2187				do {
2188					if ( (elemLang = documentIsHTML ?
2189						elem.lang :
2190						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2191
2192						elemLang = elemLang.toLowerCase();
2193						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2194					}
2195				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2196				return false;
vendor: 22,724 bytes, lines 2197-3019
2197			};
2198		}),
2199
2200		// Miscellaneous
2201		"target": function( elem ) {
2202			var hash = window.location && window.location.hash;
2203			return hash && hash.slice( 1 ) === elem.id;
2204		},
2205
2206		"root": function( elem ) {
2207			return elem === docElem;
2208		},
2209
2210		"focus": function( elem ) {
2211			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2212		},
2213
2214		// Boolean properties
2215		"enabled": createDisabledPseudo( false ),
2216		"disabled": createDisabledPseudo( true ),
2217
2218		"checked": function( elem ) {
2219			// In CSS3, :checked should return both checked and selected elements
2220			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2221			var nodeName = elem.nodeName.toLowerCase();
2222			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2223		},
2224
2225		"selected": function( elem ) {
2226			// Accessing this property makes selected-by-default
2227			// options in Safari work properly
2228			if ( elem.parentNode ) {
2229				elem.parentNode.selectedIndex;
2230			}
2231
2232			return elem.selected === true;
2233		},
2234
2235		// Contents
2236		"empty": function( elem ) {
2237			// http://www.w3.org/TR/selectors/#empty-pseudo
2238			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2239			//   but not by others (comment: 8; processing instruction: 7; etc.)
2240			// nodeType < 6 works because attributes (2) do not appear as children
2241			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2242				if ( elem.nodeType < 6 ) {
2243					return false;
2244				}
2245			}
2246			return true;
2247		},
2248
2249		"parent": function( elem ) {
2250			return !Expr.pseudos["empty"]( elem );
2251		},
2252
2253		// Element/input types
2254		"header": function( elem ) {
2255			return rheader.test( elem.nodeName );
2256		},
2257
2258		"input": function( elem ) {
2259			return rinputs.test( elem.nodeName );
2260		},
2261
2262		"button": function( elem ) {
2263			var name = elem.nodeName.toLowerCase();
2264			return name === "input" && elem.type === "button" || name === "button";
2265		},
2266
2267		"text": function( elem ) {
2268			var attr;
2269			return elem.nodeName.toLowerCase() === "input" &&
2270				elem.type === "text" &&
2271
2272				// Support: IE<8
2273				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2274				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2275		},
2276
2277		// Position-in-collection
2278		"first": createPositionalPseudo(function() {
2279			return [ 0 ];
2280		}),
2281
2282		"last": createPositionalPseudo(function( matchIndexes, length ) {
2283			return [ length - 1 ];
2284		}),
2285
2286		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2287			return [ argument < 0 ? argument + length : argument ];
2288		}),
2289
2290		"even": createPositionalPseudo(function( matchIndexes, length ) {
2291			var i = 0;
2292			for ( ; i < length; i += 2 ) {
2293				matchIndexes.push( i );
2294			}
2295			return matchIndexes;
2296		}),
2297
2298		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2299			var i = 1;
2300			for ( ; i < length; i += 2 ) {
2301				matchIndexes.push( i );
2302			}
2303			return matchIndexes;
2304		}),
2305
2306		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2307			var i = argument < 0 ? argument + length : argument;
2308			for ( ; --i >= 0; ) {
2309				matchIndexes.push( i );
2310			}
2311			return matchIndexes;
2312		}),
2313
2314		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2315			var i = argument < 0 ? argument + length : argument;
2316			for ( ; ++i < length; ) {
2317				matchIndexes.push( i );
2318			}
2319			return matchIndexes;
2320		})
2321	}
2322};
2323
2324Expr.pseudos["nth"] = Expr.pseudos["eq"];
2325
2326// Add button/input type pseudos
2327for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2328	Expr.pseudos[ i ] = createInputPseudo( i );
2329}
2330for ( i in { submit: true, reset: true } ) {
2331	Expr.pseudos[ i ] = createButtonPseudo( i );
2332}
2333
2334// Easy API for creating new setFilters
2335function setFilters() {}
2336setFilters.prototype = Expr.filters = Expr.pseudos;
2337Expr.setFilters = new setFilters();
2338
2339tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2340	var matched, match, tokens, type,
2341		soFar, groups, preFilters,
2342		cached = tokenCache[ selector + " " ];
2343
2344	if ( cached ) {
2345		return parseOnly ? 0 : cached.slice( 0 );
2346	}
2347
2348	soFar = selector;
2349	groups = [];
2350	preFilters = Expr.preFilter;
2351
2352	while ( soFar ) {
2353
2354		// Comma and first run
2355		if ( !matched || (match = rcomma.exec( soFar )) ) {
2356			if ( match ) {
2357				// Don't consume trailing commas as valid
2358				soFar = soFar.slice( match[0].length ) || soFar;
2359			}
2360			groups.push( (tokens = []) );
2361		}
2362
2363		matched = false;
2364
2365		// Combinators
2366		if ( (match = rcombinators.exec( soFar )) ) {
2367			matched = match.shift();
2368			tokens.push({
2369				value: matched,
2370				// Cast descendant combinators to space
2371				type: match[0].replace( rtrim, " " )
2372			});
2373			soFar = soFar.slice( matched.length );
2374		}
2375
2376		// Filters
2377		for ( type in Expr.filter ) {
2378			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2379				(match = preFilters[ type ]( match ))) ) {
2380				matched = match.shift();
2381				tokens.push({
2382					value: matched,
2383					type: type,
2384					matches: match
2385				});
2386				soFar = soFar.slice( matched.length );
2387			}
2388		}
2389
2390		if ( !matched ) {
2391			break;
2392		}
2393	}
2394
2395	// Return the length of the invalid excess
2396	// if we're just parsing
2397	// Otherwise, throw an error or return tokens
2398	return parseOnly ?
2399		soFar.length :
2400		soFar ?
2401			Sizzle.error( selector ) :
2402			// Cache the tokens
2403			tokenCache( selector, groups ).slice( 0 );
2404};
2405
2406function toSelector( tokens ) {
2407	var i = 0,
2408		len = tokens.length,
2409		selector = "";
2410	for ( ; i < len; i++ ) {
2411		selector += tokens[i].value;
2412	}
2413	return selector;
2414}
2415
2416function addCombinator( matcher, combinator, base ) {
2417	var dir = combinator.dir,
2418		skip = combinator.next,
2419		key = skip || dir,
2420		checkNonElements = base && key === "parentNode",
2421		doneName = done++;
2422
2423	return combinator.first ?
2424		// Check against closest ancestor/preceding element
2425		function( elem, context, xml ) {
2426			while ( (elem = elem[ dir ]) ) {
2427				if ( elem.nodeType === 1 || checkNonElements ) {
2428					return matcher( elem, context, xml );
2429				}
2430			}
2431			return false;
2432		} :
2433
2434		// Check against all ancestor/preceding elements
2435		function( elem, context, xml ) {
2436			var oldCache, uniqueCache, outerCache,
2437				newCache = [ dirruns, doneName ];
2438
2439			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2440			if ( xml ) {
2441				while ( (elem = elem[ dir ]) ) {
2442					if ( elem.nodeType === 1 || checkNonElements ) {
2443						if ( matcher( elem, context, xml ) ) {
2444							return true;
2445						}
2446					}
2447				}
2448			} else {
2449				while ( (elem = elem[ dir ]) ) {
2450					if ( elem.nodeType === 1 || checkNonElements ) {
2451						outerCache = elem[ expando ] || (elem[ expando ] = {});
2452
2453						// Support: IE <9 only
2454						// Defend against cloned attroperties (jQuery gh-1709)
2455						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2456
2457						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2458							elem = elem[ dir ] || elem;
2459						} else if ( (oldCache = uniqueCache[ key ]) &&
2460							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2461
2462							// Assign to newCache so results back-propagate to previous elements
2463							return (newCache[ 2 ] = oldCache[ 2 ]);
2464						} else {
2465							// Reuse newcache so results back-propagate to previous elements
2466							uniqueCache[ key ] = newCache;
2467
2468							// A match means we're done; a fail means we have to keep checking
2469							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2470								return true;
2471							}
2472						}
2473					}
2474				}
2475			}
2476			return false;
2477		};
2478}
2479
2480function elementMatcher( matchers ) {
2481	return matchers.length > 1 ?
2482		function( elem, context, xml ) {
2483			var i = matchers.length;
2484			while ( i-- ) {
2485				if ( !matchers[i]( elem, context, xml ) ) {
2486					return false;
2487				}
2488			}
2489			return true;
2490		} :
2491		matchers[0];
2492}
2493
2494function multipleContexts( selector, contexts, results ) {
2495	var i = 0,
2496		len = contexts.length;
2497	for ( ; i < len; i++ ) {
2498		Sizzle( selector, contexts[i], results );
2499	}
2500	return results;
2501}
2502
2503function condense( unmatched, map, filter, context, xml ) {
2504	var elem,
2505		newUnmatched = [],
2506		i = 0,
2507		len = unmatched.length,
2508		mapped = map != null;
2509
2510	for ( ; i < len; i++ ) {
2511		if ( (elem = unmatched[i]) ) {
2512			if ( !filter || filter( elem, context, xml ) ) {
2513				newUnmatched.push( elem );
2514				if ( mapped ) {
2515					map.push( i );
2516				}
2517			}
2518		}
2519	}
2520
2521	return newUnmatched;
2522}
2523
2524function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2525	if ( postFilter && !postFilter[ expando ] ) {
2526		postFilter = setMatcher( postFilter );
2527	}
2528	if ( postFinder && !postFinder[ expando ] ) {
2529		postFinder = setMatcher( postFinder, postSelector );
2530	}
2531	return markFunction(function( seed, results, context, xml ) {
2532		var temp, i, elem,
2533			preMap = [],
2534			postMap = [],
2535			preexisting = results.length,
2536
2537			// Get initial elements from seed or context
2538			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2539
2540			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2541			matcherIn = preFilter && ( seed || !selector ) ?
2542				condense( elems, preMap, preFilter, context, xml ) :
2543				elems,
2544
2545			matcherOut = matcher ?
2546				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2547				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2548
2549					// ...intermediate processing is necessary
2550					[] :
2551
2552					// ...otherwise use results directly
2553					results :
2554				matcherIn;
2555
2556		// Find primary matches
2557		if ( matcher ) {
2558			matcher( matcherIn, matcherOut, context, xml );
2559		}
2560
2561		// Apply postFilter
2562		if ( postFilter ) {
2563			temp = condense( matcherOut, postMap );
2564			postFilter( temp, [], context, xml );
2565
2566			// Un-match failing elements by moving them back to matcherIn
2567			i = temp.length;
2568			while ( i-- ) {
2569				if ( (elem = temp[i]) ) {
2570					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2571				}
2572			}
2573		}
2574
2575		if ( seed ) {
2576			if ( postFinder || preFilter ) {
2577				if ( postFinder ) {
2578					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2579					temp = [];
2580					i = matcherOut.length;
2581					while ( i-- ) {
2582						if ( (elem = matcherOut[i]) ) {
2583							// Restore matcherIn since elem is not yet a final match
2584							temp.push( (matcherIn[i] = elem) );
2585						}
2586					}
2587					postFinder( null, (matcherOut = []), temp, xml );
2588				}
2589
2590				// Move matched elements from seed to results to keep them synchronized
2591				i = matcherOut.length;
2592				while ( i-- ) {
2593					if ( (elem = matcherOut[i]) &&
2594						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2595
2596						seed[temp] = !(results[temp] = elem);
2597					}
2598				}
2599			}
2600
2601		// Add elements to results, through postFinder if defined
2602		} else {
2603			matcherOut = condense(
2604				matcherOut === results ?
2605					matcherOut.splice( preexisting, matcherOut.length ) :
2606					matcherOut
2607			);
2608			if ( postFinder ) {
2609				postFinder( null, results, matcherOut, xml );
2610			} else {
2611				push.apply( results, matcherOut );
2612			}
2613		}
2614	});
2615}
2616
2617function matcherFromTokens( tokens ) {
2618	var checkContext, matcher, j,
2619		len = tokens.length,
2620		leadingRelative = Expr.relative[ tokens[0].type ],
2621		implicitRelative = leadingRelative || Expr.relative[" "],
2622		i = leadingRelative ? 1 : 0,
2623
2624		// The foundational matcher ensures that elements are reachable from top-level context(s)
2625		matchContext = addCombinator( function( elem ) {
2626			return elem === checkContext;
2627		}, implicitRelative, true ),
2628		matchAnyContext = addCombinator( function( elem ) {
2629			return indexOf( checkContext, elem ) > -1;
2630		}, implicitRelative, true ),
2631		matchers = [ function( elem, context, xml ) {
2632			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2633				(checkContext = context).nodeType ?
2634					matchContext( elem, context, xml ) :
2635					matchAnyContext( elem, context, xml ) );
2636			// Avoid hanging onto element (issue #299)
2637			checkContext = null;
2638			return ret;
2639		} ];
2640
2641	for ( ; i < len; i++ ) {
2642		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2643			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2644		} else {
2645			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2646
2647			// Return special upon seeing a positional matcher
2648			if ( matcher[ expando ] ) {
2649				// Find the next relative operator (if any) for proper handling
2650				j = ++i;
2651				for ( ; j < len; j++ ) {
2652					if ( Expr.relative[ tokens[j].type ] ) {
2653						break;
2654					}
2655				}
2656				return setMatcher(
2657					i > 1 && elementMatcher( matchers ),
2658					i > 1 && toSelector(
2659						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2660						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2661					).replace( rtrim, "$1" ),
2662					matcher,
2663					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2664					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2665					j < len && toSelector( tokens )
2666				);
2667			}
2668			matchers.push( matcher );
2669		}
2670	}
2671
2672	return elementMatcher( matchers );
2673}
2674
2675function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2676	var bySet = setMatchers.length > 0,
2677		byElement = elementMatchers.length > 0,
2678		superMatcher = function( seed, context, xml, results, outermost ) {
2679			var elem, j, matcher,
2680				matchedCount = 0,
2681				i = "0",
2682				unmatched = seed && [],
2683				setMatched = [],
2684				contextBackup = outermostContext,
2685				// We must always have either seed elements or outermost context
2686				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2687				// Use integer dirruns iff this is the outermost matcher
2688				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2689				len = elems.length;
2690
2691			if ( outermost ) {
2692				outermostContext = context === document || context || outermost;
2693			}
2694
2695			// Add elements passing elementMatchers directly to results
2696			// Support: IE<9, Safari
2697			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2698			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2699				if ( byElement && elem ) {
2700					j = 0;
2701					if ( !context && elem.ownerDocument !== document ) {
2702						setDocument( elem );
2703						xml = !documentIsHTML;
2704					}
2705					while ( (matcher = elementMatchers[j++]) ) {
2706						if ( matcher( elem, context || document, xml) ) {
2707							results.push( elem );
2708							break;
2709						}
2710					}
2711					if ( outermost ) {
2712						dirruns = dirrunsUnique;
2713					}
2714				}
2715
2716				// Track unmatched elements for set filters
2717				if ( bySet ) {
2718					// They will have gone through all possible matchers
2719					if ( (elem = !matcher && elem) ) {
2720						matchedCount--;
2721					}
2722
2723					// Lengthen the array for every element, matched or not
2724					if ( seed ) {
2725						unmatched.push( elem );
2726					}
2727				}
2728			}
2729
2730			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2731			// makes the latter nonnegative.
2732			matchedCount += i;
2733
2734			// Apply set filters to unmatched elements
2735			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2736			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2737			// no element matchers and no seed.
2738			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2739			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2740			// numerically zero.
2741			if ( bySet && i !== matchedCount ) {
2742				j = 0;
2743				while ( (matcher = setMatchers[j++]) ) {
2744					matcher( unmatched, setMatched, context, xml );
2745				}
2746
2747				if ( seed ) {
2748					// Reintegrate element matches to eliminate the need for sorting
2749					if ( matchedCount > 0 ) {
2750						while ( i-- ) {
2751							if ( !(unmatched[i] || setMatched[i]) ) {
2752								setMatched[i] = pop.call( results );
2753							}
2754						}
2755					}
2756
2757					// Discard index placeholder values to get only actual matches
2758					setMatched = condense( setMatched );
2759				}
2760
2761				// Add matches to results
2762				push.apply( results, setMatched );
2763
2764				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2765				if ( outermost && !seed && setMatched.length > 0 &&
2766					( matchedCount + setMatchers.length ) > 1 ) {
2767
2768					Sizzle.uniqueSort( results );
2769				}
2770			}
2771
2772			// Override manipulation of globals by nested matchers
2773			if ( outermost ) {
2774				dirruns = dirrunsUnique;
2775				outermostContext = contextBackup;
2776			}
2777
2778			return unmatched;
2779		};
2780
2781	return bySet ?
2782		markFunction( superMatcher ) :
2783		superMatcher;
2784}
2785
2786compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2787	var i,
2788		setMatchers = [],
2789		elementMatchers = [],
2790		cached = compilerCache[ selector + " " ];
2791
2792	if ( !cached ) {
2793		// Generate a function of recursive functions that can be used to check each element
2794		if ( !match ) {
2795			match = tokenize( selector );
2796		}
2797		i = match.length;
2798		while ( i-- ) {
2799			cached = matcherFromTokens( match[i] );
2800			if ( cached[ expando ] ) {
2801				setMatchers.push( cached );
2802			} else {
2803				elementMatchers.push( cached );
2804			}
2805		}
2806
2807		// Cache the compiled function
2808		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2809
2810		// Save selector and tokenization
2811		cached.selector = selector;
2812	}
2813	return cached;
2814};
2815
2816/**
2817 * A low-level selection function that works with Sizzle's compiled
2818 *  selector functions
2819 * @param {String|Function} selector A selector or a pre-compiled
2820 *  selector function built with Sizzle.compile
2821 * @param {Element} context
2822 * @param {Array} [results]
2823 * @param {Array} [seed] A set of elements to match against
2824 */
2825select = Sizzle.select = function( selector, context, results, seed ) {
2826	var i, tokens, token, type, find,
2827		compiled = typeof selector === "function" && selector,
2828		match = !seed && tokenize( (selector = compiled.selector || selector) );
2829
2830	results = results || [];
2831
2832	// Try to minimize operations if there is only one selector in the list and no seed
2833	// (the latter of which guarantees us context)
2834	if ( match.length === 1 ) {
2835
2836		// Reduce context if the leading compound selector is an ID
2837		tokens = match[0] = match[0].slice( 0 );
2838		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2839				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2840
2841			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2842			if ( !context ) {
2843				return results;
2844
2845			// Precompiled matchers will still verify ancestry, so step up a level
2846			} else if ( compiled ) {
2847				context = context.parentNode;
2848			}
2849
2850			selector = selector.slice( tokens.shift().value.length );
2851		}
2852
2853		// Fetch a seed set for right-to-left matching
2854		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2855		while ( i-- ) {
2856			token = tokens[i];
2857
2858			// Abort if we hit a combinator
2859			if ( Expr.relative[ (type = token.type) ] ) {
2860				break;
2861			}
2862			if ( (find = Expr.find[ type ]) ) {
2863				// Search, expanding context for leading sibling combinators
2864				if ( (seed = find(
2865					token.matches[0].replace( runescape, funescape ),
2866					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2867				)) ) {
2868
2869					// If seed is empty or no tokens remain, we can return early
2870					tokens.splice( i, 1 );
2871					selector = seed.length && toSelector( tokens );
2872					if ( !selector ) {
2873						push.apply( results, seed );
2874						return results;
2875					}
2876
2877					break;
2878				}
2879			}
2880		}
2881	}
2882
2883	// Compile and execute a filtering function if one is not provided
2884	// Provide `match` to avoid retokenization if we modified the selector above
2885	( compiled || compile( selector, match ) )(
2886		seed,
2887		context,
2888		!documentIsHTML,
2889		results,
2890		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2891	);
2892	return results;
2893};
2894
2895// One-time assignments
2896
2897// Sort stability
2898support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2899
2900// Support: Chrome 14-35+
2901// Always assume duplicates if they aren't passed to the comparison function
2902support.detectDuplicates = !!hasDuplicate;
2903
2904// Initialize against the default document
2905setDocument();
2906
2907// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2908// Detached nodes confoundingly follow *each other*
2909support.sortDetached = assert(function( el ) {
2910	// Should return 1, but returns 4 (following)
2911	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2912});
2913
2914// Support: IE<8
2915// Prevent attribute/property "interpolation"
2916// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2917if ( !assert(function( el ) {
2918	el.innerHTML = "<a href='#'></a>";
2919	return el.firstChild.getAttribute("href") === "#" ;
2920}) ) {
2921	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2922		if ( !isXML ) {
2923			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2924		}
2925	});
2926}
2927
2928// Support: IE<9
2929// Use defaultValue in place of getAttribute("value")
2930if ( !support.attributes || !assert(function( el ) {
2931	el.innerHTML = "<input/>";
2932	el.firstChild.setAttribute( "value", "" );
2933	return el.firstChild.getAttribute( "value" ) === "";
2934}) ) {
2935	addHandle( "value", function( elem, name, isXML ) {
2936		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2937			return elem.defaultValue;
2938		}
2939	});
2940}
2941
2942// Support: IE<9
2943// Use getAttributeNode to fetch booleans when getAttribute lies
2944if ( !assert(function( el ) {
2945	return el.getAttribute("disabled") == null;
2946}) ) {
2947	addHandle( booleans, function( elem, name, isXML ) {
2948		var val;
2949		if ( !isXML ) {
2950			return elem[ name ] === true ? name.toLowerCase() :
2951					(val = elem.getAttributeNode( name )) && val.specified ?
2952					val.value :
2953				null;
2954		}
2955	});
2956}
2957
2958return Sizzle;
2959
2960})( window );
2961
2962
2963
2964jQuery.find = Sizzle;
2965jQuery.expr = Sizzle.selectors;
2966
2967// Deprecated
2968jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2969jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2970jQuery.text = Sizzle.getText;
2971jQuery.isXMLDoc = Sizzle.isXML;
2972jQuery.contains = Sizzle.contains;
2973jQuery.escapeSelector = Sizzle.escape;
2974
2975
2976
2977
2978var dir = function( elem, dir, until ) {
2979	var matched = [],
2980		truncate = until !== undefined;
2981
2982	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2983		if ( elem.nodeType === 1 ) {
2984			if ( truncate && jQuery( elem ).is( until ) ) {
2985				break;
2986			}
2987			matched.push( elem );
2988		}
2989	}
2990	return matched;
2991};
2992
2993
2994var siblings = function( n, elem ) {
2995	var matched = [];
2996
2997	for ( ; n; n = n.nextSibling ) {
2998		if ( n.nodeType === 1 && n !== elem ) {
2999			matched.push( n );
3000		}
3001	}
3002
3003	return matched;
3004};
3005
3006
3007var rneedsContext = jQuery.expr.match.needsContext;
3008
3009
3010
3011function nodeName( elem, name ) {
3012
3013  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
3014
3015};
3016var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
3017
3018
3019
vendor: 1,441 bytes, lines 3020-3068
3020var risSimple = /^.[^:#\[\.,]*$/;
3021
3022// Implement the identical functionality for filter and not
3023function winnow( elements, qualifier, not ) {
3024	if ( jQuery.isFunction( qualifier ) ) {
3025		return jQuery.grep( elements, function( elem, i ) {
3026			return !!qualifier.call( elem, i, elem ) !== not;
3027		} );
3028	}
3029
3030	// Single element
3031	if ( qualifier.nodeType ) {
3032		return jQuery.grep( elements, function( elem ) {
3033			return ( elem === qualifier ) !== not;
3034		} );
3035	}
3036
3037	// Arraylike of elements (jQuery, arguments, Array)
3038	if ( typeof qualifier !== "string" ) {
3039		return jQuery.grep( elements, function( elem ) {
3040			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
3041		} );
3042	}
3043
3044	// Simple selector that can be filtered directly, removing non-Elements
3045	if ( risSimple.test( qualifier ) ) {
3046		return jQuery.filter( qualifier, elements, not );
3047	}
3048
3049	// Complex selector, compare the two sets, removing non-Elements
3050	qualifier = jQuery.filter( qualifier, elements );
3051	return jQuery.grep( elements, function( elem ) {
3052		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
3053	} );
3054}
3055
3056jQuery.filter = function( expr, elems, not ) {
3057	var elem = elems[ 0 ];
3058
3059	if ( not ) {
3060		expr = ":not(" + expr + ")";
3061	}
3062
3063	if ( elems.length === 1 && elem.nodeType === 1 ) {
3064		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
3065	}
3066
3067	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
3068		return elem.nodeType === 1;
vendor: 4,831 bytes, lines 3069-3264
3069	} ) );
3070};
3071
3072jQuery.fn.extend( {
3073	find: function( selector ) {
3074		var i, ret,
3075			len = this.length,
3076			self = this;
3077
3078		if ( typeof selector !== "string" ) {
3079			return this.pushStack( jQuery( selector ).filter( function() {
3080				for ( i = 0; i < len; i++ ) {
3081					if ( jQuery.contains( self[ i ], this ) ) {
3082						return true;
3083					}
3084				}
3085			} ) );
3086		}
3087
3088		ret = this.pushStack( [] );
3089
3090		for ( i = 0; i < len; i++ ) {
3091			jQuery.find( selector, self[ i ], ret );
3092		}
3093
3094		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
3095	},
3096	filter: function( selector ) {
3097		return this.pushStack( winnow( this, selector || [], false ) );
3098	},
3099	not: function( selector ) {
3100		return this.pushStack( winnow( this, selector || [], true ) );
3101	},
3102	is: function( selector ) {
3103		return !!winnow(
3104			this,
3105
3106			// If this is a positional/relative selector, check membership in the returned set
3107			// so $("p:first").is("p:last") won't return true for a doc with two "p".
3108			typeof selector === "string" && rneedsContext.test( selector ) ?
3109				jQuery( selector ) :
3110				selector || [],
3111			false
3112		).length;
3113	}
3114} );
3115
3116
3117// Initialize a jQuery object
3118
3119
3120// A central reference to the root jQuery(document)
3121var rootjQuery,
3122
3123	// A simple way to check for HTML strings
3124	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
3125	// Strict HTML recognition (#11290: must start with <)
3126	// Shortcut simple #id case for speed
3127	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
3128
3129	init = jQuery.fn.init = function( selector, context, root ) {
3130		var match, elem;
3131
3132		// HANDLE: $(""), $(null), $(undefined), $(false)
3133		if ( !selector ) {
3134			return this;
3135		}
3136
3137		// Method init() accepts an alternate rootjQuery
3138		// so migrate can support jQuery.sub (gh-2101)
3139		root = root || rootjQuery;
3140
3141		// Handle HTML strings
3142		if ( typeof selector === "string" ) {
3143			if ( selector[ 0 ] === "<" &&
3144				selector[ selector.length - 1 ] === ">" &&
3145				selector.length >= 3 ) {
3146
3147				// Assume that strings that start and end with <> are HTML and skip the regex check
3148				match = [ null, selector, null ];
3149
3150			} else {
3151				match = rquickExpr.exec( selector );
3152			}
3153
3154			// Match html or make sure no context is specified for #id
3155			if ( match && ( match[ 1 ] || !context ) ) {
3156
3157				// HANDLE: $(html) -> $(array)
3158				if ( match[ 1 ] ) {
3159					context = context instanceof jQuery ? context[ 0 ] : context;
3160
3161					// Option to run scripts is true for back-compat
3162					// Intentionally let the error be thrown if parseHTML is not present
3163					jQuery.merge( this, jQuery.parseHTML(
3164						match[ 1 ],
3165						context && context.nodeType ? context.ownerDocument || context : document,
3166						true
3167					) );
3168
3169					// HANDLE: $(html, props)
3170					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3171						for ( match in context ) {
3172
3173							// Properties of context are called as methods if possible
3174							if ( jQuery.isFunction( this[ match ] ) ) {
3175								this[ match ]( context[ match ] );
3176
3177							// ...and otherwise set as attributes
3178							} else {
3179								this.attr( match, context[ match ] );
3180							}
3181						}
3182					}
3183
3184					return this;
3185
3186				// HANDLE: $(#id)
3187				} else {
3188					elem = document.getElementById( match[ 2 ] );
3189
3190					if ( elem ) {
3191
3192						// Inject the element directly into the jQuery object
3193						this[ 0 ] = elem;
3194						this.length = 1;
3195					}
3196					return this;
3197				}
3198
3199			// HANDLE: $(expr, $(...))
3200			} else if ( !context || context.jquery ) {
3201				return ( context || root ).find( selector );
3202
3203			// HANDLE: $(expr, context)
3204			// (which is just equivalent to: $(context).find(expr)
3205			} else {
3206				return this.constructor( context ).find( selector );
3207			}
3208
3209		// HANDLE: $(DOMElement)
3210		} else if ( selector.nodeType ) {
3211			this[ 0 ] = selector;
3212			this.length = 1;
3213			return this;
3214
3215		// HANDLE: $(function)
3216		// Shortcut for document ready
3217		} else if ( jQuery.isFunction( selector ) ) {
3218			return root.ready !== undefined ?
3219				root.ready( selector ) :
3220
3221				// Execute immediately if ready is not present
3222				selector( jQuery );
3223		}
3224
3225		return jQuery.makeArray( selector, this );
3226	};
3227
3228// Give the init function the jQuery prototype for later instantiation
3229init.prototype = jQuery.fn;
3230
3231// Initialize central reference
3232rootjQuery = jQuery( document );
3233
3234
3235var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3236
3237	// Methods guaranteed to produce a unique set when starting from a unique set
3238	guaranteedUnique = {
3239		children: true,
3240		contents: true,
3241		next: true,
3242		prev: true
3243	};
3244
3245jQuery.fn.extend( {
3246	has: function( target ) {
3247		var targets = jQuery( target, this ),
3248			l = targets.length;
3249
3250		return this.filter( function() {
3251			var i = 0;
3252			for ( ; i < l; i++ ) {
3253				if ( jQuery.contains( this, targets[ i ] ) ) {
3254					return true;
3255				}
3256			}
3257		} );
3258	},
3259
3260	closest: function( selectors, context ) {
3261		var cur,
3262			i = 0,
3263			l = this.length,
3264			matched = [],
vendor: 6,797 bytes, lines 3265-3532
3265			targets = typeof selectors !== "string" && jQuery( selectors );
3266
3267		// Positional selectors never match, since there's no _selection_ context
3268		if ( !rneedsContext.test( selectors ) ) {
3269			for ( ; i < l; i++ ) {
3270				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3271
3272					// Always skip document fragments
3273					if ( cur.nodeType < 11 && ( targets ?
3274						targets.index( cur ) > -1 :
3275
3276						// Don't pass non-elements to Sizzle
3277						cur.nodeType === 1 &&
3278							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3279
3280						matched.push( cur );
3281						break;
3282					}
3283				}
3284			}
3285		}
3286
3287		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3288	},
3289
3290	// Determine the position of an element within the set
3291	index: function( elem ) {
3292
3293		// No argument, return index in parent
3294		if ( !elem ) {
3295			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3296		}
3297
3298		// Index in selector
3299		if ( typeof elem === "string" ) {
3300			return indexOf.call( jQuery( elem ), this[ 0 ] );
3301		}
3302
3303		// Locate the position of the desired element
3304		return indexOf.call( this,
3305
3306			// If it receives a jQuery object, the first element is used
3307			elem.jquery ? elem[ 0 ] : elem
3308		);
3309	},
3310
3311	add: function( selector, context ) {
3312		return this.pushStack(
3313			jQuery.uniqueSort(
3314				jQuery.merge( this.get(), jQuery( selector, context ) )
3315			)
3316		);
3317	},
3318
3319	addBack: function( selector ) {
3320		return this.add( selector == null ?
3321			this.prevObject : this.prevObject.filter( selector )
3322		);
3323	}
3324} );
3325
3326function sibling( cur, dir ) {
3327	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3328	return cur;
3329}
3330
3331jQuery.each( {
3332	parent: function( elem ) {
3333		var parent = elem.parentNode;
3334		return parent && parent.nodeType !== 11 ? parent : null;
3335	},
3336	parents: function( elem ) {
3337		return dir( elem, "parentNode" );
3338	},
3339	parentsUntil: function( elem, i, until ) {
3340		return dir( elem, "parentNode", until );
3341	},
3342	next: function( elem ) {
3343		return sibling( elem, "nextSibling" );
3344	},
3345	prev: function( elem ) {
3346		return sibling( elem, "previousSibling" );
3347	},
3348	nextAll: function( elem ) {
3349		return dir( elem, "nextSibling" );
3350	},
3351	prevAll: function( elem ) {
3352		return dir( elem, "previousSibling" );
3353	},
3354	nextUntil: function( elem, i, until ) {
3355		return dir( elem, "nextSibling", until );
3356	},
3357	prevUntil: function( elem, i, until ) {
3358		return dir( elem, "previousSibling", until );
3359	},
3360	siblings: function( elem ) {
3361		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3362	},
3363	children: function( elem ) {
3364		return siblings( elem.firstChild );
3365	},
3366	contents: function( elem ) {
3367        if ( nodeName( elem, "iframe" ) ) {
3368            return elem.contentDocument;
3369        }
3370
3371        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3372        // Treat the template element as a regular one in browsers that
3373        // don't support it.
3374        if ( nodeName( elem, "template" ) ) {
3375            elem = elem.content || elem;
3376        }
3377
3378        return jQuery.merge( [], elem.childNodes );
3379	}
3380}, function( name, fn ) {
3381	jQuery.fn[ name ] = function( until, selector ) {
3382		var matched = jQuery.map( this, fn, until );
3383
3384		if ( name.slice( -5 ) !== "Until" ) {
3385			selector = until;
3386		}
3387
3388		if ( selector && typeof selector === "string" ) {
3389			matched = jQuery.filter( selector, matched );
3390		}
3391
3392		if ( this.length > 1 ) {
3393
3394			// Remove duplicates
3395			if ( !guaranteedUnique[ name ] ) {
3396				jQuery.uniqueSort( matched );
3397			}
3398
3399			// Reverse order for parents* and prev-derivatives
3400			if ( rparentsprev.test( name ) ) {
3401				matched.reverse();
3402			}
3403		}
3404
3405		return this.pushStack( matched );
3406	};
3407} );
3408var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3409
3410
3411
3412// Convert String-formatted options into Object-formatted ones
3413function createOptions( options ) {
3414	var object = {};
3415	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3416		object[ flag ] = true;
3417	} );
3418	return object;
3419}
3420
3421/*
3422 * Create a callback list using the following parameters:
3423 *
3424 *	options: an optional list of space-separated options that will change how
3425 *			the callback list behaves or a more traditional option object
3426 *
3427 * By default a callback list will act like an event callback list and can be
3428 * "fired" multiple times.
3429 *
3430 * Possible options:
3431 *
3432 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3433 *
3434 *	memory:			will keep track of previous values and will call any callback added
3435 *					after the list has been fired right away with the latest "memorized"
3436 *					values (like a Deferred)
3437 *
3438 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3439 *
3440 *	stopOnFalse:	interrupt callings when a callback returns false
3441 *
3442 */
3443jQuery.Callbacks = function( options ) {
3444
3445	// Convert options from String-formatted to Object-formatted if needed
3446	// (we check in cache first)
3447	options = typeof options === "string" ?
3448		createOptions( options ) :
3449		jQuery.extend( {}, options );
3450
3451	var // Flag to know if list is currently firing
3452		firing,
3453
3454		// Last fire value for non-forgettable lists
3455		memory,
3456
3457		// Flag to know if list was already fired
3458		fired,
3459
3460		// Flag to prevent firing
3461		locked,
3462
3463		// Actual callback list
3464		list = [],
3465
3466		// Queue of execution data for repeatable lists
3467		queue = [],
3468
3469		// Index of currently firing callback (modified by add/remove as needed)
3470		firingIndex = -1,
3471
3472		// Fire callbacks
3473		fire = function() {
3474
3475			// Enforce single-firing
3476			locked = locked || options.once;
3477
3478			// Execute callbacks for all pending executions,
3479			// respecting firingIndex overrides and runtime changes
3480			fired = firing = true;
3481			for ( ; queue.length; firingIndex = -1 ) {
3482				memory = queue.shift();
3483				while ( ++firingIndex < list.length ) {
3484
3485					// Run callback and check for early termination
3486					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3487						options.stopOnFalse ) {
3488
3489						// Jump to end and forget the data so .add doesn't re-fire
3490						firingIndex = list.length;
3491						memory = false;
3492					}
3493				}
3494			}
3495
3496			// Forget the data if we're done with it
3497			if ( !options.memory ) {
3498				memory = false;
3499			}
3500
3501			firing = false;
3502
3503			// Clean up if we're done firing for good
3504			if ( locked ) {
3505
3506				// Keep an empty list if we have data for future add calls
3507				if ( memory ) {
3508					list = [];
3509
3510				// Otherwise, this object is spent
3511				} else {
3512					list = "";
3513				}
3514			}
3515		},
3516
3517		// Actual Callbacks object
3518		self = {
3519
3520			// Add a callback or a collection of callbacks to the list
3521			add: function() {
3522				if ( list ) {
3523
3524					// If we have memory from a past run, we should fire after adding
3525					if ( memory && !firing ) {
3526						firingIndex = list.length - 1;
3527						queue.push( memory );
3528					}
3529
3530					( function add( args ) {
3531						jQuery.each( args, function( _, arg ) {
3532							if ( 
vendor: 3,423 bytes, lines 3532-3674
3532jQuery.isFunction( arg ) ) {
3533								if ( !options.unique || !self.has( arg ) ) {
3534									list.push( arg );
3535								}
3536							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3537
3538								// Inspect recursively
3539								add( arg );
3540							}
3541						} );
3542					} )( arguments );
3543
3544					if ( memory && !firing ) {
3545						fire();
3546					}
3547				}
3548				return this;
3549			},
3550
3551			// Remove a callback from the list
3552			remove: function() {
3553				jQuery.each( arguments, function( _, arg ) {
3554					var index;
3555					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3556						list.splice( index, 1 );
3557
3558						// Handle firing indexes
3559						if ( index <= firingIndex ) {
3560							firingIndex--;
3561						}
3562					}
3563				} );
3564				return this;
3565			},
3566
3567			// Check if a given callback is in the list.
3568			// If no argument is given, return whether or not list has callbacks attached.
3569			has: function( fn ) {
3570				return fn ?
3571					jQuery.inArray( fn, list ) > -1 :
3572					list.length > 0;
3573			},
3574
3575			// Remove all callbacks from the list
3576			empty: function() {
3577				if ( list ) {
3578					list = [];
3579				}
3580				return this;
3581			},
3582
3583			// Disable .fire and .add
3584			// Abort any current/pending executions
3585			// Clear all callbacks and values
3586			disable: function() {
3587				locked = queue = [];
3588				list = memory = "";
3589				return this;
3590			},
3591			disabled: function() {
3592				return !list;
3593			},
3594
3595			// Disable .fire
3596			// Also disable .add unless we have memory (since it would have no effect)
3597			// Abort any pending executions
3598			lock: function() {
3599				locked = queue = [];
3600				if ( !memory && !firing ) {
3601					list = memory = "";
3602				}
3603				return this;
3604			},
3605			locked: function() {
3606				return !!locked;
3607			},
3608
3609			// Call all callbacks with the given context and arguments
3610			fireWith: function( context, args ) {
3611				if ( !locked ) {
3612					args = args || [];
3613					args = [ context, args.slice ? args.slice() : args ];
3614					queue.push( args );
3615					if ( !firing ) {
3616						fire();
3617					}
3618				}
3619				return this;
3620			},
3621
3622			// Call all the callbacks with the given arguments
3623			fire: function() {
3624				self.fireWith( this, arguments );
3625				return this;
3626			},
3627
3628			// To know if the callbacks have already been called at least once
3629			fired: function() {
3630				return !!fired;
3631			}
3632		};
3633
3634	return self;
3635};
3636
3637
3638function Identity( v ) {
3639	return v;
3640}
3641function Thrower( ex ) {
3642	throw ex;
3643}
3644
3645function adoptValue( value, resolve, reject, noValue ) {
3646	var method;
3647
3648	try {
3649
3650		// Check for promise aspect first to privilege synchronous behavior
3651		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3652			method.call( value ).done( resolve ).fail( reject );
3653
3654		// Other thenables
3655		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3656			method.call( value, resolve, reject );
3657
3658		// Other non-thenables
3659		} else {
3660
3661			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3662			// * false: [ value ].slice( 0 ) => resolve( value )
3663			// * true: [ value ].slice( 1 ) => resolve()
3664			resolve.apply( undefined, [ value ].slice( noValue ) );
3665		}
3666
3667	// For Promises/A+, convert exceptions into rejections
3668	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3669	// Deferred#then to conditionally suppress rejection.
3670	} catch ( value ) {
3671
3672		// Support: Android 4.0 only
3673		// Strict mode functions invoked without .call/.apply get global-object context
3674		reject.apply( undefined, [ value ]
vendor: 9,153 bytes, lines 3674-3999
3674 );
3675	}
3676}
3677
3678jQuery.extend( {
3679
3680	Deferred: function( func ) {
3681		var tuples = [
3682
3683				// action, add listener, callbacks,
3684				// ... .then handlers, argument index, [final state]
3685				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3686					jQuery.Callbacks( "memory" ), 2 ],
3687				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3688					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3689				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3690					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3691			],
3692			state = "pending",
3693			promise = {
3694				state: function() {
3695					return state;
3696				},
3697				always: function() {
3698					deferred.done( arguments ).fail( arguments );
3699					return this;
3700				},
3701				"catch": function( fn ) {
3702					return promise.then( null, fn );
3703				},
3704
3705				// Keep pipe for back-compat
3706				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3707					var fns = arguments;
3708
3709					return jQuery.Deferred( function( newDefer ) {
3710						jQuery.each( tuples, function( i, tuple ) {
3711
3712							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3713							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3714
3715							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3716							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3717							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3718							deferred[ tuple[ 1 ] ]( function() {
3719								var returned = fn && fn.apply( this, arguments );
3720								if ( returned && jQuery.isFunction( returned.promise ) ) {
3721									returned.promise()
3722										.progress( newDefer.notify )
3723										.done( newDefer.resolve )
3724										.fail( newDefer.reject );
3725								} else {
3726									newDefer[ tuple[ 0 ] + "With" ](
3727										this,
3728										fn ? [ returned ] : arguments
3729									);
3730								}
3731							} );
3732						} );
3733						fns = null;
3734					} ).promise();
3735				},
3736				then: function( onFulfilled, onRejected, onProgress ) {
3737					var maxDepth = 0;
3738					function resolve( depth, deferred, handler, special ) {
3739						return function() {
3740							var that = this,
3741								args = arguments,
3742								mightThrow = function() {
3743									var returned, then;
3744
3745									// Support: Promises/A+ section 2.3.3.3.3
3746									// https://promisesaplus.com/#point-59
3747									// Ignore double-resolution attempts
3748									if ( depth < maxDepth ) {
3749										return;
3750									}
3751
3752									returned = handler.apply( that, args );
3753
3754									// Support: Promises/A+ section 2.3.1
3755									// https://promisesaplus.com/#point-48
3756									if ( returned === deferred.promise() ) {
3757										throw new TypeError( "Thenable self-resolution" );
3758									}
3759
3760									// Support: Promises/A+ sections 2.3.3.1, 3.5
3761									// https://promisesaplus.com/#point-54
3762									// https://promisesaplus.com/#point-75
3763									// Retrieve `then` only once
3764									then = returned &&
3765
3766										// Support: Promises/A+ section 2.3.4
3767										// https://promisesaplus.com/#point-64
3768										// Only check objects and functions for thenability
3769										( typeof returned === "object" ||
3770											typeof returned === "function" ) &&
3771										returned.then;
3772
3773									// Handle a returned thenable
3774									if ( jQuery.isFunction( then ) ) {
3775
3776										// Special processors (notify) just wait for resolution
3777										if ( special ) {
3778											then.call(
3779												returned,
3780												resolve( maxDepth, deferred, Identity, special ),
3781												resolve( maxDepth, deferred, Thrower, special )
3782											);
3783
3784										// Normal processors (resolve) also hook into progress
3785										} else {
3786
3787											// ...and disregard older resolution values
3788											maxDepth++;
3789
3790											then.call(
3791												returned,
3792												resolve( maxDepth, deferred, Identity, special ),
3793												resolve( maxDepth, deferred, Thrower, special ),
3794												resolve( maxDepth, deferred, Identity,
3795													deferred.notifyWith )
3796											);
3797										}
3798
3799									// Handle all other returned values
3800									} else {
3801
3802										// Only substitute handlers pass on context
3803										// and multiple values (non-spec behavior)
3804										if ( handler !== Identity ) {
3805											that = undefined;
3806											args = [ returned ];
3807										}
3808
3809										// Process the value(s)
3810										// Default process is resolve
3811										( special || deferred.resolveWith )( that, args );
3812									}
3813								},
3814
3815								// Only normal processors (resolve) catch and reject exceptions
3816								process = special ?
3817									mightThrow :
3818									function() {
3819										try {
3820											mightThrow();
3821										} catch ( e ) {
3822
3823											if ( jQuery.Deferred.exceptionHook ) {
3824												jQuery.Deferred.exceptionHook( e,
3825													process.stackTrace );
3826											}
3827
3828											// Support: Promises/A+ section 2.3.3.3.4.1
3829											// https://promisesaplus.com/#point-61
3830											// Ignore post-resolution exceptions
3831											if ( depth + 1 >= maxDepth ) {
3832
3833												// Only substitute handlers pass on context
3834												// and multiple values (non-spec behavior)
3835												if ( handler !== Thrower ) {
3836													that = undefined;
3837													args = [ e ];
3838												}
3839
3840												deferred.rejectWith( that, args );
3841											}
3842										}
3843									};
3844
3845							// Support: Promises/A+ section 2.3.3.3.1
3846							// https://promisesaplus.com/#point-57
3847							// Re-resolve promises immediately to dodge false rejection from
3848							// subsequent errors
3849							if ( depth ) {
3850								process();
3851							} else {
3852
3853								// Call an optional hook to record the stack, in case of exception
3854								// since it's otherwise lost when execution goes async
3855								if ( jQuery.Deferred.getStackHook ) {
3856									process.stackTrace = jQuery.Deferred.getStackHook();
3857								}
3858								window.setTimeout( process );
3859							}
3860						};
3861					}
3862
3863					return jQuery.Deferred( function( newDefer ) {
3864
3865						// progress_handlers.add( ... )
3866						tuples[ 0 ][ 3 ].add(
3867							resolve(
3868								0,
3869								newDefer,
3870								jQuery.isFunction( onProgress ) ?
3871									onProgress :
3872									Identity,
3873								newDefer.notifyWith
3874							)
3875						);
3876
3877						// fulfilled_handlers.add( ... )
3878						tuples[ 1 ][ 3 ].add(
3879							resolve(
3880								0,
3881								newDefer,
3882								jQuery.isFunction( onFulfilled ) ?
3883									onFulfilled :
3884									Identity
3885							)
3886						);
3887
3888						// rejected_handlers.add( ... )
3889						tuples[ 2 ][ 3 ].add(
3890							resolve(
3891								0,
3892								newDefer,
3893								jQuery.isFunction( onRejected ) ?
3894									onRejected :
3895									Thrower
3896							)
3897						);
3898					} ).promise();
3899				},
3900
3901				// Get a promise for this deferred
3902				// If obj is provided, the promise aspect is added to the object
3903				promise: function( obj ) {
3904					return obj != null ? jQuery.extend( obj, promise ) : promise;
3905				}
3906			},
3907			deferred = {};
3908
3909		// Add list-specific methods
3910		jQuery.each( tuples, function( i, tuple ) {
3911			var list = tuple[ 2 ],
3912				stateString = tuple[ 5 ];
3913
3914			// promise.progress = list.add
3915			// promise.done = list.add
3916			// promise.fail = list.add
3917			promise[ tuple[ 1 ] ] = list.add;
3918
3919			// Handle state
3920			if ( stateString ) {
3921				list.add(
3922					function() {
3923
3924						// state = "resolved" (i.e., fulfilled)
3925						// state = "rejected"
3926						state = stateString;
3927					},
3928
3929					// rejected_callbacks.disable
3930					// fulfilled_callbacks.disable
3931					tuples[ 3 - i ][ 2 ].disable,
3932
3933					// progress_callbacks.lock
3934					tuples[ 0 ][ 2 ].lock
3935				);
3936			}
3937
3938			// progress_handlers.fire
3939			// fulfilled_handlers.fire
3940			// rejected_handlers.fire
3941			list.add( tuple[ 3 ].fire );
3942
3943			// deferred.notify = function() { deferred.notifyWith(...) }
3944			// deferred.resolve = function() { deferred.resolveWith(...) }
3945			// deferred.reject = function() { deferred.rejectWith(...) }
3946			deferred[ tuple[ 0 ] ] = function() {
3947				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3948				return this;
3949			};
3950
3951			// deferred.notifyWith = list.fireWith
3952			// deferred.resolveWith = list.fireWith
3953			// deferred.rejectWith = list.fireWith
3954			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3955		} );
3956
3957		// Make the deferred a promise
3958		promise.promise( deferred );
3959
3960		// Call given func if any
3961		if ( func ) {
3962			func.call( deferred, deferred );
3963		}
3964
3965		// All done!
3966		return deferred;
3967	},
3968
3969	// Deferred helper
3970	when: function( singleValue ) {
3971		var
3972
3973			// count of uncompleted subordinates
3974			remaining = arguments.length,
3975
3976			// count of unprocessed arguments
3977			i = remaining,
3978
3979			// subordinate fulfillment data
3980			resolveContexts = Array( i ),
3981			resolveValues = slice.call( arguments ),
3982
3983			// the master Deferred
3984			master = jQuery.Deferred(),
3985
3986			// subordinate callback factory
3987			updateFunc = function( i ) {
3988				return function( value ) {
3989					resolveContexts[ i ] = this;
3990					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3991					if ( !( --remaining ) ) {
3992						master.resolveWith( resolveContexts, resolveValues );
3993					}
3994				};
3995			};
3996
3997		// Single- and empty arguments are adopted like Promise.resolve
3998		if ( remaining <= 1 ) {
3999			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject
vendor: 2,079 bytes, lines 3999-4087
3999,
4000				!remaining );
4001
4002			// Use .then() to unwrap secondary thenables (cf. gh-3000)
4003			if ( master.state() === "pending" ||
4004				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4005
4006				return master.then();
4007			}
4008		}
4009
4010		// Multiple arguments are aggregated like Promise.all array elements
4011		while ( i-- ) {
4012			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
4013		}
4014
4015		return master.promise();
4016	}
4017} );
4018
4019
4020// These usually indicate a programmer mistake during development,
4021// warn about them ASAP rather than swallowing them by default.
4022var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
4023
4024jQuery.Deferred.exceptionHook = function( error, stack ) {
4025
4026	// Support: IE 8 - 9 only
4027	// Console exists when dev tools are open, which can happen at any time
4028	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
4029		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
4030	}
4031};
4032
4033
4034
4035
4036jQuery.readyException = function( error ) {
4037	window.setTimeout( function() {
4038		throw error;
4039	} );
4040};
4041
4042
4043
4044
4045// The deferred used on DOM ready
4046var readyList = jQuery.Deferred();
4047
4048jQuery.fn.ready = function( fn ) {
4049
4050	readyList
4051		.then( fn )
4052
4053		// Wrap jQuery.readyException in a function so that the lookup
4054		// happens at the time of error handling instead of callback
4055		// registration.
4056		.catch( function( error ) {
4057			jQuery.readyException( error );
4058		} );
4059
4060	return this;
4061};
4062
4063jQuery.extend( {
4064
4065	// Is the DOM ready to be used? Set to true once it occurs.
4066	isReady: false,
4067
4068	// A counter to track how many items to wait for before
4069	// the ready event fires. See #6781
4070	readyWait: 1,
4071
4072	// Handle when the DOM is ready
4073	ready: function( wait ) {
4074
4075		// Abort if there are pending holds or we're already ready
4076		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
4077			return;
4078		}
4079
4080		// Remember that the DOM is ready
4081		jQuery.isReady = true;
4082
4083		// If a normal DOM Ready event fired, decrement, and wait if need be
4084		if ( wait !== true && --jQuery.readyWait > 0 ) {
4085			return;
4086		}
4087
vendor: 4,098 bytes, lines 4088-4269
4088		// If there are functions bound, to execute
4089		readyList.resolveWith( document, [ jQuery ] );
4090	}
4091} );
4092
4093jQuery.ready.then = readyList.then;
4094
4095// The ready event handler and self cleanup method
4096function completed() {
4097	document.removeEventListener( "DOMContentLoaded", completed );
4098	window.removeEventListener( "load", completed );
4099	jQuery.ready();
4100}
4101
4102// Catch cases where $(document).ready() is called
4103// after the browser event has already occurred.
4104// Support: IE <=9 - 10 only
4105// Older IE sometimes signals "interactive" too soon
4106if ( document.readyState === "complete" ||
4107	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
4108
4109	// Handle it asynchronously to allow scripts the opportunity to delay ready
4110	window.setTimeout( jQuery.ready );
4111
4112} else {
4113
4114	// Use the handy event callback
4115	document.addEventListener( "DOMContentLoaded", completed );
4116
4117	// A fallback to window.onload, that will always work
4118	window.addEventListener( "load", completed );
4119}
4120
4121
4122
4123
4124// Multifunctional method to get and set values of a collection
4125// The value/s can optionally be executed if it's a function
4126var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4127	var i = 0,
4128		len = elems.length,
4129		bulk = key == null;
4130
4131	// Sets many values
4132	if ( jQuery.type( key ) === "object" ) {
4133		chainable = true;
4134		for ( i in key ) {
4135			access( elems, fn, i, key[ i ], true, emptyGet, raw );
4136		}
4137
4138	// Sets one value
4139	} else if ( value !== undefined ) {
4140		chainable = true;
4141
4142		if ( !jQuery.isFunction( value ) ) {
4143			raw = true;
4144		}
4145
4146		if ( bulk ) {
4147
4148			// Bulk operations run against the entire set
4149			if ( raw ) {
4150				fn.call( elems, value );
4151				fn = null;
4152
4153			// ...except when executing function values
4154			} else {
4155				bulk = fn;
4156				fn = function( elem, key, value ) {
4157					return bulk.call( jQuery( elem ), value );
4158				};
4159			}
4160		}
4161
4162		if ( fn ) {
4163			for ( ; i < len; i++ ) {
4164				fn(
4165					elems[ i ], key, raw ?
4166					value :
4167					value.call( elems[ i ], i, fn( elems[ i ], key ) )
4168				);
4169			}
4170		}
4171	}
4172
4173	if ( chainable ) {
4174		return elems;
4175	}
4176
4177	// Gets
4178	if ( bulk ) {
4179		return fn.call( elems );
4180	}
4181
4182	return len ? fn( elems[ 0 ], key ) : emptyGet;
4183};
4184var acceptData = function( owner ) {
4185
4186	// Accepts only:
4187	//  - Node
4188	//    - Node.ELEMENT_NODE
4189	//    - Node.DOCUMENT_NODE
4190	//  - Object
4191	//    - Any
4192	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4193};
4194
4195
4196
4197
4198function Data() {
4199	this.expando = jQuery.expando + Data.uid++;
4200}
4201
4202Data.uid = 1;
4203
4204Data.prototype = {
4205
4206	cache: function( owner ) {
4207
4208		// Check if the owner object already has a cache
4209		var value = owner[ this.expando ];
4210
4211		// If not, create one
4212		if ( !value ) {
4213			value = {};
4214
4215			// We can accept data for non-element nodes in modern browsers,
4216			// but we should not, see #8335.
4217			// Always return an empty object.
4218			if ( acceptData( owner ) ) {
4219
4220				// If it is a node unlikely to be stringify-ed or looped over
4221				// use plain assignment
4222				if ( owner.nodeType ) {
4223					owner[ this.expando ] = value;
4224
4225				// Otherwise secure it in a non-enumerable property
4226				// configurable must be true to allow the property to be
4227				// deleted when data is removed
4228				} else {
4229					Object.defineProperty( owner, this.expando, {
4230						value: value,
4231						configurable: true
4232					} );
4233				}
4234			}
4235		}
4236
4237		return value;
4238	},
4239	set: function( owner, data, value ) {
4240		var prop,
4241			cache = this.cache( owner );
4242
4243		// Handle: [ owner, key, value ] args
4244		// Always use camelCase key (gh-2257)
4245		if ( typeof data === "string" ) {
4246			cache[ jQuery.camelCase( data ) ] = value;
4247
4248		// Handle: [ owner, { properties } ] args
4249		} else {
4250
4251			// Copy the properties one-by-one to the cache object
4252			for ( prop in data ) {
4253				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4254			}
4255		}
4256		return cache;
4257	},
4258	get: function( owner, key ) {
4259		return key === undefined ?
4260			this.cache( owner ) :
4261
4262			// Always use camelCase key (gh-2257)
4263			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4264	},
4265	access: function( owner, key, value ) {
4266
4267		// In cases where either:
4268		//
4269		//   1. No key was specified
vendor: 4,593 bytes, lines 4270-4453
4270		//   2. A string key was specified, but no value provided
4271		//
4272		// Take the "read" path and allow the get method to determine
4273		// which value to return, respectively either:
4274		//
4275		//   1. The entire cache object
4276		//   2. The data stored at the key
4277		//
4278		if ( key === undefined ||
4279				( ( key && typeof key === "string" ) && value === undefined ) ) {
4280
4281			return this.get( owner, key );
4282		}
4283
4284		// When the key is not a string, or both a key and value
4285		// are specified, set or extend (existing objects) with either:
4286		//
4287		//   1. An object of properties
4288		//   2. A key and value
4289		//
4290		this.set( owner, key, value );
4291
4292		// Since the "set" path can have two possible entry points
4293		// return the expected data based on which path was taken[*]
4294		return value !== undefined ? value : key;
4295	},
4296	remove: function( owner, key ) {
4297		var i,
4298			cache = owner[ this.expando ];
4299
4300		if ( cache === undefined ) {
4301			return;
4302		}
4303
4304		if ( key !== undefined ) {
4305
4306			// Support array or space separated string of keys
4307			if ( Array.isArray( key ) ) {
4308
4309				// If key is an array of keys...
4310				// We always set camelCase keys, so remove that.
4311				key = key.map( jQuery.camelCase );
4312			} else {
4313				key = jQuery.camelCase( key );
4314
4315				// If a key with the spaces exists, use it.
4316				// Otherwise, create an array by matching non-whitespace
4317				key = key in cache ?
4318					[ key ] :
4319					( key.match( rnothtmlwhite ) || [] );
4320			}
4321
4322			i = key.length;
4323
4324			while ( i-- ) {
4325				delete cache[ key[ i ] ];
4326			}
4327		}
4328
4329		// Remove the expando if there's no more data
4330		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4331
4332			// Support: Chrome <=35 - 45
4333			// Webkit & Blink performance suffers when deleting properties
4334			// from DOM nodes, so set to undefined instead
4335			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4336			if ( owner.nodeType ) {
4337				owner[ this.expando ] = undefined;
4338			} else {
4339				delete owner[ this.expando ];
4340			}
4341		}
4342	},
4343	hasData: function( owner ) {
4344		var cache = owner[ this.expando ];
4345		return cache !== undefined && !jQuery.isEmptyObject( cache );
4346	}
4347};
4348var dataPriv = new Data();
4349
4350var dataUser = new Data();
4351
4352
4353
4354//	Implementation Summary
4355//
4356//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4357//	2. Improve the module's maintainability by reducing the storage
4358//		paths to a single mechanism.
4359//	3. Use the same single mechanism to support "private" and "user" data.
4360//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4361//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4362//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4363
4364var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4365	rmultiDash = /[A-Z]/g;
4366
4367function getData( data ) {
4368	if ( data === "true" ) {
4369		return true;
4370	}
4371
4372	if ( data === "false" ) {
4373		return false;
4374	}
4375
4376	if ( data === "null" ) {
4377		return null;
4378	}
4379
4380	// Only convert to a number if it doesn't change the string
4381	if ( data === +data + "" ) {
4382		return +data;
4383	}
4384
4385	if ( rbrace.test( data ) ) {
4386		return JSON.parse( data );
4387	}
4388
4389	return data;
4390}
4391
4392function dataAttr( elem, key, data ) {
4393	var name;
4394
4395	// If nothing was found internally, try to fetch any
4396	// data from the HTML5 data-* attribute
4397	if ( data === undefined && elem.nodeType === 1 ) {
4398		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4399		data = elem.getAttribute( name );
4400
4401		if ( typeof data === "string" ) {
4402			try {
4403				data = getData( data );
4404			} catch ( e ) {}
4405
4406			// Make sure we set the data so it isn't changed later
4407			dataUser.set( elem, key, data );
4408		} else {
4409			data = undefined;
4410		}
4411	}
4412	return data;
4413}
4414
4415jQuery.extend( {
4416	hasData: function( elem ) {
4417		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4418	},
4419
4420	data: function( elem, name, data ) {
4421		return dataUser.access( elem, name, data );
4422	},
4423
4424	removeData: function( elem, name ) {
4425		dataUser.remove( elem, name );
4426	},
4427
4428	// TODO: Now that all calls to _data and _removeData have been replaced
4429	// with direct calls to dataPriv methods, these can be deprecated.
4430	_data: function( elem, name, data ) {
4431		return dataPriv.access( elem, name, data );
4432	},
4433
4434	_removeData: function( elem, name ) {
4435		dataPriv.remove( elem, name );
4436	}
4437} );
4438
4439jQuery.fn.extend( {
4440	data: function( key, value ) {
4441		var i, name, data,
4442			elem = this[ 0 ],
4443			attrs = elem && elem.attributes;
4444
4445		// Gets all values
4446		if ( key === undefined ) {
4447			if ( this.length ) {
4448				data = dataUser.get( elem );
4449
4450				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4451					i = attrs.length;
4452					while ( i-- ) {
4453
vendor: 7,789 bytes, lines 4454-4776
4454						// Support: IE 11 only
4455						// The attrs elements can be null (#14894)
4456						if ( attrs[ i ] ) {
4457							name = attrs[ i ].name;
4458							if ( name.indexOf( "data-" ) === 0 ) {
4459								name = jQuery.camelCase( name.slice( 5 ) );
4460								dataAttr( elem, name, data[ name ] );
4461							}
4462						}
4463					}
4464					dataPriv.set( elem, "hasDataAttrs", true );
4465				}
4466			}
4467
4468			return data;
4469		}
4470
4471		// Sets multiple values
4472		if ( typeof key === "object" ) {
4473			return this.each( function() {
4474				dataUser.set( this, key );
4475			} );
4476		}
4477
4478		return access( this, function( value ) {
4479			var data;
4480
4481			// The calling jQuery object (element matches) is not empty
4482			// (and therefore has an element appears at this[ 0 ]) and the
4483			// `value` parameter was not undefined. An empty jQuery object
4484			// will result in `undefined` for elem = this[ 0 ] which will
4485			// throw an exception if an attempt to read a data cache is made.
4486			if ( elem && value === undefined ) {
4487
4488				// Attempt to get data from the cache
4489				// The key will always be camelCased in Data
4490				data = dataUser.get( elem, key );
4491				if ( data !== undefined ) {
4492					return data;
4493				}
4494
4495				// Attempt to "discover" the data in
4496				// HTML5 custom data-* attrs
4497				data = dataAttr( elem, key );
4498				if ( data !== undefined ) {
4499					return data;
4500				}
4501
4502				// We tried really hard, but the data doesn't exist.
4503				return;
4504			}
4505
4506			// Set the data...
4507			this.each( function() {
4508
4509				// We always store the camelCased key
4510				dataUser.set( this, key, value );
4511			} );
4512		}, null, value, arguments.length > 1, null, true );
4513	},
4514
4515	removeData: function( key ) {
4516		return this.each( function() {
4517			dataUser.remove( this, key );
4518		} );
4519	}
4520} );
4521
4522
4523jQuery.extend( {
4524	queue: function( elem, type, data ) {
4525		var queue;
4526
4527		if ( elem ) {
4528			type = ( type || "fx" ) + "queue";
4529			queue = dataPriv.get( elem, type );
4530
4531			// Speed up dequeue by getting out quickly if this is just a lookup
4532			if ( data ) {
4533				if ( !queue || Array.isArray( data ) ) {
4534					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4535				} else {
4536					queue.push( data );
4537				}
4538			}
4539			return queue || [];
4540		}
4541	},
4542
4543	dequeue: function( elem, type ) {
4544		type = type || "fx";
4545
4546		var queue = jQuery.queue( elem, type ),
4547			startLength = queue.length,
4548			fn = queue.shift(),
4549			hooks = jQuery._queueHooks( elem, type ),
4550			next = function() {
4551				jQuery.dequeue( elem, type );
4552			};
4553
4554		// If the fx queue is dequeued, always remove the progress sentinel
4555		if ( fn === "inprogress" ) {
4556			fn = queue.shift();
4557			startLength--;
4558		}
4559
4560		if ( fn ) {
4561
4562			// Add a progress sentinel to prevent the fx queue from being
4563			// automatically dequeued
4564			if ( type === "fx" ) {
4565				queue.unshift( "inprogress" );
4566			}
4567
4568			// Clear up the last queue stop function
4569			delete hooks.stop;
4570			fn.call( elem, next, hooks );
4571		}
4572
4573		if ( !startLength && hooks ) {
4574			hooks.empty.fire();
4575		}
4576	},
4577
4578	// Not public - generate a queueHooks object, or return the current one
4579	_queueHooks: function( elem, type ) {
4580		var key = type + "queueHooks";
4581		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4582			empty: jQuery.Callbacks( "once memory" ).add( function() {
4583				dataPriv.remove( elem, [ type + "queue", key ] );
4584			} )
4585		} );
4586	}
4587} );
4588
4589jQuery.fn.extend( {
4590	queue: function( type, data ) {
4591		var setter = 2;
4592
4593		if ( typeof type !== "string" ) {
4594			data = type;
4595			type = "fx";
4596			setter--;
4597		}
4598
4599		if ( arguments.length < setter ) {
4600			return jQuery.queue( this[ 0 ], type );
4601		}
4602
4603		return data === undefined ?
4604			this :
4605			this.each( function() {
4606				var queue = jQuery.queue( this, type, data );
4607
4608				// Ensure a hooks for this queue
4609				jQuery._queueHooks( this, type );
4610
4611				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4612					jQuery.dequeue( this, type );
4613				}
4614			} );
4615	},
4616	dequeue: function( type ) {
4617		return this.each( function() {
4618			jQuery.dequeue( this, type );
4619		} );
4620	},
4621	clearQueue: function( type ) {
4622		return this.queue( type || "fx", [] );
4623	},
4624
4625	// Get a promise resolved when queues of a certain type
4626	// are emptied (fx is the type by default)
4627	promise: function( type, obj ) {
4628		var tmp,
4629			count = 1,
4630			defer = jQuery.Deferred(),
4631			elements = this,
4632			i = this.length,
4633			resolve = function() {
4634				if ( !( --count ) ) {
4635					defer.resolveWith( elements, [ elements ] );
4636				}
4637			};
4638
4639		if ( typeof type !== "string" ) {
4640			obj = type;
4641			type = undefined;
4642		}
4643		type = type || "fx";
4644
4645		while ( i-- ) {
4646			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4647			if ( tmp && tmp.empty ) {
4648				count++;
4649				tmp.empty.add( resolve );
4650			}
4651		}
4652		resolve();
4653		return defer.promise( obj );
4654	}
4655} );
4656var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4657
4658var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4659
4660
4661var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4662
4663var isHiddenWithinTree = function( elem, el ) {
4664
4665		// isHiddenWithinTree might be called from jQuery#filter function;
4666		// in that case, element will be second argument
4667		elem = el || elem;
4668
4669		// Inline style trumps all
4670		return elem.style.display === "none" ||
4671			elem.style.display === "" &&
4672
4673			// Otherwise, check computed style
4674			// Support: Firefox <=43 - 45
4675			// Disconnected elements can have computed display: none, so first confirm that elem is
4676			// in the document.
4677			jQuery.contains( elem.ownerDocument, elem ) &&
4678
4679			jQuery.css( elem, "display" ) === "none";
4680	};
4681
4682var swap = function( elem, options, callback, args ) {
4683	var ret, name,
4684		old = {};
4685
4686	// Remember the old values, and insert the new ones
4687	for ( name in options ) {
4688		old[ name ] = elem.style[ name ];
4689		elem.style[ name ] = options[ name ];
4690	}
4691
4692	ret = callback.apply( elem, args || [] );
4693
4694	// Revert the old values
4695	for ( name in options ) {
4696		elem.style[ name ] = old[ name ];
4697	}
4698
4699	return ret;
4700};
4701
4702
4703
4704
4705function adjustCSS( elem, prop, valueParts, tween ) {
4706	var adjusted,
4707		scale = 1,
4708		maxIterations = 20,
4709		currentValue = tween ?
4710			function() {
4711				return tween.cur();
4712			} :
4713			function() {
4714				return jQuery.css( elem, prop, "" );
4715			},
4716		initial = currentValue(),
4717		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4718
4719		// Starting value computation is required for potential unit mismatches
4720		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4721			rcssNum.exec( jQuery.css( elem, prop ) );
4722
4723	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4724
4725		// Trust units reported by jQuery.css
4726		unit = unit || initialInUnit[ 3 ];
4727
4728		// Make sure we update the tween properties later on
4729		valueParts = valueParts || [];
4730
4731		// Iteratively approximate from a nonzero starting point
4732		initialInUnit = +initial || 1;
4733
4734		do {
4735
4736			// If previous iteration zeroed out, double until we get *something*.
4737			// Use string for doubling so we don't accidentally see scale as unchanged below
4738			scale = scale || ".5";
4739
4740			// Adjust and apply
4741			initialInUnit = initialInUnit / scale;
4742			jQuery.style( elem, prop, initialInUnit + unit );
4743
4744		// Update scale, tolerating zero or NaN from tween.cur()
4745		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4746		} while (
4747			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4748		);
4749	}
4750
4751	if ( valueParts ) {
4752		initialInUnit = +initialInUnit || +initial || 0;
4753
4754		// Apply relative offset (+=/-=) if specified
4755		adjusted = valueParts[ 1 ] ?
4756			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4757			+valueParts[ 2 ];
4758		if ( tween ) {
4759			tween.unit = unit;
4760			tween.start = initialInUnit;
4761			tween.end = adjusted;
4762		}
4763	}
4764	return adjusted;
4765}
4766
4767
4768var defaultDisplayMap = {};
4769
4770function getDefaultDisplay( elem ) {
4771	var temp,
4772		doc = elem.ownerDocument,
4773		nodeName = elem.nodeName,
4774		display = defaultDisplayMap[ nodeName ];
4775
4776	if ( display ) {
vendor: 4,001 bytes, lines 4777-4948
4777		return display;
4778	}
4779
4780	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4781	display = jQuery.css( temp, "display" );
4782
4783	temp.parentNode.removeChild( temp );
4784
4785	if ( display === "none" ) {
4786		display = "block";
4787	}
4788	defaultDisplayMap[ nodeName ] = display;
4789
4790	return display;
4791}
4792
4793function showHide( elements, show ) {
4794	var display, elem,
4795		values = [],
4796		index = 0,
4797		length = elements.length;
4798
4799	// Determine new display value for elements that need to change
4800	for ( ; index < length; index++ ) {
4801		elem = elements[ index ];
4802		if ( !elem.style ) {
4803			continue;
4804		}
4805
4806		display = elem.style.display;
4807		if ( show ) {
4808
4809			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4810			// check is required in this first loop unless we have a nonempty display value (either
4811			// inline or about-to-be-restored)
4812			if ( display === "none" ) {
4813				values[ index ] = dataPriv.get( elem, "display" ) || null;
4814				if ( !values[ index ] ) {
4815					elem.style.display = "";
4816				}
4817			}
4818			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4819				values[ index ] = getDefaultDisplay( elem );
4820			}
4821		} else {
4822			if ( display !== "none" ) {
4823				values[ index ] = "none";
4824
4825				// Remember what we're overwriting
4826				dataPriv.set( elem, "display", display );
4827			}
4828		}
4829	}
4830
4831	// Set the display of the elements in a second loop to avoid constant reflow
4832	for ( index = 0; index < length; index++ ) {
4833		if ( values[ index ] != null ) {
4834			elements[ index ].style.display = values[ index ];
4835		}
4836	}
4837
4838	return elements;
4839}
4840
4841jQuery.fn.extend( {
4842	show: function() {
4843		return showHide( this, true );
4844	},
4845	hide: function() {
4846		return showHide( this );
4847	},
4848	toggle: function( state ) {
4849		if ( typeof state === "boolean" ) {
4850			return state ? this.show() : this.hide();
4851		}
4852
4853		return this.each( function() {
4854			if ( isHiddenWithinTree( this ) ) {
4855				jQuery( this ).show();
4856			} else {
4857				jQuery( this ).hide();
4858			}
4859		} );
4860	}
4861} );
4862var rcheckableType = ( /^(?:checkbox|radio)$/i );
4863
4864var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4865
4866var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4867
4868
4869
4870// We have to close these tags to support XHTML (#13200)
4871var wrapMap = {
4872
4873	// Support: IE <=9 only
4874	option: [ 1, "<select multiple='multiple'>", "</select>" ],
4875
4876	// XHTML parsers do not magically insert elements in the
4877	// same way that tag soup parsers do. So we cannot shorten
4878	// this by omitting <tbody> or other required elements.
4879	thead: [ 1, "<table>", "</table>" ],
4880	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4881	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4882	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4883
4884	_default: [ 0, "", "" ]
4885};
4886
4887// Support: IE <=9 only
4888wrapMap.optgroup = wrapMap.option;
4889
4890wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4891wrapMap.th = wrapMap.td;
4892
4893
4894function getAll( context, tag ) {
4895
4896	// Support: IE <=9 - 11 only
4897	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4898	var ret;
4899
4900	if ( typeof context.getElementsByTagName !== "undefined" ) {
4901		ret = context.getElementsByTagName( tag || "*" );
4902
4903	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4904		ret = context.querySelectorAll( tag || "*" );
4905
4906	} else {
4907		ret = [];
4908	}
4909
4910	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4911		return jQuery.merge( [ context ], ret );
4912	}
4913
4914	return ret;
4915}
4916
4917
4918// Mark scripts as having already been evaluated
4919function setGlobalEval( elems, refElements ) {
4920	var i = 0,
4921		l = elems.length;
4922
4923	for ( ; i < l; i++ ) {
4924		dataPriv.set(
4925			elems[ i ],
4926			"globalEval",
4927			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4928		);
4929	}
4930}
4931
4932
4933var rhtml = /<|&#?\w+;/;
4934
4935function buildFragment( elems, context, scripts, selection, ignored ) {
4936	var elem, tmp, tag, wrap, contains, j,
4937		fragment = context.createDocumentFragment(),
4938		nodes = [],
4939		i = 0,
4940		l = elems.length;
4941
4942	for ( ; i < l; i++ ) {
4943		elem = elems[ i ];
4944
4945		if ( elem || elem === 0 ) {
4946
4947			// Add nodes directly
4948			if ( jQuery.t
vendor: 14,415 bytes, lines 4948-5458
4948ype( elem ) === "object" ) {
4949
4950				// Support: Android <=4.0 only, PhantomJS 1 only
4951				// push.apply(_, arraylike) throws on ancient WebKit
4952				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4953
4954			// Convert non-html into a text node
4955			} else if ( !rhtml.test( elem ) ) {
4956				nodes.push( context.createTextNode( elem ) );
4957
4958			// Convert html into DOM nodes
4959			} else {
4960				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4961
4962				// Deserialize a standard representation
4963				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4964				wrap = wrapMap[ tag ] || wrapMap._default;
4965				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4966
4967				// Descend through wrappers to the right content
4968				j = wrap[ 0 ];
4969				while ( j-- ) {
4970					tmp = tmp.lastChild;
4971				}
4972
4973				// Support: Android <=4.0 only, PhantomJS 1 only
4974				// push.apply(_, arraylike) throws on ancient WebKit
4975				jQuery.merge( nodes, tmp.childNodes );
4976
4977				// Remember the top-level container
4978				tmp = fragment.firstChild;
4979
4980				// Ensure the created nodes are orphaned (#12392)
4981				tmp.textContent = "";
4982			}
4983		}
4984	}
4985
4986	// Remove wrapper from fragment
4987	fragment.textContent = "";
4988
4989	i = 0;
4990	while ( ( elem = nodes[ i++ ] ) ) {
4991
4992		// Skip elements already in the context collection (trac-4087)
4993		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4994			if ( ignored ) {
4995				ignored.push( elem );
4996			}
4997			continue;
4998		}
4999
5000		contains = jQuery.contains( elem.ownerDocument, elem );
5001
5002		// Append to fragment
5003		tmp = getAll( fragment.appendChild( elem ), "script" );
5004
5005		// Preserve script evaluation history
5006		if ( contains ) {
5007			setGlobalEval( tmp );
5008		}
5009
5010		// Capture executables
5011		if ( scripts ) {
5012			j = 0;
5013			while ( ( elem = tmp[ j++ ] ) ) {
5014				if ( rscriptType.test( elem.type || "" ) ) {
5015					scripts.push( elem );
5016				}
5017			}
5018		}
5019	}
5020
5021	return fragment;
5022}
5023
5024
5025( function() {
5026	var fragment = document.createDocumentFragment(),
5027		div = fragment.appendChild( document.createElement( "div" ) ),
5028		input = document.createElement( "input" );
5029
5030	// Support: Android 4.0 - 4.3 only
5031	// Check state lost if the name is set (#11217)
5032	// Support: Windows Web Apps (WWA)
5033	// `name` and `type` must use .setAttribute for WWA (#14901)
5034	input.setAttribute( "type", "radio" );
5035	input.setAttribute( "checked", "checked" );
5036	input.setAttribute( "name", "t" );
5037
5038	div.appendChild( input );
5039
5040	// Support: Android <=4.1 only
5041	// Older WebKit doesn't clone checked state correctly in fragments
5042	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
5043
5044	// Support: IE <=11 only
5045	// Make sure textarea (and checkbox) defaultValue is properly cloned
5046	div.innerHTML = "<textarea>x</textarea>";
5047	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
5048} )();
5049var documentElement = document.documentElement;
5050
5051
5052
5053var
5054	rkeyEvent = /^key/,
5055	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
5056	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
5057
5058function returnTrue() {
5059	return true;
5060}
5061
5062function returnFalse() {
5063	return false;
5064}
5065
5066// Support: IE <=9 only
5067// See #13393 for more info
5068function safeActiveElement() {
5069	try {
5070		return document.activeElement;
5071	} catch ( err ) { }
5072}
5073
5074function on( elem, types, selector, data, fn, one ) {
5075	var origFn, type;
5076
5077	// Types can be a map of types/handlers
5078	if ( typeof types === "object" ) {
5079
5080		// ( types-Object, selector, data )
5081		if ( typeof selector !== "string" ) {
5082
5083			// ( types-Object, data )
5084			data = data || selector;
5085			selector = undefined;
5086		}
5087		for ( type in types ) {
5088			on( elem, type, selector, data, types[ type ], one );
5089		}
5090		return elem;
5091	}
5092
5093	if ( data == null && fn == null ) {
5094
5095		// ( types, fn )
5096		fn = selector;
5097		data = selector = undefined;
5098	} else if ( fn == null ) {
5099		if ( typeof selector === "string" ) {
5100
5101			// ( types, selector, fn )
5102			fn = data;
5103			data = undefined;
5104		} else {
5105
5106			// ( types, data, fn )
5107			fn = data;
5108			data = selector;
5109			selector = undefined;
5110		}
5111	}
5112	if ( fn === false ) {
5113		fn = returnFalse;
5114	} else if ( !fn ) {
5115		return elem;
5116	}
5117
5118	if ( one === 1 ) {
5119		origFn = fn;
5120		fn = function( event ) {
5121
5122			// Can use an empty set, since event contains the info
5123			jQuery().off( event );
5124			return origFn.apply( this, arguments );
5125		};
5126
5127		// Use same guid so caller can remove using origFn
5128		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5129	}
5130	return elem.each( function() {
5131		jQuery.event.add( this, types, fn, data, selector );
5132	} );
5133}
5134
5135/*
5136 * Helper functions for managing events -- not part of the public interface.
5137 * Props to Dean Edwards' addEvent library for many of the ideas.
5138 */
5139jQuery.event = {
5140
5141	global: {},
5142
5143	add: function( elem, types, handler, data, selector ) {
5144
5145		var handleObjIn, eventHandle, tmp,
5146			events, t, handleObj,
5147			special, handlers, type, namespaces, origType,
5148			elemData = dataPriv.get( elem );
5149
5150		// Don't attach events to noData or text/comment nodes (but allow plain objects)
5151		if ( !elemData ) {
5152			return;
5153		}
5154
5155		// Caller can pass in an object of custom data in lieu of the handler
5156		if ( handler.handler ) {
5157			handleObjIn = handler;
5158			handler = handleObjIn.handler;
5159			selector = handleObjIn.selector;
5160		}
5161
5162		// Ensure that invalid selectors throw exceptions at attach time
5163		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
5164		if ( selector ) {
5165			jQuery.find.matchesSelector( documentElement, selector );
5166		}
5167
5168		// Make sure that the handler has a unique ID, used to find/remove it later
5169		if ( !handler.guid ) {
5170			handler.guid = jQuery.guid++;
5171		}
5172
5173		// Init the element's event structure and main handler, if this is the first
5174		if ( !( events = elemData.events ) ) {
5175			events = elemData.events = {};
5176		}
5177		if ( !( eventHandle = elemData.handle ) ) {
5178			eventHandle = elemData.handle = function( e ) {
5179
5180				// Discard the second event of a jQuery.event.trigger() and
5181				// when an event is called after a page has unloaded
5182				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5183					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5184			};
5185		}
5186
5187		// Handle multiple events separated by a space
5188		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5189		t = types.length;
5190		while ( t-- ) {
5191			tmp = rtypenamespace.exec( types[ t ] ) || [];
5192			type = origType = tmp[ 1 ];
5193			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5194
5195			// There *must* be a type, no attaching namespace-only handlers
5196			if ( !type ) {
5197				continue;
5198			}
5199
5200			// If event changes its type, use the special event handlers for the changed type
5201			special = jQuery.event.special[ type ] || {};
5202
5203			// If selector defined, determine special event api type, otherwise given type
5204			type = ( selector ? special.delegateType : special.bindType ) || type;
5205
5206			// Update special based on newly reset type
5207			special = jQuery.event.special[ type ] || {};
5208
5209			// handleObj is passed to all event handlers
5210			handleObj = jQuery.extend( {
5211				type: type,
5212				origType: origType,
5213				data: data,
5214				handler: handler,
5215				guid: handler.guid,
5216				selector: selector,
5217				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5218				namespace: namespaces.join( "." )
5219			}, handleObjIn );
5220
5221			// Init the event handler queue if we're the first
5222			if ( !( handlers = events[ type ] ) ) {
5223				handlers = events[ type ] = [];
5224				handlers.delegateCount = 0;
5225
5226				// Only use addEventListener if the special events handler returns false
5227				if ( !special.setup ||
5228					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5229
5230					if ( elem.addEventListener ) {
5231						elem.addEventListener( type, eventHandle );
5232					}
5233				}
5234			}
5235
5236			if ( special.add ) {
5237				special.add.call( elem, handleObj );
5238
5239				if ( !handleObj.handler.guid ) {
5240					handleObj.handler.guid = handler.guid;
5241				}
5242			}
5243
5244			// Add to the element's handler list, delegates in front
5245			if ( selector ) {
5246				handlers.splice( handlers.delegateCount++, 0, handleObj );
5247			} else {
5248				handlers.push( handleObj );
5249			}
5250
5251			// Keep track of which events have ever been used, for event optimization
5252			jQuery.event.global[ type ] = true;
5253		}
5254
5255	},
5256
5257	// Detach an event or set of events from an element
5258	remove: function( elem, types, handler, selector, mappedTypes ) {
5259
5260		var j, origCount, tmp,
5261			events, t, handleObj,
5262			special, handlers, type, namespaces, origType,
5263			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5264
5265		if ( !elemData || !( events = elemData.events ) ) {
5266			return;
5267		}
5268
5269		// Once for each type.namespace in types; type may be omitted
5270		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5271		t = types.length;
5272		while ( t-- ) {
5273			tmp = rtypenamespace.exec( types[ t ] ) || [];
5274			type = origType = tmp[ 1 ];
5275			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5276
5277			// Unbind all events (on this namespace, if provided) for the element
5278			if ( !type ) {
5279				for ( type in events ) {
5280					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5281				}
5282				continue;
5283			}
5284
5285			special = jQuery.event.special[ type ] || {};
5286			type = ( selector ? special.delegateType : special.bindType ) || type;
5287			handlers = events[ type ] || [];
5288			tmp = tmp[ 2 ] &&
5289				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5290
5291			// Remove matching events
5292			origCount = j = handlers.length;
5293			while ( j-- ) {
5294				handleObj = handlers[ j ];
5295
5296				if ( ( mappedTypes || origType === handleObj.origType ) &&
5297					( !handler || handler.guid === handleObj.guid ) &&
5298					( !tmp || tmp.test( handleObj.namespace ) ) &&
5299					( !selector || selector === handleObj.selector ||
5300						selector === "**" && handleObj.selector ) ) {
5301					handlers.splice( j, 1 );
5302
5303					if ( handleObj.selector ) {
5304						handlers.delegateCount--;
5305					}
5306					if ( special.remove ) {
5307						special.remove.call( elem, handleObj );
5308					}
5309				}
5310			}
5311
5312			// Remove generic event handler if we removed something and no more handlers exist
5313			// (avoids potential for endless recursion during removal of special event handlers)
5314			if ( origCount && !handlers.length ) {
5315				if ( !special.teardown ||
5316					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5317
5318					jQuery.removeEvent( elem, type, elemData.handle );
5319				}
5320
5321				delete events[ type ];
5322			}
5323		}
5324
5325		// Remove data and the expando if it's no longer used
5326		if ( jQuery.isEmptyObject( events ) ) {
5327			dataPriv.remove( elem, "handle events" );
5328		}
5329	},
5330
5331	dispatch: function( nativeEvent ) {
5332
5333		// Make a writable jQuery.Event from the native event object
5334		var event = jQuery.event.fix( nativeEvent );
5335
5336		var i, j, ret, matched, handleObj, handlerQueue,
5337			args = new Array( arguments.length ),
5338			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5339			special = jQuery.event.special[ event.type ] || {};
5340
5341		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5342		args[ 0 ] = event;
5343
5344		for ( i = 1; i < arguments.length; i++ ) {
5345			args[ i ] = arguments[ i ];
5346		}
5347
5348		event.delegateTarget = this;
5349
5350		// Call the preDispatch hook for the mapped type, and let it bail if desired
5351		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5352			return;
5353		}
5354
5355		// Determine handlers
5356		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5357
5358		// Run delegates first; they may want to stop propagation beneath us
5359		i = 0;
5360		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5361			event.currentTarget = matched.elem;
5362
5363			j = 0;
5364			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5365				!event.isImmediatePropagationStopped() ) {
5366
5367				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5368				// a subset or equal to those in the bound event (both can have no namespace).
5369				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5370
5371					event.handleObj = handleObj;
5372					event.data = handleObj.data;
5373
5374					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5375						handleObj.handler ).apply( matched.elem, args );
5376
5377					if ( ret !== undefined ) {
5378						if ( ( event.result = ret ) === false ) {
5379							event.preventDefault();
5380							event.stopPropagation();
5381						}
5382					}
5383				}
5384			}
5385		}
5386
5387		// Call the postDispatch hook for the mapped type
5388		if ( special.postDispatch ) {
5389			special.postDispatch.call( this, event );
5390		}
5391
5392		return event.result;
5393	},
5394
5395	handlers: function( event, handlers ) {
5396		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5397			handlerQueue = [],
5398			delegateCount = handlers.delegateCount,
5399			cur = event.target;
5400
5401		// Find delegate handlers
5402		if ( delegateCount &&
5403
5404			// Support: IE <=9
5405			// Black-hole SVG <use> instance trees (trac-13180)
5406			cur.nodeType &&
5407
5408			// Support: Firefox <=42
5409			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5410			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5411			// Support: IE 11 only
5412			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5413			!( event.type === "click" && event.button >= 1 ) ) {
5414
5415			for ( ; cur !== this; cur = cur.parentNode || this ) {
5416
5417				// Don't check non-elements (#13208)
5418				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5419				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5420					matchedHandlers = [];
5421					matchedSelectors = {};
5422					for ( i = 0; i < delegateCount; i++ ) {
5423						handleObj = handlers[ i ];
5424
5425						// Don't conflict with Object.prototype properties (#13203)
5426						sel = handleObj.selector + " ";
5427
5428						if ( matchedSelectors[ sel ] === undefined ) {
5429							matchedSelectors[ sel ] = handleObj.needsContext ?
5430								jQuery( sel, this ).index( cur ) > -1 :
5431								jQuery.find( sel, this, null, [ cur ] ).length;
5432						}
5433						if ( matchedSelectors[ sel ] ) {
5434							matchedHandlers.push( handleObj );
5435						}
5436					}
5437					if ( matchedHandlers.length ) {
5438						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5439					}
5440				}
5441			}
5442		}
5443
5444		// Add the remaining (directly-bound) handlers
5445		cur = this;
5446		if ( delegateCount < handlers.length ) {
5447			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5448		}
5449
5450		return handlerQueue;
5451	},
5452
5453	addProp: function( name, hook ) {
5454		Object.defineProperty( jQuery.Event.prototype, name, {
5455			enumerable: true,
5456			configurable: true,
5457
5458			get: 
vendor: 8,400 bytes, lines 5458-5807
5458jQuery.isFunction( hook ) ?
5459				function() {
5460					if ( this.originalEvent ) {
5461							return hook( this.originalEvent );
5462					}
5463				} :
5464				function() {
5465					if ( this.originalEvent ) {
5466							return this.originalEvent[ name ];
5467					}
5468				},
5469
5470			set: function( value ) {
5471				Object.defineProperty( this, name, {
5472					enumerable: true,
5473					configurable: true,
5474					writable: true,
5475					value: value
5476				} );
5477			}
5478		} );
5479	},
5480
5481	fix: function( originalEvent ) {
5482		return originalEvent[ jQuery.expando ] ?
5483			originalEvent :
5484			new jQuery.Event( originalEvent );
5485	},
5486
5487	special: {
5488		load: {
5489
5490			// Prevent triggered image.load events from bubbling to window.load
5491			noBubble: true
5492		},
5493		focus: {
5494
5495			// Fire native event if possible so blur/focus sequence is correct
5496			trigger: function() {
5497				if ( this !== safeActiveElement() && this.focus ) {
5498					this.focus();
5499					return false;
5500				}
5501			},
5502			delegateType: "focusin"
5503		},
5504		blur: {
5505			trigger: function() {
5506				if ( this === safeActiveElement() && this.blur ) {
5507					this.blur();
5508					return false;
5509				}
5510			},
5511			delegateType: "focusout"
5512		},
5513		click: {
5514
5515			// For checkbox, fire native event so checked state will be right
5516			trigger: function() {
5517				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5518					this.click();
5519					return false;
5520				}
5521			},
5522
5523			// For cross-browser consistency, don't fire native .click() on links
5524			_default: function( event ) {
5525				return nodeName( event.target, "a" );
5526			}
5527		},
5528
5529		beforeunload: {
5530			postDispatch: function( event ) {
5531
5532				// Support: Firefox 20+
5533				// Firefox doesn't alert if the returnValue field is not set.
5534				if ( event.result !== undefined && event.originalEvent ) {
5535					event.originalEvent.returnValue = event.result;
5536				}
5537			}
5538		}
5539	}
5540};
5541
5542jQuery.removeEvent = function( elem, type, handle ) {
5543
5544	// This "if" is needed for plain objects
5545	if ( elem.removeEventListener ) {
5546		elem.removeEventListener( type, handle );
5547	}
5548};
5549
5550jQuery.Event = function( src, props ) {
5551
5552	// Allow instantiation without the 'new' keyword
5553	if ( !( this instanceof jQuery.Event ) ) {
5554		return new jQuery.Event( src, props );
5555	}
5556
5557	// Event object
5558	if ( src && src.type ) {
5559		this.originalEvent = src;
5560		this.type = src.type;
5561
5562		// Events bubbling up the document may have been marked as prevented
5563		// by a handler lower down the tree; reflect the correct value.
5564		this.isDefaultPrevented = src.defaultPrevented ||
5565				src.defaultPrevented === undefined &&
5566
5567				// Support: Android <=2.3 only
5568				src.returnValue === false ?
5569			returnTrue :
5570			returnFalse;
5571
5572		// Create target properties
5573		// Support: Safari <=6 - 7 only
5574		// Target should not be a text node (#504, #13143)
5575		this.target = ( src.target && src.target.nodeType === 3 ) ?
5576			src.target.parentNode :
5577			src.target;
5578
5579		this.currentTarget = src.currentTarget;
5580		this.relatedTarget = src.relatedTarget;
5581
5582	// Event type
5583	} else {
5584		this.type = src;
5585	}
5586
5587	// Put explicitly provided properties onto the event object
5588	if ( props ) {
5589		jQuery.extend( this, props );
5590	}
5591
5592	// Create a timestamp if incoming event doesn't have one
5593	this.timeStamp = src && src.timeStamp || jQuery.now();
5594
5595	// Mark it as fixed
5596	this[ jQuery.expando ] = true;
5597};
5598
5599// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5600// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5601jQuery.Event.prototype = {
5602	constructor: jQuery.Event,
5603	isDefaultPrevented: returnFalse,
5604	isPropagationStopped: returnFalse,
5605	isImmediatePropagationStopped: returnFalse,
5606	isSimulated: false,
5607
5608	preventDefault: function() {
5609		var e = this.originalEvent;
5610
5611		this.isDefaultPrevented = returnTrue;
5612
5613		if ( e && !this.isSimulated ) {
5614			e.preventDefault();
5615		}
5616	},
5617	stopPropagation: function() {
5618		var e = this.originalEvent;
5619
5620		this.isPropagationStopped = returnTrue;
5621
5622		if ( e && !this.isSimulated ) {
5623			e.stopPropagation();
5624		}
5625	},
5626	stopImmediatePropagation: function() {
5627		var e = this.originalEvent;
5628
5629		this.isImmediatePropagationStopped = returnTrue;
5630
5631		if ( e && !this.isSimulated ) {
5632			e.stopImmediatePropagation();
5633		}
5634
5635		this.stopPropagation();
5636	}
5637};
5638
5639// Includes all common event props including KeyEvent and MouseEvent specific props
5640jQuery.each( {
5641	altKey: true,
5642	bubbles: true,
5643	cancelable: true,
5644	changedTouches: true,
5645	ctrlKey: true,
5646	detail: true,
5647	eventPhase: true,
5648	metaKey: true,
5649	pageX: true,
5650	pageY: true,
5651	shiftKey: true,
5652	view: true,
5653	"char": true,
5654	charCode: true,
5655	key: true,
5656	keyCode: true,
5657	button: true,
5658	buttons: true,
5659	clientX: true,
5660	clientY: true,
5661	offsetX: true,
5662	offsetY: true,
5663	pointerId: true,
5664	pointerType: true,
5665	screenX: true,
5666	screenY: true,
5667	targetTouches: true,
5668	toElement: true,
5669	touches: true,
5670
5671	which: function( event ) {
5672		var button = event.button;
5673
5674		// Add which for key events
5675		if ( event.which == null && rkeyEvent.test( event.type ) ) {
5676			return event.charCode != null ? event.charCode : event.keyCode;
5677		}
5678
5679		// Add which for click: 1 === left; 2 === middle; 3 === right
5680		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5681			if ( button & 1 ) {
5682				return 1;
5683			}
5684
5685			if ( button & 2 ) {
5686				return 3;
5687			}
5688
5689			if ( button & 4 ) {
5690				return 2;
5691			}
5692
5693			return 0;
5694		}
5695
5696		return event.which;
5697	}
5698}, jQuery.event.addProp );
5699
5700// Create mouseenter/leave events using mouseover/out and event-time checks
5701// so that event delegation works in jQuery.
5702// Do the same for pointerenter/pointerleave and pointerover/pointerout
5703//
5704// Support: Safari 7 only
5705// Safari sends mouseenter too often; see:
5706// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5707// for the description of the bug (it existed in older Chrome versions as well).
5708jQuery.each( {
5709	mouseenter: "mouseover",
5710	mouseleave: "mouseout",
5711	pointerenter: "pointerover",
5712	pointerleave: "pointerout"
5713}, function( orig, fix ) {
5714	jQuery.event.special[ orig ] = {
5715		delegateType: fix,
5716		bindType: fix,
5717
5718		handle: function( event ) {
5719			var ret,
5720				target = this,
5721				related = event.relatedTarget,
5722				handleObj = event.handleObj;
5723
5724			// For mouseenter/leave call the handler if related is outside the target.
5725			// NB: No relatedTarget if the mouse left/entered the browser window
5726			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5727				event.type = handleObj.origType;
5728				ret = handleObj.handler.apply( this, arguments );
5729				event.type = fix;
5730			}
5731			return ret;
5732		}
5733	};
5734} );
5735
5736jQuery.fn.extend( {
5737
5738	on: function( types, selector, data, fn ) {
5739		return on( this, types, selector, data, fn );
5740	},
5741	one: function( types, selector, data, fn ) {
5742		return on( this, types, selector, data, fn, 1 );
5743	},
5744	off: function( types, selector, fn ) {
5745		var handleObj, type;
5746		if ( types && types.preventDefault && types.handleObj ) {
5747
5748			// ( event )  dispatched jQuery.Event
5749			handleObj = types.handleObj;
5750			jQuery( types.delegateTarget ).off(
5751				handleObj.namespace ?
5752					handleObj.origType + "." + handleObj.namespace :
5753					handleObj.origType,
5754				handleObj.selector,
5755				handleObj.handler
5756			);
5757			return this;
5758		}
5759		if ( typeof types === "object" ) {
5760
5761			// ( types-object [, selector] )
5762			for ( type in types ) {
5763				this.off( type, selector, types[ type ] );
5764			}
5765			return this;
5766		}
5767		if ( selector === false || typeof selector === "function" ) {
5768
5769			// ( types [, fn] )
5770			fn = selector;
5771			selector = undefined;
5772		}
5773		if ( fn === false ) {
5774			fn = returnFalse;
5775		}
5776		return this.each( function() {
5777			jQuery.event.remove( this, types, fn, selector );
5778		} );
5779	}
5780} );
5781
5782
5783var
5784
5785	/* eslint-disable max-len */
5786
5787	// See https://github.com/eslint/eslint/issues/3229
5788	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5789
5790	/* eslint-enable */
5791
5792	// Support: IE <=10 - 11, Edge 12 - 13
5793	// In IE/Edge using regex groups here causes severe slowdowns.
5794	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5795	rnoInnerhtml = /<script|<style|<link/i,
5796
5797	// checked="checked" or checked
5798	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5799	rscriptTypeMasked = /^true\/(.*)/,
5800	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5801
5802// Prefer a tbody over its parent table for containing new rows
5803function manipulationTarget( elem, content ) {
5804	if ( nodeName( elem, "table" ) &&
5805		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5806
5807		return jQuery( ">tbody", elem
vendor: 6,531 bytes, lines 5807-6055
5807 )[ 0 ] || elem;
5808	}
5809
5810	return elem;
5811}
5812
5813// Replace/restore the type attribute of script elements for safe DOM manipulation
5814function disableScript( elem ) {
5815	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5816	return elem;
5817}
5818function restoreScript( elem ) {
5819	var match = rscriptTypeMasked.exec( elem.type );
5820
5821	if ( match ) {
5822		elem.type = match[ 1 ];
5823	} else {
5824		elem.removeAttribute( "type" );
5825	}
5826
5827	return elem;
5828}
5829
5830function cloneCopyEvent( src, dest ) {
5831	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5832
5833	if ( dest.nodeType !== 1 ) {
5834		return;
5835	}
5836
5837	// 1. Copy private data: events, handlers, etc.
5838	if ( dataPriv.hasData( src ) ) {
5839		pdataOld = dataPriv.access( src );
5840		pdataCur = dataPriv.set( dest, pdataOld );
5841		events = pdataOld.events;
5842
5843		if ( events ) {
5844			delete pdataCur.handle;
5845			pdataCur.events = {};
5846
5847			for ( type in events ) {
5848				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5849					jQuery.event.add( dest, type, events[ type ][ i ] );
5850				}
5851			}
5852		}
5853	}
5854
5855	// 2. Copy user data
5856	if ( dataUser.hasData( src ) ) {
5857		udataOld = dataUser.access( src );
5858		udataCur = jQuery.extend( {}, udataOld );
5859
5860		dataUser.set( dest, udataCur );
5861	}
5862}
5863
5864// Fix IE bugs, see support tests
5865function fixInput( src, dest ) {
5866	var nodeName = dest.nodeName.toLowerCase();
5867
5868	// Fails to persist the checked state of a cloned checkbox or radio button.
5869	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5870		dest.checked = src.checked;
5871
5872	// Fails to return the selected option to the default selected state when cloning options
5873	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5874		dest.defaultValue = src.defaultValue;
5875	}
5876}
5877
5878function domManip( collection, args, callback, ignored ) {
5879
5880	// Flatten any nested arrays
5881	args = concat.apply( [], args );
5882
5883	var fragment, first, scripts, hasScripts, node, doc,
5884		i = 0,
5885		l = collection.length,
5886		iNoClone = l - 1,
5887		value = args[ 0 ],
5888		isFunction = jQuery.isFunction( value );
5889
5890	// We can't cloneNode fragments that contain checked, in WebKit
5891	if ( isFunction ||
5892			( l > 1 && typeof value === "string" &&
5893				!support.checkClone && rchecked.test( value ) ) ) {
5894		return collection.each( function( index ) {
5895			var self = collection.eq( index );
5896			if ( isFunction ) {
5897				args[ 0 ] = value.call( this, index, self.html() );
5898			}
5899			domManip( self, args, callback, ignored );
5900		} );
5901	}
5902
5903	if ( l ) {
5904		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5905		first = fragment.firstChild;
5906
5907		if ( fragment.childNodes.length === 1 ) {
5908			fragment = first;
5909		}
5910
5911		// Require either new content or an interest in ignored elements to invoke the callback
5912		if ( first || ignored ) {
5913			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5914			hasScripts = scripts.length;
5915
5916			// Use the original fragment for the last item
5917			// instead of the first because it can end up
5918			// being emptied incorrectly in certain situations (#8070).
5919			for ( ; i < l; i++ ) {
5920				node = fragment;
5921
5922				if ( i !== iNoClone ) {
5923					node = jQuery.clone( node, true, true );
5924
5925					// Keep references to cloned scripts for later restoration
5926					if ( hasScripts ) {
5927
5928						// Support: Android <=4.0 only, PhantomJS 1 only
5929						// push.apply(_, arraylike) throws on ancient WebKit
5930						jQuery.merge( scripts, getAll( node, "script" ) );
5931					}
5932				}
5933
5934				callback.call( collection[ i ], node, i );
5935			}
5936
5937			if ( hasScripts ) {
5938				doc = scripts[ scripts.length - 1 ].ownerDocument;
5939
5940				// Reenable scripts
5941				jQuery.map( scripts, restoreScript );
5942
5943				// Evaluate executable scripts on first document insertion
5944				for ( i = 0; i < hasScripts; i++ ) {
5945					node = scripts[ i ];
5946					if ( rscriptType.test( node.type || "" ) &&
5947						!dataPriv.access( node, "globalEval" ) &&
5948						jQuery.contains( doc, node ) ) {
5949
5950						if ( node.src ) {
5951
5952							// Optional AJAX dependency, but won't run scripts if not present
5953							if ( jQuery._evalUrl ) {
5954								jQuery._evalUrl( node.src );
5955							}
5956						} else {
5957							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
5958						}
5959					}
5960				}
5961			}
5962		}
5963	}
5964
5965	return collection;
5966}
5967
5968function remove( elem, selector, keepData ) {
5969	var node,
5970		nodes = selector ? jQuery.filter( selector, elem ) : elem,
5971		i = 0;
5972
5973	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5974		if ( !keepData && node.nodeType === 1 ) {
5975			jQuery.cleanData( getAll( node ) );
5976		}
5977
5978		if ( node.parentNode ) {
5979			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5980				setGlobalEval( getAll( node, "script" ) );
5981			}
5982			node.parentNode.removeChild( node );
5983		}
5984	}
5985
5986	return elem;
5987}
5988
5989jQuery.extend( {
5990	htmlPrefilter: function( html ) {
5991		return html.replace( rxhtmlTag, "<$1></$2>" );
5992	},
5993
5994	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5995		var i, l, srcElements, destElements,
5996			clone = elem.cloneNode( true ),
5997			inPage = jQuery.contains( elem.ownerDocument, elem );
5998
5999		// Fix IE cloning issues
6000		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
6001				!jQuery.isXMLDoc( elem ) ) {
6002
6003			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
6004			destElements = getAll( clone );
6005			srcElements = getAll( elem );
6006
6007			for ( i = 0, l = srcElements.length; i < l; i++ ) {
6008				fixInput( srcElements[ i ], destElements[ i ] );
6009			}
6010		}
6011
6012		// Copy the events from the original to the clone
6013		if ( dataAndEvents ) {
6014			if ( deepDataAndEvents ) {
6015				srcElements = srcElements || getAll( elem );
6016				destElements = destElements || getAll( clone );
6017
6018				for ( i = 0, l = srcElements.length; i < l; i++ ) {
6019					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
6020				}
6021			} else {
6022				cloneCopyEvent( elem, clone );
6023			}
6024		}
6025
6026		// Preserve script evaluation history
6027		destElements = getAll( clone, "script" );
6028		if ( destElements.length > 0 ) {
6029			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
6030		}
6031
6032		// Return the cloned set
6033		return clone;
6034	},
6035
6036	cleanData: function( elems ) {
6037		var data, elem, type,
6038			special = jQuery.event.special,
6039			i = 0;
6040
6041		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
6042			if ( acceptData( elem ) ) {
6043				if ( ( data = elem[ dataPriv.expando ] ) ) {
6044					if ( data.events ) {
6045						for ( type in data.events ) {
6046							if ( special[ type ] ) {
6047								jQuery.event.remove( elem, type );
6048
6049							// This is a shortcut to avoid jQuery.event.remove's overhead
6050							} else {
6051								jQuery.removeEvent( elem, type, data.handle );
6052							}
6053						}
6054					}
6055
vendor: 1,119 bytes, lines 6056-6100
6056					// Support: Chrome <=35 - 45+
6057					// Assign undefined instead of using delete, see Data#remove
6058					elem[ dataPriv.expando ] = undefined;
6059				}
6060				if ( elem[ dataUser.expando ] ) {
6061
6062					// Support: Chrome <=35 - 45+
6063					// Assign undefined instead of using delete, see Data#remove
6064					elem[ dataUser.expando ] = undefined;
6065				}
6066			}
6067		}
6068	}
6069} );
6070
6071jQuery.fn.extend( {
6072	detach: function( selector ) {
6073		return remove( this, selector, true );
6074	},
6075
6076	remove: function( selector ) {
6077		return remove( this, selector );
6078	},
6079
6080	text: function( value ) {
6081		return access( this, function( value ) {
6082			return value === undefined ?
6083				jQuery.text( this ) :
6084				this.empty().each( function() {
6085					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6086						this.textContent = value;
6087					}
6088				} );
6089		}, null, value, arguments.length );
6090	},
6091
6092	append: function() {
6093		return domManip( this, arguments, function( elem ) {
6094			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6095				var target = manipulationTarget( this, elem );
6096				target.appendChild( elem );
6097			}
6098		} );
6099	},
6100
vendor: 6,076 bytes, lines 6101-6336
6101	prepend: function() {
6102		return domManip( this, arguments, function( elem ) {
6103			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
6104				var target = manipulationTarget( this, elem );
6105				target.insertBefore( elem, target.firstChild );
6106			}
6107		} );
6108	},
6109
6110	before: function() {
6111		return domManip( this, arguments, function( elem ) {
6112			if ( this.parentNode ) {
6113				this.parentNode.insertBefore( elem, this );
6114			}
6115		} );
6116	},
6117
6118	after: function() {
6119		return domManip( this, arguments, function( elem ) {
6120			if ( this.parentNode ) {
6121				this.parentNode.insertBefore( elem, this.nextSibling );
6122			}
6123		} );
6124	},
6125
6126	empty: function() {
6127		var elem,
6128			i = 0;
6129
6130		for ( ; ( elem = this[ i ] ) != null; i++ ) {
6131			if ( elem.nodeType === 1 ) {
6132
6133				// Prevent memory leaks
6134				jQuery.cleanData( getAll( elem, false ) );
6135
6136				// Remove any remaining nodes
6137				elem.textContent = "";
6138			}
6139		}
6140
6141		return this;
6142	},
6143
6144	clone: function( dataAndEvents, deepDataAndEvents ) {
6145		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
6146		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
6147
6148		return this.map( function() {
6149			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
6150		} );
6151	},
6152
6153	html: function( value ) {
6154		return access( this, function( value ) {
6155			var elem = this[ 0 ] || {},
6156				i = 0,
6157				l = this.length;
6158
6159			if ( value === undefined && elem.nodeType === 1 ) {
6160				return elem.innerHTML;
6161			}
6162
6163			// See if we can take a shortcut and just use innerHTML
6164			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
6165				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
6166
6167				value = jQuery.htmlPrefilter( value );
6168
6169				try {
6170					for ( ; i < l; i++ ) {
6171						elem = this[ i ] || {};
6172
6173						// Remove element nodes and prevent memory leaks
6174						if ( elem.nodeType === 1 ) {
6175							jQuery.cleanData( getAll( elem, false ) );
6176							elem.innerHTML = value;
6177						}
6178					}
6179
6180					elem = 0;
6181
6182				// If using innerHTML throws an exception, use the fallback method
6183				} catch ( e ) {}
6184			}
6185
6186			if ( elem ) {
6187				this.empty().append( value );
6188			}
6189		}, null, value, arguments.length );
6190	},
6191
6192	replaceWith: function() {
6193		var ignored = [];
6194
6195		// Make the changes, replacing each non-ignored context element with the new content
6196		return domManip( this, arguments, function( elem ) {
6197			var parent = this.parentNode;
6198
6199			if ( jQuery.inArray( this, ignored ) < 0 ) {
6200				jQuery.cleanData( getAll( this ) );
6201				if ( parent ) {
6202					parent.replaceChild( elem, this );
6203				}
6204			}
6205
6206		// Force callback invocation
6207		}, ignored );
6208	}
6209} );
6210
6211jQuery.each( {
6212	appendTo: "append",
6213	prependTo: "prepend",
6214	insertBefore: "before",
6215	insertAfter: "after",
6216	replaceAll: "replaceWith"
6217}, function( name, original ) {
6218	jQuery.fn[ name ] = function( selector ) {
6219		var elems,
6220			ret = [],
6221			insert = jQuery( selector ),
6222			last = insert.length - 1,
6223			i = 0;
6224
6225		for ( ; i <= last; i++ ) {
6226			elems = i === last ? this : this.clone( true );
6227			jQuery( insert[ i ] )[ original ]( elems );
6228
6229			// Support: Android <=4.0 only, PhantomJS 1 only
6230			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6231			push.apply( ret, elems.get() );
6232		}
6233
6234		return this.pushStack( ret );
6235	};
6236} );
6237var rmargin = ( /^margin/ );
6238
6239var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6240
6241var getStyles = function( elem ) {
6242
6243		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6244		// IE throws on elements created in popups
6245		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6246		var view = elem.ownerDocument.defaultView;
6247
6248		if ( !view || !view.opener ) {
6249			view = window;
6250		}
6251
6252		return view.getComputedStyle( elem );
6253	};
6254
6255
6256
6257( function() {
6258
6259	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6260	// so they're executed at the same time to save the second computation.
6261	function computeStyleTests() {
6262
6263		// This is a singleton, we need to execute it only once
6264		if ( !div ) {
6265			return;
6266		}
6267
6268		div.style.cssText =
6269			"box-sizing:border-box;" +
6270			"position:relative;display:block;" +
6271			"margin:auto;border:1px;padding:1px;" +
6272			"top:1%;width:50%";
6273		div.innerHTML = "";
6274		documentElement.appendChild( container );
6275
6276		var divStyle = window.getComputedStyle( div );
6277		pixelPositionVal = divStyle.top !== "1%";
6278
6279		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6280		reliableMarginLeftVal = divStyle.marginLeft === "2px";
6281		boxSizingReliableVal = divStyle.width === "4px";
6282
6283		// Support: Android 4.0 - 4.3 only
6284		// Some styles come back with percentage values, even though they shouldn't
6285		div.style.marginRight = "50%";
6286		pixelMarginRightVal = divStyle.marginRight === "4px";
6287
6288		documentElement.removeChild( container );
6289
6290		// Nullify the div so it wouldn't be stored in the memory and
6291		// it will also be a sign that checks already performed
6292		div = null;
6293	}
6294
6295	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6296		container = document.createElement( "div" ),
6297		div = document.createElement( "div" );
6298
6299	// Finish early in limited (non-browser) environments
6300	if ( !div.style ) {
6301		return;
6302	}
6303
6304	// Support: IE <=9 - 11 only
6305	// Style of cloned element affects source element cloned (#8908)
6306	div.style.backgroundClip = "content-box";
6307	div.cloneNode( true ).style.backgroundClip = "";
6308	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6309
6310	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6311		"padding:0;margin-top:1px;position:absolute";
6312	container.appendChild( div );
6313
6314	jQuery.extend( support, {
6315		pixelPosition: function() {
6316			computeStyleTests();
6317			return pixelPositionVal;
6318		},
6319		boxSizingReliable: function() {
6320			computeStyleTests();
6321			return boxSizingReliableVal;
6322		},
6323		pixelMarginRight: function() {
6324			computeStyleTests();
6325			return pixelMarginRightVal;
6326		},
6327		reliableMarginLeft: function() {
6328			computeStyleTests();
6329			return reliableMarginLeftVal;
6330		}
6331	} );
6332} )();
6333
6334
6335function curCSS( elem, name, computed ) {
6336	var width, minWidth, maxWidth, ret,
vendor: 8,366 bytes, lines 6337-6642
6337
6338		// Support: Firefox 51+
6339		// Retrieving style before computed somehow
6340		// fixes an issue with getting wrong values
6341		// on detached elements
6342		style = elem.style;
6343
6344	computed = computed || getStyles( elem );
6345
6346	// getPropertyValue is needed for:
6347	//   .css('filter') (IE 9 only, #12537)
6348	//   .css('--customProperty) (#3144)
6349	if ( computed ) {
6350		ret = computed.getPropertyValue( name ) || computed[ name ];
6351
6352		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6353			ret = jQuery.style( elem, name );
6354		}
6355
6356		// A tribute to the "awesome hack by Dean Edwards"
6357		// Android Browser returns percentage for some values,
6358		// but width seems to be reliably pixels.
6359		// This is against the CSSOM draft spec:
6360		// https://drafts.csswg.org/cssom/#resolved-values
6361		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6362
6363			// Remember the original values
6364			width = style.width;
6365			minWidth = style.minWidth;
6366			maxWidth = style.maxWidth;
6367
6368			// Put in the new values to get a computed value out
6369			style.minWidth = style.maxWidth = style.width = ret;
6370			ret = computed.width;
6371
6372			// Revert the changed values
6373			style.width = width;
6374			style.minWidth = minWidth;
6375			style.maxWidth = maxWidth;
6376		}
6377	}
6378
6379	return ret !== undefined ?
6380
6381		// Support: IE <=9 - 11 only
6382		// IE returns zIndex value as an integer.
6383		ret + "" :
6384		ret;
6385}
6386
6387
6388function addGetHookIf( conditionFn, hookFn ) {
6389
6390	// Define the hook, we'll check on the first run if it's really needed.
6391	return {
6392		get: function() {
6393			if ( conditionFn() ) {
6394
6395				// Hook not needed (or it's not possible to use it due
6396				// to missing dependency), remove it.
6397				delete this.get;
6398				return;
6399			}
6400
6401			// Hook needed; redefine it so that the support test is not executed again.
6402			return ( this.get = hookFn ).apply( this, arguments );
6403		}
6404	};
6405}
6406
6407
6408var
6409
6410	// Swappable if display is none or starts with table
6411	// except "table", "table-cell", or "table-caption"
6412	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6413	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6414	rcustomProp = /^--/,
6415	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6416	cssNormalTransform = {
6417		letterSpacing: "0",
6418		fontWeight: "400"
6419	},
6420
6421	cssPrefixes = [ "Webkit", "Moz", "ms" ],
6422	emptyStyle = document.createElement( "div" ).style;
6423
6424// Return a css property mapped to a potentially vendor prefixed property
6425function vendorPropName( name ) {
6426
6427	// Shortcut for names that are not vendor prefixed
6428	if ( name in emptyStyle ) {
6429		return name;
6430	}
6431
6432	// Check for vendor prefixed names
6433	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6434		i = cssPrefixes.length;
6435
6436	while ( i-- ) {
6437		name = cssPrefixes[ i ] + capName;
6438		if ( name in emptyStyle ) {
6439			return name;
6440		}
6441	}
6442}
6443
6444// Return a property mapped along what jQuery.cssProps suggests or to
6445// a vendor prefixed property.
6446function finalPropName( name ) {
6447	var ret = jQuery.cssProps[ name ];
6448	if ( !ret ) {
6449		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6450	}
6451	return ret;
6452}
6453
6454function setPositiveNumber( elem, value, subtract ) {
6455
6456	// Any relative (+/-) values have already been
6457	// normalized at this point
6458	var matches = rcssNum.exec( value );
6459	return matches ?
6460
6461		// Guard against undefined "subtract", e.g., when used as in cssHooks
6462		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6463		value;
6464}
6465
6466function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6467	var i,
6468		val = 0;
6469
6470	// If we already have the right measurement, avoid augmentation
6471	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
6472		i = 4;
6473
6474	// Otherwise initialize for horizontal or vertical properties
6475	} else {
6476		i = name === "width" ? 1 : 0;
6477	}
6478
6479	for ( ; i < 4; i += 2 ) {
6480
6481		// Both box models exclude margin, so add it if we want it
6482		if ( extra === "margin" ) {
6483			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6484		}
6485
6486		if ( isBorderBox ) {
6487
6488			// border-box includes padding, so remove it if we want content
6489			if ( extra === "content" ) {
6490				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6491			}
6492
6493			// At this point, extra isn't border nor margin, so remove border
6494			if ( extra !== "margin" ) {
6495				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6496			}
6497		} else {
6498
6499			// At this point, extra isn't content, so add padding
6500			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6501
6502			// At this point, extra isn't content nor padding, so add border
6503			if ( extra !== "padding" ) {
6504				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6505			}
6506		}
6507	}
6508
6509	return val;
6510}
6511
6512function getWidthOrHeight( elem, name, extra ) {
6513
6514	// Start with computed style
6515	var valueIsBorderBox,
6516		styles = getStyles( elem ),
6517		val = curCSS( elem, name, styles ),
6518		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6519
6520	// Computed unit is not pixels. Stop here and return.
6521	if ( rnumnonpx.test( val ) ) {
6522		return val;
6523	}
6524
6525	// Check for style in case a browser which returns unreliable values
6526	// for getComputedStyle silently falls back to the reliable elem.style
6527	valueIsBorderBox = isBorderBox &&
6528		( support.boxSizingReliable() || val === elem.style[ name ] );
6529
6530	// Fall back to offsetWidth/Height when value is "auto"
6531	// This happens for inline elements with no explicit setting (gh-3571)
6532	if ( val === "auto" ) {
6533		val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
6534	}
6535
6536	// Normalize "", auto, and prepare for extra
6537	val = parseFloat( val ) || 0;
6538
6539	// Use the active box-sizing model to add/subtract irrelevant styles
6540	return ( val +
6541		augmentWidthOrHeight(
6542			elem,
6543			name,
6544			extra || ( isBorderBox ? "border" : "content" ),
6545			valueIsBorderBox,
6546			styles
6547		)
6548	) + "px";
6549}
6550
6551jQuery.extend( {
6552
6553	// Add in style property hooks for overriding the default
6554	// behavior of getting and setting a style property
6555	cssHooks: {
6556		opacity: {
6557			get: function( elem, computed ) {
6558				if ( computed ) {
6559
6560					// We should always get a number back from opacity
6561					var ret = curCSS( elem, "opacity" );
6562					return ret === "" ? "1" : ret;
6563				}
6564			}
6565		}
6566	},
6567
6568	// Don't automatically add "px" to these possibly-unitless properties
6569	cssNumber: {
6570		"animationIterationCount": true,
6571		"columnCount": true,
6572		"fillOpacity": true,
6573		"flexGrow": true,
6574		"flexShrink": true,
6575		"fontWeight": true,
6576		"lineHeight": true,
6577		"opacity": true,
6578		"order": true,
6579		"orphans": true,
6580		"widows": true,
6581		"zIndex": true,
6582		"zoom": true
6583	},
6584
6585	// Add in properties whose names you wish to fix before
6586	// setting or getting the value
6587	cssProps: {
6588		"float": "cssFloat"
6589	},
6590
6591	// Get and set the style property on a DOM Node
6592	style: function( elem, name, value, extra ) {
6593
6594		// Don't set styles on text and comment nodes
6595		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6596			return;
6597		}
6598
6599		// Make sure that we're working with the right name
6600		var ret, type, hooks,
6601			origName = jQuery.camelCase( name ),
6602			isCustomProp = rcustomProp.test( name ),
6603			style = elem.style;
6604
6605		// Make sure that we're working with the right name. We don't
6606		// want to query the value if it is a CSS custom property
6607		// since they are user-defined.
6608		if ( !isCustomProp ) {
6609			name = finalPropName( origName );
6610		}
6611
6612		// Gets hook for the prefixed version, then unprefixed version
6613		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6614
6615		// Check if we're setting a value
6616		if ( value !== undefined ) {
6617			type = typeof value;
6618
6619			// Convert "+=" or "-=" to relative numbers (#7345)
6620			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6621				value = adjustCSS( elem, name, ret );
6622
6623				// Fixes bug #9237
6624				type = "number";
6625			}
6626
6627			// Make sure that null and NaN values aren't set (#7116)
6628			if ( value == null || value !== value ) {
6629				return;
6630			}
6631
6632			// If a number was passed in, add the unit (except for certain CSS properties)
6633			if ( type === "number" ) {
6634				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6635			}
6636
6637			// background-* props affect original clone's values
6638			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6639				style[ name ] = "inherit";
6640			}
6641
6642			// If a hook was provided, use that value, otherwise just set the specified value
vendor: 4,779 bytes, lines 6643-6825
6643			if ( !hooks || !( "set" in hooks ) ||
6644				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6645
6646				if ( isCustomProp ) {
6647					style.setProperty( name, value );
6648				} else {
6649					style[ name ] = value;
6650				}
6651			}
6652
6653		} else {
6654
6655			// If a hook was provided get the non-computed value from there
6656			if ( hooks && "get" in hooks &&
6657				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6658
6659				return ret;
6660			}
6661
6662			// Otherwise just get the value from the style object
6663			return style[ name ];
6664		}
6665	},
6666
6667	css: function( elem, name, extra, styles ) {
6668		var val, num, hooks,
6669			origName = jQuery.camelCase( name ),
6670			isCustomProp = rcustomProp.test( name );
6671
6672		// Make sure that we're working with the right name. We don't
6673		// want to modify the value if it is a CSS custom property
6674		// since they are user-defined.
6675		if ( !isCustomProp ) {
6676			name = finalPropName( origName );
6677		}
6678
6679		// Try prefixed name followed by the unprefixed name
6680		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6681
6682		// If a hook was provided get the computed value from there
6683		if ( hooks && "get" in hooks ) {
6684			val = hooks.get( elem, true, extra );
6685		}
6686
6687		// Otherwise, if a way to get the computed value exists, use that
6688		if ( val === undefined ) {
6689			val = curCSS( elem, name, styles );
6690		}
6691
6692		// Convert "normal" to computed value
6693		if ( val === "normal" && name in cssNormalTransform ) {
6694			val = cssNormalTransform[ name ];
6695		}
6696
6697		// Make numeric if forced or a qualifier was provided and val looks numeric
6698		if ( extra === "" || extra ) {
6699			num = parseFloat( val );
6700			return extra === true || isFinite( num ) ? num || 0 : val;
6701		}
6702
6703		return val;
6704	}
6705} );
6706
6707jQuery.each( [ "height", "width" ], function( i, name ) {
6708	jQuery.cssHooks[ name ] = {
6709		get: function( elem, computed, extra ) {
6710			if ( computed ) {
6711
6712				// Certain elements can have dimension info if we invisibly show them
6713				// but it must have a current display style that would benefit
6714				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6715
6716					// Support: Safari 8+
6717					// Table columns in Safari have non-zero offsetWidth & zero
6718					// getBoundingClientRect().width unless display is changed.
6719					// Support: IE <=11 only
6720					// Running getBoundingClientRect on a disconnected node
6721					// in IE throws an error.
6722					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6723						swap( elem, cssShow, function() {
6724							return getWidthOrHeight( elem, name, extra );
6725						} ) :
6726						getWidthOrHeight( elem, name, extra );
6727			}
6728		},
6729
6730		set: function( elem, value, extra ) {
6731			var matches,
6732				styles = extra && getStyles( elem ),
6733				subtract = extra && augmentWidthOrHeight(
6734					elem,
6735					name,
6736					extra,
6737					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6738					styles
6739				);
6740
6741			// Convert to pixels if value adjustment is needed
6742			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6743				( matches[ 3 ] || "px" ) !== "px" ) {
6744
6745				elem.style[ name ] = value;
6746				value = jQuery.css( elem, name );
6747			}
6748
6749			return setPositiveNumber( elem, value, subtract );
6750		}
6751	};
6752} );
6753
6754jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6755	function( elem, computed ) {
6756		if ( computed ) {
6757			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6758				elem.getBoundingClientRect().left -
6759					swap( elem, { marginLeft: 0 }, function() {
6760						return elem.getBoundingClientRect().left;
6761					} )
6762				) + "px";
6763		}
6764	}
6765);
6766
6767// These hooks are used by animate to expand properties
6768jQuery.each( {
6769	margin: "",
6770	padding: "",
6771	border: "Width"
6772}, function( prefix, suffix ) {
6773	jQuery.cssHooks[ prefix + suffix ] = {
6774		expand: function( value ) {
6775			var i = 0,
6776				expanded = {},
6777
6778				// Assumes a single number if not a string
6779				parts = typeof value === "string" ? value.split( " " ) : [ value ];
6780
6781			for ( ; i < 4; i++ ) {
6782				expanded[ prefix + cssExpand[ i ] + suffix ] =
6783					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6784			}
6785
6786			return expanded;
6787		}
6788	};
6789
6790	if ( !rmargin.test( prefix ) ) {
6791		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6792	}
6793} );
6794
6795jQuery.fn.extend( {
6796	css: function( name, value ) {
6797		return access( this, function( elem, name, value ) {
6798			var styles, len,
6799				map = {},
6800				i = 0;
6801
6802			if ( Array.isArray( name ) ) {
6803				styles = getStyles( elem );
6804				len = name.length;
6805
6806				for ( ; i < len; i++ ) {
6807					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6808				}
6809
6810				return map;
6811			}
6812
6813			return value !== undefined ?
6814				jQuery.style( elem, name, value ) :
6815				jQuery.css( elem, name );
6816		}, name, value, arguments.length > 1 );
6817	}
6818} );
6819
6820
6821function Tween( elem, options, prop, end, easing ) {
6822	return new Tween.prototype.init( elem, options, prop, end, easing );
6823}
6824jQuery.Tween = Tween;
6825
vendor: 6,216 bytes, lines 6826-7064
6826Tween.prototype = {
6827	constructor: Tween,
6828	init: function( elem, options, prop, end, easing, unit ) {
6829		this.elem = elem;
6830		this.prop = prop;
6831		this.easing = easing || jQuery.easing._default;
6832		this.options = options;
6833		this.start = this.now = this.cur();
6834		this.end = end;
6835		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6836	},
6837	cur: function() {
6838		var hooks = Tween.propHooks[ this.prop ];
6839
6840		return hooks && hooks.get ?
6841			hooks.get( this ) :
6842			Tween.propHooks._default.get( this );
6843	},
6844	run: function( percent ) {
6845		var eased,
6846			hooks = Tween.propHooks[ this.prop ];
6847
6848		if ( this.options.duration ) {
6849			this.pos = eased = jQuery.easing[ this.easing ](
6850				percent, this.options.duration * percent, 0, 1, this.options.duration
6851			);
6852		} else {
6853			this.pos = eased = percent;
6854		}
6855		this.now = ( this.end - this.start ) * eased + this.start;
6856
6857		if ( this.options.step ) {
6858			this.options.step.call( this.elem, this.now, this );
6859		}
6860
6861		if ( hooks && hooks.set ) {
6862			hooks.set( this );
6863		} else {
6864			Tween.propHooks._default.set( this );
6865		}
6866		return this;
6867	}
6868};
6869
6870Tween.prototype.init.prototype = Tween.prototype;
6871
6872Tween.propHooks = {
6873	_default: {
6874		get: function( tween ) {
6875			var result;
6876
6877			// Use a property on the element directly when it is not a DOM element,
6878			// or when there is no matching style property that exists.
6879			if ( tween.elem.nodeType !== 1 ||
6880				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6881				return tween.elem[ tween.prop ];
6882			}
6883
6884			// Passing an empty string as a 3rd parameter to .css will automatically
6885			// attempt a parseFloat and fallback to a string if the parse fails.
6886			// Simple values such as "10px" are parsed to Float;
6887			// complex values such as "rotate(1rad)" are returned as-is.
6888			result = jQuery.css( tween.elem, tween.prop, "" );
6889
6890			// Empty strings, null, undefined and "auto" are converted to 0.
6891			return !result || result === "auto" ? 0 : result;
6892		},
6893		set: function( tween ) {
6894
6895			// Use step hook for back compat.
6896			// Use cssHook if its there.
6897			// Use .style if available and use plain properties where available.
6898			if ( jQuery.fx.step[ tween.prop ] ) {
6899				jQuery.fx.step[ tween.prop ]( tween );
6900			} else if ( tween.elem.nodeType === 1 &&
6901				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6902					jQuery.cssHooks[ tween.prop ] ) ) {
6903				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6904			} else {
6905				tween.elem[ tween.prop ] = tween.now;
6906			}
6907		}
6908	}
6909};
6910
6911// Support: IE <=9 only
6912// Panic based approach to setting things on disconnected nodes
6913Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6914	set: function( tween ) {
6915		if ( tween.elem.nodeType && tween.elem.parentNode ) {
6916			tween.elem[ tween.prop ] = tween.now;
6917		}
6918	}
6919};
6920
6921jQuery.easing = {
6922	linear: function( p ) {
6923		return p;
6924	},
6925	swing: function( p ) {
6926		return 0.5 - Math.cos( p * Math.PI ) / 2;
6927	},
6928	_default: "swing"
6929};
6930
6931jQuery.fx = Tween.prototype.init;
6932
6933// Back compat <1.8 extension point
6934jQuery.fx.step = {};
6935
6936
6937
6938
6939var
6940	fxNow, inProgress,
6941	rfxtypes = /^(?:toggle|show|hide)$/,
6942	rrun = /queueHooks$/;
6943
6944function schedule() {
6945	if ( inProgress ) {
6946		if ( document.hidden === false && window.requestAnimationFrame ) {
6947			window.requestAnimationFrame( schedule );
6948		} else {
6949			window.setTimeout( schedule, jQuery.fx.interval );
6950		}
6951
6952		jQuery.fx.tick();
6953	}
6954}
6955
6956// Animations created synchronously will run synchronously
6957function createFxNow() {
6958	window.setTimeout( function() {
6959		fxNow = undefined;
6960	} );
6961	return ( fxNow = jQuery.now() );
6962}
6963
6964// Generate parameters to create a standard animation
6965function genFx( type, includeWidth ) {
6966	var which,
6967		i = 0,
6968		attrs = { height: type };
6969
6970	// If we include width, step value is 1 to do all cssExpand values,
6971	// otherwise step value is 2 to skip over Left and Right
6972	includeWidth = includeWidth ? 1 : 0;
6973	for ( ; i < 4; i += 2 - includeWidth ) {
6974		which = cssExpand[ i ];
6975		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6976	}
6977
6978	if ( includeWidth ) {
6979		attrs.opacity = attrs.width = type;
6980	}
6981
6982	return attrs;
6983}
6984
6985function createTween( value, prop, animation ) {
6986	var tween,
6987		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
6988		index = 0,
6989		length = collection.length;
6990	for ( ; index < length; index++ ) {
6991		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
6992
6993			// We're done with this property
6994			return tween;
6995		}
6996	}
6997}
6998
6999function defaultPrefilter( elem, props, opts ) {
7000	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
7001		isBox = "width" in props || "height" in props,
7002		anim = this,
7003		orig = {},
7004		style = elem.style,
7005		hidden = elem.nodeType && isHiddenWithinTree( elem ),
7006		dataShow = dataPriv.get( elem, "fxshow" );
7007
7008	// Queue-skipping animations hijack the fx hooks
7009	if ( !opts.queue ) {
7010		hooks = jQuery._queueHooks( elem, "fx" );
7011		if ( hooks.unqueued == null ) {
7012			hooks.unqueued = 0;
7013			oldfire = hooks.empty.fire;
7014			hooks.empty.fire = function() {
7015				if ( !hooks.unqueued ) {
7016					oldfire();
7017				}
7018			};
7019		}
7020		hooks.unqueued++;
7021
7022		anim.always( function() {
7023
7024			// Ensure the complete handler is called before this completes
7025			anim.always( function() {
7026				hooks.unqueued--;
7027				if ( !jQuery.queue( elem, "fx" ).length ) {
7028					hooks.empty.fire();
7029				}
7030			} );
7031		} );
7032	}
7033
7034	// Detect show/hide animations
7035	for ( prop in props ) {
7036		value = props[ prop ];
7037		if ( rfxtypes.test( value ) ) {
7038			delete props[ prop ];
7039			toggle = toggle || value === "toggle";
7040			if ( value === ( hidden ? "hide" : "show" ) ) {
7041
7042				// Pretend to be hidden if this is a "show" and
7043				// there is still data from a stopped show/hide
7044				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7045					hidden = true;
7046
7047				// Ignore all other no-op show/hide data
7048				} else {
7049					continue;
7050				}
7051			}
7052			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7053		}
7054	}
7055
7056	// Bail out if this is a no-op like .hide().hide()
7057	propTween = !jQuery.isEmptyObject( props );
7058	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
7059		return;
7060	}
7061
7062	// Restrict "overflow" and "display" styles during box animations
7063	if ( isBox && elem.nodeType === 1 ) {
7064
vendor: 4,173 bytes, lines 7065-7223
7065		// Support: IE <=9 - 11, Edge 12 - 13
7066		// Record all 3 overflow attributes because IE does not infer the shorthand
7067		// from identically-valued overflowX and overflowY
7068		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7069
7070		// Identify a display type, preferring old show/hide data over the CSS cascade
7071		restoreDisplay = dataShow && dataShow.display;
7072		if ( restoreDisplay == null ) {
7073			restoreDisplay = dataPriv.get( elem, "display" );
7074		}
7075		display = jQuery.css( elem, "display" );
7076		if ( display === "none" ) {
7077			if ( restoreDisplay ) {
7078				display = restoreDisplay;
7079			} else {
7080
7081				// Get nonempty value(s) by temporarily forcing visibility
7082				showHide( [ elem ], true );
7083				restoreDisplay = elem.style.display || restoreDisplay;
7084				display = jQuery.css( elem, "display" );
7085				showHide( [ elem ] );
7086			}
7087		}
7088
7089		// Animate inline elements as inline-block
7090		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
7091			if ( jQuery.css( elem, "float" ) === "none" ) {
7092
7093				// Restore the original display value at the end of pure show/hide animations
7094				if ( !propTween ) {
7095					anim.done( function() {
7096						style.display = restoreDisplay;
7097					} );
7098					if ( restoreDisplay == null ) {
7099						display = style.display;
7100						restoreDisplay = display === "none" ? "" : display;
7101					}
7102				}
7103				style.display = "inline-block";
7104			}
7105		}
7106	}
7107
7108	if ( opts.overflow ) {
7109		style.overflow = "hidden";
7110		anim.always( function() {
7111			style.overflow = opts.overflow[ 0 ];
7112			style.overflowX = opts.overflow[ 1 ];
7113			style.overflowY = opts.overflow[ 2 ];
7114		} );
7115	}
7116
7117	// Implement show/hide animations
7118	propTween = false;
7119	for ( prop in orig ) {
7120
7121		// General show/hide setup for this element animation
7122		if ( !propTween ) {
7123			if ( dataShow ) {
7124				if ( "hidden" in dataShow ) {
7125					hidden = dataShow.hidden;
7126				}
7127			} else {
7128				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
7129			}
7130
7131			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
7132			if ( toggle ) {
7133				dataShow.hidden = !hidden;
7134			}
7135
7136			// Show elements before animating them
7137			if ( hidden ) {
7138				showHide( [ elem ], true );
7139			}
7140
7141			/* eslint-disable no-loop-func */
7142
7143			anim.done( function() {
7144
7145			/* eslint-enable no-loop-func */
7146
7147				// The final step of a "hide" animation is actually hiding the element
7148				if ( !hidden ) {
7149					showHide( [ elem ] );
7150				}
7151				dataPriv.remove( elem, "fxshow" );
7152				for ( prop in orig ) {
7153					jQuery.style( elem, prop, orig[ prop ] );
7154				}
7155			} );
7156		}
7157
7158		// Per-property setup
7159		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7160		if ( !( prop in dataShow ) ) {
7161			dataShow[ prop ] = propTween.start;
7162			if ( hidden ) {
7163				propTween.end = propTween.start;
7164				propTween.start = 0;
7165			}
7166		}
7167	}
7168}
7169
7170function propFilter( props, specialEasing ) {
7171	var index, name, easing, value, hooks;
7172
7173	// camelCase, specialEasing and expand cssHook pass
7174	for ( index in props ) {
7175		name = jQuery.camelCase( index );
7176		easing = specialEasing[ name ];
7177		value = props[ index ];
7178		if ( Array.isArray( value ) ) {
7179			easing = value[ 1 ];
7180			value = props[ index ] = value[ 0 ];
7181		}
7182
7183		if ( index !== name ) {
7184			props[ name ] = value;
7185			delete props[ index ];
7186		}
7187
7188		hooks = jQuery.cssHooks[ name ];
7189		if ( hooks && "expand" in hooks ) {
7190			value = hooks.expand( value );
7191			delete props[ name ];
7192
7193			// Not quite $.extend, this won't overwrite existing keys.
7194			// Reusing 'index' because we have the correct "name"
7195			for ( index in value ) {
7196				if ( !( index in props ) ) {
7197					props[ index ] = value[ index ];
7198					specialEasing[ index ] = easing;
7199				}
7200			}
7201		} else {
7202			specialEasing[ name ] = easing;
7203		}
7204	}
7205}
7206
7207function Animation( elem, properties, options ) {
7208	var result,
7209		stopped,
7210		index = 0,
7211		length = Animation.prefilters.length,
7212		deferred = jQuery.Deferred().always( function() {
7213
7214			// Don't match elem in the :animated selector
7215			delete tick.elem;
7216		} ),
7217		tick = function() {
7218			if ( stopped ) {
7219				return false;
7220			}
7221			var currentTime = fxNow || createFxNow(),
7222				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7223
vendor: 6,686 bytes, lines 7224-7483
7224				// Support: Android 2.3 only
7225				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7226				temp = remaining / animation.duration || 0,
7227				percent = 1 - temp,
7228				index = 0,
7229				length = animation.tweens.length;
7230
7231			for ( ; index < length; index++ ) {
7232				animation.tweens[ index ].run( percent );
7233			}
7234
7235			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7236
7237			// If there's more to do, yield
7238			if ( percent < 1 && length ) {
7239				return remaining;
7240			}
7241
7242			// If this was an empty animation, synthesize a final progress notification
7243			if ( !length ) {
7244				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7245			}
7246
7247			// Resolve the animation and report its conclusion
7248			deferred.resolveWith( elem, [ animation ] );
7249			return false;
7250		},
7251		animation = deferred.promise( {
7252			elem: elem,
7253			props: jQuery.extend( {}, properties ),
7254			opts: jQuery.extend( true, {
7255				specialEasing: {},
7256				easing: jQuery.easing._default
7257			}, options ),
7258			originalProperties: properties,
7259			originalOptions: options,
7260			startTime: fxNow || createFxNow(),
7261			duration: options.duration,
7262			tweens: [],
7263			createTween: function( prop, end ) {
7264				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7265						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7266				animation.tweens.push( tween );
7267				return tween;
7268			},
7269			stop: function( gotoEnd ) {
7270				var index = 0,
7271
7272					// If we are going to the end, we want to run all the tweens
7273					// otherwise we skip this part
7274					length = gotoEnd ? animation.tweens.length : 0;
7275				if ( stopped ) {
7276					return this;
7277				}
7278				stopped = true;
7279				for ( ; index < length; index++ ) {
7280					animation.tweens[ index ].run( 1 );
7281				}
7282
7283				// Resolve when we played the last frame; otherwise, reject
7284				if ( gotoEnd ) {
7285					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7286					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7287				} else {
7288					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7289				}
7290				return this;
7291			}
7292		} ),
7293		props = animation.props;
7294
7295	propFilter( props, animation.opts.specialEasing );
7296
7297	for ( ; index < length; index++ ) {
7298		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7299		if ( result ) {
7300			if ( jQuery.isFunction( result.stop ) ) {
7301				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7302					jQuery.proxy( result.stop, result );
7303			}
7304			return result;
7305		}
7306	}
7307
7308	jQuery.map( props, createTween, animation );
7309
7310	if ( jQuery.isFunction( animation.opts.start ) ) {
7311		animation.opts.start.call( elem, animation );
7312	}
7313
7314	// Attach callbacks from options
7315	animation
7316		.progress( animation.opts.progress )
7317		.done( animation.opts.done, animation.opts.complete )
7318		.fail( animation.opts.fail )
7319		.always( animation.opts.always );
7320
7321	jQuery.fx.timer(
7322		jQuery.extend( tick, {
7323			elem: elem,
7324			anim: animation,
7325			queue: animation.opts.queue
7326		} )
7327	);
7328
7329	return animation;
7330}
7331
7332jQuery.Animation = jQuery.extend( Animation, {
7333
7334	tweeners: {
7335		"*": [ function( prop, value ) {
7336			var tween = this.createTween( prop, value );
7337			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7338			return tween;
7339		} ]
7340	},
7341
7342	tweener: function( props, callback ) {
7343		if ( jQuery.isFunction( props ) ) {
7344			callback = props;
7345			props = [ "*" ];
7346		} else {
7347			props = props.match( rnothtmlwhite );
7348		}
7349
7350		var prop,
7351			index = 0,
7352			length = props.length;
7353
7354		for ( ; index < length; index++ ) {
7355			prop = props[ index ];
7356			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7357			Animation.tweeners[ prop ].unshift( callback );
7358		}
7359	},
7360
7361	prefilters: [ defaultPrefilter ],
7362
7363	prefilter: function( callback, prepend ) {
7364		if ( prepend ) {
7365			Animation.prefilters.unshift( callback );
7366		} else {
7367			Animation.prefilters.push( callback );
7368		}
7369	}
7370} );
7371
7372jQuery.speed = function( speed, easing, fn ) {
7373	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7374		complete: fn || !fn && easing ||
7375			jQuery.isFunction( speed ) && speed,
7376		duration: speed,
7377		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7378	};
7379
7380	// Go to the end state if fx are off
7381	if ( jQuery.fx.off ) {
7382		opt.duration = 0;
7383
7384	} else {
7385		if ( typeof opt.duration !== "number" ) {
7386			if ( opt.duration in jQuery.fx.speeds ) {
7387				opt.duration = jQuery.fx.speeds[ opt.duration ];
7388
7389			} else {
7390				opt.duration = jQuery.fx.speeds._default;
7391			}
7392		}
7393	}
7394
7395	// Normalize opt.queue - true/undefined/null -> "fx"
7396	if ( opt.queue == null || opt.queue === true ) {
7397		opt.queue = "fx";
7398	}
7399
7400	// Queueing
7401	opt.old = opt.complete;
7402
7403	opt.complete = function() {
7404		if ( jQuery.isFunction( opt.old ) ) {
7405			opt.old.call( this );
7406		}
7407
7408		if ( opt.queue ) {
7409			jQuery.dequeue( this, opt.queue );
7410		}
7411	};
7412
7413	return opt;
7414};
7415
7416jQuery.fn.extend( {
7417	fadeTo: function( speed, to, easing, callback ) {
7418
7419		// Show any hidden elements after setting opacity to 0
7420		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7421
7422			// Animate to the value specified
7423			.end().animate( { opacity: to }, speed, easing, callback );
7424	},
7425	animate: function( prop, speed, easing, callback ) {
7426		var empty = jQuery.isEmptyObject( prop ),
7427			optall = jQuery.speed( speed, easing, callback ),
7428			doAnimation = function() {
7429
7430				// Operate on a copy of prop so per-property easing won't be lost
7431				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7432
7433				// Empty animations, or finishing resolves immediately
7434				if ( empty || dataPriv.get( this, "finish" ) ) {
7435					anim.stop( true );
7436				}
7437			};
7438			doAnimation.finish = doAnimation;
7439
7440		return empty || optall.queue === false ?
7441			this.each( doAnimation ) :
7442			this.queue( optall.queue, doAnimation );
7443	},
7444	stop: function( type, clearQueue, gotoEnd ) {
7445		var stopQueue = function( hooks ) {
7446			var stop = hooks.stop;
7447			delete hooks.stop;
7448			stop( gotoEnd );
7449		};
7450
7451		if ( typeof type !== "string" ) {
7452			gotoEnd = clearQueue;
7453			clearQueue = type;
7454			type = undefined;
7455		}
7456		if ( clearQueue && type !== false ) {
7457			this.queue( type || "fx", [] );
7458		}
7459
7460		return this.each( function() {
7461			var dequeue = true,
7462				index = type != null && type + "queueHooks",
7463				timers = jQuery.timers,
7464				data = dataPriv.get( this );
7465
7466			if ( index ) {
7467				if ( data[ index ] && data[ index ].stop ) {
7468					stopQueue( data[ index ] );
7469				}
7470			} else {
7471				for ( index in data ) {
7472					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7473						stopQueue( data[ index ] );
7474					}
7475				}
7476			}
7477
7478			for ( index = timers.length; index--; ) {
7479				if ( timers[ index ].elem === this &&
7480					( type == null || timers[ index ].queue === type ) ) {
7481
7482					timers[ index ].anim.stop( gotoEnd );
7483					dequeue = false;
vendor: 2,199 bytes, lines 7484-7568
7484					timers.splice( index, 1 );
7485				}
7486			}
7487
7488			// Start the next in the queue if the last step wasn't forced.
7489			// Timers currently will call their complete callbacks, which
7490			// will dequeue but only if they were gotoEnd.
7491			if ( dequeue || !gotoEnd ) {
7492				jQuery.dequeue( this, type );
7493			}
7494		} );
7495	},
7496	finish: function( type ) {
7497		if ( type !== false ) {
7498			type = type || "fx";
7499		}
7500		return this.each( function() {
7501			var index,
7502				data = dataPriv.get( this ),
7503				queue = data[ type + "queue" ],
7504				hooks = data[ type + "queueHooks" ],
7505				timers = jQuery.timers,
7506				length = queue ? queue.length : 0;
7507
7508			// Enable finishing flag on private data
7509			data.finish = true;
7510
7511			// Empty the queue first
7512			jQuery.queue( this, type, [] );
7513
7514			if ( hooks && hooks.stop ) {
7515				hooks.stop.call( this, true );
7516			}
7517
7518			// Look for any active animations, and finish them
7519			for ( index = timers.length; index--; ) {
7520				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7521					timers[ index ].anim.stop( true );
7522					timers.splice( index, 1 );
7523				}
7524			}
7525
7526			// Look for any animations in the old queue and finish them
7527			for ( index = 0; index < length; index++ ) {
7528				if ( queue[ index ] && queue[ index ].finish ) {
7529					queue[ index ].finish.call( this );
7530				}
7531			}
7532
7533			// Turn off finishing flag
7534			delete data.finish;
7535		} );
7536	}
7537} );
7538
7539jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7540	var cssFn = jQuery.fn[ name ];
7541	jQuery.fn[ name ] = function( speed, easing, callback ) {
7542		return speed == null || typeof speed === "boolean" ?
7543			cssFn.apply( this, arguments ) :
7544			this.animate( genFx( name, true ), speed, easing, callback );
7545	};
7546} );
7547
7548// Generate shortcuts for custom animations
7549jQuery.each( {
7550	slideDown: genFx( "show" ),
7551	slideUp: genFx( "hide" ),
7552	slideToggle: genFx( "toggle" ),
7553	fadeIn: { opacity: "show" },
7554	fadeOut: { opacity: "hide" },
7555	fadeToggle: { opacity: "toggle" }
7556}, function( name, props ) {
7557	jQuery.fn[ name ] = function( speed, easing, callback ) {
7558		return this.animate( props, speed, easing, callback );
7559	};
7560} );
7561
7562jQuery.timers = [];
7563jQuery.fx.tick = function() {
7564	var timer,
7565		i = 0,
7566		timers = jQuery.timers;
7567
7568	fxNow = jQuery
vendor: 7,814 bytes, lines 7568-7921
7568.now();
7569
7570	for ( ; i < timers.length; i++ ) {
7571		timer = timers[ i ];
7572
7573		// Run the timer and safely remove it when done (allowing for external removal)
7574		if ( !timer() && timers[ i ] === timer ) {
7575			timers.splice( i--, 1 );
7576		}
7577	}
7578
7579	if ( !timers.length ) {
7580		jQuery.fx.stop();
7581	}
7582	fxNow = undefined;
7583};
7584
7585jQuery.fx.timer = function( timer ) {
7586	jQuery.timers.push( timer );
7587	jQuery.fx.start();
7588};
7589
7590jQuery.fx.interval = 13;
7591jQuery.fx.start = function() {
7592	if ( inProgress ) {
7593		return;
7594	}
7595
7596	inProgress = true;
7597	schedule();
7598};
7599
7600jQuery.fx.stop = function() {
7601	inProgress = null;
7602};
7603
7604jQuery.fx.speeds = {
7605	slow: 600,
7606	fast: 200,
7607
7608	// Default speed
7609	_default: 400
7610};
7611
7612
7613// Based off of the plugin by Clint Helfers, with permission.
7614// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7615jQuery.fn.delay = function( time, type ) {
7616	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7617	type = type || "fx";
7618
7619	return this.queue( type, function( next, hooks ) {
7620		var timeout = window.setTimeout( next, time );
7621		hooks.stop = function() {
7622			window.clearTimeout( timeout );
7623		};
7624	} );
7625};
7626
7627
7628( function() {
7629	var input = document.createElement( "input" ),
7630		select = document.createElement( "select" ),
7631		opt = select.appendChild( document.createElement( "option" ) );
7632
7633	input.type = "checkbox";
7634
7635	// Support: Android <=4.3 only
7636	// Default value for a checkbox should be "on"
7637	support.checkOn = input.value !== "";
7638
7639	// Support: IE <=11 only
7640	// Must access selectedIndex to make default options select
7641	support.optSelected = opt.selected;
7642
7643	// Support: IE <=11 only
7644	// An input loses its value after becoming a radio
7645	input = document.createElement( "input" );
7646	input.value = "t";
7647	input.type = "radio";
7648	support.radioValue = input.value === "t";
7649} )();
7650
7651
7652var boolHook,
7653	attrHandle = jQuery.expr.attrHandle;
7654
7655jQuery.fn.extend( {
7656	attr: function( name, value ) {
7657		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7658	},
7659
7660	removeAttr: function( name ) {
7661		return this.each( function() {
7662			jQuery.removeAttr( this, name );
7663		} );
7664	}
7665} );
7666
7667jQuery.extend( {
7668	attr: function( elem, name, value ) {
7669		var ret, hooks,
7670			nType = elem.nodeType;
7671
7672		// Don't get/set attributes on text, comment and attribute nodes
7673		if ( nType === 3 || nType === 8 || nType === 2 ) {
7674			return;
7675		}
7676
7677		// Fallback to prop when attributes are not supported
7678		if ( typeof elem.getAttribute === "undefined" ) {
7679			return jQuery.prop( elem, name, value );
7680		}
7681
7682		// Attribute hooks are determined by the lowercase version
7683		// Grab necessary hook if one is defined
7684		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7685			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7686				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7687		}
7688
7689		if ( value !== undefined ) {
7690			if ( value === null ) {
7691				jQuery.removeAttr( elem, name );
7692				return;
7693			}
7694
7695			if ( hooks && "set" in hooks &&
7696				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7697				return ret;
7698			}
7699
7700			elem.setAttribute( name, value + "" );
7701			return value;
7702		}
7703
7704		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7705			return ret;
7706		}
7707
7708		ret = jQuery.find.attr( elem, name );
7709
7710		// Non-existent attributes return null, we normalize to undefined
7711		return ret == null ? undefined : ret;
7712	},
7713
7714	attrHooks: {
7715		type: {
7716			set: function( elem, value ) {
7717				if ( !support.radioValue && value === "radio" &&
7718					nodeName( elem, "input" ) ) {
7719					var val = elem.value;
7720					elem.setAttribute( "type", value );
7721					if ( val ) {
7722						elem.value = val;
7723					}
7724					return value;
7725				}
7726			}
7727		}
7728	},
7729
7730	removeAttr: function( elem, value ) {
7731		var name,
7732			i = 0,
7733
7734			// Attribute names can contain non-HTML whitespace characters
7735			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7736			attrNames = value && value.match( rnothtmlwhite );
7737
7738		if ( attrNames && elem.nodeType === 1 ) {
7739			while ( ( name = attrNames[ i++ ] ) ) {
7740				elem.removeAttribute( name );
7741			}
7742		}
7743	}
7744} );
7745
7746// Hooks for boolean attributes
7747boolHook = {
7748	set: function( elem, value, name ) {
7749		if ( value === false ) {
7750
7751			// Remove boolean attributes when set to false
7752			jQuery.removeAttr( elem, name );
7753		} else {
7754			elem.setAttribute( name, name );
7755		}
7756		return name;
7757	}
7758};
7759
7760jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7761	var getter = attrHandle[ name ] || jQuery.find.attr;
7762
7763	attrHandle[ name ] = function( elem, name, isXML ) {
7764		var ret, handle,
7765			lowercaseName = name.toLowerCase();
7766
7767		if ( !isXML ) {
7768
7769			// Avoid an infinite loop by temporarily removing this function from the getter
7770			handle = attrHandle[ lowercaseName ];
7771			attrHandle[ lowercaseName ] = ret;
7772			ret = getter( elem, name, isXML ) != null ?
7773				lowercaseName :
7774				null;
7775			attrHandle[ lowercaseName ] = handle;
7776		}
7777		return ret;
7778	};
7779} );
7780
7781
7782
7783
7784var rfocusable = /^(?:input|select|textarea|button)$/i,
7785	rclickable = /^(?:a|area)$/i;
7786
7787jQuery.fn.extend( {
7788	prop: function( name, value ) {
7789		return access( this, jQuery.prop, name, value, arguments.length > 1 );
7790	},
7791
7792	removeProp: function( name ) {
7793		return this.each( function() {
7794			delete this[ jQuery.propFix[ name ] || name ];
7795		} );
7796	}
7797} );
7798
7799jQuery.extend( {
7800	prop: function( elem, name, value ) {
7801		var ret, hooks,
7802			nType = elem.nodeType;
7803
7804		// Don't get/set properties on text, comment and attribute nodes
7805		if ( nType === 3 || nType === 8 || nType === 2 ) {
7806			return;
7807		}
7808
7809		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7810
7811			// Fix name and attach hooks
7812			name = jQuery.propFix[ name ] || name;
7813			hooks = jQuery.propHooks[ name ];
7814		}
7815
7816		if ( value !== undefined ) {
7817			if ( hooks && "set" in hooks &&
7818				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7819				return ret;
7820			}
7821
7822			return ( elem[ name ] = value );
7823		}
7824
7825		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7826			return ret;
7827		}
7828
7829		return elem[ name ];
7830	},
7831
7832	propHooks: {
7833		tabIndex: {
7834			get: function( elem ) {
7835
7836				// Support: IE <=9 - 11 only
7837				// elem.tabIndex doesn't always return the
7838				// correct value when it hasn't been explicitly set
7839				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7840				// Use proper attribute retrieval(#12072)
7841				var tabindex = jQuery.find.attr( elem, "tabindex" );
7842
7843				if ( tabindex ) {
7844					return parseInt( tabindex, 10 );
7845				}
7846
7847				if (
7848					rfocusable.test( elem.nodeName ) ||
7849					rclickable.test( elem.nodeName ) &&
7850					elem.href
7851				) {
7852					return 0;
7853				}
7854
7855				return -1;
7856			}
7857		}
7858	},
7859
7860	propFix: {
7861		"for": "htmlFor",
7862		"class": "className"
7863	}
7864} );
7865
7866// Support: IE <=11 only
7867// Accessing the selectedIndex property
7868// forces the browser to respect setting selected
7869// on the option
7870// The getter ensures a default option is selected
7871// when in an optgroup
7872// eslint rule "no-unused-expressions" is disabled for this code
7873// since it considers such accessions noop
7874if ( !support.optSelected ) {
7875	jQuery.propHooks.selected = {
7876		get: function( elem ) {
7877
7878			/* eslint no-unused-expressions: "off" */
7879
7880			var parent = elem.parentNode;
7881			if ( parent && parent.parentNode ) {
7882				parent.parentNode.selectedIndex;
7883			}
7884			return null;
7885		},
7886		set: function( elem ) {
7887
7888			/* eslint no-unused-expressions: "off" */
7889
7890			var parent = elem.parentNode;
7891			if ( parent ) {
7892				parent.selectedIndex;
7893
7894				if ( parent.parentNode ) {
7895					parent.parentNode.selectedIndex;
7896				}
7897			}
7898		}
7899	};
7900}
7901
7902jQuery.each( [
7903	"tabIndex",
7904	"readOnly",
7905	"maxLength",
7906	"cellSpacing",
7907	"cellPadding",
7908	"rowSpan",
7909	"colSpan",
7910	"useMap",
7911	"frameBorder",
7912	"contentEditable"
7913], function() {
7914	jQuery.propFix[ this.toLowerCase() ] = this;
7915} );
7916
7917
7918
7919
7920	// Strip and collapse whitespace according to HTML spec
7921	// https://
vendor: 4,260 bytes, lines 7921-8087
7921html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
7922	function stripAndCollapse( value ) {
7923		var tokens = value.match( rnothtmlwhite ) || [];
7924		return tokens.join( " " );
7925	}
7926
7927
7928function getClass( elem ) {
7929	return elem.getAttribute && elem.getAttribute( "class" ) || "";
7930}
7931
7932jQuery.fn.extend( {
7933	addClass: function( value ) {
7934		var classes, elem, cur, curValue, clazz, j, finalValue,
7935			i = 0;
7936
7937		if ( jQuery.isFunction( value ) ) {
7938			return this.each( function( j ) {
7939				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7940			} );
7941		}
7942
7943		if ( typeof value === "string" && value ) {
7944			classes = value.match( rnothtmlwhite ) || [];
7945
7946			while ( ( elem = this[ i++ ] ) ) {
7947				curValue = getClass( elem );
7948				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7949
7950				if ( cur ) {
7951					j = 0;
7952					while ( ( clazz = classes[ j++ ] ) ) {
7953						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7954							cur += clazz + " ";
7955						}
7956					}
7957
7958					// Only assign if different to avoid unneeded rendering.
7959					finalValue = stripAndCollapse( cur );
7960					if ( curValue !== finalValue ) {
7961						elem.setAttribute( "class", finalValue );
7962					}
7963				}
7964			}
7965		}
7966
7967		return this;
7968	},
7969
7970	removeClass: function( value ) {
7971		var classes, elem, cur, curValue, clazz, j, finalValue,
7972			i = 0;
7973
7974		if ( jQuery.isFunction( value ) ) {
7975			return this.each( function( j ) {
7976				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7977			} );
7978		}
7979
7980		if ( !arguments.length ) {
7981			return this.attr( "class", "" );
7982		}
7983
7984		if ( typeof value === "string" && value ) {
7985			classes = value.match( rnothtmlwhite ) || [];
7986
7987			while ( ( elem = this[ i++ ] ) ) {
7988				curValue = getClass( elem );
7989
7990				// This expression is here for better compressibility (see addClass)
7991				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7992
7993				if ( cur ) {
7994					j = 0;
7995					while ( ( clazz = classes[ j++ ] ) ) {
7996
7997						// Remove *all* instances
7998						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
7999							cur = cur.replace( " " + clazz + " ", " " );
8000						}
8001					}
8002
8003					// Only assign if different to avoid unneeded rendering.
8004					finalValue = stripAndCollapse( cur );
8005					if ( curValue !== finalValue ) {
8006						elem.setAttribute( "class", finalValue );
8007					}
8008				}
8009			}
8010		}
8011
8012		return this;
8013	},
8014
8015	toggleClass: function( value, stateVal ) {
8016		var type = typeof value;
8017
8018		if ( typeof stateVal === "boolean" && type === "string" ) {
8019			return stateVal ? this.addClass( value ) : this.removeClass( value );
8020		}
8021
8022		if ( jQuery.isFunction( value ) ) {
8023			return this.each( function( i ) {
8024				jQuery( this ).toggleClass(
8025					value.call( this, i, getClass( this ), stateVal ),
8026					stateVal
8027				);
8028			} );
8029		}
8030
8031		return this.each( function() {
8032			var className, i, self, classNames;
8033
8034			if ( type === "string" ) {
8035
8036				// Toggle individual class names
8037				i = 0;
8038				self = jQuery( this );
8039				classNames = value.match( rnothtmlwhite ) || [];
8040
8041				while ( ( className = classNames[ i++ ] ) ) {
8042
8043					// Check each className given, space separated list
8044					if ( self.hasClass( className ) ) {
8045						self.removeClass( className );
8046					} else {
8047						self.addClass( className );
8048					}
8049				}
8050
8051			// Toggle whole class name
8052			} else if ( value === undefined || type === "boolean" ) {
8053				className = getClass( this );
8054				if ( className ) {
8055
8056					// Store className if set
8057					dataPriv.set( this, "__className__", className );
8058				}
8059
8060				// If the element has a class name or if we're passed `false`,
8061				// then remove the whole classname (if there was one, the above saved it).
8062				// Otherwise bring back whatever was previously saved (if anything),
8063				// falling back to the empty string if nothing was stored.
8064				if ( this.setAttribute ) {
8065					this.setAttribute( "class",
8066						className || value === false ?
8067						"" :
8068						dataPriv.get( this, "__className__" ) || ""
8069					);
8070				}
8071			}
8072		} );
8073	},
8074
8075	hasClass: function( selector ) {
8076		var className, elem,
8077			i = 0;
8078
8079		className = " " + selector + " ";
8080		while ( ( elem = this[ i++ ] ) ) {
8081			if ( elem.nodeType === 1 &&
8082				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8083					return true;
8084			}
8085		}
8086
8087		return false;
vendor: 1,377 bytes, lines 8088-8157
8088	}
8089} );
8090
8091
8092
8093
8094var rreturn = /\r/g;
8095
8096jQuery.fn.extend( {
8097	val: function( value ) {
8098		var hooks, ret, isFunction,
8099			elem = this[ 0 ];
8100
8101		if ( !arguments.length ) {
8102			if ( elem ) {
8103				hooks = jQuery.valHooks[ elem.type ] ||
8104					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
8105
8106				if ( hooks &&
8107					"get" in hooks &&
8108					( ret = hooks.get( elem, "value" ) ) !== undefined
8109				) {
8110					return ret;
8111				}
8112
8113				ret = elem.value;
8114
8115				// Handle most common string cases
8116				if ( typeof ret === "string" ) {
8117					return ret.replace( rreturn, "" );
8118				}
8119
8120				// Handle cases where value is null/undef or number
8121				return ret == null ? "" : ret;
8122			}
8123
8124			return;
8125		}
8126
8127		isFunction = jQuery.isFunction( value );
8128
8129		return this.each( function( i ) {
8130			var val;
8131
8132			if ( this.nodeType !== 1 ) {
8133				return;
8134			}
8135
8136			if ( isFunction ) {
8137				val = value.call( this, i, jQuery( this ).val() );
8138			} else {
8139				val = value;
8140			}
8141
8142			// Treat null/undefined as ""; convert numbers to string
8143			if ( val == null ) {
8144				val = "";
8145
8146			} else if ( typeof val === "number" ) {
8147				val += "";
8148
8149			} else if ( Array.isArray( val ) ) {
8150				val = jQuery.map( val, function( value ) {
8151					return value == null ? "" : value + "";
8152				} );
8153			}
8154
8155			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
8156
8157			// If set returns undefined, fall back to normal setting
vendor: 8,160 bytes, lines 8158-8476
8158			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
8159				this.value = val;
8160			}
8161		} );
8162	}
8163} );
8164
8165jQuery.extend( {
8166	valHooks: {
8167		option: {
8168			get: function( elem ) {
8169
8170				var val = jQuery.find.attr( elem, "value" );
8171				return val != null ?
8172					val :
8173
8174					// Support: IE <=10 - 11 only
8175					// option.text throws exceptions (#14686, #14858)
8176					// Strip and collapse whitespace
8177					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8178					stripAndCollapse( jQuery.text( elem ) );
8179			}
8180		},
8181		select: {
8182			get: function( elem ) {
8183				var value, option, i,
8184					options = elem.options,
8185					index = elem.selectedIndex,
8186					one = elem.type === "select-one",
8187					values = one ? null : [],
8188					max = one ? index + 1 : options.length;
8189
8190				if ( index < 0 ) {
8191					i = max;
8192
8193				} else {
8194					i = one ? index : 0;
8195				}
8196
8197				// Loop through all the selected options
8198				for ( ; i < max; i++ ) {
8199					option = options[ i ];
8200
8201					// Support: IE <=9 only
8202					// IE8-9 doesn't update selected after form reset (#2551)
8203					if ( ( option.selected || i === index ) &&
8204
8205							// Don't return options that are disabled or in a disabled optgroup
8206							!option.disabled &&
8207							( !option.parentNode.disabled ||
8208								!nodeName( option.parentNode, "optgroup" ) ) ) {
8209
8210						// Get the specific value for the option
8211						value = jQuery( option ).val();
8212
8213						// We don't need an array for one selects
8214						if ( one ) {
8215							return value;
8216						}
8217
8218						// Multi-Selects return an array
8219						values.push( value );
8220					}
8221				}
8222
8223				return values;
8224			},
8225
8226			set: function( elem, value ) {
8227				var optionSet, option,
8228					options = elem.options,
8229					values = jQuery.makeArray( value ),
8230					i = options.length;
8231
8232				while ( i-- ) {
8233					option = options[ i ];
8234
8235					/* eslint-disable no-cond-assign */
8236
8237					if ( option.selected =
8238						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8239					) {
8240						optionSet = true;
8241					}
8242
8243					/* eslint-enable no-cond-assign */
8244				}
8245
8246				// Force browsers to behave consistently when non-matching value is set
8247				if ( !optionSet ) {
8248					elem.selectedIndex = -1;
8249				}
8250				return values;
8251			}
8252		}
8253	}
8254} );
8255
8256// Radios and checkboxes getter/setter
8257jQuery.each( [ "radio", "checkbox" ], function() {
8258	jQuery.valHooks[ this ] = {
8259		set: function( elem, value ) {
8260			if ( Array.isArray( value ) ) {
8261				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8262			}
8263		}
8264	};
8265	if ( !support.checkOn ) {
8266		jQuery.valHooks[ this ].get = function( elem ) {
8267			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8268		};
8269	}
8270} );
8271
8272
8273
8274
8275// Return jQuery for attributes-only inclusion
8276
8277
8278var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8279
8280jQuery.extend( jQuery.event, {
8281
8282	trigger: function( event, data, elem, onlyHandlers ) {
8283
8284		var i, cur, tmp, bubbleType, ontype, handle, special,
8285			eventPath = [ elem || document ],
8286			type = hasOwn.call( event, "type" ) ? event.type : event,
8287			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8288
8289		cur = tmp = elem = elem || document;
8290
8291		// Don't do events on text and comment nodes
8292		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8293			return;
8294		}
8295
8296		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8297		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8298			return;
8299		}
8300
8301		if ( type.indexOf( "." ) > -1 ) {
8302
8303			// Namespaced trigger; create a regexp to match event type in handle()
8304			namespaces = type.split( "." );
8305			type = namespaces.shift();
8306			namespaces.sort();
8307		}
8308		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8309
8310		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8311		event = event[ jQuery.expando ] ?
8312			event :
8313			new jQuery.Event( type, typeof event === "object" && event );
8314
8315		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8316		event.isTrigger = onlyHandlers ? 2 : 3;
8317		event.namespace = namespaces.join( "." );
8318		event.rnamespace = event.namespace ?
8319			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8320			null;
8321
8322		// Clean up the event in case it is being reused
8323		event.result = undefined;
8324		if ( !event.target ) {
8325			event.target = elem;
8326		}
8327
8328		// Clone any incoming data and prepend the event, creating the handler arg list
8329		data = data == null ?
8330			[ event ] :
8331			jQuery.makeArray( data, [ event ] );
8332
8333		// Allow special events to draw outside the lines
8334		special = jQuery.event.special[ type ] || {};
8335		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8336			return;
8337		}
8338
8339		// Determine event propagation path in advance, per W3C events spec (#9951)
8340		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8341		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8342
8343			bubbleType = special.delegateType || type;
8344			if ( !rfocusMorph.test( bubbleType + type ) ) {
8345				cur = cur.parentNode;
8346			}
8347			for ( ; cur; cur = cur.parentNode ) {
8348				eventPath.push( cur );
8349				tmp = cur;
8350			}
8351
8352			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8353			if ( tmp === ( elem.ownerDocument || document ) ) {
8354				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8355			}
8356		}
8357
8358		// Fire handlers on the event path
8359		i = 0;
8360		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8361
8362			event.type = i > 1 ?
8363				bubbleType :
8364				special.bindType || type;
8365
8366			// jQuery handler
8367			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8368				dataPriv.get( cur, "handle" );
8369			if ( handle ) {
8370				handle.apply( cur, data );
8371			}
8372
8373			// Native handler
8374			handle = ontype && cur[ ontype ];
8375			if ( handle && handle.apply && acceptData( cur ) ) {
8376				event.result = handle.apply( cur, data );
8377				if ( event.result === false ) {
8378					event.preventDefault();
8379				}
8380			}
8381		}
8382		event.type = type;
8383
8384		// If nobody prevented the default action, do it now
8385		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8386
8387			if ( ( !special._default ||
8388				special._default.apply( eventPath.pop(), data ) === false ) &&
8389				acceptData( elem ) ) {
8390
8391				// Call a native DOM method on the target with the same name as the event.
8392				// Don't do default actions on window, that's where global variables be (#6170)
8393				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8394
8395					// Don't re-trigger an onFOO event when we call its FOO() method
8396					tmp = elem[ ontype ];
8397
8398					if ( tmp ) {
8399						elem[ ontype ] = null;
8400					}
8401
8402					// Prevent re-triggering of the same event, since we already bubbled it above
8403					jQuery.event.triggered = type;
8404					elem[ type ]();
8405					jQuery.event.triggered = undefined;
8406
8407					if ( tmp ) {
8408						elem[ ontype ] = tmp;
8409					}
8410				}
8411			}
8412		}
8413
8414		return event.result;
8415	},
8416
8417	// Piggyback on a donor event to simulate a different one
8418	// Used only for `focus(in | out)` events
8419	simulate: function( type, elem, event ) {
8420		var e = jQuery.extend(
8421			new jQuery.Event(),
8422			event,
8423			{
8424				type: type,
8425				isSimulated: true
8426			}
8427		);
8428
8429		jQuery.event.trigger( e, null, elem );
8430	}
8431
8432} );
8433
8434jQuery.fn.extend( {
8435
8436	trigger: function( type, data ) {
8437		return this.each( function() {
8438			jQuery.event.trigger( type, data, this );
8439		} );
8440	},
8441	triggerHandler: function( type, data ) {
8442		var elem = this[ 0 ];
8443		if ( elem ) {
8444			return jQuery.event.trigger( type, data, elem, true );
8445		}
8446	}
8447} );
8448
8449
8450jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
8451	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8452	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
8453	function( i, name ) {
8454
8455	// Handle event binding
8456	jQuery.fn[ name ] = function( data, fn ) {
8457		return arguments.length > 0 ?
8458			this.on( name, null, data, fn ) :
8459			this.trigger( name );
8460	};
8461} );
8462
8463jQuery.fn.extend( {
8464	hover: function( fnOver, fnOut ) {
8465		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8466	}
8467} );
8468
8469
8470
8471
8472support.focusin = "onfocusin" in window;
8473
8474
8475// Support: Firefox <=44
8476// Firefox doesn't have focus(in | out) events
vendor: 4,174 bytes, lines 8477-8640
8477// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8478//
8479// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8480// focus(in | out) events fire after focus & blur events,
8481// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8482// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8483if ( !support.focusin ) {
8484	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8485
8486		// Attach a single capturing handler on the document while someone wants focusin/focusout
8487		var handler = function( event ) {
8488			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8489		};
8490
8491		jQuery.event.special[ fix ] = {
8492			setup: function() {
8493				var doc = this.ownerDocument || this,
8494					attaches = dataPriv.access( doc, fix );
8495
8496				if ( !attaches ) {
8497					doc.addEventListener( orig, handler, true );
8498				}
8499				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8500			},
8501			teardown: function() {
8502				var doc = this.ownerDocument || this,
8503					attaches = dataPriv.access( doc, fix ) - 1;
8504
8505				if ( !attaches ) {
8506					doc.removeEventListener( orig, handler, true );
8507					dataPriv.remove( doc, fix );
8508
8509				} else {
8510					dataPriv.access( doc, fix, attaches );
8511				}
8512			}
8513		};
8514	} );
8515}
8516var location = window.location;
8517
8518var nonce = jQuery.now();
8519
8520var rquery = ( /\?/ );
8521
8522
8523
8524// Cross-browser xml parsing
8525jQuery.parseXML = function( data ) {
8526	var xml;
8527	if ( !data || typeof data !== "string" ) {
8528		return null;
8529	}
8530
8531	// Support: IE 9 - 11 only
8532	// IE throws on parseFromString with invalid input.
8533	try {
8534		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8535	} catch ( e ) {
8536		xml = undefined;
8537	}
8538
8539	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8540		jQuery.error( "Invalid XML: " + data );
8541	}
8542	return xml;
8543};
8544
8545
8546var
8547	rbracket = /\[\]$/,
8548	rCRLF = /\r?\n/g,
8549	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8550	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8551
8552function buildParams( prefix, obj, traditional, add ) {
8553	var name;
8554
8555	if ( Array.isArray( obj ) ) {
8556
8557		// Serialize array item.
8558		jQuery.each( obj, function( i, v ) {
8559			if ( traditional || rbracket.test( prefix ) ) {
8560
8561				// Treat each array item as a scalar.
8562				add( prefix, v );
8563
8564			} else {
8565
8566				// Item is non-scalar (array or object), encode its numeric index.
8567				buildParams(
8568					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8569					v,
8570					traditional,
8571					add
8572				);
8573			}
8574		} );
8575
8576	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
8577
8578		// Serialize object item.
8579		for ( name in obj ) {
8580			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8581		}
8582
8583	} else {
8584
8585		// Serialize scalar item.
8586		add( prefix, obj );
8587	}
8588}
8589
8590// Serialize an array of form elements or a set of
8591// key/values into a query string
8592jQuery.param = function( a, traditional ) {
8593	var prefix,
8594		s = [],
8595		add = function( key, valueOrFunction ) {
8596
8597			// If value is a function, invoke it and use its return value
8598			var value = jQuery.isFunction( valueOrFunction ) ?
8599				valueOrFunction() :
8600				valueOrFunction;
8601
8602			s[ s.length ] = encodeURIComponent( key ) + "=" +
8603				encodeURIComponent( value == null ? "" : value );
8604		};
8605
8606	// If an array was passed in, assume that it is an array of form elements.
8607	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8608
8609		// Serialize the form elements
8610		jQuery.each( a, function() {
8611			add( this.name, this.value );
8612		} );
8613
8614	} else {
8615
8616		// If traditional, encode the "old" way (the way 1.3.2 or older
8617		// did it), otherwise encode params recursively.
8618		for ( prefix in a ) {
8619			buildParams( prefix, a[ prefix ], traditional, add );
8620		}
8621	}
8622
8623	// Return the resulting serialization
8624	return s.join( "&" );
8625};
8626
8627jQuery.fn.extend( {
8628	serialize: function() {
8629		return jQuery.param( this.serializeArray() );
8630	},
8631	serializeArray: function() {
8632		return this.map( function() {
8633
8634			// Can add propHook for "elements" to filter or add form elements
8635			var elements = jQuery.prop( this, "elements" );
8636			return elements ? jQuery.makeArray( elements ) : this;
8637		} )
8638		.filter( function() {
8639			var type = this.type;
8640
vendor: 4,939 bytes, lines 8641-8813
8641			// Use .is( ":disabled" ) so that fieldset[disabled] works
8642			return this.name && !jQuery( this ).is( ":disabled" ) &&
8643				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8644				( this.checked || !rcheckableType.test( type ) );
8645		} )
8646		.map( function( i, elem ) {
8647			var val = jQuery( this ).val();
8648
8649			if ( val == null ) {
8650				return null;
8651			}
8652
8653			if ( Array.isArray( val ) ) {
8654				return jQuery.map( val, function( val ) {
8655					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8656				} );
8657			}
8658
8659			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8660		} ).get();
8661	}
8662} );
8663
8664
8665var
8666	r20 = /%20/g,
8667	rhash = /#.*$/,
8668	rantiCache = /([?&])_=[^&]*/,
8669	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8670
8671	// #7653, #8125, #8152: local protocol detection
8672	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8673	rnoContent = /^(?:GET|HEAD)$/,
8674	rprotocol = /^\/\//,
8675
8676	/* Prefilters
8677	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8678	 * 2) These are called:
8679	 *    - BEFORE asking for a transport
8680	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8681	 * 3) key is the dataType
8682	 * 4) the catchall symbol "*" can be used
8683	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8684	 */
8685	prefilters = {},
8686
8687	/* Transports bindings
8688	 * 1) key is the dataType
8689	 * 2) the catchall symbol "*" can be used
8690	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8691	 */
8692	transports = {},
8693
8694	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8695	allTypes = "*/".concat( "*" ),
8696
8697	// Anchor tag for parsing the document origin
8698	originAnchor = document.createElement( "a" );
8699	originAnchor.href = location.href;
8700
8701// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8702function addToPrefiltersOrTransports( structure ) {
8703
8704	// dataTypeExpression is optional and defaults to "*"
8705	return function( dataTypeExpression, func ) {
8706
8707		if ( typeof dataTypeExpression !== "string" ) {
8708			func = dataTypeExpression;
8709			dataTypeExpression = "*";
8710		}
8711
8712		var dataType,
8713			i = 0,
8714			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8715
8716		if ( jQuery.isFunction( func ) ) {
8717
8718			// For each dataType in the dataTypeExpression
8719			while ( ( dataType = dataTypes[ i++ ] ) ) {
8720
8721				// Prepend if requested
8722				if ( dataType[ 0 ] === "+" ) {
8723					dataType = dataType.slice( 1 ) || "*";
8724					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8725
8726				// Otherwise append
8727				} else {
8728					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8729				}
8730			}
8731		}
8732	};
8733}
8734
8735// Base inspection function for prefilters and transports
8736function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8737
8738	var inspected = {},
8739		seekingTransport = ( structure === transports );
8740
8741	function inspect( dataType ) {
8742		var selected;
8743		inspected[ dataType ] = true;
8744		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8745			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8746			if ( typeof dataTypeOrTransport === "string" &&
8747				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8748
8749				options.dataTypes.unshift( dataTypeOrTransport );
8750				inspect( dataTypeOrTransport );
8751				return false;
8752			} else if ( seekingTransport ) {
8753				return !( selected = dataTypeOrTransport );
8754			}
8755		} );
8756		return selected;
8757	}
8758
8759	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8760}
8761
8762// A special extend for ajax options
8763// that takes "flat" options (not to be deep extended)
8764// Fixes #9887
8765function ajaxExtend( target, src ) {
8766	var key, deep,
8767		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8768
8769	for ( key in src ) {
8770		if ( src[ key ] !== undefined ) {
8771			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8772		}
8773	}
8774	if ( deep ) {
8775		jQuery.extend( true, target, deep );
8776	}
8777
8778	return target;
8779}
8780
8781/* Handles responses to an ajax request:
8782 * - finds the right dataType (mediates between content-type and expected dataType)
8783 * - returns the corresponding response
8784 */
8785function ajaxHandleResponses( s, jqXHR, responses ) {
8786
8787	var ct, type, finalDataType, firstDataType,
8788		contents = s.contents,
8789		dataTypes = s.dataTypes;
8790
8791	// Remove auto dataType and get content-type in the process
8792	while ( dataTypes[ 0 ] === "*" ) {
8793		dataTypes.shift();
8794		if ( ct === undefined ) {
8795			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8796		}
8797	}
8798
8799	// Check if we're dealing with a known content-type
8800	if ( ct ) {
8801		for ( type in contents ) {
8802			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8803				dataTypes.unshift( type );
8804				break;
8805			}
8806		}
8807	}
8808
8809	// Check to see if we have a response for the expected dataType
8810	if ( dataTypes[ 0 ] in responses ) {
8811		finalDataType = dataTypes[ 0 ];
8812	} else {
8813
vendor: 18,932 bytes, lines 8814-9571
8814		// Try convertible dataTypes
8815		for ( type in responses ) {
8816			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8817				finalDataType = type;
8818				break;
8819			}
8820			if ( !firstDataType ) {
8821				firstDataType = type;
8822			}
8823		}
8824
8825		// Or just use first one
8826		finalDataType = finalDataType || firstDataType;
8827	}
8828
8829	// If we found a dataType
8830	// We add the dataType to the list if needed
8831	// and return the corresponding response
8832	if ( finalDataType ) {
8833		if ( finalDataType !== dataTypes[ 0 ] ) {
8834			dataTypes.unshift( finalDataType );
8835		}
8836		return responses[ finalDataType ];
8837	}
8838}
8839
8840/* Chain conversions given the request and the original response
8841 * Also sets the responseXXX fields on the jqXHR instance
8842 */
8843function ajaxConvert( s, response, jqXHR, isSuccess ) {
8844	var conv2, current, conv, tmp, prev,
8845		converters = {},
8846
8847		// Work with a copy of dataTypes in case we need to modify it for conversion
8848		dataTypes = s.dataTypes.slice();
8849
8850	// Create converters map with lowercased keys
8851	if ( dataTypes[ 1 ] ) {
8852		for ( conv in s.converters ) {
8853			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8854		}
8855	}
8856
8857	current = dataTypes.shift();
8858
8859	// Convert to each sequential dataType
8860	while ( current ) {
8861
8862		if ( s.responseFields[ current ] ) {
8863			jqXHR[ s.responseFields[ current ] ] = response;
8864		}
8865
8866		// Apply the dataFilter if provided
8867		if ( !prev && isSuccess && s.dataFilter ) {
8868			response = s.dataFilter( response, s.dataType );
8869		}
8870
8871		prev = current;
8872		current = dataTypes.shift();
8873
8874		if ( current ) {
8875
8876			// There's only work to do if current dataType is non-auto
8877			if ( current === "*" ) {
8878
8879				current = prev;
8880
8881			// Convert response if prev dataType is non-auto and differs from current
8882			} else if ( prev !== "*" && prev !== current ) {
8883
8884				// Seek a direct converter
8885				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8886
8887				// If none found, seek a pair
8888				if ( !conv ) {
8889					for ( conv2 in converters ) {
8890
8891						// If conv2 outputs current
8892						tmp = conv2.split( " " );
8893						if ( tmp[ 1 ] === current ) {
8894
8895							// If prev can be converted to accepted input
8896							conv = converters[ prev + " " + tmp[ 0 ] ] ||
8897								converters[ "* " + tmp[ 0 ] ];
8898							if ( conv ) {
8899
8900								// Condense equivalence converters
8901								if ( conv === true ) {
8902									conv = converters[ conv2 ];
8903
8904								// Otherwise, insert the intermediate dataType
8905								} else if ( converters[ conv2 ] !== true ) {
8906									current = tmp[ 0 ];
8907									dataTypes.unshift( tmp[ 1 ] );
8908								}
8909								break;
8910							}
8911						}
8912					}
8913				}
8914
8915				// Apply converter (if not an equivalence)
8916				if ( conv !== true ) {
8917
8918					// Unless errors are allowed to bubble, catch and return them
8919					if ( conv && s.throws ) {
8920						response = conv( response );
8921					} else {
8922						try {
8923							response = conv( response );
8924						} catch ( e ) {
8925							return {
8926								state: "parsererror",
8927								error: conv ? e : "No conversion from " + prev + " to " + current
8928							};
8929						}
8930					}
8931				}
8932			}
8933		}
8934	}
8935
8936	return { state: "success", data: response };
8937}
8938
8939jQuery.extend( {
8940
8941	// Counter for holding the number of active queries
8942	active: 0,
8943
8944	// Last-Modified header cache for next request
8945	lastModified: {},
8946	etag: {},
8947
8948	ajaxSettings: {
8949		url: location.href,
8950		type: "GET",
8951		isLocal: rlocalProtocol.test( location.protocol ),
8952		global: true,
8953		processData: true,
8954		async: true,
8955		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8956
8957		/*
8958		timeout: 0,
8959		data: null,
8960		dataType: null,
8961		username: null,
8962		password: null,
8963		cache: null,
8964		throws: false,
8965		traditional: false,
8966		headers: {},
8967		*/
8968
8969		accepts: {
8970			"*": allTypes,
8971			text: "text/plain",
8972			html: "text/html",
8973			xml: "application/xml, text/xml",
8974			json: "application/json, text/javascript"
8975		},
8976
8977		contents: {
8978			xml: /\bxml\b/,
8979			html: /\bhtml/,
8980			json: /\bjson\b/
8981		},
8982
8983		responseFields: {
8984			xml: "responseXML",
8985			text: "responseText",
8986			json: "responseJSON"
8987		},
8988
8989		// Data converters
8990		// Keys separate source (or catchall "*") and destination types with a single space
8991		converters: {
8992
8993			// Convert anything to text
8994			"* text": String,
8995
8996			// Text to html (true = no transformation)
8997			"text html": true,
8998
8999			// Evaluate text as a json expression
9000			"text json": JSON.parse,
9001
9002			// Parse text as xml
9003			"text xml": jQuery.parseXML
9004		},
9005
9006		// For options that shouldn't be deep extended:
9007		// you can add your own custom options here if
9008		// and when you create one that shouldn't be
9009		// deep extended (see ajaxExtend)
9010		flatOptions: {
9011			url: true,
9012			context: true
9013		}
9014	},
9015
9016	// Creates a full fledged settings object into target
9017	// with both ajaxSettings and settings fields.
9018	// If target is omitted, writes into ajaxSettings.
9019	ajaxSetup: function( target, settings ) {
9020		return settings ?
9021
9022			// Building a settings object
9023			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
9024
9025			// Extending ajaxSettings
9026			ajaxExtend( jQuery.ajaxSettings, target );
9027	},
9028
9029	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
9030	ajaxTransport: addToPrefiltersOrTransports( transports ),
9031
9032	// Main method
9033	ajax: function( url, options ) {
9034
9035		// If url is an object, simulate pre-1.5 signature
9036		if ( typeof url === "object" ) {
9037			options = url;
9038			url = undefined;
9039		}
9040
9041		// Force options to be an object
9042		options = options || {};
9043
9044		var transport,
9045
9046			// URL without anti-cache param
9047			cacheURL,
9048
9049			// Response headers
9050			responseHeadersString,
9051			responseHeaders,
9052
9053			// timeout handle
9054			timeoutTimer,
9055
9056			// Url cleanup var
9057			urlAnchor,
9058
9059			// Request state (becomes false upon send and true upon completion)
9060			completed,
9061
9062			// To know if global events are to be dispatched
9063			fireGlobals,
9064
9065			// Loop variable
9066			i,
9067
9068			// uncached part of the url
9069			uncached,
9070
9071			// Create the final options object
9072			s = jQuery.ajaxSetup( {}, options ),
9073
9074			// Callbacks context
9075			callbackContext = s.context || s,
9076
9077			// Context for global events is callbackContext if it is a DOM node or jQuery collection
9078			globalEventContext = s.context &&
9079				( callbackContext.nodeType || callbackContext.jquery ) ?
9080					jQuery( callbackContext ) :
9081					jQuery.event,
9082
9083			// Deferreds
9084			deferred = jQuery.Deferred(),
9085			completeDeferred = jQuery.Callbacks( "once memory" ),
9086
9087			// Status-dependent callbacks
9088			statusCode = s.statusCode || {},
9089
9090			// Headers (they are sent all at once)
9091			requestHeaders = {},
9092			requestHeadersNames = {},
9093
9094			// Default abort message
9095			strAbort = "canceled",
9096
9097			// Fake xhr
9098			jqXHR = {
9099				readyState: 0,
9100
9101				// Builds headers hashtable if needed
9102				getResponseHeader: function( key ) {
9103					var match;
9104					if ( completed ) {
9105						if ( !responseHeaders ) {
9106							responseHeaders = {};
9107							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
9108								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9109							}
9110						}
9111						match = responseHeaders[ key.toLowerCase() ];
9112					}
9113					return match == null ? null : match;
9114				},
9115
9116				// Raw string
9117				getAllResponseHeaders: function() {
9118					return completed ? responseHeadersString : null;
9119				},
9120
9121				// Caches the header
9122				setRequestHeader: function( name, value ) {
9123					if ( completed == null ) {
9124						name = requestHeadersNames[ name.toLowerCase() ] =
9125							requestHeadersNames[ name.toLowerCase() ] || name;
9126						requestHeaders[ name ] = value;
9127					}
9128					return this;
9129				},
9130
9131				// Overrides response content-type header
9132				overrideMimeType: function( type ) {
9133					if ( completed == null ) {
9134						s.mimeType = type;
9135					}
9136					return this;
9137				},
9138
9139				// Status-dependent callbacks
9140				statusCode: function( map ) {
9141					var code;
9142					if ( map ) {
9143						if ( completed ) {
9144
9145							// Execute the appropriate callbacks
9146							jqXHR.always( map[ jqXHR.status ] );
9147						} else {
9148
9149							// Lazy-add the new callbacks in a way that preserves old ones
9150							for ( code in map ) {
9151								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9152							}
9153						}
9154					}
9155					return this;
9156				},
9157
9158				// Cancel the request
9159				abort: function( statusText ) {
9160					var finalText = statusText || strAbort;
9161					if ( transport ) {
9162						transport.abort( finalText );
9163					}
9164					done( 0, finalText );
9165					return this;
9166				}
9167			};
9168
9169		// Attach deferreds
9170		deferred.promise( jqXHR );
9171
9172		// Add protocol if not provided (prefilters might expect it)
9173		// Handle falsy url in the settings object (#10093: consistency with old signature)
9174		// We also use the url parameter if available
9175		s.url = ( ( url || s.url || location.href ) + "" )
9176			.replace( rprotocol, location.protocol + "//" );
9177
9178		// Alias method option to type as per ticket #12004
9179		s.type = options.method || options.type || s.method || s.type;
9180
9181		// Extract dataTypes list
9182		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9183
9184		// A cross-domain request is in order when the origin doesn't match the current origin.
9185		if ( s.crossDomain == null ) {
9186			urlAnchor = document.createElement( "a" );
9187
9188			// Support: IE <=8 - 11, Edge 12 - 13
9189			// IE throws exception on accessing the href property if url is malformed,
9190			// e.g. http://example.com:80x/
9191			try {
9192				urlAnchor.href = s.url;
9193
9194				// Support: IE <=8 - 11 only
9195				// Anchor's host property isn't correctly set when s.url is relative
9196				urlAnchor.href = urlAnchor.href;
9197				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9198					urlAnchor.protocol + "//" + urlAnchor.host;
9199			} catch ( e ) {
9200
9201				// If there is an error parsing the URL, assume it is crossDomain,
9202				// it can be rejected by the transport if it is invalid
9203				s.crossDomain = true;
9204			}
9205		}
9206
9207		// Convert data if not already a string
9208		if ( s.data && s.processData && typeof s.data !== "string" ) {
9209			s.data = jQuery.param( s.data, s.traditional );
9210		}
9211
9212		// Apply prefilters
9213		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9214
9215		// If request was aborted inside a prefilter, stop there
9216		if ( completed ) {
9217			return jqXHR;
9218		}
9219
9220		// We can fire global events as of now if asked to
9221		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9222		fireGlobals = jQuery.event && s.global;
9223
9224		// Watch for a new set of requests
9225		if ( fireGlobals && jQuery.active++ === 0 ) {
9226			jQuery.event.trigger( "ajaxStart" );
9227		}
9228
9229		// Uppercase the type
9230		s.type = s.type.toUpperCase();
9231
9232		// Determine if request has content
9233		s.hasContent = !rnoContent.test( s.type );
9234
9235		// Save the URL in case we're toying with the If-Modified-Since
9236		// and/or If-None-Match header later on
9237		// Remove hash to simplify url manipulation
9238		cacheURL = s.url.replace( rhash, "" );
9239
9240		// More options handling for requests with no content
9241		if ( !s.hasContent ) {
9242
9243			// Remember the hash so we can put it back
9244			uncached = s.url.slice( cacheURL.length );
9245
9246			// If data is available, append data to url
9247			if ( s.data ) {
9248				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9249
9250				// #9682: remove data so that it's not used in an eventual retry
9251				delete s.data;
9252			}
9253
9254			// Add or update anti-cache param if needed
9255			if ( s.cache === false ) {
9256				cacheURL = cacheURL.replace( rantiCache, "$1" );
9257				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9258			}
9259
9260			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9261			s.url = cacheURL + uncached;
9262
9263		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9264		} else if ( s.data && s.processData &&
9265			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9266			s.data = s.data.replace( r20, "+" );
9267		}
9268
9269		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9270		if ( s.ifModified ) {
9271			if ( jQuery.lastModified[ cacheURL ] ) {
9272				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9273			}
9274			if ( jQuery.etag[ cacheURL ] ) {
9275				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9276			}
9277		}
9278
9279		// Set the correct header, if data is being sent
9280		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9281			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9282		}
9283
9284		// Set the Accepts header for the server, depending on the dataType
9285		jqXHR.setRequestHeader(
9286			"Accept",
9287			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9288				s.accepts[ s.dataTypes[ 0 ] ] +
9289					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9290				s.accepts[ "*" ]
9291		);
9292
9293		// Check for headers option
9294		for ( i in s.headers ) {
9295			jqXHR.setRequestHeader( i, s.headers[ i ] );
9296		}
9297
9298		// Allow custom headers/mimetypes and early abort
9299		if ( s.beforeSend &&
9300			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9301
9302			// Abort if not done already and return
9303			return jqXHR.abort();
9304		}
9305
9306		// Aborting is no longer a cancellation
9307		strAbort = "abort";
9308
9309		// Install callbacks on deferreds
9310		completeDeferred.add( s.complete );
9311		jqXHR.done( s.success );
9312		jqXHR.fail( s.error );
9313
9314		// Get transport
9315		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9316
9317		// If no transport, we auto-abort
9318		if ( !transport ) {
9319			done( -1, "No Transport" );
9320		} else {
9321			jqXHR.readyState = 1;
9322
9323			// Send global event
9324			if ( fireGlobals ) {
9325				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9326			}
9327
9328			// If request was aborted inside ajaxSend, stop there
9329			if ( completed ) {
9330				return jqXHR;
9331			}
9332
9333			// Timeout
9334			if ( s.async && s.timeout > 0 ) {
9335				timeoutTimer = window.setTimeout( function() {
9336					jqXHR.abort( "timeout" );
9337				}, s.timeout );
9338			}
9339
9340			try {
9341				completed = false;
9342				transport.send( requestHeaders, done );
9343			} catch ( e ) {
9344
9345				// Rethrow post-completion exceptions
9346				if ( completed ) {
9347					throw e;
9348				}
9349
9350				// Propagate others as results
9351				done( -1, e );
9352			}
9353		}
9354
9355		// Callback for when everything is done
9356		function done( status, nativeStatusText, responses, headers ) {
9357			var isSuccess, success, error, response, modified,
9358				statusText = nativeStatusText;
9359
9360			// Ignore repeat invocations
9361			if ( completed ) {
9362				return;
9363			}
9364
9365			completed = true;
9366
9367			// Clear timeout if it exists
9368			if ( timeoutTimer ) {
9369				window.clearTimeout( timeoutTimer );
9370			}
9371
9372			// Dereference transport for early garbage collection
9373			// (no matter how long the jqXHR object will be used)
9374			transport = undefined;
9375
9376			// Cache response headers
9377			responseHeadersString = headers || "";
9378
9379			// Set readyState
9380			jqXHR.readyState = status > 0 ? 4 : 0;
9381
9382			// Determine if successful
9383			isSuccess = status >= 200 && status < 300 || status === 304;
9384
9385			// Get response data
9386			if ( responses ) {
9387				response = ajaxHandleResponses( s, jqXHR, responses );
9388			}
9389
9390			// Convert no matter what (that way responseXXX fields are always set)
9391			response = ajaxConvert( s, response, jqXHR, isSuccess );
9392
9393			// If successful, handle type chaining
9394			if ( isSuccess ) {
9395
9396				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9397				if ( s.ifModified ) {
9398					modified = jqXHR.getResponseHeader( "Last-Modified" );
9399					if ( modified ) {
9400						jQuery.lastModified[ cacheURL ] = modified;
9401					}
9402					modified = jqXHR.getResponseHeader( "etag" );
9403					if ( modified ) {
9404						jQuery.etag[ cacheURL ] = modified;
9405					}
9406				}
9407
9408				// if no content
9409				if ( status === 204 || s.type === "HEAD" ) {
9410					statusText = "nocontent";
9411
9412				// if not modified
9413				} else if ( status === 304 ) {
9414					statusText = "notmodified";
9415
9416				// If we have data, let's convert it
9417				} else {
9418					statusText = response.state;
9419					success = response.data;
9420					error = response.error;
9421					isSuccess = !error;
9422				}
9423			} else {
9424
9425				// Extract error from statusText and normalize for non-aborts
9426				error = statusText;
9427				if ( status || !statusText ) {
9428					statusText = "error";
9429					if ( status < 0 ) {
9430						status = 0;
9431					}
9432				}
9433			}
9434
9435			// Set data for the fake xhr object
9436			jqXHR.status = status;
9437			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9438
9439			// Success/Error
9440			if ( isSuccess ) {
9441				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9442			} else {
9443				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9444			}
9445
9446			// Status-dependent callbacks
9447			jqXHR.statusCode( statusCode );
9448			statusCode = undefined;
9449
9450			if ( fireGlobals ) {
9451				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9452					[ jqXHR, s, isSuccess ? success : error ] );
9453			}
9454
9455			// Complete
9456			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9457
9458			if ( fireGlobals ) {
9459				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9460
9461				// Handle the global AJAX counter
9462				if ( !( --jQuery.active ) ) {
9463					jQuery.event.trigger( "ajaxStop" );
9464				}
9465			}
9466		}
9467
9468		return jqXHR;
9469	},
9470
9471	getJSON: function( url, data, callback ) {
9472		return jQuery.get( url, data, callback, "json" );
9473	},
9474
9475	getScript: function( url, callback ) {
9476		return jQuery.get( url, undefined, callback, "script" );
9477	}
9478} );
9479
9480jQuery.each( [ "get", "post" ], function( i, method ) {
9481	jQuery[ method ] = function( url, data, callback, type ) {
9482
9483		// Shift arguments if data argument was omitted
9484		if ( jQuery.isFunction( data ) ) {
9485			type = type || callback;
9486			callback = data;
9487			data = undefined;
9488		}
9489
9490		// The url can be an options object (which then must have .url)
9491		return jQuery.ajax( jQuery.extend( {
9492			url: url,
9493			type: method,
9494			dataType: type,
9495			data: data,
9496			success: callback
9497		}, jQuery.isPlainObject( url ) && url ) );
9498	};
9499} );
9500
9501
9502jQuery._evalUrl = function( url ) {
9503	return jQuery.ajax( {
9504		url: url,
9505
9506		// Make this explicit, since user can override this through ajaxSetup (#11264)
9507		type: "GET",
9508		dataType: "script",
9509		cache: true,
9510		async: false,
9511		global: false,
9512		"throws": true
9513	} );
9514};
9515
9516
9517jQuery.fn.extend( {
9518	wrapAll: function( html ) {
9519		var wrap;
9520
9521		if ( this[ 0 ] ) {
9522			if ( jQuery.isFunction( html ) ) {
9523				html = html.call( this[ 0 ] );
9524			}
9525
9526			// The elements to wrap the target around
9527			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9528
9529			if ( this[ 0 ].parentNode ) {
9530				wrap.insertBefore( this[ 0 ] );
9531			}
9532
9533			wrap.map( function() {
9534				var elem = this;
9535
9536				while ( elem.firstElementChild ) {
9537					elem = elem.firstElementChild;
9538				}
9539
9540				return elem;
9541			} ).append( this );
9542		}
9543
9544		return this;
9545	},
9546
9547	wrapInner: function( html ) {
9548		if ( jQuery.isFunction( html ) ) {
9549			return this.each( function( i ) {
9550				jQuery( this ).wrapInner( html.call( this, i ) );
9551			} );
9552		}
9553
9554		return this.each( function() {
9555			var self = jQuery( this ),
9556				contents = self.contents();
9557
9558			if ( contents.length ) {
9559				contents.wrapAll( html );
9560
9561			} else {
9562				self.append( html );
9563			}
9564		} );
9565	},
9566
9567	wrap: function( html ) {
9568		var isFunction = jQuery.isFunction( html );
9569
9570		return this.each( function( i ) {
9571			jQuery( this ).wrapAll( i
vendor: 2,399 bytes, lines 9571-9663
9571sFunction ? html.call( this, i ) : html );
9572		} );
9573	},
9574
9575	unwrap: function( selector ) {
9576		this.parent( selector ).not( "body" ).each( function() {
9577			jQuery( this ).replaceWith( this.childNodes );
9578		} );
9579		return this;
9580	}
9581} );
9582
9583
9584jQuery.expr.pseudos.hidden = function( elem ) {
9585	return !jQuery.expr.pseudos.visible( elem );
9586};
9587jQuery.expr.pseudos.visible = function( elem ) {
9588	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9589};
9590
9591
9592
9593
9594jQuery.ajaxSettings.xhr = function() {
9595	try {
9596		return new window.XMLHttpRequest();
9597	} catch ( e ) {}
9598};
9599
9600var xhrSuccessStatus = {
9601
9602		// File protocol always yields status code 0, assume 200
9603		0: 200,
9604
9605		// Support: IE <=9 only
9606		// #1450: sometimes IE returns 1223 when it should be 204
9607		1223: 204
9608	},
9609	xhrSupported = jQuery.ajaxSettings.xhr();
9610
9611support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9612support.ajax = xhrSupported = !!xhrSupported;
9613
9614jQuery.ajaxTransport( function( options ) {
9615	var callback, errorCallback;
9616
9617	// Cross domain only allowed if supported through XMLHttpRequest
9618	if ( support.cors || xhrSupported && !options.crossDomain ) {
9619		return {
9620			send: function( headers, complete ) {
9621				var i,
9622					xhr = options.xhr();
9623
9624				xhr.open(
9625					options.type,
9626					options.url,
9627					options.async,
9628					options.username,
9629					options.password
9630				);
9631
9632				// Apply custom fields if provided
9633				if ( options.xhrFields ) {
9634					for ( i in options.xhrFields ) {
9635						xhr[ i ] = options.xhrFields[ i ];
9636					}
9637				}
9638
9639				// Override mime type if needed
9640				if ( options.mimeType && xhr.overrideMimeType ) {
9641					xhr.overrideMimeType( options.mimeType );
9642				}
9643
9644				// X-Requested-With header
9645				// For cross-domain requests, seeing as conditions for a preflight are
9646				// akin to a jigsaw puzzle, we simply never set it to be sure.
9647				// (it can always be set on a per-request basis or even using ajaxSetup)
9648				// For same-domain requests, won't change header if already provided.
9649				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9650					headers[ "X-Requested-With" ] = "XMLHttpRequest";
9651				}
9652
9653				// Set headers
9654				for ( i in headers ) {
9655					xhr.setRequestHeader( i, headers[ i ] );
9656				}
9657
9658				// Callback
9659				callback = function( type ) {
9660					return function() {
9661						if ( callback ) {
9662							callback = errorCallback = xhr.onload =
9663								xhr.onerror = xhr.onabort = xhr.on
vendor: 5,102 bytes, lines 9663-9868
9663readystatechange = null;
9664
9665							if ( type === "abort" ) {
9666								xhr.abort();
9667							} else if ( type === "error" ) {
9668
9669								// Support: IE <=9 only
9670								// On a manual native abort, IE9 throws
9671								// errors on any property access that is not readyState
9672								if ( typeof xhr.status !== "number" ) {
9673									complete( 0, "error" );
9674								} else {
9675									complete(
9676
9677										// File: protocol always yields status 0; see #8605, #14207
9678										xhr.status,
9679										xhr.statusText
9680									);
9681								}
9682							} else {
9683								complete(
9684									xhrSuccessStatus[ xhr.status ] || xhr.status,
9685									xhr.statusText,
9686
9687									// Support: IE <=9 only
9688									// IE9 has no XHR2 but throws on binary (trac-11426)
9689									// For XHR2 non-text, let the caller handle it (gh-2498)
9690									( xhr.responseType || "text" ) !== "text"  ||
9691									typeof xhr.responseText !== "string" ?
9692										{ binary: xhr.response } :
9693										{ text: xhr.responseText },
9694									xhr.getAllResponseHeaders()
9695								);
9696							}
9697						}
9698					};
9699				};
9700
9701				// Listen to events
9702				xhr.onload = callback();
9703				errorCallback = xhr.onerror = callback( "error" );
9704
9705				// Support: IE 9 only
9706				// Use onreadystatechange to replace onabort
9707				// to handle uncaught aborts
9708				if ( xhr.onabort !== undefined ) {
9709					xhr.onabort = errorCallback;
9710				} else {
9711					xhr.onreadystatechange = function() {
9712
9713						// Check readyState before timeout as it changes
9714						if ( xhr.readyState === 4 ) {
9715
9716							// Allow onerror to be called first,
9717							// but that will not handle a native abort
9718							// Also, save errorCallback to a variable
9719							// as xhr.onerror cannot be accessed
9720							window.setTimeout( function() {
9721								if ( callback ) {
9722									errorCallback();
9723								}
9724							} );
9725						}
9726					};
9727				}
9728
9729				// Create the abort callback
9730				callback = callback( "abort" );
9731
9732				try {
9733
9734					// Do send the request (this may raise an exception)
9735					xhr.send( options.hasContent && options.data || null );
9736				} catch ( e ) {
9737
9738					// #14683: Only rethrow if this hasn't been notified as an error yet
9739					if ( callback ) {
9740						throw e;
9741					}
9742				}
9743			},
9744
9745			abort: function() {
9746				if ( callback ) {
9747					callback();
9748				}
9749			}
9750		};
9751	}
9752} );
9753
9754
9755
9756
9757// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9758jQuery.ajaxPrefilter( function( s ) {
9759	if ( s.crossDomain ) {
9760		s.contents.script = false;
9761	}
9762} );
9763
9764// Install script dataType
9765jQuery.ajaxSetup( {
9766	accepts: {
9767		script: "text/javascript, application/javascript, " +
9768			"application/ecmascript, application/x-ecmascript"
9769	},
9770	contents: {
9771		script: /\b(?:java|ecma)script\b/
9772	},
9773	converters: {
9774		"text script": function( text ) {
9775			jQuery.globalEval( text );
9776			return text;
9777		}
9778	}
9779} );
9780
9781// Handle cache's special case and crossDomain
9782jQuery.ajaxPrefilter( "script", function( s ) {
9783	if ( s.cache === undefined ) {
9784		s.cache = false;
9785	}
9786	if ( s.crossDomain ) {
9787		s.type = "GET";
9788	}
9789} );
9790
9791// Bind script tag hack transport
9792jQuery.ajaxTransport( "script", function( s ) {
9793
9794	// This transport only deals with cross domain requests
9795	if ( s.crossDomain ) {
9796		var script, callback;
9797		return {
9798			send: function( _, complete ) {
9799				script = jQuery( "<script>" ).prop( {
9800					charset: s.scriptCharset,
9801					src: s.url
9802				} ).on(
9803					"load error",
9804					callback = function( evt ) {
9805						script.remove();
9806						callback = null;
9807						if ( evt ) {
9808							complete( evt.type === "error" ? 404 : 200, evt.type );
9809						}
9810					}
9811				);
9812
9813				// Use native DOM manipulation to avoid our domManip AJAX trickery
9814				document.head.appendChild( script[ 0 ] );
9815			},
9816			abort: function() {
9817				if ( callback ) {
9818					callback();
9819				}
9820			}
9821		};
9822	}
9823} );
9824
9825
9826
9827
9828var oldCallbacks = [],
9829	rjsonp = /(=)\?(?=&|$)|\?\?/;
9830
9831// Default jsonp settings
9832jQuery.ajaxSetup( {
9833	jsonp: "callback",
9834	jsonpCallback: function() {
9835		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9836		this[ callback ] = true;
9837		return callback;
9838	}
9839} );
9840
9841// Detect, normalize options and install callbacks for jsonp requests
9842jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9843
9844	var callbackName, overwritten, responseContainer,
9845		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9846			"url" :
9847			typeof s.data === "string" &&
9848				( s.contentType || "" )
9849					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9850				rjsonp.test( s.data ) && "data"
9851		);
9852
9853	// Handle iff the expected data type is "jsonp" or we have a parameter to set
9854	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9855
9856		// Get callback name, remembering preexisting value associated with it
9857		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9858			s.jsonpCallback() :
9859			s.jsonpCallback;
9860
9861		// Insert callback into url or form data
9862		if ( jsonProp ) {
9863			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9864		} else if ( s.jsonp !== false ) {
9865			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9866		}
9867
9868		// Use data converter to retrieve json after script execution
vendor: 2,994 bytes, lines 9869-9978
9869		s.converters[ "script json" ] = function() {
9870			if ( !responseContainer ) {
9871				jQuery.error( callbackName + " was not called" );
9872			}
9873			return responseContainer[ 0 ];
9874		};
9875
9876		// Force json dataType
9877		s.dataTypes[ 0 ] = "json";
9878
9879		// Install callback
9880		overwritten = window[ callbackName ];
9881		window[ callbackName ] = function() {
9882			responseContainer = arguments;
9883		};
9884
9885		// Clean-up function (fires after converters)
9886		jqXHR.always( function() {
9887
9888			// If previous value didn't exist - remove it
9889			if ( overwritten === undefined ) {
9890				jQuery( window ).removeProp( callbackName );
9891
9892			// Otherwise restore preexisting value
9893			} else {
9894				window[ callbackName ] = overwritten;
9895			}
9896
9897			// Save back as free
9898			if ( s[ callbackName ] ) {
9899
9900				// Make sure that re-using the options doesn't screw things around
9901				s.jsonpCallback = originalSettings.jsonpCallback;
9902
9903				// Save the callback name for future use
9904				oldCallbacks.push( callbackName );
9905			}
9906
9907			// Call if it was a function and we have a response
9908			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9909				overwritten( responseContainer[ 0 ] );
9910			}
9911
9912			responseContainer = overwritten = undefined;
9913		} );
9914
9915		// Delegate to script
9916		return "script";
9917	}
9918} );
9919
9920
9921
9922
9923// Support: Safari 8 only
9924// In Safari 8 documents created via document.implementation.createHTMLDocument
9925// collapse sibling forms: the second one becomes a child of the first one.
9926// Because of that, this security measure has to be disabled in Safari 8.
9927// https://bugs.webkit.org/show_bug.cgi?id=137337
9928support.createHTMLDocument = ( function() {
9929	var body = document.implementation.createHTMLDocument( "" ).body;
9930	body.innerHTML = "<form></form><form></form>";
9931	return body.childNodes.length === 2;
9932} )();
9933
9934
9935// Argument "data" should be string of html
9936// context (optional): If specified, the fragment will be created in this context,
9937// defaults to document
9938// keepScripts (optional): If true, will include scripts passed in the html string
9939jQuery.parseHTML = function( data, context, keepScripts ) {
9940	if ( typeof data !== "string" ) {
9941		return [];
9942	}
9943	if ( typeof context === "boolean" ) {
9944		keepScripts = context;
9945		context = false;
9946	}
9947
9948	var base, parsed, scripts;
9949
9950	if ( !context ) {
9951
9952		// Stop scripts or inline event handlers from being executed immediately
9953		// by using document.implementation
9954		if ( support.createHTMLDocument ) {
9955			context = document.implementation.createHTMLDocument( "" );
9956
9957			// Set the base href for the created document
9958			// so any parsed elements with URLs
9959			// are based on the document's URL (gh-2965)
9960			base = context.createElement( "base" );
9961			base.href = document.location.href;
9962			context.head.appendChild( base );
9963		} else {
9964			context = document;
9965		}
9966	}
9967
9968	parsed = rsingleTag.exec( data );
9969	scripts = !keepScripts && [];
9970
9971	// Single tag
9972	if ( parsed ) {
9973		return [ context.createElement( parsed[ 1 ] ) ];
9974	}
9975
9976	parsed = buildFragment( [ data ], context, scripts );
9977
9978	if ( scripts && scripts.length ) {
vendor: 4,095 bytes, lines 9979-10149
9979		jQuery( scripts ).remove();
9980	}
9981
9982	return jQuery.merge( [], parsed.childNodes );
9983};
9984
9985
9986/**
9987 * Load a url into a page
9988 */
9989jQuery.fn.load = function( url, params, callback ) {
9990	var selector, type, response,
9991		self = this,
9992		off = url.indexOf( " " );
9993
9994	if ( off > -1 ) {
9995		selector = stripAndCollapse( url.slice( off ) );
9996		url = url.slice( 0, off );
9997	}
9998
9999	// If it's a function
10000	if ( jQuery.isFunction( params ) ) {
10001
10002		// We assume that it's the callback
10003		callback = params;
10004		params = undefined;
10005
10006	// Otherwise, build a param string
10007	} else if ( params && typeof params === "object" ) {
10008		type = "POST";
10009	}
10010
10011	// If we have elements to modify, make the request
10012	if ( self.length > 0 ) {
10013		jQuery.ajax( {
10014			url: url,
10015
10016			// If "type" variable is undefined, then "GET" method will be used.
10017			// Make value of this field explicit since
10018			// user can override it through ajaxSetup method
10019			type: type || "GET",
10020			dataType: "html",
10021			data: params
10022		} ).done( function( responseText ) {
10023
10024			// Save response for use in complete callback
10025			response = arguments;
10026
10027			self.html( selector ?
10028
10029				// If a selector was specified, locate the right elements in a dummy div
10030				// Exclude scripts to avoid IE 'Permission Denied' errors
10031				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
10032
10033				// Otherwise use the full result
10034				responseText );
10035
10036		// If the request succeeds, this function gets "data", "status", "jqXHR"
10037		// but they are ignored because response was set above.
10038		// If it fails, this function gets "jqXHR", "status", "error"
10039		} ).always( callback && function( jqXHR, status ) {
10040			self.each( function() {
10041				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
10042			} );
10043		} );
10044	}
10045
10046	return this;
10047};
10048
10049
10050
10051
10052// Attach a bunch of functions for handling common AJAX events
10053jQuery.each( [
10054	"ajaxStart",
10055	"ajaxStop",
10056	"ajaxComplete",
10057	"ajaxError",
10058	"ajaxSuccess",
10059	"ajaxSend"
10060], function( i, type ) {
10061	jQuery.fn[ type ] = function( fn ) {
10062		return this.on( type, fn );
10063	};
10064} );
10065
10066
10067
10068
10069jQuery.expr.pseudos.animated = function( elem ) {
10070	return jQuery.grep( jQuery.timers, function( fn ) {
10071		return elem === fn.elem;
10072	} ).length;
10073};
10074
10075
10076
10077
10078jQuery.offset = {
10079	setOffset: function( elem, options, i ) {
10080		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10081			position = jQuery.css( elem, "position" ),
10082			curElem = jQuery( elem ),
10083			props = {};
10084
10085		// Set position first, in-case top/left are set even on static elem
10086		if ( position === "static" ) {
10087			elem.style.position = "relative";
10088		}
10089
10090		curOffset = curElem.offset();
10091		curCSSTop = jQuery.css( elem, "top" );
10092		curCSSLeft = jQuery.css( elem, "left" );
10093		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10094			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
10095
10096		// Need to be able to calculate position if either
10097		// top or left is auto and position is either absolute or fixed
10098		if ( calculatePosition ) {
10099			curPosition = curElem.position();
10100			curTop = curPosition.top;
10101			curLeft = curPosition.left;
10102
10103		} else {
10104			curTop = parseFloat( curCSSTop ) || 0;
10105			curLeft = parseFloat( curCSSLeft ) || 0;
10106		}
10107
10108		if ( jQuery.isFunction( options ) ) {
10109
10110			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
10111			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
10112		}
10113
10114		if ( options.top != null ) {
10115			props.top = ( options.top - curOffset.top ) + curTop;
10116		}
10117		if ( options.left != null ) {
10118			props.left = ( options.left - curOffset.left ) + curLeft;
10119		}
10120
10121		if ( "using" in options ) {
10122			options.using.call( elem, props );
10123
10124		} else {
10125			curElem.css( props );
10126		}
10127	}
10128};
10129
10130jQuery.fn.extend( {
10131	offset: function( options ) {
10132
10133		// Preserve chaining for setter
10134		if ( arguments.length ) {
10135			return options === undefined ?
10136				this :
10137				this.each( function( i ) {
10138					jQuery.offset.setOffset( this, options, i );
10139				} );
10140		}
10141
10142		var doc, docElem, rect, win,
10143			elem = this[ 0 ];
10144
10145		if ( !elem ) {
10146			return;
10147		}
10148
10149		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
vendor: 4,119 bytes, lines 10150-10288
10150		// Support: IE <=11 only
10151		// Running getBoundingClientRect on a
10152		// disconnected node in IE throws an error
10153		if ( !elem.getClientRects().length ) {
10154			return { top: 0, left: 0 };
10155		}
10156
10157		rect = elem.getBoundingClientRect();
10158
10159		doc = elem.ownerDocument;
10160		docElem = doc.documentElement;
10161		win = doc.defaultView;
10162
10163		return {
10164			top: rect.top + win.pageYOffset - docElem.clientTop,
10165			left: rect.left + win.pageXOffset - docElem.clientLeft
10166		};
10167	},
10168
10169	position: function() {
10170		if ( !this[ 0 ] ) {
10171			return;
10172		}
10173
10174		var offsetParent, offset,
10175			elem = this[ 0 ],
10176			parentOffset = { top: 0, left: 0 };
10177
10178		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10179		// because it is its only offset parent
10180		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10181
10182			// Assume getBoundingClientRect is there when computed position is fixed
10183			offset = elem.getBoundingClientRect();
10184
10185		} else {
10186
10187			// Get *real* offsetParent
10188			offsetParent = this.offsetParent();
10189
10190			// Get correct offsets
10191			offset = this.offset();
10192			if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10193				parentOffset = offsetParent.offset();
10194			}
10195
10196			// Add offsetParent borders
10197			parentOffset = {
10198				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
10199				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
10200			};
10201		}
10202
10203		// Subtract parent offsets and element margins
10204		return {
10205			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10206			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10207		};
10208	},
10209
10210	// This method will return documentElement in the following cases:
10211	// 1) For the element inside the iframe without offsetParent, this method will return
10212	//    documentElement of the parent window
10213	// 2) For the hidden or detached element
10214	// 3) For body or html element, i.e. in case of the html node - it will return itself
10215	//
10216	// but those exceptions were never presented as a real life use-cases
10217	// and might be considered as more preferable results.
10218	//
10219	// This logic, however, is not guaranteed and can change at any point in the future
10220	offsetParent: function() {
10221		return this.map( function() {
10222			var offsetParent = this.offsetParent;
10223
10224			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10225				offsetParent = offsetParent.offsetParent;
10226			}
10227
10228			return offsetParent || documentElement;
10229		} );
10230	}
10231} );
10232
10233// Create scrollLeft and scrollTop methods
10234jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10235	var top = "pageYOffset" === prop;
10236
10237	jQuery.fn[ method ] = function( val ) {
10238		return access( this, function( elem, method, val ) {
10239
10240			// Coalesce documents and windows
10241			var win;
10242			if ( jQuery.isWindow( elem ) ) {
10243				win = elem;
10244			} else if ( elem.nodeType === 9 ) {
10245				win = elem.defaultView;
10246			}
10247
10248			if ( val === undefined ) {
10249				return win ? win[ prop ] : elem[ method ];
10250			}
10251
10252			if ( win ) {
10253				win.scrollTo(
10254					!top ? val : win.pageXOffset,
10255					top ? val : win.pageYOffset
10256				);
10257
10258			} else {
10259				elem[ method ] = val;
10260			}
10261		}, method, val, arguments.length );
10262	};
10263} );
10264
10265// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10266// Add the top/left cssHooks using jQuery.fn.position
10267// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10268// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10269// getComputedStyle returns percent when specified for top/left/bottom/right;
10270// rather than make the css module depend on the offset module, just check for it here
10271jQuery.each( [ "top", "left" ], function( i, prop ) {
10272	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10273		function( elem, computed ) {
10274			if ( computed ) {
10275				computed = curCSS( elem, prop );
10276
10277				// If curCSS returns percentage, fallback to offset
10278				return rnumnonpx.test( computed ) ?
10279					jQuery( elem ).position()[ prop ] + "px" :
10280					computed;
10281			}
10282		}
10283	);
10284} );
10285
10286
10287// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10288jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10289	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10290		function( defaultExtra, funcName ) {
10291
10292		// Margin is only for outerHeight, outerWidth
10293		jQuery.fn[ funcName ] = function( margin, value ) {
10294			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10295				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10296
10297			return access( this, function( elem, type, value ) {
10298				var doc;
10299
10300				if ( jQuery.isWindow( elem ) ) {
10301
10302					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10303					return funcName.indexOf( "outer" ) === 0 ?
10304						elem[ "inner" + name ] :
10305						elem.document.documentElement[ "client" + name ];
10306				}
10307
10308				// Get document width or height
10309				if ( elem.nodeType === 9 ) {
10310					doc = elem.documentElement;
10311
10312					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10313					// whichever is greatest
10314					return Math.max(
10315						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10316						elem.body[ "offset" + name ], doc[ "offset" + name ],
10317						doc[ "client" + name ]
10318					);
10319				}
10320
10321				return value === undefined ?
10322
10323					// Get width or height on the element, requesting but not forcing parseFloat
10324					jQuery.css( elem, type, extra ) :
10325
10326					// Set width or height on the element
10327					jQuery.style( elem, type, value, extra );
10328			}, type, chainable ? margin : undefined, chainable );
10329		};
10330	} );
10331} );
10332
10333
10334jQuery.fn.extend( {
10335
10336	bind: function( types, data, fn ) {
10337		return this.on( types, null, data, fn );
10338	},
10339	unbind: function( types, fn ) {
10340		return this.off( types, null, fn );
10341	},
10342
10343	delegate: function( selector, types, data, fn ) {
10344		return this.on( types, selector, data, fn );
10345	},
10346	undelegate: function( selector, types, fn ) {
10347
10348		// ( namespace ) or ( selector, types [, fn] )
10349		return arguments.length === 1 ?
10350			this.off( selector, "**" ) :
10351			this.off( types, selector || "**", fn );
10352	}
10353} );
10354
10355jQuery.holdReady = function( hold ) {
10356	if ( hold ) {
10357		jQuery.readyWait++;
10358	} else {
10359		jQuery.ready( true );
10360	}
10361};
10362jQuery.isArray = Array.isArray;
10363jQuery.parseJSON = JSON.parse;
10364jQuery.nodeName = nodeName;
10365
10366
10367
10368
10369// Register as a named AMD module, since jQuery can be concatenated with other
10370// files that may use define, but not via a proper concatenation script that
10371// understands anonymous AMD modules. A named AMD is safest and most robust
10372// way to register. Lowercase jquery is used because AMD module names are
10373// derived from file names, and jQuery is normally delivered in a lowercase
10374// file name. Do this after creating the global so that if an AMD module wants
10375// to call noConflict to hide this version of jQuery, it will work.
10376
10377// Note that for maximum portability, libraries that are not jQuery should
10378// declare themselves as anonymous modules, and avoid setting a global if an
10379// AMD loader is present. jQuery is a special case. For more information, see
10380// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10381
10382if ( true ) {
10383	!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function() {
10384		return jQuery;
10385	}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
10386				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
10387}
10388
10389
10390
10391
10392var
10393
10394	// Map over jQuery in case of overwrite
10395	_jQuery = window.jQuery,
10396
10397	// Map over the $ in case of overwrite
10398	_$ = window.$;
10399
10400jQuery.noConflict = function( deep ) {
10401	if ( window.$ === jQuery ) {
10402		window.$ = _$;
10403	}
10404
10405	if ( deep && window.jQuery === jQuery ) {
10406		window.jQuery = _jQuery;
10407	}
10408
10409	return jQuery;
10410};
10411
10412// Expose jQuery and $ identifiers, even in AMD
10413// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10414// and CommonJS for browser emulators (#13566)
10415if ( !noGlobal ) {
10416	window.jQuery = window.$ = jQuery;
10417}
10418
10419
10420
10421
10422return jQuery;
10423} );
10424
10425
10426/***/ }),
10427/* 4 */
10428/***/ (function(module, exports, __webpack_require__) {
10429
10430/*!
10431  * Bootstrap v4.1.3 (https://getbootstrap.com/)
10432  * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
10433  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10434  */
10435(function (global, factory) {
10436   true ? factory(exports, __webpack_require__(0), __webpack_require__(5)) :
10437  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :
10438  (factory((global.bootstrap = {}),global.jQuery,global.Popper));
10439}(this, (function (exports,$,Popper) { 'use strict';
10440
10441  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
10442  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;
10443
10444  function _defineProperties(target, props) {
10445    for (var i = 0; i < props.length; i++) {
10446      var descriptor = props[i];
10447      descriptor.enumerable = descriptor.enumerable || false;
10448      descriptor.configurable = true;
10449      if ("value" in descriptor) descriptor.writable = true;
10450      Object.defineProperty(target, descriptor.key, descriptor);
10451    }
10452  }
10453
10454  function _createClass(Constructor, protoProps, staticProps) {
10455    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
10456    if (staticProps) _defineProperties(Constructor, staticProps);
10457    return Constructor;
10458  }
10459
10460  function _defineProperty(obj, key, value) {
10461    if (key in obj) {
10462      Object.defineProperty(obj, key, {
10463        value: value,
10464        enumerable: true,
10465        configurable: true,
10466        writable: true
10467      });
10468    } else {
10469      obj[key] = value;
10470    }
10471
10472    return obj;
10473  }
10474
10475  function _objectSpread(target) {
10476    for (var i = 1; i < arguments.length; i++) {
10477      var source = arguments[i] != null ? arguments[i] : {};
10478      var ownKeys = Object.keys(source);
10479
10480      if (typeof Object.getOwnPropertySymbols === 'function') {
10481        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
10482          return Object.getOwnPropertyDescriptor(source, sym).enumerable;
10483        }));
10484      }
10485
10486      ownKeys.forEach(function (key) {
10487        _defineProperty(target, key, source[key]);
10488      });
10489    }
10490
10491    return target;
10492  }
10493
10494  function _inheritsLoose(subClass, superClass) {
10495    subClass.prototype = Object.create(superClass.prototype);
10496    subClass.prototype.constructor = subClass;
10497    subClass.__proto__ = superClass;
10498  }
10499
10500  /**
10501   * --------------------------------------------------------------------------
10502   * Bootstrap (v4.1.3): util.js
10503   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10504   * --------------------------------------------------------------------------
10505   */
10506
10507  var Util = function ($$$1) {
10508    /**
10509     * ------------------------------------------------------------------------
10510     * Private TransitionEnd Helpers
10511     * ------------------------------------------------------------------------
10512     */
10513    var TRANSITION_END = 'transitionend';
10514    var MAX_UID = 1000000;
10515    var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)
10516
10517    function toType(obj) {
10518      return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase();
10519    }
10520
10521    function getSpecialTransitionEndEvent() {
10522      return {
10523        bindType: TRANSITION_END,
10524        delegateType: TRANSITION_END,
10525        handle: function handle(event) {
10526          if ($$$1(event.target).is(this)) {
10527            return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params
10528          }
10529
10530          return undefined; // eslint-disable-line no-undefined
10531        }
10532      };
10533    }
10534
10535    function transitionEndEmulator(duration) {
10536      var _this = this;
10537
10538      var called = false;
10539      $$$1(this).one(Util.TRANSITION_END, function () {
10540        called = true;
10541      });
10542      setTimeout(function () {
10543        if (!called) {
10544          Util.triggerTransitionEnd(_this);
10545        }
10546      }, duration);
10547      return this;
10548    }
10549
10550    function setTransitionEndSupport() {
10551      $$$1.fn.emulateTransitionEnd = transitionEndEmulator;
10552      $$$1.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();
10553    }
10554    /**
10555     * --------------------------------------------------------------------------
10556     * Public Util Api
10557     * --------------------------------------------------------------------------
10558     */
10559
10560
10561    var Util = {
10562      TRANSITION_END: 'bsTransitionEnd',
10563      getUID: function getUID(prefix) {
10564        do {
10565          // eslint-disable-next-line no-bitwise
10566          prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here
10567        } while (document.getElementById(prefix));
10568
10569        return prefix;
10570      },
10571      getSelectorFromElement: function getSelectorFromElement(element) {
10572        var selector = element.getAttribute('data-target');
10573
10574        if (!selector || selector === '#') {
10575          selector = element.getAttribute('href') || '';
10576        }
10577
10578        try {
10579          return document.querySelector(selector) ? selector : null;
10580        } catch (err) {
10581          return null;
10582        }
10583      },
10584      getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {
10585        if (!element) {
10586          return 0;
10587        } // Get transition-duration of the element
10588
10589
10590        var transitionDuration = $$$1(element).css('transition-duration');
10591        var floatTransitionDuration = parseFloat(transitionDuration); // Return 0 if element or transition duration is not found
10592
10593        if (!floatTransitionDuration) {
10594          return 0;
10595        } // If multiple durations are defined, take the first
10596
10597
10598        transitionDuration = transitionDuration.split(',')[0];
10599        return parseFloat(transitionDuration) * MILLISECONDS_MULTIPLIER;
10600      },
10601      reflow: function reflow(element) {
10602        return element.offsetHeight;
10603      },
10604      triggerTransitionEnd: function triggerTransitionEnd(element) {
10605        $$$1(element).trigger(TRANSITION_END);
10606      },
10607      // TODO: Remove in v5
10608      supportsTransitionEnd: function supportsTransitionEnd() {
10609        return Boolean(TRANSITION_END);
10610      },
10611      isElement: function isElement(obj) {
10612        return (obj[0] || obj).nodeType;
10613      },
10614      typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {
10615        for (var property in configTypes) {
10616          if (Object.prototype.hasOwnProperty.call(configTypes, property)) {
10617            var expectedTypes = configTypes[property];
10618            var value = config[property];
10619            var valueType = value && Util.isElement(value) ? 'element' : toType(value);
10620
10621            if (!new RegExp(expectedTypes).test(valueType)) {
10622              throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\"."));
10623            }
10624          }
10625        }
10626      }
10627    };
10628    setTransitionEndSupport();
10629    return Util;
10630  }($);
10631
10632  /**
10633   * --------------------------------------------------------------------------
10634   * Bootstrap (v4.1.3): alert.js
10635   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10636   * --------------------------------------------------------------------------
10637   */
10638
10639  var Alert = function ($$$1) {
10640    /**
10641     * ------------------------------------------------------------------------
10642     * Constants
10643     * ------------------------------------------------------------------------
10644     */
10645    var NAME = 'alert';
10646    var VERSION = '4.1.3';
10647    var DATA_KEY = 'bs.alert';
10648    var EVENT_KEY = "." + DATA_KEY;
10649    var DATA_API_KEY = '.data-api';
10650    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
10651    var Selector = {
10652      DISMISS: '[data-dismiss="alert"]'
10653    };
10654    var Event = {
10655      CLOSE: "close" + EVENT_KEY,
10656      CLOSED: "closed" + EVENT_KEY,
10657      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
10658    };
10659    var ClassName = {
10660      ALERT: 'alert',
10661      FADE: 'fade',
10662      SHOW: 'show'
10663      /**
10664       * ------------------------------------------------------------------------
10665       * Class Definition
10666       * ------------------------------------------------------------------------
10667       */
10668
10669    };
10670
10671    var Alert =
10672    /*#__PURE__*/
10673    function () {
10674      function Alert(element) {
10675        this._element = element;
10676      } // Getters
10677
10678
10679      var _proto = Alert.prototype;
10680
10681      // Public
10682      _proto.close = function close(element) {
10683        var rootElement = this._element;
10684
10685        if (element) {
10686          rootElement = this._getRootElement(element);
10687        }
10688
10689        var customEvent = this._triggerCloseEvent(rootElement);
10690
10691        if (customEvent.isDefaultPrevented()) {
10692          return;
10693        }
10694
10695        this._removeElement(rootElement);
10696      };
10697
10698      _proto.dispose = function dispose() {
10699        $$$1.removeData(this._element, DATA_KEY);
10700        this._element = null;
10701      }; // Private
10702
10703
10704      _proto._getRootElement = function _getRootElement(element) {
10705        var selector = Util.getSelectorFromElement(element);
10706        var parent = false;
10707
10708        if (selector) {
10709          parent = document.querySelector(selector);
10710        }
10711
10712        if (!parent) {
10713          parent = $$$1(element).closest("." + ClassName.ALERT)[0];
10714        }
10715
10716        return parent;
10717      };
10718
10719      _proto._triggerCloseEvent = function _triggerCloseEvent(element) {
10720        var closeEvent = $$$1.Event(Event.CLOSE);
10721        $$$1(element).trigger(closeEvent);
10722        return closeEvent;
10723      };
10724
10725      _proto._removeElement = function _removeElement(element) {
10726        var _this = this;
10727
10728        $$$1(element).removeClass(ClassName.SHOW);
10729
10730        if (!$$$1(element).hasClass(ClassName.FADE)) {
10731          this._destroyElement(element);
10732
10733          return;
10734        }
10735
10736        var transitionDuration = Util.getTransitionDurationFromElement(element);
10737        $$$1(element).one(Util.TRANSITION_END, function (event) {
10738          return _this._destroyElement(element, event);
10739        }).emulateTransitionEnd(transitionDuration);
10740      };
10741
10742      _proto._destroyElement = function _destroyElement(element) {
10743        $$$1(element).detach().trigger(Event.CLOSED).remove();
10744      }; // Static
10745
10746
10747      Alert._jQueryInterface = function _jQueryInterface(config) {
10748        return this.each(function () {
10749          var $element = $$$1(this);
10750          var data = $element.data(DATA_KEY);
10751
10752          if (!data) {
10753            data = new Alert(this);
10754            $element.data(DATA_KEY, data);
10755          }
10756
10757          if (config === 'close') {
10758            data[config](this);
10759          }
10760        });
10761      };
10762
10763      Alert._handleDismiss = function _handleDismiss(alertInstance) {
10764        return function (event) {
10765          if (event) {
10766            event.preventDefault();
10767          }
10768
10769          alertInstance.close(this);
10770        };
10771      };
10772
10773      _createClass(Alert, null, [{
10774        key: "VERSION",
10775        get: function get() {
10776          return VERSION;
10777        }
10778      }]);
10779
10780      return Alert;
10781    }();
10782    /**
10783     * ------------------------------------------------------------------------
10784     * Data Api implementation
10785     * ------------------------------------------------------------------------
10786     */
10787
10788
10789    $$$1(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
10790    /**
10791     * ------------------------------------------------------------------------
10792     * jQuery
10793     * ------------------------------------------------------------------------
10794     */
10795
10796    $$$1.fn[NAME] = Alert._jQueryInterface;
10797    $$$1.fn[NAME].Constructor = Alert;
10798
10799    $$$1.fn[NAME].noConflict = function () {
10800      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
10801      return Alert._jQueryInterface;
10802    };
10803
10804    return Alert;
10805  }($);
10806
10807  /**
10808   * --------------------------------------------------------------------------
10809   * Bootstrap (v4.1.3): button.js
10810   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10811   * --------------------------------------------------------------------------
10812   */
10813
10814  var Button = function ($$$1) {
10815    /**
10816     * ------------------------------------------------------------------------
10817     * Constants
10818     * ------------------------------------------------------------------------
10819     */
10820    var NAME = 'button';
10821    var VERSION = '4.1.3';
10822    var DATA_KEY = 'bs.button';
10823    var EVENT_KEY = "." + DATA_KEY;
10824    var DATA_API_KEY = '.data-api';
10825    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
10826    var ClassName = {
10827      ACTIVE: 'active',
10828      BUTTON: 'btn',
10829      FOCUS: 'focus'
10830    };
10831    var Selector = {
10832      DATA_TOGGLE_CARROT: '[data-toggle^="button"]',
10833      DATA_TOGGLE: '[data-toggle="buttons"]',
10834      INPUT: 'input',
10835      ACTIVE: '.active',
10836      BUTTON: '.btn'
10837    };
10838    var Event = {
10839      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
10840      FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY)
10841      /**
10842       * ------------------------------------------------------------------------
10843       * Class Definition
10844       * ------------------------------------------------------------------------
10845       */
10846
10847    };
10848
10849    var Button =
10850    /*#__PURE__*/
10851    function () {
10852      function Button(element) {
10853        this._element = element;
10854      } // Getters
10855
10856
10857      var _proto = Button.prototype;
10858
10859      // Public
vendor: 5,671 bytes, lines 10860-11041
10860      _proto.toggle = function toggle() {
10861        var triggerChangeEvent = true;
10862        var addAriaPressed = true;
10863        var rootElement = $$$1(this._element).closest(Selector.DATA_TOGGLE)[0];
10864
10865        if (rootElement) {
10866          var input = this._element.querySelector(Selector.INPUT);
10867
10868          if (input) {
10869            if (input.type === 'radio') {
10870              if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) {
10871                triggerChangeEvent = false;
10872              } else {
10873                var activeElement = rootElement.querySelector(Selector.ACTIVE);
10874
10875                if (activeElement) {
10876                  $$$1(activeElement).removeClass(ClassName.ACTIVE);
10877                }
10878              }
10879            }
10880
10881            if (triggerChangeEvent) {
10882              if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
10883                return;
10884              }
10885
10886              input.checked = !this._element.classList.contains(ClassName.ACTIVE);
10887              $$$1(input).trigger('change');
10888            }
10889
10890            input.focus();
10891            addAriaPressed = false;
10892          }
10893        }
10894
10895        if (addAriaPressed) {
10896          this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE));
10897        }
10898
10899        if (triggerChangeEvent) {
10900          $$$1(this._element).toggleClass(ClassName.ACTIVE);
10901        }
10902      };
10903
10904      _proto.dispose = function dispose() {
10905        $$$1.removeData(this._element, DATA_KEY);
10906        this._element = null;
10907      }; // Static
10908
10909
10910      Button._jQueryInterface = function _jQueryInterface(config) {
10911        return this.each(function () {
10912          var data = $$$1(this).data(DATA_KEY);
10913
10914          if (!data) {
10915            data = new Button(this);
10916            $$$1(this).data(DATA_KEY, data);
10917          }
10918
10919          if (config === 'toggle') {
10920            data[config]();
10921          }
10922        });
10923      };
10924
10925      _createClass(Button, null, [{
10926        key: "VERSION",
10927        get: function get() {
10928          return VERSION;
10929        }
10930      }]);
10931
10932      return Button;
10933    }();
10934    /**
10935     * ------------------------------------------------------------------------
10936     * Data Api implementation
10937     * ------------------------------------------------------------------------
10938     */
10939
10940
10941    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
10942      event.preventDefault();
10943      var button = event.target;
10944
10945      if (!$$$1(button).hasClass(ClassName.BUTTON)) {
10946        button = $$$1(button).closest(Selector.BUTTON);
10947      }
10948
10949      Button._jQueryInterface.call($$$1(button), 'toggle');
10950    }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
10951      var button = $$$1(event.target).closest(Selector.BUTTON)[0];
10952      $$$1(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
10953    });
10954    /**
10955     * ------------------------------------------------------------------------
10956     * jQuery
10957     * ------------------------------------------------------------------------
10958     */
10959
10960    $$$1.fn[NAME] = Button._jQueryInterface;
10961    $$$1.fn[NAME].Constructor = Button;
10962
10963    $$$1.fn[NAME].noConflict = function () {
10964      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
10965      return Button._jQueryInterface;
10966    };
10967
10968    return Button;
10969  }($);
10970
10971  /**
10972   * --------------------------------------------------------------------------
10973   * Bootstrap (v4.1.3): carousel.js
10974   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10975   * --------------------------------------------------------------------------
10976   */
10977
10978  var Carousel = function ($$$1) {
10979    /**
10980     * ------------------------------------------------------------------------
10981     * Constants
10982     * ------------------------------------------------------------------------
10983     */
10984    var NAME = 'carousel';
10985    var VERSION = '4.1.3';
10986    var DATA_KEY = 'bs.carousel';
10987    var EVENT_KEY = "." + DATA_KEY;
10988    var DATA_API_KEY = '.data-api';
10989    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
10990    var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key
10991
10992    var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key
10993
10994    var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch
10995
10996    var Default = {
10997      interval: 5000,
10998      keyboard: true,
10999      slide: false,
11000      pause: 'hover',
11001      wrap: true
11002    };
11003    var DefaultType = {
11004      interval: '(number|boolean)',
11005      keyboard: 'boolean',
11006      slide: '(boolean|string)',
11007      pause: '(string|boolean)',
11008      wrap: 'boolean'
11009    };
11010    var Direction = {
11011      NEXT: 'next',
11012      PREV: 'prev',
11013      LEFT: 'left',
11014      RIGHT: 'right'
11015    };
11016    var Event = {
11017      SLIDE: "slide" + EVENT_KEY,
11018      SLID: "slid" + EVENT_KEY,
11019      KEYDOWN: "keydown" + EVENT_KEY,
11020      MOUSEENTER: "mouseenter" + EVENT_KEY,
11021      MOUSELEAVE: "mouseleave" + EVENT_KEY,
11022      TOUCHEND: "touchend" + EVENT_KEY,
11023      LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY,
11024      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
11025    };
11026    var ClassName = {
11027      CAROUSEL: 'carousel',
11028      ACTIVE: 'active',
11029      SLIDE: 'slide',
11030      RIGHT: 'carousel-item-right',
11031      LEFT: 'carousel-item-left',
11032      NEXT: 'carousel-item-next',
11033      PREV: 'carousel-item-prev',
11034      ITEM: 'carousel-item'
11035    };
11036    var Selector = {
11037      ACTIVE: '.active',
11038      ACTIVE_ITEM: '.active.carousel-item',
11039      ITEM: '.carousel-item',
11040      NEXT_PREV: '.carousel-item-next, .carousel-item-prev',
11041      INDICATORS: '.carousel-indicators',
11042      DATA_SLIDE: '[data-slide], [data-slide-to]',
11043      DATA_RIDE: '[data-ride="carousel"]'
11044      /**
11045       * ------------------------------------------------------------------------
11046       * Class Definition
11047       * ------------------------------------------------------------------------
11048       */
11049
11050    };
11051
11052    var Carousel =
11053    /*#__PURE__*/
11054    function () {
11055      function Carousel(element, config) {
11056        this._items = null;
11057        this._interval = null;
11058        this._activeElement = null;
11059        this._isPaused = false;
11060        this._isSliding = false;
11061        this.touchTimeout = null;
11062        this._config = this._getConfig(config);
11063        this._element = $$$1(element)[0];
11064        this._indicatorsElement = this._element.querySelector(Selector.INDICATORS);
11065
11066        this._addEventListeners();
11067      } // Getters
11068
11069
11070      var _proto = Carousel.prototype;
11071
11072      // Public
11073      _proto.next = function next() {
11074        if (!this._isSliding) {
11075          this._slide(Direction.NEXT);
11076        }
11077      };
11078
11079      _proto.nextWhenVisible = function nextWhenVisible() {
11080        // Don't call next when the page isn't visible
11081        // or the carousel or its parent isn't visible
11082        if (!document.hidden && $$$1(this._element).is(':visible') && $$$1(this._element).css('visibility') !== 'hidden') {
11083          this.next();
11084        }
11085      };
11086
11087      _proto.prev = function prev() {
11088        if (!this._isSliding) {
11089          this._slide(Direction.PREV);
11090        }
11091      };
11092
11093      _proto.pause = function pause(event) {
11094        if (!event) {
11095          this._isPaused = true;
11096        }
11097
11098        if (this._element.querySelector(Selector.NEXT_PREV)) {
11099          Util.triggerTransitionEnd(this._element);
11100          this.cycle(true);
11101        }
11102
11103        clearInterval(this._interval);
11104        this._interval = null;
11105      };
11106
11107      _proto.cycle = function cycle(event) {
11108        if (!event) {
11109          this._isPaused = false;
11110        }
11111
11112        if (this._interval) {
11113          clearInterval(this._interval);
11114          this._interval = null;
11115        }
11116
11117        if (this._config.interval && !this._isPaused) {
11118          this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);
11119        }
11120      };
11121
11122      _proto.to = function to(index) {
11123        var _this = this;
11124
11125        this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
11126
11127        var activeIndex = this._getItemIndex(this._activeElement);
11128
11129        if (index > this._items.length - 1 || index < 0) {
11130          return;
11131        }
11132
11133        if (this._isSliding) {
11134          $$$1(this._element).one(Event.SLID, function () {
11135            return _this.to(index);
11136          });
11137          return;
11138        }
11139
11140        if (activeIndex === index) {
11141          this.pause();
11142          this.cycle();
11143          return;
11144        }
11145
11146        var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;
11147
11148        this._slide(direction, this._items[index]);
11149      };
11150
11151      _proto.dispose = function dispose() {
11152        $$$1(this._element).off(EVENT_KEY);
11153        $$$1.removeData(this._element, DATA_KEY);
11154        this._items = null;
11155        this._config = null;
11156        this._element = null;
11157        this._interval = null;
11158        this._isPaused = null;
11159        this._isSliding = null;
11160        this._activeElement = null;
11161        this._indicatorsElement = null;
11162      }; // Private
11163
11164
11165      _proto._getConfig = function _getConfig(config) {
11166        config = _objectSpread({}, Default, config);
11167        Util.typeCheckConfig(NAME, config, DefaultType);
11168        return config;
11169      };
11170
11171      _proto._addEventListeners = function _addEventListeners() {
11172        var _this2 = this;
11173
11174        if (this._config.keyboard) {
11175          $$$1(this._element).on(Event.KEYDOWN, function (event) {
11176            return _this2._keydown(event);
11177          });
11178        }
11179
11180        if (this._config.pause === 'hover') {
11181          $$$1(this._element).on(Event.MOUSEENTER, function (event) {
11182            return _this2.pause(event);
11183          }).on(Event.MOUSELEAVE, function (event) {
11184            return _this2.cycle(event);
11185          });
11186
11187          if ('ontouchstart' in document.documentElement) {
11188            // If it's a touch-enabled device, mouseenter/leave are fired as
11189            // part of the mouse compatibility events on first tap - the carousel
11190            // would stop cycling until user tapped out of it;
11191            // here, we listen for touchend, explicitly pause the carousel
11192            // (as if it's the second time we tap on it, mouseenter compat event
11193            // is NOT fired) and after a timeout (to allow for mouse compatibility
11194            // events to fire) we explicitly restart cycling
11195            $$$1(this._element).on(Event.TOUCHEND, function () {
11196              _this2.pause();
11197
11198              if (_this2.touchTimeout) {
11199                clearTimeout(_this2.touchTimeout);
11200              }
11201
11202              _this2.touchTimeout = setTimeout(function (event) {
11203                return _this2.cycle(event);
11204              }, TOUCHEVENT_COMPAT_WAIT + _this2._config.interval);
11205            });
11206          }
11207        }
11208      };
11209
11210      _proto._keydown = function _keydown(event) {
11211        if (/input|textarea/i.test(event.target.tagName)) {
11212          return;
11213        }
11214
11215        switch (event.which) {
11216          case ARROW_LEFT_KEYCODE:
11217            event.preventDefault();
11218            this.prev();
11219            break;
11220
11221          case ARROW_RIGHT_KEYCODE:
11222            event.preventDefault();
11223            this.next();
11224            break;
11225
11226          default:
11227        }
11228      };
11229
11230      _proto._getItemIndex = function _getItemIndex(element) {
11231        this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : [];
11232        return this._items.indexOf(element);
11233      };
11234
11235      _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {
11236        var isNextDirection = direction === Direction.NEXT;
11237        var isPrevDirection = direction === Direction.PREV;
11238
11239        var activeIndex = this._getItemIndex(activeElement);
11240
11241        var lastItemIndex = this._items.length - 1;
11242        var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;
11243
11244        if (isGoingToWrap && !this._config.wrap) {
11245          return activeElement;
11246        }
11247
11248        var delta = direction === Direction.PREV ? -1 : 1;
11249        var itemIndex = (activeIndex + delta) % this._items.length;
11250        return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];
11251      };
11252
11253      _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {
11254        var targetIndex = this._getItemIndex(relatedTarget);
11255
11256        var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM));
11257
11258        var slideEvent = $$$1.Event(Event.SLIDE, {
11259          relatedTarget: relatedTarget,
11260          direction: eventDirectionName,
11261          from: fromIndex,
11262          to: targetIndex
11263        });
11264        $$$1(this._element).trigger(slideEvent);
11265        return slideEvent;
11266      };
11267
11268      _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {
11269        if (this._indicatorsElement) {
11270          var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE));
11271          $$$1(indicators).removeClass(ClassName.ACTIVE);
11272
11273          var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];
11274
11275          if (nextIndicator) {
11276            $$$1(nextIndicator).addClass(ClassName.ACTIVE);
11277          }
11278        }
11279      };
11280
11281      _proto._slide = function _slide(direction, element) {
11282        var _this3 = this;
11283
11284        var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM);
11285
11286        var activeElementIndex = this._getItemIndex(activeElement);
11287
11288        var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);
11289
11290        var nextElementIndex = this._getItemIndex(nextElement);
11291
11292        var isCycling = Boolean(this._interval);
11293        var directionalClassName;
11294        var orderClassName;
11295        var eventDirectionName;
11296
11297        if (direction === Direction.NEXT) {
11298          directionalClassName = ClassName.LEFT;
11299          orderClassName = ClassName.NEXT;
11300          eventDirectionName = Direction.LEFT;
11301        } else {
11302          directionalClassName = ClassName.RIGHT;
11303          orderClassName = ClassName.PREV;
11304          eventDirectionName = Direction.RIGHT;
11305        }
11306
11307        if (nextElement && $$$1(nextElement).hasClass(ClassName.ACTIVE)) {
11308          this._isSliding = false;
11309          return;
11310        }
11311
11312        var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);
11313
11314        if (slideEvent.isDefaultPrevented()) {
11315          return;
11316        }
11317
11318        if (!activeElement || !nextElement) {
11319          // Some weirdness is happening, so we bail
11320          return;
11321        }
11322
11323        this._isSliding = true;
11324
11325        if (isCycling) {
11326          this.pause();
11327        }
11328
11329        this._setActiveIndicatorElement(nextElement);
11330
11331        var slidEvent = $$$1.Event(Event.SLID, {
11332          relatedTarget: nextElement,
11333          direction: eventDirectionName,
11334          from: activeElementIndex,
11335          to: nextElementIndex
11336        });
11337
11338        if ($$$1(this._element).hasClass(ClassName.SLIDE)) {
11339          $$$1(nextElement).addClass(orderClassName);
11340          Util.reflow(nextElement);
11341          $$$1(activeElement).addClass(directionalClassName);
11342          $$$1(nextElement).addClass(directionalClassName);
11343          var transitionDuration = Util.getTransitionDurationFromElement(activeElement);
11344          $$$1(activeElement).one(Util.TRANSITION_END, function () {
11345            $$$1(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE);
11346            $$$1(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName);
11347            _this3._isSliding = false;
11348            setTimeout(function () {
11349              return $$$1(_this3._element).trigger(slidEvent);
11350            }, 0);
11351          }).emulateTransitionEnd(transitionDuration);
11352        } else {
11353          $$$1(activeElement).removeClass(ClassName.ACTIVE);
11354          $$$1(nextElement).addClass(ClassName.ACTIVE);
11355          this._isSliding = false;
11356          $$$1(this._element).trigger(slidEvent);
11357        }
11358
11359        if (isCycling) {
11360          this.cycle();
11361        }
11362      }; // Static
11363
11364
11365      Carousel._jQueryInterface = function _jQueryInterface(config) {
11366        return this.each(function () {
11367          var data = $$$1(this).data(DATA_KEY);
11368
11369          var _config = _objectSpread({}, Default, $$$1(this).data());
11370
11371          if (typeof config === 'object') {
11372            _config = _objectSpread({}, _config, config);
11373          }
11374
11375          var action = typeof config === 'string' ? config : _config.slide;
11376
11377          if (!data) {
11378            data = new Carousel(this, _config);
11379            $$$1(this).data(DATA_KEY, data);
11380          }
11381
11382          if (typeof config === 'number') {
11383            data.to(config);
11384          } else if (typeof action === 'string') {
11385            if (typeof data[action] === 'undefined') {
11386              throw new TypeError("No method named \"" + action + "\"");
11387            }
11388
11389            data[action]();
11390          } else if (_config.interval) {
11391            data.pause();
11392            data.cycle();
11393          }
11394        });
11395      };
11396
11397      Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {
11398        var selector = Util.getSelectorFromElement(this);
11399
11400        if (!selector) {
11401          return;
11402        }
11403
11404        var target = $$$1(selector)[0];
11405
11406        if (!target || !$$$1(target).hasClass(ClassName.CAROUSEL)) {
11407          return;
11408        }
11409
11410        var config = _objectSpread({}, $$$1(target).data(), $$$1(this).data());
11411
11412        var slideIndex = this.getAttribute('data-slide-to');
11413
11414        if (slideIndex) {
11415          config.interval = false;
11416        }
11417
11418        Carousel._jQueryInterface.call($$$1(target), config);
11419
11420        if (slideIndex) {
11421          $$$1(target).data(DATA_KEY).to(slideIndex);
11422        }
11423
11424        event.preventDefault();
11425      };
11426
11427      _createClass(Carousel, null, [{
11428        key: "VERSION",
11429        get: function get() {
11430          return VERSION;
11431        }
11432      }, {
11433        key: "Default",
11434        get: function get() {
11435          return Default;
11436        }
11437      }]);
11438
11439      return Carousel;
11440    }();
11441    /**
11442     * ------------------------------------------------------------------------
11443     * Data Api implementation
11444     * ------------------------------------------------------------------------
11445     */
11446
11447
11448    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
11449    $$$1(window).on(Event.LOAD_DATA_API, function () {
11450      var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE));
11451
11452      for (var i = 0, len = carousels.length; i < len; i++) {
11453        var $carousel = $$$1(carousels[i]);
11454
11455        Carousel._jQueryInterface.call($carousel, $carousel.data());
11456      }
11457    });
11458    /**
11459     * ------------------------------------------------------------------------
11460     * jQuery
11461     * ------------------------------------------------------------------------
11462     */
11463
11464    $$$1.fn[NAME] = Carousel._jQueryInterface;
11465    $$$1.fn[NAME].Constructor = Carousel;
11466
11467    $$$1.fn[NAME].noConflict = function () {
11468      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
11469      return Carousel._jQueryInterface;
11470    };
11471
11472    return Carousel;
11473  }($);
11474
11475  /**
11476   * --------------------------------------------------------------------------
11477   * Bootstrap (v4.1.3): collapse.js
11478   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11479   * --------------------------------------------------------------------------
11480   */
11481
11482  var Collapse = function ($$$1) {
11483    /**
11484     * ------------------------------------------------------------------------
11485     * Constants
11486     * ------------------------------------------------------------------------
11487     */
11488    var NAME = 'collapse';
11489    var VERSION = '4.1.3';
11490    var DATA_KEY = 'bs.collapse';
11491    var EVENT_KEY = "." + DATA_KEY;
11492    var DATA_API_KEY = '.data-api';
11493    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
11494    var Default = {
11495      toggle: true,
11496      parent: ''
11497    };
11498    var DefaultType = {
11499      toggle: 'boolean',
11500      parent: '(string|element)'
11501    };
11502    var Event = {
11503      SHOW: "show" + EVENT_KEY,
11504      SHOWN: "shown" + EVENT_KEY,
11505      HIDE: "hide" + EVENT_KEY,
11506      HIDDEN: "hidden" + EVENT_KEY,
11507      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
11508    };
11509    var ClassName = {
11510      SHOW: 'show',
11511      COLLAPSE: 'collapse',
11512      COLLAPSING: 'collapsing',
11513      COLLAPSED: 'collapsed'
11514    };
11515    var Dimension = {
11516      WIDTH: 'width',
11517      HEIGHT: 'height'
11518    };
11519    var Selector = {
11520      ACTIVES: '.show, .collapsing',
11521      DATA_TOGGLE: '[data-toggle="collapse"]'
11522      /**
11523       * ------------------------------------------------------------------------
11524       * Class Definition
11525       * ------------------------------------------------------------------------
11526       */
11527
11528    };
11529
11530    var Collapse =
11531    /*#__PURE__*/
11532    function () {
11533      function Collapse(element, config) {
11534        this._isTransitioning = false;
11535        this._element = element;
11536        this._config = this._getConfig(config);
11537        this._triggerArray = $$$1.makeArray(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]")));
11538        var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
11539
11540        for (var i = 0, len = toggleList.length; i < len; i++) {
11541          var elem = toggleList[i];
11542          var selector = Util.getSelectorFromElement(elem);
11543          var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {
11544            return foundElem === element;
11545          });
11546
11547          if (selector !== null && filterElement.length > 0) {
11548            this._selector = selector;
11549
11550            this._triggerArray.push(elem);
11551          }
11552        }
11553
11554        this._parent = this._config.parent ? this._getParent() : null;
11555
11556        if (!this._config.parent) {
11557          this._addAriaAndCollapsedClass(this._element, this._triggerArray);
11558        }
11559
11560        if (this._config.toggle) {
11561          this.toggle();
11562        }
11563      } // Getters
11564
11565
11566      var _proto = Collapse.prototype;
11567
11568      // Public
11569      _proto.toggle = function toggle() {
11570        if ($$$1(this._element).hasClass(ClassName.SHOW)) {
11571          this.hide();
11572        } else {
11573          this.show();
11574        }
11575      };
11576
11577      _proto.show = function show() {
11578        var _this = this;
11579
11580        if (this._isTransitioning || $$$1(this._element).hasClass(ClassName.SHOW)) {
11581          return;
11582        }
11583
11584        var actives;
11585        var activesData;
11586
11587        if (this._parent) {
11588          actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) {
11589            return elem.getAttribute('data-parent') === _this._config.parent;
11590          });
11591
11592          if (actives.length === 0) {
11593            actives = null;
11594          }
11595        }
11596
11597        if (actives) {
11598          activesData = $$$1(actives).not(this._selector).data(DATA_KEY);
11599
11600          if (activesData && activesData._isTransitioning) {
11601            return;
11602          }
11603        }
11604
11605        var startEvent = $$$1.Event(Event.SHOW);
11606        $$$1(this._element).trigger(startEvent);
11607
11608        if (startEvent.isDefaultPrevented()) {
11609          return;
11610        }
11611
11612        if (actives) {
11613          Collapse._jQueryInterface.call($$$1(actives).not(this._selector), 'hide');
11614
11615          if (!activesData) {
11616            $$$1(actives).data(DATA_KEY, null);
11617          }
11618        }
11619
11620        var dimension = this._getDimension();
11621
11622        $$$1(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
11623        this._element.style[dimension] = 0;
11624
11625        if (this._triggerArray.length) {
11626          $$$1(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
11627        }
11628
11629        this.setTransitioning(true);
11630
11631        var complete = function complete() {
11632          $$$1(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW);
11633          _this._element.style[dimension] = '';
11634
11635          _this.setTransitioning(false);
11636
11637          $$$1(_this._element).trigger(Event.SHOWN);
11638        };
11639
11640        var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
11641        var scrollSize = "scroll" + capitalizedDimension;
11642        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
11643        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
11644        this._element.style[dimension] = this._element[scrollSize] + "px";
11645      };
11646
11647      _proto.hide = function hide() {
11648        var _this2 = this;
11649
11650        if (this._isTransitioning || !$$$1(this._element).hasClass(ClassName.SHOW)) {
11651          return;
11652        }
11653
11654        var startEvent = $$$1.Event(Event.HIDE);
11655        $$$1(this._element).trigger(startEvent);
11656
11657        if (startEvent.isDefaultPrevented()) {
11658          return;
11659        }
11660
11661        var dimension = this._getDimension();
11662
11663        this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px";
11664        Util.reflow(this._element);
11665        $$$1(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
11666        var triggerArrayLength = this._triggerArray.length;
11667
11668        if (triggerArrayLength > 0) {
11669          for (var i = 0; i < triggerArrayLength; i++) {
11670            var trigger = this._triggerArray[i];
11671            var selector = Util.getSelectorFromElement(trigger);
11672
11673            if (selector !== null) {
11674              var $elem = $$$1([].slice.call(document.querySelectorAll(selector)));
11675
11676              if (!$elem.hasClass(ClassName.SHOW)) {
11677                $$$1(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
11678              }
11679            }
11680          }
11681        }
11682
11683        this.setTransitioning(true);
11684
11685        var complete = function complete() {
11686          _this2.setTransitioning(false);
11687
11688          $$$1(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN);
11689        };
11690
11691        this._element.style[dimension] = '';
11692        var transitionDuration = Util.getTransitionDurationFromElement(this._element);
11693        $$$1(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
11694      };
11695
11696      _proto.setTransitioning = function setTransitioning(isTransitioning) {
11697        this._isTransitioning = isTransitioning;
11698      };
11699
11700      _proto.dispose = function dispose() {
11701        $$$1.removeData(this._element, DATA_KEY);
11702        this._config = null;
11703        this._parent = null;
11704        this._element = null;
11705        this._triggerArray = null;
11706        this._isTransitioning = null;
11707      }; // Private
11708
11709
11710      _proto._getConfig = function _getConfig(config) {
11711        config = _objectSpread({}, Default, config);
11712        config.toggle = Boolean(config.toggle); // Coerce string values
11713
11714        Util.typeCheckConfig(NAME, config, DefaultType);
11715        return config;
11716      };
11717
11718      _proto._getDimension = function _getDimension() {
11719        var hasWidth = $$$1(this._element).hasClass(Dimension.WIDTH);
11720        return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;
11721      };
11722
11723      _proto._getParent = function _getParent() {
11724        var _this3 = this;
11725
11726        var parent = null;
11727
11728        if (Util.isElement(this._config.parent)) {
11729          parent = this._config.parent; // It's a jQuery object
11730
11731          if (typeof this._config.parent.jquery !== 'undefined') {
11732            parent = this._config.parent[0];
11733          }
11734        } else {
11735          parent = document.querySelector(this._config.parent);
11736        }
11737
11738        var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]";
11739        var children = [].slice.call(parent.querySelectorAll(selector));
11740        $$$1(children).each(function (i, element) {
11741          _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);
11742        });
11743        return parent;
11744      };
11745
11746      _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
11747        if (element) {
11748          var isOpen = $$$1(element).hasClass(ClassName.SHOW);
11749
11750          if (triggerArray.length) {
11751            $$$1(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
11752          }
11753        }
11754      }; // Static
11755
11756
11757      Collapse._getTargetFromElement = function _getTargetFromElement(element) {
11758        var selector = Util.getSelectorFromElement(element);
11759        return selector ? document.querySelector(selector) : null;
11760      };
11761
11762      Collapse._jQueryInterface = function _jQueryInterface(config) {
11763        return this.each(function () {
11764          var $this = $$$1(this);
11765          var data = $this.data(DATA_KEY);
11766
11767          var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {});
11768
11769          if (!data && _config.toggle && /show|hide/.test(config)) {
11770            _config.toggle = false;
vendor: 5,451 bytes, lines 11771-11949
11771          }
11772
11773          if (!data) {
11774            data = new Collapse(this, _config);
11775            $this.data(DATA_KEY, data);
11776          }
11777
11778          if (typeof config === 'string') {
11779            if (typeof data[config] === 'undefined') {
11780              throw new TypeError("No method named \"" + config + "\"");
11781            }
11782
11783            data[config]();
11784          }
11785        });
11786      };
11787
11788      _createClass(Collapse, null, [{
11789        key: "VERSION",
11790        get: function get() {
11791          return VERSION;
11792        }
11793      }, {
11794        key: "Default",
11795        get: function get() {
11796          return Default;
11797        }
11798      }]);
11799
11800      return Collapse;
11801    }();
11802    /**
11803     * ------------------------------------------------------------------------
11804     * Data Api implementation
11805     * ------------------------------------------------------------------------
11806     */
11807
11808
11809    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
11810      // preventDefault only for <a> elements (which change the URL) not inside the collapsible element
11811      if (event.currentTarget.tagName === 'A') {
11812        event.preventDefault();
11813      }
11814
11815      var $trigger = $$$1(this);
11816      var selector = Util.getSelectorFromElement(this);
11817      var selectors = [].slice.call(document.querySelectorAll(selector));
11818      $$$1(selectors).each(function () {
11819        var $target = $$$1(this);
11820        var data = $target.data(DATA_KEY);
11821        var config = data ? 'toggle' : $trigger.data();
11822
11823        Collapse._jQueryInterface.call($target, config);
11824      });
11825    });
11826    /**
11827     * ------------------------------------------------------------------------
11828     * jQuery
11829     * ------------------------------------------------------------------------
11830     */
11831
11832    $$$1.fn[NAME] = Collapse._jQueryInterface;
11833    $$$1.fn[NAME].Constructor = Collapse;
11834
11835    $$$1.fn[NAME].noConflict = function () {
11836      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
11837      return Collapse._jQueryInterface;
11838    };
11839
11840    return Collapse;
11841  }($);
11842
11843  /**
11844   * --------------------------------------------------------------------------
11845   * Bootstrap (v4.1.3): dropdown.js
11846   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
11847   * --------------------------------------------------------------------------
11848   */
11849
11850  var Dropdown = function ($$$1) {
11851    /**
11852     * ------------------------------------------------------------------------
11853     * Constants
11854     * ------------------------------------------------------------------------
11855     */
11856    var NAME = 'dropdown';
11857    var VERSION = '4.1.3';
11858    var DATA_KEY = 'bs.dropdown';
11859    var EVENT_KEY = "." + DATA_KEY;
11860    var DATA_API_KEY = '.data-api';
11861    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
11862    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
11863
11864    var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
11865
11866    var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
11867
11868    var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
11869
11870    var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
11871
11872    var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
11873
11874    var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE);
11875    var Event = {
11876      HIDE: "hide" + EVENT_KEY,
11877      HIDDEN: "hidden" + EVENT_KEY,
11878      SHOW: "show" + EVENT_KEY,
11879      SHOWN: "shown" + EVENT_KEY,
11880      CLICK: "click" + EVENT_KEY,
11881      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY,
11882      KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY,
11883      KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY
11884    };
11885    var ClassName = {
11886      DISABLED: 'disabled',
11887      SHOW: 'show',
11888      DROPUP: 'dropup',
11889      DROPRIGHT: 'dropright',
11890      DROPLEFT: 'dropleft',
11891      MENURIGHT: 'dropdown-menu-right',
11892      MENULEFT: 'dropdown-menu-left',
11893      POSITION_STATIC: 'position-static'
11894    };
11895    var Selector = {
11896      DATA_TOGGLE: '[data-toggle="dropdown"]',
11897      FORM_CHILD: '.dropdown form',
11898      MENU: '.dropdown-menu',
11899      NAVBAR_NAV: '.navbar-nav',
11900      VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
11901    };
11902    var AttachmentMap = {
11903      TOP: 'top-start',
11904      TOPEND: 'top-end',
11905      BOTTOM: 'bottom-start',
11906      BOTTOMEND: 'bottom-end',
11907      RIGHT: 'right-start',
11908      RIGHTEND: 'right-end',
11909      LEFT: 'left-start',
11910      LEFTEND: 'left-end'
11911    };
11912    var Default = {
11913      offset: 0,
11914      flip: true,
11915      boundary: 'scrollParent',
11916      reference: 'toggle',
11917      display: 'dynamic'
11918    };
11919    var DefaultType = {
11920      offset: '(number|string|function)',
11921      flip: 'boolean',
11922      boundary: '(string|element)',
11923      reference: '(string|element)',
11924      display: 'string'
11925      /**
11926       * ------------------------------------------------------------------------
11927       * Class Definition
11928       * ------------------------------------------------------------------------
11929       */
11930
11931    };
11932
11933    var Dropdown =
11934    /*#__PURE__*/
11935    function () {
11936      function Dropdown(element, config) {
11937        this._element = element;
11938        this._popper = null;
11939        this._config = this._getConfig(config);
11940        this._menu = this._getMenuElement();
11941        this._inNavbar = this._detectNavbar();
11942
11943        this._addEventListeners();
11944      } // Getters
11945
11946
11947      var _proto = Dropdown.prototype;
11948
11949      // Public
11950      _proto.toggle = function toggle() {
11951        if (this._element.disabled || $$$1(this._element).hasClass(ClassName.DISABLED)) {
11952          return;
11953        }
11954
11955        var parent = Dropdown._getParentFromElement(this._element);
11956
11957        var isActive = $$$1(this._menu).hasClass(ClassName.SHOW);
11958
11959        Dropdown._clearMenus();
11960
11961        if (isActive) {
11962          return;
11963        }
11964
11965        var relatedTarget = {
11966          relatedTarget: this._element
11967        };
11968        var showEvent = $$$1.Event(Event.SHOW, relatedTarget);
11969        $$$1(parent).trigger(showEvent);
11970
11971        if (showEvent.isDefaultPrevented()) {
11972          return;
11973        } // Disable totally Popper.js for Dropdown in Navbar
11974
11975
11976        if (!this._inNavbar) {
11977          /**
11978           * Check for Popper dependency
11979           * Popper - https://popper.js.org
11980           */
11981          if (typeof Popper === 'undefined') {
11982            throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)');
11983          }
11984
11985          var referenceElement = this._element;
11986
11987          if (this._config.reference === 'parent') {
11988            referenceElement = parent;
11989          } else if (Util.isElement(this._config.reference)) {
11990            referenceElement = this._config.reference; // Check if it's jQuery element
11991
11992            if (typeof this._config.reference.jquery !== 'undefined') {
11993              referenceElement = this._config.reference[0];
11994            }
11995          } // If boundary is not `scrollParent`, then set position to `static`
11996          // to allow the menu to "escape" the scroll parent's boundaries
11997          // https://github.com/twbs/bootstrap/issues/24251
11998
11999
12000          if (this._config.boundary !== 'scrollParent') {
12001            $$$1(parent).addClass(ClassName.POSITION_STATIC);
12002          }
12003
12004          this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());
12005        } // If this is a touch-enabled device we add extra
12006        // empty mouseover listeners to the body's immediate children;
12007        // only needed because of broken event delegation on iOS
12008        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
12009
12010
12011        if ('ontouchstart' in document.documentElement && $$$1(parent).closest(Selector.NAVBAR_NAV).length === 0) {
12012          $$$1(document.body).children().on('mouseover', null, $$$1.noop);
12013        }
12014
12015        this._element.focus();
12016
12017        this._element.setAttribute('aria-expanded', true);
12018
12019        $$$1(this._menu).toggleClass(ClassName.SHOW);
12020        $$$1(parent).toggleClass(ClassName.SHOW).trigger($$$1.Event(Event.SHOWN, relatedTarget));
12021      };
12022
12023      _proto.dispose = function dispose() {
12024        $$$1.removeData(this._element, DATA_KEY);
12025        $$$1(this._element).off(EVENT_KEY);
12026        this._element = null;
12027        this._menu = null;
12028
12029        if (this._popper !== null) {
12030          this._popper.destroy();
12031
12032          this._popper = null;
12033        }
12034      };
12035
12036      _proto.update = function update() {
12037        this._inNavbar = this._detectNavbar();
12038
12039        if (this._popper !== null) {
12040          this._popper.scheduleUpdate();
12041        }
12042      }; // Private
12043
12044
12045      _proto._addEventListeners = function _addEventListeners() {
12046        var _this = this;
12047
12048        $$$1(this._element).on(Event.CLICK, function (event) {
12049          event.preventDefault();
12050          event.stopPropagation();
12051
12052          _this.toggle();
12053        });
12054      };
12055
12056      _proto._getConfig = function _getConfig(config) {
12057        config = _objectSpread({}, this.constructor.Default, $$$1(this._element).data(), config);
12058        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
12059        return config;
12060      };
12061
12062      _proto._getMenuElement = function _getMenuElement() {
12063        if (!this._menu) {
12064          var parent = Dropdown._getParentFromElement(this._element);
12065
12066          if (parent) {
12067            this._menu = parent.querySelector(Selector.MENU);
12068          }
12069        }
12070
12071        return this._menu;
12072      };
12073
12074      _proto._getPlacement = function _getPlacement() {
12075        var $parentDropdown = $$$1(this._element.parentNode);
12076        var placement = AttachmentMap.BOTTOM; // Handle dropup
12077
12078        if ($parentDropdown.hasClass(ClassName.DROPUP)) {
12079          placement = AttachmentMap.TOP;
12080
12081          if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {
12082            placement = AttachmentMap.TOPEND;
12083          }
12084        } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {
12085          placement = AttachmentMap.RIGHT;
12086        } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {
12087          placement = AttachmentMap.LEFT;
12088        } else if ($$$1(this._menu).hasClass(ClassName.MENURIGHT)) {
12089          placement = AttachmentMap.BOTTOMEND;
12090        }
12091
12092        return placement;
12093      };
12094
12095      _proto._detectNavbar = function _detectNavbar() {
12096        return $$$1(this._element).closest('.navbar').length > 0;
12097      };
12098
12099      _proto._getPopperConfig = function _getPopperConfig() {
12100        var _this2 = this;
12101
12102        var offsetConf = {};
12103
12104        if (typeof this._config.offset === 'function') {
12105          offsetConf.fn = function (data) {
12106            data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets) || {});
12107            return data;
12108          };
12109        } else {
12110          offsetConf.offset = this._config.offset;
12111        }
12112
12113        var popperConfig = {
12114          placement: this._getPlacement(),
12115          modifiers: {
12116            offset: offsetConf,
12117            flip: {
12118              enabled: this._config.flip
12119            },
12120            preventOverflow: {
vendor: 8,256 bytes, lines 12121-12377
12121              boundariesElement: this._config.boundary
12122            }
12123          } // Disable Popper.js if we have a static display
12124
12125        };
12126
12127        if (this._config.display === 'static') {
12128          popperConfig.modifiers.applyStyle = {
12129            enabled: false
12130          };
12131        }
12132
12133        return popperConfig;
12134      }; // Static
12135
12136
12137      Dropdown._jQueryInterface = function _jQueryInterface(config) {
12138        return this.each(function () {
12139          var data = $$$1(this).data(DATA_KEY);
12140
12141          var _config = typeof config === 'object' ? config : null;
12142
12143          if (!data) {
12144            data = new Dropdown(this, _config);
12145            $$$1(this).data(DATA_KEY, data);
12146          }
12147
12148          if (typeof config === 'string') {
12149            if (typeof data[config] === 'undefined') {
12150              throw new TypeError("No method named \"" + config + "\"");
12151            }
12152
12153            data[config]();
12154          }
12155        });
12156      };
12157
12158      Dropdown._clearMenus = function _clearMenus(event) {
12159        if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
12160          return;
12161        }
12162
12163        var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE));
12164
12165        for (var i = 0, len = toggles.length; i < len; i++) {
12166          var parent = Dropdown._getParentFromElement(toggles[i]);
12167
12168          var context = $$$1(toggles[i]).data(DATA_KEY);
12169          var relatedTarget = {
12170            relatedTarget: toggles[i]
12171          };
12172
12173          if (event && event.type === 'click') {
12174            relatedTarget.clickEvent = event;
12175          }
12176
12177          if (!context) {
12178            continue;
12179          }
12180
12181          var dropdownMenu = context._menu;
12182
12183          if (!$$$1(parent).hasClass(ClassName.SHOW)) {
12184            continue;
12185          }
12186
12187          if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $$$1.contains(parent, event.target)) {
12188            continue;
12189          }
12190
12191          var hideEvent = $$$1.Event(Event.HIDE, relatedTarget);
12192          $$$1(parent).trigger(hideEvent);
12193
12194          if (hideEvent.isDefaultPrevented()) {
12195            continue;
12196          } // If this is a touch-enabled device we remove the extra
12197          // empty mouseover listeners we added for iOS support
12198
12199
12200          if ('ontouchstart' in document.documentElement) {
12201            $$$1(document.body).children().off('mouseover', null, $$$1.noop);
12202          }
12203
12204          toggles[i].setAttribute('aria-expanded', 'false');
12205          $$$1(dropdownMenu).removeClass(ClassName.SHOW);
12206          $$$1(parent).removeClass(ClassName.SHOW).trigger($$$1.Event(Event.HIDDEN, relatedTarget));
12207        }
12208      };
12209
12210      Dropdown._getParentFromElement = function _getParentFromElement(element) {
12211        var parent;
12212        var selector = Util.getSelectorFromElement(element);
12213
12214        if (selector) {
12215          parent = document.querySelector(selector);
12216        }
12217
12218        return parent || element.parentNode;
12219      }; // eslint-disable-next-line complexity
12220
12221
12222      Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
12223        // If not input/textarea:
12224        //  - And not a key in REGEXP_KEYDOWN => not a dropdown command
12225        // If input/textarea:
12226        //  - If space key => not a dropdown command
12227        //  - If key is other than escape
12228        //    - If key is not up or down => not a dropdown command
12229        //    - If trigger inside the menu => not a dropdown command
12230        if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $$$1(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {
12231          return;
12232        }
12233
12234        event.preventDefault();
12235        event.stopPropagation();
12236
12237        if (this.disabled || $$$1(this).hasClass(ClassName.DISABLED)) {
12238          return;
12239        }
12240
12241        var parent = Dropdown._getParentFromElement(this);
12242
12243        var isActive = $$$1(parent).hasClass(ClassName.SHOW);
12244
12245        if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {
12246          if (event.which === ESCAPE_KEYCODE) {
12247            var toggle = parent.querySelector(Selector.DATA_TOGGLE);
12248            $$$1(toggle).trigger('focus');
12249          }
12250
12251          $$$1(this).trigger('click');
12252          return;
12253        }
12254
12255        var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS));
12256
12257        if (items.length === 0) {
12258          return;
12259        }
12260
12261        var index = items.indexOf(event.target);
12262
12263        if (event.which === ARROW_UP_KEYCODE && index > 0) {
12264          // Up
12265          index--;
12266        }
12267
12268        if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {
12269          // Down
12270          index++;
12271        }
12272
12273        if (index < 0) {
12274          index = 0;
12275        }
12276
12277        items[index].focus();
12278      };
12279
12280      _createClass(Dropdown, null, [{
12281        key: "VERSION",
12282        get: function get() {
12283          return VERSION;
12284        }
12285      }, {
12286        key: "Default",
12287        get: function get() {
12288          return Default;
12289        }
12290      }, {
12291        key: "DefaultType",
12292        get: function get() {
12293          return DefaultType;
12294        }
12295      }]);
12296
12297      return Dropdown;
12298    }();
12299    /**
12300     * ------------------------------------------------------------------------
12301     * Data Api implementation
12302     * ------------------------------------------------------------------------
12303     */
12304
12305
12306    $$$1(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
12307      event.preventDefault();
12308      event.stopPropagation();
12309
12310      Dropdown._jQueryInterface.call($$$1(this), 'toggle');
12311    }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
12312      e.stopPropagation();
12313    });
12314    /**
12315     * ------------------------------------------------------------------------
12316     * jQuery
12317     * ------------------------------------------------------------------------
12318     */
12319
12320    $$$1.fn[NAME] = Dropdown._jQueryInterface;
12321    $$$1.fn[NAME].Constructor = Dropdown;
12322
12323    $$$1.fn[NAME].noConflict = function () {
12324      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
12325      return Dropdown._jQueryInterface;
12326    };
12327
12328    return Dropdown;
12329  }($, Popper);
12330
12331  /**
12332   * --------------------------------------------------------------------------
12333   * Bootstrap (v4.1.3): modal.js
12334   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
12335   * --------------------------------------------------------------------------
12336   */
12337
12338  var Modal = function ($$$1) {
12339    /**
12340     * ------------------------------------------------------------------------
12341     * Constants
12342     * ------------------------------------------------------------------------
12343     */
12344    var NAME = 'modal';
12345    var VERSION = '4.1.3';
12346    var DATA_KEY = 'bs.modal';
12347    var EVENT_KEY = "." + DATA_KEY;
12348    var DATA_API_KEY = '.data-api';
12349    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
12350    var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
12351
12352    var Default = {
12353      backdrop: true,
12354      keyboard: true,
12355      focus: true,
12356      show: true
12357    };
12358    var DefaultType = {
12359      backdrop: '(boolean|string)',
12360      keyboard: 'boolean',
12361      focus: 'boolean',
12362      show: 'boolean'
12363    };
12364    var Event = {
12365      HIDE: "hide" + EVENT_KEY,
12366      HIDDEN: "hidden" + EVENT_KEY,
12367      SHOW: "show" + EVENT_KEY,
12368      SHOWN: "shown" + EVENT_KEY,
12369      FOCUSIN: "focusin" + EVENT_KEY,
12370      RESIZE: "resize" + EVENT_KEY,
12371      CLICK_DISMISS: "click.dismiss" + EVENT_KEY,
12372      KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY,
12373      MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY,
12374      MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY,
12375      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
12376    };
12377    var ClassName = {
12378      SCROLLBAR_MEASURER: 'modal-scrollbar-measure',
12379      BACKDROP: 'modal-backdrop',
12380      OPEN: 'modal-open',
12381      FADE: 'fade',
12382      SHOW: 'show'
12383    };
12384    var Selector = {
12385      DIALOG: '.modal-dialog',
12386      DATA_TOGGLE: '[data-toggle="modal"]',
12387      DATA_DISMISS: '[data-dismiss="modal"]',
12388      FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
12389      STICKY_CONTENT: '.sticky-top'
12390      /**
12391       * ------------------------------------------------------------------------
12392       * Class Definition
12393       * ------------------------------------------------------------------------
12394       */
12395
12396    };
12397
12398    var Modal =
12399    /*#__PURE__*/
12400    function () {
12401      function Modal(element, config) {
12402        this._config = this._getConfig(config);
12403        this._element = element;
12404        this._dialog = element.querySelector(Selector.DIALOG);
12405        this._backdrop = null;
12406        this._isShown = false;
12407        this._isBodyOverflowing = false;
12408        this._ignoreBackdropClick = false;
12409        this._scrollbarWidth = 0;
12410      } // Getters
12411
12412
12413      var _proto = Modal.prototype;
12414
12415      // Public
12416      _proto.toggle = function toggle(relatedTarget) {
12417        return this._isShown ? this.hide() : this.show(relatedTarget);
12418      };
12419
12420      _proto.show = function show(relatedTarget) {
12421        var _this = this;
12422
12423        if (this._isTransitioning || this._isShown) {
12424          return;
12425        }
12426
12427        if ($$$1(this._element).hasClass(ClassName.FADE)) {
12428          this._isTransitioning = true;
12429        }
12430
12431        var showEvent = $$$1.Event(Event.SHOW, {
12432          relatedTarget: relatedTarget
12433        });
12434        $$$1(this._element).trigger(showEvent);
12435
12436        if (this._isShown || showEvent.isDefaultPrevented()) {
12437          return;
12438        }
12439
12440        this._isShown = true;
12441
12442        this._checkScrollbar();
12443
12444        this._setScrollbar();
12445
12446        this._adjustDialog();
12447
12448        $$$1(document.body).addClass(ClassName.OPEN);
12449
12450        this._setEscapeEvent();
12451
12452        this._setResizeEvent();
12453
12454        $$$1(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
12455          return _this.hide(event);
12456        });
12457        $$$1(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
12458          $$$1(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
12459            if ($$$1(event.target).is(_this._element)) {
12460              _this._ignoreBackdropClick = true;
12461            }
12462          });
12463        });
12464
12465        this._showBackdrop(function () {
12466          return _this._showElement(relatedTarget);
12467        });
12468      };
12469
12470      _proto.hide = function hide(event) {
12471        var _this2 = this;
12472
12473        if (event) {
12474          event.preventDefault();
12475        }
12476
12477        if (this._isTransitioning || !this._isShown) {
12478          return;
12479        }
12480
12481        var hideEvent = $$$1.Event(Event.HIDE);
12482        $$$1(this._element).trigger(hideEvent);
12483
12484        if (!this._isShown || hideEvent.isDefaultPrevented()) {
12485          return;
12486        }
12487
12488        this._isShown = false;
12489        var transition = $$$1(this._element).hasClass(ClassName.FADE);
12490
12491        if (transition) {
12492          this._isTransitioning = true;
12493        }
12494
12495        this._setEscapeEvent();
12496
12497        this._setResizeEvent();
12498
12499        $$$1(document).off(Event.FOCUSIN);
12500        $$$1(this._element).removeClass(ClassName.SHOW);
12501        $$$1(this._element).off(Event.CLICK_DISMISS);
12502        $$$1(this._dialog).off(Event.MOUSEDOWN_DISMISS);
12503
12504        if (transition) {
12505          var transitionDuration = Util.getTransitionDurationFromElement(this._element);
12506          $$$1(this._element).one(Util.TRANSITION_END, function (event) {
12507            return _this2._hideModal(event);
12508          }).emulateTransitionEnd(transitionDuration);
12509        } else {
12510          this._hideModal();
12511        }
12512      };
12513
12514      _proto.dispose = function dispose() {
12515        $$$1.removeData(this._element, DATA_KEY);
12516        $$$1(window, document, this._element, this._backdrop).off(EVENT_KEY);
12517        this._config = null;
12518        this._element = null;
12519        this._dialog = null;
12520        this._backdrop = null;
12521        this._isShown = null;
12522        this._isBodyOverflowing = null;
12523        this._ignoreBackdropClick = null;
12524        this._scrollbarWidth = null;
12525      };
12526
12527      _proto.handleUpdate = function handleUpdate() {
12528        this._adjustDialog();
12529      }; // Private
12530
12531
12532      _proto._getConfig = function _getConfig(config) {
12533        config = _objectSpread({}, Default, config);
12534        Util.typeCheckConfig(NAME, config, DefaultType);
12535        return config;
12536      };
12537
12538      _proto._showElement = function _showElement(relatedTarget) {
12539        var _this3 = this;
12540
12541        var transition = $$$1(this._element).hasClass(ClassName.FADE);
12542
12543        if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {
12544          // Don't move modal's DOM position
12545          document.body.appendChild(this._element);
12546        }
12547
12548        this._element.style.display = 'block';
12549
12550        this._element.removeAttribute('aria-hidden');
12551
12552        this._element.scrollTop = 0;
12553
12554        if (transition) {
12555          Util.reflow(this._element);
12556        }
12557
12558        $$$1(this._element).addClass(ClassName.SHOW);
12559
12560        if (this._config.focus) {
12561          this._enforceFocus();
12562        }
12563
12564        var shownEvent = $$$1.Event(Event.SHOWN, {
12565          relatedTarget: relatedTarget
12566        });
12567
12568        var transitionComplete = function transitionComplete() {
12569          if (_this3._config.focus) {
12570            _this3._element.focus();
12571          }
12572
12573          _this3._isTransitioning = false;
12574          $$$1(_this3._element).trigger(shownEvent);
12575        };
12576
12577        if (transition) {
12578          var transitionDuration = Util.getTransitionDurationFromElement(this._element);
12579          $$$1(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);
12580        } else {
12581          transitionComplete();
12582        }
12583      };
12584
12585      _proto._enforceFocus = function _enforceFocus() {
12586        var _this4 = this;
12587
12588        $$$1(document).off(Event.FOCUSIN) // Guard against infinite focus loop
12589        .on(Event.FOCUSIN, function (event) {
12590          if (document !== event.target && _this4._element !== event.target && $$$1(_this4._element).has(event.target).length === 0) {
12591            _this4._element.focus();
12592          }
12593        });
12594      };
12595
12596      _proto._setEscapeEvent = function _setEscapeEvent() {
12597        var _this5 = this;
12598
12599        if (this._isShown && this._config.keyboard) {
12600          $$$1(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
12601            if (event.which === ESCAPE_KEYCODE) {
12602              event.preventDefault();
12603
12604              _this5.hide();
12605            }
12606          });
12607        } else if (!this._isShown) {
12608          $$$1(this._element).off(Event.KEYDOWN_DISMISS);
12609        }
12610      };
12611
12612      _proto._setResizeEvent = function _setResizeEvent() {
12613        var _this6 = this;
12614
12615        if (this._isShown) {
12616          $$$1(window).on(Event.RESIZE, function (event) {
12617            return _this6.handleUpdate(event);
12618          });
12619        } else {
12620          $$$1(window).off(Event.RESIZE);
12621        }
12622      };
12623
12624      _proto._hideModal = function _hideModal() {
12625        var _this7 = this;
12626
12627        this._element.style.display = 'none';
12628
12629        this._element.setAttribute('aria-hidden', true);
12630
12631        this._isTransitioning = false;
12632
12633        this._showBackdrop(function () {
12634          $$$1(document.body).removeClass(ClassName.OPEN);
12635
12636          _this7._resetAdjustments();
12637
12638          _this7._resetScrollbar();
12639
12640          $$$1(_this7._element).trigger(Event.HIDDEN);
12641        });
12642      };
12643
12644      _proto._removeBackdrop = function _removeBackdrop() {
12645        if (this._backdrop) {
12646          $$$1(this._backdrop).remove();
12647          this._backdrop = null;
12648        }
12649      };
12650
12651      _proto._showBackdrop = function _showBackdrop(callback) {
12652        var _this8 = this;
12653
12654        var animate = $$$1(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
12655
12656        if (this._isShown && this._config.backdrop) {
12657          this._backdrop = document.createElement('div');
12658          this._backdrop.className = ClassName.BACKDROP;
12659
12660          if (animate) {
12661            this._backdrop.classList.add(animate);
12662          }
12663
12664          $$$1(this._backdrop).appendTo(document.body);
12665          $$$1(this._element).on(Event.CLICK_DISMISS, function (event) {
12666            if (_this8._ignoreBackdropClick) {
12667              _this8._ignoreBackdropClick = false;
12668              return;
12669            }
12670
12671            if (event.target !== event.currentTarget) {
12672              return;
12673            }
12674
12675            if (_this8._config.backdrop === 'static') {
12676              _this8._element.focus();
12677            } else {
12678              _this8.hide();
12679            }
12680          });
12681
12682          if (animate) {
12683            Util.reflow(this._backdrop);
12684          }
12685
12686          $$$1(this._backdrop).addClass(ClassName.SHOW);
12687
12688          if (!callback) {
12689            return;
12690          }
12691
12692          if (!animate) {
12693            callback();
12694            return;
12695          }
12696
12697          var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
12698          $$$1(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);
12699        } else if (!this._isShown && this._backdrop) {
12700          $$$1(this._backdrop).removeClass(ClassName.SHOW);
12701
12702          var callbackRemove = function callbackRemove() {
12703            _this8._removeBackdrop();
12704
12705            if (callback) {
12706              callback();
12707            }
12708          };
12709
12710          if ($$$1(this._element).hasClass(ClassName.FADE)) {
12711            var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);
12712
12713            $$$1(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);
12714          } else {
12715            callbackRemove();
12716          }
12717        } else if (callback) {
12718          callback();
12719        }
12720      }; // ----------------------------------------------------------------------
12721      // the following methods are used to handle overflowing modals
12722      // todo (fat): these should probably be refactored out of modal.js
12723      // ----------------------------------------------------------------------
12724
12725
12726      _proto._adjustDialog = function _adjustDialog() {
12727        var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
12728
12729        if (!this._isBodyOverflowing && isModalOverflowing) {
12730          this._element.style.paddingLeft = this._scrollbarWidth + "px";
12731        }
12732
12733        if (this._isBodyOverflowing && !isModalOverflowing) {
12734          this._element.style.paddingRight = this._scrollbarWidth + "px";
12735        }
12736      };
12737
12738      _proto._resetAdjustments = function _resetAdjustments() {
12739        this._element.style.paddingLeft = '';
12740        this._element.style.paddingRight = '';
12741      };
12742
12743      _proto._checkScrollbar = function _checkScrollbar() {
12744        var rect = document.body.getBoundingClientRect();
12745        this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;
12746        this._scrollbarWidth = this._getScrollbarWidth();
12747      };
12748
12749      _proto._setScrollbar = function _setScrollbar() {
12750        var _this9 = this;
12751
12752        if (this._isBodyOverflowing) {
12753          // Note: DOMNode.style.paddingRight returns the actual value or '' if not set
12754          //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set
12755          var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
12756          var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding
12757
12758          $$$1(fixedContent).each(function (index, element) {
12759            var actualPadding = element.style.paddingRight;
12760            var calculatedPadding = $$$1(element).css('padding-right');
12761            $$$1(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px");
12762          }); // Adjust sticky content margin
12763
12764          $$$1(stickyContent).each(function (index, element) {
12765            var actualMargin = element.style.marginRight;
12766            var calculatedMargin = $$$1(element).css('margin-right');
12767            $$$1(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px");
12768          }); // Adjust body padding
12769
12770          var actualPadding = document.body.style.paddingRight;
12771          var calculatedPadding = $$$1(document.body).css('padding-right');
12772          $$$1(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px");
12773        }
12774      };
12775
12776      _proto._resetScrollbar = function _resetScrollbar() {
12777        // Restore fixed content padding
12778        var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT));
12779        $$$1(fixedContent).each(function (index, element) {
12780          var padding = $$$1(element).data('padding-right');
12781          $$$1(element).removeData('padding-right');
12782          element.style.paddingRight = padding ? padding : '';
12783        }); // Restore sticky content
12784
12785        var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT));
12786        $$$1(elements).each(function (index, element) {
12787          var margin = $$$1(element).data('margin-right');
12788
12789          if (typeof margin !== 'undefined') {
12790            $$$1(element).css('margin-right', margin).removeData('margin-right');
12791          }
12792        }); // Restore body padding
12793
12794        var padding = $$$1(document.body).data('padding-right');
12795        $$$1(document.body).removeData('padding-right');
12796        document.body.style.paddingRight = padding ? padding : '';
12797      };
12798
12799      _proto._getScrollbarWidth = function _getScrollbarWidth() {
12800        // thx d.walsh
12801        var scrollDiv = document.createElement('div');
12802        scrollDiv.className = ClassName.SCROLLBAR_MEASURER;
12803        document.body.appendChild(scrollDiv);
12804        var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;
12805        document.body.removeChild(scrollDiv);
12806        return scrollbarWidth;
12807      }; // Static
12808
12809
12810      Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {
12811        return this.each(function () {
12812          var data = $$$1(this).data(DATA_KEY);
12813
12814          var _config = _objectSpread({}, Default, $$$1(this).data(), typeof config === 'object' && config ? config : {});
12815
12816          if (!data) {
12817            data = new Modal(this, _config);
12818            $$$1(this).data(DATA_KEY, data);
12819          }
12820
12821          if (typeof config === 'string') {
12822            if (typeof data[config] === 'undefined') {
12823              throw new TypeError("No method named \"" + config + "\"");
12824            }
12825
12826            data[config](relatedTarget);
12827          } else if (_config.show) {
12828            data.show(relatedTarget);
12829          }
12830        });
12831      };
12832
12833      _createClass(Modal, null, [{
12834        key: "VERSION",
12835        get: function get() {
12836          return VERSION;
12837        }
12838      }, {
12839        key: "Default",
12840        get: function get() {
12841          return Default;
12842        }
12843      }]);
12844
12845      return Modal;
12846    }();
12847    /**
12848     * ------------------------------------------------------------------------
12849     * Data Api implementation
12850     * ------------------------------------------------------------------------
12851     */
12852
12853
12854    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
12855      var _this10 = this;
12856
12857      var target;
12858      var selector = Util.getSelectorFromElement(this);
12859
12860      if (selector) {
12861        target = document.querySelector(selector);
12862      }
12863
12864      var config = $$$1(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $$$1(target).data(), $$$1(this).data());
12865
12866      if (this.tagName === 'A' || this.tagName === 'AREA') {
12867        event.preventDefault();
12868      }
12869
12870      var $target = $$$1(target).one(Event.SHOW, function (showEvent) {
12871        if (showEvent.isDefaultPrevented()) {
12872          // Only register focus restorer if modal will actually get shown
12873          return;
12874        }
12875
12876        $target.one(Event.HIDDEN, function () {
12877          if ($$$1(_this10).is(':visible')) {
12878            _this10.focus();
12879          }
12880        });
12881      });
12882
12883      Modal._jQueryInterface.call($$$1(target), config, this);
12884    });
12885    /**
12886     * ------------------------------------------------------------------------
12887     * jQuery
12888     * ------------------------------------------------------------------------
12889     */
12890
12891    $$$1.fn[NAME] = Modal._jQueryInterface;
12892    $$$1.fn[NAME].Constructor = Modal;
12893
12894    $$$1.fn[NAME].noConflict = function () {
12895      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
12896      return Modal._jQueryInterface;
12897    };
12898
12899    return Modal;
12900  }($);
12901
12902  /**
12903   * --------------------------------------------------------------------------
12904   * Bootstrap (v4.1.3): tooltip.js
12905   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
12906   * --------------------------------------------------------------------------
12907   */
12908
12909  var Tooltip = function ($$$1) {
12910    /**
12911     * ------------------------------------------------------------------------
12912     * Constants
12913     * ------------------------------------------------------------------------
12914     */
12915    var NAME = 'tooltip';
12916    var VERSION = '4.1.3';
12917    var DATA_KEY = 'bs.tooltip';
12918    var EVENT_KEY = "." + DATA_KEY;
12919    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
12920    var CLASS_PREFIX = 'bs-tooltip';
12921    var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
12922    var DefaultType = {
12923      animation: 'boolean',
12924      template: 'string',
12925      title: '(string|element|function)',
12926      trigger: 'string',
12927      delay: '(number|object)',
12928      html: 'boolean',
12929      selector: '(string|boolean)',
12930      placement: '(string|function)',
12931      offset: '(number|string)',
12932      container: '(string|element|boolean)',
12933      fallbackPlacement: '(string|array)',
12934      boundary: '(string|element)'
12935    };
12936    var AttachmentMap = {
12937      AUTO: 'auto',
12938      TOP: 'top',
12939      RIGHT: 'right',
12940      BOTTOM: 'bottom',
12941      LEFT: 'left'
12942    };
12943    var Default = {
12944      animation: true,
12945      template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
12946      trigger: 'hover focus',
12947      title: '',
12948      delay: 0,
12949      html: false,
12950      selector: false,
12951      placement: 'top',
12952      offset: 0,
12953      container: false,
12954      fallbackPlacement: 'flip',
12955      boundary: 'scrollParent'
12956    };
12957    var HoverState = {
12958      SHOW: 'show',
12959      OUT: 'out'
12960    };
12961    var Event = {
12962      HIDE: "hide" + EVENT_KEY,
12963      HIDDEN: "hidden" + EVENT_KEY,
12964      SHOW: "show" + EVENT_KEY,
12965      SHOWN: "shown" + EVENT_KEY,
12966      INSERTED: "inserted" + EVENT_KEY,
12967      CLICK: "click" + EVENT_KEY,
12968      FOCUSIN: "focusin" + EVENT_KEY,
12969      FOCUSOUT: "focusout" + EVENT_KEY,
12970      MOUSEENTER: "mouseenter" + EVENT_KEY,
12971      MOUSELEAVE: "mouseleave" + EVENT_KEY
12972    };
12973    var ClassName = {
12974      FADE: 'fade',
12975      SHOW: 'show'
12976    };
12977    var Selector = {
12978      TOOLTIP: '.tooltip',
12979      TOOLTIP_INNER: '.tooltip-inner',
12980      ARROW: '.arrow'
12981    };
12982    var Trigger = {
12983      HOVER: 'hover',
12984      FOCUS: 'focus',
12985      CLICK: 'click',
12986      MANUAL: 'manual'
12987      /**
12988       * ------------------------------------------------------------------------
12989       * Class Definition
12990       * ------------------------------------------------------------------------
12991       */
12992
12993    };
12994
12995    var Tooltip =
12996    /*#__PURE__*/
12997    function () {
12998      function Tooltip(element, config) {
12999        /**
13000         * Check for Popper dependency
13001         * Popper - https://popper.js.org
13002         */
13003        if (typeof Popper === 'undefined') {
13004          throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)');
13005        } // private
13006
13007
13008        this._isEnabled = true;
13009        this._timeout = 0;
13010        this._hoverState = '';
13011        this._activeTrigger = {};
13012        this._popper = null; // Protected
13013
13014        this.element = element;
13015        this.config = this._getConfig(config);
13016        this.tip = null;
13017
13018        this._setListeners();
13019      } // Getters
13020
13021
13022      var _proto = Tooltip.prototype;
13023
13024      // Public
13025      _proto.enable = function enable() {
13026        this._isEnabled = true;
13027      };
13028
13029      _proto.disable = function disable() {
13030        this._isEnabled = false;
13031      };
13032
13033      _proto.toggleEnabled = function toggleEnabled() {
13034        this._isEnabled = !this._isEnabled;
13035      };
13036
13037      _proto.toggle = function toggle(event) {
13038        if (!this._isEnabled) {
13039          return;
13040        }
13041
13042        if (event) {
13043          var dataKey = this.constructor.DATA_KEY;
13044          var context = $$$1(event.currentTarget).data(dataKey);
13045
13046          if (!context) {
13047            context = new this.constructor(event.currentTarget, this._getDelegateConfig());
13048            $$$1(event.currentTarget).data(dataKey, context);
13049          }
13050
13051          context._activeTrigger.click = !context._activeTrigger.click;
13052
13053          if (context._isWithActiveTrigger()) {
13054            context._enter(null, context);
13055          } else {
13056            context._leave(null, context);
13057          }
13058        } else {
13059          if ($$$1(this.getTipElement()).hasClass(ClassName.SHOW)) {
13060            this._leave(null, this);
13061
13062            return;
13063          }
13064
13065          this._enter(null, this);
13066        }
13067      };
13068
13069      _proto.dispose = function dispose() {
13070        clearTimeout(this._timeout);
13071        $$$1.removeData(this.element, this.constructor.DATA_KEY);
13072        $$$1(this.element).off(this.constructor.EVENT_KEY);
13073        $$$1(this.element).closest('.modal').off('hide.bs.modal');
13074
13075        if (this.tip) {
13076          $$$1(this.tip).remove();
13077        }
13078
13079        this._isEnabled = null;
13080        this._timeout = null;
13081        this._hoverState = null;
13082        this._activeTrigger = null;
13083
13084        if (this._popper !== null) {
13085          this._popper.destroy();
13086        }
13087
13088        this._popper = null;
13089        this.element = null;
13090        this.config = null;
13091        this.tip = null;
13092      };
13093
13094      _proto.show = function show() {
13095        var _this = this;
13096
13097        if ($$$1(this.element).css('display') === 'none') {
13098          throw new Error('Please use show on visible elements');
13099        }
13100
13101        var showEvent = $$$1.Event(this.constructor.Event.SHOW);
13102
13103        if (this.isWithContent() && this._isEnabled) {
13104          $$$1(this.element).trigger(showEvent);
13105          var isInTheDom = $$$1.contains(this.element.ownerDocument.documentElement, this.element);
13106
13107          if (showEvent.isDefaultPrevented() || !isInTheDom) {
13108            return;
13109          }
13110
13111          var tip = this.getTipElement();
13112          var tipId = Util.getUID(this.constructor.NAME);
13113          tip.setAttribute('id', tipId);
13114          this.element.setAttribute('aria-describedby', tipId);
13115          this.setContent();
13116
13117          if (this.config.animation) {
13118            $$$1(tip).addClass(ClassName.FADE);
13119          }
13120
13121          var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
13122
13123          var attachment = this._getAttachment(placement);
13124
13125          this.addAttachmentClass(attachment);
13126          var container = this.config.container === false ? document.body : $$$1(document).find(this.config.container);
13127          $$$1(tip).data(this.constructor.DATA_KEY, this);
13128
13129          if (!$$$1.contains(this.element.ownerDocument.documentElement, this.tip)) {
13130            $$$1(tip).appendTo(container);
13131          }
13132
13133          $$$1(this.element).trigger(this.constructor.Event.INSERTED);
13134          this._popper = new Popper(this.element, tip, {
13135            placement: attachment,
13136            modifiers: {
13137              offset: {
13138                offset: this.config.offset
13139              },
13140              flip: {
13141                behavior: this.config.fallbackPlacement
13142              },
13143              arrow: {
13144                element: Selector.ARROW
13145              },
13146              preventOverflow: {
13147                boundariesElement: this.config.boundary
13148              }
13149            },
13150            onCreate: function onCreate(data) {
13151              if (data.originalPlacement !== data.placement) {
13152                _this._handlePopperPlacementChange(data);
13153              }
13154            },
13155            onUpdate: function onUpdate(data) {
13156              _this._handlePopperPlacementChange(data);
13157            }
13158          });
13159          $$$1(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra
13160          // empty mouseover listeners to the body's immediate children;
13161          // only needed because of broken event delegation on iOS
13162          // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
13163
13164          if ('ontouchstart' in document.documentElement) {
13165            $$$1(document.body).children().on('mouseover', null, $$$1.noop);
13166          }
13167
13168          var complete = function complete() {
13169            if (_this.config.animation) {
13170              _this._fixTransition();
13171            }
13172
13173            var prevHoverState = _this._hoverState;
13174            _this._hoverState = null;
13175            $$$1(_this.element).trigger(_this.constructor.Event.SHOWN);
13176
13177            if (prevHoverState === HoverState.OUT) {
13178              _this._leave(null, _this);
13179            }
13180          };
13181
13182          if ($$$1(this.tip).hasClass(ClassName.FADE)) {
13183            var transitionDuration = Util.getTransitionDurationFromElement(this.tip);
13184            $$$1(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
13185          } else {
13186            complete();
13187          }
13188        }
13189      };
13190
13191      _proto.hide = function hide(callback) {
13192        var _this2 = this;
13193
13194        var tip = this.getTipElement();
13195        var hideEvent = $$$1.Event(this.constructor.Event.HIDE);
13196
13197        var complete = function complete() {
13198          if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {
13199            tip.parentNode.removeChild(tip);
13200          }
13201
13202          _this2._cleanTipClass();
13203
13204          _this2.element.removeAttribute('aria-describedby');
13205
13206          $$$1(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
13207
13208          if (_this2._popper !== null) {
13209            _this2._popper.destroy();
13210          }
13211
13212          if (callback) {
13213            callback();
13214          }
13215        };
13216
13217        $$$1(this.element).trigger(hideEvent);
13218
13219        if (hideEvent.isDefaultPrevented()) {
13220          return;
13221        }
13222
13223        $$$1(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra
13224        // empty mouseover listeners we added for iOS support
13225
13226        if ('ontouchstart' in document.documentElement) {
13227          $$$1(document.body).children().off('mouseover', null, $$$1.noop);
13228        }
13229
13230        this._activeTrigger[Trigger.CLICK] = false;
13231        this._activeTrigger[Trigger.FOCUS] = false;
13232        this._activeTrigger[Trigger.HOVER] = false;
13233
13234        if ($$$1(this.tip).hasClass(ClassName.FADE)) {
13235          var transitionDuration = Util.getTransitionDurationFromElement(tip);
13236          $$$1(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
13237        } else {
13238          complete();
13239        }
13240
13241        this._hoverState = '';
13242      };
13243
13244      _proto.update = function update() {
13245        if (this._popper !== null) {
13246          this._popper.scheduleUpdate();
13247        }
13248      }; // Protected
13249
13250
13251      _proto.isWithContent = function isWithContent() {
13252        return Boolean(this.getTitle());
13253      };
13254
13255      _proto.addAttachmentClass = function addAttachmentClass(attachment) {
13256        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
13257      };
13258
13259      _proto.getTipElement = function getTipElement() {
13260        this.tip = this.tip || $$$1(this.config.template)[0];
13261        return this.tip;
13262      };
13263
13264      _proto.setContent = function setContent() {
13265        var tip = this.getTipElement();
13266        this.setElementContent($$$1(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle());
13267        $$$1(tip).removeClass(ClassName.FADE + " " + ClassName.SHOW);
13268      };
13269
13270      _proto.setElementContent = function setElementContent($element, content) {
13271        var html = this.config.html;
13272
13273        if (typeof content === 'object' && (content.nodeType || content.jquery)) {
13274          // Content is a DOM node or a jQuery
13275          if (html) {
13276            if (!$$$1(content).parent().is($element)) {
13277              $element.empty().append(content);
13278            }
13279          } else {
13280            $element.text($$$1(content).text());
13281          }
13282        } else {
13283          $element[html ? 'html' : 'text'](content);
13284        }
13285      };
13286
13287      _proto.getTitle = function getTitle() {
13288        var title = this.element.getAttribute('data-original-title');
13289
13290        if (!title) {
13291          title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;
13292        }
13293
13294        return title;
13295      }; // Private
13296
13297
13298      _proto._getAttachment = function _getAttachment(placement) {
13299        return AttachmentMap[placement.toUpperCase()];
13300      };
13301
13302      _proto._setListeners = function _setListeners() {
13303        var _this3 = this;
13304
13305        var triggers = this.config.trigger.split(' ');
13306        triggers.forEach(function (trigger) {
13307          if (trigger === 'click') {
13308            $$$1(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) {
13309              return _this3.toggle(event);
13310            });
13311          } else if (trigger !== Trigger.MANUAL) {
13312            var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
13313            var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
13314            $$$1(_this3.element).on(eventIn, _this3.config.selector, function (event) {
13315              return _this3._enter(event);
13316            }).on(eventOut, _this3.config.selector, function (event) {
13317              return _this3._leave(event);
13318            });
13319          }
13320
13321          $$$1(_this3.element).closest('.modal').on('hide.bs.modal', function () {
13322            return _this3.hide();
13323          });
13324        });
13325
13326        if (this.config.selector) {
13327          this.config = _objectSpread({}, this.config, {
13328            trigger: 'manual',
13329            selector: ''
13330          });
13331        } else {
13332          this._fixTitle();
13333        }
13334      };
13335
13336      _proto._fixTitle = function _fixTitle() {
13337        var titleType = typeof this.element.getAttribute('data-original-title');
13338
13339        if (this.element.getAttribute('title') || titleType !== 'string') {
13340          this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');
13341          this.element.setAttribute('title', '');
13342        }
13343      };
13344
13345      _proto._enter = function _enter(event, context) {
13346        var dataKey = this.constructor.DATA_KEY;
13347        context = context || $$$1(event.currentTarget).data(dataKey);
13348
13349        if (!context) {
13350          context = new this.constructor(event.currentTarget, this._getDelegateConfig());
13351          $$$1(event.currentTarget).data(dataKey, context);
13352        }
13353
13354        if (event) {
13355          context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;
13356        }
13357
13358        if ($$$1(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {
13359          context._hoverState = HoverState.SHOW;
13360          return;
13361        }
13362
13363        clearTimeout(context._timeout);
13364        context._hoverState = HoverState.SHOW;
13365
13366        if (!context.config.delay || !context.config.delay.show) {
13367          context.show();
13368          return;
13369        }
13370
13371        context._timeout = setTimeout(function () {
13372          if (context._hoverState === HoverState.SHOW) {
13373            context.show();
13374          }
13375        }, context.config.delay.show);
13376      };
13377
13378      _proto._leave = function _leave(event, context) {
13379        var dataKey = this.constructor.DATA_KEY;
13380        context = context || $$$1(event.currentTarget).data(dataKey);
13381
13382        if (!context) {
13383          context = new this.constructor(event.currentTarget, this._getDelegateConfig());
13384          $$$1(event.currentTarget).data(dataKey, context);
13385        }
13386
13387        if (event) {
13388          context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
vendor: 11,435 bytes, lines 13389-13803
13389        }
13390
13391        if (context._isWithActiveTrigger()) {
13392          return;
13393        }
13394
13395        clearTimeout(context._timeout);
13396        context._hoverState = HoverState.OUT;
13397
13398        if (!context.config.delay || !context.config.delay.hide) {
13399          context.hide();
13400          return;
13401        }
13402
13403        context._timeout = setTimeout(function () {
13404          if (context._hoverState === HoverState.OUT) {
13405            context.hide();
13406          }
13407        }, context.config.delay.hide);
13408      };
13409
13410      _proto._isWithActiveTrigger = function _isWithActiveTrigger() {
13411        for (var trigger in this._activeTrigger) {
13412          if (this._activeTrigger[trigger]) {
13413            return true;
13414          }
13415        }
13416
13417        return false;
13418      };
13419
13420      _proto._getConfig = function _getConfig(config) {
13421        config = _objectSpread({}, this.constructor.Default, $$$1(this.element).data(), typeof config === 'object' && config ? config : {});
13422
13423        if (typeof config.delay === 'number') {
13424          config.delay = {
13425            show: config.delay,
13426            hide: config.delay
13427          };
13428        }
13429
13430        if (typeof config.title === 'number') {
13431          config.title = config.title.toString();
13432        }
13433
13434        if (typeof config.content === 'number') {
13435          config.content = config.content.toString();
13436        }
13437
13438        Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
13439        return config;
13440      };
13441
13442      _proto._getDelegateConfig = function _getDelegateConfig() {
13443        var config = {};
13444
13445        if (this.config) {
13446          for (var key in this.config) {
13447            if (this.constructor.Default[key] !== this.config[key]) {
13448              config[key] = this.config[key];
13449            }
13450          }
13451        }
13452
13453        return config;
13454      };
13455
13456      _proto._cleanTipClass = function _cleanTipClass() {
13457        var $tip = $$$1(this.getTipElement());
13458        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
13459
13460        if (tabClass !== null && tabClass.length) {
13461          $tip.removeClass(tabClass.join(''));
13462        }
13463      };
13464
13465      _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {
13466        var popperInstance = popperData.instance;
13467        this.tip = popperInstance.popper;
13468
13469        this._cleanTipClass();
13470
13471        this.addAttachmentClass(this._getAttachment(popperData.placement));
13472      };
13473
13474      _proto._fixTransition = function _fixTransition() {
13475        var tip = this.getTipElement();
13476        var initConfigAnimation = this.config.animation;
13477
13478        if (tip.getAttribute('x-placement') !== null) {
13479          return;
13480        }
13481
13482        $$$1(tip).removeClass(ClassName.FADE);
13483        this.config.animation = false;
13484        this.hide();
13485        this.show();
13486        this.config.animation = initConfigAnimation;
13487      }; // Static
13488
13489
13490      Tooltip._jQueryInterface = function _jQueryInterface(config) {
13491        return this.each(function () {
13492          var data = $$$1(this).data(DATA_KEY);
13493
13494          var _config = typeof config === 'object' && config;
13495
13496          if (!data && /dispose|hide/.test(config)) {
13497            return;
13498          }
13499
13500          if (!data) {
13501            data = new Tooltip(this, _config);
13502            $$$1(this).data(DATA_KEY, data);
13503          }
13504
13505          if (typeof config === 'string') {
13506            if (typeof data[config] === 'undefined') {
13507              throw new TypeError("No method named \"" + config + "\"");
13508            }
13509
13510            data[config]();
13511          }
13512        });
13513      };
13514
13515      _createClass(Tooltip, null, [{
13516        key: "VERSION",
13517        get: function get() {
13518          return VERSION;
13519        }
13520      }, {
13521        key: "Default",
13522        get: function get() {
13523          return Default;
13524        }
13525      }, {
13526        key: "NAME",
13527        get: function get() {
13528          return NAME;
13529        }
13530      }, {
13531        key: "DATA_KEY",
13532        get: function get() {
13533          return DATA_KEY;
13534        }
13535      }, {
13536        key: "Event",
13537        get: function get() {
13538          return Event;
13539        }
13540      }, {
13541        key: "EVENT_KEY",
13542        get: function get() {
13543          return EVENT_KEY;
13544        }
13545      }, {
13546        key: "DefaultType",
13547        get: function get() {
13548          return DefaultType;
13549        }
13550      }]);
13551
13552      return Tooltip;
13553    }();
13554    /**
13555     * ------------------------------------------------------------------------
13556     * jQuery
13557     * ------------------------------------------------------------------------
13558     */
13559
13560
13561    $$$1.fn[NAME] = Tooltip._jQueryInterface;
13562    $$$1.fn[NAME].Constructor = Tooltip;
13563
13564    $$$1.fn[NAME].noConflict = function () {
13565      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
13566      return Tooltip._jQueryInterface;
13567    };
13568
13569    return Tooltip;
13570  }($, Popper);
13571
13572  /**
13573   * --------------------------------------------------------------------------
13574   * Bootstrap (v4.1.3): popover.js
13575   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
13576   * --------------------------------------------------------------------------
13577   */
13578
13579  var Popover = function ($$$1) {
13580    /**
13581     * ------------------------------------------------------------------------
13582     * Constants
13583     * ------------------------------------------------------------------------
13584     */
13585    var NAME = 'popover';
13586    var VERSION = '4.1.3';
13587    var DATA_KEY = 'bs.popover';
13588    var EVENT_KEY = "." + DATA_KEY;
13589    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
13590    var CLASS_PREFIX = 'bs-popover';
13591    var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g');
13592
13593    var Default = _objectSpread({}, Tooltip.Default, {
13594      placement: 'right',
13595      trigger: 'click',
13596      content: '',
13597      template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
13598    });
13599
13600    var DefaultType = _objectSpread({}, Tooltip.DefaultType, {
13601      content: '(string|element|function)'
13602    });
13603
13604    var ClassName = {
13605      FADE: 'fade',
13606      SHOW: 'show'
13607    };
13608    var Selector = {
13609      TITLE: '.popover-header',
13610      CONTENT: '.popover-body'
13611    };
13612    var Event = {
13613      HIDE: "hide" + EVENT_KEY,
13614      HIDDEN: "hidden" + EVENT_KEY,
13615      SHOW: "show" + EVENT_KEY,
13616      SHOWN: "shown" + EVENT_KEY,
13617      INSERTED: "inserted" + EVENT_KEY,
13618      CLICK: "click" + EVENT_KEY,
13619      FOCUSIN: "focusin" + EVENT_KEY,
13620      FOCUSOUT: "focusout" + EVENT_KEY,
13621      MOUSEENTER: "mouseenter" + EVENT_KEY,
13622      MOUSELEAVE: "mouseleave" + EVENT_KEY
13623      /**
13624       * ------------------------------------------------------------------------
13625       * Class Definition
13626       * ------------------------------------------------------------------------
13627       */
13628
13629    };
13630
13631    var Popover =
13632    /*#__PURE__*/
13633    function (_Tooltip) {
13634      _inheritsLoose(Popover, _Tooltip);
13635
13636      function Popover() {
13637        return _Tooltip.apply(this, arguments) || this;
13638      }
13639
13640      var _proto = Popover.prototype;
13641
13642      // Overrides
13643      _proto.isWithContent = function isWithContent() {
13644        return this.getTitle() || this._getContent();
13645      };
13646
13647      _proto.addAttachmentClass = function addAttachmentClass(attachment) {
13648        $$$1(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment);
13649      };
13650
13651      _proto.getTipElement = function getTipElement() {
13652        this.tip = this.tip || $$$1(this.config.template)[0];
13653        return this.tip;
13654      };
13655
13656      _proto.setContent = function setContent() {
13657        var $tip = $$$1(this.getTipElement()); // We use append for html objects to maintain js events
13658
13659        this.setElementContent($tip.find(Selector.TITLE), this.getTitle());
13660
13661        var content = this._getContent();
13662
13663        if (typeof content === 'function') {
13664          content = content.call(this.element);
13665        }
13666
13667        this.setElementContent($tip.find(Selector.CONTENT), content);
13668        $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW);
13669      }; // Private
13670
13671
13672      _proto._getContent = function _getContent() {
13673        return this.element.getAttribute('data-content') || this.config.content;
13674      };
13675
13676      _proto._cleanTipClass = function _cleanTipClass() {
13677        var $tip = $$$1(this.getTipElement());
13678        var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
13679
13680        if (tabClass !== null && tabClass.length > 0) {
13681          $tip.removeClass(tabClass.join(''));
13682        }
13683      }; // Static
13684
13685
13686      Popover._jQueryInterface = function _jQueryInterface(config) {
13687        return this.each(function () {
13688          var data = $$$1(this).data(DATA_KEY);
13689
13690          var _config = typeof config === 'object' ? config : null;
13691
13692          if (!data && /destroy|hide/.test(config)) {
13693            return;
13694          }
13695
13696          if (!data) {
13697            data = new Popover(this, _config);
13698            $$$1(this).data(DATA_KEY, data);
13699          }
13700
13701          if (typeof config === 'string') {
13702            if (typeof data[config] === 'undefined') {
13703              throw new TypeError("No method named \"" + config + "\"");
13704            }
13705
13706            data[config]();
13707          }
13708        });
13709      };
13710
13711      _createClass(Popover, null, [{
13712        key: "VERSION",
13713        // Getters
13714        get: function get() {
13715          return VERSION;
13716        }
13717      }, {
13718        key: "Default",
13719        get: function get() {
13720          return Default;
13721        }
13722      }, {
13723        key: "NAME",
13724        get: function get() {
13725          return NAME;
13726        }
13727      }, {
13728        key: "DATA_KEY",
13729        get: function get() {
13730          return DATA_KEY;
13731        }
13732      }, {
13733        key: "Event",
13734        get: function get() {
13735          return Event;
13736        }
13737      }, {
13738        key: "EVENT_KEY",
13739        get: function get() {
13740          return EVENT_KEY;
13741        }
13742      }, {
13743        key: "DefaultType",
13744        get: function get() {
13745          return DefaultType;
13746        }
13747      }]);
13748
13749      return Popover;
13750    }(Tooltip);
13751    /**
13752     * ------------------------------------------------------------------------
13753     * jQuery
13754     * ------------------------------------------------------------------------
13755     */
13756
13757
13758    $$$1.fn[NAME] = Popover._jQueryInterface;
13759    $$$1.fn[NAME].Constructor = Popover;
13760
13761    $$$1.fn[NAME].noConflict = function () {
13762      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
13763      return Popover._jQueryInterface;
13764    };
13765
13766    return Popover;
13767  }($);
13768
13769  /**
13770   * --------------------------------------------------------------------------
13771   * Bootstrap (v4.1.3): scrollspy.js
13772   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
13773   * --------------------------------------------------------------------------
13774   */
13775
13776  var ScrollSpy = function ($$$1) {
13777    /**
13778     * ------------------------------------------------------------------------
13779     * Constants
13780     * ------------------------------------------------------------------------
13781     */
13782    var NAME = 'scrollspy';
13783    var VERSION = '4.1.3';
13784    var DATA_KEY = 'bs.scrollspy';
13785    var EVENT_KEY = "." + DATA_KEY;
13786    var DATA_API_KEY = '.data-api';
13787    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
13788    var Default = {
13789      offset: 10,
13790      method: 'auto',
13791      target: ''
13792    };
13793    var DefaultType = {
13794      offset: 'number',
13795      method: 'string',
13796      target: '(string|element)'
13797    };
13798    var Event = {
13799      ACTIVATE: "activate" + EVENT_KEY,
13800      SCROLL: "scroll" + EVENT_KEY,
13801      LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
13802    };
13803    var ClassName = {
13804      DROPDOWN_ITEM: 'dropdown-item',
13805      DROPDOWN_MENU: 'dropdown-menu',
13806      ACTIVE: 'active'
13807    };
13808    var Selector = {
13809      DATA_SPY: '[data-spy="scroll"]',
13810      ACTIVE: '.active',
13811      NAV_LIST_GROUP: '.nav, .list-group',
13812      NAV_LINKS: '.nav-link',
13813      NAV_ITEMS: '.nav-item',
13814      LIST_ITEMS: '.list-group-item',
13815      DROPDOWN: '.dropdown',
13816      DROPDOWN_ITEMS: '.dropdown-item',
13817      DROPDOWN_TOGGLE: '.dropdown-toggle'
13818    };
13819    var OffsetMethod = {
13820      OFFSET: 'offset',
13821      POSITION: 'position'
13822      /**
13823       * ------------------------------------------------------------------------
13824       * Class Definition
13825       * ------------------------------------------------------------------------
13826       */
13827
13828    };
13829
13830    var ScrollSpy =
13831    /*#__PURE__*/
13832    function () {
13833      function ScrollSpy(element, config) {
13834        var _this = this;
13835
13836        this._element = element;
13837        this._scrollElement = element.tagName === 'BODY' ? window : element;
13838        this._config = this._getConfig(config);
13839        this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS);
13840        this._offsets = [];
13841        this._targets = [];
13842        this._activeTarget = null;
13843        this._scrollHeight = 0;
13844        $$$1(this._scrollElement).on(Event.SCROLL, function (event) {
13845          return _this._process(event);
13846        });
13847        this.refresh();
13848
13849        this._process();
13850      } // Getters
13851
13852
13853      var _proto = ScrollSpy.prototype;
13854
13855      // Public
13856      _proto.refresh = function refresh() {
13857        var _this2 = this;
13858
13859        var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
13860        var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
13861        var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
13862        this._offsets = [];
13863        this._targets = [];
13864        this._scrollHeight = this._getScrollHeight();
13865        var targets = [].slice.call(document.querySelectorAll(this._selector));
13866        targets.map(function (element) {
13867          var target;
13868          var targetSelector = Util.getSelectorFromElement(element);
13869
13870          if (targetSelector) {
13871            target = document.querySelector(targetSelector);
13872          }
13873
13874          if (target) {
13875            var targetBCR = target.getBoundingClientRect();
13876
13877            if (targetBCR.width || targetBCR.height) {
13878              // TODO (fat): remove sketch reliance on jQuery position/offset
13879              return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];
13880            }
13881          }
13882
13883          return null;
13884        }).filter(function (item) {
13885          return item;
13886        }).sort(function (a, b) {
13887          return a[0] - b[0];
13888        }
vendor: 3,602 bytes, lines 13888-13997
13888).forEach(function (item) {
13889          _this2._offsets.push(item[0]);
13890
13891          _this2._targets.push(item[1]);
13892        });
13893      };
13894
13895      _proto.dispose = function dispose() {
13896        $$$1.removeData(this._element, DATA_KEY);
13897        $$$1(this._scrollElement).off(EVENT_KEY);
13898        this._element = null;
13899        this._scrollElement = null;
13900        this._config = null;
13901        this._selector = null;
13902        this._offsets = null;
13903        this._targets = null;
13904        this._activeTarget = null;
13905        this._scrollHeight = null;
13906      }; // Private
13907
13908
13909      _proto._getConfig = function _getConfig(config) {
13910        config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
13911
13912        if (typeof config.target !== 'string') {
13913          var id = $$$1(config.target).attr('id');
13914
13915          if (!id) {
13916            id = Util.getUID(NAME);
13917            $$$1(config.target).attr('id', id);
13918          }
13919
13920          config.target = "#" + id;
13921        }
13922
13923        Util.typeCheckConfig(NAME, config, DefaultType);
13924        return config;
13925      };
13926
13927      _proto._getScrollTop = function _getScrollTop() {
13928        return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
13929      };
13930
13931      _proto._getScrollHeight = function _getScrollHeight() {
13932        return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
13933      };
13934
13935      _proto._getOffsetHeight = function _getOffsetHeight() {
13936        return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
13937      };
13938
13939      _proto._process = function _process() {
13940        var scrollTop = this._getScrollTop() + this._config.offset;
13941
13942        var scrollHeight = this._getScrollHeight();
13943
13944        var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
13945
13946        if (this._scrollHeight !== scrollHeight) {
13947          this.refresh();
13948        }
13949
13950        if (scrollTop >= maxScroll) {
13951          var target = this._targets[this._targets.length - 1];
13952
13953          if (this._activeTarget !== target) {
13954            this._activate(target);
13955          }
13956
13957          return;
13958        }
13959
13960        if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
13961          this._activeTarget = null;
13962
13963          this._clear();
13964
13965          return;
13966        }
13967
13968        var offsetLength = this._offsets.length;
13969
13970        for (var i = offsetLength; i--;) {
13971          var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);
13972
13973          if (isActiveTarget) {
13974            this._activate(this._targets[i]);
13975          }
13976        }
13977      };
13978
13979      _proto._activate = function _activate(target) {
13980        this._activeTarget = target;
13981
13982        this._clear();
13983
13984        var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style
13985
13986
13987        queries = queries.map(function (selector) {
13988          return selector + "[data-target=\"" + target + "\"]," + (selector + "[href=\"" + target + "\"]");
13989        });
13990        var $link = $$$1([].slice.call(document.querySelectorAll(queries.join(','))));
13991
13992        if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
13993          $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
13994          $link.addClass(ClassName.ACTIVE);
13995        } else {
13996          // Set triggered link as active
13997          $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active
13998          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
13999
14000          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item
14001
14002          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
14003        }
14004
14005        $$$1(this._scrollElement).trigger(Event.ACTIVATE, {
14006          relatedTarget: target
14007        });
14008      };
14009
14010      _proto._clear = function _clear() {
14011        var nodes = [].slice.call(document.querySelectorAll(this._selector));
14012        $$$1(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
14013      }; // Static
14014
14015
14016      ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
14017        return this.each(function () {
14018          var data = $$$1(this).data(DATA_KEY);
14019
14020          var _config = typeof config === 'object' && config;
14021
14022          if (!data) {
14023            data = new ScrollSpy(this, _config);
14024            $$$1(this).data(DATA_KEY, data);
14025          }
14026
14027          if (typeof config === 'string') {
14028            if (typeof data[config] === 'undefined') {
14029              throw new TypeError("No method named \"" + config + "\"");
14030            }
14031
14032            data[config]();
14033          }
14034        });
14035      };
14036
14037      _createClass(ScrollSpy, null, [{
14038        key: "VERSION",
14039        get: function get() {
14040          return VERSION;
14041        }
14042      }, {
14043        key: "Default",
14044        get: function get() {
14045          return Default;
14046        }
14047      }]);
14048
14049      return ScrollSpy;
14050    }();
14051    /**
14052     * ------------------------------------------------------------------------
14053     * Data Api implementation
14054     * ------------------------------------------------------------------------
14055     */
14056
14057
14058    $$$1(window).on(Event.LOAD_DATA_API, function () {
14059      var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));
14060      var scrollSpysLength = scrollSpys.length;
14061
14062      for (var i = scrollSpysLength; i--;) {
14063        var $spy = $$$1(scrollSpys[i]);
14064
14065        ScrollSpy._jQueryInterface.call($spy, $spy.data());
14066      }
14067    });
14068    /**
14069     * ------------------------------------------------------------------------
14070     * jQuery
14071     * ------------------------------------------------------------------------
14072     */
14073
14074    $$$1.fn[NAME] = ScrollSpy._jQueryInterface;
14075    $$$1.fn[NAME].Constructor = ScrollSpy;
14076
14077    $$$1.fn[NAME].noConflict = function () {
14078      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
14079      return ScrollSpy._jQueryInterface;
14080    };
14081
14082    return ScrollSpy;
14083  }($);
14084
14085  /**
14086   * --------------------------------------------------------------------------
14087   * Bootstrap (v4.1.3): tab.js
14088   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
14089   * --------------------------------------------------------------------------
14090   */
14091
14092  var Tab = function ($$$1) {
14093    /**
14094     * ------------------------------------------------------------------------
14095     * Constants
14096     * ------------------------------------------------------------------------
14097     */
14098    var NAME = 'tab';
14099    var VERSION = '4.1.3';
14100    var DATA_KEY = 'bs.tab';
14101    var EVENT_KEY = "." + DATA_KEY;
14102    var DATA_API_KEY = '.data-api';
14103    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
14104    var Event = {
14105      HIDE: "hide" + EVENT_KEY,
14106      HIDDEN: "hidden" + EVENT_KEY,
14107      SHOW: "show" + EVENT_KEY,
14108      SHOWN: "shown" + EVENT_KEY,
14109      CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
14110    };
14111    var ClassName = {
14112      DROPDOWN_MENU: 'dropdown-menu',
14113      ACTIVE: 'active',
14114      DISABLED: 'disabled',
14115      FADE: 'fade',
14116      SHOW: 'show'
14117    };
14118    var Selector = {
14119      DROPDOWN: '.dropdown',
14120      NAV_LIST_GROUP: '.nav, .list-group',
14121      ACTIVE: '.active',
14122      ACTIVE_UL: '> li > .active',
14123      DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
14124      DROPDOWN_TOGGLE: '.dropdown-toggle',
14125      DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
14126      /**
14127       * ------------------------------------------------------------------------
14128       * Class Definition
14129       * ------------------------------------------------------------------------
14130       */
14131
14132    };
14133
14134    var Tab =
14135    /*#__PURE__*/
14136    function () {
14137      function Tab(element) {
14138        this._element = element;
14139      } // Getters
14140
14141
14142      var _proto = Tab.prototype;
14143
14144      // Public
14145      _proto.show = function show() {
14146        var _this = this;
14147
14148        if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $$$1(this._element).hasClass(ClassName.ACTIVE) || $$$1(this._element).hasClass(ClassName.DISABLED)) {
14149          return;
14150        }
14151
14152        var target;
14153        var previous;
14154        var listElement = $$$1(this._element).closest(Selector.NAV_LIST_GROUP)[0];
14155        var selector = Util.getSelectorFromElement(this._element);
14156
14157        if (listElement) {
14158          var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
14159          previous = $$$1.makeArray($$$1(listElement).find(itemSelector));
14160          previous = previous[previous.length - 1];
14161        }
14162
14163        var hideEvent = $$$1.Event(Event.HIDE, {
14164          relatedTarget: this._element
14165        });
14166        var showEvent = $$$1.Event(Event.SHOW, {
14167          relatedTarget: previous
14168        });
14169
14170        if (previous) {
14171          $$$1(previous).trigger(hideEvent);
14172        }
14173
14174        $$$1(this._element).trigger(showEvent);
14175
14176        if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
14177          return;
14178        }
14179
14180        if (selector) {
14181          target = document.querySelector(selector);
14182        }
14183
14184        this._activate(this._element, listElement);
14185
14186        var complete = function complete() {
14187          var hiddenEvent = $$$1.Event(Event.HIDDEN, {
14188            relatedTarget: _this._element
14189          });
14190          var shownEvent = $$$1.Event(Event.SHOWN, {
14191            relatedTarget: previous
14192          });
14193          $$$1(previous).trigger(hiddenEvent);
14194          $$$1(_this._element).trigger(shownEvent);
14195        };
14196
14197        if (target) {
14198          this._activate(target, target.parentNode, complete);
14199        } else {
14200          complete();
14201        }
14202      };
14203
14204      _proto.dispose = function dispose() {
14205        $$$1.removeData(this._element, DATA_KEY);
14206        this._element = null;
14207      }; // Private
14208
14209
14210      _proto._activate = function _activate(element, container, callback) {
14211        var _this2 = this;
14212
14213        var activeElements;
14214
14215        if (container.nodeName === 'UL') {
14216          activeElements = $$$1(container).find(Selector.ACTIVE_UL);
14217        } else {
14218          activeElements = $$$1(container).children(Selector.ACTIVE);
14219        }
14220
14221        var active = activeElements[0];
14222        var isTransitioning = callback && active && $$$1(active).hasClass(ClassName.FADE);
14223
14224        var complete = function complete() {
14225          return _this2._transitionComplete(element, active, callback);
14226        };
14227
14228        if (active && isTransitioning) {
14229          var transitionDuration = Util.getTransitionDurationFromElement(active);
14230          $$$1(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
14231        } else {
14232          complete();
14233        }
14234      };
14235
14236      _proto._transitionComplete = function _transitionComplete(element, active, callback) {
14237        if (active) {
14238          $$$1(active).removeClass(ClassName.SHOW + " " + ClassName.ACTIVE);
14239          var dropdownChild = $$$1(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
14240
14241          if (dropdownChild) {
14242            $$$1(dropdownChild).removeClass(ClassName.ACTIVE);
14243          }
14244
14245          if (active.getAttribute('role') === 'tab') {
14246            active.setAttribute('aria-selected', false);
14247          }
14248        }
14249
14250        $$$1(element).addClass(ClassName.ACTIVE);
14251
14252        if (element.getAttribute('role') === 'tab') {
14253          element.setAttribute('aria-selected', true);
14254        }
14255
14256        Util.reflow(element);
14257        $$$1(element).addClass(ClassName.SHOW);
14258
14259        if (element.parentNode && $$$1(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
14260          var dropdownElement = $$$1(element).closest(Selector.DROPDOWN)[0];
14261
14262          if (dropdownElement) {
14263            var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE));
14264            $$$1(dropdownToggleList).addClass(ClassName.ACTIVE);
14265          }
14266
14267          element.setAttribute('aria-expanded', true);
14268        }
14269
14270        if (callback) {
14271          callback();
14272        }
14273      }; // Static
14274
14275
14276      Tab._jQueryInterface = function _jQueryInterface(config) {
14277        return this.each(function () {
14278          var $this = $$$1(this);
14279          var data = $this.data(DATA_KEY);
14280
14281          if (!data) {
14282            data = new Tab(this);
14283            $this.data(DATA_KEY, data);
14284          }
14285
14286          if (typeof config === 'string') {
14287            if (typeof data[config] === 'undefined') {
14288              throw new TypeError("No method named \"" + config + "\"");
14289            }
14290
14291            data[config]();
14292          }
14293        });
14294      };
14295
14296      _createClass(Tab, null, [{
14297        key: "VERSION",
14298        get: function get() {
14299          return VERSION;
14300        }
14301      }]);
14302
14303      return Tab;
14304    }();
14305    /**
14306     * ------------------------------------------------------------------------
14307     * Data Api implementation
14308     * ------------------------------------------------------------------------
14309     */
14310
14311
14312    $$$1(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
14313      event.preventDefault();
14314
14315      Tab._jQueryInterface.call($$$1(this), 'show');
14316    });
14317    /**
14318     * ------------------------------------------------------------------------
14319     * jQuery
14320     * ------------------------------------------------------------------------
14321     */
14322
14323    $$$1.fn[NAME] = Tab._jQueryInterface;
14324    $$$1.fn[NAME].Constructor = Tab;
14325
14326    $$$1.fn[NAME].noConflict = function () {
14327      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
14328      return Tab._jQueryInterface;
14329    };
14330
14331    return Tab;
14332  }($);
14333
14334  /**
14335   * --------------------------------------------------------------------------
14336   * Bootstrap (v4.1.3): index.js
14337   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
14338   * --------------------------------------------------------------------------
14339   */
14340
14341  (function ($$$1) {
14342    if (typeof $$$1 === 'undefined') {
14343      throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.');
14344    }
14345
14346    var version = $$$1.fn.jquery.split(' ')[0].split('.');
14347    var minMajor = 1;
14348    var ltMajor = 2;
14349    var minMinor = 9;
14350    var minPatch = 1;
14351    var maxMajor = 4;
14352
14353    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {
14354      throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');
14355    }
14356  })($);
14357
14358  exports.Util = Util;
14359  exports.Alert = Alert;
14360  exports.Button = Button;
14361  exports.Carousel = Carousel;
14362  exports.Collapse = Collapse;
14363  exports.Dropdown = Dropdown;
14364  exports.Modal = Modal;
14365  exports.Popover = Popover;
14366  exports.Scrollspy = ScrollSpy;
14367  exports.Tab = Tab;
14368  exports.Tooltip = Tooltip;
14369
14370  Object.defineProperty(exports, '__esModule', { value: true });
14371
14372})));
14373//# sourceMappingURL=bootstrap.js.map
14374
14375
14376/***/ }),
14377/* 5 */
14378/***/ (function(module, __webpack_exports__, __webpack_require__) {
14379
14380"use strict";
14381Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
14382/* WEBPACK VAR INJECTION */(function(global) {/**!
14383 * @fileOverview Kickass library to create and place poppers near their reference elements.
14384 * @version 1.14.4
14385 * @license
14386 * Copyright (c) 2016 Federico Zivolo and contributors
14387 *
14388 * Permission is hereby granted, free of charge, to any person obtaining a copy
14389 * of this software and associated documentation files (the "Software"), to deal
14390 * in the Software without restriction, including without limitation the rights
14391 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14392 * copies of the Software, and to permit persons to whom the Software is
14393 * furnished to do so, subject to the following conditions:
14394 *
14395 * The above copyright notice and this permission notice shall be included in all
14396 * copies or substantial portions of the Software.
14397 *
14398 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14399 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14400 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14401 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14402 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
14403 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
14404 * SOFTWARE.
14405 */
14406var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';
14407
14408var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];
14409var timeoutDuration = 0;
14410for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {
14411  if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {
14412    timeoutDuration = 1;
14413    break;
14414  }
14415}
14416
14417function microtaskDebounce(fn) {
14418  var called = false;
vendor: 4,080 bytes, lines 14419-14582
14419  return function () {
14420    if (called) {
14421      return;
14422    }
14423    called = true;
14424    window.Promise.resolve().then(function () {
14425      called = false;
14426      fn();
14427    });
14428  };
14429}
14430
14431function taskDebounce(fn) {
14432  var scheduled = false;
14433  return function () {
14434    if (!scheduled) {
14435      scheduled = true;
14436      setTimeout(function () {
14437        scheduled = false;
14438        fn();
14439      }, timeoutDuration);
14440    }
14441  };
14442}
14443
14444var supportsMicroTasks = isBrowser && window.Promise;
14445
14446/**
14447* Create a debounced version of a method, that's asynchronously deferred
14448* but called in the minimum time possible.
14449*
14450* @method
14451* @memberof Popper.Utils
14452* @argument {Function} fn
14453* @returns {Function}
14454*/
14455var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;
14456
14457/**
14458 * Check if the given variable is a function
14459 * @method
14460 * @memberof Popper.Utils
14461 * @argument {Any} functionToCheck - variable to check
14462 * @returns {Boolean} answer to: is a function?
14463 */
14464function isFunction(functionToCheck) {
14465  var getType = {};
14466  return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
14467}
14468
14469/**
14470 * Get CSS computed property of the given element
14471 * @method
14472 * @memberof Popper.Utils
14473 * @argument {Eement} element
14474 * @argument {String} property
14475 */
14476function getStyleComputedProperty(element, property) {
14477  if (element.nodeType !== 1) {
14478    return [];
14479  }
14480  // NOTE: 1 DOM access here
14481  var css = getComputedStyle(element, null);
14482  return property ? css[property] : css;
14483}
14484
14485/**
14486 * Returns the parentNode or the host of the element
14487 * @method
14488 * @memberof Popper.Utils
14489 * @argument {Element} element
14490 * @returns {Element} parent
14491 */
14492function getParentNode(element) {
14493  if (element.nodeName === 'HTML') {
14494    return element;
14495  }
14496  return element.parentNode || element.host;
14497}
14498
14499/**
14500 * Returns the scrolling parent of the given element
14501 * @method
14502 * @memberof Popper.Utils
14503 * @argument {Element} element
14504 * @returns {Element} scroll parent
14505 */
14506function getScrollParent(element) {
14507  // Return body, `getScroll` will take care to get the correct `scrollTop` from it
14508  if (!element) {
14509    return document.body;
14510  }
14511
14512  switch (element.nodeName) {
14513    case 'HTML':
14514    case 'BODY':
14515      return element.ownerDocument.body;
14516    case '#document':
14517      return element.body;
14518  }
14519
14520  // Firefox want us to check `-x` and `-y` variations as well
14521
14522  var _getStyleComputedProp = getStyleComputedProperty(element),
14523      overflow = _getStyleComputedProp.overflow,
14524      overflowX = _getStyleComputedProp.overflowX,
14525      overflowY = _getStyleComputedProp.overflowY;
14526
14527  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {
14528    return element;
14529  }
14530
14531  return getScrollParent(getParentNode(element));
14532}
14533
14534var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);
14535var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);
14536
14537/**
14538 * Determines if the browser is Internet Explorer
14539 * @method
14540 * @memberof Popper.Utils
14541 * @param {Number} version to check
14542 * @returns {Boolean} isIE
14543 */
14544function isIE(version) {
14545  if (version === 11) {
14546    return isIE11;
14547  }
14548  if (version === 10) {
14549    return isIE10;
14550  }
14551  return isIE11 || isIE10;
14552}
14553
14554/**
14555 * Returns the offset parent of the given element
14556 * @method
14557 * @memberof Popper.Utils
14558 * @argument {Element} element
14559 * @returns {Element} offset parent
14560 */
14561function getOffsetParent(element) {
14562  if (!element) {
14563    return document.documentElement;
14564  }
14565
14566  var noOffsetParent = isIE(10) ? document.body : null;
14567
14568  // NOTE: 1 DOM access here
14569  var offsetParent = element.offsetParent;
14570  // Skip hidden elements which don't have an offsetParent
14571  while (offsetParent === noOffsetParent && element.nextElementSibling) {
14572    offsetParent = (element = element.nextElementSibling).offsetParent;
14573  }
14574
14575  var nodeName = offsetParent && offsetParent.nodeName;
14576
14577  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {
14578    return element ? element.ownerDocument.documentElement : document.documentElement;
14579  }
14580
14581  // .offsetParent will return the closest TD or TABLE in case
14582  // no offsetParent is present, I hate this job...
14583  if ([
vendor: 11,763 bytes, lines 14583-14951
14583'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {
14584    return getOffsetParent(offsetParent);
14585  }
14586
14587  return offsetParent;
14588}
14589
14590function isOffsetContainer(element) {
14591  var nodeName = element.nodeName;
14592
14593  if (nodeName === 'BODY') {
14594    return false;
14595  }
14596  return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;
14597}
14598
14599/**
14600 * Finds the root node (document, shadowDOM root) of the given element
14601 * @method
14602 * @memberof Popper.Utils
14603 * @argument {Element} node
14604 * @returns {Element} root node
14605 */
14606function getRoot(node) {
14607  if (node.parentNode !== null) {
14608    return getRoot(node.parentNode);
14609  }
14610
14611  return node;
14612}
14613
14614/**
14615 * Finds the offset parent common to the two provided nodes
14616 * @method
14617 * @memberof Popper.Utils
14618 * @argument {Element} element1
14619 * @argument {Element} element2
14620 * @returns {Element} common offset parent
14621 */
14622function findCommonOffsetParent(element1, element2) {
14623  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
14624  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {
14625    return document.documentElement;
14626  }
14627
14628  // Here we make sure to give as "start" the element that comes first in the DOM
14629  var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;
14630  var start = order ? element1 : element2;
14631  var end = order ? element2 : element1;
14632
14633  // Get common ancestor container
14634  var range = document.createRange();
14635  range.setStart(start, 0);
14636  range.setEnd(end, 0);
14637  var commonAncestorContainer = range.commonAncestorContainer;
14638
14639  // Both nodes are inside #document
14640
14641  if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {
14642    if (isOffsetContainer(commonAncestorContainer)) {
14643      return commonAncestorContainer;
14644    }
14645
14646    return getOffsetParent(commonAncestorContainer);
14647  }
14648
14649  // one of the nodes is inside shadowDOM, find which one
14650  var element1root = getRoot(element1);
14651  if (element1root.host) {
14652    return findCommonOffsetParent(element1root.host, element2);
14653  } else {
14654    return findCommonOffsetParent(element1, getRoot(element2).host);
14655  }
14656}
14657
14658/**
14659 * Gets the scroll value of the given element in the given side (top and left)
14660 * @method
14661 * @memberof Popper.Utils
14662 * @argument {Element} element
14663 * @argument {String} side `top` or `left`
14664 * @returns {number} amount of scrolled pixels
14665 */
14666function getScroll(element) {
14667  var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
14668
14669  var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';
14670  var nodeName = element.nodeName;
14671
14672  if (nodeName === 'BODY' || nodeName === 'HTML') {
14673    var html = element.ownerDocument.documentElement;
14674    var scrollingElement = element.ownerDocument.scrollingElement || html;
14675    return scrollingElement[upperSide];
14676  }
14677
14678  return element[upperSide];
14679}
14680
14681/*
14682 * Sum or subtract the element scroll values (left and top) from a given rect object
14683 * @method
14684 * @memberof Popper.Utils
14685 * @param {Object} rect - Rect object you want to change
14686 * @param {HTMLElement} element - The element from the function reads the scroll values
14687 * @param {Boolean} subtract - set to true if you want to subtract the scroll values
14688 * @return {Object} rect - The modifier rect object
14689 */
14690function includeScroll(rect, element) {
14691  var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
14692
14693  var scrollTop = getScroll(element, 'top');
14694  var scrollLeft = getScroll(element, 'left');
14695  var modifier = subtract ? -1 : 1;
14696  rect.top += scrollTop * modifier;
14697  rect.bottom += scrollTop * modifier;
14698  rect.left += scrollLeft * modifier;
14699  rect.right += scrollLeft * modifier;
14700  return rect;
14701}
14702
14703/*
14704 * Helper to detect borders of a given element
14705 * @method
14706 * @memberof Popper.Utils
14707 * @param {CSSStyleDeclaration} styles
14708 * Result of `getStyleComputedProperty` on the given element
14709 * @param {String} axis - `x` or `y`
14710 * @return {number} borders - The borders size of the given axis
14711 */
14712
14713function getBordersSize(styles, axis) {
14714  var sideA = axis === 'x' ? 'Left' : 'Top';
14715  var sideB = sideA === 'Left' ? 'Right' : 'Bottom';
14716
14717  return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);
14718}
14719
14720function getSize(axis, body, html, computedStyle) {
14721  return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);
14722}
14723
14724function getWindowSizes(document) {
14725  var body = document.body;
14726  var html = document.documentElement;
14727  var computedStyle = isIE(10) && getComputedStyle(html);
14728
14729  return {
14730    height: getSize('Height', body, html, computedStyle),
14731    width: getSize('Width', body, html, computedStyle)
14732  };
14733}
14734
14735var classCallCheck = function (instance, Constructor) {
14736  if (!(instance instanceof Constructor)) {
14737    throw new TypeError("Cannot call a class as a function");
14738  }
14739};
14740
14741var createClass = function () {
14742  function defineProperties(target, props) {
14743    for (var i = 0; i < props.length; i++) {
14744      var descriptor = props[i];
14745      descriptor.enumerable = descriptor.enumerable || false;
14746      descriptor.configurable = true;
14747      if ("value" in descriptor) descriptor.writable = true;
14748      Object.defineProperty(target, descriptor.key, descriptor);
14749    }
14750  }
14751
14752  return function (Constructor, protoProps, staticProps) {
14753    if (protoProps) defineProperties(Constructor.prototype, protoProps);
14754    if (staticProps) defineProperties(Constructor, staticProps);
14755    return Constructor;
14756  };
14757}();
14758
14759
14760
14761
14762
14763var defineProperty = function (obj, key, value) {
14764  if (key in obj) {
14765    Object.defineProperty(obj, key, {
14766      value: value,
14767      enumerable: true,
14768      configurable: true,
14769      writable: true
14770    });
14771  } else {
14772    obj[key] = value;
14773  }
14774
14775  return obj;
14776};
14777
14778var _extends = Object.assign || function (target) {
14779  for (var i = 1; i < arguments.length; i++) {
14780    var source = arguments[i];
14781
14782    for (var key in source) {
14783      if (Object.prototype.hasOwnProperty.call(source, key)) {
14784        target[key] = source[key];
14785      }
14786    }
14787  }
14788
14789  return target;
14790};
14791
14792/**
14793 * Given element offsets, generate an output similar to getBoundingClientRect
14794 * @method
14795 * @memberof Popper.Utils
14796 * @argument {Object} offsets
14797 * @returns {Object} ClientRect like output
14798 */
14799function getClientRect(offsets) {
14800  return _extends({}, offsets, {
14801    right: offsets.left + offsets.width,
14802    bottom: offsets.top + offsets.height
14803  });
14804}
14805
14806/**
14807 * Get bounding client rect of given element
14808 * @method
14809 * @memberof Popper.Utils
14810 * @param {HTMLElement} element
14811 * @return {Object} client rect
14812 */
14813function getBoundingClientRect(element) {
14814  var rect = {};
14815
14816  // IE10 10 FIX: Please, don't ask, the element isn't
14817  // considered in DOM in some circumstances...
14818  // This isn't reproducible in IE10 compatibility mode of IE11
14819  try {
14820    if (isIE(10)) {
14821      rect = element.getBoundingClientRect();
14822      var scrollTop = getScroll(element, 'top');
14823      var scrollLeft = getScroll(element, 'left');
14824      rect.top += scrollTop;
14825      rect.left += scrollLeft;
14826      rect.bottom += scrollTop;
14827      rect.right += scrollLeft;
14828    } else {
14829      rect = element.getBoundingClientRect();
14830    }
14831  } catch (e) {}
14832
14833  var result = {
14834    left: rect.left,
14835    top: rect.top,
14836    width: rect.right - rect.left,
14837    height: rect.bottom - rect.top
14838  };
14839
14840  // subtract scrollbar size from sizes
14841  var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};
14842  var width = sizes.width || element.clientWidth || result.right - result.left;
14843  var height = sizes.height || element.clientHeight || result.bottom - result.top;
14844
14845  var horizScrollbar = element.offsetWidth - width;
14846  var vertScrollbar = element.offsetHeight - height;
14847
14848  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`
14849  // we make this check conditional for performance reasons
14850  if (horizScrollbar || vertScrollbar) {
14851    var styles = getStyleComputedProperty(element);
14852    horizScrollbar -= getBordersSize(styles, 'x');
14853    vertScrollbar -= getBordersSize(styles, 'y');
14854
14855    result.width -= horizScrollbar;
14856    result.height -= vertScrollbar;
14857  }
14858
14859  return getClientRect(result);
14860}
14861
14862function getOffsetRectRelativeToArbitraryNode(children, parent) {
14863  var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
14864
14865  var isIE10 = isIE(10);
14866  var isHTML = parent.nodeName === 'HTML';
14867  var childrenRect = getBoundingClientRect(children);
14868  var parentRect = getBoundingClientRect(parent);
14869  var scrollParent = getScrollParent(children);
14870
14871  var styles = getStyleComputedProperty(parent);
14872  var borderTopWidth = parseFloat(styles.borderTopWidth, 10);
14873  var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);
14874
14875  // In cases where the parent is fixed, we must ignore negative scroll in offset calc
14876  if (fixedPosition && isHTML) {
14877    parentRect.top = Math.max(parentRect.top, 0);
14878    parentRect.left = Math.max(parentRect.left, 0);
14879  }
14880  var offsets = getClientRect({
14881    top: childrenRect.top - parentRect.top - borderTopWidth,
14882    left: childrenRect.left - parentRect.left - borderLeftWidth,
14883    width: childrenRect.width,
14884    height: childrenRect.height
14885  });
14886  offsets.marginTop = 0;
14887  offsets.marginLeft = 0;
14888
14889  // Subtract margins of documentElement in case it's being used as parent
14890  // we do this only on HTML because it's the only element that behaves
14891  // differently when margins are applied to it. The margins are included in
14892  // the box of the documentElement, in the other cases not.
14893  if (!isIE10 && isHTML) {
14894    var marginTop = parseFloat(styles.marginTop, 10);
14895    var marginLeft = parseFloat(styles.marginLeft, 10);
14896
14897    offsets.top -= borderTopWidth - marginTop;
14898    offsets.bottom -= borderTopWidth - marginTop;
14899    offsets.left -= borderLeftWidth - marginLeft;
14900    offsets.right -= borderLeftWidth - marginLeft;
14901
14902    // Attach marginTop and marginLeft because in some circumstances we may need them
14903    offsets.marginTop = marginTop;
14904    offsets.marginLeft = marginLeft;
14905  }
14906
14907  if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {
14908    offsets = includeScroll(offsets, parent);
14909  }
14910
14911  return offsets;
14912}
14913
14914function getViewportOffsetRectRelativeToArtbitraryNode(element) {
14915  var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14916
14917  var html = element.ownerDocument.documentElement;
14918  var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);
14919  var width = Math.max(html.clientWidth, window.innerWidth || 0);
14920  var height = Math.max(html.clientHeight, window.innerHeight || 0);
14921
14922  var scrollTop = !excludeScroll ? getScroll(html) : 0;
14923  var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;
14924
14925  var offset = {
14926    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,
14927    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,
14928    width: width,
14929    height: height
14930  };
14931
14932  return getClientRect(offset);
14933}
14934
14935/**
14936 * Check if the given element is fixed or is inside a fixed parent
14937 * @method
14938 * @memberof Popper.Utils
14939 * @argument {Element} element
14940 * @argument {Element} customContainer
14941 * @returns {Boolean} answer to "isFixed?"
14942 */
14943function isFixed(element) {
14944  var nodeName = element.nodeName;
14945  if (nodeName === 'BODY' || nodeName === 'HTML') {
14946    return false;
14947  }
14948  if (getStyleComputedProperty(element, 'position') === 'fixed') {
14949    return true;
14950  }
14951  
vendor: 5,350 bytes, lines 14951-15114
14951return isFixed(getParentNode(element));
14952}
14953
14954/**
14955 * Finds the first parent of an element that has a transformed property defined
14956 * @method
14957 * @memberof Popper.Utils
14958 * @argument {Element} element
14959 * @returns {Element} first transformed parent or documentElement
14960 */
14961
14962function getFixedPositionOffsetParent(element) {
14963  // This check is needed to avoid errors in case one of the elements isn't defined for any reason
14964  if (!element || !element.parentElement || isIE()) {
14965    return document.documentElement;
14966  }
14967  var el = element.parentElement;
14968  while (el && getStyleComputedProperty(el, 'transform') === 'none') {
14969    el = el.parentElement;
14970  }
14971  return el || document.documentElement;
14972}
14973
14974/**
14975 * Computed the boundaries limits and return them
14976 * @method
14977 * @memberof Popper.Utils
14978 * @param {HTMLElement} popper
14979 * @param {HTMLElement} reference
14980 * @param {number} padding
14981 * @param {HTMLElement} boundariesElement - Element used to define the boundaries
14982 * @param {Boolean} fixedPosition - Is in fixed position mode
14983 * @returns {Object} Coordinates of the boundaries
14984 */
14985function getBoundaries(popper, reference, padding, boundariesElement) {
14986  var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
14987
14988  // NOTE: 1 DOM access here
14989
14990  var boundaries = { top: 0, left: 0 };
14991  var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
14992
14993  // Handle viewport case
14994  if (boundariesElement === 'viewport') {
14995    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);
14996  } else {
14997    // Handle other cases based on DOM element used as boundaries
14998    var boundariesNode = void 0;
14999    if (boundariesElement === 'scrollParent') {
15000      boundariesNode = getScrollParent(getParentNode(reference));
15001      if (boundariesNode.nodeName === 'BODY') {
15002        boundariesNode = popper.ownerDocument.documentElement;
15003      }
15004    } else if (boundariesElement === 'window') {
15005      boundariesNode = popper.ownerDocument.documentElement;
15006    } else {
15007      boundariesNode = boundariesElement;
15008    }
15009
15010    var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);
15011
15012    // In case of HTML, we need a different computation
15013    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {
15014      var _getWindowSizes = getWindowSizes(popper.ownerDocument),
15015          height = _getWindowSizes.height,
15016          width = _getWindowSizes.width;
15017
15018      boundaries.top += offsets.top - offsets.marginTop;
15019      boundaries.bottom = height + offsets.top;
15020      boundaries.left += offsets.left - offsets.marginLeft;
15021      boundaries.right = width + offsets.left;
15022    } else {
15023      // for all the other DOM elements, this one is good
15024      boundaries = offsets;
15025    }
15026  }
15027
15028  // Add paddings
15029  padding = padding || 0;
15030  var isPaddingNumber = typeof padding === 'number';
15031  boundaries.left += isPaddingNumber ? padding : padding.left || 0;
15032  boundaries.top += isPaddingNumber ? padding : padding.top || 0;
15033  boundaries.right -= isPaddingNumber ? padding : padding.right || 0;
15034  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;
15035
15036  return boundaries;
15037}
15038
15039function getArea(_ref) {
15040  var width = _ref.width,
15041      height = _ref.height;
15042
15043  return width * height;
15044}
15045
15046/**
15047 * Utility used to transform the `auto` placement to the placement with more
15048 * available space.
15049 * @method
15050 * @memberof Popper.Utils
15051 * @argument {Object} data - The data object generated by update method
15052 * @argument {Object} options - Modifiers configuration and options
15053 * @returns {Object} The data object, properly modified
15054 */
15055function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {
15056  var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
15057
15058  if (placement.indexOf('auto') === -1) {
15059    return placement;
15060  }
15061
15062  var boundaries = getBoundaries(popper, reference, padding, boundariesElement);
15063
15064  var rects = {
15065    top: {
15066      width: boundaries.width,
15067      height: refRect.top - boundaries.top
15068    },
15069    right: {
15070      width: boundaries.right - refRect.right,
15071      height: boundaries.height
15072    },
15073    bottom: {
15074      width: boundaries.width,
15075      height: boundaries.bottom - refRect.bottom
15076    },
15077    left: {
15078      width: refRect.left - boundaries.left,
15079      height: boundaries.height
15080    }
15081  };
15082
15083  var sortedAreas = Object.keys(rects).map(function (key) {
15084    return _extends({
15085      key: key
15086    }, rects[key], {
15087      area: getArea(rects[key])
15088    });
15089  }).sort(function (a, b) {
15090    return b.area - a.area;
15091  });
15092
15093  var filteredAreas = sortedAreas.filter(function (_ref2) {
15094    var width = _ref2.width,
15095        height = _ref2.height;
15096    return width >= popper.clientWidth && height >= popper.clientHeight;
15097  });
15098
15099  var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;
15100
15101  var variation = placement.split('-')[1];
15102
15103  return computedPlacement + (variation ? '-' + variation : '');
15104}
15105
15106/**
15107 * Get offsets to the reference element
15108 * @method
15109 * @memberof Popper.Utils
15110 * @param {Object} state
15111 * @param {Element} popper - the popper element
15112 * @param {Element} reference - the reference element (the popper will be relative to this)
15113 * @param {Element} fixedPosition - is in fixed position mode
15114 * @returns {Object}
15114 An object containing the offsets which will be applied to the popper
15115 */
15116function getReferenceOffsets(state, popper, reference) {
15117  var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
15118
15119  var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);
15120  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);
15121}
15122
15123/**
15124 * Get the outer sizes of the given element (offset size + margins)
15125 * @method
15126 * @memberof Popper.Utils
15127 * @argument {Element} element
15128 * @returns {Object} object containing width and height properties
15129 */
15130function getOuterSizes(element) {
15131  var styles = getComputedStyle(element);
15132  var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom);
15133  var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight
vendor: 14,252 bytes, lines 15133-15585
15133);
15134  var result = {
15135    width: element.offsetWidth + y,
15136    height: element.offsetHeight + x
15137  };
15138  return result;
15139}
15140
15141/**
15142 * Get the opposite placement of the given one
15143 * @method
15144 * @memberof Popper.Utils
15145 * @argument {String} placement
15146 * @returns {String} flipped placement
15147 */
15148function getOppositePlacement(placement) {
15149  var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };
15150  return placement.replace(/left|right|bottom|top/g, function (matched) {
15151    return hash[matched];
15152  });
15153}
15154
15155/**
15156 * Get offsets to the popper
15157 * @method
15158 * @memberof Popper.Utils
15159 * @param {Object} position - CSS position the Popper will get applied
15160 * @param {HTMLElement} popper - the popper element
15161 * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)
15162 * @param {String} placement - one of the valid placement options
15163 * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper
15164 */
15165function getPopperOffsets(popper, referenceOffsets, placement) {
15166  placement = placement.split('-')[0];
15167
15168  // Get popper node sizes
15169  var popperRect = getOuterSizes(popper);
15170
15171  // Add position, width and height to our offsets object
15172  var popperOffsets = {
15173    width: popperRect.width,
15174    height: popperRect.height
15175  };
15176
15177  // depending by the popper placement we have to compute its offsets slightly differently
15178  var isHoriz = ['right', 'left'].indexOf(placement) !== -1;
15179  var mainSide = isHoriz ? 'top' : 'left';
15180  var secondarySide = isHoriz ? 'left' : 'top';
15181  var measurement = isHoriz ? 'height' : 'width';
15182  var secondaryMeasurement = !isHoriz ? 'height' : 'width';
15183
15184  popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;
15185  if (placement === secondarySide) {
15186    popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];
15187  } else {
15188    popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];
15189  }
15190
15191  return popperOffsets;
15192}
15193
15194/**
15195 * Mimics the `find` method of Array
15196 * @method
15197 * @memberof Popper.Utils
15198 * @argument {Array} arr
15199 * @argument prop
15200 * @argument value
15201 * @returns index or -1
15202 */
15203function find(arr, check) {
15204  // use native find if supported
15205  if (Array.prototype.find) {
15206    return arr.find(check);
15207  }
15208
15209  // use `filter` to obtain the same behavior of `find`
15210  return arr.filter(check)[0];
15211}
15212
15213/**
15214 * Return the index of the matching object
15215 * @method
15216 * @memberof Popper.Utils
15217 * @argument {Array} arr
15218 * @argument prop
15219 * @argument value
15220 * @returns index or -1
15221 */
15222function findIndex(arr, prop, value) {
15223  // use native findIndex if supported
15224  if (Array.prototype.findIndex) {
15225    return arr.findIndex(function (cur) {
15226      return cur[prop] === value;
15227    });
15228  }
15229
15230  // use `find` + `indexOf` if `findIndex` isn't supported
15231  var match = find(arr, function (obj) {
15232    return obj[prop] === value;
15233  });
15234  return arr.indexOf(match);
15235}
15236
15237/**
15238 * Loop trough the list of modifiers and run them in order,
15239 * each of them will then edit the data object.
15240 * @method
15241 * @memberof Popper.Utils
15242 * @param {dataObject} data
15243 * @param {Array} modifiers
15244 * @param {String} ends - Optional modifier name used as stopper
15245 * @returns {dataObject}
15246 */
15247function runModifiers(modifiers, data, ends) {
15248  var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));
15249
15250  modifiersToRun.forEach(function (modifier) {
15251    if (modifier['function']) {
15252      // eslint-disable-line dot-notation
15253      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');
15254    }
15255    var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation
15256    if (modifier.enabled && isFunction(fn)) {
15257      // Add properties to offsets to make them a complete clientRect object
15258      // we do this before each modifier to make sure the previous one doesn't
15259      // mess with these values
15260      data.offsets.popper = getClientRect(data.offsets.popper);
15261      data.offsets.reference = getClientRect(data.offsets.reference);
15262
15263      data = fn(data, modifier);
15264    }
15265  });
15266
15267  return data;
15268}
15269
15270/**
15271 * Updates the position of the popper, computing the new offsets and applying
15272 * the new style.<br />
15273 * Prefer `scheduleUpdate` over `update` because of performance reasons.
15274 * @method
15275 * @memberof Popper
15276 */
15277function update() {
15278  // if popper is destroyed, don't perform any further update
15279  if (this.state.isDestroyed) {
15280    return;
15281  }
15282
15283  var data = {
15284    instance: this,
15285    styles: {},
15286    arrowStyles: {},
15287    attributes: {},
15288    flipped: false,
15289    offsets: {}
15290  };
15291
15292  // compute reference element offsets
15293  data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);
15294
15295  // compute auto placement, store placement inside the data object,
15296  // modifiers will be able to edit `placement` if needed
15297  // and refer to originalPlacement to know the original value
15298  data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);
15299
15300  // store the computed placement inside `originalPlacement`
15301  data.originalPlacement = data.placement;
15302
15303  data.positionFixed = this.options.positionFixed;
15304
15305  // compute the popper offsets
15306  data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);
15307
15308  data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';
15309
15310  // run the modifiers
15311  data = runModifiers(this.modifiers, data);
15312
15313  // the first `update` will call `onCreate` callback
15314  // the other ones will call `onUpdate` callback
15315  if (!this.state.isCreated) {
15316    this.state.isCreated = true;
15317    this.options.onCreate(data);
15318  } else {
15319    this.options.onUpdate(data);
15320  }
15321}
15322
15323/**
15324 * Helper used to know if the given modifier is enabled.
15325 * @method
15326 * @memberof Popper.Utils
15327 * @returns {Boolean}
15328 */
15329function isModifierEnabled(modifiers, modifierName) {
15330  return modifiers.some(function (_ref) {
15331    var name = _ref.name,
15332        enabled = _ref.enabled;
15333    return enabled && name === modifierName;
15334  });
15335}
15336
15337/**
15338 * Get the prefixed supported property name
15339 * @method
15340 * @memberof Popper.Utils
15341 * @argument {String} property (camelCase)
15342 * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)
15343 */
15344function getSupportedPropertyName(property) {
15345  var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];
15346  var upperProp = property.charAt(0).toUpperCase() + property.slice(1);
15347
15348  for (var i = 0; i < prefixes.length; i++) {
15349    var prefix = prefixes[i];
15350    var toCheck = prefix ? '' + prefix + upperProp : property;
15351    if (typeof document.body.style[toCheck] !== 'undefined') {
15352      return toCheck;
15353    }
15354  }
15355  return null;
15356}
15357
15358/**
15359 * Destroys the popper.
15360 * @method
15361 * @memberof Popper
15362 */
15363function destroy() {
15364  this.state.isDestroyed = true;
15365
15366  // touch DOM only if `applyStyle` modifier is enabled
15367  if (isModifierEnabled(this.modifiers, 'applyStyle')) {
15368    this.popper.removeAttribute('x-placement');
15369    this.popper.style.position = '';
15370    this.popper.style.top = '';
15371    this.popper.style.left = '';
15372    this.popper.style.right = '';
15373    this.popper.style.bottom = '';
15374    this.popper.style.willChange = '';
15375    this.popper.style[getSupportedPropertyName('transform')] = '';
15376  }
15377
15378  this.disableEventListeners();
15379
15380  // remove the popper if user explicity asked for the deletion on destroy
15381  // do not use `remove` because IE11 doesn't support it
15382  if (this.options.removeOnDestroy) {
15383    this.popper.parentNode.removeChild(this.popper);
15384  }
15385  return this;
15386}
15387
15388/**
15389 * Get the window associated with the element
15390 * @argument {Element} element
15391 * @returns {Window}
15392 */
15393function getWindow(element) {
15394  var ownerDocument = element.ownerDocument;
15395  return ownerDocument ? ownerDocument.defaultView : window;
15396}
15397
15398function attachToScrollParents(scrollParent, event, callback, scrollParents) {
15399  var isBody = scrollParent.nodeName === 'BODY';
15400  var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;
15401  target.addEventListener(event, callback, { passive: true });
15402
15403  if (!isBody) {
15404    attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);
15405  }
15406  scrollParents.push(target);
15407}
15408
15409/**
15410 * Setup needed event listeners used to update the popper position
15411 * @method
15412 * @memberof Popper.Utils
15413 * @private
15414 */
15415function setupEventListeners(reference, options, state, updateBound) {
15416  // Resize event listener on window
15417  state.updateBound = updateBound;
15418  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });
15419
15420  // Scroll event listener on scroll parents
15421  var scrollElement = getScrollParent(reference);
15422  attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);
15423  state.scrollElement = scrollElement;
15424  state.eventsEnabled = true;
15425
15426  return state;
15427}
15428
15429/**
15430 * It will add resize/scroll events and start recalculating
15431 * position of the popper element when they are triggered.
15432 * @method
15433 * @memberof Popper
15434 */
15435function enableEventListeners() {
15436  if (!this.state.eventsEnabled) {
15437    this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);
15438  }
15439}
15440
15441/**
15442 * Remove event listeners used to update the popper position
15443 * @method
15444 * @memberof Popper.Utils
15445 * @private
15446 */
15447function removeEventListeners(reference, state) {
15448  // Remove resize event listener on window
15449  getWindow(reference).removeEventListener('resize', state.updateBound);
15450
15451  // Remove scroll event listener on scroll parents
15452  state.scrollParents.forEach(function (target) {
15453    target.removeEventListener('scroll', state.updateBound);
15454  });
15455
15456  // Reset state
15457  state.updateBound = null;
15458  state.scrollParents = [];
15459  state.scrollElement = null;
15460  state.eventsEnabled = false;
15461  return state;
15462}
15463
15464/**
15465 * It will remove resize/scroll events and won't recalculate popper position
15466 * when they are triggered. It also won't trigger `onUpdate` callback anymore,
15467 * unless you call `update` method manually.
15468 * @method
15469 * @memberof Popper
15470 */
15471function disableEventListeners() {
15472  if (this.state.eventsEnabled) {
15473    cancelAnimationFrame(this.scheduleUpdate);
15474    this.state = removeEventListeners(this.reference, this.state);
15475  }
15476}
15477
15478/**
15479 * Tells if a given input is a number
15480 * @method
15481 * @memberof Popper.Utils
15482 * @param {*} input to check
15483 * @return {Boolean}
15484 */
15485function isNumeric(n) {
15486  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);
15487}
15488
15489/**
15490 * Set the style to the given popper
15491 * @method
15492 * @memberof Popper.Utils
15493 * @argument {Element} element - Element to apply the style to
15494 * @argument {Object} styles
15495 * Object with a list of properties and values which will be applied to the element
15496 */
15497function setStyles(element, styles) {
15498  Object.keys(styles).forEach(function (prop) {
15499    var unit = '';
15500    // add unit if the value is numeric and is one of the following
15501    if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {
15502      unit = 'px';
15503    }
15504    element.style[prop] = styles[prop] + unit;
15505  });
15506}
15507
15508/**
15509 * Set the attributes to the given popper
15510 * @method
15511 * @memberof Popper.Utils
15512 * @argument {Element} element - Element to apply the attributes to
15513 * @argument {Object} styles
15514 * Object with a list of properties and values which will be applied to the element
15515 */
15516function setAttributes(element, attributes) {
15517  Object.keys(attributes).forEach(function (prop) {
15518    var value = attributes[prop];
15519    if (value !== false) {
15520      element.setAttribute(prop, attributes[prop]);
15521    } else {
15522      element.removeAttribute(prop);
15523    }
15524  });
15525}
15526
15527/**
15528 * @function
15529 * @memberof Modifiers
15530 * @argument {Object} data - The data object generated by `update` method
15531 * @argument {Object} data.styles - List of style properties - values to apply to popper element
15532 * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element
15533 * @argument {Object} options - Modifiers configuration and options
15534 * @returns {Object} The same data object
15535 */
15536function applyStyle(data) {
15537  // any property present in `data.styles` will be applied to the popper,
15538  // in this way we can make the 3rd party modifiers add custom styles to it
15539  // Be aware, modifiers could override the properties defined in the previous
15540  // lines of this modifier!
15541  setStyles(data.instance.popper, data.styles);
15542
15543  // any property present in `data.attributes` will be applied to the popper,
15544  // they will be set as HTML attributes of the element
15545  setAttributes(data.instance.popper, data.attributes);
15546
15547  // if arrowElement is defined and arrowStyles has some properties
15548  if (data.arrowElement && Object.keys(data.arrowStyles).length) {
15549    setStyles(data.arrowElement, data.arrowStyles);
15550  }
15551
15552  return data;
15553}
15554
15555/**
15556 * Set the x-placement attribute before everything else because it could be used
15557 * to add margins to the popper margins needs to be calculated to get the
15558 * correct popper offsets.
15559 * @method
15560 * @memberof Popper.modifiers
15561 * @param {HTMLElement} reference - The reference element used to position the popper
15562 * @param {HTMLElement} popper - The HTML element used as popper
15563 * @param {Object} options - Popper.js options
15564 */
15565function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {
15566  // compute reference element offsets
15567  var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);
15568
15569  // compute auto placement, store placement inside the data object,
15570  // modifiers will be able to edit `placement` if needed
15571  // and refer to originalPlacement to know the original value
15572  var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);
15573
15574  popper.setAttribute('x-placement', placement);
15575
15576  // Apply `position` to popper before anything else because
15577  // without the position applied we can't guarantee correct computations
15578  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });
15579
15580  return options;
15581}
15582
15583/**
15584 * @function
15585 * @memberof 
15585Modifiers
15586 * @argument {Object} data - The data object generated by `update` method
15587 * @argument {Object} options - Modifiers configuration and options
15588 * @returns {Object} The data object, properly modified
15589 */
15590function computeStyle(data, options) {
15591  var x = options.x,
15592      y = options.y;
15593  var popper = data.offsets.popper;
15594
15595  // Remove this legacy support in Popper.js v2
15596
15597  var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {
15598    return modifier.name === 'applyStyle';
15599  }).gpuAcceleration;
15600  if (legacyGpuAccelerationOption !== undefined) {
15601    console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');
15602  }
15603  var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;
15604
15605  var offsetParent = getOffsetParent(data.instance.popper);
15606  var offsetParentRect = getBoundingClientRect(offsetParent);
15607
15608  // Styles
15609  var styles = {
15610    position: popper.position
15611  };
15612
15613  // Avoid blurry text by using full pixel integers.
15614  // For pixel-perfect positioning, top/bottom prefers rounded
15615  // values, while left/right prefers floored values.
15616  var offsets = {
15617    left: Math.floor(popper.left),
15618    top: Math.round(popper.top),
15619    bottom: Math.round(popper.bottom),
15620    right: Math.floor(popper.right)
15621  };
15622
15623  var sideA = x === 'bottom' ? 'top' : 'bottom';
15624  var sideB = y === 'right' ? 'left' : 'right';
15625
15626  // if gpuAcceleration is set to `true` and transform is supported,
15627  //  we use `translate3d` to apply the position to the popper we
15628  // automatically use the supported prefixed version if needed
15629  var prefixedProperty = getSupportedPropertyName('transform');
15630
15631  // now, let's make a step back and look at this code closely (wtf?)
15632  // If the content of the popper grows once it's been positioned, it
15633  // may happen that the popper gets misplaced because of the new content
15634  // overflowing its reference element
15635  // To avoid this problem, we provide two options (x and y), which allow
15636  // the consumer to define the offset origin.
15637  // If we position a popper on top of a reference element, we can set
15638  // `x` to `top` to make the popper grow towards its top instead of
15639  // its bottom.
15640  var left = void 0,
15641      top = void 0;
15642  if (sideA === 'bottom') {
15643    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)
15644    // and not the bottom of the html element
15645    if (offsetParent.nodeName === 'HTML') {
15646      top = -offsetParent.clientHeight + offsets.bottom;
15647    } else {
15648      top = -offsetParentRect.height + offsets.bottom;
15649    }
15650  } else {
15651    top = offsets.top;
15652  }
15653  if (sideB === 'right') {
vendor: 5,843 bytes, lines 15654-15825
15654    if (offsetParent.nodeName === 'HTML') {
15655      left = -offsetParent.clientWidth + offsets.right;
15656    } else {
15657      left = -offsetParentRect.width + offsets.right;
15658    }
15659  } else {
15660    left = offsets.left;
15661  }
15662  if (gpuAcceleration && prefixedProperty) {
15663    styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';
15664    styles[sideA] = 0;
15665    styles[sideB] = 0;
15666    styles.willChange = 'transform';
15667  } else {
15668    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties
15669    var invertTop = sideA === 'bottom' ? -1 : 1;
15670    var invertLeft = sideB === 'right' ? -1 : 1;
15671    styles[sideA] = top * invertTop;
15672    styles[sideB] = left * invertLeft;
15673    styles.willChange = sideA + ', ' + sideB;
15674  }
15675
15676  // Attributes
15677  var attributes = {
15678    'x-placement': data.placement
15679  };
15680
15681  // Update `data` attributes, styles and arrowStyles
15682  data.attributes = _extends({}, attributes, data.attributes);
15683  data.styles = _extends({}, styles, data.styles);
15684  data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);
15685
15686  return data;
15687}
15688
15689/**
15690 * Helper used to know if the given modifier depends from another one.<br />
15691 * It checks if the needed modifier is listed and enabled.
15692 * @method
15693 * @memberof Popper.Utils
15694 * @param {Array} modifiers - list of modifiers
15695 * @param {String} requestingName - name of requesting modifier
15696 * @param {String} requestedName - name of requested modifier
15697 * @returns {Boolean}
15698 */
15699function isModifierRequired(modifiers, requestingName, requestedName) {
15700  var requesting = find(modifiers, function (_ref) {
15701    var name = _ref.name;
15702    return name === requestingName;
15703  });
15704
15705  var isRequired = !!requesting && modifiers.some(function (modifier) {
15706    return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;
15707  });
15708
15709  if (!isRequired) {
15710    var _requesting = '`' + requestingName + '`';
15711    var requested = '`' + requestedName + '`';
15712    console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');
15713  }
15714  return isRequired;
15715}
15716
15717/**
15718 * @function
15719 * @memberof Modifiers
15720 * @argument {Object} data - The data object generated by update method
15721 * @argument {Object} options - Modifiers configuration and options
15722 * @returns {Object} The data object, properly modified
15723 */
15724function arrow(data, options) {
15725  var _data$offsets$arrow;
15726
15727  // arrow depends on keepTogether in order to work
15728  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {
15729    return data;
15730  }
15731
15732  var arrowElement = options.element;
15733
15734  // if arrowElement is a string, suppose it's a CSS selector
15735  if (typeof arrowElement === 'string') {
15736    arrowElement = data.instance.popper.querySelector(arrowElement);
15737
15738    // if arrowElement is not found, don't run the modifier
15739    if (!arrowElement) {
15740      return data;
15741    }
15742  } else {
15743    // if the arrowElement isn't a query selector we must check that the
15744    // provided DOM node is child of its popper node
15745    if (!data.instance.popper.contains(arrowElement)) {
15746      console.warn('WARNING: `arrow.element` must be child of its popper element!');
15747      return data;
15748    }
15749  }
15750
15751  var placement = data.placement.split('-')[0];
15752  var _data$offsets = data.offsets,
15753      popper = _data$offsets.popper,
15754      reference = _data$offsets.reference;
15755
15756  var isVertical = ['left', 'right'].indexOf(placement) !== -1;
15757
15758  var len = isVertical ? 'height' : 'width';
15759  var sideCapitalized = isVertical ? 'Top' : 'Left';
15760  var side = sideCapitalized.toLowerCase();
15761  var altSide = isVertical ? 'left' : 'top';
15762  var opSide = isVertical ? 'bottom' : 'right';
15763  var arrowElementSize = getOuterSizes(arrowElement)[len];
15764
15765  //
15766  // extends keepTogether behavior making sure the popper and its
15767  // reference have enough pixels in conjunction
15768  //
15769
15770  // top/left side
15771  if (reference[opSide] - arrowElementSize < popper[side]) {
15772    data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);
15773  }
15774  // bottom/right side
15775  if (reference[side] + arrowElementSize > popper[opSide]) {
15776    data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];
15777  }
15778  data.offsets.popper = getClientRect(data.offsets.popper);
15779
15780  // compute center of the popper
15781  var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;
15782
15783  // Compute the sideValue using the updated popper offsets
15784  // take popper margin in account because we don't have this info available
15785  var css = getStyleComputedProperty(data.instance.popper);
15786  var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);
15787  var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);
15788  var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;
15789
15790  // prevent arrowElement from being placed not contiguously to its popper
15791  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);
15792
15793  data.arrowElement = arrowElement;
15794  data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);
15795
15796  return data;
15797}
15798
15799/**
15800 * Get the opposite placement variation of the given one
15801 * @method
15802 * @memberof Popper.Utils
15803 * @argument {String} placement variation
15804 * @returns {String} flipped placement variation
15805 */
15806function getOppositeVariation(variation) {
15807  if (variation === 'end') {
15808    return 'start';
15809  } else if (variation === 'start') {
15810    return 'end';
15811  }
15812  return variation;
15813}
15814
15815/**
15816 * List of accepted placements to use as values of the `placement` option.<br />
15817 * Valid placements are:
15818 * - `auto`
15819 * - `top`
15820 * - `right`
15821 * - `bottom`
15822 * - `left`
15823 *
15824 * Each placement can have a variation from this list:
15825 * - `-start`
15826 * - `-end`
15827 *
15828 * Variations are interpreted easily if you think of them as the left to right
15829 * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`
15830 * is right.<br />
15831 * Vertically (`left` and `right`), `start` is top and `end` is bottom.
15832 *
15833 * Some valid examples are:
15834 * - `top-end` (on top of reference, right aligned)
15835 * - `right-start` (on right of reference, top aligned)
15836 * - `bottom` (on bottom, centered)
15837 * - `auto-end` (on the side with more space available, alignment depends by placement)
15838 *
15839 * @static
15840 * @type {Array}
15841 * @enum {String}
15842 * @readonly
15843 * @method placements
15844 * @memberof Popper
15845 */
15846var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];
15847
15848// Get rid of `auto` `auto-start` and `auto-end`
15849var validPlacements = placements.slice(3);
15850
15851/**
15852 * Given an initial placement, returns all the subsequent placements
15853 * clockwise (or counter-clockwise).
15854 *
15855 * @method
15856 * @memberof Popper.Utils
15857 * @argument {String} placement - A valid placement (it accepts variations)
15858 * @argument {Boolean} counter - Set to true to walk the placements counterclockwise
15859 * @returns {Array} placements including their variations
15860 */
15861function clockwise(placement) {
15862  var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15863
15864  var index = validPlacements.indexOf(placement);
15865  var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));
15866  return counter ? arr.reverse() : arr;
15867}
15868
15869var BEHAVIORS = {
15870  FLIP: 'flip',
15871  CLOCKWISE: 'clockwise',
15872  COUNTERCLOCKWISE: 'counterclockwise'
15873};
15874
15875/**
15876 * @function
15877 * @memberof Modifiers
15878 * @argument {Object} data - The data object generated by update method
15879 * @argument {Object} options - Modifiers configuration and options
15880 * @returns {Object} The data object, properly modified
15881 */
15882function flip(data, options) {
15883  // if `inner` modifier is enabled, we can't use the `flip` modifier
15884  if (isModifierEnabled(data.instance.modifiers, 'inner')) {
15885    return data;
15886  }
15887
15888  if (data.flipped && data.placement === data.originalPlacement) {
15889    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides
15890    return data;
15891  }
15892
15893  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);
15894
15895  var placement = data.placement.split('-')[0];
15896  var placementOpposite = getOppositePlacement(placement);
15897  var variation = data.placement.split('-')[1] || '';
15898
15899  var flipOrder = [];
15900
15901  switch (options.behavior) {
15902    case BEHAVIORS.FLIP:
15903      flipOrder = [placement, placementOpposite];
15904      break;
15905    case BEHAVIORS.CLOCKWISE:
15906      flipOrder = clockwise(placement);
15907      break;
15908    case BEHAVIORS.COUNTERCLOCKWISE:
15909      flipOrder = clockwise(placement, true);
15910      break;
15911    default:
15912      flipOrder = options.behavior;
15913  }
15914
15915  flipOrder.forEach(function (step, index) {
15916    if (placement !== step || flipOrder.length === index + 1) {
15917      return data;
15918    }
15919
15920    placement = data.placement.split('-')[0];
15921    placementOpposite = getOppositePlacement(placement);
15922
15923    var popperOffsets = data.offsets.popper;
15924    var refOffsets = data.offsets.reference;
15925
15926    // using floor because the reference offsets may contain decimals we are not going to consider here
15927    var floor = Math.floor;
15928    var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);
15929
15930    var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);
15931    var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);
15932    var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);
15933    var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);
15934
15935    var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;
15936
15937    // flip the variation if required
15938    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
15939    var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom)
vendor: 21,083 bytes, lines 15939-16546
15939;
15940
15941    if (overlapsRef || overflowsBoundaries || flippedVariation) {
15942      // this boolean to detect any flip loop
15943      data.flipped = true;
15944
15945      if (overlapsRef || overflowsBoundaries) {
15946        placement = flipOrder[index + 1];
15947      }
15948
15949      if (flippedVariation) {
15950        variation = getOppositeVariation(variation);
15951      }
15952
15953      data.placement = placement + (variation ? '-' + variation : '');
15954
15955      // this object contains `position`, we want to preserve it along with
15956      // any additional property we may add in the future
15957      data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));
15958
15959      data = runModifiers(data.instance.modifiers, data, 'flip');
15960    }
15961  });
15962  return data;
15963}
15964
15965/**
15966 * @function
15967 * @memberof Modifiers
15968 * @argument {Object} data - The data object generated by update method
15969 * @argument {Object} options - Modifiers configuration and options
15970 * @returns {Object} The data object, properly modified
15971 */
15972function keepTogether(data) {
15973  var _data$offsets = data.offsets,
15974      popper = _data$offsets.popper,
15975      reference = _data$offsets.reference;
15976
15977  var placement = data.placement.split('-')[0];
15978  var floor = Math.floor;
15979  var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;
15980  var side = isVertical ? 'right' : 'bottom';
15981  var opSide = isVertical ? 'left' : 'top';
15982  var measurement = isVertical ? 'width' : 'height';
15983
15984  if (popper[side] < floor(reference[opSide])) {
15985    data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];
15986  }
15987  if (popper[opSide] > floor(reference[side])) {
15988    data.offsets.popper[opSide] = floor(reference[side]);
15989  }
15990
15991  return data;
15992}
15993
15994/**
15995 * Converts a string containing value + unit into a px value number
15996 * @function
15997 * @memberof {modifiers~offset}
15998 * @private
15999 * @argument {String} str - Value + unit string
16000 * @argument {String} measurement - `height` or `width`
16001 * @argument {Object} popperOffsets
16002 * @argument {Object} referenceOffsets
16003 * @returns {Number|String}
16004 * Value in pixels, or original string if no values were extracted
16005 */
16006function toValue(str, measurement, popperOffsets, referenceOffsets) {
16007  // separate value from unit
16008  var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/);
16009  var value = +split[1];
16010  var unit = split[2];
16011
16012  // If it's not a number it's an operator, I guess
16013  if (!value) {
16014    return str;
16015  }
16016
16017  if (unit.indexOf('%') === 0) {
16018    var element = void 0;
16019    switch (unit) {
16020      case '%p':
16021        element = popperOffsets;
16022        break;
16023      case '%':
16024      case '%r':
16025      default:
16026        element = referenceOffsets;
16027    }
16028
16029    var rect = getClientRect(element);
16030    return rect[measurement] / 100 * value;
16031  } else if (unit === 'vh' || unit === 'vw') {
16032    // if is a vh or vw, we calculate the size based on the viewport
16033    var size = void 0;
16034    if (unit === 'vh') {
16035      size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
16036    } else {
16037      size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
16038    }
16039    return size / 100 * value;
16040  } else {
16041    // if is an explicit pixel unit, we get rid of the unit and keep the value
16042    // if is an implicit unit, it's px, and we return just the value
16043    return value;
16044  }
16045}
16046
16047/**
16048 * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.
16049 * @function
16050 * @memberof {modifiers~offset}
16051 * @private
16052 * @argument {String} offset
16053 * @argument {Object} popperOffsets
16054 * @argument {Object} referenceOffsets
16055 * @argument {String} basePlacement
16056 * @returns {Array} a two cells array with x and y offsets in numbers
16057 */
16058function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {
16059  var offsets = [0, 0];
16060
16061  // Use height if placement is left or right and index is 0 otherwise use width
16062  // in this way the first offset will use an axis and the second one
16063  // will use the other one
16064  var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;
16065
16066  // Split the offset string to obtain a list of values and operands
16067  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)
16068  var fragments = offset.split(/(\+|\-)/).map(function (frag) {
16069    return frag.trim();
16070  });
16071
16072  // Detect if the offset string contains a pair of values or a single one
16073  // they could be separated by comma or space
16074  var divider = fragments.indexOf(find(fragments, function (frag) {
16075    return frag.search(/,|\s/) !== -1;
16076  }));
16077
16078  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {
16079    console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');
16080  }
16081
16082  // If divider is found, we divide the list of values and operands to divide
16083  // them by ofset X and Y.
16084  var splitRegex = /\s*,\s*|\s+/;
16085  var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];
16086
16087  // Convert the values with units to absolute pixels to allow our computations
16088  ops = ops.map(function (op, index) {
16089    // Most of the units rely on the orientation of the popper
16090    var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';
16091    var mergeWithPrevious = false;
16092    return op
16093    // This aggregates any `+` or `-` sign that aren't considered operators
16094    // e.g.: 10 + +5 => [10, +, +5]
16095    .reduce(function (a, b) {
16096      if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {
16097        a[a.length - 1] = b;
16098        mergeWithPrevious = true;
16099        return a;
16100      } else if (mergeWithPrevious) {
16101        a[a.length - 1] += b;
16102        mergeWithPrevious = false;
16103        return a;
16104      } else {
16105        return a.concat(b);
16106      }
16107    }, [])
16108    // Here we convert the string values into number values (in px)
16109    .map(function (str) {
16110      return toValue(str, measurement, popperOffsets, referenceOffsets);
16111    });
16112  });
16113
16114  // Loop trough the offsets arrays and execute the operations
16115  ops.forEach(function (op, index) {
16116    op.forEach(function (frag, index2) {
16117      if (isNumeric(frag)) {
16118        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);
16119      }
16120    });
16121  });
16122  return offsets;
16123}
16124
16125/**
16126 * @function
16127 * @memberof Modifiers
16128 * @argument {Object} data - The data object generated by update method
16129 * @argument {Object} options - Modifiers configuration and options
16130 * @argument {Number|String} options.offset=0
16131 * The offset value as described in the modifier description
16132 * @returns {Object} The data object, properly modified
16133 */
16134function offset(data, _ref) {
16135  var offset = _ref.offset;
16136  var placement = data.placement,
16137      _data$offsets = data.offsets,
16138      popper = _data$offsets.popper,
16139      reference = _data$offsets.reference;
16140
16141  var basePlacement = placement.split('-')[0];
16142
16143  var offsets = void 0;
16144  if (isNumeric(+offset)) {
16145    offsets = [+offset, 0];
16146  } else {
16147    offsets = parseOffset(offset, popper, reference, basePlacement);
16148  }
16149
16150  if (basePlacement === 'left') {
16151    popper.top += offsets[0];
16152    popper.left -= offsets[1];
16153  } else if (basePlacement === 'right') {
16154    popper.top += offsets[0];
16155    popper.left += offsets[1];
16156  } else if (basePlacement === 'top') {
16157    popper.left += offsets[0];
16158    popper.top -= offsets[1];
16159  } else if (basePlacement === 'bottom') {
16160    popper.left += offsets[0];
16161    popper.top += offsets[1];
16162  }
16163
16164  data.popper = popper;
16165  return data;
16166}
16167
16168/**
16169 * @function
16170 * @memberof Modifiers
16171 * @argument {Object} data - The data object generated by `update` method
16172 * @argument {Object} options - Modifiers configuration and options
16173 * @returns {Object} The data object, properly modified
16174 */
16175function preventOverflow(data, options) {
16176  var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);
16177
16178  // If offsetParent is the reference element, we really want to
16179  // go one step up and use the next offsetParent as reference to
16180  // avoid to make this modifier completely useless and look like broken
16181  if (data.instance.reference === boundariesElement) {
16182    boundariesElement = getOffsetParent(boundariesElement);
16183  }
16184
16185  // NOTE: DOM access here
16186  // resets the popper's position so that the document size can be calculated excluding
16187  // the size of the popper element itself
16188  var transformProp = getSupportedPropertyName('transform');
16189  var popperStyles = data.instance.popper.style; // assignment to help minification
16190  var top = popperStyles.top,
16191      left = popperStyles.left,
16192      transform = popperStyles[transformProp];
16193
16194  popperStyles.top = '';
16195  popperStyles.left = '';
16196  popperStyles[transformProp] = '';
16197
16198  var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);
16199
16200  // NOTE: DOM access here
16201  // restores the original style properties after the offsets have been computed
16202  popperStyles.top = top;
16203  popperStyles.left = left;
16204  popperStyles[transformProp] = transform;
16205
16206  options.boundaries = boundaries;
16207
16208  var order = options.priority;
16209  var popper = data.offsets.popper;
16210
16211  var check = {
16212    primary: function primary(placement) {
16213      var value = popper[placement];
16214      if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {
16215        value = Math.max(popper[placement], boundaries[placement]);
16216      }
16217      return defineProperty({}, placement, value);
16218    },
16219    secondary: function secondary(placement) {
16220      var mainSide = placement === 'right' ? 'left' : 'top';
16221      var value = popper[mainSide];
16222      if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {
16223        value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));
16224      }
16225      return defineProperty({}, mainSide, value);
16226    }
16227  };
16228
16229  order.forEach(function (placement) {
16230    var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';
16231    popper = _extends({}, popper, check[side](placement));
16232  });
16233
16234  data.offsets.popper = popper;
16235
16236  return data;
16237}
16238
16239/**
16240 * @function
16241 * @memberof Modifiers
16242 * @argument {Object} data - The data object generated by `update` method
16243 * @argument {Object} options - Modifiers configuration and options
16244 * @returns {Object} The data object, properly modified
16245 */
16246function shift(data) {
16247  var placement = data.placement;
16248  var basePlacement = placement.split('-')[0];
16249  var shiftvariation = placement.split('-')[1];
16250
16251  // if shift shiftvariation is specified, run the modifier
16252  if (shiftvariation) {
16253    var _data$offsets = data.offsets,
16254        reference = _data$offsets.reference,
16255        popper = _data$offsets.popper;
16256
16257    var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;
16258    var side = isVertical ? 'left' : 'top';
16259    var measurement = isVertical ? 'width' : 'height';
16260
16261    var shiftOffsets = {
16262      start: defineProperty({}, side, reference[side]),
16263      end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])
16264    };
16265
16266    data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);
16267  }
16268
16269  return data;
16270}
16271
16272/**
16273 * @function
16274 * @memberof Modifiers
16275 * @argument {Object} data - The data object generated by update method
16276 * @argument {Object} options - Modifiers configuration and options
16277 * @returns {Object} The data object, properly modified
16278 */
16279function hide(data) {
16280  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {
16281    return data;
16282  }
16283
16284  var refRect = data.offsets.reference;
16285  var bound = find(data.instance.modifiers, function (modifier) {
16286    return modifier.name === 'preventOverflow';
16287  }).boundaries;
16288
16289  if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {
16290    // Avoid unnecessary DOM access if visibility hasn't changed
16291    if (data.hide === true) {
16292      return data;
16293    }
16294
16295    data.hide = true;
16296    data.attributes['x-out-of-boundaries'] = '';
16297  } else {
16298    // Avoid unnecessary DOM access if visibility hasn't changed
16299    if (data.hide === false) {
16300      return data;
16301    }
16302
16303    data.hide = false;
16304    data.attributes['x-out-of-boundaries'] = false;
16305  }
16306
16307  return data;
16308}
16309
16310/**
16311 * @function
16312 * @memberof Modifiers
16313 * @argument {Object} data - The data object generated by `update` method
16314 * @argument {Object} options - Modifiers configuration and options
16315 * @returns {Object} The data object, properly modified
16316 */
16317function inner(data) {
16318  var placement = data.placement;
16319  var basePlacement = placement.split('-')[0];
16320  var _data$offsets = data.offsets,
16321      popper = _data$offsets.popper,
16322      reference = _data$offsets.reference;
16323
16324  var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;
16325
16326  var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;
16327
16328  popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);
16329
16330  data.placement = getOppositePlacement(placement);
16331  data.offsets.popper = getClientRect(popper);
16332
16333  return data;
16334}
16335
16336/**
16337 * Modifier function, each modifier can have a function of this type assigned
16338 * to its `fn` property.<br />
16339 * These functions will be called on each update, this means that you must
16340 * make sure they are performant enough to avoid performance bottlenecks.
16341 *
16342 * @function ModifierFn
16343 * @argument {dataObject} data - The data object generated by `update` method
16344 * @argument {Object} options - Modifiers configuration and options
16345 * @returns {dataObject} The data object, properly modified
16346 */
16347
16348/**
16349 * Modifiers are plugins used to alter the behavior of your poppers.<br />
16350 * Popper.js uses a set of 9 modifiers to provide all the basic functionalities
16351 * needed by the library.
16352 *
16353 * Usually you don't want to override the `order`, `fn` and `onLoad` props.
16354 * All the other properties are configurations that could be tweaked.
16355 * @namespace modifiers
16356 */
16357var modifiers = {
16358  /**
16359   * Modifier used to shift the popper on the start or end of its reference
16360   * element.<br />
16361   * It will read the variation of the `placement` property.<br />
16362   * It can be one either `-end` or `-start`.
16363   * @memberof modifiers
16364   * @inner
16365   */
16366  shift: {
16367    /** @prop {number} order=100 - Index used to define the order of execution */
16368    order: 100,
16369    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16370    enabled: true,
16371    /** @prop {ModifierFn} */
16372    fn: shift
16373  },
16374
16375  /**
16376   * The `offset` modifier can shift your popper on both its axis.
16377   *
16378   * It accepts the following units:
16379   * - `px` or unit-less, interpreted as pixels
16380   * - `%` or `%r`, percentage relative to the length of the reference element
16381   * - `%p`, percentage relative to the length of the popper element
16382   * - `vw`, CSS viewport width unit
16383   * - `vh`, CSS viewport height unit
16384   *
16385   * For length is intended the main axis relative to the placement of the popper.<br />
16386   * This means that if the placement is `top` or `bottom`, the length will be the
16387   * `width`. In case of `left` or `right`, it will be the `height`.
16388   *
16389   * You can provide a single value (as `Number` or `String`), or a pair of values
16390   * as `String` divided by a comma or one (or more) white spaces.<br />
16391   * The latter is a deprecated method because it leads to confusion and will be
16392   * removed in v2.<br />
16393   * Additionally, it accepts additions and subtractions between different units.
16394   * Note that multiplications and divisions aren't supported.
16395   *
16396   * Valid examples are:
16397   * ```
16398   * 10
16399   * '10%'
16400   * '10, 10'
16401   * '10%, 10'
16402   * '10 + 10%'
16403   * '10 - 5vh + 3%'
16404   * '-10px + 5vh, 5px - 6%'
16405   * ```
16406   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap
16407   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.
16408   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).
16409   *
16410   * @memberof modifiers
16411   * @inner
16412   */
16413  offset: {
16414    /** @prop {number} order=200 - Index used to define the order of execution */
16415    order: 200,
16416    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16417    enabled: true,
16418    /** @prop {ModifierFn} */
16419    fn: offset,
16420    /** @prop {Number|String} offset=0
16421     * The offset value as described in the modifier description
16422     */
16423    offset: 0
16424  },
16425
16426  /**
16427   * Modifier used to prevent the popper from being positioned outside the boundary.
16428   *
16429   * A scenario exists where the reference itself is not within the boundaries.<br />
16430   * We can say it has "escaped the boundaries" — or just "escaped".<br />
16431   * In this case we need to decide whether the popper should either:
16432   *
16433   * - detach from the reference and remain "trapped" in the boundaries, or
16434   * - if it should ignore the boundary and "escape with its reference"
16435   *
16436   * When `escapeWithReference` is set to`true` and reference is completely
16437   * outside its boundaries, the popper will overflow (or completely leave)
16438   * the boundaries in order to remain attached to the edge of the reference.
16439   *
16440   * @memberof modifiers
16441   * @inner
16442   */
16443  preventOverflow: {
16444    /** @prop {number} order=300 - Index used to define the order of execution */
16445    order: 300,
16446    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16447    enabled: true,
16448    /** @prop {ModifierFn} */
16449    fn: preventOverflow,
16450    /**
16451     * @prop {Array} [priority=['left','right','top','bottom']]
16452     * Popper will try to prevent overflow following these priorities by default,
16453     * then, it could overflow on the left and on top of the `boundariesElement`
16454     */
16455    priority: ['left', 'right', 'top', 'bottom'],
16456    /**
16457     * @prop {number} padding=5
16458     * Amount of pixel used to define a minimum distance between the boundaries
16459     * and the popper. This makes sure the popper always has a little padding
16460     * between the edges of its container
16461     */
16462    padding: 5,
16463    /**
16464     * @prop {String|HTMLElement} boundariesElement='scrollParent'
16465     * Boundaries used by the modifier. Can be `scrollParent`, `window`,
16466     * `viewport` or any DOM element.
16467     */
16468    boundariesElement: 'scrollParent'
16469  },
16470
16471  /**
16472   * Modifier used to make sure the reference and its popper stay near each other
16473   * without leaving any gap between the two. Especially useful when the arrow is
16474   * enabled and you want to ensure that it points to its reference element.
16475   * It cares only about the first axis. You can still have poppers with margin
16476   * between the popper and its reference element.
16477   * @memberof modifiers
16478   * @inner
16479   */
16480  keepTogether: {
16481    /** @prop {number} order=400 - Index used to define the order of execution */
16482    order: 400,
16483    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16484    enabled: true,
16485    /** @prop {ModifierFn} */
16486    fn: keepTogether
16487  },
16488
16489  /**
16490   * This modifier is used to move the `arrowElement` of the popper to make
16491   * sure it is positioned between the reference element and its popper element.
16492   * It will read the outer size of the `arrowElement` node to detect how many
16493   * pixels of conjunction are needed.
16494   *
16495   * It has no effect if no `arrowElement` is provided.
16496   * @memberof modifiers
16497   * @inner
16498   */
16499  arrow: {
16500    /** @prop {number} order=500 - Index used to define the order of execution */
16501    order: 500,
16502    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16503    enabled: true,
16504    /** @prop {ModifierFn} */
16505    fn: arrow,
16506    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */
16507    element: '[x-arrow]'
16508  },
16509
16510  /**
16511   * Modifier used to flip the popper's placement when it starts to overlap its
16512   * reference element.
16513   *
16514   * Requires the `preventOverflow` modifier before it in order to work.
16515   *
16516   * **NOTE:** this modifier will interrupt the current update cycle and will
16517   * restart it if it detects the need to flip the placement.
16518   * @memberof modifiers
16519   * @inner
16520   */
16521  flip: {
16522    /** @prop {number} order=600 - Index used to define the order of execution */
16523    order: 600,
16524    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16525    enabled: true,
16526    /** @prop {ModifierFn} */
16527    fn: flip,
16528    /**
16529     * @prop {String|Array} behavior='flip'
16530     * The behavior used to change the popper's placement. It can be one of
16531     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid
16532     * placements (with optional variations)
16533     */
16534    behavior: 'flip',
16535    /**
16536     * @prop {number} padding=5
16537     * The popper will flip if it hits the edges of the `boundariesElement`
16538     */
16539    padding: 5,
16540    /**
16541     * @prop {String|HTMLElement} boundariesElement='viewport'
16542     * The element which will define the boundaries of the popper position.
16543     * The popper will never be placed outside of the defined boundaries
16544     * (except if `keepTogether` is enabled)
16545     */
16546    boundariesElement: 'viewport'
16546
16547  },
16548
16549  /**
16550   * Modifier used to make the popper flow toward the inner of the reference element.
16551   * By default, when this modifier is disabled, the popper will be placed outside
16552   * the reference element.
16553   * @memberof modifiers
16554   * @inner
16555   */
16556  inner: {
16557    /** @prop {number} order=700 - Index used to define the order of execution */
16558    order: 700,
16559    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */
16560    enabled: false,
16561    /** @prop {ModifierFn} */
16562    fn: inner
16563  },
16564
16565  /**
16566   * Modifier used to hide the popper when its reference element is outside of the
16567   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can
16568   * be used to hide with a CSS selector the popper when its reference is
16569   * out of boundaries.
16570   *
16571   * Requires the `preventOverflow` modifier before it in order to work.
16572   * @memberof modifiers
16573   * @inner
16574   */
16575  hide: {
16576    /** @prop {number} order=800 - Index used to define the order of execution */
16577    order: 800,
16578    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16579    enabled: true,
16580    /** @prop {ModifierFn} */
16581    fn: hide
16582  },
16583
16584  /**
16585   * Computes the style that will be applied to the popper element to gets
16586   * properly positioned.
16587   *
16588   * Note that this modifier will not touch the DOM, it just prepares the styles
16589   * so that `applyStyle` modifier can apply it. This separation is useful
16590   * in case you need to replace `applyStyle` with a custom implementation.
16591   *
16592   * This modifier has `850` as `order` value to maintain backward compatibility
16593   * with previous versions of Popper.js. Expect the modifiers ordering method
16594   * to change in future major versions of the library.
16595   *
16596   * @memberof modifiers
16597   * @inner
16598   */
16599  computeStyle: {
16600    /** @prop {number} order=850 - Index used to define the order of execution */
16601    order: 850,
16602    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16603    enabled: true,
16604    /** @prop {ModifierFn} */
16605    fn: computeStyle,
16606    /**
16607     * @prop {Boolean} gpuAcceleration=true
16608     * If true, it uses the CSS 3D transformation to position the popper.
16609     * Otherwise, it will use the `top` and `left` properties
16610     */
16611    gpuAcceleration: true,
16612    /**
16613     * @prop {string} [x='bottom']
16614     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.
16615     * Change this if your popper should grow in a direction different from `bottom`
16616     */
16617    x: 'bottom',
16618    /**
16619     * @prop {string} [x='left']
16620     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.
16621     * Change this if your popper should grow in a direction different from `right`
16622     */
16623    y: 'right'
16624  },
16625
16626  /**
16627   * Applies the computed styles to the popper element.
16628   *
16629   * All the DOM manipulations are limited to this modifier. This is useful in case
16630   * you want to integrate Popper.js inside a framework or view library and you
16631   * want to delegate all the DOM manipulations to it.
16632   *
16633   * Note that if you disable this modifier, you must make sure the popper element
16634   * has its position set to `absolute` before Popper.js can do its work!
16635   *
16636   * Just disable this modifier and define your own to achieve the desired effect.
16637   *
16638   * @memberof modifiers
16639   * @inner
16640   */
16641  applyStyle: {
16642    /** @prop {number} order=900 - Index used to define the order of execution */
16643    order: 900,
16644    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */
16645    enabled: true,
16646    /** @prop {ModifierFn} */
vendor: 4,830 bytes, lines 16647-16785
16647    fn: applyStyle,
16648    /** @prop {Function} */
16649    onLoad: applyStyleOnLoad,
16650    /**
16651     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier
16652     * @prop {Boolean} gpuAcceleration=true
16653     * If true, it uses the CSS 3D transformation to position the popper.
16654     * Otherwise, it will use the `top` and `left` properties
16655     */
16656    gpuAcceleration: undefined
16657  }
16658};
16659
16660/**
16661 * The `dataObject` is an object containing all the information used by Popper.js.
16662 * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.
16663 * @name dataObject
16664 * @property {Object} data.instance The Popper.js instance
16665 * @property {String} data.placement Placement applied to popper
16666 * @property {String} data.originalPlacement Placement originally defined on init
16667 * @property {Boolean} data.flipped True if popper has been flipped by flip modifier
16668 * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper
16669 * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier
16670 * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)
16671 * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)
16672 * @property {Object} data.boundaries Offsets of the popper boundaries
16673 * @property {Object} data.offsets The measurements of popper, reference and arrow elements
16674 * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values
16675 * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values
16676 * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0
16677 */
16678
16679/**
16680 * Default options provided to Popper.js constructor.<br />
16681 * These can be overridden using the `options` argument of Popper.js.<br />
16682 * To override an option, simply pass an object with the same
16683 * structure of the `options` object, as the 3rd argument. For example:
16684 * ```
16685 * new Popper(ref, pop, {
16686 *   modifiers: {
16687 *     preventOverflow: { enabled: false }
16688 *   }
16689 * })
16690 * ```
16691 * @type {Object}
16692 * @static
16693 * @memberof Popper
16694 */
16695var Defaults = {
16696  /**
16697   * Popper's placement.
16698   * @prop {Popper.placements} placement='bottom'
16699   */
16700  placement: 'bottom',
16701
16702  /**
16703   * Set this to true if you want popper to position it self in 'fixed' mode
16704   * @prop {Boolean} positionFixed=false
16705   */
16706  positionFixed: false,
16707
16708  /**
16709   * Whether events (resize, scroll) are initially enabled.
16710   * @prop {Boolean} eventsEnabled=true
16711   */
16712  eventsEnabled: true,
16713
16714  /**
16715   * Set to true if you want to automatically remove the popper when
16716   * you call the `destroy` method.
16717   * @prop {Boolean} removeOnDestroy=false
16718   */
16719  removeOnDestroy: false,
16720
16721  /**
16722   * Callback called when the popper is created.<br />
16723   * By default, it is set to no-op.<br />
16724   * Access Popper.js instance with `data.instance`.
16725   * @prop {onCreate}
16726   */
16727  onCreate: function onCreate() {},
16728
16729  /**
16730   * Callback called when the popper is updated. This callback is not called
16731   * on the initialization/creation of the popper, but only on subsequent
16732   * updates.<br />
16733   * By default, it is set to no-op.<br />
16734   * Access Popper.js instance with `data.instance`.
16735   * @prop {onUpdate}
16736   */
16737  onUpdate: function onUpdate() {},
16738
16739  /**
16740   * List of modifiers used to modify the offsets before they are applied to the popper.
16741   * They provide most of the functionalities of Popper.js.
16742   * @prop {modifiers}
16743   */
16744  modifiers: modifiers
16745};
16746
16747/**
16748 * @callback onCreate
16749 * @param {dataObject} data
16750 */
16751
16752/**
16753 * @callback onUpdate
16754 * @param {dataObject} data
16755 */
16756
16757// Utils
16758// Methods
16759var Popper = function () {
16760  /**
16761   * Creates a new Popper.js instance.
16762   * @class Popper
16763   * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper
16764   * @param {HTMLElement} popper - The HTML element used as the popper
16765   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)
16766   * @return {Object} instance - The generated Popper.js instance
16767   */
16768  function Popper(reference, popper) {
16769    var _this = this;
16770
16771    var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
16772    classCallCheck(this, Popper);
16773
16774    this.scheduleUpdate = function () {
16775      return requestAnimationFrame(_this.update);
16776    };
16777
16778    // make update() debounced, so that it only runs at most once-per-tick
16779    this.update = debounce(this.update.bind(this));
16780
16781    // with {} we create a new object with the options inside it
16782    this.options = _extends({}, Popper.Defaults, options);
16783
16784    // init state
16785    this.state = {
vendor: 4,682 bytes, lines 16786-16921
16786      isDestroyed: false,
16787      isCreated: false,
16788      scrollParents: []
16789    };
16790
16791    // get reference and popper elements (allow jQuery wrappers)
16792    this.reference = reference && reference.jquery ? reference[0] : reference;
16793    this.popper = popper && popper.jquery ? popper[0] : popper;
16794
16795    // Deep merge modifiers options
16796    this.options.modifiers = {};
16797    Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {
16798      _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});
16799    });
16800
16801    // Refactoring modifiers' list (Object => Array)
16802    this.modifiers = Object.keys(this.options.modifiers).map(function (name) {
16803      return _extends({
16804        name: name
16805      }, _this.options.modifiers[name]);
16806    })
16807    // sort the modifiers by order
16808    .sort(function (a, b) {
16809      return a.order - b.order;
16810    });
16811
16812    // modifiers have the ability to execute arbitrary code when Popper.js get inited
16813    // such code is executed in the same order of its modifier
16814    // they could add new properties to their options configuration
16815    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!
16816    this.modifiers.forEach(function (modifierOptions) {
16817      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {
16818        modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);
16819      }
16820    });
16821
16822    // fire the first update to position the popper in the right place
16823    this.update();
16824
16825    var eventsEnabled = this.options.eventsEnabled;
16826    if (eventsEnabled) {
16827      // setup event listeners, they will take care of update the position in specific situations
16828      this.enableEventListeners();
16829    }
16830
16831    this.state.eventsEnabled = eventsEnabled;
16832  }
16833
16834  // We can't use class properties because they don't get listed in the
16835  // class prototype and break stuff like Sinon stubs
16836
16837
16838  createClass(Popper, [{
16839    key: 'update',
16840    value: function update$$1() {
16841      return update.call(this);
16842    }
16843  }, {
16844    key: 'destroy',
16845    value: function destroy$$1() {
16846      return destroy.call(this);
16847    }
16848  }, {
16849    key: 'enableEventListeners',
16850    value: function enableEventListeners$$1() {
16851      return enableEventListeners.call(this);
16852    }
16853  }, {
16854    key: 'disableEventListeners',
16855    value: function disableEventListeners$$1() {
16856      return disableEventListeners.call(this);
16857    }
16858
16859    /**
16860     * Schedules an update. It will run on the next UI update available.
16861     * @method scheduleUpdate
16862     * @memberof Popper
16863     */
16864
16865
16866    /**
16867     * Collection of utilities useful when writing custom modifiers.
16868     * Starting from version 1.7, this method is available only if you
16869     * include `popper-utils.js` before `popper.js`.
16870     *
16871     * **DEPRECATION**: This way to access PopperUtils is deprecated
16872     * and will be removed in v2! Use the PopperUtils module directly instead.
16873     * Due to the high instability of the methods contained in Utils, we can't
16874     * guarantee them to follow semver. Use them at your own risk!
16875     * @static
16876     * @private
16877     * @type {Object}
16878     * @deprecated since version 1.8
16879     * @member Utils
16880     * @memberof Popper
16881     */
16882
16883  }]);
16884  return Popper;
16885}();
16886
16887/**
16888 * The `referenceObject` is an object that provides an interface compatible with Popper.js
16889 * and lets you use it as replacement of a real DOM node.<br />
16890 * You can use this method to position a popper relatively to a set of coordinates
16891 * in case you don't have a DOM node to use as reference.
16892 *
16893 * ```
16894 * new Popper(referenceObject, popperNode);
16895 * ```
16896 *
16897 * NB: This feature isn't supported in Internet Explorer 10.
16898 * @name referenceObject
16899 * @property {Function} data.getBoundingClientRect
16900 * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.
16901 * @property {number} data.clientWidth
16902 * An ES6 getter that will return the width of the virtual reference element.
16903 * @property {number} data.clientHeight
16904 * An ES6 getter that will return the height of the virtual reference element.
16905 */
16906
16907
16908Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;
16909Popper.placements = placements;
16910Popper.Defaults = Defaults;
16911
16912/* harmony default export */ __webpack_exports__["default"] = (Popper);
16913//# sourceMappingURL=popper.js.map
16914
16915/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(1)))
16916
16917/***/ }),
16918/* 6 */
16919/***/ (function(module, exports, __webpack_require__) {
16920
16921!function(e,t){ true?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exp
vendor: 6,814 bytes, line 16921
16921orts.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},r=n(1),a=(o(r),n(6)),u=o(a),c=n(7),f=o(c),s=n(8),d=o(s),l=n(9),p=o(l),m=n(10),b=o(m),v=n(11),y=o(v),g=n(14),h=o(g),w=[],k=!1,x={offset:120,delay:0,easing:"ease",duration:400,disable:!1,once:!1,startEvent:"DOMContentLoaded",throttleDelay:99,debounceDelay:50,disableMutationObserver:!1},j=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,x),(0,b.default)(w,x.once),w},O=function(){w=(0,h.default)(),j()},_=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},S=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},z=function(e){x=i(x,e),w=(0,h.default)();var t=document.all&&!window.atob;return S(x.disable)||t?_():(document.querySelector("body").setAttribute("data-aos-easing",x.easing),document.querySelector("body").setAttribute("data-aos-duration",x.duration),document.querySelector("body").setAttribute("data-aos-delay",x.delay),"DOMContentLoaded"===x.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?j(!0):"load"===x.startEvent?window.addEventListener(x.startEvent,function(){j(!0)}):document.addEventListener(x.startEvent,function(){j(!0)}),window.addEventListener("resize",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(j,x.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,x.once)},x.throttleDelay)),x.disableMutationObserver||(0,d.default)("[data-aos]",O),w)};e.exports={init:z,refresh:j,refreshHard:O}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e){var t=void 0,o=void 0,i=void 0;for(t=0;t<e.length;t+=1){if(o=e[t],o.dataset&&o.dataset.aos)return!0;
16921if(i=o.children&&n(o.children))return!0}return!1}function o(e,t){var n=window.document,o=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=new o(i);r=t,a.observe(n.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function i(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),o=Array.prototype.slice.call(e.removedNodes),i=t.concat(o);if(n(i))return r()})}Object.defineProperty(t,"__esModule",{value:!0});var r=function(){};t.default=o},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),r=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i,a=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,u=/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i,c=/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|
16921sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i,f=function(){function e(){n(this,e)}return i(e,[{key:"phone",value:function(){var e=o();return!(!r.test(e)&&!a.test(e.substr(0,4)))}},{key:"mobile",value:function(){var e=o();return!(!u.test(e)&&!c.test(e.substr(0,4)))}},{key:"tablet",value:function(){return this.mobile()&&!this.phone()}}]),e}();t.default=new f},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e,t,n){var o=e.node.getAttribute("data-aos-once");t>e.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});
16922
16923/***/ })
16924/******/ ]);

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.