Subversion-Projekte lars-tiefland.webanos.faltradxxs.de

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
2 lars 1
/*!
2
 * jQuery JavaScript Library v3.2.1
3
 * https://jquery.com/
4
 *
5
 * Includes Sizzle.js
6
 * https://sizzlejs.com/
7
 *
8
 * Copyright JS Foundation and other contributors
9
 * Released under the MIT license
10
 * https://jquery.org/license
11
 *
12
 * Date: 2017-03-20T18:59Z
13
 */
14
( function( global, factory ) {
15
 
16
	"use strict";
17
 
18
	if ( typeof module === "object" && typeof module.exports === "object" ) {
19
 
20
		// For CommonJS and CommonJS-like environments where a proper `window`
21
		// is present, execute the factory and get jQuery.
22
		// For environments that do not have a `window` with a `document`
23
		// (such as Node.js), expose a factory as module.exports.
24
		// This accentuates the need for the creation of a real `window`.
25
		// e.g. var jQuery = require("jquery")(window);
26
		// See ticket #14549 for more info.
27
		module.exports = global.document ?
28
			factory( global, true ) :
29
			function( w ) {
30
				if ( !w.document ) {
31
					throw new Error( "jQuery requires a window with a document" );
32
				}
33
				return factory( w );
34
			};
35
	} else {
36
		factory( global );
37
	}
38
 
39
// Pass this if window is not defined yet
40
} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
41
 
42
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
43
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
44
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
45
// enough that all such attempts are guarded in a try block.
46
"use strict";
47
 
48
var arr = [];
49
 
50
var document = window.document;
51
 
52
var getProto = Object.getPrototypeOf;
53
 
54
var slice = arr.slice;
55
 
56
var concat = arr.concat;
57
 
58
var push = arr.push;
59
 
60
var indexOf = arr.indexOf;
61
 
62
var class2type = {};
63
 
64
var toString = class2type.toString;
65
 
66
var hasOwn = class2type.hasOwnProperty;
67
 
68
var fnToString = hasOwn.toString;
69
 
70
var ObjectFunctionString = fnToString.call( Object );
71
 
72
var support = {};
73
 
74
 
75
 
76
	function DOMEval( code, doc ) {
77
		doc = doc || document;
78
 
79
		var script = doc.createElement( "script" );
80
 
81
		script.text = code;
82
		doc.head.appendChild( script ).parentNode.removeChild( script );
83
	}
84
/* global Symbol */
85
// Defining this global in .eslintrc.json would create a danger of using the global
86
// unguarded in another place, it seems safer to define global only for this module
87
 
88
 
89
 
90
var
91
	version = "3.2.1",
92
 
93
	// Define a local copy of jQuery
94
	jQuery = function( selector, context ) {
95
 
96
		// The jQuery object is actually just the init constructor 'enhanced'
97
		// Need init if jQuery is called (just allow error to be thrown if not included)
98
		return new jQuery.fn.init( selector, context );
99
	},
100
 
101
	// Support: Android <=4.0 only
102
	// Make sure we trim BOM and NBSP
103
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
104
 
105
	// Matches dashed string for camelizing
106
	rmsPrefix = /^-ms-/,
107
	rdashAlpha = /-([a-z])/g,
108
 
109
	// Used by jQuery.camelCase as callback to replace()
110
	fcamelCase = function( all, letter ) {
111
		return letter.toUpperCase();
112
	};
113
 
114
jQuery.fn = jQuery.prototype = {
115
 
116
	// The current version of jQuery being used
117
	jquery: version,
118
 
119
	constructor: jQuery,
120
 
121
	// The default length of a jQuery object is 0
122
	length: 0,
123
 
124
	toArray: function() {
125
		return slice.call( this );
126
	},
127
 
128
	// Get the Nth element in the matched element set OR
129
	// Get the whole matched element set as a clean array
130
	get: function( num ) {
131
 
132
		// Return all the elements in a clean array
133
		if ( num == null ) {
134
			return slice.call( this );
135
		}
136
 
137
		// Return just the one element from the set
138
		return num < 0 ? this[ num + this.length ] : this[ num ];
139
	},
140
 
141
	// Take an array of elements and push it onto the stack
142
	// (returning the new matched element set)
143
	pushStack: function( elems ) {
144
 
145
		// Build a new jQuery matched element set
146
		var ret = jQuery.merge( this.constructor(), elems );
147
 
148
		// Add the old object onto the stack (as a reference)
149
		ret.prevObject = this;
150
 
151
		// Return the newly-formed element set
152
		return ret;
153
	},
154
 
155
	// Execute a callback for every element in the matched set.
156
	each: function( callback ) {
157
		return jQuery.each( this, callback );
158
	},
159
 
160
	map: function( callback ) {
161
		return this.pushStack( jQuery.map( this, function( elem, i ) {
162
			return callback.call( elem, i, elem );
163
		} ) );
164
	},
165
 
166
	slice: function() {
167
		return this.pushStack( slice.apply( this, arguments ) );
168
	},
169
 
170
	first: function() {
171
		return this.eq( 0 );
172
	},
173
 
174
	last: function() {
175
		return this.eq( -1 );
176
	},
177
 
178
	eq: function( i ) {
179
		var len = this.length,
180
			j = +i + ( i < 0 ? len : 0 );
181
		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
182
	},
183
 
184
	end: function() {
185
		return this.prevObject || this.constructor();
186
	},
187
 
188
	// For internal use only.
189
	// Behaves like an Array's method, not like a jQuery method.
190
	push: push,
191
	sort: arr.sort,
192
	splice: arr.splice
193
};
194
 
195
jQuery.extend = jQuery.fn.extend = function() {
196
	var options, name, src, copy, copyIsArray, clone,
197
		target = arguments[ 0 ] || {},
198
		i = 1,
199
		length = arguments.length,
200
		deep = false;
201
 
202
	// Handle a deep copy situation
203
	if ( typeof target === "boolean" ) {
204
		deep = target;
205
 
206
		// Skip the boolean and the target
207
		target = arguments[ i ] || {};
208
		i++;
209
	}
210
 
211
	// Handle case when target is a string or something (possible in deep copy)
212
	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
213
		target = {};
214
	}
215
 
216
	// Extend jQuery itself if only one argument is passed
217
	if ( i === length ) {
218
		target = this;
219
		i--;
220
	}
221
 
222
	for ( ; i < length; i++ ) {
223
 
224
		// Only deal with non-null/undefined values
225
		if ( ( options = arguments[ i ] ) != null ) {
226
 
227
			// Extend the base object
228
			for ( name in options ) {
229
				src = target[ name ];
230
				copy = options[ name ];
231
 
232
				// Prevent never-ending loop
233
				if ( target === copy ) {
234
					continue;
235
				}
236
 
237
				// Recurse if we're merging plain objects or arrays
238
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
239
					( copyIsArray = Array.isArray( copy ) ) ) ) {
240
 
241
					if ( copyIsArray ) {
242
						copyIsArray = false;
243
						clone = src && Array.isArray( src ) ? src : [];
244
 
245
					} else {
246
						clone = src && jQuery.isPlainObject( src ) ? src : {};
247
					}
248
 
249
					// Never move original objects, clone them
250
					target[ name ] = jQuery.extend( deep, clone, copy );
251
 
252
				// Don't bring in undefined values
253
				} else if ( copy !== undefined ) {
254
					target[ name ] = copy;
255
				}
256
			}
257
		}
258
	}
259
 
260
	// Return the modified object
261
	return target;
262
};
263
 
264
jQuery.extend( {
265
 
266
	// Unique for each copy of jQuery on the page
267
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
268
 
269
	// Assume jQuery is ready without the ready module
270
	isReady: true,
271
 
272
	error: function( msg ) {
273
		throw new Error( msg );
274
	},
275
 
276
	noop: function() {},
277
 
278
	isFunction: function( obj ) {
279
		return jQuery.type( obj ) === "function";
280
	},
281
 
282
	isWindow: function( obj ) {
283
		return obj != null && obj === obj.window;
284
	},
285
 
286
	isNumeric: function( obj ) {
287
 
288
		// As of jQuery 3.0, isNumeric is limited to
289
		// strings and numbers (primitives or objects)
290
		// that can be coerced to finite numbers (gh-2662)
291
		var type = jQuery.type( obj );
292
		return ( type === "number" || type === "string" ) &&
293
 
294
			// parseFloat NaNs numeric-cast false positives ("")
295
			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
296
			// subtraction forces infinities to NaN
297
			!isNaN( obj - parseFloat( obj ) );
298
	},
299
 
300
	isPlainObject: function( obj ) {
301
		var proto, Ctor;
302
 
303
		// Detect obvious negatives
304
		// Use toString instead of jQuery.type to catch host objects
305
		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
306
			return false;
307
		}
308
 
309
		proto = getProto( obj );
310
 
311
		// Objects with no prototype (e.g., `Object.create( null )`) are plain
312
		if ( !proto ) {
313
			return true;
314
		}
315
 
316
		// Objects with prototype are plain iff they were constructed by a global Object function
317
		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
318
		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
319
	},
320
 
321
	isEmptyObject: function( obj ) {
322
 
323
		/* eslint-disable no-unused-vars */
324
		// See https://github.com/eslint/eslint/issues/6125
325
		var name;
326
 
327
		for ( name in obj ) {
328
			return false;
329
		}
330
		return true;
331
	},
332
 
333
	type: function( obj ) {
334
		if ( obj == null ) {
335
			return obj + "";
336
		}
337
 
338
		// Support: Android <=2.3 only (functionish RegExp)
339
		return typeof obj === "object" || typeof obj === "function" ?
340
			class2type[ toString.call( obj ) ] || "object" :
341
			typeof obj;
342
	},
343
 
344
	// Evaluates a script in a global context
345
	globalEval: function( code ) {
346
		DOMEval( code );
347
	},
348
 
349
	// Convert dashed to camelCase; used by the css and data modules
350
	// Support: IE <=9 - 11, Edge 12 - 13
351
	// Microsoft forgot to hump their vendor prefix (#9572)
352
	camelCase: function( string ) {
353
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
354
	},
355
 
356
	each: function( obj, callback ) {
357
		var length, i = 0;
358
 
359
		if ( isArrayLike( obj ) ) {
360
			length = obj.length;
361
			for ( ; i < length; i++ ) {
362
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
363
					break;
364
				}
365
			}
366
		} else {
367
			for ( i in obj ) {
368
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
369
					break;
370
				}
371
			}
372
		}
373
 
374
		return obj;
375
	},
376
 
377
	// Support: Android <=4.0 only
378
	trim: function( text ) {
379
		return text == null ?
380
			"" :
381
			( text + "" ).replace( rtrim, "" );
382
	},
383
 
384
	// results is for internal usage only
385
	makeArray: function( arr, results ) {
386
		var ret = results || [];
387
 
388
		if ( arr != null ) {
389
			if ( isArrayLike( Object( arr ) ) ) {
390
				jQuery.merge( ret,
391
					typeof arr === "string" ?
392
					[ arr ] : arr
393
				);
394
			} else {
395
				push.call( ret, arr );
396
			}
397
		}
398
 
399
		return ret;
400
	},
401
 
402
	inArray: function( elem, arr, i ) {
403
		return arr == null ? -1 : indexOf.call( arr, elem, i );
404
	},
405
 
406
	// Support: Android <=4.0 only, PhantomJS 1 only
407
	// push.apply(_, arraylike) throws on ancient WebKit
408
	merge: function( first, second ) {
409
		var len = +second.length,
410
			j = 0,
411
			i = first.length;
412
 
413
		for ( ; j < len; j++ ) {
414
			first[ i++ ] = second[ j ];
415
		}
416
 
417
		first.length = i;
418
 
419
		return first;
420
	},
421
 
422
	grep: function( elems, callback, invert ) {
423
		var callbackInverse,
424
			matches = [],
425
			i = 0,
426
			length = elems.length,
427
			callbackExpect = !invert;
428
 
429
		// Go through the array, only saving the items
430
		// that pass the validator function
431
		for ( ; i < length; i++ ) {
432
			callbackInverse = !callback( elems[ i ], i );
433
			if ( callbackInverse !== callbackExpect ) {
434
				matches.push( elems[ i ] );
435
			}
436
		}
437
 
438
		return matches;
439
	},
440
 
441
	// arg is for internal usage only
442
	map: function( elems, callback, arg ) {
443
		var length, value,
444
			i = 0,
445
			ret = [];
446
 
447
		// Go through the array, translating each of the items to their new values
448
		if ( isArrayLike( elems ) ) {
449
			length = elems.length;
450
			for ( ; i < length; i++ ) {
451
				value = callback( elems[ i ], i, arg );
452
 
453
				if ( value != null ) {
454
					ret.push( value );
455
				}
456
			}
457
 
458
		// Go through every key on the object,
459
		} else {
460
			for ( i in elems ) {
461
				value = callback( elems[ i ], i, arg );
462
 
463
				if ( value != null ) {
464
					ret.push( value );
465
				}
466
			}
467
		}
468
 
469
		// Flatten any nested arrays
470
		return concat.apply( [], ret );
471
	},
472
 
473
	// A global GUID counter for objects
474
	guid: 1,
475
 
476
	// Bind a function to a context, optionally partially applying any
477
	// arguments.
478
	proxy: function( fn, context ) {
479
		var tmp, args, proxy;
480
 
481
		if ( typeof context === "string" ) {
482
			tmp = fn[ context ];
483
			context = fn;
484
			fn = tmp;
485
		}
486
 
487
		// Quick check to determine if target is callable, in the spec
488
		// this throws a TypeError, but we will just return undefined.
489
		if ( !jQuery.isFunction( fn ) ) {
490
			return undefined;
491
		}
492
 
493
		// Simulated bind
494
		args = slice.call( arguments, 2 );
495
		proxy = function() {
496
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
497
		};
498
 
499
		// Set the guid of unique handler to the same of original handler, so it can be removed
500
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
501
 
502
		return proxy;
503
	},
504
 
505
	now: Date.now,
506
 
507
	// jQuery.support is not used in Core but other projects attach their
508
	// properties to it so it needs to exist.
509
	support: support
510
} );
511
 
512
if ( typeof Symbol === "function" ) {
513
	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
514
}
515
 
516
// Populate the class2type map
517
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
518
function( i, name ) {
519
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
520
} );
521
 
522
function isArrayLike( obj ) {
523
 
524
	// Support: real iOS 8.2 only (not reproducible in simulator)
525
	// `in` check used to prevent JIT error (gh-2145)
526
	// hasOwn isn't used here due to false negatives
527
	// regarding Nodelist length in IE
528
	var length = !!obj && "length" in obj && obj.length,
529
		type = jQuery.type( obj );
530
 
531
	if ( type === "function" || jQuery.isWindow( obj ) ) {
532
		return false;
533
	}
534
 
535
	return type === "array" || length === 0 ||
536
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
537
}
538
var Sizzle =
539
/*!
540
 * Sizzle CSS Selector Engine v2.3.3
541
 * https://sizzlejs.com/
542
 *
543
 * Copyright jQuery Foundation and other contributors
544
 * Released under the MIT license
545
 * http://jquery.org/license
546
 *
547
 * Date: 2016-08-08
548
 */
549
(function( window ) {
550
 
551
var i,
552
	support,
553
	Expr,
554
	getText,
555
	isXML,
556
	tokenize,
557
	compile,
558
	select,
559
	outermostContext,
560
	sortInput,
561
	hasDuplicate,
562
 
563
	// Local document vars
564
	setDocument,
565
	document,
566
	docElem,
567
	documentIsHTML,
568
	rbuggyQSA,
569
	rbuggyMatches,
570
	matches,
571
	contains,
572
 
573
	// Instance-specific data
574
	expando = "sizzle" + 1 * new Date(),
575
	preferredDoc = window.document,
576
	dirruns = 0,
577
	done = 0,
578
	classCache = createCache(),
579
	tokenCache = createCache(),
580
	compilerCache = createCache(),
581
	sortOrder = function( a, b ) {
582
		if ( a === b ) {
583
			hasDuplicate = true;
584
		}
585
		return 0;
586
	},
587
 
588
	// Instance methods
589
	hasOwn = ({}).hasOwnProperty,
590
	arr = [],
591
	pop = arr.pop,
592
	push_native = arr.push,
593
	push = arr.push,
594
	slice = arr.slice,
595
	// Use a stripped-down indexOf as it's faster than native
596
	// https://jsperf.com/thor-indexof-vs-for/5
597
	indexOf = function( list, elem ) {
598
		var i = 0,
599
			len = list.length;
600
		for ( ; i < len; i++ ) {
601
			if ( list[i] === elem ) {
602
				return i;
603
			}
604
		}
605
		return -1;
606
	},
607
 
608
	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
609
 
610
	// Regular expressions
611
 
612
	// http://www.w3.org/TR/css3-selectors/#whitespace
613
	whitespace = "[\\x20\\t\\r\\n\\f]",
614
 
615
	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
616
	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
617
 
618
	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
619
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
620
		// Operator (capture 2)
621
		"*([*^$|!~]?=)" + whitespace +
622
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
623
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
624
		"*\\]",
625
 
626
	pseudos = ":(" + identifier + ")(?:\\((" +
627
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
628
		// 1. quoted (capture 3; capture 4 or capture 5)
629
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
630
		// 2. simple (capture 6)
631
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
632
		// 3. anything else (capture 2)
633
		".*" +
634
		")\\)|)",
635
 
636
	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
637
	rwhitespace = new RegExp( whitespace + "+", "g" ),
638
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
639
 
640
	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
641
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
642
 
643
	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
644
 
645
	rpseudo = new RegExp( pseudos ),
646
	ridentifier = new RegExp( "^" + identifier + "$" ),
647
 
648
	matchExpr = {
649
		"ID": new RegExp( "^#(" + identifier + ")" ),
650
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
651
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
652
		"ATTR": new RegExp( "^" + attributes ),
653
		"PSEUDO": new RegExp( "^" + pseudos ),
654
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
655
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
656
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
657
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
658
		// For use in libraries implementing .is()
659
		// We use this for POS matching in `select`
660
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
661
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
662
	},
663
 
664
	rinputs = /^(?:input|select|textarea|button)$/i,
665
	rheader = /^h\d$/i,
666
 
667
	rnative = /^[^{]+\{\s*\[native \w/,
668
 
669
	// Easily-parseable/retrievable ID or TAG or CLASS selectors
670
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
671
 
672
	rsibling = /[+~]/,
673
 
674
	// CSS escapes
675
	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
676
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
677
	funescape = function( _, escaped, escapedWhitespace ) {
678
		var high = "0x" + escaped - 0x10000;
679
		// NaN means non-codepoint
680
		// Support: Firefox<24
681
		// Workaround erroneous numeric interpretation of +"0x"
682
		return high !== high || escapedWhitespace ?
683
			escaped :
684
			high < 0 ?
685
				// BMP codepoint
686
				String.fromCharCode( high + 0x10000 ) :
687
				// Supplemental Plane codepoint (surrogate pair)
688
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
689
	},
690
 
691
	// CSS string/identifier serialization
692
	// https://drafts.csswg.org/cssom/#common-serializing-idioms
693
	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
694
	fcssescape = function( ch, asCodePoint ) {
695
		if ( asCodePoint ) {
696
 
697
			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
698
			if ( ch === "\0" ) {
699
				return "\uFFFD";
700
			}
701
 
702
			// Control characters and (dependent upon position) numbers get escaped as code points
703
			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
704
		}
705
 
706
		// Other potentially-special ASCII characters get backslash-escaped
707
		return "\\" + ch;
708
	},
709
 
710
	// Used for iframes
711
	// See setDocument()
712
	// Removing the function wrapper causes a "Permission Denied"
713
	// error in IE
714
	unloadHandler = function() {
715
		setDocument();
716
	},
717
 
718
	disabledAncestor = addCombinator(
719
		function( elem ) {
720
			return elem.disabled === true && ("form" in elem || "label" in elem);
721
		},
722
		{ dir: "parentNode", next: "legend" }
723
	);
724
 
725
// Optimize for push.apply( _, NodeList )
726
try {
727
	push.apply(
728
		(arr = slice.call( preferredDoc.childNodes )),
729
		preferredDoc.childNodes
730
	);
731
	// Support: Android<4.0
732
	// Detect silently failing push.apply
733
	arr[ preferredDoc.childNodes.length ].nodeType;
734
} catch ( e ) {
735
	push = { apply: arr.length ?
736
 
737
		// Leverage slice if possible
738
		function( target, els ) {
739
			push_native.apply( target, slice.call(els) );
740
		} :
741
 
742
		// Support: IE<9
743
		// Otherwise append directly
744
		function( target, els ) {
745
			var j = target.length,
746
				i = 0;
747
			// Can't trust NodeList.length
748
			while ( (target[j++] = els[i++]) ) {}
749
			target.length = j - 1;
750
		}
751
	};
752
}
753
 
754
function Sizzle( selector, context, results, seed ) {
755
	var m, i, elem, nid, match, groups, newSelector,
756
		newContext = context && context.ownerDocument,
757
 
758
		// nodeType defaults to 9, since context defaults to document
759
		nodeType = context ? context.nodeType : 9;
760
 
761
	results = results || [];
762
 
763
	// Return early from calls with invalid selector or context
764
	if ( typeof selector !== "string" || !selector ||
765
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
766
 
767
		return results;
768
	}
769
 
770
	// Try to shortcut find operations (as opposed to filters) in HTML documents
771
	if ( !seed ) {
772
 
773
		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
774
			setDocument( context );
775
		}
776
		context = context || document;
777
 
778
		if ( documentIsHTML ) {
779
 
780
			// If the selector is sufficiently simple, try using a "get*By*" DOM method
781
			// (excepting DocumentFragment context, where the methods don't exist)
782
			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
783
 
784
				// ID selector
785
				if ( (m = match[1]) ) {
786
 
787
					// Document context
788
					if ( nodeType === 9 ) {
789
						if ( (elem = context.getElementById( m )) ) {
790
 
791
							// Support: IE, Opera, Webkit
792
							// TODO: identify versions
793
							// getElementById can match elements by name instead of ID
794
							if ( elem.id === m ) {
795
								results.push( elem );
796
								return results;
797
							}
798
						} else {
799
							return results;
800
						}
801
 
802
					// Element context
803
					} else {
804
 
805
						// Support: IE, Opera, Webkit
806
						// TODO: identify versions
807
						// getElementById can match elements by name instead of ID
808
						if ( newContext && (elem = newContext.getElementById( m )) &&
809
							contains( context, elem ) &&
810
							elem.id === m ) {
811
 
812
							results.push( elem );
813
							return results;
814
						}
815
					}
816
 
817
				// Type selector
818
				} else if ( match[2] ) {
819
					push.apply( results, context.getElementsByTagName( selector ) );
820
					return results;
821
 
822
				// Class selector
823
				} else if ( (m = match[3]) && support.getElementsByClassName &&
824
					context.getElementsByClassName ) {
825
 
826
					push.apply( results, context.getElementsByClassName( m ) );
827
					return results;
828
				}
829
			}
830
 
831
			// Take advantage of querySelectorAll
832
			if ( support.qsa &&
833
				!compilerCache[ selector + " " ] &&
834
				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
835
 
836
				if ( nodeType !== 1 ) {
837
					newContext = context;
838
					newSelector = selector;
839
 
840
				// qSA looks outside Element context, which is not what we want
841
				// Thanks to Andrew Dupont for this workaround technique
842
				// Support: IE <=8
843
				// Exclude object elements
844
				} else if ( context.nodeName.toLowerCase() !== "object" ) {
845
 
846
					// Capture the context ID, setting it first if necessary
847
					if ( (nid = context.getAttribute( "id" )) ) {
848
						nid = nid.replace( rcssescape, fcssescape );
849
					} else {
850
						context.setAttribute( "id", (nid = expando) );
851
					}
852
 
853
					// Prefix every selector in the list
854
					groups = tokenize( selector );
855
					i = groups.length;
856
					while ( i-- ) {
857
						groups[i] = "#" + nid + " " + toSelector( groups[i] );
858
					}
859
					newSelector = groups.join( "," );
860
 
861
					// Expand context for sibling selectors
862
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
863
						context;
864
				}
865
 
866
				if ( newSelector ) {
867
					try {
868
						push.apply( results,
869
							newContext.querySelectorAll( newSelector )
870
						);
871
						return results;
872
					} catch ( qsaError ) {
873
					} finally {
874
						if ( nid === expando ) {
875
							context.removeAttribute( "id" );
876
						}
877
					}
878
				}
879
			}
880
		}
881
	}
882
 
883
	// All others
884
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
885
}
886
 
887
/**
888
 * Create key-value caches of limited size
889
 * @returns {function(string, object)} Returns the Object data after storing it on itself with
890
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
891
 *	deleting the oldest entry
892
 */
893
function createCache() {
894
	var keys = [];
895
 
896
	function cache( key, value ) {
897
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
898
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
899
			// Only keep the most recent entries
900
			delete cache[ keys.shift() ];
901
		}
902
		return (cache[ key + " " ] = value);
903
	}
904
	return cache;
905
}
906
 
907
/**
908
 * Mark a function for special use by Sizzle
909
 * @param {Function} fn The function to mark
910
 */
911
function markFunction( fn ) {
912
	fn[ expando ] = true;
913
	return fn;
914
}
915
 
916
/**
917
 * Support testing using an element
918
 * @param {Function} fn Passed the created element and returns a boolean result
919
 */
920
function assert( fn ) {
921
	var el = document.createElement("fieldset");
922
 
923
	try {
924
		return !!fn( el );
925
	} catch (e) {
926
		return false;
927
	} finally {
928
		// Remove from its parent by default
929
		if ( el.parentNode ) {
930
			el.parentNode.removeChild( el );
931
		}
932
		// release memory in IE
933
		el = null;
934
	}
935
}
936
 
937
/**
938
 * Adds the same handler for all of the specified attrs
939
 * @param {String} attrs Pipe-separated list of attributes
940
 * @param {Function} handler The method that will be applied
941
 */
942
function addHandle( attrs, handler ) {
943
	var arr = attrs.split("|"),
944
		i = arr.length;
945
 
946
	while ( i-- ) {
947
		Expr.attrHandle[ arr[i] ] = handler;
948
	}
949
}
950
 
951
/**
952
 * Checks document order of two siblings
953
 * @param {Element} a
954
 * @param {Element} b
955
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
956
 */
957
function siblingCheck( a, b ) {
958
	var cur = b && a,
959
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
960
			a.sourceIndex - b.sourceIndex;
961
 
962
	// Use IE sourceIndex if available on both nodes
963
	if ( diff ) {
964
		return diff;
965
	}
966
 
967
	// Check if b follows a
968
	if ( cur ) {
969
		while ( (cur = cur.nextSibling) ) {
970
			if ( cur === b ) {
971
				return -1;
972
			}
973
		}
974
	}
975
 
976
	return a ? 1 : -1;
977
}
978
 
979
/**
980
 * Returns a function to use in pseudos for input types
981
 * @param {String} type
982
 */
983
function createInputPseudo( type ) {
984
	return function( elem ) {
985
		var name = elem.nodeName.toLowerCase();
986
		return name === "input" && elem.type === type;
987
	};
988
}
989
 
990
/**
991
 * Returns a function to use in pseudos for buttons
992
 * @param {String} type
993
 */
994
function createButtonPseudo( type ) {
995
	return function( elem ) {
996
		var name = elem.nodeName.toLowerCase();
997
		return (name === "input" || name === "button") && elem.type === type;
998
	};
999
}
1000
 
1001
/**
1002
 * Returns a function to use in pseudos for :enabled/:disabled
1003
 * @param {Boolean} disabled true for :disabled; false for :enabled
1004
 */
1005
function createDisabledPseudo( disabled ) {
1006
 
1007
	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
1008
	return function( elem ) {
1009
 
1010
		// Only certain elements can match :enabled or :disabled
1011
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
1012
		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
1013
		if ( "form" in elem ) {
1014
 
1015
			// Check for inherited disabledness on relevant non-disabled elements:
1016
			// * listed form-associated elements in a disabled fieldset
1017
			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
1018
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
1019
			// * option elements in a disabled optgroup
1020
			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
1021
			// All such elements have a "form" property.
1022
			if ( elem.parentNode && elem.disabled === false ) {
1023
 
1024
				// Option elements defer to a parent optgroup if present
1025
				if ( "label" in elem ) {
1026
					if ( "label" in elem.parentNode ) {
1027
						return elem.parentNode.disabled === disabled;
1028
					} else {
1029
						return elem.disabled === disabled;
1030
					}
1031
				}
1032
 
1033
				// Support: IE 6 - 11
1034
				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
1035
				return elem.isDisabled === disabled ||
1036
 
1037
					// Where there is no isDisabled, check manually
1038
					/* jshint -W018 */
1039
					elem.isDisabled !== !disabled &&
1040
						disabledAncestor( elem ) === disabled;
1041
			}
1042
 
1043
			return elem.disabled === disabled;
1044
 
1045
		// Try to winnow out elements that can't be disabled before trusting the disabled property.
1046
		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
1047
		// even exist on them, let alone have a boolean value.
1048
		} else if ( "label" in elem ) {
1049
			return elem.disabled === disabled;
1050
		}
1051
 
1052
		// Remaining elements are neither :enabled nor :disabled
1053
		return false;
1054
	};
1055
}
1056
 
1057
/**
1058
 * Returns a function to use in pseudos for positionals
1059
 * @param {Function} fn
1060
 */
1061
function createPositionalPseudo( fn ) {
1062
	return markFunction(function( argument ) {
1063
		argument = +argument;
1064
		return markFunction(function( seed, matches ) {
1065
			var j,
1066
				matchIndexes = fn( [], seed.length, argument ),
1067
				i = matchIndexes.length;
1068
 
1069
			// Match elements found at the specified indexes
1070
			while ( i-- ) {
1071
				if ( seed[ (j = matchIndexes[i]) ] ) {
1072
					seed[j] = !(matches[j] = seed[j]);
1073
				}
1074
			}
1075
		});
1076
	});
1077
}
1078
 
1079
/**
1080
 * Checks a node for validity as a Sizzle context
1081
 * @param {Element|Object=} context
1082
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1083
 */
1084
function testContext( context ) {
1085
	return context && typeof context.getElementsByTagName !== "undefined" && context;
1086
}
1087
 
1088
// Expose support vars for convenience
1089
support = Sizzle.support = {};
1090
 
1091
/**
1092
 * Detects XML nodes
1093
 * @param {Element|Object} elem An element or a document
1094
 * @returns {Boolean} True iff elem is a non-HTML XML node
1095
 */
1096
isXML = Sizzle.isXML = function( elem ) {
1097
	// documentElement is verified for cases where it doesn't yet exist
1098
	// (such as loading iframes in IE - #4833)
1099
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1100
	return documentElement ? documentElement.nodeName !== "HTML" : false;
1101
};
1102
 
1103
/**
1104
 * Sets document-related variables once based on the current document
1105
 * @param {Element|Object} [doc] An element or document object to use to set the document
1106
 * @returns {Object} Returns the current document
1107
 */
1108
setDocument = Sizzle.setDocument = function( node ) {
1109
	var hasCompare, subWindow,
1110
		doc = node ? node.ownerDocument || node : preferredDoc;
1111
 
1112
	// Return early if doc is invalid or already selected
1113
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1114
		return document;
1115
	}
1116
 
1117
	// Update global variables
1118
	document = doc;
1119
	docElem = document.documentElement;
1120
	documentIsHTML = !isXML( document );
1121
 
1122
	// Support: IE 9-11, Edge
1123
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1124
	if ( preferredDoc !== document &&
1125
		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1126
 
1127
		// Support: IE 11, Edge
1128
		if ( subWindow.addEventListener ) {
1129
			subWindow.addEventListener( "unload", unloadHandler, false );
1130
 
1131
		// Support: IE 9 - 10 only
1132
		} else if ( subWindow.attachEvent ) {
1133
			subWindow.attachEvent( "onunload", unloadHandler );
1134
		}
1135
	}
1136
 
1137
	/* Attributes
1138
	---------------------------------------------------------------------- */
1139
 
1140
	// Support: IE<8
1141
	// Verify that getAttribute really returns attributes and not properties
1142
	// (excepting IE8 booleans)
1143
	support.attributes = assert(function( el ) {
1144
		el.className = "i";
1145
		return !el.getAttribute("className");
1146
	});
1147
 
1148
	/* getElement(s)By*
1149
	---------------------------------------------------------------------- */
1150
 
1151
	// Check if getElementsByTagName("*") returns only elements
1152
	support.getElementsByTagName = assert(function( el ) {
1153
		el.appendChild( document.createComment("") );
1154
		return !el.getElementsByTagName("*").length;
1155
	});
1156
 
1157
	// Support: IE<9
1158
	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1159
 
1160
	// Support: IE<10
1161
	// Check if getElementById returns elements by name
1162
	// The broken getElementById methods don't pick up programmatically-set names,
1163
	// so use a roundabout getElementsByName test
1164
	support.getById = assert(function( el ) {
1165
		docElem.appendChild( el ).id = expando;
1166
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
1167
	});
1168
 
1169
	// ID filter and find
1170
	if ( support.getById ) {
1171
		Expr.filter["ID"] = function( id ) {
1172
			var attrId = id.replace( runescape, funescape );
1173
			return function( elem ) {
1174
				return elem.getAttribute("id") === attrId;
1175
			};
1176
		};
1177
		Expr.find["ID"] = function( id, context ) {
1178
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1179
				var elem = context.getElementById( id );
1180
				return elem ? [ elem ] : [];
1181
			}
1182
		};
1183
	} else {
1184
		Expr.filter["ID"] =  function( id ) {
1185
			var attrId = id.replace( runescape, funescape );
1186
			return function( elem ) {
1187
				var node = typeof elem.getAttributeNode !== "undefined" &&
1188
					elem.getAttributeNode("id");
1189
				return node && node.value === attrId;
1190
			};
1191
		};
1192
 
1193
		// Support: IE 6 - 7 only
1194
		// getElementById is not reliable as a find shortcut
1195
		Expr.find["ID"] = function( id, context ) {
1196
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1197
				var node, i, elems,
1198
					elem = context.getElementById( id );
1199
 
1200
				if ( elem ) {
1201
 
1202
					// Verify the id attribute
1203
					node = elem.getAttributeNode("id");
1204
					if ( node && node.value === id ) {
1205
						return [ elem ];
1206
					}
1207
 
1208
					// Fall back on getElementsByName
1209
					elems = context.getElementsByName( id );
1210
					i = 0;
1211
					while ( (elem = elems[i++]) ) {
1212
						node = elem.getAttributeNode("id");
1213
						if ( node && node.value === id ) {
1214
							return [ elem ];
1215
						}
1216
					}
1217
				}
1218
 
1219
				return [];
1220
			}
1221
		};
1222
	}
1223
 
1224
	// Tag
1225
	Expr.find["TAG"] = support.getElementsByTagName ?
1226
		function( tag, context ) {
1227
			if ( typeof context.getElementsByTagName !== "undefined" ) {
1228
				return context.getElementsByTagName( tag );
1229
 
1230
			// DocumentFragment nodes don't have gEBTN
1231
			} else if ( support.qsa ) {
1232
				return context.querySelectorAll( tag );
1233
			}
1234
		} :
1235
 
1236
		function( tag, context ) {
1237
			var elem,
1238
				tmp = [],
1239
				i = 0,
1240
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1241
				results = context.getElementsByTagName( tag );
1242
 
1243
			// Filter out possible comments
1244
			if ( tag === "*" ) {
1245
				while ( (elem = results[i++]) ) {
1246
					if ( elem.nodeType === 1 ) {
1247
						tmp.push( elem );
1248
					}
1249
				}
1250
 
1251
				return tmp;
1252
			}
1253
			return results;
1254
		};
1255
 
1256
	// Class
1257
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1258
		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1259
			return context.getElementsByClassName( className );
1260
		}
1261
	};
1262
 
1263
	/* QSA/matchesSelector
1264
	---------------------------------------------------------------------- */
1265
 
1266
	// QSA and matchesSelector support
1267
 
1268
	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1269
	rbuggyMatches = [];
1270
 
1271
	// qSa(:focus) reports false when true (Chrome 21)
1272
	// We allow this because of a bug in IE8/9 that throws an error
1273
	// whenever `document.activeElement` is accessed on an iframe
1274
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1275
	// See https://bugs.jquery.com/ticket/13378
1276
	rbuggyQSA = [];
1277
 
1278
	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1279
		// Build QSA regex
1280
		// Regex strategy adopted from Diego Perini
1281
		assert(function( el ) {
1282
			// Select is set to empty string on purpose
1283
			// This is to test IE's treatment of not explicitly
1284
			// setting a boolean content attribute,
1285
			// since its presence should be enough
1286
			// https://bugs.jquery.com/ticket/12359
1287
			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1288
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
1289
				"<option selected=''></option></select>";
1290
 
1291
			// Support: IE8, Opera 11-12.16
1292
			// Nothing should be selected when empty strings follow ^= or $= or *=
1293
			// The test attribute must be unknown in Opera but "safe" for WinRT
1294
			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1295
			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1296
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1297
			}
1298
 
1299
			// Support: IE8
1300
			// Boolean attributes and "value" are not treated correctly
1301
			if ( !el.querySelectorAll("[selected]").length ) {
1302
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1303
			}
1304
 
1305
			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1306
			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1307
				rbuggyQSA.push("~=");
1308
			}
1309
 
1310
			// Webkit/Opera - :checked should return selected option elements
1311
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1312
			// IE8 throws error here and will not see later tests
1313
			if ( !el.querySelectorAll(":checked").length ) {
1314
				rbuggyQSA.push(":checked");
1315
			}
1316
 
1317
			// Support: Safari 8+, iOS 8+
1318
			// https://bugs.webkit.org/show_bug.cgi?id=136851
1319
			// In-page `selector#id sibling-combinator selector` fails
1320
			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1321
				rbuggyQSA.push(".#.+[+~]");
1322
			}
1323
		});
1324
 
1325
		assert(function( el ) {
1326
			el.innerHTML = "<a href='' disabled='disabled'></a>" +
1327
				"<select disabled='disabled'><option/></select>";
1328
 
1329
			// Support: Windows 8 Native Apps
1330
			// The type and name attributes are restricted during .innerHTML assignment
1331
			var input = document.createElement("input");
1332
			input.setAttribute( "type", "hidden" );
1333
			el.appendChild( input ).setAttribute( "name", "D" );
1334
 
1335
			// Support: IE8
1336
			// Enforce case-sensitivity of name attribute
1337
			if ( el.querySelectorAll("[name=d]").length ) {
1338
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1339
			}
1340
 
1341
			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1342
			// IE8 throws error here and will not see later tests
1343
			if ( el.querySelectorAll(":enabled").length !== 2 ) {
1344
				rbuggyQSA.push( ":enabled", ":disabled" );
1345
			}
1346
 
1347
			// Support: IE9-11+
1348
			// IE's :disabled selector does not pick up the children of disabled fieldsets
1349
			docElem.appendChild( el ).disabled = true;
1350
			if ( el.querySelectorAll(":disabled").length !== 2 ) {
1351
				rbuggyQSA.push( ":enabled", ":disabled" );
1352
			}
1353
 
1354
			// Opera 10-11 does not throw on post-comma invalid pseudos
1355
			el.querySelectorAll("*,:x");
1356
			rbuggyQSA.push(",.*:");
1357
		});
1358
	}
1359
 
1360
	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1361
		docElem.webkitMatchesSelector ||
1362
		docElem.mozMatchesSelector ||
1363
		docElem.oMatchesSelector ||
1364
		docElem.msMatchesSelector) )) ) {
1365
 
1366
		assert(function( el ) {
1367
			// Check to see if it's possible to do matchesSelector
1368
			// on a disconnected node (IE 9)
1369
			support.disconnectedMatch = matches.call( el, "*" );
1370
 
1371
			// This should fail with an exception
1372
			// Gecko does not error, returns false instead
1373
			matches.call( el, "[s!='']:x" );
1374
			rbuggyMatches.push( "!=", pseudos );
1375
		});
1376
	}
1377
 
1378
	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1379
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1380
 
1381
	/* Contains
1382
	---------------------------------------------------------------------- */
1383
	hasCompare = rnative.test( docElem.compareDocumentPosition );
1384
 
1385
	// Element contains another
1386
	// Purposefully self-exclusive
1387
	// As in, an element does not contain itself
1388
	contains = hasCompare || rnative.test( docElem.contains ) ?
1389
		function( a, b ) {
1390
			var adown = a.nodeType === 9 ? a.documentElement : a,
1391
				bup = b && b.parentNode;
1392
			return a === bup || !!( bup && bup.nodeType === 1 && (
1393
				adown.contains ?
1394
					adown.contains( bup ) :
1395
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1396
			));
1397
		} :
1398
		function( a, b ) {
1399
			if ( b ) {
1400
				while ( (b = b.parentNode) ) {
1401
					if ( b === a ) {
1402
						return true;
1403
					}
1404
				}
1405
			}
1406
			return false;
1407
		};
1408
 
1409
	/* Sorting
1410
	---------------------------------------------------------------------- */
1411
 
1412
	// Document order sorting
1413
	sortOrder = hasCompare ?
1414
	function( a, b ) {
1415
 
1416
		// Flag for duplicate removal
1417
		if ( a === b ) {
1418
			hasDuplicate = true;
1419
			return 0;
1420
		}
1421
 
1422
		// Sort on method existence if only one input has compareDocumentPosition
1423
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1424
		if ( compare ) {
1425
			return compare;
1426
		}
1427
 
1428
		// Calculate position if both inputs belong to the same document
1429
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1430
			a.compareDocumentPosition( b ) :
1431
 
1432
			// Otherwise we know they are disconnected
1433
			1;
1434
 
1435
		// Disconnected nodes
1436
		if ( compare & 1 ||
1437
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1438
 
1439
			// Choose the first element that is related to our preferred document
1440
			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1441
				return -1;
1442
			}
1443
			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1444
				return 1;
1445
			}
1446
 
1447
			// Maintain original order
1448
			return sortInput ?
1449
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1450
				0;
1451
		}
1452
 
1453
		return compare & 4 ? -1 : 1;
1454
	} :
1455
	function( a, b ) {
1456
		// Exit early if the nodes are identical
1457
		if ( a === b ) {
1458
			hasDuplicate = true;
1459
			return 0;
1460
		}
1461
 
1462
		var cur,
1463
			i = 0,
1464
			aup = a.parentNode,
1465
			bup = b.parentNode,
1466
			ap = [ a ],
1467
			bp = [ b ];
1468
 
1469
		// Parentless nodes are either documents or disconnected
1470
		if ( !aup || !bup ) {
1471
			return a === document ? -1 :
1472
				b === document ? 1 :
1473
				aup ? -1 :
1474
				bup ? 1 :
1475
				sortInput ?
1476
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1477
				0;
1478
 
1479
		// If the nodes are siblings, we can do a quick check
1480
		} else if ( aup === bup ) {
1481
			return siblingCheck( a, b );
1482
		}
1483
 
1484
		// Otherwise we need full lists of their ancestors for comparison
1485
		cur = a;
1486
		while ( (cur = cur.parentNode) ) {
1487
			ap.unshift( cur );
1488
		}
1489
		cur = b;
1490
		while ( (cur = cur.parentNode) ) {
1491
			bp.unshift( cur );
1492
		}
1493
 
1494
		// Walk down the tree looking for a discrepancy
1495
		while ( ap[i] === bp[i] ) {
1496
			i++;
1497
		}
1498
 
1499
		return i ?
1500
			// Do a sibling check if the nodes have a common ancestor
1501
			siblingCheck( ap[i], bp[i] ) :
1502
 
1503
			// Otherwise nodes in our document sort first
1504
			ap[i] === preferredDoc ? -1 :
1505
			bp[i] === preferredDoc ? 1 :
1506
			0;
1507
	};
1508
 
1509
	return document;
1510
};
1511
 
1512
Sizzle.matches = function( expr, elements ) {
1513
	return Sizzle( expr, null, null, elements );
1514
};
1515
 
1516
Sizzle.matchesSelector = function( elem, expr ) {
1517
	// Set document vars if needed
1518
	if ( ( elem.ownerDocument || elem ) !== document ) {
1519
		setDocument( elem );
1520
	}
1521
 
1522
	// Make sure that attribute selectors are quoted
1523
	expr = expr.replace( rattributeQuotes, "='$1']" );
1524
 
1525
	if ( support.matchesSelector && documentIsHTML &&
1526
		!compilerCache[ expr + " " ] &&
1527
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1528
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1529
 
1530
		try {
1531
			var ret = matches.call( elem, expr );
1532
 
1533
			// IE 9's matchesSelector returns false on disconnected nodes
1534
			if ( ret || support.disconnectedMatch ||
1535
					// As well, disconnected nodes are said to be in a document
1536
					// fragment in IE 9
1537
					elem.document && elem.document.nodeType !== 11 ) {
1538
				return ret;
1539
			}
1540
		} catch (e) {}
1541
	}
1542
 
1543
	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1544
};
1545
 
1546
Sizzle.contains = function( context, elem ) {
1547
	// Set document vars if needed
1548
	if ( ( context.ownerDocument || context ) !== document ) {
1549
		setDocument( context );
1550
	}
1551
	return contains( context, elem );
1552
};
1553
 
1554
Sizzle.attr = function( elem, name ) {
1555
	// Set document vars if needed
1556
	if ( ( elem.ownerDocument || elem ) !== document ) {
1557
		setDocument( elem );
1558
	}
1559
 
1560
	var fn = Expr.attrHandle[ name.toLowerCase() ],
1561
		// Don't get fooled by Object.prototype properties (jQuery #13807)
1562
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1563
			fn( elem, name, !documentIsHTML ) :
1564
			undefined;
1565
 
1566
	return val !== undefined ?
1567
		val :
1568
		support.attributes || !documentIsHTML ?
1569
			elem.getAttribute( name ) :
1570
			(val = elem.getAttributeNode(name)) && val.specified ?
1571
				val.value :
1572
				null;
1573
};
1574
 
1575
Sizzle.escape = function( sel ) {
1576
	return (sel + "").replace( rcssescape, fcssescape );
1577
};
1578
 
1579
Sizzle.error = function( msg ) {
1580
	throw new Error( "Syntax error, unrecognized expression: " + msg );
1581
};
1582
 
1583
/**
1584
 * Document sorting and removing duplicates
1585
 * @param {ArrayLike} results
1586
 */
1587
Sizzle.uniqueSort = function( results ) {
1588
	var elem,
1589
		duplicates = [],
1590
		j = 0,
1591
		i = 0;
1592
 
1593
	// Unless we *know* we can detect duplicates, assume their presence
1594
	hasDuplicate = !support.detectDuplicates;
1595
	sortInput = !support.sortStable && results.slice( 0 );
1596
	results.sort( sortOrder );
1597
 
1598
	if ( hasDuplicate ) {
1599
		while ( (elem = results[i++]) ) {
1600
			if ( elem === results[ i ] ) {
1601
				j = duplicates.push( i );
1602
			}
1603
		}
1604
		while ( j-- ) {
1605
			results.splice( duplicates[ j ], 1 );
1606
		}
1607
	}
1608
 
1609
	// Clear input after sorting to release objects
1610
	// See https://github.com/jquery/sizzle/pull/225
1611
	sortInput = null;
1612
 
1613
	return results;
1614
};
1615
 
1616
/**
1617
 * Utility function for retrieving the text value of an array of DOM nodes
1618
 * @param {Array|Element} elem
1619
 */
1620
getText = Sizzle.getText = function( elem ) {
1621
	var node,
1622
		ret = "",
1623
		i = 0,
1624
		nodeType = elem.nodeType;
1625
 
1626
	if ( !nodeType ) {
1627
		// If no nodeType, this is expected to be an array
1628
		while ( (node = elem[i++]) ) {
1629
			// Do not traverse comment nodes
1630
			ret += getText( node );
1631
		}
1632
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1633
		// Use textContent for elements
1634
		// innerText usage removed for consistency of new lines (jQuery #11153)
1635
		if ( typeof elem.textContent === "string" ) {
1636
			return elem.textContent;
1637
		} else {
1638
			// Traverse its children
1639
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1640
				ret += getText( elem );
1641
			}
1642
		}
1643
	} else if ( nodeType === 3 || nodeType === 4 ) {
1644
		return elem.nodeValue;
1645
	}
1646
	// Do not include comment or processing instruction nodes
1647
 
1648
	return ret;
1649
};
1650
 
1651
Expr = Sizzle.selectors = {
1652
 
1653
	// Can be adjusted by the user
1654
	cacheLength: 50,
1655
 
1656
	createPseudo: markFunction,
1657
 
1658
	match: matchExpr,
1659
 
1660
	attrHandle: {},
1661
 
1662
	find: {},
1663
 
1664
	relative: {
1665
		">": { dir: "parentNode", first: true },
1666
		" ": { dir: "parentNode" },
1667
		"+": { dir: "previousSibling", first: true },
1668
		"~": { dir: "previousSibling" }
1669
	},
1670
 
1671
	preFilter: {
1672
		"ATTR": function( match ) {
1673
			match[1] = match[1].replace( runescape, funescape );
1674
 
1675
			// Move the given value to match[3] whether quoted or unquoted
1676
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1677
 
1678
			if ( match[2] === "~=" ) {
1679
				match[3] = " " + match[3] + " ";
1680
			}
1681
 
1682
			return match.slice( 0, 4 );
1683
		},
1684
 
1685
		"CHILD": function( match ) {
1686
			/* matches from matchExpr["CHILD"]
1687
				1 type (only|nth|...)
1688
				2 what (child|of-type)
1689
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1690
				4 xn-component of xn+y argument ([+-]?\d*n|)
1691
				5 sign of xn-component
1692
				6 x of xn-component
1693
				7 sign of y-component
1694
				8 y of y-component
1695
			*/
1696
			match[1] = match[1].toLowerCase();
1697
 
1698
			if ( match[1].slice( 0, 3 ) === "nth" ) {
1699
				// nth-* requires argument
1700
				if ( !match[3] ) {
1701
					Sizzle.error( match[0] );
1702
				}
1703
 
1704
				// numeric x and y parameters for Expr.filter.CHILD
1705
				// remember that false/true cast respectively to 0/1
1706
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1707
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1708
 
1709
			// other types prohibit arguments
1710
			} else if ( match[3] ) {
1711
				Sizzle.error( match[0] );
1712
			}
1713
 
1714
			return match;
1715
		},
1716
 
1717
		"PSEUDO": function( match ) {
1718
			var excess,
1719
				unquoted = !match[6] && match[2];
1720
 
1721
			if ( matchExpr["CHILD"].test( match[0] ) ) {
1722
				return null;
1723
			}
1724
 
1725
			// Accept quoted arguments as-is
1726
			if ( match[3] ) {
1727
				match[2] = match[4] || match[5] || "";
1728
 
1729
			// Strip excess characters from unquoted arguments
1730
			} else if ( unquoted && rpseudo.test( unquoted ) &&
1731
				// Get excess from tokenize (recursively)
1732
				(excess = tokenize( unquoted, true )) &&
1733
				// advance to the next closing parenthesis
1734
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1735
 
1736
				// excess is a negative index
1737
				match[0] = match[0].slice( 0, excess );
1738
				match[2] = unquoted.slice( 0, excess );
1739
			}
1740
 
1741
			// Return only captures needed by the pseudo filter method (type and argument)
1742
			return match.slice( 0, 3 );
1743
		}
1744
	},
1745
 
1746
	filter: {
1747
 
1748
		"TAG": function( nodeNameSelector ) {
1749
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1750
			return nodeNameSelector === "*" ?
1751
				function() { return true; } :
1752
				function( elem ) {
1753
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1754
				};
1755
		},
1756
 
1757
		"CLASS": function( className ) {
1758
			var pattern = classCache[ className + " " ];
1759
 
1760
			return pattern ||
1761
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1762
				classCache( className, function( elem ) {
1763
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1764
				});
1765
		},
1766
 
1767
		"ATTR": function( name, operator, check ) {
1768
			return function( elem ) {
1769
				var result = Sizzle.attr( elem, name );
1770
 
1771
				if ( result == null ) {
1772
					return operator === "!=";
1773
				}
1774
				if ( !operator ) {
1775
					return true;
1776
				}
1777
 
1778
				result += "";
1779
 
1780
				return operator === "=" ? result === check :
1781
					operator === "!=" ? result !== check :
1782
					operator === "^=" ? check && result.indexOf( check ) === 0 :
1783
					operator === "*=" ? check && result.indexOf( check ) > -1 :
1784
					operator === "$=" ? check && result.slice( -check.length ) === check :
1785
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1786
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1787
					false;
1788
			};
1789
		},
1790
 
1791
		"CHILD": function( type, what, argument, first, last ) {
1792
			var simple = type.slice( 0, 3 ) !== "nth",
1793
				forward = type.slice( -4 ) !== "last",
1794
				ofType = what === "of-type";
1795
 
1796
			return first === 1 && last === 0 ?
1797
 
1798
				// Shortcut for :nth-*(n)
1799
				function( elem ) {
1800
					return !!elem.parentNode;
1801
				} :
1802
 
1803
				function( elem, context, xml ) {
1804
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
1805
						dir = simple !== forward ? "nextSibling" : "previousSibling",
1806
						parent = elem.parentNode,
1807
						name = ofType && elem.nodeName.toLowerCase(),
1808
						useCache = !xml && !ofType,
1809
						diff = false;
1810
 
1811
					if ( parent ) {
1812
 
1813
						// :(first|last|only)-(child|of-type)
1814
						if ( simple ) {
1815
							while ( dir ) {
1816
								node = elem;
1817
								while ( (node = node[ dir ]) ) {
1818
									if ( ofType ?
1819
										node.nodeName.toLowerCase() === name :
1820
										node.nodeType === 1 ) {
1821
 
1822
										return false;
1823
									}
1824
								}
1825
								// Reverse direction for :only-* (if we haven't yet done so)
1826
								start = dir = type === "only" && !start && "nextSibling";
1827
							}
1828
							return true;
1829
						}
1830
 
1831
						start = [ forward ? parent.firstChild : parent.lastChild ];
1832
 
1833
						// non-xml :nth-child(...) stores cache data on `parent`
1834
						if ( forward && useCache ) {
1835
 
1836
							// Seek `elem` from a previously-cached index
1837
 
1838
							// ...in a gzip-friendly way
1839
							node = parent;
1840
							outerCache = node[ expando ] || (node[ expando ] = {});
1841
 
1842
							// Support: IE <9 only
1843
							// Defend against cloned attroperties (jQuery gh-1709)
1844
							uniqueCache = outerCache[ node.uniqueID ] ||
1845
								(outerCache[ node.uniqueID ] = {});
1846
 
1847
							cache = uniqueCache[ type ] || [];
1848
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1849
							diff = nodeIndex && cache[ 2 ];
1850
							node = nodeIndex && parent.childNodes[ nodeIndex ];
1851
 
1852
							while ( (node = ++nodeIndex && node && node[ dir ] ||
1853
 
1854
								// Fallback to seeking `elem` from the start
1855
								(diff = nodeIndex = 0) || start.pop()) ) {
1856
 
1857
								// When found, cache indexes on `parent` and break
1858
								if ( node.nodeType === 1 && ++diff && node === elem ) {
1859
									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1860
									break;
1861
								}
1862
							}
1863
 
1864
						} else {
1865
							// Use previously-cached element index if available
1866
							if ( useCache ) {
1867
								// ...in a gzip-friendly way
1868
								node = elem;
1869
								outerCache = node[ expando ] || (node[ expando ] = {});
1870
 
1871
								// Support: IE <9 only
1872
								// Defend against cloned attroperties (jQuery gh-1709)
1873
								uniqueCache = outerCache[ node.uniqueID ] ||
1874
									(outerCache[ node.uniqueID ] = {});
1875
 
1876
								cache = uniqueCache[ type ] || [];
1877
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1878
								diff = nodeIndex;
1879
							}
1880
 
1881
							// xml :nth-child(...)
1882
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
1883
							if ( diff === false ) {
1884
								// Use the same loop as above to seek `elem` from the start
1885
								while ( (node = ++nodeIndex && node && node[ dir ] ||
1886
									(diff = nodeIndex = 0) || start.pop()) ) {
1887
 
1888
									if ( ( ofType ?
1889
										node.nodeName.toLowerCase() === name :
1890
										node.nodeType === 1 ) &&
1891
										++diff ) {
1892
 
1893
										// Cache the index of each encountered element
1894
										if ( useCache ) {
1895
											outerCache = node[ expando ] || (node[ expando ] = {});
1896
 
1897
											// Support: IE <9 only
1898
											// Defend against cloned attroperties (jQuery gh-1709)
1899
											uniqueCache = outerCache[ node.uniqueID ] ||
1900
												(outerCache[ node.uniqueID ] = {});
1901
 
1902
											uniqueCache[ type ] = [ dirruns, diff ];
1903
										}
1904
 
1905
										if ( node === elem ) {
1906
											break;
1907
										}
1908
									}
1909
								}
1910
							}
1911
						}
1912
 
1913
						// Incorporate the offset, then check against cycle size
1914
						diff -= last;
1915
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1916
					}
1917
				};
1918
		},
1919
 
1920
		"PSEUDO": function( pseudo, argument ) {
1921
			// pseudo-class names are case-insensitive
1922
			// http://www.w3.org/TR/selectors/#pseudo-classes
1923
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1924
			// Remember that setFilters inherits from pseudos
1925
			var args,
1926
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1927
					Sizzle.error( "unsupported pseudo: " + pseudo );
1928
 
1929
			// The user may use createPseudo to indicate that
1930
			// arguments are needed to create the filter function
1931
			// just as Sizzle does
1932
			if ( fn[ expando ] ) {
1933
				return fn( argument );
1934
			}
1935
 
1936
			// But maintain support for old signatures
1937
			if ( fn.length > 1 ) {
1938
				args = [ pseudo, pseudo, "", argument ];
1939
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1940
					markFunction(function( seed, matches ) {
1941
						var idx,
1942
							matched = fn( seed, argument ),
1943
							i = matched.length;
1944
						while ( i-- ) {
1945
							idx = indexOf( seed, matched[i] );
1946
							seed[ idx ] = !( matches[ idx ] = matched[i] );
1947
						}
1948
					}) :
1949
					function( elem ) {
1950
						return fn( elem, 0, args );
1951
					};
1952
			}
1953
 
1954
			return fn;
1955
		}
1956
	},
1957
 
1958
	pseudos: {
1959
		// Potentially complex pseudos
1960
		"not": markFunction(function( selector ) {
1961
			// Trim the selector passed to compile
1962
			// to avoid treating leading and trailing
1963
			// spaces as combinators
1964
			var input = [],
1965
				results = [],
1966
				matcher = compile( selector.replace( rtrim, "$1" ) );
1967
 
1968
			return matcher[ expando ] ?
1969
				markFunction(function( seed, matches, context, xml ) {
1970
					var elem,
1971
						unmatched = matcher( seed, null, xml, [] ),
1972
						i = seed.length;
1973
 
1974
					// Match elements unmatched by `matcher`
1975
					while ( i-- ) {
1976
						if ( (elem = unmatched[i]) ) {
1977
							seed[i] = !(matches[i] = elem);
1978
						}
1979
					}
1980
				}) :
1981
				function( elem, context, xml ) {
1982
					input[0] = elem;
1983
					matcher( input, null, xml, results );
1984
					// Don't keep the element (issue #299)
1985
					input[0] = null;
1986
					return !results.pop();
1987
				};
1988
		}),
1989
 
1990
		"has": markFunction(function( selector ) {
1991
			return function( elem ) {
1992
				return Sizzle( selector, elem ).length > 0;
1993
			};
1994
		}),
1995
 
1996
		"contains": markFunction(function( text ) {
1997
			text = text.replace( runescape, funescape );
1998
			return function( elem ) {
1999
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2000
			};
2001
		}),
2002
 
2003
		// "Whether an element is represented by a :lang() selector
2004
		// is based solely on the element's language value
2005
		// being equal to the identifier C,
2006
		// or beginning with the identifier C immediately followed by "-".
2007
		// The matching of C against the element's language value is performed case-insensitively.
2008
		// The identifier C does not have to be a valid language name."
2009
		// http://www.w3.org/TR/selectors/#lang-pseudo
2010
		"lang": markFunction( function( lang ) {
2011
			// lang value must be a valid identifier
2012
			if ( !ridentifier.test(lang || "") ) {
2013
				Sizzle.error( "unsupported lang: " + lang );
2014
			}
2015
			lang = lang.replace( runescape, funescape ).toLowerCase();
2016
			return function( elem ) {
2017
				var elemLang;
2018
				do {
2019
					if ( (elemLang = documentIsHTML ?
2020
						elem.lang :
2021
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2022
 
2023
						elemLang = elemLang.toLowerCase();
2024
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2025
					}
2026
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2027
				return false;
2028
			};
2029
		}),
2030
 
2031
		// Miscellaneous
2032
		"target": function( elem ) {
2033
			var hash = window.location && window.location.hash;
2034
			return hash && hash.slice( 1 ) === elem.id;
2035
		},
2036
 
2037
		"root": function( elem ) {
2038
			return elem === docElem;
2039
		},
2040
 
2041
		"focus": function( elem ) {
2042
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2043
		},
2044
 
2045
		// Boolean properties
2046
		"enabled": createDisabledPseudo( false ),
2047
		"disabled": createDisabledPseudo( true ),
2048
 
2049
		"checked": function( elem ) {
2050
			// In CSS3, :checked should return both checked and selected elements
2051
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2052
			var nodeName = elem.nodeName.toLowerCase();
2053
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2054
		},
2055
 
2056
		"selected": function( elem ) {
2057
			// Accessing this property makes selected-by-default
2058
			// options in Safari work properly
2059
			if ( elem.parentNode ) {
2060
				elem.parentNode.selectedIndex;
2061
			}
2062
 
2063
			return elem.selected === true;
2064
		},
2065
 
2066
		// Contents
2067
		"empty": function( elem ) {
2068
			// http://www.w3.org/TR/selectors/#empty-pseudo
2069
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2070
			//   but not by others (comment: 8; processing instruction: 7; etc.)
2071
			// nodeType < 6 works because attributes (2) do not appear as children
2072
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
2073
				if ( elem.nodeType < 6 ) {
2074
					return false;
2075
				}
2076
			}
2077
			return true;
2078
		},
2079
 
2080
		"parent": function( elem ) {
2081
			return !Expr.pseudos["empty"]( elem );
2082
		},
2083
 
2084
		// Element/input types
2085
		"header": function( elem ) {
2086
			return rheader.test( elem.nodeName );
2087
		},
2088
 
2089
		"input": function( elem ) {
2090
			return rinputs.test( elem.nodeName );
2091
		},
2092
 
2093
		"button": function( elem ) {
2094
			var name = elem.nodeName.toLowerCase();
2095
			return name === "input" && elem.type === "button" || name === "button";
2096
		},
2097
 
2098
		"text": function( elem ) {
2099
			var attr;
2100
			return elem.nodeName.toLowerCase() === "input" &&
2101
				elem.type === "text" &&
2102
 
2103
				// Support: IE<8
2104
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2105
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2106
		},
2107
 
2108
		// Position-in-collection
2109
		"first": createPositionalPseudo(function() {
2110
			return [ 0 ];
2111
		}),
2112
 
2113
		"last": createPositionalPseudo(function( matchIndexes, length ) {
2114
			return [ length - 1 ];
2115
		}),
2116
 
2117
		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2118
			return [ argument < 0 ? argument + length : argument ];
2119
		}),
2120
 
2121
		"even": createPositionalPseudo(function( matchIndexes, length ) {
2122
			var i = 0;
2123
			for ( ; i < length; i += 2 ) {
2124
				matchIndexes.push( i );
2125
			}
2126
			return matchIndexes;
2127
		}),
2128
 
2129
		"odd": createPositionalPseudo(function( matchIndexes, length ) {
2130
			var i = 1;
2131
			for ( ; i < length; i += 2 ) {
2132
				matchIndexes.push( i );
2133
			}
2134
			return matchIndexes;
2135
		}),
2136
 
2137
		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2138
			var i = argument < 0 ? argument + length : argument;
2139
			for ( ; --i >= 0; ) {
2140
				matchIndexes.push( i );
2141
			}
2142
			return matchIndexes;
2143
		}),
2144
 
2145
		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2146
			var i = argument < 0 ? argument + length : argument;
2147
			for ( ; ++i < length; ) {
2148
				matchIndexes.push( i );
2149
			}
2150
			return matchIndexes;
2151
		})
2152
	}
2153
};
2154
 
2155
Expr.pseudos["nth"] = Expr.pseudos["eq"];
2156
 
2157
// Add button/input type pseudos
2158
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2159
	Expr.pseudos[ i ] = createInputPseudo( i );
2160
}
2161
for ( i in { submit: true, reset: true } ) {
2162
	Expr.pseudos[ i ] = createButtonPseudo( i );
2163
}
2164
 
2165
// Easy API for creating new setFilters
2166
function setFilters() {}
2167
setFilters.prototype = Expr.filters = Expr.pseudos;
2168
Expr.setFilters = new setFilters();
2169
 
2170
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2171
	var matched, match, tokens, type,
2172
		soFar, groups, preFilters,
2173
		cached = tokenCache[ selector + " " ];
2174
 
2175
	if ( cached ) {
2176
		return parseOnly ? 0 : cached.slice( 0 );
2177
	}
2178
 
2179
	soFar = selector;
2180
	groups = [];
2181
	preFilters = Expr.preFilter;
2182
 
2183
	while ( soFar ) {
2184
 
2185
		// Comma and first run
2186
		if ( !matched || (match = rcomma.exec( soFar )) ) {
2187
			if ( match ) {
2188
				// Don't consume trailing commas as valid
2189
				soFar = soFar.slice( match[0].length ) || soFar;
2190
			}
2191
			groups.push( (tokens = []) );
2192
		}
2193
 
2194
		matched = false;
2195
 
2196
		// Combinators
2197
		if ( (match = rcombinators.exec( soFar )) ) {
2198
			matched = match.shift();
2199
			tokens.push({
2200
				value: matched,
2201
				// Cast descendant combinators to space
2202
				type: match[0].replace( rtrim, " " )
2203
			});
2204
			soFar = soFar.slice( matched.length );
2205
		}
2206
 
2207
		// Filters
2208
		for ( type in Expr.filter ) {
2209
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2210
				(match = preFilters[ type ]( match ))) ) {
2211
				matched = match.shift();
2212
				tokens.push({
2213
					value: matched,
2214
					type: type,
2215
					matches: match
2216
				});
2217
				soFar = soFar.slice( matched.length );
2218
			}
2219
		}
2220
 
2221
		if ( !matched ) {
2222
			break;
2223
		}
2224
	}
2225
 
2226
	// Return the length of the invalid excess
2227
	// if we're just parsing
2228
	// Otherwise, throw an error or return tokens
2229
	return parseOnly ?
2230
		soFar.length :
2231
		soFar ?
2232
			Sizzle.error( selector ) :
2233
			// Cache the tokens
2234
			tokenCache( selector, groups ).slice( 0 );
2235
};
2236
 
2237
function toSelector( tokens ) {
2238
	var i = 0,
2239
		len = tokens.length,
2240
		selector = "";
2241
	for ( ; i < len; i++ ) {
2242
		selector += tokens[i].value;
2243
	}
2244
	return selector;
2245
}
2246
 
2247
function addCombinator( matcher, combinator, base ) {
2248
	var dir = combinator.dir,
2249
		skip = combinator.next,
2250
		key = skip || dir,
2251
		checkNonElements = base && key === "parentNode",
2252
		doneName = done++;
2253
 
2254
	return combinator.first ?
2255
		// Check against closest ancestor/preceding element
2256
		function( elem, context, xml ) {
2257
			while ( (elem = elem[ dir ]) ) {
2258
				if ( elem.nodeType === 1 || checkNonElements ) {
2259
					return matcher( elem, context, xml );
2260
				}
2261
			}
2262
			return false;
2263
		} :
2264
 
2265
		// Check against all ancestor/preceding elements
2266
		function( elem, context, xml ) {
2267
			var oldCache, uniqueCache, outerCache,
2268
				newCache = [ dirruns, doneName ];
2269
 
2270
			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2271
			if ( xml ) {
2272
				while ( (elem = elem[ dir ]) ) {
2273
					if ( elem.nodeType === 1 || checkNonElements ) {
2274
						if ( matcher( elem, context, xml ) ) {
2275
							return true;
2276
						}
2277
					}
2278
				}
2279
			} else {
2280
				while ( (elem = elem[ dir ]) ) {
2281
					if ( elem.nodeType === 1 || checkNonElements ) {
2282
						outerCache = elem[ expando ] || (elem[ expando ] = {});
2283
 
2284
						// Support: IE <9 only
2285
						// Defend against cloned attroperties (jQuery gh-1709)
2286
						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2287
 
2288
						if ( skip && skip === elem.nodeName.toLowerCase() ) {
2289
							elem = elem[ dir ] || elem;
2290
						} else if ( (oldCache = uniqueCache[ key ]) &&
2291
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2292
 
2293
							// Assign to newCache so results back-propagate to previous elements
2294
							return (newCache[ 2 ] = oldCache[ 2 ]);
2295
						} else {
2296
							// Reuse newcache so results back-propagate to previous elements
2297
							uniqueCache[ key ] = newCache;
2298
 
2299
							// A match means we're done; a fail means we have to keep checking
2300
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2301
								return true;
2302
							}
2303
						}
2304
					}
2305
				}
2306
			}
2307
			return false;
2308
		};
2309
}
2310
 
2311
function elementMatcher( matchers ) {
2312
	return matchers.length > 1 ?
2313
		function( elem, context, xml ) {
2314
			var i = matchers.length;
2315
			while ( i-- ) {
2316
				if ( !matchers[i]( elem, context, xml ) ) {
2317
					return false;
2318
				}
2319
			}
2320
			return true;
2321
		} :
2322
		matchers[0];
2323
}
2324
 
2325
function multipleContexts( selector, contexts, results ) {
2326
	var i = 0,
2327
		len = contexts.length;
2328
	for ( ; i < len; i++ ) {
2329
		Sizzle( selector, contexts[i], results );
2330
	}
2331
	return results;
2332
}
2333
 
2334
function condense( unmatched, map, filter, context, xml ) {
2335
	var elem,
2336
		newUnmatched = [],
2337
		i = 0,
2338
		len = unmatched.length,
2339
		mapped = map != null;
2340
 
2341
	for ( ; i < len; i++ ) {
2342
		if ( (elem = unmatched[i]) ) {
2343
			if ( !filter || filter( elem, context, xml ) ) {
2344
				newUnmatched.push( elem );
2345
				if ( mapped ) {
2346
					map.push( i );
2347
				}
2348
			}
2349
		}
2350
	}
2351
 
2352
	return newUnmatched;
2353
}
2354
 
2355
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2356
	if ( postFilter && !postFilter[ expando ] ) {
2357
		postFilter = setMatcher( postFilter );
2358
	}
2359
	if ( postFinder && !postFinder[ expando ] ) {
2360
		postFinder = setMatcher( postFinder, postSelector );
2361
	}
2362
	return markFunction(function( seed, results, context, xml ) {
2363
		var temp, i, elem,
2364
			preMap = [],
2365
			postMap = [],
2366
			preexisting = results.length,
2367
 
2368
			// Get initial elements from seed or context
2369
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2370
 
2371
			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2372
			matcherIn = preFilter && ( seed || !selector ) ?
2373
				condense( elems, preMap, preFilter, context, xml ) :
2374
				elems,
2375
 
2376
			matcherOut = matcher ?
2377
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2378
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2379
 
2380
					// ...intermediate processing is necessary
2381
					[] :
2382
 
2383
					// ...otherwise use results directly
2384
					results :
2385
				matcherIn;
2386
 
2387
		// Find primary matches
2388
		if ( matcher ) {
2389
			matcher( matcherIn, matcherOut, context, xml );
2390
		}
2391
 
2392
		// Apply postFilter
2393
		if ( postFilter ) {
2394
			temp = condense( matcherOut, postMap );
2395
			postFilter( temp, [], context, xml );
2396
 
2397
			// Un-match failing elements by moving them back to matcherIn
2398
			i = temp.length;
2399
			while ( i-- ) {
2400
				if ( (elem = temp[i]) ) {
2401
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2402
				}
2403
			}
2404
		}
2405
 
2406
		if ( seed ) {
2407
			if ( postFinder || preFilter ) {
2408
				if ( postFinder ) {
2409
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2410
					temp = [];
2411
					i = matcherOut.length;
2412
					while ( i-- ) {
2413
						if ( (elem = matcherOut[i]) ) {
2414
							// Restore matcherIn since elem is not yet a final match
2415
							temp.push( (matcherIn[i] = elem) );
2416
						}
2417
					}
2418
					postFinder( null, (matcherOut = []), temp, xml );
2419
				}
2420
 
2421
				// Move matched elements from seed to results to keep them synchronized
2422
				i = matcherOut.length;
2423
				while ( i-- ) {
2424
					if ( (elem = matcherOut[i]) &&
2425
						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2426
 
2427
						seed[temp] = !(results[temp] = elem);
2428
					}
2429
				}
2430
			}
2431
 
2432
		// Add elements to results, through postFinder if defined
2433
		} else {
2434
			matcherOut = condense(
2435
				matcherOut === results ?
2436
					matcherOut.splice( preexisting, matcherOut.length ) :
2437
					matcherOut
2438
			);
2439
			if ( postFinder ) {
2440
				postFinder( null, results, matcherOut, xml );
2441
			} else {
2442
				push.apply( results, matcherOut );
2443
			}
2444
		}
2445
	});
2446
}
2447
 
2448
function matcherFromTokens( tokens ) {
2449
	var checkContext, matcher, j,
2450
		len = tokens.length,
2451
		leadingRelative = Expr.relative[ tokens[0].type ],
2452
		implicitRelative = leadingRelative || Expr.relative[" "],
2453
		i = leadingRelative ? 1 : 0,
2454
 
2455
		// The foundational matcher ensures that elements are reachable from top-level context(s)
2456
		matchContext = addCombinator( function( elem ) {
2457
			return elem === checkContext;
2458
		}, implicitRelative, true ),
2459
		matchAnyContext = addCombinator( function( elem ) {
2460
			return indexOf( checkContext, elem ) > -1;
2461
		}, implicitRelative, true ),
2462
		matchers = [ function( elem, context, xml ) {
2463
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2464
				(checkContext = context).nodeType ?
2465
					matchContext( elem, context, xml ) :
2466
					matchAnyContext( elem, context, xml ) );
2467
			// Avoid hanging onto element (issue #299)
2468
			checkContext = null;
2469
			return ret;
2470
		} ];
2471
 
2472
	for ( ; i < len; i++ ) {
2473
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2474
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2475
		} else {
2476
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2477
 
2478
			// Return special upon seeing a positional matcher
2479
			if ( matcher[ expando ] ) {
2480
				// Find the next relative operator (if any) for proper handling
2481
				j = ++i;
2482
				for ( ; j < len; j++ ) {
2483
					if ( Expr.relative[ tokens[j].type ] ) {
2484
						break;
2485
					}
2486
				}
2487
				return setMatcher(
2488
					i > 1 && elementMatcher( matchers ),
2489
					i > 1 && toSelector(
2490
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2491
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2492
					).replace( rtrim, "$1" ),
2493
					matcher,
2494
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2495
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2496
					j < len && toSelector( tokens )
2497
				);
2498
			}
2499
			matchers.push( matcher );
2500
		}
2501
	}
2502
 
2503
	return elementMatcher( matchers );
2504
}
2505
 
2506
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2507
	var bySet = setMatchers.length > 0,
2508
		byElement = elementMatchers.length > 0,
2509
		superMatcher = function( seed, context, xml, results, outermost ) {
2510
			var elem, j, matcher,
2511
				matchedCount = 0,
2512
				i = "0",
2513
				unmatched = seed && [],
2514
				setMatched = [],
2515
				contextBackup = outermostContext,
2516
				// We must always have either seed elements or outermost context
2517
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2518
				// Use integer dirruns iff this is the outermost matcher
2519
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2520
				len = elems.length;
2521
 
2522
			if ( outermost ) {
2523
				outermostContext = context === document || context || outermost;
2524
			}
2525
 
2526
			// Add elements passing elementMatchers directly to results
2527
			// Support: IE<9, Safari
2528
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2529
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2530
				if ( byElement && elem ) {
2531
					j = 0;
2532
					if ( !context && elem.ownerDocument !== document ) {
2533
						setDocument( elem );
2534
						xml = !documentIsHTML;
2535
					}
2536
					while ( (matcher = elementMatchers[j++]) ) {
2537
						if ( matcher( elem, context || document, xml) ) {
2538
							results.push( elem );
2539
							break;
2540
						}
2541
					}
2542
					if ( outermost ) {
2543
						dirruns = dirrunsUnique;
2544
					}
2545
				}
2546
 
2547
				// Track unmatched elements for set filters
2548
				if ( bySet ) {
2549
					// They will have gone through all possible matchers
2550
					if ( (elem = !matcher && elem) ) {
2551
						matchedCount--;
2552
					}
2553
 
2554
					// Lengthen the array for every element, matched or not
2555
					if ( seed ) {
2556
						unmatched.push( elem );
2557
					}
2558
				}
2559
			}
2560
 
2561
			// `i` is now the count of elements visited above, and adding it to `matchedCount`
2562
			// makes the latter nonnegative.
2563
			matchedCount += i;
2564
 
2565
			// Apply set filters to unmatched elements
2566
			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
2567
			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
2568
			// no element matchers and no seed.
2569
			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
2570
			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
2571
			// numerically zero.
2572
			if ( bySet && i !== matchedCount ) {
2573
				j = 0;
2574
				while ( (matcher = setMatchers[j++]) ) {
2575
					matcher( unmatched, setMatched, context, xml );
2576
				}
2577
 
2578
				if ( seed ) {
2579
					// Reintegrate element matches to eliminate the need for sorting
2580
					if ( matchedCount > 0 ) {
2581
						while ( i-- ) {
2582
							if ( !(unmatched[i] || setMatched[i]) ) {
2583
								setMatched[i] = pop.call( results );
2584
							}
2585
						}
2586
					}
2587
 
2588
					// Discard index placeholder values to get only actual matches
2589
					setMatched = condense( setMatched );
2590
				}
2591
 
2592
				// Add matches to results
2593
				push.apply( results, setMatched );
2594
 
2595
				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2596
				if ( outermost && !seed && setMatched.length > 0 &&
2597
					( matchedCount + setMatchers.length ) > 1 ) {
2598
 
2599
					Sizzle.uniqueSort( results );
2600
				}
2601
			}
2602
 
2603
			// Override manipulation of globals by nested matchers
2604
			if ( outermost ) {
2605
				dirruns = dirrunsUnique;
2606
				outermostContext = contextBackup;
2607
			}
2608
 
2609
			return unmatched;
2610
		};
2611
 
2612
	return bySet ?
2613
		markFunction( superMatcher ) :
2614
		superMatcher;
2615
}
2616
 
2617
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2618
	var i,
2619
		setMatchers = [],
2620
		elementMatchers = [],
2621
		cached = compilerCache[ selector + " " ];
2622
 
2623
	if ( !cached ) {
2624
		// Generate a function of recursive functions that can be used to check each element
2625
		if ( !match ) {
2626
			match = tokenize( selector );
2627
		}
2628
		i = match.length;
2629
		while ( i-- ) {
2630
			cached = matcherFromTokens( match[i] );
2631
			if ( cached[ expando ] ) {
2632
				setMatchers.push( cached );
2633
			} else {
2634
				elementMatchers.push( cached );
2635
			}
2636
		}
2637
 
2638
		// Cache the compiled function
2639
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2640
 
2641
		// Save selector and tokenization
2642
		cached.selector = selector;
2643
	}
2644
	return cached;
2645
};
2646
 
2647
/**
2648
 * A low-level selection function that works with Sizzle's compiled
2649
 *  selector functions
2650
 * @param {String|Function} selector A selector or a pre-compiled
2651
 *  selector function built with Sizzle.compile
2652
 * @param {Element} context
2653
 * @param {Array} [results]
2654
 * @param {Array} [seed] A set of elements to match against
2655
 */
2656
select = Sizzle.select = function( selector, context, results, seed ) {
2657
	var i, tokens, token, type, find,
2658
		compiled = typeof selector === "function" && selector,
2659
		match = !seed && tokenize( (selector = compiled.selector || selector) );
2660
 
2661
	results = results || [];
2662
 
2663
	// Try to minimize operations if there is only one selector in the list and no seed
2664
	// (the latter of which guarantees us context)
2665
	if ( match.length === 1 ) {
2666
 
2667
		// Reduce context if the leading compound selector is an ID
2668
		tokens = match[0] = match[0].slice( 0 );
2669
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2670
				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2671
 
2672
			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2673
			if ( !context ) {
2674
				return results;
2675
 
2676
			// Precompiled matchers will still verify ancestry, so step up a level
2677
			} else if ( compiled ) {
2678
				context = context.parentNode;
2679
			}
2680
 
2681
			selector = selector.slice( tokens.shift().value.length );
2682
		}
2683
 
2684
		// Fetch a seed set for right-to-left matching
2685
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2686
		while ( i-- ) {
2687
			token = tokens[i];
2688
 
2689
			// Abort if we hit a combinator
2690
			if ( Expr.relative[ (type = token.type) ] ) {
2691
				break;
2692
			}
2693
			if ( (find = Expr.find[ type ]) ) {
2694
				// Search, expanding context for leading sibling combinators
2695
				if ( (seed = find(
2696
					token.matches[0].replace( runescape, funescape ),
2697
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2698
				)) ) {
2699
 
2700
					// If seed is empty or no tokens remain, we can return early
2701
					tokens.splice( i, 1 );
2702
					selector = seed.length && toSelector( tokens );
2703
					if ( !selector ) {
2704
						push.apply( results, seed );
2705
						return results;
2706
					}
2707
 
2708
					break;
2709
				}
2710
			}
2711
		}
2712
	}
2713
 
2714
	// Compile and execute a filtering function if one is not provided
2715
	// Provide `match` to avoid retokenization if we modified the selector above
2716
	( compiled || compile( selector, match ) )(
2717
		seed,
2718
		context,
2719
		!documentIsHTML,
2720
		results,
2721
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2722
	);
2723
	return results;
2724
};
2725
 
2726
// One-time assignments
2727
 
2728
// Sort stability
2729
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2730
 
2731
// Support: Chrome 14-35+
2732
// Always assume duplicates if they aren't passed to the comparison function
2733
support.detectDuplicates = !!hasDuplicate;
2734
 
2735
// Initialize against the default document
2736
setDocument();
2737
 
2738
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2739
// Detached nodes confoundingly follow *each other*
2740
support.sortDetached = assert(function( el ) {
2741
	// Should return 1, but returns 4 (following)
2742
	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2743
});
2744
 
2745
// Support: IE<8
2746
// Prevent attribute/property "interpolation"
2747
// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2748
if ( !assert(function( el ) {
2749
	el.innerHTML = "<a href='#'></a>";
2750
	return el.firstChild.getAttribute("href") === "#" ;
2751
}) ) {
2752
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2753
		if ( !isXML ) {
2754
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2755
		}
2756
	});
2757
}
2758
 
2759
// Support: IE<9
2760
// Use defaultValue in place of getAttribute("value")
2761
if ( !support.attributes || !assert(function( el ) {
2762
	el.innerHTML = "<input/>";
2763
	el.firstChild.setAttribute( "value", "" );
2764
	return el.firstChild.getAttribute( "value" ) === "";
2765
}) ) {
2766
	addHandle( "value", function( elem, name, isXML ) {
2767
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2768
			return elem.defaultValue;
2769
		}
2770
	});
2771
}
2772
 
2773
// Support: IE<9
2774
// Use getAttributeNode to fetch booleans when getAttribute lies
2775
if ( !assert(function( el ) {
2776
	return el.getAttribute("disabled") == null;
2777
}) ) {
2778
	addHandle( booleans, function( elem, name, isXML ) {
2779
		var val;
2780
		if ( !isXML ) {
2781
			return elem[ name ] === true ? name.toLowerCase() :
2782
					(val = elem.getAttributeNode( name )) && val.specified ?
2783
					val.value :
2784
				null;
2785
		}
2786
	});
2787
}
2788
 
2789
return Sizzle;
2790
 
2791
})( window );
2792
 
2793
 
2794
 
2795
jQuery.find = Sizzle;
2796
jQuery.expr = Sizzle.selectors;
2797
 
2798
// Deprecated
2799
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2800
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2801
jQuery.text = Sizzle.getText;
2802
jQuery.isXMLDoc = Sizzle.isXML;
2803
jQuery.contains = Sizzle.contains;
2804
jQuery.escapeSelector = Sizzle.escape;
2805
 
2806
 
2807
 
2808
 
2809
var dir = function( elem, dir, until ) {
2810
	var matched = [],
2811
		truncate = until !== undefined;
2812
 
2813
	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
2814
		if ( elem.nodeType === 1 ) {
2815
			if ( truncate && jQuery( elem ).is( until ) ) {
2816
				break;
2817
			}
2818
			matched.push( elem );
2819
		}
2820
	}
2821
	return matched;
2822
};
2823
 
2824
 
2825
var siblings = function( n, elem ) {
2826
	var matched = [];
2827
 
2828
	for ( ; n; n = n.nextSibling ) {
2829
		if ( n.nodeType === 1 && n !== elem ) {
2830
			matched.push( n );
2831
		}
2832
	}
2833
 
2834
	return matched;
2835
};
2836
 
2837
 
2838
var rneedsContext = jQuery.expr.match.needsContext;
2839
 
2840
 
2841
 
2842
function nodeName( elem, name ) {
2843
 
2844
  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2845
 
2846
};
2847
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2848
 
2849
 
2850
 
2851
var risSimple = /^.[^:#\[\.,]*$/;
2852
 
2853
// Implement the identical functionality for filter and not
2854
function winnow( elements, qualifier, not ) {
2855
	if ( jQuery.isFunction( qualifier ) ) {
2856
		return jQuery.grep( elements, function( elem, i ) {
2857
			return !!qualifier.call( elem, i, elem ) !== not;
2858
		} );
2859
	}
2860
 
2861
	// Single element
2862
	if ( qualifier.nodeType ) {
2863
		return jQuery.grep( elements, function( elem ) {
2864
			return ( elem === qualifier ) !== not;
2865
		} );
2866
	}
2867
 
2868
	// Arraylike of elements (jQuery, arguments, Array)
2869
	if ( typeof qualifier !== "string" ) {
2870
		return jQuery.grep( elements, function( elem ) {
2871
			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
2872
		} );
2873
	}
2874
 
2875
	// Simple selector that can be filtered directly, removing non-Elements
2876
	if ( risSimple.test( qualifier ) ) {
2877
		return jQuery.filter( qualifier, elements, not );
2878
	}
2879
 
2880
	// Complex selector, compare the two sets, removing non-Elements
2881
	qualifier = jQuery.filter( qualifier, elements );
2882
	return jQuery.grep( elements, function( elem ) {
2883
		return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
2884
	} );
2885
}
2886
 
2887
jQuery.filter = function( expr, elems, not ) {
2888
	var elem = elems[ 0 ];
2889
 
2890
	if ( not ) {
2891
		expr = ":not(" + expr + ")";
2892
	}
2893
 
2894
	if ( elems.length === 1 && elem.nodeType === 1 ) {
2895
		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
2896
	}
2897
 
2898
	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2899
		return elem.nodeType === 1;
2900
	} ) );
2901
};
2902
 
2903
jQuery.fn.extend( {
2904
	find: function( selector ) {
2905
		var i, ret,
2906
			len = this.length,
2907
			self = this;
2908
 
2909
		if ( typeof selector !== "string" ) {
2910
			return this.pushStack( jQuery( selector ).filter( function() {
2911
				for ( i = 0; i < len; i++ ) {
2912
					if ( jQuery.contains( self[ i ], this ) ) {
2913
						return true;
2914
					}
2915
				}
2916
			} ) );
2917
		}
2918
 
2919
		ret = this.pushStack( [] );
2920
 
2921
		for ( i = 0; i < len; i++ ) {
2922
			jQuery.find( selector, self[ i ], ret );
2923
		}
2924
 
2925
		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
2926
	},
2927
	filter: function( selector ) {
2928
		return this.pushStack( winnow( this, selector || [], false ) );
2929
	},
2930
	not: function( selector ) {
2931
		return this.pushStack( winnow( this, selector || [], true ) );
2932
	},
2933
	is: function( selector ) {
2934
		return !!winnow(
2935
			this,
2936
 
2937
			// If this is a positional/relative selector, check membership in the returned set
2938
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2939
			typeof selector === "string" && rneedsContext.test( selector ) ?
2940
				jQuery( selector ) :
2941
				selector || [],
2942
			false
2943
		).length;
2944
	}
2945
} );
2946
 
2947
 
2948
// Initialize a jQuery object
2949
 
2950
 
2951
// A central reference to the root jQuery(document)
2952
var rootjQuery,
2953
 
2954
	// A simple way to check for HTML strings
2955
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2956
	// Strict HTML recognition (#11290: must start with <)
2957
	// Shortcut simple #id case for speed
2958
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2959
 
2960
	init = jQuery.fn.init = function( selector, context, root ) {
2961
		var match, elem;
2962
 
2963
		// HANDLE: $(""), $(null), $(undefined), $(false)
2964
		if ( !selector ) {
2965
			return this;
2966
		}
2967
 
2968
		// Method init() accepts an alternate rootjQuery
2969
		// so migrate can support jQuery.sub (gh-2101)
2970
		root = root || rootjQuery;
2971
 
2972
		// Handle HTML strings
2973
		if ( typeof selector === "string" ) {
2974
			if ( selector[ 0 ] === "<" &&
2975
				selector[ selector.length - 1 ] === ">" &&
2976
				selector.length >= 3 ) {
2977
 
2978
				// Assume that strings that start and end with <> are HTML and skip the regex check
2979
				match = [ null, selector, null ];
2980
 
2981
			} else {
2982
				match = rquickExpr.exec( selector );
2983
			}
2984
 
2985
			// Match html or make sure no context is specified for #id
2986
			if ( match && ( match[ 1 ] || !context ) ) {
2987
 
2988
				// HANDLE: $(html) -> $(array)
2989
				if ( match[ 1 ] ) {
2990
					context = context instanceof jQuery ? context[ 0 ] : context;
2991
 
2992
					// Option to run scripts is true for back-compat
2993
					// Intentionally let the error be thrown if parseHTML is not present
2994
					jQuery.merge( this, jQuery.parseHTML(
2995
						match[ 1 ],
2996
						context && context.nodeType ? context.ownerDocument || context : document,
2997
						true
2998
					) );
2999
 
3000
					// HANDLE: $(html, props)
3001
					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
3002
						for ( match in context ) {
3003
 
3004
							// Properties of context are called as methods if possible
3005
							if ( jQuery.isFunction( this[ match ] ) ) {
3006
								this[ match ]( context[ match ] );
3007
 
3008
							// ...and otherwise set as attributes
3009
							} else {
3010
								this.attr( match, context[ match ] );
3011
							}
3012
						}
3013
					}
3014
 
3015
					return this;
3016
 
3017
				// HANDLE: $(#id)
3018
				} else {
3019
					elem = document.getElementById( match[ 2 ] );
3020
 
3021
					if ( elem ) {
3022
 
3023
						// Inject the element directly into the jQuery object
3024
						this[ 0 ] = elem;
3025
						this.length = 1;
3026
					}
3027
					return this;
3028
				}
3029
 
3030
			// HANDLE: $(expr, $(...))
3031
			} else if ( !context || context.jquery ) {
3032
				return ( context || root ).find( selector );
3033
 
3034
			// HANDLE: $(expr, context)
3035
			// (which is just equivalent to: $(context).find(expr)
3036
			} else {
3037
				return this.constructor( context ).find( selector );
3038
			}
3039
 
3040
		// HANDLE: $(DOMElement)
3041
		} else if ( selector.nodeType ) {
3042
			this[ 0 ] = selector;
3043
			this.length = 1;
3044
			return this;
3045
 
3046
		// HANDLE: $(function)
3047
		// Shortcut for document ready
3048
		} else if ( jQuery.isFunction( selector ) ) {
3049
			return root.ready !== undefined ?
3050
				root.ready( selector ) :
3051
 
3052
				// Execute immediately if ready is not present
3053
				selector( jQuery );
3054
		}
3055
 
3056
		return jQuery.makeArray( selector, this );
3057
	};
3058
 
3059
// Give the init function the jQuery prototype for later instantiation
3060
init.prototype = jQuery.fn;
3061
 
3062
// Initialize central reference
3063
rootjQuery = jQuery( document );
3064
 
3065
 
3066
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
3067
 
3068
	// Methods guaranteed to produce a unique set when starting from a unique set
3069
	guaranteedUnique = {
3070
		children: true,
3071
		contents: true,
3072
		next: true,
3073
		prev: true
3074
	};
3075
 
3076
jQuery.fn.extend( {
3077
	has: function( target ) {
3078
		var targets = jQuery( target, this ),
3079
			l = targets.length;
3080
 
3081
		return this.filter( function() {
3082
			var i = 0;
3083
			for ( ; i < l; i++ ) {
3084
				if ( jQuery.contains( this, targets[ i ] ) ) {
3085
					return true;
3086
				}
3087
			}
3088
		} );
3089
	},
3090
 
3091
	closest: function( selectors, context ) {
3092
		var cur,
3093
			i = 0,
3094
			l = this.length,
3095
			matched = [],
3096
			targets = typeof selectors !== "string" && jQuery( selectors );
3097
 
3098
		// Positional selectors never match, since there's no _selection_ context
3099
		if ( !rneedsContext.test( selectors ) ) {
3100
			for ( ; i < l; i++ ) {
3101
				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
3102
 
3103
					// Always skip document fragments
3104
					if ( cur.nodeType < 11 && ( targets ?
3105
						targets.index( cur ) > -1 :
3106
 
3107
						// Don't pass non-elements to Sizzle
3108
						cur.nodeType === 1 &&
3109
							jQuery.find.matchesSelector( cur, selectors ) ) ) {
3110
 
3111
						matched.push( cur );
3112
						break;
3113
					}
3114
				}
3115
			}
3116
		}
3117
 
3118
		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
3119
	},
3120
 
3121
	// Determine the position of an element within the set
3122
	index: function( elem ) {
3123
 
3124
		// No argument, return index in parent
3125
		if ( !elem ) {
3126
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
3127
		}
3128
 
3129
		// Index in selector
3130
		if ( typeof elem === "string" ) {
3131
			return indexOf.call( jQuery( elem ), this[ 0 ] );
3132
		}
3133
 
3134
		// Locate the position of the desired element
3135
		return indexOf.call( this,
3136
 
3137
			// If it receives a jQuery object, the first element is used
3138
			elem.jquery ? elem[ 0 ] : elem
3139
		);
3140
	},
3141
 
3142
	add: function( selector, context ) {
3143
		return this.pushStack(
3144
			jQuery.uniqueSort(
3145
				jQuery.merge( this.get(), jQuery( selector, context ) )
3146
			)
3147
		);
3148
	},
3149
 
3150
	addBack: function( selector ) {
3151
		return this.add( selector == null ?
3152
			this.prevObject : this.prevObject.filter( selector )
3153
		);
3154
	}
3155
} );
3156
 
3157
function sibling( cur, dir ) {
3158
	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
3159
	return cur;
3160
}
3161
 
3162
jQuery.each( {
3163
	parent: function( elem ) {
3164
		var parent = elem.parentNode;
3165
		return parent && parent.nodeType !== 11 ? parent : null;
3166
	},
3167
	parents: function( elem ) {
3168
		return dir( elem, "parentNode" );
3169
	},
3170
	parentsUntil: function( elem, i, until ) {
3171
		return dir( elem, "parentNode", until );
3172
	},
3173
	next: function( elem ) {
3174
		return sibling( elem, "nextSibling" );
3175
	},
3176
	prev: function( elem ) {
3177
		return sibling( elem, "previousSibling" );
3178
	},
3179
	nextAll: function( elem ) {
3180
		return dir( elem, "nextSibling" );
3181
	},
3182
	prevAll: function( elem ) {
3183
		return dir( elem, "previousSibling" );
3184
	},
3185
	nextUntil: function( elem, i, until ) {
3186
		return dir( elem, "nextSibling", until );
3187
	},
3188
	prevUntil: function( elem, i, until ) {
3189
		return dir( elem, "previousSibling", until );
3190
	},
3191
	siblings: function( elem ) {
3192
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
3193
	},
3194
	children: function( elem ) {
3195
		return siblings( elem.firstChild );
3196
	},
3197
	contents: function( elem ) {
3198
        if ( nodeName( elem, "iframe" ) ) {
3199
            return elem.contentDocument;
3200
        }
3201
 
3202
        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3203
        // Treat the template element as a regular one in browsers that
3204
        // don't support it.
3205
        if ( nodeName( elem, "template" ) ) {
3206
            elem = elem.content || elem;
3207
        }
3208
 
3209
        return jQuery.merge( [], elem.childNodes );
3210
	}
3211
}, function( name, fn ) {
3212
	jQuery.fn[ name ] = function( until, selector ) {
3213
		var matched = jQuery.map( this, fn, until );
3214
 
3215
		if ( name.slice( -5 ) !== "Until" ) {
3216
			selector = until;
3217
		}
3218
 
3219
		if ( selector && typeof selector === "string" ) {
3220
			matched = jQuery.filter( selector, matched );
3221
		}
3222
 
3223
		if ( this.length > 1 ) {
3224
 
3225
			// Remove duplicates
3226
			if ( !guaranteedUnique[ name ] ) {
3227
				jQuery.uniqueSort( matched );
3228
			}
3229
 
3230
			// Reverse order for parents* and prev-derivatives
3231
			if ( rparentsprev.test( name ) ) {
3232
				matched.reverse();
3233
			}
3234
		}
3235
 
3236
		return this.pushStack( matched );
3237
	};
3238
} );
3239
var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
3240
 
3241
 
3242
 
3243
// Convert String-formatted options into Object-formatted ones
3244
function createOptions( options ) {
3245
	var object = {};
3246
	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
3247
		object[ flag ] = true;
3248
	} );
3249
	return object;
3250
}
3251
 
3252
/*
3253
 * Create a callback list using the following parameters:
3254
 *
3255
 *	options: an optional list of space-separated options that will change how
3256
 *			the callback list behaves or a more traditional option object
3257
 *
3258
 * By default a callback list will act like an event callback list and can be
3259
 * "fired" multiple times.
3260
 *
3261
 * Possible options:
3262
 *
3263
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3264
 *
3265
 *	memory:			will keep track of previous values and will call any callback added
3266
 *					after the list has been fired right away with the latest "memorized"
3267
 *					values (like a Deferred)
3268
 *
3269
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3270
 *
3271
 *	stopOnFalse:	interrupt callings when a callback returns false
3272
 *
3273
 */
3274
jQuery.Callbacks = function( options ) {
3275
 
3276
	// Convert options from String-formatted to Object-formatted if needed
3277
	// (we check in cache first)
3278
	options = typeof options === "string" ?
3279
		createOptions( options ) :
3280
		jQuery.extend( {}, options );
3281
 
3282
	var // Flag to know if list is currently firing
3283
		firing,
3284
 
3285
		// Last fire value for non-forgettable lists
3286
		memory,
3287
 
3288
		// Flag to know if list was already fired
3289
		fired,
3290
 
3291
		// Flag to prevent firing
3292
		locked,
3293
 
3294
		// Actual callback list
3295
		list = [],
3296
 
3297
		// Queue of execution data for repeatable lists
3298
		queue = [],
3299
 
3300
		// Index of currently firing callback (modified by add/remove as needed)
3301
		firingIndex = -1,
3302
 
3303
		// Fire callbacks
3304
		fire = function() {
3305
 
3306
			// Enforce single-firing
3307
			locked = locked || options.once;
3308
 
3309
			// Execute callbacks for all pending executions,
3310
			// respecting firingIndex overrides and runtime changes
3311
			fired = firing = true;
3312
			for ( ; queue.length; firingIndex = -1 ) {
3313
				memory = queue.shift();
3314
				while ( ++firingIndex < list.length ) {
3315
 
3316
					// Run callback and check for early termination
3317
					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
3318
						options.stopOnFalse ) {
3319
 
3320
						// Jump to end and forget the data so .add doesn't re-fire
3321
						firingIndex = list.length;
3322
						memory = false;
3323
					}
3324
				}
3325
			}
3326
 
3327
			// Forget the data if we're done with it
3328
			if ( !options.memory ) {
3329
				memory = false;
3330
			}
3331
 
3332
			firing = false;
3333
 
3334
			// Clean up if we're done firing for good
3335
			if ( locked ) {
3336
 
3337
				// Keep an empty list if we have data for future add calls
3338
				if ( memory ) {
3339
					list = [];
3340
 
3341
				// Otherwise, this object is spent
3342
				} else {
3343
					list = "";
3344
				}
3345
			}
3346
		},
3347
 
3348
		// Actual Callbacks object
3349
		self = {
3350
 
3351
			// Add a callback or a collection of callbacks to the list
3352
			add: function() {
3353
				if ( list ) {
3354
 
3355
					// If we have memory from a past run, we should fire after adding
3356
					if ( memory && !firing ) {
3357
						firingIndex = list.length - 1;
3358
						queue.push( memory );
3359
					}
3360
 
3361
					( function add( args ) {
3362
						jQuery.each( args, function( _, arg ) {
3363
							if ( jQuery.isFunction( arg ) ) {
3364
								if ( !options.unique || !self.has( arg ) ) {
3365
									list.push( arg );
3366
								}
3367
							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3368
 
3369
								// Inspect recursively
3370
								add( arg );
3371
							}
3372
						} );
3373
					} )( arguments );
3374
 
3375
					if ( memory && !firing ) {
3376
						fire();
3377
					}
3378
				}
3379
				return this;
3380
			},
3381
 
3382
			// Remove a callback from the list
3383
			remove: function() {
3384
				jQuery.each( arguments, function( _, arg ) {
3385
					var index;
3386
					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
3387
						list.splice( index, 1 );
3388
 
3389
						// Handle firing indexes
3390
						if ( index <= firingIndex ) {
3391
							firingIndex--;
3392
						}
3393
					}
3394
				} );
3395
				return this;
3396
			},
3397
 
3398
			// Check if a given callback is in the list.
3399
			// If no argument is given, return whether or not list has callbacks attached.
3400
			has: function( fn ) {
3401
				return fn ?
3402
					jQuery.inArray( fn, list ) > -1 :
3403
					list.length > 0;
3404
			},
3405
 
3406
			// Remove all callbacks from the list
3407
			empty: function() {
3408
				if ( list ) {
3409
					list = [];
3410
				}
3411
				return this;
3412
			},
3413
 
3414
			// Disable .fire and .add
3415
			// Abort any current/pending executions
3416
			// Clear all callbacks and values
3417
			disable: function() {
3418
				locked = queue = [];
3419
				list = memory = "";
3420
				return this;
3421
			},
3422
			disabled: function() {
3423
				return !list;
3424
			},
3425
 
3426
			// Disable .fire
3427
			// Also disable .add unless we have memory (since it would have no effect)
3428
			// Abort any pending executions
3429
			lock: function() {
3430
				locked = queue = [];
3431
				if ( !memory && !firing ) {
3432
					list = memory = "";
3433
				}
3434
				return this;
3435
			},
3436
			locked: function() {
3437
				return !!locked;
3438
			},
3439
 
3440
			// Call all callbacks with the given context and arguments
3441
			fireWith: function( context, args ) {
3442
				if ( !locked ) {
3443
					args = args || [];
3444
					args = [ context, args.slice ? args.slice() : args ];
3445
					queue.push( args );
3446
					if ( !firing ) {
3447
						fire();
3448
					}
3449
				}
3450
				return this;
3451
			},
3452
 
3453
			// Call all the callbacks with the given arguments
3454
			fire: function() {
3455
				self.fireWith( this, arguments );
3456
				return this;
3457
			},
3458
 
3459
			// To know if the callbacks have already been called at least once
3460
			fired: function() {
3461
				return !!fired;
3462
			}
3463
		};
3464
 
3465
	return self;
3466
};
3467
 
3468
 
3469
function Identity( v ) {
3470
	return v;
3471
}
3472
function Thrower( ex ) {
3473
	throw ex;
3474
}
3475
 
3476
function adoptValue( value, resolve, reject, noValue ) {
3477
	var method;
3478
 
3479
	try {
3480
 
3481
		// Check for promise aspect first to privilege synchronous behavior
3482
		if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3483
			method.call( value ).done( resolve ).fail( reject );
3484
 
3485
		// Other thenables
3486
		} else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3487
			method.call( value, resolve, reject );
3488
 
3489
		// Other non-thenables
3490
		} else {
3491
 
3492
			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
3493
			// * false: [ value ].slice( 0 ) => resolve( value )
3494
			// * true: [ value ].slice( 1 ) => resolve()
3495
			resolve.apply( undefined, [ value ].slice( noValue ) );
3496
		}
3497
 
3498
	// For Promises/A+, convert exceptions into rejections
3499
	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
3500
	// Deferred#then to conditionally suppress rejection.
3501
	} catch ( value ) {
3502
 
3503
		// Support: Android 4.0 only
3504
		// Strict mode functions invoked without .call/.apply get global-object context
3505
		reject.apply( undefined, [ value ] );
3506
	}
3507
}
3508
 
3509
jQuery.extend( {
3510
 
3511
	Deferred: function( func ) {
3512
		var tuples = [
3513
 
3514
				// action, add listener, callbacks,
3515
				// ... .then handlers, argument index, [final state]
3516
				[ "notify", "progress", jQuery.Callbacks( "memory" ),
3517
					jQuery.Callbacks( "memory" ), 2 ],
3518
				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
3519
					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
3520
				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
3521
					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
3522
			],
3523
			state = "pending",
3524
			promise = {
3525
				state: function() {
3526
					return state;
3527
				},
3528
				always: function() {
3529
					deferred.done( arguments ).fail( arguments );
3530
					return this;
3531
				},
3532
				"catch": function( fn ) {
3533
					return promise.then( null, fn );
3534
				},
3535
 
3536
				// Keep pipe for back-compat
3537
				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
3538
					var fns = arguments;
3539
 
3540
					return jQuery.Deferred( function( newDefer ) {
3541
						jQuery.each( tuples, function( i, tuple ) {
3542
 
3543
							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
3544
							var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3545
 
3546
							// deferred.progress(function() { bind to newDefer or newDefer.notify })
3547
							// deferred.done(function() { bind to newDefer or newDefer.resolve })
3548
							// deferred.fail(function() { bind to newDefer or newDefer.reject })
3549
							deferred[ tuple[ 1 ] ]( function() {
3550
								var returned = fn && fn.apply( this, arguments );
3551
								if ( returned && jQuery.isFunction( returned.promise ) ) {
3552
									returned.promise()
3553
										.progress( newDefer.notify )
3554
										.done( newDefer.resolve )
3555
										.fail( newDefer.reject );
3556
								} else {
3557
									newDefer[ tuple[ 0 ] + "With" ](
3558
										this,
3559
										fn ? [ returned ] : arguments
3560
									);
3561
								}
3562
							} );
3563
						} );
3564
						fns = null;
3565
					} ).promise();
3566
				},
3567
				then: function( onFulfilled, onRejected, onProgress ) {
3568
					var maxDepth = 0;
3569
					function resolve( depth, deferred, handler, special ) {
3570
						return function() {
3571
							var that = this,
3572
								args = arguments,
3573
								mightThrow = function() {
3574
									var returned, then;
3575
 
3576
									// Support: Promises/A+ section 2.3.3.3.3
3577
									// https://promisesaplus.com/#point-59
3578
									// Ignore double-resolution attempts
3579
									if ( depth < maxDepth ) {
3580
										return;
3581
									}
3582
 
3583
									returned = handler.apply( that, args );
3584
 
3585
									// Support: Promises/A+ section 2.3.1
3586
									// https://promisesaplus.com/#point-48
3587
									if ( returned === deferred.promise() ) {
3588
										throw new TypeError( "Thenable self-resolution" );
3589
									}
3590
 
3591
									// Support: Promises/A+ sections 2.3.3.1, 3.5
3592
									// https://promisesaplus.com/#point-54
3593
									// https://promisesaplus.com/#point-75
3594
									// Retrieve `then` only once
3595
									then = returned &&
3596
 
3597
										// Support: Promises/A+ section 2.3.4
3598
										// https://promisesaplus.com/#point-64
3599
										// Only check objects and functions for thenability
3600
										( typeof returned === "object" ||
3601
											typeof returned === "function" ) &&
3602
										returned.then;
3603
 
3604
									// Handle a returned thenable
3605
									if ( jQuery.isFunction( then ) ) {
3606
 
3607
										// Special processors (notify) just wait for resolution
3608
										if ( special ) {
3609
											then.call(
3610
												returned,
3611
												resolve( maxDepth, deferred, Identity, special ),
3612
												resolve( maxDepth, deferred, Thrower, special )
3613
											);
3614
 
3615
										// Normal processors (resolve) also hook into progress
3616
										} else {
3617
 
3618
											// ...and disregard older resolution values
3619
											maxDepth++;
3620
 
3621
											then.call(
3622
												returned,
3623
												resolve( maxDepth, deferred, Identity, special ),
3624
												resolve( maxDepth, deferred, Thrower, special ),
3625
												resolve( maxDepth, deferred, Identity,
3626
													deferred.notifyWith )
3627
											);
3628
										}
3629
 
3630
									// Handle all other returned values
3631
									} else {
3632
 
3633
										// Only substitute handlers pass on context
3634
										// and multiple values (non-spec behavior)
3635
										if ( handler !== Identity ) {
3636
											that = undefined;
3637
											args = [ returned ];
3638
										}
3639
 
3640
										// Process the value(s)
3641
										// Default process is resolve
3642
										( special || deferred.resolveWith )( that, args );
3643
									}
3644
								},
3645
 
3646
								// Only normal processors (resolve) catch and reject exceptions
3647
								process = special ?
3648
									mightThrow :
3649
									function() {
3650
										try {
3651
											mightThrow();
3652
										} catch ( e ) {
3653
 
3654
											if ( jQuery.Deferred.exceptionHook ) {
3655
												jQuery.Deferred.exceptionHook( e,
3656
													process.stackTrace );
3657
											}
3658
 
3659
											// Support: Promises/A+ section 2.3.3.3.4.1
3660
											// https://promisesaplus.com/#point-61
3661
											// Ignore post-resolution exceptions
3662
											if ( depth + 1 >= maxDepth ) {
3663
 
3664
												// Only substitute handlers pass on context
3665
												// and multiple values (non-spec behavior)
3666
												if ( handler !== Thrower ) {
3667
													that = undefined;
3668
													args = [ e ];
3669
												}
3670
 
3671
												deferred.rejectWith( that, args );
3672
											}
3673
										}
3674
									};
3675
 
3676
							// Support: Promises/A+ section 2.3.3.3.1
3677
							// https://promisesaplus.com/#point-57
3678
							// Re-resolve promises immediately to dodge false rejection from
3679
							// subsequent errors
3680
							if ( depth ) {
3681
								process();
3682
							} else {
3683
 
3684
								// Call an optional hook to record the stack, in case of exception
3685
								// since it's otherwise lost when execution goes async
3686
								if ( jQuery.Deferred.getStackHook ) {
3687
									process.stackTrace = jQuery.Deferred.getStackHook();
3688
								}
3689
								window.setTimeout( process );
3690
							}
3691
						};
3692
					}
3693
 
3694
					return jQuery.Deferred( function( newDefer ) {
3695
 
3696
						// progress_handlers.add( ... )
3697
						tuples[ 0 ][ 3 ].add(
3698
							resolve(
3699
								0,
3700
								newDefer,
3701
								jQuery.isFunction( onProgress ) ?
3702
									onProgress :
3703
									Identity,
3704
								newDefer.notifyWith
3705
							)
3706
						);
3707
 
3708
						// fulfilled_handlers.add( ... )
3709
						tuples[ 1 ][ 3 ].add(
3710
							resolve(
3711
								0,
3712
								newDefer,
3713
								jQuery.isFunction( onFulfilled ) ?
3714
									onFulfilled :
3715
									Identity
3716
							)
3717
						);
3718
 
3719
						// rejected_handlers.add( ... )
3720
						tuples[ 2 ][ 3 ].add(
3721
							resolve(
3722
								0,
3723
								newDefer,
3724
								jQuery.isFunction( onRejected ) ?
3725
									onRejected :
3726
									Thrower
3727
							)
3728
						);
3729
					} ).promise();
3730
				},
3731
 
3732
				// Get a promise for this deferred
3733
				// If obj is provided, the promise aspect is added to the object
3734
				promise: function( obj ) {
3735
					return obj != null ? jQuery.extend( obj, promise ) : promise;
3736
				}
3737
			},
3738
			deferred = {};
3739
 
3740
		// Add list-specific methods
3741
		jQuery.each( tuples, function( i, tuple ) {
3742
			var list = tuple[ 2 ],
3743
				stateString = tuple[ 5 ];
3744
 
3745
			// promise.progress = list.add
3746
			// promise.done = list.add
3747
			// promise.fail = list.add
3748
			promise[ tuple[ 1 ] ] = list.add;
3749
 
3750
			// Handle state
3751
			if ( stateString ) {
3752
				list.add(
3753
					function() {
3754
 
3755
						// state = "resolved" (i.e., fulfilled)
3756
						// state = "rejected"
3757
						state = stateString;
3758
					},
3759
 
3760
					// rejected_callbacks.disable
3761
					// fulfilled_callbacks.disable
3762
					tuples[ 3 - i ][ 2 ].disable,
3763
 
3764
					// progress_callbacks.lock
3765
					tuples[ 0 ][ 2 ].lock
3766
				);
3767
			}
3768
 
3769
			// progress_handlers.fire
3770
			// fulfilled_handlers.fire
3771
			// rejected_handlers.fire
3772
			list.add( tuple[ 3 ].fire );
3773
 
3774
			// deferred.notify = function() { deferred.notifyWith(...) }
3775
			// deferred.resolve = function() { deferred.resolveWith(...) }
3776
			// deferred.reject = function() { deferred.rejectWith(...) }
3777
			deferred[ tuple[ 0 ] ] = function() {
3778
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
3779
				return this;
3780
			};
3781
 
3782
			// deferred.notifyWith = list.fireWith
3783
			// deferred.resolveWith = list.fireWith
3784
			// deferred.rejectWith = list.fireWith
3785
			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
3786
		} );
3787
 
3788
		// Make the deferred a promise
3789
		promise.promise( deferred );
3790
 
3791
		// Call given func if any
3792
		if ( func ) {
3793
			func.call( deferred, deferred );
3794
		}
3795
 
3796
		// All done!
3797
		return deferred;
3798
	},
3799
 
3800
	// Deferred helper
3801
	when: function( singleValue ) {
3802
		var
3803
 
3804
			// count of uncompleted subordinates
3805
			remaining = arguments.length,
3806
 
3807
			// count of unprocessed arguments
3808
			i = remaining,
3809
 
3810
			// subordinate fulfillment data
3811
			resolveContexts = Array( i ),
3812
			resolveValues = slice.call( arguments ),
3813
 
3814
			// the master Deferred
3815
			master = jQuery.Deferred(),
3816
 
3817
			// subordinate callback factory
3818
			updateFunc = function( i ) {
3819
				return function( value ) {
3820
					resolveContexts[ i ] = this;
3821
					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3822
					if ( !( --remaining ) ) {
3823
						master.resolveWith( resolveContexts, resolveValues );
3824
					}
3825
				};
3826
			};
3827
 
3828
		// Single- and empty arguments are adopted like Promise.resolve
3829
		if ( remaining <= 1 ) {
3830
			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3831
				!remaining );
3832
 
3833
			// Use .then() to unwrap secondary thenables (cf. gh-3000)
3834
			if ( master.state() === "pending" ||
3835
				jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3836
 
3837
				return master.then();
3838
			}
3839
		}
3840
 
3841
		// Multiple arguments are aggregated like Promise.all array elements
3842
		while ( i-- ) {
3843
			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3844
		}
3845
 
3846
		return master.promise();
3847
	}
3848
} );
3849
 
3850
 
3851
// These usually indicate a programmer mistake during development,
3852
// warn about them ASAP rather than swallowing them by default.
3853
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3854
 
3855
jQuery.Deferred.exceptionHook = function( error, stack ) {
3856
 
3857
	// Support: IE 8 - 9 only
3858
	// Console exists when dev tools are open, which can happen at any time
3859
	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3860
		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3861
	}
3862
};
3863
 
3864
 
3865
 
3866
 
3867
jQuery.readyException = function( error ) {
3868
	window.setTimeout( function() {
3869
		throw error;
3870
	} );
3871
};
3872
 
3873
 
3874
 
3875
 
3876
// The deferred used on DOM ready
3877
var readyList = jQuery.Deferred();
3878
 
3879
jQuery.fn.ready = function( fn ) {
3880
 
3881
	readyList
3882
		.then( fn )
3883
 
3884
		// Wrap jQuery.readyException in a function so that the lookup
3885
		// happens at the time of error handling instead of callback
3886
		// registration.
3887
		.catch( function( error ) {
3888
			jQuery.readyException( error );
3889
		} );
3890
 
3891
	return this;
3892
};
3893
 
3894
jQuery.extend( {
3895
 
3896
	// Is the DOM ready to be used? Set to true once it occurs.
3897
	isReady: false,
3898
 
3899
	// A counter to track how many items to wait for before
3900
	// the ready event fires. See #6781
3901
	readyWait: 1,
3902
 
3903
	// Handle when the DOM is ready
3904
	ready: function( wait ) {
3905
 
3906
		// Abort if there are pending holds or we're already ready
3907
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3908
			return;
3909
		}
3910
 
3911
		// Remember that the DOM is ready
3912
		jQuery.isReady = true;
3913
 
3914
		// If a normal DOM Ready event fired, decrement, and wait if need be
3915
		if ( wait !== true && --jQuery.readyWait > 0 ) {
3916
			return;
3917
		}
3918
 
3919
		// If there are functions bound, to execute
3920
		readyList.resolveWith( document, [ jQuery ] );
3921
	}
3922
} );
3923
 
3924
jQuery.ready.then = readyList.then;
3925
 
3926
// The ready event handler and self cleanup method
3927
function completed() {
3928
	document.removeEventListener( "DOMContentLoaded", completed );
3929
	window.removeEventListener( "load", completed );
3930
	jQuery.ready();
3931
}
3932
 
3933
// Catch cases where $(document).ready() is called
3934
// after the browser event has already occurred.
3935
// Support: IE <=9 - 10 only
3936
// Older IE sometimes signals "interactive" too soon
3937
if ( document.readyState === "complete" ||
3938
	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
3939
 
3940
	// Handle it asynchronously to allow scripts the opportunity to delay ready
3941
	window.setTimeout( jQuery.ready );
3942
 
3943
} else {
3944
 
3945
	// Use the handy event callback
3946
	document.addEventListener( "DOMContentLoaded", completed );
3947
 
3948
	// A fallback to window.onload, that will always work
3949
	window.addEventListener( "load", completed );
3950
}
3951
 
3952
 
3953
 
3954
 
3955
// Multifunctional method to get and set values of a collection
3956
// The value/s can optionally be executed if it's a function
3957
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3958
	var i = 0,
3959
		len = elems.length,
3960
		bulk = key == null;
3961
 
3962
	// Sets many values
3963
	if ( jQuery.type( key ) === "object" ) {
3964
		chainable = true;
3965
		for ( i in key ) {
3966
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
3967
		}
3968
 
3969
	// Sets one value
3970
	} else if ( value !== undefined ) {
3971
		chainable = true;
3972
 
3973
		if ( !jQuery.isFunction( value ) ) {
3974
			raw = true;
3975
		}
3976
 
3977
		if ( bulk ) {
3978
 
3979
			// Bulk operations run against the entire set
3980
			if ( raw ) {
3981
				fn.call( elems, value );
3982
				fn = null;
3983
 
3984
			// ...except when executing function values
3985
			} else {
3986
				bulk = fn;
3987
				fn = function( elem, key, value ) {
3988
					return bulk.call( jQuery( elem ), value );
3989
				};
3990
			}
3991
		}
3992
 
3993
		if ( fn ) {
3994
			for ( ; i < len; i++ ) {
3995
				fn(
3996
					elems[ i ], key, raw ?
3997
					value :
3998
					value.call( elems[ i ], i, fn( elems[ i ], key ) )
3999
				);
4000
			}
4001
		}
4002
	}
4003
 
4004
	if ( chainable ) {
4005
		return elems;
4006
	}
4007
 
4008
	// Gets
4009
	if ( bulk ) {
4010
		return fn.call( elems );
4011
	}
4012
 
4013
	return len ? fn( elems[ 0 ], key ) : emptyGet;
4014
};
4015
var acceptData = function( owner ) {
4016
 
4017
	// Accepts only:
4018
	//  - Node
4019
	//    - Node.ELEMENT_NODE
4020
	//    - Node.DOCUMENT_NODE
4021
	//  - Object
4022
	//    - Any
4023
	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
4024
};
4025
 
4026
 
4027
 
4028
 
4029
function Data() {
4030
	this.expando = jQuery.expando + Data.uid++;
4031
}
4032
 
4033
Data.uid = 1;
4034
 
4035
Data.prototype = {
4036
 
4037
	cache: function( owner ) {
4038
 
4039
		// Check if the owner object already has a cache
4040
		var value = owner[ this.expando ];
4041
 
4042
		// If not, create one
4043
		if ( !value ) {
4044
			value = {};
4045
 
4046
			// We can accept data for non-element nodes in modern browsers,
4047
			// but we should not, see #8335.
4048
			// Always return an empty object.
4049
			if ( acceptData( owner ) ) {
4050
 
4051
				// If it is a node unlikely to be stringify-ed or looped over
4052
				// use plain assignment
4053
				if ( owner.nodeType ) {
4054
					owner[ this.expando ] = value;
4055
 
4056
				// Otherwise secure it in a non-enumerable property
4057
				// configurable must be true to allow the property to be
4058
				// deleted when data is removed
4059
				} else {
4060
					Object.defineProperty( owner, this.expando, {
4061
						value: value,
4062
						configurable: true
4063
					} );
4064
				}
4065
			}
4066
		}
4067
 
4068
		return value;
4069
	},
4070
	set: function( owner, data, value ) {
4071
		var prop,
4072
			cache = this.cache( owner );
4073
 
4074
		// Handle: [ owner, key, value ] args
4075
		// Always use camelCase key (gh-2257)
4076
		if ( typeof data === "string" ) {
4077
			cache[ jQuery.camelCase( data ) ] = value;
4078
 
4079
		// Handle: [ owner, { properties } ] args
4080
		} else {
4081
 
4082
			// Copy the properties one-by-one to the cache object
4083
			for ( prop in data ) {
4084
				cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4085
			}
4086
		}
4087
		return cache;
4088
	},
4089
	get: function( owner, key ) {
4090
		return key === undefined ?
4091
			this.cache( owner ) :
4092
 
4093
			// Always use camelCase key (gh-2257)
4094
			owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4095
	},
4096
	access: function( owner, key, value ) {
4097
 
4098
		// In cases where either:
4099
		//
4100
		//   1. No key was specified
4101
		//   2. A string key was specified, but no value provided
4102
		//
4103
		// Take the "read" path and allow the get method to determine
4104
		// which value to return, respectively either:
4105
		//
4106
		//   1. The entire cache object
4107
		//   2. The data stored at the key
4108
		//
4109
		if ( key === undefined ||
4110
				( ( key && typeof key === "string" ) && value === undefined ) ) {
4111
 
4112
			return this.get( owner, key );
4113
		}
4114
 
4115
		// When the key is not a string, or both a key and value
4116
		// are specified, set or extend (existing objects) with either:
4117
		//
4118
		//   1. An object of properties
4119
		//   2. A key and value
4120
		//
4121
		this.set( owner, key, value );
4122
 
4123
		// Since the "set" path can have two possible entry points
4124
		// return the expected data based on which path was taken[*]
4125
		return value !== undefined ? value : key;
4126
	},
4127
	remove: function( owner, key ) {
4128
		var i,
4129
			cache = owner[ this.expando ];
4130
 
4131
		if ( cache === undefined ) {
4132
			return;
4133
		}
4134
 
4135
		if ( key !== undefined ) {
4136
 
4137
			// Support array or space separated string of keys
4138
			if ( Array.isArray( key ) ) {
4139
 
4140
				// If key is an array of keys...
4141
				// We always set camelCase keys, so remove that.
4142
				key = key.map( jQuery.camelCase );
4143
			} else {
4144
				key = jQuery.camelCase( key );
4145
 
4146
				// If a key with the spaces exists, use it.
4147
				// Otherwise, create an array by matching non-whitespace
4148
				key = key in cache ?
4149
					[ key ] :
4150
					( key.match( rnothtmlwhite ) || [] );
4151
			}
4152
 
4153
			i = key.length;
4154
 
4155
			while ( i-- ) {
4156
				delete cache[ key[ i ] ];
4157
			}
4158
		}
4159
 
4160
		// Remove the expando if there's no more data
4161
		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
4162
 
4163
			// Support: Chrome <=35 - 45
4164
			// Webkit & Blink performance suffers when deleting properties
4165
			// from DOM nodes, so set to undefined instead
4166
			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
4167
			if ( owner.nodeType ) {
4168
				owner[ this.expando ] = undefined;
4169
			} else {
4170
				delete owner[ this.expando ];
4171
			}
4172
		}
4173
	},
4174
	hasData: function( owner ) {
4175
		var cache = owner[ this.expando ];
4176
		return cache !== undefined && !jQuery.isEmptyObject( cache );
4177
	}
4178
};
4179
var dataPriv = new Data();
4180
 
4181
var dataUser = new Data();
4182
 
4183
 
4184
 
4185
//	Implementation Summary
4186
//
4187
//	1. Enforce API surface and semantic compatibility with 1.9.x branch
4188
//	2. Improve the module's maintainability by reducing the storage
4189
//		paths to a single mechanism.
4190
//	3. Use the same single mechanism to support "private" and "user" data.
4191
//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
4192
//	5. Avoid exposing implementation details on user objects (eg. expando properties)
4193
//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
4194
 
4195
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
4196
	rmultiDash = /[A-Z]/g;
4197
 
4198
function getData( data ) {
4199
	if ( data === "true" ) {
4200
		return true;
4201
	}
4202
 
4203
	if ( data === "false" ) {
4204
		return false;
4205
	}
4206
 
4207
	if ( data === "null" ) {
4208
		return null;
4209
	}
4210
 
4211
	// Only convert to a number if it doesn't change the string
4212
	if ( data === +data + "" ) {
4213
		return +data;
4214
	}
4215
 
4216
	if ( rbrace.test( data ) ) {
4217
		return JSON.parse( data );
4218
	}
4219
 
4220
	return data;
4221
}
4222
 
4223
function dataAttr( elem, key, data ) {
4224
	var name;
4225
 
4226
	// If nothing was found internally, try to fetch any
4227
	// data from the HTML5 data-* attribute
4228
	if ( data === undefined && elem.nodeType === 1 ) {
4229
		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
4230
		data = elem.getAttribute( name );
4231
 
4232
		if ( typeof data === "string" ) {
4233
			try {
4234
				data = getData( data );
4235
			} catch ( e ) {}
4236
 
4237
			// Make sure we set the data so it isn't changed later
4238
			dataUser.set( elem, key, data );
4239
		} else {
4240
			data = undefined;
4241
		}
4242
	}
4243
	return data;
4244
}
4245
 
4246
jQuery.extend( {
4247
	hasData: function( elem ) {
4248
		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
4249
	},
4250
 
4251
	data: function( elem, name, data ) {
4252
		return dataUser.access( elem, name, data );
4253
	},
4254
 
4255
	removeData: function( elem, name ) {
4256
		dataUser.remove( elem, name );
4257
	},
4258
 
4259
	// TODO: Now that all calls to _data and _removeData have been replaced
4260
	// with direct calls to dataPriv methods, these can be deprecated.
4261
	_data: function( elem, name, data ) {
4262
		return dataPriv.access( elem, name, data );
4263
	},
4264
 
4265
	_removeData: function( elem, name ) {
4266
		dataPriv.remove( elem, name );
4267
	}
4268
} );
4269
 
4270
jQuery.fn.extend( {
4271
	data: function( key, value ) {
4272
		var i, name, data,
4273
			elem = this[ 0 ],
4274
			attrs = elem && elem.attributes;
4275
 
4276
		// Gets all values
4277
		if ( key === undefined ) {
4278
			if ( this.length ) {
4279
				data = dataUser.get( elem );
4280
 
4281
				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
4282
					i = attrs.length;
4283
					while ( i-- ) {
4284
 
4285
						// Support: IE 11 only
4286
						// The attrs elements can be null (#14894)
4287
						if ( attrs[ i ] ) {
4288
							name = attrs[ i ].name;
4289
							if ( name.indexOf( "data-" ) === 0 ) {
4290
								name = jQuery.camelCase( name.slice( 5 ) );
4291
								dataAttr( elem, name, data[ name ] );
4292
							}
4293
						}
4294
					}
4295
					dataPriv.set( elem, "hasDataAttrs", true );
4296
				}
4297
			}
4298
 
4299
			return data;
4300
		}
4301
 
4302
		// Sets multiple values
4303
		if ( typeof key === "object" ) {
4304
			return this.each( function() {
4305
				dataUser.set( this, key );
4306
			} );
4307
		}
4308
 
4309
		return access( this, function( value ) {
4310
			var data;
4311
 
4312
			// The calling jQuery object (element matches) is not empty
4313
			// (and therefore has an element appears at this[ 0 ]) and the
4314
			// `value` parameter was not undefined. An empty jQuery object
4315
			// will result in `undefined` for elem = this[ 0 ] which will
4316
			// throw an exception if an attempt to read a data cache is made.
4317
			if ( elem && value === undefined ) {
4318
 
4319
				// Attempt to get data from the cache
4320
				// The key will always be camelCased in Data
4321
				data = dataUser.get( elem, key );
4322
				if ( data !== undefined ) {
4323
					return data;
4324
				}
4325
 
4326
				// Attempt to "discover" the data in
4327
				// HTML5 custom data-* attrs
4328
				data = dataAttr( elem, key );
4329
				if ( data !== undefined ) {
4330
					return data;
4331
				}
4332
 
4333
				// We tried really hard, but the data doesn't exist.
4334
				return;
4335
			}
4336
 
4337
			// Set the data...
4338
			this.each( function() {
4339
 
4340
				// We always store the camelCased key
4341
				dataUser.set( this, key, value );
4342
			} );
4343
		}, null, value, arguments.length > 1, null, true );
4344
	},
4345
 
4346
	removeData: function( key ) {
4347
		return this.each( function() {
4348
			dataUser.remove( this, key );
4349
		} );
4350
	}
4351
} );
4352
 
4353
 
4354
jQuery.extend( {
4355
	queue: function( elem, type, data ) {
4356
		var queue;
4357
 
4358
		if ( elem ) {
4359
			type = ( type || "fx" ) + "queue";
4360
			queue = dataPriv.get( elem, type );
4361
 
4362
			// Speed up dequeue by getting out quickly if this is just a lookup
4363
			if ( data ) {
4364
				if ( !queue || Array.isArray( data ) ) {
4365
					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
4366
				} else {
4367
					queue.push( data );
4368
				}
4369
			}
4370
			return queue || [];
4371
		}
4372
	},
4373
 
4374
	dequeue: function( elem, type ) {
4375
		type = type || "fx";
4376
 
4377
		var queue = jQuery.queue( elem, type ),
4378
			startLength = queue.length,
4379
			fn = queue.shift(),
4380
			hooks = jQuery._queueHooks( elem, type ),
4381
			next = function() {
4382
				jQuery.dequeue( elem, type );
4383
			};
4384
 
4385
		// If the fx queue is dequeued, always remove the progress sentinel
4386
		if ( fn === "inprogress" ) {
4387
			fn = queue.shift();
4388
			startLength--;
4389
		}
4390
 
4391
		if ( fn ) {
4392
 
4393
			// Add a progress sentinel to prevent the fx queue from being
4394
			// automatically dequeued
4395
			if ( type === "fx" ) {
4396
				queue.unshift( "inprogress" );
4397
			}
4398
 
4399
			// Clear up the last queue stop function
4400
			delete hooks.stop;
4401
			fn.call( elem, next, hooks );
4402
		}
4403
 
4404
		if ( !startLength && hooks ) {
4405
			hooks.empty.fire();
4406
		}
4407
	},
4408
 
4409
	// Not public - generate a queueHooks object, or return the current one
4410
	_queueHooks: function( elem, type ) {
4411
		var key = type + "queueHooks";
4412
		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
4413
			empty: jQuery.Callbacks( "once memory" ).add( function() {
4414
				dataPriv.remove( elem, [ type + "queue", key ] );
4415
			} )
4416
		} );
4417
	}
4418
} );
4419
 
4420
jQuery.fn.extend( {
4421
	queue: function( type, data ) {
4422
		var setter = 2;
4423
 
4424
		if ( typeof type !== "string" ) {
4425
			data = type;
4426
			type = "fx";
4427
			setter--;
4428
		}
4429
 
4430
		if ( arguments.length < setter ) {
4431
			return jQuery.queue( this[ 0 ], type );
4432
		}
4433
 
4434
		return data === undefined ?
4435
			this :
4436
			this.each( function() {
4437
				var queue = jQuery.queue( this, type, data );
4438
 
4439
				// Ensure a hooks for this queue
4440
				jQuery._queueHooks( this, type );
4441
 
4442
				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
4443
					jQuery.dequeue( this, type );
4444
				}
4445
			} );
4446
	},
4447
	dequeue: function( type ) {
4448
		return this.each( function() {
4449
			jQuery.dequeue( this, type );
4450
		} );
4451
	},
4452
	clearQueue: function( type ) {
4453
		return this.queue( type || "fx", [] );
4454
	},
4455
 
4456
	// Get a promise resolved when queues of a certain type
4457
	// are emptied (fx is the type by default)
4458
	promise: function( type, obj ) {
4459
		var tmp,
4460
			count = 1,
4461
			defer = jQuery.Deferred(),
4462
			elements = this,
4463
			i = this.length,
4464
			resolve = function() {
4465
				if ( !( --count ) ) {
4466
					defer.resolveWith( elements, [ elements ] );
4467
				}
4468
			};
4469
 
4470
		if ( typeof type !== "string" ) {
4471
			obj = type;
4472
			type = undefined;
4473
		}
4474
		type = type || "fx";
4475
 
4476
		while ( i-- ) {
4477
			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
4478
			if ( tmp && tmp.empty ) {
4479
				count++;
4480
				tmp.empty.add( resolve );
4481
			}
4482
		}
4483
		resolve();
4484
		return defer.promise( obj );
4485
	}
4486
} );
4487
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
4488
 
4489
var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4490
 
4491
 
4492
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4493
 
4494
var isHiddenWithinTree = function( elem, el ) {
4495
 
4496
		// isHiddenWithinTree might be called from jQuery#filter function;
4497
		// in that case, element will be second argument
4498
		elem = el || elem;
4499
 
4500
		// Inline style trumps all
4501
		return elem.style.display === "none" ||
4502
			elem.style.display === "" &&
4503
 
4504
			// Otherwise, check computed style
4505
			// Support: Firefox <=43 - 45
4506
			// Disconnected elements can have computed display: none, so first confirm that elem is
4507
			// in the document.
4508
			jQuery.contains( elem.ownerDocument, elem ) &&
4509
 
4510
			jQuery.css( elem, "display" ) === "none";
4511
	};
4512
 
4513
var swap = function( elem, options, callback, args ) {
4514
	var ret, name,
4515
		old = {};
4516
 
4517
	// Remember the old values, and insert the new ones
4518
	for ( name in options ) {
4519
		old[ name ] = elem.style[ name ];
4520
		elem.style[ name ] = options[ name ];
4521
	}
4522
 
4523
	ret = callback.apply( elem, args || [] );
4524
 
4525
	// Revert the old values
4526
	for ( name in options ) {
4527
		elem.style[ name ] = old[ name ];
4528
	}
4529
 
4530
	return ret;
4531
};
4532
 
4533
 
4534
 
4535
 
4536
function adjustCSS( elem, prop, valueParts, tween ) {
4537
	var adjusted,
4538
		scale = 1,
4539
		maxIterations = 20,
4540
		currentValue = tween ?
4541
			function() {
4542
				return tween.cur();
4543
			} :
4544
			function() {
4545
				return jQuery.css( elem, prop, "" );
4546
			},
4547
		initial = currentValue(),
4548
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4549
 
4550
		// Starting value computation is required for potential unit mismatches
4551
		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4552
			rcssNum.exec( jQuery.css( elem, prop ) );
4553
 
4554
	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4555
 
4556
		// Trust units reported by jQuery.css
4557
		unit = unit || initialInUnit[ 3 ];
4558
 
4559
		// Make sure we update the tween properties later on
4560
		valueParts = valueParts || [];
4561
 
4562
		// Iteratively approximate from a nonzero starting point
4563
		initialInUnit = +initial || 1;
4564
 
4565
		do {
4566
 
4567
			// If previous iteration zeroed out, double until we get *something*.
4568
			// Use string for doubling so we don't accidentally see scale as unchanged below
4569
			scale = scale || ".5";
4570
 
4571
			// Adjust and apply
4572
			initialInUnit = initialInUnit / scale;
4573
			jQuery.style( elem, prop, initialInUnit + unit );
4574
 
4575
		// Update scale, tolerating zero or NaN from tween.cur()
4576
		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
4577
		} while (
4578
			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
4579
		);
4580
	}
4581
 
4582
	if ( valueParts ) {
4583
		initialInUnit = +initialInUnit || +initial || 0;
4584
 
4585
		// Apply relative offset (+=/-=) if specified
4586
		adjusted = valueParts[ 1 ] ?
4587
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
4588
			+valueParts[ 2 ];
4589
		if ( tween ) {
4590
			tween.unit = unit;
4591
			tween.start = initialInUnit;
4592
			tween.end = adjusted;
4593
		}
4594
	}
4595
	return adjusted;
4596
}
4597
 
4598
 
4599
var defaultDisplayMap = {};
4600
 
4601
function getDefaultDisplay( elem ) {
4602
	var temp,
4603
		doc = elem.ownerDocument,
4604
		nodeName = elem.nodeName,
4605
		display = defaultDisplayMap[ nodeName ];
4606
 
4607
	if ( display ) {
4608
		return display;
4609
	}
4610
 
4611
	temp = doc.body.appendChild( doc.createElement( nodeName ) );
4612
	display = jQuery.css( temp, "display" );
4613
 
4614
	temp.parentNode.removeChild( temp );
4615
 
4616
	if ( display === "none" ) {
4617
		display = "block";
4618
	}
4619
	defaultDisplayMap[ nodeName ] = display;
4620
 
4621
	return display;
4622
}
4623
 
4624
function showHide( elements, show ) {
4625
	var display, elem,
4626
		values = [],
4627
		index = 0,
4628
		length = elements.length;
4629
 
4630
	// Determine new display value for elements that need to change
4631
	for ( ; index < length; index++ ) {
4632
		elem = elements[ index ];
4633
		if ( !elem.style ) {
4634
			continue;
4635
		}
4636
 
4637
		display = elem.style.display;
4638
		if ( show ) {
4639
 
4640
			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
4641
			// check is required in this first loop unless we have a nonempty display value (either
4642
			// inline or about-to-be-restored)
4643
			if ( display === "none" ) {
4644
				values[ index ] = dataPriv.get( elem, "display" ) || null;
4645
				if ( !values[ index ] ) {
4646
					elem.style.display = "";
4647
				}
4648
			}
4649
			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
4650
				values[ index ] = getDefaultDisplay( elem );
4651
			}
4652
		} else {
4653
			if ( display !== "none" ) {
4654
				values[ index ] = "none";
4655
 
4656
				// Remember what we're overwriting
4657
				dataPriv.set( elem, "display", display );
4658
			}
4659
		}
4660
	}
4661
 
4662
	// Set the display of the elements in a second loop to avoid constant reflow
4663
	for ( index = 0; index < length; index++ ) {
4664
		if ( values[ index ] != null ) {
4665
			elements[ index ].style.display = values[ index ];
4666
		}
4667
	}
4668
 
4669
	return elements;
4670
}
4671
 
4672
jQuery.fn.extend( {
4673
	show: function() {
4674
		return showHide( this, true );
4675
	},
4676
	hide: function() {
4677
		return showHide( this );
4678
	},
4679
	toggle: function( state ) {
4680
		if ( typeof state === "boolean" ) {
4681
			return state ? this.show() : this.hide();
4682
		}
4683
 
4684
		return this.each( function() {
4685
			if ( isHiddenWithinTree( this ) ) {
4686
				jQuery( this ).show();
4687
			} else {
4688
				jQuery( this ).hide();
4689
			}
4690
		} );
4691
	}
4692
} );
4693
var rcheckableType = ( /^(?:checkbox|radio)$/i );
4694
 
4695
var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4696
 
4697
var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4698
 
4699
 
4700
 
4701
// We have to close these tags to support XHTML (#13200)
4702
var wrapMap = {
4703
 
4704
	// Support: IE <=9 only
4705
	option: [ 1, "<select multiple='multiple'>", "</select>" ],
4706
 
4707
	// XHTML parsers do not magically insert elements in the
4708
	// same way that tag soup parsers do. So we cannot shorten
4709
	// this by omitting <tbody> or other required elements.
4710
	thead: [ 1, "<table>", "</table>" ],
4711
	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4712
	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4713
	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4714
 
4715
	_default: [ 0, "", "" ]
4716
};
4717
 
4718
// Support: IE <=9 only
4719
wrapMap.optgroup = wrapMap.option;
4720
 
4721
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4722
wrapMap.th = wrapMap.td;
4723
 
4724
 
4725
function getAll( context, tag ) {
4726
 
4727
	// Support: IE <=9 - 11 only
4728
	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
4729
	var ret;
4730
 
4731
	if ( typeof context.getElementsByTagName !== "undefined" ) {
4732
		ret = context.getElementsByTagName( tag || "*" );
4733
 
4734
	} else if ( typeof context.querySelectorAll !== "undefined" ) {
4735
		ret = context.querySelectorAll( tag || "*" );
4736
 
4737
	} else {
4738
		ret = [];
4739
	}
4740
 
4741
	if ( tag === undefined || tag && nodeName( context, tag ) ) {
4742
		return jQuery.merge( [ context ], ret );
4743
	}
4744
 
4745
	return ret;
4746
}
4747
 
4748
 
4749
// Mark scripts as having already been evaluated
4750
function setGlobalEval( elems, refElements ) {
4751
	var i = 0,
4752
		l = elems.length;
4753
 
4754
	for ( ; i < l; i++ ) {
4755
		dataPriv.set(
4756
			elems[ i ],
4757
			"globalEval",
4758
			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
4759
		);
4760
	}
4761
}
4762
 
4763
 
4764
var rhtml = /<|&#?\w+;/;
4765
 
4766
function buildFragment( elems, context, scripts, selection, ignored ) {
4767
	var elem, tmp, tag, wrap, contains, j,
4768
		fragment = context.createDocumentFragment(),
4769
		nodes = [],
4770
		i = 0,
4771
		l = elems.length;
4772
 
4773
	for ( ; i < l; i++ ) {
4774
		elem = elems[ i ];
4775
 
4776
		if ( elem || elem === 0 ) {
4777
 
4778
			// Add nodes directly
4779
			if ( jQuery.type( elem ) === "object" ) {
4780
 
4781
				// Support: Android <=4.0 only, PhantomJS 1 only
4782
				// push.apply(_, arraylike) throws on ancient WebKit
4783
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
4784
 
4785
			// Convert non-html into a text node
4786
			} else if ( !rhtml.test( elem ) ) {
4787
				nodes.push( context.createTextNode( elem ) );
4788
 
4789
			// Convert html into DOM nodes
4790
			} else {
4791
				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
4792
 
4793
				// Deserialize a standard representation
4794
				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
4795
				wrap = wrapMap[ tag ] || wrapMap._default;
4796
				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
4797
 
4798
				// Descend through wrappers to the right content
4799
				j = wrap[ 0 ];
4800
				while ( j-- ) {
4801
					tmp = tmp.lastChild;
4802
				}
4803
 
4804
				// Support: Android <=4.0 only, PhantomJS 1 only
4805
				// push.apply(_, arraylike) throws on ancient WebKit
4806
				jQuery.merge( nodes, tmp.childNodes );
4807
 
4808
				// Remember the top-level container
4809
				tmp = fragment.firstChild;
4810
 
4811
				// Ensure the created nodes are orphaned (#12392)
4812
				tmp.textContent = "";
4813
			}
4814
		}
4815
	}
4816
 
4817
	// Remove wrapper from fragment
4818
	fragment.textContent = "";
4819
 
4820
	i = 0;
4821
	while ( ( elem = nodes[ i++ ] ) ) {
4822
 
4823
		// Skip elements already in the context collection (trac-4087)
4824
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
4825
			if ( ignored ) {
4826
				ignored.push( elem );
4827
			}
4828
			continue;
4829
		}
4830
 
4831
		contains = jQuery.contains( elem.ownerDocument, elem );
4832
 
4833
		// Append to fragment
4834
		tmp = getAll( fragment.appendChild( elem ), "script" );
4835
 
4836
		// Preserve script evaluation history
4837
		if ( contains ) {
4838
			setGlobalEval( tmp );
4839
		}
4840
 
4841
		// Capture executables
4842
		if ( scripts ) {
4843
			j = 0;
4844
			while ( ( elem = tmp[ j++ ] ) ) {
4845
				if ( rscriptType.test( elem.type || "" ) ) {
4846
					scripts.push( elem );
4847
				}
4848
			}
4849
		}
4850
	}
4851
 
4852
	return fragment;
4853
}
4854
 
4855
 
4856
( function() {
4857
	var fragment = document.createDocumentFragment(),
4858
		div = fragment.appendChild( document.createElement( "div" ) ),
4859
		input = document.createElement( "input" );
4860
 
4861
	// Support: Android 4.0 - 4.3 only
4862
	// Check state lost if the name is set (#11217)
4863
	// Support: Windows Web Apps (WWA)
4864
	// `name` and `type` must use .setAttribute for WWA (#14901)
4865
	input.setAttribute( "type", "radio" );
4866
	input.setAttribute( "checked", "checked" );
4867
	input.setAttribute( "name", "t" );
4868
 
4869
	div.appendChild( input );
4870
 
4871
	// Support: Android <=4.1 only
4872
	// Older WebKit doesn't clone checked state correctly in fragments
4873
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4874
 
4875
	// Support: IE <=11 only
4876
	// Make sure textarea (and checkbox) defaultValue is properly cloned
4877
	div.innerHTML = "<textarea>x</textarea>";
4878
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4879
} )();
4880
var documentElement = document.documentElement;
4881
 
4882
 
4883
 
4884
var
4885
	rkeyEvent = /^key/,
4886
	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4887
	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4888
 
4889
function returnTrue() {
4890
	return true;
4891
}
4892
 
4893
function returnFalse() {
4894
	return false;
4895
}
4896
 
4897
// Support: IE <=9 only
4898
// See #13393 for more info
4899
function safeActiveElement() {
4900
	try {
4901
		return document.activeElement;
4902
	} catch ( err ) { }
4903
}
4904
 
4905
function on( elem, types, selector, data, fn, one ) {
4906
	var origFn, type;
4907
 
4908
	// Types can be a map of types/handlers
4909
	if ( typeof types === "object" ) {
4910
 
4911
		// ( types-Object, selector, data )
4912
		if ( typeof selector !== "string" ) {
4913
 
4914
			// ( types-Object, data )
4915
			data = data || selector;
4916
			selector = undefined;
4917
		}
4918
		for ( type in types ) {
4919
			on( elem, type, selector, data, types[ type ], one );
4920
		}
4921
		return elem;
4922
	}
4923
 
4924
	if ( data == null && fn == null ) {
4925
 
4926
		// ( types, fn )
4927
		fn = selector;
4928
		data = selector = undefined;
4929
	} else if ( fn == null ) {
4930
		if ( typeof selector === "string" ) {
4931
 
4932
			// ( types, selector, fn )
4933
			fn = data;
4934
			data = undefined;
4935
		} else {
4936
 
4937
			// ( types, data, fn )
4938
			fn = data;
4939
			data = selector;
4940
			selector = undefined;
4941
		}
4942
	}
4943
	if ( fn === false ) {
4944
		fn = returnFalse;
4945
	} else if ( !fn ) {
4946
		return elem;
4947
	}
4948
 
4949
	if ( one === 1 ) {
4950
		origFn = fn;
4951
		fn = function( event ) {
4952
 
4953
			// Can use an empty set, since event contains the info
4954
			jQuery().off( event );
4955
			return origFn.apply( this, arguments );
4956
		};
4957
 
4958
		// Use same guid so caller can remove using origFn
4959
		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4960
	}
4961
	return elem.each( function() {
4962
		jQuery.event.add( this, types, fn, data, selector );
4963
	} );
4964
}
4965
 
4966
/*
4967
 * Helper functions for managing events -- not part of the public interface.
4968
 * Props to Dean Edwards' addEvent library for many of the ideas.
4969
 */
4970
jQuery.event = {
4971
 
4972
	global: {},
4973
 
4974
	add: function( elem, types, handler, data, selector ) {
4975
 
4976
		var handleObjIn, eventHandle, tmp,
4977
			events, t, handleObj,
4978
			special, handlers, type, namespaces, origType,
4979
			elemData = dataPriv.get( elem );
4980
 
4981
		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4982
		if ( !elemData ) {
4983
			return;
4984
		}
4985
 
4986
		// Caller can pass in an object of custom data in lieu of the handler
4987
		if ( handler.handler ) {
4988
			handleObjIn = handler;
4989
			handler = handleObjIn.handler;
4990
			selector = handleObjIn.selector;
4991
		}
4992
 
4993
		// Ensure that invalid selectors throw exceptions at attach time
4994
		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
4995
		if ( selector ) {
4996
			jQuery.find.matchesSelector( documentElement, selector );
4997
		}
4998
 
4999
		// Make sure that the handler has a unique ID, used to find/remove it later
5000
		if ( !handler.guid ) {
5001
			handler.guid = jQuery.guid++;
5002
		}
5003
 
5004
		// Init the element's event structure and main handler, if this is the first
5005
		if ( !( events = elemData.events ) ) {
5006
			events = elemData.events = {};
5007
		}
5008
		if ( !( eventHandle = elemData.handle ) ) {
5009
			eventHandle = elemData.handle = function( e ) {
5010
 
5011
				// Discard the second event of a jQuery.event.trigger() and
5012
				// when an event is called after a page has unloaded
5013
				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
5014
					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
5015
			};
5016
		}
5017
 
5018
		// Handle multiple events separated by a space
5019
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5020
		t = types.length;
5021
		while ( t-- ) {
5022
			tmp = rtypenamespace.exec( types[ t ] ) || [];
5023
			type = origType = tmp[ 1 ];
5024
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5025
 
5026
			// There *must* be a type, no attaching namespace-only handlers
5027
			if ( !type ) {
5028
				continue;
5029
			}
5030
 
5031
			// If event changes its type, use the special event handlers for the changed type
5032
			special = jQuery.event.special[ type ] || {};
5033
 
5034
			// If selector defined, determine special event api type, otherwise given type
5035
			type = ( selector ? special.delegateType : special.bindType ) || type;
5036
 
5037
			// Update special based on newly reset type
5038
			special = jQuery.event.special[ type ] || {};
5039
 
5040
			// handleObj is passed to all event handlers
5041
			handleObj = jQuery.extend( {
5042
				type: type,
5043
				origType: origType,
5044
				data: data,
5045
				handler: handler,
5046
				guid: handler.guid,
5047
				selector: selector,
5048
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
5049
				namespace: namespaces.join( "." )
5050
			}, handleObjIn );
5051
 
5052
			// Init the event handler queue if we're the first
5053
			if ( !( handlers = events[ type ] ) ) {
5054
				handlers = events[ type ] = [];
5055
				handlers.delegateCount = 0;
5056
 
5057
				// Only use addEventListener if the special events handler returns false
5058
				if ( !special.setup ||
5059
					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
5060
 
5061
					if ( elem.addEventListener ) {
5062
						elem.addEventListener( type, eventHandle );
5063
					}
5064
				}
5065
			}
5066
 
5067
			if ( special.add ) {
5068
				special.add.call( elem, handleObj );
5069
 
5070
				if ( !handleObj.handler.guid ) {
5071
					handleObj.handler.guid = handler.guid;
5072
				}
5073
			}
5074
 
5075
			// Add to the element's handler list, delegates in front
5076
			if ( selector ) {
5077
				handlers.splice( handlers.delegateCount++, 0, handleObj );
5078
			} else {
5079
				handlers.push( handleObj );
5080
			}
5081
 
5082
			// Keep track of which events have ever been used, for event optimization
5083
			jQuery.event.global[ type ] = true;
5084
		}
5085
 
5086
	},
5087
 
5088
	// Detach an event or set of events from an element
5089
	remove: function( elem, types, handler, selector, mappedTypes ) {
5090
 
5091
		var j, origCount, tmp,
5092
			events, t, handleObj,
5093
			special, handlers, type, namespaces, origType,
5094
			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
5095
 
5096
		if ( !elemData || !( events = elemData.events ) ) {
5097
			return;
5098
		}
5099
 
5100
		// Once for each type.namespace in types; type may be omitted
5101
		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
5102
		t = types.length;
5103
		while ( t-- ) {
5104
			tmp = rtypenamespace.exec( types[ t ] ) || [];
5105
			type = origType = tmp[ 1 ];
5106
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
5107
 
5108
			// Unbind all events (on this namespace, if provided) for the element
5109
			if ( !type ) {
5110
				for ( type in events ) {
5111
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
5112
				}
5113
				continue;
5114
			}
5115
 
5116
			special = jQuery.event.special[ type ] || {};
5117
			type = ( selector ? special.delegateType : special.bindType ) || type;
5118
			handlers = events[ type ] || [];
5119
			tmp = tmp[ 2 ] &&
5120
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
5121
 
5122
			// Remove matching events
5123
			origCount = j = handlers.length;
5124
			while ( j-- ) {
5125
				handleObj = handlers[ j ];
5126
 
5127
				if ( ( mappedTypes || origType === handleObj.origType ) &&
5128
					( !handler || handler.guid === handleObj.guid ) &&
5129
					( !tmp || tmp.test( handleObj.namespace ) ) &&
5130
					( !selector || selector === handleObj.selector ||
5131
						selector === "**" && handleObj.selector ) ) {
5132
					handlers.splice( j, 1 );
5133
 
5134
					if ( handleObj.selector ) {
5135
						handlers.delegateCount--;
5136
					}
5137
					if ( special.remove ) {
5138
						special.remove.call( elem, handleObj );
5139
					}
5140
				}
5141
			}
5142
 
5143
			// Remove generic event handler if we removed something and no more handlers exist
5144
			// (avoids potential for endless recursion during removal of special event handlers)
5145
			if ( origCount && !handlers.length ) {
5146
				if ( !special.teardown ||
5147
					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
5148
 
5149
					jQuery.removeEvent( elem, type, elemData.handle );
5150
				}
5151
 
5152
				delete events[ type ];
5153
			}
5154
		}
5155
 
5156
		// Remove data and the expando if it's no longer used
5157
		if ( jQuery.isEmptyObject( events ) ) {
5158
			dataPriv.remove( elem, "handle events" );
5159
		}
5160
	},
5161
 
5162
	dispatch: function( nativeEvent ) {
5163
 
5164
		// Make a writable jQuery.Event from the native event object
5165
		var event = jQuery.event.fix( nativeEvent );
5166
 
5167
		var i, j, ret, matched, handleObj, handlerQueue,
5168
			args = new Array( arguments.length ),
5169
			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5170
			special = jQuery.event.special[ event.type ] || {};
5171
 
5172
		// Use the fix-ed jQuery.Event rather than the (read-only) native event
5173
		args[ 0 ] = event;
5174
 
5175
		for ( i = 1; i < arguments.length; i++ ) {
5176
			args[ i ] = arguments[ i ];
5177
		}
5178
 
5179
		event.delegateTarget = this;
5180
 
5181
		// Call the preDispatch hook for the mapped type, and let it bail if desired
5182
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
5183
			return;
5184
		}
5185
 
5186
		// Determine handlers
5187
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
5188
 
5189
		// Run delegates first; they may want to stop propagation beneath us
5190
		i = 0;
5191
		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
5192
			event.currentTarget = matched.elem;
5193
 
5194
			j = 0;
5195
			while ( ( handleObj = matched.handlers[ j++ ] ) &&
5196
				!event.isImmediatePropagationStopped() ) {
5197
 
5198
				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
5199
				// a subset or equal to those in the bound event (both can have no namespace).
5200
				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
5201
 
5202
					event.handleObj = handleObj;
5203
					event.data = handleObj.data;
5204
 
5205
					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
5206
						handleObj.handler ).apply( matched.elem, args );
5207
 
5208
					if ( ret !== undefined ) {
5209
						if ( ( event.result = ret ) === false ) {
5210
							event.preventDefault();
5211
							event.stopPropagation();
5212
						}
5213
					}
5214
				}
5215
			}
5216
		}
5217
 
5218
		// Call the postDispatch hook for the mapped type
5219
		if ( special.postDispatch ) {
5220
			special.postDispatch.call( this, event );
5221
		}
5222
 
5223
		return event.result;
5224
	},
5225
 
5226
	handlers: function( event, handlers ) {
5227
		var i, handleObj, sel, matchedHandlers, matchedSelectors,
5228
			handlerQueue = [],
5229
			delegateCount = handlers.delegateCount,
5230
			cur = event.target;
5231
 
5232
		// Find delegate handlers
5233
		if ( delegateCount &&
5234
 
5235
			// Support: IE <=9
5236
			// Black-hole SVG <use> instance trees (trac-13180)
5237
			cur.nodeType &&
5238
 
5239
			// Support: Firefox <=42
5240
			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
5241
			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
5242
			// Support: IE 11 only
5243
			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
5244
			!( event.type === "click" && event.button >= 1 ) ) {
5245
 
5246
			for ( ; cur !== this; cur = cur.parentNode || this ) {
5247
 
5248
				// Don't check non-elements (#13208)
5249
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5250
				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5251
					matchedHandlers = [];
5252
					matchedSelectors = {};
5253
					for ( i = 0; i < delegateCount; i++ ) {
5254
						handleObj = handlers[ i ];
5255
 
5256
						// Don't conflict with Object.prototype properties (#13203)
5257
						sel = handleObj.selector + " ";
5258
 
5259
						if ( matchedSelectors[ sel ] === undefined ) {
5260
							matchedSelectors[ sel ] = handleObj.needsContext ?
5261
								jQuery( sel, this ).index( cur ) > -1 :
5262
								jQuery.find( sel, this, null, [ cur ] ).length;
5263
						}
5264
						if ( matchedSelectors[ sel ] ) {
5265
							matchedHandlers.push( handleObj );
5266
						}
5267
					}
5268
					if ( matchedHandlers.length ) {
5269
						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
5270
					}
5271
				}
5272
			}
5273
		}
5274
 
5275
		// Add the remaining (directly-bound) handlers
5276
		cur = this;
5277
		if ( delegateCount < handlers.length ) {
5278
			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
5279
		}
5280
 
5281
		return handlerQueue;
5282
	},
5283
 
5284
	addProp: function( name, hook ) {
5285
		Object.defineProperty( jQuery.Event.prototype, name, {
5286
			enumerable: true,
5287
			configurable: true,
5288
 
5289
			get: jQuery.isFunction( hook ) ?
5290
				function() {
5291
					if ( this.originalEvent ) {
5292
							return hook( this.originalEvent );
5293
					}
5294
				} :
5295
				function() {
5296
					if ( this.originalEvent ) {
5297
							return this.originalEvent[ name ];
5298
					}
5299
				},
5300
 
5301
			set: function( value ) {
5302
				Object.defineProperty( this, name, {
5303
					enumerable: true,
5304
					configurable: true,
5305
					writable: true,
5306
					value: value
5307
				} );
5308
			}
5309
		} );
5310
	},
5311
 
5312
	fix: function( originalEvent ) {
5313
		return originalEvent[ jQuery.expando ] ?
5314
			originalEvent :
5315
			new jQuery.Event( originalEvent );
5316
	},
5317
 
5318
	special: {
5319
		load: {
5320
 
5321
			// Prevent triggered image.load events from bubbling to window.load
5322
			noBubble: true
5323
		},
5324
		focus: {
5325
 
5326
			// Fire native event if possible so blur/focus sequence is correct
5327
			trigger: function() {
5328
				if ( this !== safeActiveElement() && this.focus ) {
5329
					this.focus();
5330
					return false;
5331
				}
5332
			},
5333
			delegateType: "focusin"
5334
		},
5335
		blur: {
5336
			trigger: function() {
5337
				if ( this === safeActiveElement() && this.blur ) {
5338
					this.blur();
5339
					return false;
5340
				}
5341
			},
5342
			delegateType: "focusout"
5343
		},
5344
		click: {
5345
 
5346
			// For checkbox, fire native event so checked state will be right
5347
			trigger: function() {
5348
				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
5349
					this.click();
5350
					return false;
5351
				}
5352
			},
5353
 
5354
			// For cross-browser consistency, don't fire native .click() on links
5355
			_default: function( event ) {
5356
				return nodeName( event.target, "a" );
5357
			}
5358
		},
5359
 
5360
		beforeunload: {
5361
			postDispatch: function( event ) {
5362
 
5363
				// Support: Firefox 20+
5364
				// Firefox doesn't alert if the returnValue field is not set.
5365
				if ( event.result !== undefined && event.originalEvent ) {
5366
					event.originalEvent.returnValue = event.result;
5367
				}
5368
			}
5369
		}
5370
	}
5371
};
5372
 
5373
jQuery.removeEvent = function( elem, type, handle ) {
5374
 
5375
	// This "if" is needed for plain objects
5376
	if ( elem.removeEventListener ) {
5377
		elem.removeEventListener( type, handle );
5378
	}
5379
};
5380
 
5381
jQuery.Event = function( src, props ) {
5382
 
5383
	// Allow instantiation without the 'new' keyword
5384
	if ( !( this instanceof jQuery.Event ) ) {
5385
		return new jQuery.Event( src, props );
5386
	}
5387
 
5388
	// Event object
5389
	if ( src && src.type ) {
5390
		this.originalEvent = src;
5391
		this.type = src.type;
5392
 
5393
		// Events bubbling up the document may have been marked as prevented
5394
		// by a handler lower down the tree; reflect the correct value.
5395
		this.isDefaultPrevented = src.defaultPrevented ||
5396
				src.defaultPrevented === undefined &&
5397
 
5398
				// Support: Android <=2.3 only
5399
				src.returnValue === false ?
5400
			returnTrue :
5401
			returnFalse;
5402
 
5403
		// Create target properties
5404
		// Support: Safari <=6 - 7 only
5405
		// Target should not be a text node (#504, #13143)
5406
		this.target = ( src.target && src.target.nodeType === 3 ) ?
5407
			src.target.parentNode :
5408
			src.target;
5409
 
5410
		this.currentTarget = src.currentTarget;
5411
		this.relatedTarget = src.relatedTarget;
5412
 
5413
	// Event type
5414
	} else {
5415
		this.type = src;
5416
	}
5417
 
5418
	// Put explicitly provided properties onto the event object
5419
	if ( props ) {
5420
		jQuery.extend( this, props );
5421
	}
5422
 
5423
	// Create a timestamp if incoming event doesn't have one
5424
	this.timeStamp = src && src.timeStamp || jQuery.now();
5425
 
5426
	// Mark it as fixed
5427
	this[ jQuery.expando ] = true;
5428
};
5429
 
5430
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
5431
// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
5432
jQuery.Event.prototype = {
5433
	constructor: jQuery.Event,
5434
	isDefaultPrevented: returnFalse,
5435
	isPropagationStopped: returnFalse,
5436
	isImmediatePropagationStopped: returnFalse,
5437
	isSimulated: false,
5438
 
5439
	preventDefault: function() {
5440
		var e = this.originalEvent;
5441
 
5442
		this.isDefaultPrevented = returnTrue;
5443
 
5444
		if ( e && !this.isSimulated ) {
5445
			e.preventDefault();
5446
		}
5447
	},
5448
	stopPropagation: function() {
5449
		var e = this.originalEvent;
5450
 
5451
		this.isPropagationStopped = returnTrue;
5452
 
5453
		if ( e && !this.isSimulated ) {
5454
			e.stopPropagation();
5455
		}
5456
	},
5457
	stopImmediatePropagation: function() {
5458
		var e = this.originalEvent;
5459
 
5460
		this.isImmediatePropagationStopped = returnTrue;
5461
 
5462
		if ( e && !this.isSimulated ) {
5463
			e.stopImmediatePropagation();
5464
		}
5465
 
5466
		this.stopPropagation();
5467
	}
5468
};
5469
 
5470
// Includes all common event props including KeyEvent and MouseEvent specific props
5471
jQuery.each( {
5472
	altKey: true,
5473
	bubbles: true,
5474
	cancelable: true,
5475
	changedTouches: true,
5476
	ctrlKey: true,
5477
	detail: true,
5478
	eventPhase: true,
5479
	metaKey: true,
5480
	pageX: true,
5481
	pageY: true,
5482
	shiftKey: true,
5483
	view: true,
5484
	"char": true,
5485
	charCode: true,
5486
	key: true,
5487
	keyCode: true,
5488
	button: true,
5489
	buttons: true,
5490
	clientX: true,
5491
	clientY: true,
5492
	offsetX: true,
5493
	offsetY: true,
5494
	pointerId: true,
5495
	pointerType: true,
5496
	screenX: true,
5497
	screenY: true,
5498
	targetTouches: true,
5499
	toElement: true,
5500
	touches: true,
5501
 
5502
	which: function( event ) {
5503
		var button = event.button;
5504
 
5505
		// Add which for key events
5506
		if ( event.which == null && rkeyEvent.test( event.type ) ) {
5507
			return event.charCode != null ? event.charCode : event.keyCode;
5508
		}
5509
 
5510
		// Add which for click: 1 === left; 2 === middle; 3 === right
5511
		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5512
			if ( button & 1 ) {
5513
				return 1;
5514
			}
5515
 
5516
			if ( button & 2 ) {
5517
				return 3;
5518
			}
5519
 
5520
			if ( button & 4 ) {
5521
				return 2;
5522
			}
5523
 
5524
			return 0;
5525
		}
5526
 
5527
		return event.which;
5528
	}
5529
}, jQuery.event.addProp );
5530
 
5531
// Create mouseenter/leave events using mouseover/out and event-time checks
5532
// so that event delegation works in jQuery.
5533
// Do the same for pointerenter/pointerleave and pointerover/pointerout
5534
//
5535
// Support: Safari 7 only
5536
// Safari sends mouseenter too often; see:
5537
// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
5538
// for the description of the bug (it existed in older Chrome versions as well).
5539
jQuery.each( {
5540
	mouseenter: "mouseover",
5541
	mouseleave: "mouseout",
5542
	pointerenter: "pointerover",
5543
	pointerleave: "pointerout"
5544
}, function( orig, fix ) {
5545
	jQuery.event.special[ orig ] = {
5546
		delegateType: fix,
5547
		bindType: fix,
5548
 
5549
		handle: function( event ) {
5550
			var ret,
5551
				target = this,
5552
				related = event.relatedTarget,
5553
				handleObj = event.handleObj;
5554
 
5555
			// For mouseenter/leave call the handler if related is outside the target.
5556
			// NB: No relatedTarget if the mouse left/entered the browser window
5557
			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
5558
				event.type = handleObj.origType;
5559
				ret = handleObj.handler.apply( this, arguments );
5560
				event.type = fix;
5561
			}
5562
			return ret;
5563
		}
5564
	};
5565
} );
5566
 
5567
jQuery.fn.extend( {
5568
 
5569
	on: function( types, selector, data, fn ) {
5570
		return on( this, types, selector, data, fn );
5571
	},
5572
	one: function( types, selector, data, fn ) {
5573
		return on( this, types, selector, data, fn, 1 );
5574
	},
5575
	off: function( types, selector, fn ) {
5576
		var handleObj, type;
5577
		if ( types && types.preventDefault && types.handleObj ) {
5578
 
5579
			// ( event )  dispatched jQuery.Event
5580
			handleObj = types.handleObj;
5581
			jQuery( types.delegateTarget ).off(
5582
				handleObj.namespace ?
5583
					handleObj.origType + "." + handleObj.namespace :
5584
					handleObj.origType,
5585
				handleObj.selector,
5586
				handleObj.handler
5587
			);
5588
			return this;
5589
		}
5590
		if ( typeof types === "object" ) {
5591
 
5592
			// ( types-object [, selector] )
5593
			for ( type in types ) {
5594
				this.off( type, selector, types[ type ] );
5595
			}
5596
			return this;
5597
		}
5598
		if ( selector === false || typeof selector === "function" ) {
5599
 
5600
			// ( types [, fn] )
5601
			fn = selector;
5602
			selector = undefined;
5603
		}
5604
		if ( fn === false ) {
5605
			fn = returnFalse;
5606
		}
5607
		return this.each( function() {
5608
			jQuery.event.remove( this, types, fn, selector );
5609
		} );
5610
	}
5611
} );
5612
 
5613
 
5614
var
5615
 
5616
	/* eslint-disable max-len */
5617
 
5618
	// See https://github.com/eslint/eslint/issues/3229
5619
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5620
 
5621
	/* eslint-enable */
5622
 
5623
	// Support: IE <=10 - 11, Edge 12 - 13
5624
	// In IE/Edge using regex groups here causes severe slowdowns.
5625
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
5626
	rnoInnerhtml = /<script|<style|<link/i,
5627
 
5628
	// checked="checked" or checked
5629
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5630
	rscriptTypeMasked = /^true\/(.*)/,
5631
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5632
 
5633
// Prefer a tbody over its parent table for containing new rows
5634
function manipulationTarget( elem, content ) {
5635
	if ( nodeName( elem, "table" ) &&
5636
		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5637
 
5638
		return jQuery( ">tbody", elem )[ 0 ] || elem;
5639
	}
5640
 
5641
	return elem;
5642
}
5643
 
5644
// Replace/restore the type attribute of script elements for safe DOM manipulation
5645
function disableScript( elem ) {
5646
	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
5647
	return elem;
5648
}
5649
function restoreScript( elem ) {
5650
	var match = rscriptTypeMasked.exec( elem.type );
5651
 
5652
	if ( match ) {
5653
		elem.type = match[ 1 ];
5654
	} else {
5655
		elem.removeAttribute( "type" );
5656
	}
5657
 
5658
	return elem;
5659
}
5660
 
5661
function cloneCopyEvent( src, dest ) {
5662
	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5663
 
5664
	if ( dest.nodeType !== 1 ) {
5665
		return;
5666
	}
5667
 
5668
	// 1. Copy private data: events, handlers, etc.
5669
	if ( dataPriv.hasData( src ) ) {
5670
		pdataOld = dataPriv.access( src );
5671
		pdataCur = dataPriv.set( dest, pdataOld );
5672
		events = pdataOld.events;
5673
 
5674
		if ( events ) {
5675
			delete pdataCur.handle;
5676
			pdataCur.events = {};
5677
 
5678
			for ( type in events ) {
5679
				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5680
					jQuery.event.add( dest, type, events[ type ][ i ] );
5681
				}
5682
			}
5683
		}
5684
	}
5685
 
5686
	// 2. Copy user data
5687
	if ( dataUser.hasData( src ) ) {
5688
		udataOld = dataUser.access( src );
5689
		udataCur = jQuery.extend( {}, udataOld );
5690
 
5691
		dataUser.set( dest, udataCur );
5692
	}
5693
}
5694
 
5695
// Fix IE bugs, see support tests
5696
function fixInput( src, dest ) {
5697
	var nodeName = dest.nodeName.toLowerCase();
5698
 
5699
	// Fails to persist the checked state of a cloned checkbox or radio button.
5700
	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5701
		dest.checked = src.checked;
5702
 
5703
	// Fails to return the selected option to the default selected state when cloning options
5704
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5705
		dest.defaultValue = src.defaultValue;
5706
	}
5707
}
5708
 
5709
function domManip( collection, args, callback, ignored ) {
5710
 
5711
	// Flatten any nested arrays
5712
	args = concat.apply( [], args );
5713
 
5714
	var fragment, first, scripts, hasScripts, node, doc,
5715
		i = 0,
5716
		l = collection.length,
5717
		iNoClone = l - 1,
5718
		value = args[ 0 ],
5719
		isFunction = jQuery.isFunction( value );
5720
 
5721
	// We can't cloneNode fragments that contain checked, in WebKit
5722
	if ( isFunction ||
5723
			( l > 1 && typeof value === "string" &&
5724
				!support.checkClone && rchecked.test( value ) ) ) {
5725
		return collection.each( function( index ) {
5726
			var self = collection.eq( index );
5727
			if ( isFunction ) {
5728
				args[ 0 ] = value.call( this, index, self.html() );
5729
			}
5730
			domManip( self, args, callback, ignored );
5731
		} );
5732
	}
5733
 
5734
	if ( l ) {
5735
		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
5736
		first = fragment.firstChild;
5737
 
5738
		if ( fragment.childNodes.length === 1 ) {
5739
			fragment = first;
5740
		}
5741
 
5742
		// Require either new content or an interest in ignored elements to invoke the callback
5743
		if ( first || ignored ) {
5744
			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5745
			hasScripts = scripts.length;
5746
 
5747
			// Use the original fragment for the last item
5748
			// instead of the first because it can end up
5749
			// being emptied incorrectly in certain situations (#8070).
5750
			for ( ; i < l; i++ ) {
5751
				node = fragment;
5752
 
5753
				if ( i !== iNoClone ) {
5754
					node = jQuery.clone( node, true, true );
5755
 
5756
					// Keep references to cloned scripts for later restoration
5757
					if ( hasScripts ) {
5758
 
5759
						// Support: Android <=4.0 only, PhantomJS 1 only
5760
						// push.apply(_, arraylike) throws on ancient WebKit
5761
						jQuery.merge( scripts, getAll( node, "script" ) );
5762
					}
5763
				}
5764
 
5765
				callback.call( collection[ i ], node, i );
5766
			}
5767
 
5768
			if ( hasScripts ) {
5769
				doc = scripts[ scripts.length - 1 ].ownerDocument;
5770
 
5771
				// Reenable scripts
5772
				jQuery.map( scripts, restoreScript );
5773
 
5774
				// Evaluate executable scripts on first document insertion
5775
				for ( i = 0; i < hasScripts; i++ ) {
5776
					node = scripts[ i ];
5777
					if ( rscriptType.test( node.type || "" ) &&
5778
						!dataPriv.access( node, "globalEval" ) &&
5779
						jQuery.contains( doc, node ) ) {
5780
 
5781
						if ( node.src ) {
5782
 
5783
							// Optional AJAX dependency, but won't run scripts if not present
5784
							if ( jQuery._evalUrl ) {
5785
								jQuery._evalUrl( node.src );
5786
							}
5787
						} else {
5788
							DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
5789
						}
5790
					}
5791
				}
5792
			}
5793
		}
5794
	}
5795
 
5796
	return collection;
5797
}
5798
 
5799
function remove( elem, selector, keepData ) {
5800
	var node,
5801
		nodes = selector ? jQuery.filter( selector, elem ) : elem,
5802
		i = 0;
5803
 
5804
	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
5805
		if ( !keepData && node.nodeType === 1 ) {
5806
			jQuery.cleanData( getAll( node ) );
5807
		}
5808
 
5809
		if ( node.parentNode ) {
5810
			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
5811
				setGlobalEval( getAll( node, "script" ) );
5812
			}
5813
			node.parentNode.removeChild( node );
5814
		}
5815
	}
5816
 
5817
	return elem;
5818
}
5819
 
5820
jQuery.extend( {
5821
	htmlPrefilter: function( html ) {
5822
		return html.replace( rxhtmlTag, "<$1></$2>" );
5823
	},
5824
 
5825
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5826
		var i, l, srcElements, destElements,
5827
			clone = elem.cloneNode( true ),
5828
			inPage = jQuery.contains( elem.ownerDocument, elem );
5829
 
5830
		// Fix IE cloning issues
5831
		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5832
				!jQuery.isXMLDoc( elem ) ) {
5833
 
5834
			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5835
			destElements = getAll( clone );
5836
			srcElements = getAll( elem );
5837
 
5838
			for ( i = 0, l = srcElements.length; i < l; i++ ) {
5839
				fixInput( srcElements[ i ], destElements[ i ] );
5840
			}
5841
		}
5842
 
5843
		// Copy the events from the original to the clone
5844
		if ( dataAndEvents ) {
5845
			if ( deepDataAndEvents ) {
5846
				srcElements = srcElements || getAll( elem );
5847
				destElements = destElements || getAll( clone );
5848
 
5849
				for ( i = 0, l = srcElements.length; i < l; i++ ) {
5850
					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
5851
				}
5852
			} else {
5853
				cloneCopyEvent( elem, clone );
5854
			}
5855
		}
5856
 
5857
		// Preserve script evaluation history
5858
		destElements = getAll( clone, "script" );
5859
		if ( destElements.length > 0 ) {
5860
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5861
		}
5862
 
5863
		// Return the cloned set
5864
		return clone;
5865
	},
5866
 
5867
	cleanData: function( elems ) {
5868
		var data, elem, type,
5869
			special = jQuery.event.special,
5870
			i = 0;
5871
 
5872
		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
5873
			if ( acceptData( elem ) ) {
5874
				if ( ( data = elem[ dataPriv.expando ] ) ) {
5875
					if ( data.events ) {
5876
						for ( type in data.events ) {
5877
							if ( special[ type ] ) {
5878
								jQuery.event.remove( elem, type );
5879
 
5880
							// This is a shortcut to avoid jQuery.event.remove's overhead
5881
							} else {
5882
								jQuery.removeEvent( elem, type, data.handle );
5883
							}
5884
						}
5885
					}
5886
 
5887
					// Support: Chrome <=35 - 45+
5888
					// Assign undefined instead of using delete, see Data#remove
5889
					elem[ dataPriv.expando ] = undefined;
5890
				}
5891
				if ( elem[ dataUser.expando ] ) {
5892
 
5893
					// Support: Chrome <=35 - 45+
5894
					// Assign undefined instead of using delete, see Data#remove
5895
					elem[ dataUser.expando ] = undefined;
5896
				}
5897
			}
5898
		}
5899
	}
5900
} );
5901
 
5902
jQuery.fn.extend( {
5903
	detach: function( selector ) {
5904
		return remove( this, selector, true );
5905
	},
5906
 
5907
	remove: function( selector ) {
5908
		return remove( this, selector );
5909
	},
5910
 
5911
	text: function( value ) {
5912
		return access( this, function( value ) {
5913
			return value === undefined ?
5914
				jQuery.text( this ) :
5915
				this.empty().each( function() {
5916
					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5917
						this.textContent = value;
5918
					}
5919
				} );
5920
		}, null, value, arguments.length );
5921
	},
5922
 
5923
	append: function() {
5924
		return domManip( this, arguments, function( elem ) {
5925
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5926
				var target = manipulationTarget( this, elem );
5927
				target.appendChild( elem );
5928
			}
5929
		} );
5930
	},
5931
 
5932
	prepend: function() {
5933
		return domManip( this, arguments, function( elem ) {
5934
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5935
				var target = manipulationTarget( this, elem );
5936
				target.insertBefore( elem, target.firstChild );
5937
			}
5938
		} );
5939
	},
5940
 
5941
	before: function() {
5942
		return domManip( this, arguments, function( elem ) {
5943
			if ( this.parentNode ) {
5944
				this.parentNode.insertBefore( elem, this );
5945
			}
5946
		} );
5947
	},
5948
 
5949
	after: function() {
5950
		return domManip( this, arguments, function( elem ) {
5951
			if ( this.parentNode ) {
5952
				this.parentNode.insertBefore( elem, this.nextSibling );
5953
			}
5954
		} );
5955
	},
5956
 
5957
	empty: function() {
5958
		var elem,
5959
			i = 0;
5960
 
5961
		for ( ; ( elem = this[ i ] ) != null; i++ ) {
5962
			if ( elem.nodeType === 1 ) {
5963
 
5964
				// Prevent memory leaks
5965
				jQuery.cleanData( getAll( elem, false ) );
5966
 
5967
				// Remove any remaining nodes
5968
				elem.textContent = "";
5969
			}
5970
		}
5971
 
5972
		return this;
5973
	},
5974
 
5975
	clone: function( dataAndEvents, deepDataAndEvents ) {
5976
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5977
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5978
 
5979
		return this.map( function() {
5980
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5981
		} );
5982
	},
5983
 
5984
	html: function( value ) {
5985
		return access( this, function( value ) {
5986
			var elem = this[ 0 ] || {},
5987
				i = 0,
5988
				l = this.length;
5989
 
5990
			if ( value === undefined && elem.nodeType === 1 ) {
5991
				return elem.innerHTML;
5992
			}
5993
 
5994
			// See if we can take a shortcut and just use innerHTML
5995
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5996
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
5997
 
5998
				value = jQuery.htmlPrefilter( value );
5999
 
6000
				try {
6001
					for ( ; i < l; i++ ) {
6002
						elem = this[ i ] || {};
6003
 
6004
						// Remove element nodes and prevent memory leaks
6005
						if ( elem.nodeType === 1 ) {
6006
							jQuery.cleanData( getAll( elem, false ) );
6007
							elem.innerHTML = value;
6008
						}
6009
					}
6010
 
6011
					elem = 0;
6012
 
6013
				// If using innerHTML throws an exception, use the fallback method
6014
				} catch ( e ) {}
6015
			}
6016
 
6017
			if ( elem ) {
6018
				this.empty().append( value );
6019
			}
6020
		}, null, value, arguments.length );
6021
	},
6022
 
6023
	replaceWith: function() {
6024
		var ignored = [];
6025
 
6026
		// Make the changes, replacing each non-ignored context element with the new content
6027
		return domManip( this, arguments, function( elem ) {
6028
			var parent = this.parentNode;
6029
 
6030
			if ( jQuery.inArray( this, ignored ) < 0 ) {
6031
				jQuery.cleanData( getAll( this ) );
6032
				if ( parent ) {
6033
					parent.replaceChild( elem, this );
6034
				}
6035
			}
6036
 
6037
		// Force callback invocation
6038
		}, ignored );
6039
	}
6040
} );
6041
 
6042
jQuery.each( {
6043
	appendTo: "append",
6044
	prependTo: "prepend",
6045
	insertBefore: "before",
6046
	insertAfter: "after",
6047
	replaceAll: "replaceWith"
6048
}, function( name, original ) {
6049
	jQuery.fn[ name ] = function( selector ) {
6050
		var elems,
6051
			ret = [],
6052
			insert = jQuery( selector ),
6053
			last = insert.length - 1,
6054
			i = 0;
6055
 
6056
		for ( ; i <= last; i++ ) {
6057
			elems = i === last ? this : this.clone( true );
6058
			jQuery( insert[ i ] )[ original ]( elems );
6059
 
6060
			// Support: Android <=4.0 only, PhantomJS 1 only
6061
			// .get() because push.apply(_, arraylike) throws on ancient WebKit
6062
			push.apply( ret, elems.get() );
6063
		}
6064
 
6065
		return this.pushStack( ret );
6066
	};
6067
} );
6068
var rmargin = ( /^margin/ );
6069
 
6070
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6071
 
6072
var getStyles = function( elem ) {
6073
 
6074
		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6075
		// IE throws on elements created in popups
6076
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6077
		var view = elem.ownerDocument.defaultView;
6078
 
6079
		if ( !view || !view.opener ) {
6080
			view = window;
6081
		}
6082
 
6083
		return view.getComputedStyle( elem );
6084
	};
6085
 
6086
 
6087
 
6088
( function() {
6089
 
6090
	// Executing both pixelPosition & boxSizingReliable tests require only one layout
6091
	// so they're executed at the same time to save the second computation.
6092
	function computeStyleTests() {
6093
 
6094
		// This is a singleton, we need to execute it only once
6095
		if ( !div ) {
6096
			return;
6097
		}
6098
 
6099
		div.style.cssText =
6100
			"box-sizing:border-box;" +
6101
			"position:relative;display:block;" +
6102
			"margin:auto;border:1px;padding:1px;" +
6103
			"top:1%;width:50%";
6104
		div.innerHTML = "";
6105
		documentElement.appendChild( container );
6106
 
6107
		var divStyle = window.getComputedStyle( div );
6108
		pixelPositionVal = divStyle.top !== "1%";
6109
 
6110
		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6111
		reliableMarginLeftVal = divStyle.marginLeft === "2px";
6112
		boxSizingReliableVal = divStyle.width === "4px";
6113
 
6114
		// Support: Android 4.0 - 4.3 only
6115
		// Some styles come back with percentage values, even though they shouldn't
6116
		div.style.marginRight = "50%";
6117
		pixelMarginRightVal = divStyle.marginRight === "4px";
6118
 
6119
		documentElement.removeChild( container );
6120
 
6121
		// Nullify the div so it wouldn't be stored in the memory and
6122
		// it will also be a sign that checks already performed
6123
		div = null;
6124
	}
6125
 
6126
	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6127
		container = document.createElement( "div" ),
6128
		div = document.createElement( "div" );
6129
 
6130
	// Finish early in limited (non-browser) environments
6131
	if ( !div.style ) {
6132
		return;
6133
	}
6134
 
6135
	// Support: IE <=9 - 11 only
6136
	// Style of cloned element affects source element cloned (#8908)
6137
	div.style.backgroundClip = "content-box";
6138
	div.cloneNode( true ).style.backgroundClip = "";
6139
	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6140
 
6141
	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
6142
		"padding:0;margin-top:1px;position:absolute";
6143
	container.appendChild( div );
6144
 
6145
	jQuery.extend( support, {
6146
		pixelPosition: function() {
6147
			computeStyleTests();
6148
			return pixelPositionVal;
6149
		},
6150
		boxSizingReliable: function() {
6151
			computeStyleTests();
6152
			return boxSizingReliableVal;
6153
		},
6154
		pixelMarginRight: function() {
6155
			computeStyleTests();
6156
			return pixelMarginRightVal;
6157
		},
6158
		reliableMarginLeft: function() {
6159
			computeStyleTests();
6160
			return reliableMarginLeftVal;
6161
		}
6162
	} );
6163
} )();
6164
 
6165
 
6166
function curCSS( elem, name, computed ) {
6167
	var width, minWidth, maxWidth, ret,
6168
 
6169
		// Support: Firefox 51+
6170
		// Retrieving style before computed somehow
6171
		// fixes an issue with getting wrong values
6172
		// on detached elements
6173
		style = elem.style;
6174
 
6175
	computed = computed || getStyles( elem );
6176
 
6177
	// getPropertyValue is needed for:
6178
	//   .css('filter') (IE 9 only, #12537)
6179
	//   .css('--customProperty) (#3144)
6180
	if ( computed ) {
6181
		ret = computed.getPropertyValue( name ) || computed[ name ];
6182
 
6183
		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6184
			ret = jQuery.style( elem, name );
6185
		}
6186
 
6187
		// A tribute to the "awesome hack by Dean Edwards"
6188
		// Android Browser returns percentage for some values,
6189
		// but width seems to be reliably pixels.
6190
		// This is against the CSSOM draft spec:
6191
		// https://drafts.csswg.org/cssom/#resolved-values
6192
		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6193
 
6194
			// Remember the original values
6195
			width = style.width;
6196
			minWidth = style.minWidth;
6197
			maxWidth = style.maxWidth;
6198
 
6199
			// Put in the new values to get a computed value out
6200
			style.minWidth = style.maxWidth = style.width = ret;
6201
			ret = computed.width;
6202
 
6203
			// Revert the changed values
6204
			style.width = width;
6205
			style.minWidth = minWidth;
6206
			style.maxWidth = maxWidth;
6207
		}
6208
	}
6209
 
6210
	return ret !== undefined ?
6211
 
6212
		// Support: IE <=9 - 11 only
6213
		// IE returns zIndex value as an integer.
6214
		ret + "" :
6215
		ret;
6216
}
6217
 
6218
 
6219
function addGetHookIf( conditionFn, hookFn ) {
6220
 
6221
	// Define the hook, we'll check on the first run if it's really needed.
6222
	return {
6223
		get: function() {
6224
			if ( conditionFn() ) {
6225
 
6226
				// Hook not needed (or it's not possible to use it due
6227
				// to missing dependency), remove it.
6228
				delete this.get;
6229
				return;
6230
			}
6231
 
6232
			// Hook needed; redefine it so that the support test is not executed again.
6233
			return ( this.get = hookFn ).apply( this, arguments );
6234
		}
6235
	};
6236
}
6237
 
6238
 
6239
var
6240
 
6241
	// Swappable if display is none or starts with table
6242
	// except "table", "table-cell", or "table-caption"
6243
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6244
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6245
	rcustomProp = /^--/,
6246
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6247
	cssNormalTransform = {
6248
		letterSpacing: "0",
6249
		fontWeight: "400"
6250
	},
6251
 
6252
	cssPrefixes = [ "Webkit", "Moz", "ms" ],
6253
	emptyStyle = document.createElement( "div" ).style;
6254
 
6255
// Return a css property mapped to a potentially vendor prefixed property
6256
function vendorPropName( name ) {
6257
 
6258
	// Shortcut for names that are not vendor prefixed
6259
	if ( name in emptyStyle ) {
6260
		return name;
6261
	}
6262
 
6263
	// Check for vendor prefixed names
6264
	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6265
		i = cssPrefixes.length;
6266
 
6267
	while ( i-- ) {
6268
		name = cssPrefixes[ i ] + capName;
6269
		if ( name in emptyStyle ) {
6270
			return name;
6271
		}
6272
	}
6273
}
6274
 
6275
// Return a property mapped along what jQuery.cssProps suggests or to
6276
// a vendor prefixed property.
6277
function finalPropName( name ) {
6278
	var ret = jQuery.cssProps[ name ];
6279
	if ( !ret ) {
6280
		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6281
	}
6282
	return ret;
6283
}
6284
 
6285
function setPositiveNumber( elem, value, subtract ) {
6286
 
6287
	// Any relative (+/-) values have already been
6288
	// normalized at this point
6289
	var matches = rcssNum.exec( value );
6290
	return matches ?
6291
 
6292
		// Guard against undefined "subtract", e.g., when used as in cssHooks
6293
		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
6294
		value;
6295
}
6296
 
6297
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6298
	var i,
6299
		val = 0;
6300
 
6301
	// If we already have the right measurement, avoid augmentation
6302
	if ( extra === ( isBorderBox ? "border" : "content" ) ) {
6303
		i = 4;
6304
 
6305
	// Otherwise initialize for horizontal or vertical properties
6306
	} else {
6307
		i = name === "width" ? 1 : 0;
6308
	}
6309
 
6310
	for ( ; i < 4; i += 2 ) {
6311
 
6312
		// Both box models exclude margin, so add it if we want it
6313
		if ( extra === "margin" ) {
6314
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6315
		}
6316
 
6317
		if ( isBorderBox ) {
6318
 
6319
			// border-box includes padding, so remove it if we want content
6320
			if ( extra === "content" ) {
6321
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6322
			}
6323
 
6324
			// At this point, extra isn't border nor margin, so remove border
6325
			if ( extra !== "margin" ) {
6326
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6327
			}
6328
		} else {
6329
 
6330
			// At this point, extra isn't content, so add padding
6331
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6332
 
6333
			// At this point, extra isn't content nor padding, so add border
6334
			if ( extra !== "padding" ) {
6335
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6336
			}
6337
		}
6338
	}
6339
 
6340
	return val;
6341
}
6342
 
6343
function getWidthOrHeight( elem, name, extra ) {
6344
 
6345
	// Start with computed style
6346
	var valueIsBorderBox,
6347
		styles = getStyles( elem ),
6348
		val = curCSS( elem, name, styles ),
6349
		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6350
 
6351
	// Computed unit is not pixels. Stop here and return.
6352
	if ( rnumnonpx.test( val ) ) {
6353
		return val;
6354
	}
6355
 
6356
	// Check for style in case a browser which returns unreliable values
6357
	// for getComputedStyle silently falls back to the reliable elem.style
6358
	valueIsBorderBox = isBorderBox &&
6359
		( support.boxSizingReliable() || val === elem.style[ name ] );
6360
 
6361
	// Fall back to offsetWidth/Height when value is "auto"
6362
	// This happens for inline elements with no explicit setting (gh-3571)
6363
	if ( val === "auto" ) {
6364
		val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
6365
	}
6366
 
6367
	// Normalize "", auto, and prepare for extra
6368
	val = parseFloat( val ) || 0;
6369
 
6370
	// Use the active box-sizing model to add/subtract irrelevant styles
6371
	return ( val +
6372
		augmentWidthOrHeight(
6373
			elem,
6374
			name,
6375
			extra || ( isBorderBox ? "border" : "content" ),
6376
			valueIsBorderBox,
6377
			styles
6378
		)
6379
	) + "px";
6380
}
6381
 
6382
jQuery.extend( {
6383
 
6384
	// Add in style property hooks for overriding the default
6385
	// behavior of getting and setting a style property
6386
	cssHooks: {
6387
		opacity: {
6388
			get: function( elem, computed ) {
6389
				if ( computed ) {
6390
 
6391
					// We should always get a number back from opacity
6392
					var ret = curCSS( elem, "opacity" );
6393
					return ret === "" ? "1" : ret;
6394
				}
6395
			}
6396
		}
6397
	},
6398
 
6399
	// Don't automatically add "px" to these possibly-unitless properties
6400
	cssNumber: {
6401
		"animationIterationCount": true,
6402
		"columnCount": true,
6403
		"fillOpacity": true,
6404
		"flexGrow": true,
6405
		"flexShrink": true,
6406
		"fontWeight": true,
6407
		"lineHeight": true,
6408
		"opacity": true,
6409
		"order": true,
6410
		"orphans": true,
6411
		"widows": true,
6412
		"zIndex": true,
6413
		"zoom": true
6414
	},
6415
 
6416
	// Add in properties whose names you wish to fix before
6417
	// setting or getting the value
6418
	cssProps: {
6419
		"float": "cssFloat"
6420
	},
6421
 
6422
	// Get and set the style property on a DOM Node
6423
	style: function( elem, name, value, extra ) {
6424
 
6425
		// Don't set styles on text and comment nodes
6426
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6427
			return;
6428
		}
6429
 
6430
		// Make sure that we're working with the right name
6431
		var ret, type, hooks,
6432
			origName = jQuery.camelCase( name ),
6433
			isCustomProp = rcustomProp.test( name ),
6434
			style = elem.style;
6435
 
6436
		// Make sure that we're working with the right name. We don't
6437
		// want to query the value if it is a CSS custom property
6438
		// since they are user-defined.
6439
		if ( !isCustomProp ) {
6440
			name = finalPropName( origName );
6441
		}
6442
 
6443
		// Gets hook for the prefixed version, then unprefixed version
6444
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6445
 
6446
		// Check if we're setting a value
6447
		if ( value !== undefined ) {
6448
			type = typeof value;
6449
 
6450
			// Convert "+=" or "-=" to relative numbers (#7345)
6451
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6452
				value = adjustCSS( elem, name, ret );
6453
 
6454
				// Fixes bug #9237
6455
				type = "number";
6456
			}
6457
 
6458
			// Make sure that null and NaN values aren't set (#7116)
6459
			if ( value == null || value !== value ) {
6460
				return;
6461
			}
6462
 
6463
			// If a number was passed in, add the unit (except for certain CSS properties)
6464
			if ( type === "number" ) {
6465
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6466
			}
6467
 
6468
			// background-* props affect original clone's values
6469
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
6470
				style[ name ] = "inherit";
6471
			}
6472
 
6473
			// If a hook was provided, use that value, otherwise just set the specified value
6474
			if ( !hooks || !( "set" in hooks ) ||
6475
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
6476
 
6477
				if ( isCustomProp ) {
6478
					style.setProperty( name, value );
6479
				} else {
6480
					style[ name ] = value;
6481
				}
6482
			}
6483
 
6484
		} else {
6485
 
6486
			// If a hook was provided get the non-computed value from there
6487
			if ( hooks && "get" in hooks &&
6488
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
6489
 
6490
				return ret;
6491
			}
6492
 
6493
			// Otherwise just get the value from the style object
6494
			return style[ name ];
6495
		}
6496
	},
6497
 
6498
	css: function( elem, name, extra, styles ) {
6499
		var val, num, hooks,
6500
			origName = jQuery.camelCase( name ),
6501
			isCustomProp = rcustomProp.test( name );
6502
 
6503
		// Make sure that we're working with the right name. We don't
6504
		// want to modify the value if it is a CSS custom property
6505
		// since they are user-defined.
6506
		if ( !isCustomProp ) {
6507
			name = finalPropName( origName );
6508
		}
6509
 
6510
		// Try prefixed name followed by the unprefixed name
6511
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6512
 
6513
		// If a hook was provided get the computed value from there
6514
		if ( hooks && "get" in hooks ) {
6515
			val = hooks.get( elem, true, extra );
6516
		}
6517
 
6518
		// Otherwise, if a way to get the computed value exists, use that
6519
		if ( val === undefined ) {
6520
			val = curCSS( elem, name, styles );
6521
		}
6522
 
6523
		// Convert "normal" to computed value
6524
		if ( val === "normal" && name in cssNormalTransform ) {
6525
			val = cssNormalTransform[ name ];
6526
		}
6527
 
6528
		// Make numeric if forced or a qualifier was provided and val looks numeric
6529
		if ( extra === "" || extra ) {
6530
			num = parseFloat( val );
6531
			return extra === true || isFinite( num ) ? num || 0 : val;
6532
		}
6533
 
6534
		return val;
6535
	}
6536
} );
6537
 
6538
jQuery.each( [ "height", "width" ], function( i, name ) {
6539
	jQuery.cssHooks[ name ] = {
6540
		get: function( elem, computed, extra ) {
6541
			if ( computed ) {
6542
 
6543
				// Certain elements can have dimension info if we invisibly show them
6544
				// but it must have a current display style that would benefit
6545
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
6546
 
6547
					// Support: Safari 8+
6548
					// Table columns in Safari have non-zero offsetWidth & zero
6549
					// getBoundingClientRect().width unless display is changed.
6550
					// Support: IE <=11 only
6551
					// Running getBoundingClientRect on a disconnected node
6552
					// in IE throws an error.
6553
					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6554
						swap( elem, cssShow, function() {
6555
							return getWidthOrHeight( elem, name, extra );
6556
						} ) :
6557
						getWidthOrHeight( elem, name, extra );
6558
			}
6559
		},
6560
 
6561
		set: function( elem, value, extra ) {
6562
			var matches,
6563
				styles = extra && getStyles( elem ),
6564
				subtract = extra && augmentWidthOrHeight(
6565
					elem,
6566
					name,
6567
					extra,
6568
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6569
					styles
6570
				);
6571
 
6572
			// Convert to pixels if value adjustment is needed
6573
			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6574
				( matches[ 3 ] || "px" ) !== "px" ) {
6575
 
6576
				elem.style[ name ] = value;
6577
				value = jQuery.css( elem, name );
6578
			}
6579
 
6580
			return setPositiveNumber( elem, value, subtract );
6581
		}
6582
	};
6583
} );
6584
 
6585
jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6586
	function( elem, computed ) {
6587
		if ( computed ) {
6588
			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
6589
				elem.getBoundingClientRect().left -
6590
					swap( elem, { marginLeft: 0 }, function() {
6591
						return elem.getBoundingClientRect().left;
6592
					} )
6593
				) + "px";
6594
		}
6595
	}
6596
);
6597
 
6598
// These hooks are used by animate to expand properties
6599
jQuery.each( {
6600
	margin: "",
6601
	padding: "",
6602
	border: "Width"
6603
}, function( prefix, suffix ) {
6604
	jQuery.cssHooks[ prefix + suffix ] = {
6605
		expand: function( value ) {
6606
			var i = 0,
6607
				expanded = {},
6608
 
6609
				// Assumes a single number if not a string
6610
				parts = typeof value === "string" ? value.split( " " ) : [ value ];
6611
 
6612
			for ( ; i < 4; i++ ) {
6613
				expanded[ prefix + cssExpand[ i ] + suffix ] =
6614
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6615
			}
6616
 
6617
			return expanded;
6618
		}
6619
	};
6620
 
6621
	if ( !rmargin.test( prefix ) ) {
6622
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6623
	}
6624
} );
6625
 
6626
jQuery.fn.extend( {
6627
	css: function( name, value ) {
6628
		return access( this, function( elem, name, value ) {
6629
			var styles, len,
6630
				map = {},
6631
				i = 0;
6632
 
6633
			if ( Array.isArray( name ) ) {
6634
				styles = getStyles( elem );
6635
				len = name.length;
6636
 
6637
				for ( ; i < len; i++ ) {
6638
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6639
				}
6640
 
6641
				return map;
6642
			}
6643
 
6644
			return value !== undefined ?
6645
				jQuery.style( elem, name, value ) :
6646
				jQuery.css( elem, name );
6647
		}, name, value, arguments.length > 1 );
6648
	}
6649
} );
6650
 
6651
 
6652
function Tween( elem, options, prop, end, easing ) {
6653
	return new Tween.prototype.init( elem, options, prop, end, easing );
6654
}
6655
jQuery.Tween = Tween;
6656
 
6657
Tween.prototype = {
6658
	constructor: Tween,
6659
	init: function( elem, options, prop, end, easing, unit ) {
6660
		this.elem = elem;
6661
		this.prop = prop;
6662
		this.easing = easing || jQuery.easing._default;
6663
		this.options = options;
6664
		this.start = this.now = this.cur();
6665
		this.end = end;
6666
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6667
	},
6668
	cur: function() {
6669
		var hooks = Tween.propHooks[ this.prop ];
6670
 
6671
		return hooks && hooks.get ?
6672
			hooks.get( this ) :
6673
			Tween.propHooks._default.get( this );
6674
	},
6675
	run: function( percent ) {
6676
		var eased,
6677
			hooks = Tween.propHooks[ this.prop ];
6678
 
6679
		if ( this.options.duration ) {
6680
			this.pos = eased = jQuery.easing[ this.easing ](
6681
				percent, this.options.duration * percent, 0, 1, this.options.duration
6682
			);
6683
		} else {
6684
			this.pos = eased = percent;
6685
		}
6686
		this.now = ( this.end - this.start ) * eased + this.start;
6687
 
6688
		if ( this.options.step ) {
6689
			this.options.step.call( this.elem, this.now, this );
6690
		}
6691
 
6692
		if ( hooks && hooks.set ) {
6693
			hooks.set( this );
6694
		} else {
6695
			Tween.propHooks._default.set( this );
6696
		}
6697
		return this;
6698
	}
6699
};
6700
 
6701
Tween.prototype.init.prototype = Tween.prototype;
6702
 
6703
Tween.propHooks = {
6704
	_default: {
6705
		get: function( tween ) {
6706
			var result;
6707
 
6708
			// Use a property on the element directly when it is not a DOM element,
6709
			// or when there is no matching style property that exists.
6710
			if ( tween.elem.nodeType !== 1 ||
6711
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
6712
				return tween.elem[ tween.prop ];
6713
			}
6714
 
6715
			// Passing an empty string as a 3rd parameter to .css will automatically
6716
			// attempt a parseFloat and fallback to a string if the parse fails.
6717
			// Simple values such as "10px" are parsed to Float;
6718
			// complex values such as "rotate(1rad)" are returned as-is.
6719
			result = jQuery.css( tween.elem, tween.prop, "" );
6720
 
6721
			// Empty strings, null, undefined and "auto" are converted to 0.
6722
			return !result || result === "auto" ? 0 : result;
6723
		},
6724
		set: function( tween ) {
6725
 
6726
			// Use step hook for back compat.
6727
			// Use cssHook if its there.
6728
			// Use .style if available and use plain properties where available.
6729
			if ( jQuery.fx.step[ tween.prop ] ) {
6730
				jQuery.fx.step[ tween.prop ]( tween );
6731
			} else if ( tween.elem.nodeType === 1 &&
6732
				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
6733
					jQuery.cssHooks[ tween.prop ] ) ) {
6734
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6735
			} else {
6736
				tween.elem[ tween.prop ] = tween.now;
6737
			}
6738
		}
6739
	}
6740
};
6741
 
6742
// Support: IE <=9 only
6743
// Panic based approach to setting things on disconnected nodes
6744
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6745
	set: function( tween ) {
6746
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
6747
			tween.elem[ tween.prop ] = tween.now;
6748
		}
6749
	}
6750
};
6751
 
6752
jQuery.easing = {
6753
	linear: function( p ) {
6754
		return p;
6755
	},
6756
	swing: function( p ) {
6757
		return 0.5 - Math.cos( p * Math.PI ) / 2;
6758
	},
6759
	_default: "swing"
6760
};
6761
 
6762
jQuery.fx = Tween.prototype.init;
6763
 
6764
// Back compat <1.8 extension point
6765
jQuery.fx.step = {};
6766
 
6767
 
6768
 
6769
 
6770
var
6771
	fxNow, inProgress,
6772
	rfxtypes = /^(?:toggle|show|hide)$/,
6773
	rrun = /queueHooks$/;
6774
 
6775
function schedule() {
6776
	if ( inProgress ) {
6777
		if ( document.hidden === false && window.requestAnimationFrame ) {
6778
			window.requestAnimationFrame( schedule );
6779
		} else {
6780
			window.setTimeout( schedule, jQuery.fx.interval );
6781
		}
6782
 
6783
		jQuery.fx.tick();
6784
	}
6785
}
6786
 
6787
// Animations created synchronously will run synchronously
6788
function createFxNow() {
6789
	window.setTimeout( function() {
6790
		fxNow = undefined;
6791
	} );
6792
	return ( fxNow = jQuery.now() );
6793
}
6794
 
6795
// Generate parameters to create a standard animation
6796
function genFx( type, includeWidth ) {
6797
	var which,
6798
		i = 0,
6799
		attrs = { height: type };
6800
 
6801
	// If we include width, step value is 1 to do all cssExpand values,
6802
	// otherwise step value is 2 to skip over Left and Right
6803
	includeWidth = includeWidth ? 1 : 0;
6804
	for ( ; i < 4; i += 2 - includeWidth ) {
6805
		which = cssExpand[ i ];
6806
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6807
	}
6808
 
6809
	if ( includeWidth ) {
6810
		attrs.opacity = attrs.width = type;
6811
	}
6812
 
6813
	return attrs;
6814
}
6815
 
6816
function createTween( value, prop, animation ) {
6817
	var tween,
6818
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
6819
		index = 0,
6820
		length = collection.length;
6821
	for ( ; index < length; index++ ) {
6822
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
6823
 
6824
			// We're done with this property
6825
			return tween;
6826
		}
6827
	}
6828
}
6829
 
6830
function defaultPrefilter( elem, props, opts ) {
6831
	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
6832
		isBox = "width" in props || "height" in props,
6833
		anim = this,
6834
		orig = {},
6835
		style = elem.style,
6836
		hidden = elem.nodeType && isHiddenWithinTree( elem ),
6837
		dataShow = dataPriv.get( elem, "fxshow" );
6838
 
6839
	// Queue-skipping animations hijack the fx hooks
6840
	if ( !opts.queue ) {
6841
		hooks = jQuery._queueHooks( elem, "fx" );
6842
		if ( hooks.unqueued == null ) {
6843
			hooks.unqueued = 0;
6844
			oldfire = hooks.empty.fire;
6845
			hooks.empty.fire = function() {
6846
				if ( !hooks.unqueued ) {
6847
					oldfire();
6848
				}
6849
			};
6850
		}
6851
		hooks.unqueued++;
6852
 
6853
		anim.always( function() {
6854
 
6855
			// Ensure the complete handler is called before this completes
6856
			anim.always( function() {
6857
				hooks.unqueued--;
6858
				if ( !jQuery.queue( elem, "fx" ).length ) {
6859
					hooks.empty.fire();
6860
				}
6861
			} );
6862
		} );
6863
	}
6864
 
6865
	// Detect show/hide animations
6866
	for ( prop in props ) {
6867
		value = props[ prop ];
6868
		if ( rfxtypes.test( value ) ) {
6869
			delete props[ prop ];
6870
			toggle = toggle || value === "toggle";
6871
			if ( value === ( hidden ? "hide" : "show" ) ) {
6872
 
6873
				// Pretend to be hidden if this is a "show" and
6874
				// there is still data from a stopped show/hide
6875
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
6876
					hidden = true;
6877
 
6878
				// Ignore all other no-op show/hide data
6879
				} else {
6880
					continue;
6881
				}
6882
			}
6883
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
6884
		}
6885
	}
6886
 
6887
	// Bail out if this is a no-op like .hide().hide()
6888
	propTween = !jQuery.isEmptyObject( props );
6889
	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
6890
		return;
6891
	}
6892
 
6893
	// Restrict "overflow" and "display" styles during box animations
6894
	if ( isBox && elem.nodeType === 1 ) {
6895
 
6896
		// Support: IE <=9 - 11, Edge 12 - 13
6897
		// Record all 3 overflow attributes because IE does not infer the shorthand
6898
		// from identically-valued overflowX and overflowY
6899
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6900
 
6901
		// Identify a display type, preferring old show/hide data over the CSS cascade
6902
		restoreDisplay = dataShow && dataShow.display;
6903
		if ( restoreDisplay == null ) {
6904
			restoreDisplay = dataPriv.get( elem, "display" );
6905
		}
6906
		display = jQuery.css( elem, "display" );
6907
		if ( display === "none" ) {
6908
			if ( restoreDisplay ) {
6909
				display = restoreDisplay;
6910
			} else {
6911
 
6912
				// Get nonempty value(s) by temporarily forcing visibility
6913
				showHide( [ elem ], true );
6914
				restoreDisplay = elem.style.display || restoreDisplay;
6915
				display = jQuery.css( elem, "display" );
6916
				showHide( [ elem ] );
6917
			}
6918
		}
6919
 
6920
		// Animate inline elements as inline-block
6921
		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
6922
			if ( jQuery.css( elem, "float" ) === "none" ) {
6923
 
6924
				// Restore the original display value at the end of pure show/hide animations
6925
				if ( !propTween ) {
6926
					anim.done( function() {
6927
						style.display = restoreDisplay;
6928
					} );
6929
					if ( restoreDisplay == null ) {
6930
						display = style.display;
6931
						restoreDisplay = display === "none" ? "" : display;
6932
					}
6933
				}
6934
				style.display = "inline-block";
6935
			}
6936
		}
6937
	}
6938
 
6939
	if ( opts.overflow ) {
6940
		style.overflow = "hidden";
6941
		anim.always( function() {
6942
			style.overflow = opts.overflow[ 0 ];
6943
			style.overflowX = opts.overflow[ 1 ];
6944
			style.overflowY = opts.overflow[ 2 ];
6945
		} );
6946
	}
6947
 
6948
	// Implement show/hide animations
6949
	propTween = false;
6950
	for ( prop in orig ) {
6951
 
6952
		// General show/hide setup for this element animation
6953
		if ( !propTween ) {
6954
			if ( dataShow ) {
6955
				if ( "hidden" in dataShow ) {
6956
					hidden = dataShow.hidden;
6957
				}
6958
			} else {
6959
				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
6960
			}
6961
 
6962
			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
6963
			if ( toggle ) {
6964
				dataShow.hidden = !hidden;
6965
			}
6966
 
6967
			// Show elements before animating them
6968
			if ( hidden ) {
6969
				showHide( [ elem ], true );
6970
			}
6971
 
6972
			/* eslint-disable no-loop-func */
6973
 
6974
			anim.done( function() {
6975
 
6976
			/* eslint-enable no-loop-func */
6977
 
6978
				// The final step of a "hide" animation is actually hiding the element
6979
				if ( !hidden ) {
6980
					showHide( [ elem ] );
6981
				}
6982
				dataPriv.remove( elem, "fxshow" );
6983
				for ( prop in orig ) {
6984
					jQuery.style( elem, prop, orig[ prop ] );
6985
				}
6986
			} );
6987
		}
6988
 
6989
		// Per-property setup
6990
		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
6991
		if ( !( prop in dataShow ) ) {
6992
			dataShow[ prop ] = propTween.start;
6993
			if ( hidden ) {
6994
				propTween.end = propTween.start;
6995
				propTween.start = 0;
6996
			}
6997
		}
6998
	}
6999
}
7000
 
7001
function propFilter( props, specialEasing ) {
7002
	var index, name, easing, value, hooks;
7003
 
7004
	// camelCase, specialEasing and expand cssHook pass
7005
	for ( index in props ) {
7006
		name = jQuery.camelCase( index );
7007
		easing = specialEasing[ name ];
7008
		value = props[ index ];
7009
		if ( Array.isArray( value ) ) {
7010
			easing = value[ 1 ];
7011
			value = props[ index ] = value[ 0 ];
7012
		}
7013
 
7014
		if ( index !== name ) {
7015
			props[ name ] = value;
7016
			delete props[ index ];
7017
		}
7018
 
7019
		hooks = jQuery.cssHooks[ name ];
7020
		if ( hooks && "expand" in hooks ) {
7021
			value = hooks.expand( value );
7022
			delete props[ name ];
7023
 
7024
			// Not quite $.extend, this won't overwrite existing keys.
7025
			// Reusing 'index' because we have the correct "name"
7026
			for ( index in value ) {
7027
				if ( !( index in props ) ) {
7028
					props[ index ] = value[ index ];
7029
					specialEasing[ index ] = easing;
7030
				}
7031
			}
7032
		} else {
7033
			specialEasing[ name ] = easing;
7034
		}
7035
	}
7036
}
7037
 
7038
function Animation( elem, properties, options ) {
7039
	var result,
7040
		stopped,
7041
		index = 0,
7042
		length = Animation.prefilters.length,
7043
		deferred = jQuery.Deferred().always( function() {
7044
 
7045
			// Don't match elem in the :animated selector
7046
			delete tick.elem;
7047
		} ),
7048
		tick = function() {
7049
			if ( stopped ) {
7050
				return false;
7051
			}
7052
			var currentTime = fxNow || createFxNow(),
7053
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7054
 
7055
				// Support: Android 2.3 only
7056
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7057
				temp = remaining / animation.duration || 0,
7058
				percent = 1 - temp,
7059
				index = 0,
7060
				length = animation.tweens.length;
7061
 
7062
			for ( ; index < length; index++ ) {
7063
				animation.tweens[ index ].run( percent );
7064
			}
7065
 
7066
			deferred.notifyWith( elem, [ animation, percent, remaining ] );
7067
 
7068
			// If there's more to do, yield
7069
			if ( percent < 1 && length ) {
7070
				return remaining;
7071
			}
7072
 
7073
			// If this was an empty animation, synthesize a final progress notification
7074
			if ( !length ) {
7075
				deferred.notifyWith( elem, [ animation, 1, 0 ] );
7076
			}
7077
 
7078
			// Resolve the animation and report its conclusion
7079
			deferred.resolveWith( elem, [ animation ] );
7080
			return false;
7081
		},
7082
		animation = deferred.promise( {
7083
			elem: elem,
7084
			props: jQuery.extend( {}, properties ),
7085
			opts: jQuery.extend( true, {
7086
				specialEasing: {},
7087
				easing: jQuery.easing._default
7088
			}, options ),
7089
			originalProperties: properties,
7090
			originalOptions: options,
7091
			startTime: fxNow || createFxNow(),
7092
			duration: options.duration,
7093
			tweens: [],
7094
			createTween: function( prop, end ) {
7095
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7096
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7097
				animation.tweens.push( tween );
7098
				return tween;
7099
			},
7100
			stop: function( gotoEnd ) {
7101
				var index = 0,
7102
 
7103
					// If we are going to the end, we want to run all the tweens
7104
					// otherwise we skip this part
7105
					length = gotoEnd ? animation.tweens.length : 0;
7106
				if ( stopped ) {
7107
					return this;
7108
				}
7109
				stopped = true;
7110
				for ( ; index < length; index++ ) {
7111
					animation.tweens[ index ].run( 1 );
7112
				}
7113
 
7114
				// Resolve when we played the last frame; otherwise, reject
7115
				if ( gotoEnd ) {
7116
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
7117
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7118
				} else {
7119
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7120
				}
7121
				return this;
7122
			}
7123
		} ),
7124
		props = animation.props;
7125
 
7126
	propFilter( props, animation.opts.specialEasing );
7127
 
7128
	for ( ; index < length; index++ ) {
7129
		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7130
		if ( result ) {
7131
			if ( jQuery.isFunction( result.stop ) ) {
7132
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7133
					jQuery.proxy( result.stop, result );
7134
			}
7135
			return result;
7136
		}
7137
	}
7138
 
7139
	jQuery.map( props, createTween, animation );
7140
 
7141
	if ( jQuery.isFunction( animation.opts.start ) ) {
7142
		animation.opts.start.call( elem, animation );
7143
	}
7144
 
7145
	// Attach callbacks from options
7146
	animation
7147
		.progress( animation.opts.progress )
7148
		.done( animation.opts.done, animation.opts.complete )
7149
		.fail( animation.opts.fail )
7150
		.always( animation.opts.always );
7151
 
7152
	jQuery.fx.timer(
7153
		jQuery.extend( tick, {
7154
			elem: elem,
7155
			anim: animation,
7156
			queue: animation.opts.queue
7157
		} )
7158
	);
7159
 
7160
	return animation;
7161
}
7162
 
7163
jQuery.Animation = jQuery.extend( Animation, {
7164
 
7165
	tweeners: {
7166
		"*": [ function( prop, value ) {
7167
			var tween = this.createTween( prop, value );
7168
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
7169
			return tween;
7170
		} ]
7171
	},
7172
 
7173
	tweener: function( props, callback ) {
7174
		if ( jQuery.isFunction( props ) ) {
7175
			callback = props;
7176
			props = [ "*" ];
7177
		} else {
7178
			props = props.match( rnothtmlwhite );
7179
		}
7180
 
7181
		var prop,
7182
			index = 0,
7183
			length = props.length;
7184
 
7185
		for ( ; index < length; index++ ) {
7186
			prop = props[ index ];
7187
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
7188
			Animation.tweeners[ prop ].unshift( callback );
7189
		}
7190
	},
7191
 
7192
	prefilters: [ defaultPrefilter ],
7193
 
7194
	prefilter: function( callback, prepend ) {
7195
		if ( prepend ) {
7196
			Animation.prefilters.unshift( callback );
7197
		} else {
7198
			Animation.prefilters.push( callback );
7199
		}
7200
	}
7201
} );
7202
 
7203
jQuery.speed = function( speed, easing, fn ) {
7204
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7205
		complete: fn || !fn && easing ||
7206
			jQuery.isFunction( speed ) && speed,
7207
		duration: speed,
7208
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7209
	};
7210
 
7211
	// Go to the end state if fx are off
7212
	if ( jQuery.fx.off ) {
7213
		opt.duration = 0;
7214
 
7215
	} else {
7216
		if ( typeof opt.duration !== "number" ) {
7217
			if ( opt.duration in jQuery.fx.speeds ) {
7218
				opt.duration = jQuery.fx.speeds[ opt.duration ];
7219
 
7220
			} else {
7221
				opt.duration = jQuery.fx.speeds._default;
7222
			}
7223
		}
7224
	}
7225
 
7226
	// Normalize opt.queue - true/undefined/null -> "fx"
7227
	if ( opt.queue == null || opt.queue === true ) {
7228
		opt.queue = "fx";
7229
	}
7230
 
7231
	// Queueing
7232
	opt.old = opt.complete;
7233
 
7234
	opt.complete = function() {
7235
		if ( jQuery.isFunction( opt.old ) ) {
7236
			opt.old.call( this );
7237
		}
7238
 
7239
		if ( opt.queue ) {
7240
			jQuery.dequeue( this, opt.queue );
7241
		}
7242
	};
7243
 
7244
	return opt;
7245
};
7246
 
7247
jQuery.fn.extend( {
7248
	fadeTo: function( speed, to, easing, callback ) {
7249
 
7250
		// Show any hidden elements after setting opacity to 0
7251
		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
7252
 
7253
			// Animate to the value specified
7254
			.end().animate( { opacity: to }, speed, easing, callback );
7255
	},
7256
	animate: function( prop, speed, easing, callback ) {
7257
		var empty = jQuery.isEmptyObject( prop ),
7258
			optall = jQuery.speed( speed, easing, callback ),
7259
			doAnimation = function() {
7260
 
7261
				// Operate on a copy of prop so per-property easing won't be lost
7262
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7263
 
7264
				// Empty animations, or finishing resolves immediately
7265
				if ( empty || dataPriv.get( this, "finish" ) ) {
7266
					anim.stop( true );
7267
				}
7268
			};
7269
			doAnimation.finish = doAnimation;
7270
 
7271
		return empty || optall.queue === false ?
7272
			this.each( doAnimation ) :
7273
			this.queue( optall.queue, doAnimation );
7274
	},
7275
	stop: function( type, clearQueue, gotoEnd ) {
7276
		var stopQueue = function( hooks ) {
7277
			var stop = hooks.stop;
7278
			delete hooks.stop;
7279
			stop( gotoEnd );
7280
		};
7281
 
7282
		if ( typeof type !== "string" ) {
7283
			gotoEnd = clearQueue;
7284
			clearQueue = type;
7285
			type = undefined;
7286
		}
7287
		if ( clearQueue && type !== false ) {
7288
			this.queue( type || "fx", [] );
7289
		}
7290
 
7291
		return this.each( function() {
7292
			var dequeue = true,
7293
				index = type != null && type + "queueHooks",
7294
				timers = jQuery.timers,
7295
				data = dataPriv.get( this );
7296
 
7297
			if ( index ) {
7298
				if ( data[ index ] && data[ index ].stop ) {
7299
					stopQueue( data[ index ] );
7300
				}
7301
			} else {
7302
				for ( index in data ) {
7303
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7304
						stopQueue( data[ index ] );
7305
					}
7306
				}
7307
			}
7308
 
7309
			for ( index = timers.length; index--; ) {
7310
				if ( timers[ index ].elem === this &&
7311
					( type == null || timers[ index ].queue === type ) ) {
7312
 
7313
					timers[ index ].anim.stop( gotoEnd );
7314
					dequeue = false;
7315
					timers.splice( index, 1 );
7316
				}
7317
			}
7318
 
7319
			// Start the next in the queue if the last step wasn't forced.
7320
			// Timers currently will call their complete callbacks, which
7321
			// will dequeue but only if they were gotoEnd.
7322
			if ( dequeue || !gotoEnd ) {
7323
				jQuery.dequeue( this, type );
7324
			}
7325
		} );
7326
	},
7327
	finish: function( type ) {
7328
		if ( type !== false ) {
7329
			type = type || "fx";
7330
		}
7331
		return this.each( function() {
7332
			var index,
7333
				data = dataPriv.get( this ),
7334
				queue = data[ type + "queue" ],
7335
				hooks = data[ type + "queueHooks" ],
7336
				timers = jQuery.timers,
7337
				length = queue ? queue.length : 0;
7338
 
7339
			// Enable finishing flag on private data
7340
			data.finish = true;
7341
 
7342
			// Empty the queue first
7343
			jQuery.queue( this, type, [] );
7344
 
7345
			if ( hooks && hooks.stop ) {
7346
				hooks.stop.call( this, true );
7347
			}
7348
 
7349
			// Look for any active animations, and finish them
7350
			for ( index = timers.length; index--; ) {
7351
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7352
					timers[ index ].anim.stop( true );
7353
					timers.splice( index, 1 );
7354
				}
7355
			}
7356
 
7357
			// Look for any animations in the old queue and finish them
7358
			for ( index = 0; index < length; index++ ) {
7359
				if ( queue[ index ] && queue[ index ].finish ) {
7360
					queue[ index ].finish.call( this );
7361
				}
7362
			}
7363
 
7364
			// Turn off finishing flag
7365
			delete data.finish;
7366
		} );
7367
	}
7368
} );
7369
 
7370
jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7371
	var cssFn = jQuery.fn[ name ];
7372
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7373
		return speed == null || typeof speed === "boolean" ?
7374
			cssFn.apply( this, arguments ) :
7375
			this.animate( genFx( name, true ), speed, easing, callback );
7376
	};
7377
} );
7378
 
7379
// Generate shortcuts for custom animations
7380
jQuery.each( {
7381
	slideDown: genFx( "show" ),
7382
	slideUp: genFx( "hide" ),
7383
	slideToggle: genFx( "toggle" ),
7384
	fadeIn: { opacity: "show" },
7385
	fadeOut: { opacity: "hide" },
7386
	fadeToggle: { opacity: "toggle" }
7387
}, function( name, props ) {
7388
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7389
		return this.animate( props, speed, easing, callback );
7390
	};
7391
} );
7392
 
7393
jQuery.timers = [];
7394
jQuery.fx.tick = function() {
7395
	var timer,
7396
		i = 0,
7397
		timers = jQuery.timers;
7398
 
7399
	fxNow = jQuery.now();
7400
 
7401
	for ( ; i < timers.length; i++ ) {
7402
		timer = timers[ i ];
7403
 
7404
		// Run the timer and safely remove it when done (allowing for external removal)
7405
		if ( !timer() && timers[ i ] === timer ) {
7406
			timers.splice( i--, 1 );
7407
		}
7408
	}
7409
 
7410
	if ( !timers.length ) {
7411
		jQuery.fx.stop();
7412
	}
7413
	fxNow = undefined;
7414
};
7415
 
7416
jQuery.fx.timer = function( timer ) {
7417
	jQuery.timers.push( timer );
7418
	jQuery.fx.start();
7419
};
7420
 
7421
jQuery.fx.interval = 13;
7422
jQuery.fx.start = function() {
7423
	if ( inProgress ) {
7424
		return;
7425
	}
7426
 
7427
	inProgress = true;
7428
	schedule();
7429
};
7430
 
7431
jQuery.fx.stop = function() {
7432
	inProgress = null;
7433
};
7434
 
7435
jQuery.fx.speeds = {
7436
	slow: 600,
7437
	fast: 200,
7438
 
7439
	// Default speed
7440
	_default: 400
7441
};
7442
 
7443
 
7444
// Based off of the plugin by Clint Helfers, with permission.
7445
// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7446
jQuery.fn.delay = function( time, type ) {
7447
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7448
	type = type || "fx";
7449
 
7450
	return this.queue( type, function( next, hooks ) {
7451
		var timeout = window.setTimeout( next, time );
7452
		hooks.stop = function() {
7453
			window.clearTimeout( timeout );
7454
		};
7455
	} );
7456
};
7457
 
7458
 
7459
( function() {
7460
	var input = document.createElement( "input" ),
7461
		select = document.createElement( "select" ),
7462
		opt = select.appendChild( document.createElement( "option" ) );
7463
 
7464
	input.type = "checkbox";
7465
 
7466
	// Support: Android <=4.3 only
7467
	// Default value for a checkbox should be "on"
7468
	support.checkOn = input.value !== "";
7469
 
7470
	// Support: IE <=11 only
7471
	// Must access selectedIndex to make default options select
7472
	support.optSelected = opt.selected;
7473
 
7474
	// Support: IE <=11 only
7475
	// An input loses its value after becoming a radio
7476
	input = document.createElement( "input" );
7477
	input.value = "t";
7478
	input.type = "radio";
7479
	support.radioValue = input.value === "t";
7480
} )();
7481
 
7482
 
7483
var boolHook,
7484
	attrHandle = jQuery.expr.attrHandle;
7485
 
7486
jQuery.fn.extend( {
7487
	attr: function( name, value ) {
7488
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7489
	},
7490
 
7491
	removeAttr: function( name ) {
7492
		return this.each( function() {
7493
			jQuery.removeAttr( this, name );
7494
		} );
7495
	}
7496
} );
7497
 
7498
jQuery.extend( {
7499
	attr: function( elem, name, value ) {
7500
		var ret, hooks,
7501
			nType = elem.nodeType;
7502
 
7503
		// Don't get/set attributes on text, comment and attribute nodes
7504
		if ( nType === 3 || nType === 8 || nType === 2 ) {
7505
			return;
7506
		}
7507
 
7508
		// Fallback to prop when attributes are not supported
7509
		if ( typeof elem.getAttribute === "undefined" ) {
7510
			return jQuery.prop( elem, name, value );
7511
		}
7512
 
7513
		// Attribute hooks are determined by the lowercase version
7514
		// Grab necessary hook if one is defined
7515
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7516
			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
7517
				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
7518
		}
7519
 
7520
		if ( value !== undefined ) {
7521
			if ( value === null ) {
7522
				jQuery.removeAttr( elem, name );
7523
				return;
7524
			}
7525
 
7526
			if ( hooks && "set" in hooks &&
7527
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7528
				return ret;
7529
			}
7530
 
7531
			elem.setAttribute( name, value + "" );
7532
			return value;
7533
		}
7534
 
7535
		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7536
			return ret;
7537
		}
7538
 
7539
		ret = jQuery.find.attr( elem, name );
7540
 
7541
		// Non-existent attributes return null, we normalize to undefined
7542
		return ret == null ? undefined : ret;
7543
	},
7544
 
7545
	attrHooks: {
7546
		type: {
7547
			set: function( elem, value ) {
7548
				if ( !support.radioValue && value === "radio" &&
7549
					nodeName( elem, "input" ) ) {
7550
					var val = elem.value;
7551
					elem.setAttribute( "type", value );
7552
					if ( val ) {
7553
						elem.value = val;
7554
					}
7555
					return value;
7556
				}
7557
			}
7558
		}
7559
	},
7560
 
7561
	removeAttr: function( elem, value ) {
7562
		var name,
7563
			i = 0,
7564
 
7565
			// Attribute names can contain non-HTML whitespace characters
7566
			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
7567
			attrNames = value && value.match( rnothtmlwhite );
7568
 
7569
		if ( attrNames && elem.nodeType === 1 ) {
7570
			while ( ( name = attrNames[ i++ ] ) ) {
7571
				elem.removeAttribute( name );
7572
			}
7573
		}
7574
	}
7575
} );
7576
 
7577
// Hooks for boolean attributes
7578
boolHook = {
7579
	set: function( elem, value, name ) {
7580
		if ( value === false ) {
7581
 
7582
			// Remove boolean attributes when set to false
7583
			jQuery.removeAttr( elem, name );
7584
		} else {
7585
			elem.setAttribute( name, name );
7586
		}
7587
		return name;
7588
	}
7589
};
7590
 
7591
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7592
	var getter = attrHandle[ name ] || jQuery.find.attr;
7593
 
7594
	attrHandle[ name ] = function( elem, name, isXML ) {
7595
		var ret, handle,
7596
			lowercaseName = name.toLowerCase();
7597
 
7598
		if ( !isXML ) {
7599
 
7600
			// Avoid an infinite loop by temporarily removing this function from the getter
7601
			handle = attrHandle[ lowercaseName ];
7602
			attrHandle[ lowercaseName ] = ret;
7603
			ret = getter( elem, name, isXML ) != null ?
7604
				lowercaseName :
7605
				null;
7606
			attrHandle[ lowercaseName ] = handle;
7607
		}
7608
		return ret;
7609
	};
7610
} );
7611
 
7612
 
7613
 
7614
 
7615
var rfocusable = /^(?:input|select|textarea|button)$/i,
7616
	rclickable = /^(?:a|area)$/i;
7617
 
7618
jQuery.fn.extend( {
7619
	prop: function( name, value ) {
7620
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
7621
	},
7622
 
7623
	removeProp: function( name ) {
7624
		return this.each( function() {
7625
			delete this[ jQuery.propFix[ name ] || name ];
7626
		} );
7627
	}
7628
} );
7629
 
7630
jQuery.extend( {
7631
	prop: function( elem, name, value ) {
7632
		var ret, hooks,
7633
			nType = elem.nodeType;
7634
 
7635
		// Don't get/set properties on text, comment and attribute nodes
7636
		if ( nType === 3 || nType === 8 || nType === 2 ) {
7637
			return;
7638
		}
7639
 
7640
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7641
 
7642
			// Fix name and attach hooks
7643
			name = jQuery.propFix[ name ] || name;
7644
			hooks = jQuery.propHooks[ name ];
7645
		}
7646
 
7647
		if ( value !== undefined ) {
7648
			if ( hooks && "set" in hooks &&
7649
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
7650
				return ret;
7651
			}
7652
 
7653
			return ( elem[ name ] = value );
7654
		}
7655
 
7656
		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
7657
			return ret;
7658
		}
7659
 
7660
		return elem[ name ];
7661
	},
7662
 
7663
	propHooks: {
7664
		tabIndex: {
7665
			get: function( elem ) {
7666
 
7667
				// Support: IE <=9 - 11 only
7668
				// elem.tabIndex doesn't always return the
7669
				// correct value when it hasn't been explicitly set
7670
				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7671
				// Use proper attribute retrieval(#12072)
7672
				var tabindex = jQuery.find.attr( elem, "tabindex" );
7673
 
7674
				if ( tabindex ) {
7675
					return parseInt( tabindex, 10 );
7676
				}
7677
 
7678
				if (
7679
					rfocusable.test( elem.nodeName ) ||
7680
					rclickable.test( elem.nodeName ) &&
7681
					elem.href
7682
				) {
7683
					return 0;
7684
				}
7685
 
7686
				return -1;
7687
			}
7688
		}
7689
	},
7690
 
7691
	propFix: {
7692
		"for": "htmlFor",
7693
		"class": "className"
7694
	}
7695
} );
7696
 
7697
// Support: IE <=11 only
7698
// Accessing the selectedIndex property
7699
// forces the browser to respect setting selected
7700
// on the option
7701
// The getter ensures a default option is selected
7702
// when in an optgroup
7703
// eslint rule "no-unused-expressions" is disabled for this code
7704
// since it considers such accessions noop
7705
if ( !support.optSelected ) {
7706
	jQuery.propHooks.selected = {
7707
		get: function( elem ) {
7708
 
7709
			/* eslint no-unused-expressions: "off" */
7710
 
7711
			var parent = elem.parentNode;
7712
			if ( parent && parent.parentNode ) {
7713
				parent.parentNode.selectedIndex;
7714
			}
7715
			return null;
7716
		},
7717
		set: function( elem ) {
7718
 
7719
			/* eslint no-unused-expressions: "off" */
7720
 
7721
			var parent = elem.parentNode;
7722
			if ( parent ) {
7723
				parent.selectedIndex;
7724
 
7725
				if ( parent.parentNode ) {
7726
					parent.parentNode.selectedIndex;
7727
				}
7728
			}
7729
		}
7730
	};
7731
}
7732
 
7733
jQuery.each( [
7734
	"tabIndex",
7735
	"readOnly",
7736
	"maxLength",
7737
	"cellSpacing",
7738
	"cellPadding",
7739
	"rowSpan",
7740
	"colSpan",
7741
	"useMap",
7742
	"frameBorder",
7743
	"contentEditable"
7744
], function() {
7745
	jQuery.propFix[ this.toLowerCase() ] = this;
7746
} );
7747
 
7748
 
7749
 
7750
 
7751
	// Strip and collapse whitespace according to HTML spec
7752
	// https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
7753
	function stripAndCollapse( value ) {
7754
		var tokens = value.match( rnothtmlwhite ) || [];
7755
		return tokens.join( " " );
7756
	}
7757
 
7758
 
7759
function getClass( elem ) {
7760
	return elem.getAttribute && elem.getAttribute( "class" ) || "";
7761
}
7762
 
7763
jQuery.fn.extend( {
7764
	addClass: function( value ) {
7765
		var classes, elem, cur, curValue, clazz, j, finalValue,
7766
			i = 0;
7767
 
7768
		if ( jQuery.isFunction( value ) ) {
7769
			return this.each( function( j ) {
7770
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7771
			} );
7772
		}
7773
 
7774
		if ( typeof value === "string" && value ) {
7775
			classes = value.match( rnothtmlwhite ) || [];
7776
 
7777
			while ( ( elem = this[ i++ ] ) ) {
7778
				curValue = getClass( elem );
7779
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7780
 
7781
				if ( cur ) {
7782
					j = 0;
7783
					while ( ( clazz = classes[ j++ ] ) ) {
7784
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7785
							cur += clazz + " ";
7786
						}
7787
					}
7788
 
7789
					// Only assign if different to avoid unneeded rendering.
7790
					finalValue = stripAndCollapse( cur );
7791
					if ( curValue !== finalValue ) {
7792
						elem.setAttribute( "class", finalValue );
7793
					}
7794
				}
7795
			}
7796
		}
7797
 
7798
		return this;
7799
	},
7800
 
7801
	removeClass: function( value ) {
7802
		var classes, elem, cur, curValue, clazz, j, finalValue,
7803
			i = 0;
7804
 
7805
		if ( jQuery.isFunction( value ) ) {
7806
			return this.each( function( j ) {
7807
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7808
			} );
7809
		}
7810
 
7811
		if ( !arguments.length ) {
7812
			return this.attr( "class", "" );
7813
		}
7814
 
7815
		if ( typeof value === "string" && value ) {
7816
			classes = value.match( rnothtmlwhite ) || [];
7817
 
7818
			while ( ( elem = this[ i++ ] ) ) {
7819
				curValue = getClass( elem );
7820
 
7821
				// This expression is here for better compressibility (see addClass)
7822
				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
7823
 
7824
				if ( cur ) {
7825
					j = 0;
7826
					while ( ( clazz = classes[ j++ ] ) ) {
7827
 
7828
						// Remove *all* instances
7829
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
7830
							cur = cur.replace( " " + clazz + " ", " " );
7831
						}
7832
					}
7833
 
7834
					// Only assign if different to avoid unneeded rendering.
7835
					finalValue = stripAndCollapse( cur );
7836
					if ( curValue !== finalValue ) {
7837
						elem.setAttribute( "class", finalValue );
7838
					}
7839
				}
7840
			}
7841
		}
7842
 
7843
		return this;
7844
	},
7845
 
7846
	toggleClass: function( value, stateVal ) {
7847
		var type = typeof value;
7848
 
7849
		if ( typeof stateVal === "boolean" && type === "string" ) {
7850
			return stateVal ? this.addClass( value ) : this.removeClass( value );
7851
		}
7852
 
7853
		if ( jQuery.isFunction( value ) ) {
7854
			return this.each( function( i ) {
7855
				jQuery( this ).toggleClass(
7856
					value.call( this, i, getClass( this ), stateVal ),
7857
					stateVal
7858
				);
7859
			} );
7860
		}
7861
 
7862
		return this.each( function() {
7863
			var className, i, self, classNames;
7864
 
7865
			if ( type === "string" ) {
7866
 
7867
				// Toggle individual class names
7868
				i = 0;
7869
				self = jQuery( this );
7870
				classNames = value.match( rnothtmlwhite ) || [];
7871
 
7872
				while ( ( className = classNames[ i++ ] ) ) {
7873
 
7874
					// Check each className given, space separated list
7875
					if ( self.hasClass( className ) ) {
7876
						self.removeClass( className );
7877
					} else {
7878
						self.addClass( className );
7879
					}
7880
				}
7881
 
7882
			// Toggle whole class name
7883
			} else if ( value === undefined || type === "boolean" ) {
7884
				className = getClass( this );
7885
				if ( className ) {
7886
 
7887
					// Store className if set
7888
					dataPriv.set( this, "__className__", className );
7889
				}
7890
 
7891
				// If the element has a class name or if we're passed `false`,
7892
				// then remove the whole classname (if there was one, the above saved it).
7893
				// Otherwise bring back whatever was previously saved (if anything),
7894
				// falling back to the empty string if nothing was stored.
7895
				if ( this.setAttribute ) {
7896
					this.setAttribute( "class",
7897
						className || value === false ?
7898
						"" :
7899
						dataPriv.get( this, "__className__" ) || ""
7900
					);
7901
				}
7902
			}
7903
		} );
7904
	},
7905
 
7906
	hasClass: function( selector ) {
7907
		var className, elem,
7908
			i = 0;
7909
 
7910
		className = " " + selector + " ";
7911
		while ( ( elem = this[ i++ ] ) ) {
7912
			if ( elem.nodeType === 1 &&
7913
				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
7914
					return true;
7915
			}
7916
		}
7917
 
7918
		return false;
7919
	}
7920
} );
7921
 
7922
 
7923
 
7924
 
7925
var rreturn = /\r/g;
7926
 
7927
jQuery.fn.extend( {
7928
	val: function( value ) {
7929
		var hooks, ret, isFunction,
7930
			elem = this[ 0 ];
7931
 
7932
		if ( !arguments.length ) {
7933
			if ( elem ) {
7934
				hooks = jQuery.valHooks[ elem.type ] ||
7935
					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7936
 
7937
				if ( hooks &&
7938
					"get" in hooks &&
7939
					( ret = hooks.get( elem, "value" ) ) !== undefined
7940
				) {
7941
					return ret;
7942
				}
7943
 
7944
				ret = elem.value;
7945
 
7946
				// Handle most common string cases
7947
				if ( typeof ret === "string" ) {
7948
					return ret.replace( rreturn, "" );
7949
				}
7950
 
7951
				// Handle cases where value is null/undef or number
7952
				return ret == null ? "" : ret;
7953
			}
7954
 
7955
			return;
7956
		}
7957
 
7958
		isFunction = jQuery.isFunction( value );
7959
 
7960
		return this.each( function( i ) {
7961
			var val;
7962
 
7963
			if ( this.nodeType !== 1 ) {
7964
				return;
7965
			}
7966
 
7967
			if ( isFunction ) {
7968
				val = value.call( this, i, jQuery( this ).val() );
7969
			} else {
7970
				val = value;
7971
			}
7972
 
7973
			// Treat null/undefined as ""; convert numbers to string
7974
			if ( val == null ) {
7975
				val = "";
7976
 
7977
			} else if ( typeof val === "number" ) {
7978
				val += "";
7979
 
7980
			} else if ( Array.isArray( val ) ) {
7981
				val = jQuery.map( val, function( value ) {
7982
					return value == null ? "" : value + "";
7983
				} );
7984
			}
7985
 
7986
			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7987
 
7988
			// If set returns undefined, fall back to normal setting
7989
			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
7990
				this.value = val;
7991
			}
7992
		} );
7993
	}
7994
} );
7995
 
7996
jQuery.extend( {
7997
	valHooks: {
7998
		option: {
7999
			get: function( elem ) {
8000
 
8001
				var val = jQuery.find.attr( elem, "value" );
8002
				return val != null ?
8003
					val :
8004
 
8005
					// Support: IE <=10 - 11 only
8006
					// option.text throws exceptions (#14686, #14858)
8007
					// Strip and collapse whitespace
8008
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8009
					stripAndCollapse( jQuery.text( elem ) );
8010
			}
8011
		},
8012
		select: {
8013
			get: function( elem ) {
8014
				var value, option, i,
8015
					options = elem.options,
8016
					index = elem.selectedIndex,
8017
					one = elem.type === "select-one",
8018
					values = one ? null : [],
8019
					max = one ? index + 1 : options.length;
8020
 
8021
				if ( index < 0 ) {
8022
					i = max;
8023
 
8024
				} else {
8025
					i = one ? index : 0;
8026
				}
8027
 
8028
				// Loop through all the selected options
8029
				for ( ; i < max; i++ ) {
8030
					option = options[ i ];
8031
 
8032
					// Support: IE <=9 only
8033
					// IE8-9 doesn't update selected after form reset (#2551)
8034
					if ( ( option.selected || i === index ) &&
8035
 
8036
							// Don't return options that are disabled or in a disabled optgroup
8037
							!option.disabled &&
8038
							( !option.parentNode.disabled ||
8039
								!nodeName( option.parentNode, "optgroup" ) ) ) {
8040
 
8041
						// Get the specific value for the option
8042
						value = jQuery( option ).val();
8043
 
8044
						// We don't need an array for one selects
8045
						if ( one ) {
8046
							return value;
8047
						}
8048
 
8049
						// Multi-Selects return an array
8050
						values.push( value );
8051
					}
8052
				}
8053
 
8054
				return values;
8055
			},
8056
 
8057
			set: function( elem, value ) {
8058
				var optionSet, option,
8059
					options = elem.options,
8060
					values = jQuery.makeArray( value ),
8061
					i = options.length;
8062
 
8063
				while ( i-- ) {
8064
					option = options[ i ];
8065
 
8066
					/* eslint-disable no-cond-assign */
8067
 
8068
					if ( option.selected =
8069
						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
8070
					) {
8071
						optionSet = true;
8072
					}
8073
 
8074
					/* eslint-enable no-cond-assign */
8075
				}
8076
 
8077
				// Force browsers to behave consistently when non-matching value is set
8078
				if ( !optionSet ) {
8079
					elem.selectedIndex = -1;
8080
				}
8081
				return values;
8082
			}
8083
		}
8084
	}
8085
} );
8086
 
8087
// Radios and checkboxes getter/setter
8088
jQuery.each( [ "radio", "checkbox" ], function() {
8089
	jQuery.valHooks[ this ] = {
8090
		set: function( elem, value ) {
8091
			if ( Array.isArray( value ) ) {
8092
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
8093
			}
8094
		}
8095
	};
8096
	if ( !support.checkOn ) {
8097
		jQuery.valHooks[ this ].get = function( elem ) {
8098
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
8099
		};
8100
	}
8101
} );
8102
 
8103
 
8104
 
8105
 
8106
// Return jQuery for attributes-only inclusion
8107
 
8108
 
8109
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8110
 
8111
jQuery.extend( jQuery.event, {
8112
 
8113
	trigger: function( event, data, elem, onlyHandlers ) {
8114
 
8115
		var i, cur, tmp, bubbleType, ontype, handle, special,
8116
			eventPath = [ elem || document ],
8117
			type = hasOwn.call( event, "type" ) ? event.type : event,
8118
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8119
 
8120
		cur = tmp = elem = elem || document;
8121
 
8122
		// Don't do events on text and comment nodes
8123
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
8124
			return;
8125
		}
8126
 
8127
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
8128
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
8129
			return;
8130
		}
8131
 
8132
		if ( type.indexOf( "." ) > -1 ) {
8133
 
8134
			// Namespaced trigger; create a regexp to match event type in handle()
8135
			namespaces = type.split( "." );
8136
			type = namespaces.shift();
8137
			namespaces.sort();
8138
		}
8139
		ontype = type.indexOf( ":" ) < 0 && "on" + type;
8140
 
8141
		// Caller can pass in a jQuery.Event object, Object, or just an event type string
8142
		event = event[ jQuery.expando ] ?
8143
			event :
8144
			new jQuery.Event( type, typeof event === "object" && event );
8145
 
8146
		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
8147
		event.isTrigger = onlyHandlers ? 2 : 3;
8148
		event.namespace = namespaces.join( "." );
8149
		event.rnamespace = event.namespace ?
8150
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
8151
			null;
8152
 
8153
		// Clean up the event in case it is being reused
8154
		event.result = undefined;
8155
		if ( !event.target ) {
8156
			event.target = elem;
8157
		}
8158
 
8159
		// Clone any incoming data and prepend the event, creating the handler arg list
8160
		data = data == null ?
8161
			[ event ] :
8162
			jQuery.makeArray( data, [ event ] );
8163
 
8164
		// Allow special events to draw outside the lines
8165
		special = jQuery.event.special[ type ] || {};
8166
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
8167
			return;
8168
		}
8169
 
8170
		// Determine event propagation path in advance, per W3C events spec (#9951)
8171
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8172
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8173
 
8174
			bubbleType = special.delegateType || type;
8175
			if ( !rfocusMorph.test( bubbleType + type ) ) {
8176
				cur = cur.parentNode;
8177
			}
8178
			for ( ; cur; cur = cur.parentNode ) {
8179
				eventPath.push( cur );
8180
				tmp = cur;
8181
			}
8182
 
8183
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
8184
			if ( tmp === ( elem.ownerDocument || document ) ) {
8185
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
8186
			}
8187
		}
8188
 
8189
		// Fire handlers on the event path
8190
		i = 0;
8191
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8192
 
8193
			event.type = i > 1 ?
8194
				bubbleType :
8195
				special.bindType || type;
8196
 
8197
			// jQuery handler
8198
			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8199
				dataPriv.get( cur, "handle" );
8200
			if ( handle ) {
8201
				handle.apply( cur, data );
8202
			}
8203
 
8204
			// Native handler
8205
			handle = ontype && cur[ ontype ];
8206
			if ( handle && handle.apply && acceptData( cur ) ) {
8207
				event.result = handle.apply( cur, data );
8208
				if ( event.result === false ) {
8209
					event.preventDefault();
8210
				}
8211
			}
8212
		}
8213
		event.type = type;
8214
 
8215
		// If nobody prevented the default action, do it now
8216
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
8217
 
8218
			if ( ( !special._default ||
8219
				special._default.apply( eventPath.pop(), data ) === false ) &&
8220
				acceptData( elem ) ) {
8221
 
8222
				// Call a native DOM method on the target with the same name as the event.
8223
				// Don't do default actions on window, that's where global variables be (#6170)
8224
				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8225
 
8226
					// Don't re-trigger an onFOO event when we call its FOO() method
8227
					tmp = elem[ ontype ];
8228
 
8229
					if ( tmp ) {
8230
						elem[ ontype ] = null;
8231
					}
8232
 
8233
					// Prevent re-triggering of the same event, since we already bubbled it above
8234
					jQuery.event.triggered = type;
8235
					elem[ type ]();
8236
					jQuery.event.triggered = undefined;
8237
 
8238
					if ( tmp ) {
8239
						elem[ ontype ] = tmp;
8240
					}
8241
				}
8242
			}
8243
		}
8244
 
8245
		return event.result;
8246
	},
8247
 
8248
	// Piggyback on a donor event to simulate a different one
8249
	// Used only for `focus(in | out)` events
8250
	simulate: function( type, elem, event ) {
8251
		var e = jQuery.extend(
8252
			new jQuery.Event(),
8253
			event,
8254
			{
8255
				type: type,
8256
				isSimulated: true
8257
			}
8258
		);
8259
 
8260
		jQuery.event.trigger( e, null, elem );
8261
	}
8262
 
8263
} );
8264
 
8265
jQuery.fn.extend( {
8266
 
8267
	trigger: function( type, data ) {
8268
		return this.each( function() {
8269
			jQuery.event.trigger( type, data, this );
8270
		} );
8271
	},
8272
	triggerHandler: function( type, data ) {
8273
		var elem = this[ 0 ];
8274
		if ( elem ) {
8275
			return jQuery.event.trigger( type, data, elem, true );
8276
		}
8277
	}
8278
} );
8279
 
8280
 
8281
jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
8282
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8283
	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
8284
	function( i, name ) {
8285
 
8286
	// Handle event binding
8287
	jQuery.fn[ name ] = function( data, fn ) {
8288
		return arguments.length > 0 ?
8289
			this.on( name, null, data, fn ) :
8290
			this.trigger( name );
8291
	};
8292
} );
8293
 
8294
jQuery.fn.extend( {
8295
	hover: function( fnOver, fnOut ) {
8296
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8297
	}
8298
} );
8299
 
8300
 
8301
 
8302
 
8303
support.focusin = "onfocusin" in window;
8304
 
8305
 
8306
// Support: Firefox <=44
8307
// Firefox doesn't have focus(in | out) events
8308
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8309
//
8310
// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8311
// focus(in | out) events fire after focus & blur events,
8312
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8313
// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8314
if ( !support.focusin ) {
8315
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8316
 
8317
		// Attach a single capturing handler on the document while someone wants focusin/focusout
8318
		var handler = function( event ) {
8319
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8320
		};
8321
 
8322
		jQuery.event.special[ fix ] = {
8323
			setup: function() {
8324
				var doc = this.ownerDocument || this,
8325
					attaches = dataPriv.access( doc, fix );
8326
 
8327
				if ( !attaches ) {
8328
					doc.addEventListener( orig, handler, true );
8329
				}
8330
				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8331
			},
8332
			teardown: function() {
8333
				var doc = this.ownerDocument || this,
8334
					attaches = dataPriv.access( doc, fix ) - 1;
8335
 
8336
				if ( !attaches ) {
8337
					doc.removeEventListener( orig, handler, true );
8338
					dataPriv.remove( doc, fix );
8339
 
8340
				} else {
8341
					dataPriv.access( doc, fix, attaches );
8342
				}
8343
			}
8344
		};
8345
	} );
8346
}
8347
var location = window.location;
8348
 
8349
var nonce = jQuery.now();
8350
 
8351
var rquery = ( /\?/ );
8352
 
8353
 
8354
 
8355
// Cross-browser xml parsing
8356
jQuery.parseXML = function( data ) {
8357
	var xml;
8358
	if ( !data || typeof data !== "string" ) {
8359
		return null;
8360
	}
8361
 
8362
	// Support: IE 9 - 11 only
8363
	// IE throws on parseFromString with invalid input.
8364
	try {
8365
		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8366
	} catch ( e ) {
8367
		xml = undefined;
8368
	}
8369
 
8370
	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8371
		jQuery.error( "Invalid XML: " + data );
8372
	}
8373
	return xml;
8374
};
8375
 
8376
 
8377
var
8378
	rbracket = /\[\]$/,
8379
	rCRLF = /\r?\n/g,
8380
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8381
	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8382
 
8383
function buildParams( prefix, obj, traditional, add ) {
8384
	var name;
8385
 
8386
	if ( Array.isArray( obj ) ) {
8387
 
8388
		// Serialize array item.
8389
		jQuery.each( obj, function( i, v ) {
8390
			if ( traditional || rbracket.test( prefix ) ) {
8391
 
8392
				// Treat each array item as a scalar.
8393
				add( prefix, v );
8394
 
8395
			} else {
8396
 
8397
				// Item is non-scalar (array or object), encode its numeric index.
8398
				buildParams(
8399
					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
8400
					v,
8401
					traditional,
8402
					add
8403
				);
8404
			}
8405
		} );
8406
 
8407
	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
8408
 
8409
		// Serialize object item.
8410
		for ( name in obj ) {
8411
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8412
		}
8413
 
8414
	} else {
8415
 
8416
		// Serialize scalar item.
8417
		add( prefix, obj );
8418
	}
8419
}
8420
 
8421
// Serialize an array of form elements or a set of
8422
// key/values into a query string
8423
jQuery.param = function( a, traditional ) {
8424
	var prefix,
8425
		s = [],
8426
		add = function( key, valueOrFunction ) {
8427
 
8428
			// If value is a function, invoke it and use its return value
8429
			var value = jQuery.isFunction( valueOrFunction ) ?
8430
				valueOrFunction() :
8431
				valueOrFunction;
8432
 
8433
			s[ s.length ] = encodeURIComponent( key ) + "=" +
8434
				encodeURIComponent( value == null ? "" : value );
8435
		};
8436
 
8437
	// If an array was passed in, assume that it is an array of form elements.
8438
	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8439
 
8440
		// Serialize the form elements
8441
		jQuery.each( a, function() {
8442
			add( this.name, this.value );
8443
		} );
8444
 
8445
	} else {
8446
 
8447
		// If traditional, encode the "old" way (the way 1.3.2 or older
8448
		// did it), otherwise encode params recursively.
8449
		for ( prefix in a ) {
8450
			buildParams( prefix, a[ prefix ], traditional, add );
8451
		}
8452
	}
8453
 
8454
	// Return the resulting serialization
8455
	return s.join( "&" );
8456
};
8457
 
8458
jQuery.fn.extend( {
8459
	serialize: function() {
8460
		return jQuery.param( this.serializeArray() );
8461
	},
8462
	serializeArray: function() {
8463
		return this.map( function() {
8464
 
8465
			// Can add propHook for "elements" to filter or add form elements
8466
			var elements = jQuery.prop( this, "elements" );
8467
			return elements ? jQuery.makeArray( elements ) : this;
8468
		} )
8469
		.filter( function() {
8470
			var type = this.type;
8471
 
8472
			// Use .is( ":disabled" ) so that fieldset[disabled] works
8473
			return this.name && !jQuery( this ).is( ":disabled" ) &&
8474
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8475
				( this.checked || !rcheckableType.test( type ) );
8476
		} )
8477
		.map( function( i, elem ) {
8478
			var val = jQuery( this ).val();
8479
 
8480
			if ( val == null ) {
8481
				return null;
8482
			}
8483
 
8484
			if ( Array.isArray( val ) ) {
8485
				return jQuery.map( val, function( val ) {
8486
					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8487
				} );
8488
			}
8489
 
8490
			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8491
		} ).get();
8492
	}
8493
} );
8494
 
8495
 
8496
var
8497
	r20 = /%20/g,
8498
	rhash = /#.*$/,
8499
	rantiCache = /([?&])_=[^&]*/,
8500
	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8501
 
8502
	// #7653, #8125, #8152: local protocol detection
8503
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8504
	rnoContent = /^(?:GET|HEAD)$/,
8505
	rprotocol = /^\/\//,
8506
 
8507
	/* Prefilters
8508
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8509
	 * 2) These are called:
8510
	 *    - BEFORE asking for a transport
8511
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8512
	 * 3) key is the dataType
8513
	 * 4) the catchall symbol "*" can be used
8514
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8515
	 */
8516
	prefilters = {},
8517
 
8518
	/* Transports bindings
8519
	 * 1) key is the dataType
8520
	 * 2) the catchall symbol "*" can be used
8521
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8522
	 */
8523
	transports = {},
8524
 
8525
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8526
	allTypes = "*/".concat( "*" ),
8527
 
8528
	// Anchor tag for parsing the document origin
8529
	originAnchor = document.createElement( "a" );
8530
	originAnchor.href = location.href;
8531
 
8532
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8533
function addToPrefiltersOrTransports( structure ) {
8534
 
8535
	// dataTypeExpression is optional and defaults to "*"
8536
	return function( dataTypeExpression, func ) {
8537
 
8538
		if ( typeof dataTypeExpression !== "string" ) {
8539
			func = dataTypeExpression;
8540
			dataTypeExpression = "*";
8541
		}
8542
 
8543
		var dataType,
8544
			i = 0,
8545
			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8546
 
8547
		if ( jQuery.isFunction( func ) ) {
8548
 
8549
			// For each dataType in the dataTypeExpression
8550
			while ( ( dataType = dataTypes[ i++ ] ) ) {
8551
 
8552
				// Prepend if requested
8553
				if ( dataType[ 0 ] === "+" ) {
8554
					dataType = dataType.slice( 1 ) || "*";
8555
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
8556
 
8557
				// Otherwise append
8558
				} else {
8559
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
8560
				}
8561
			}
8562
		}
8563
	};
8564
}
8565
 
8566
// Base inspection function for prefilters and transports
8567
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8568
 
8569
	var inspected = {},
8570
		seekingTransport = ( structure === transports );
8571
 
8572
	function inspect( dataType ) {
8573
		var selected;
8574
		inspected[ dataType ] = true;
8575
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8576
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8577
			if ( typeof dataTypeOrTransport === "string" &&
8578
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8579
 
8580
				options.dataTypes.unshift( dataTypeOrTransport );
8581
				inspect( dataTypeOrTransport );
8582
				return false;
8583
			} else if ( seekingTransport ) {
8584
				return !( selected = dataTypeOrTransport );
8585
			}
8586
		} );
8587
		return selected;
8588
	}
8589
 
8590
	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8591
}
8592
 
8593
// A special extend for ajax options
8594
// that takes "flat" options (not to be deep extended)
8595
// Fixes #9887
8596
function ajaxExtend( target, src ) {
8597
	var key, deep,
8598
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8599
 
8600
	for ( key in src ) {
8601
		if ( src[ key ] !== undefined ) {
8602
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
8603
		}
8604
	}
8605
	if ( deep ) {
8606
		jQuery.extend( true, target, deep );
8607
	}
8608
 
8609
	return target;
8610
}
8611
 
8612
/* Handles responses to an ajax request:
8613
 * - finds the right dataType (mediates between content-type and expected dataType)
8614
 * - returns the corresponding response
8615
 */
8616
function ajaxHandleResponses( s, jqXHR, responses ) {
8617
 
8618
	var ct, type, finalDataType, firstDataType,
8619
		contents = s.contents,
8620
		dataTypes = s.dataTypes;
8621
 
8622
	// Remove auto dataType and get content-type in the process
8623
	while ( dataTypes[ 0 ] === "*" ) {
8624
		dataTypes.shift();
8625
		if ( ct === undefined ) {
8626
			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
8627
		}
8628
	}
8629
 
8630
	// Check if we're dealing with a known content-type
8631
	if ( ct ) {
8632
		for ( type in contents ) {
8633
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8634
				dataTypes.unshift( type );
8635
				break;
8636
			}
8637
		}
8638
	}
8639
 
8640
	// Check to see if we have a response for the expected dataType
8641
	if ( dataTypes[ 0 ] in responses ) {
8642
		finalDataType = dataTypes[ 0 ];
8643
	} else {
8644
 
8645
		// Try convertible dataTypes
8646
		for ( type in responses ) {
8647
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
8648
				finalDataType = type;
8649
				break;
8650
			}
8651
			if ( !firstDataType ) {
8652
				firstDataType = type;
8653
			}
8654
		}
8655
 
8656
		// Or just use first one
8657
		finalDataType = finalDataType || firstDataType;
8658
	}
8659
 
8660
	// If we found a dataType
8661
	// We add the dataType to the list if needed
8662
	// and return the corresponding response
8663
	if ( finalDataType ) {
8664
		if ( finalDataType !== dataTypes[ 0 ] ) {
8665
			dataTypes.unshift( finalDataType );
8666
		}
8667
		return responses[ finalDataType ];
8668
	}
8669
}
8670
 
8671
/* Chain conversions given the request and the original response
8672
 * Also sets the responseXXX fields on the jqXHR instance
8673
 */
8674
function ajaxConvert( s, response, jqXHR, isSuccess ) {
8675
	var conv2, current, conv, tmp, prev,
8676
		converters = {},
8677
 
8678
		// Work with a copy of dataTypes in case we need to modify it for conversion
8679
		dataTypes = s.dataTypes.slice();
8680
 
8681
	// Create converters map with lowercased keys
8682
	if ( dataTypes[ 1 ] ) {
8683
		for ( conv in s.converters ) {
8684
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8685
		}
8686
	}
8687
 
8688
	current = dataTypes.shift();
8689
 
8690
	// Convert to each sequential dataType
8691
	while ( current ) {
8692
 
8693
		if ( s.responseFields[ current ] ) {
8694
			jqXHR[ s.responseFields[ current ] ] = response;
8695
		}
8696
 
8697
		// Apply the dataFilter if provided
8698
		if ( !prev && isSuccess && s.dataFilter ) {
8699
			response = s.dataFilter( response, s.dataType );
8700
		}
8701
 
8702
		prev = current;
8703
		current = dataTypes.shift();
8704
 
8705
		if ( current ) {
8706
 
8707
			// There's only work to do if current dataType is non-auto
8708
			if ( current === "*" ) {
8709
 
8710
				current = prev;
8711
 
8712
			// Convert response if prev dataType is non-auto and differs from current
8713
			} else if ( prev !== "*" && prev !== current ) {
8714
 
8715
				// Seek a direct converter
8716
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8717
 
8718
				// If none found, seek a pair
8719
				if ( !conv ) {
8720
					for ( conv2 in converters ) {
8721
 
8722
						// If conv2 outputs current
8723
						tmp = conv2.split( " " );
8724
						if ( tmp[ 1 ] === current ) {
8725
 
8726
							// If prev can be converted to accepted input
8727
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
8728
								converters[ "* " + tmp[ 0 ] ];
8729
							if ( conv ) {
8730
 
8731
								// Condense equivalence converters
8732
								if ( conv === true ) {
8733
									conv = converters[ conv2 ];
8734
 
8735
								// Otherwise, insert the intermediate dataType
8736
								} else if ( converters[ conv2 ] !== true ) {
8737
									current = tmp[ 0 ];
8738
									dataTypes.unshift( tmp[ 1 ] );
8739
								}
8740
								break;
8741
							}
8742
						}
8743
					}
8744
				}
8745
 
8746
				// Apply converter (if not an equivalence)
8747
				if ( conv !== true ) {
8748
 
8749
					// Unless errors are allowed to bubble, catch and return them
8750
					if ( conv && s.throws ) {
8751
						response = conv( response );
8752
					} else {
8753
						try {
8754
							response = conv( response );
8755
						} catch ( e ) {
8756
							return {
8757
								state: "parsererror",
8758
								error: conv ? e : "No conversion from " + prev + " to " + current
8759
							};
8760
						}
8761
					}
8762
				}
8763
			}
8764
		}
8765
	}
8766
 
8767
	return { state: "success", data: response };
8768
}
8769
 
8770
jQuery.extend( {
8771
 
8772
	// Counter for holding the number of active queries
8773
	active: 0,
8774
 
8775
	// Last-Modified header cache for next request
8776
	lastModified: {},
8777
	etag: {},
8778
 
8779
	ajaxSettings: {
8780
		url: location.href,
8781
		type: "GET",
8782
		isLocal: rlocalProtocol.test( location.protocol ),
8783
		global: true,
8784
		processData: true,
8785
		async: true,
8786
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8787
 
8788
		/*
8789
		timeout: 0,
8790
		data: null,
8791
		dataType: null,
8792
		username: null,
8793
		password: null,
8794
		cache: null,
8795
		throws: false,
8796
		traditional: false,
8797
		headers: {},
8798
		*/
8799
 
8800
		accepts: {
8801
			"*": allTypes,
8802
			text: "text/plain",
8803
			html: "text/html",
8804
			xml: "application/xml, text/xml",
8805
			json: "application/json, text/javascript"
8806
		},
8807
 
8808
		contents: {
8809
			xml: /\bxml\b/,
8810
			html: /\bhtml/,
8811
			json: /\bjson\b/
8812
		},
8813
 
8814
		responseFields: {
8815
			xml: "responseXML",
8816
			text: "responseText",
8817
			json: "responseJSON"
8818
		},
8819
 
8820
		// Data converters
8821
		// Keys separate source (or catchall "*") and destination types with a single space
8822
		converters: {
8823
 
8824
			// Convert anything to text
8825
			"* text": String,
8826
 
8827
			// Text to html (true = no transformation)
8828
			"text html": true,
8829
 
8830
			// Evaluate text as a json expression
8831
			"text json": JSON.parse,
8832
 
8833
			// Parse text as xml
8834
			"text xml": jQuery.parseXML
8835
		},
8836
 
8837
		// For options that shouldn't be deep extended:
8838
		// you can add your own custom options here if
8839
		// and when you create one that shouldn't be
8840
		// deep extended (see ajaxExtend)
8841
		flatOptions: {
8842
			url: true,
8843
			context: true
8844
		}
8845
	},
8846
 
8847
	// Creates a full fledged settings object into target
8848
	// with both ajaxSettings and settings fields.
8849
	// If target is omitted, writes into ajaxSettings.
8850
	ajaxSetup: function( target, settings ) {
8851
		return settings ?
8852
 
8853
			// Building a settings object
8854
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8855
 
8856
			// Extending ajaxSettings
8857
			ajaxExtend( jQuery.ajaxSettings, target );
8858
	},
8859
 
8860
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8861
	ajaxTransport: addToPrefiltersOrTransports( transports ),
8862
 
8863
	// Main method
8864
	ajax: function( url, options ) {
8865
 
8866
		// If url is an object, simulate pre-1.5 signature
8867
		if ( typeof url === "object" ) {
8868
			options = url;
8869
			url = undefined;
8870
		}
8871
 
8872
		// Force options to be an object
8873
		options = options || {};
8874
 
8875
		var transport,
8876
 
8877
			// URL without anti-cache param
8878
			cacheURL,
8879
 
8880
			// Response headers
8881
			responseHeadersString,
8882
			responseHeaders,
8883
 
8884
			// timeout handle
8885
			timeoutTimer,
8886
 
8887
			// Url cleanup var
8888
			urlAnchor,
8889
 
8890
			// Request state (becomes false upon send and true upon completion)
8891
			completed,
8892
 
8893
			// To know if global events are to be dispatched
8894
			fireGlobals,
8895
 
8896
			// Loop variable
8897
			i,
8898
 
8899
			// uncached part of the url
8900
			uncached,
8901
 
8902
			// Create the final options object
8903
			s = jQuery.ajaxSetup( {}, options ),
8904
 
8905
			// Callbacks context
8906
			callbackContext = s.context || s,
8907
 
8908
			// Context for global events is callbackContext if it is a DOM node or jQuery collection
8909
			globalEventContext = s.context &&
8910
				( callbackContext.nodeType || callbackContext.jquery ) ?
8911
					jQuery( callbackContext ) :
8912
					jQuery.event,
8913
 
8914
			// Deferreds
8915
			deferred = jQuery.Deferred(),
8916
			completeDeferred = jQuery.Callbacks( "once memory" ),
8917
 
8918
			// Status-dependent callbacks
8919
			statusCode = s.statusCode || {},
8920
 
8921
			// Headers (they are sent all at once)
8922
			requestHeaders = {},
8923
			requestHeadersNames = {},
8924
 
8925
			// Default abort message
8926
			strAbort = "canceled",
8927
 
8928
			// Fake xhr
8929
			jqXHR = {
8930
				readyState: 0,
8931
 
8932
				// Builds headers hashtable if needed
8933
				getResponseHeader: function( key ) {
8934
					var match;
8935
					if ( completed ) {
8936
						if ( !responseHeaders ) {
8937
							responseHeaders = {};
8938
							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
8939
								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
8940
							}
8941
						}
8942
						match = responseHeaders[ key.toLowerCase() ];
8943
					}
8944
					return match == null ? null : match;
8945
				},
8946
 
8947
				// Raw string
8948
				getAllResponseHeaders: function() {
8949
					return completed ? responseHeadersString : null;
8950
				},
8951
 
8952
				// Caches the header
8953
				setRequestHeader: function( name, value ) {
8954
					if ( completed == null ) {
8955
						name = requestHeadersNames[ name.toLowerCase() ] =
8956
							requestHeadersNames[ name.toLowerCase() ] || name;
8957
						requestHeaders[ name ] = value;
8958
					}
8959
					return this;
8960
				},
8961
 
8962
				// Overrides response content-type header
8963
				overrideMimeType: function( type ) {
8964
					if ( completed == null ) {
8965
						s.mimeType = type;
8966
					}
8967
					return this;
8968
				},
8969
 
8970
				// Status-dependent callbacks
8971
				statusCode: function( map ) {
8972
					var code;
8973
					if ( map ) {
8974
						if ( completed ) {
8975
 
8976
							// Execute the appropriate callbacks
8977
							jqXHR.always( map[ jqXHR.status ] );
8978
						} else {
8979
 
8980
							// Lazy-add the new callbacks in a way that preserves old ones
8981
							for ( code in map ) {
8982
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
8983
							}
8984
						}
8985
					}
8986
					return this;
8987
				},
8988
 
8989
				// Cancel the request
8990
				abort: function( statusText ) {
8991
					var finalText = statusText || strAbort;
8992
					if ( transport ) {
8993
						transport.abort( finalText );
8994
					}
8995
					done( 0, finalText );
8996
					return this;
8997
				}
8998
			};
8999
 
9000
		// Attach deferreds
9001
		deferred.promise( jqXHR );
9002
 
9003
		// Add protocol if not provided (prefilters might expect it)
9004
		// Handle falsy url in the settings object (#10093: consistency with old signature)
9005
		// We also use the url parameter if available
9006
		s.url = ( ( url || s.url || location.href ) + "" )
9007
			.replace( rprotocol, location.protocol + "//" );
9008
 
9009
		// Alias method option to type as per ticket #12004
9010
		s.type = options.method || options.type || s.method || s.type;
9011
 
9012
		// Extract dataTypes list
9013
		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
9014
 
9015
		// A cross-domain request is in order when the origin doesn't match the current origin.
9016
		if ( s.crossDomain == null ) {
9017
			urlAnchor = document.createElement( "a" );
9018
 
9019
			// Support: IE <=8 - 11, Edge 12 - 13
9020
			// IE throws exception on accessing the href property if url is malformed,
9021
			// e.g. http://example.com:80x/
9022
			try {
9023
				urlAnchor.href = s.url;
9024
 
9025
				// Support: IE <=8 - 11 only
9026
				// Anchor's host property isn't correctly set when s.url is relative
9027
				urlAnchor.href = urlAnchor.href;
9028
				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
9029
					urlAnchor.protocol + "//" + urlAnchor.host;
9030
			} catch ( e ) {
9031
 
9032
				// If there is an error parsing the URL, assume it is crossDomain,
9033
				// it can be rejected by the transport if it is invalid
9034
				s.crossDomain = true;
9035
			}
9036
		}
9037
 
9038
		// Convert data if not already a string
9039
		if ( s.data && s.processData && typeof s.data !== "string" ) {
9040
			s.data = jQuery.param( s.data, s.traditional );
9041
		}
9042
 
9043
		// Apply prefilters
9044
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9045
 
9046
		// If request was aborted inside a prefilter, stop there
9047
		if ( completed ) {
9048
			return jqXHR;
9049
		}
9050
 
9051
		// We can fire global events as of now if asked to
9052
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9053
		fireGlobals = jQuery.event && s.global;
9054
 
9055
		// Watch for a new set of requests
9056
		if ( fireGlobals && jQuery.active++ === 0 ) {
9057
			jQuery.event.trigger( "ajaxStart" );
9058
		}
9059
 
9060
		// Uppercase the type
9061
		s.type = s.type.toUpperCase();
9062
 
9063
		// Determine if request has content
9064
		s.hasContent = !rnoContent.test( s.type );
9065
 
9066
		// Save the URL in case we're toying with the If-Modified-Since
9067
		// and/or If-None-Match header later on
9068
		// Remove hash to simplify url manipulation
9069
		cacheURL = s.url.replace( rhash, "" );
9070
 
9071
		// More options handling for requests with no content
9072
		if ( !s.hasContent ) {
9073
 
9074
			// Remember the hash so we can put it back
9075
			uncached = s.url.slice( cacheURL.length );
9076
 
9077
			// If data is available, append data to url
9078
			if ( s.data ) {
9079
				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9080
 
9081
				// #9682: remove data so that it's not used in an eventual retry
9082
				delete s.data;
9083
			}
9084
 
9085
			// Add or update anti-cache param if needed
9086
			if ( s.cache === false ) {
9087
				cacheURL = cacheURL.replace( rantiCache, "$1" );
9088
				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9089
			}
9090
 
9091
			// Put hash and anti-cache on the URL that will be requested (gh-1732)
9092
			s.url = cacheURL + uncached;
9093
 
9094
		// Change '%20' to '+' if this is encoded form body content (gh-2658)
9095
		} else if ( s.data && s.processData &&
9096
			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
9097
			s.data = s.data.replace( r20, "+" );
9098
		}
9099
 
9100
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9101
		if ( s.ifModified ) {
9102
			if ( jQuery.lastModified[ cacheURL ] ) {
9103
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9104
			}
9105
			if ( jQuery.etag[ cacheURL ] ) {
9106
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9107
			}
9108
		}
9109
 
9110
		// Set the correct header, if data is being sent
9111
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9112
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9113
		}
9114
 
9115
		// Set the Accepts header for the server, depending on the dataType
9116
		jqXHR.setRequestHeader(
9117
			"Accept",
9118
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
9119
				s.accepts[ s.dataTypes[ 0 ] ] +
9120
					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9121
				s.accepts[ "*" ]
9122
		);
9123
 
9124
		// Check for headers option
9125
		for ( i in s.headers ) {
9126
			jqXHR.setRequestHeader( i, s.headers[ i ] );
9127
		}
9128
 
9129
		// Allow custom headers/mimetypes and early abort
9130
		if ( s.beforeSend &&
9131
			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
9132
 
9133
			// Abort if not done already and return
9134
			return jqXHR.abort();
9135
		}
9136
 
9137
		// Aborting is no longer a cancellation
9138
		strAbort = "abort";
9139
 
9140
		// Install callbacks on deferreds
9141
		completeDeferred.add( s.complete );
9142
		jqXHR.done( s.success );
9143
		jqXHR.fail( s.error );
9144
 
9145
		// Get transport
9146
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9147
 
9148
		// If no transport, we auto-abort
9149
		if ( !transport ) {
9150
			done( -1, "No Transport" );
9151
		} else {
9152
			jqXHR.readyState = 1;
9153
 
9154
			// Send global event
9155
			if ( fireGlobals ) {
9156
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9157
			}
9158
 
9159
			// If request was aborted inside ajaxSend, stop there
9160
			if ( completed ) {
9161
				return jqXHR;
9162
			}
9163
 
9164
			// Timeout
9165
			if ( s.async && s.timeout > 0 ) {
9166
				timeoutTimer = window.setTimeout( function() {
9167
					jqXHR.abort( "timeout" );
9168
				}, s.timeout );
9169
			}
9170
 
9171
			try {
9172
				completed = false;
9173
				transport.send( requestHeaders, done );
9174
			} catch ( e ) {
9175
 
9176
				// Rethrow post-completion exceptions
9177
				if ( completed ) {
9178
					throw e;
9179
				}
9180
 
9181
				// Propagate others as results
9182
				done( -1, e );
9183
			}
9184
		}
9185
 
9186
		// Callback for when everything is done
9187
		function done( status, nativeStatusText, responses, headers ) {
9188
			var isSuccess, success, error, response, modified,
9189
				statusText = nativeStatusText;
9190
 
9191
			// Ignore repeat invocations
9192
			if ( completed ) {
9193
				return;
9194
			}
9195
 
9196
			completed = true;
9197
 
9198
			// Clear timeout if it exists
9199
			if ( timeoutTimer ) {
9200
				window.clearTimeout( timeoutTimer );
9201
			}
9202
 
9203
			// Dereference transport for early garbage collection
9204
			// (no matter how long the jqXHR object will be used)
9205
			transport = undefined;
9206
 
9207
			// Cache response headers
9208
			responseHeadersString = headers || "";
9209
 
9210
			// Set readyState
9211
			jqXHR.readyState = status > 0 ? 4 : 0;
9212
 
9213
			// Determine if successful
9214
			isSuccess = status >= 200 && status < 300 || status === 304;
9215
 
9216
			// Get response data
9217
			if ( responses ) {
9218
				response = ajaxHandleResponses( s, jqXHR, responses );
9219
			}
9220
 
9221
			// Convert no matter what (that way responseXXX fields are always set)
9222
			response = ajaxConvert( s, response, jqXHR, isSuccess );
9223
 
9224
			// If successful, handle type chaining
9225
			if ( isSuccess ) {
9226
 
9227
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9228
				if ( s.ifModified ) {
9229
					modified = jqXHR.getResponseHeader( "Last-Modified" );
9230
					if ( modified ) {
9231
						jQuery.lastModified[ cacheURL ] = modified;
9232
					}
9233
					modified = jqXHR.getResponseHeader( "etag" );
9234
					if ( modified ) {
9235
						jQuery.etag[ cacheURL ] = modified;
9236
					}
9237
				}
9238
 
9239
				// if no content
9240
				if ( status === 204 || s.type === "HEAD" ) {
9241
					statusText = "nocontent";
9242
 
9243
				// if not modified
9244
				} else if ( status === 304 ) {
9245
					statusText = "notmodified";
9246
 
9247
				// If we have data, let's convert it
9248
				} else {
9249
					statusText = response.state;
9250
					success = response.data;
9251
					error = response.error;
9252
					isSuccess = !error;
9253
				}
9254
			} else {
9255
 
9256
				// Extract error from statusText and normalize for non-aborts
9257
				error = statusText;
9258
				if ( status || !statusText ) {
9259
					statusText = "error";
9260
					if ( status < 0 ) {
9261
						status = 0;
9262
					}
9263
				}
9264
			}
9265
 
9266
			// Set data for the fake xhr object
9267
			jqXHR.status = status;
9268
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9269
 
9270
			// Success/Error
9271
			if ( isSuccess ) {
9272
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
9273
			} else {
9274
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
9275
			}
9276
 
9277
			// Status-dependent callbacks
9278
			jqXHR.statusCode( statusCode );
9279
			statusCode = undefined;
9280
 
9281
			if ( fireGlobals ) {
9282
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9283
					[ jqXHR, s, isSuccess ? success : error ] );
9284
			}
9285
 
9286
			// Complete
9287
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9288
 
9289
			if ( fireGlobals ) {
9290
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9291
 
9292
				// Handle the global AJAX counter
9293
				if ( !( --jQuery.active ) ) {
9294
					jQuery.event.trigger( "ajaxStop" );
9295
				}
9296
			}
9297
		}
9298
 
9299
		return jqXHR;
9300
	},
9301
 
9302
	getJSON: function( url, data, callback ) {
9303
		return jQuery.get( url, data, callback, "json" );
9304
	},
9305
 
9306
	getScript: function( url, callback ) {
9307
		return jQuery.get( url, undefined, callback, "script" );
9308
	}
9309
} );
9310
 
9311
jQuery.each( [ "get", "post" ], function( i, method ) {
9312
	jQuery[ method ] = function( url, data, callback, type ) {
9313
 
9314
		// Shift arguments if data argument was omitted
9315
		if ( jQuery.isFunction( data ) ) {
9316
			type = type || callback;
9317
			callback = data;
9318
			data = undefined;
9319
		}
9320
 
9321
		// The url can be an options object (which then must have .url)
9322
		return jQuery.ajax( jQuery.extend( {
9323
			url: url,
9324
			type: method,
9325
			dataType: type,
9326
			data: data,
9327
			success: callback
9328
		}, jQuery.isPlainObject( url ) && url ) );
9329
	};
9330
} );
9331
 
9332
 
9333
jQuery._evalUrl = function( url ) {
9334
	return jQuery.ajax( {
9335
		url: url,
9336
 
9337
		// Make this explicit, since user can override this through ajaxSetup (#11264)
9338
		type: "GET",
9339
		dataType: "script",
9340
		cache: true,
9341
		async: false,
9342
		global: false,
9343
		"throws": true
9344
	} );
9345
};
9346
 
9347
 
9348
jQuery.fn.extend( {
9349
	wrapAll: function( html ) {
9350
		var wrap;
9351
 
9352
		if ( this[ 0 ] ) {
9353
			if ( jQuery.isFunction( html ) ) {
9354
				html = html.call( this[ 0 ] );
9355
			}
9356
 
9357
			// The elements to wrap the target around
9358
			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
9359
 
9360
			if ( this[ 0 ].parentNode ) {
9361
				wrap.insertBefore( this[ 0 ] );
9362
			}
9363
 
9364
			wrap.map( function() {
9365
				var elem = this;
9366
 
9367
				while ( elem.firstElementChild ) {
9368
					elem = elem.firstElementChild;
9369
				}
9370
 
9371
				return elem;
9372
			} ).append( this );
9373
		}
9374
 
9375
		return this;
9376
	},
9377
 
9378
	wrapInner: function( html ) {
9379
		if ( jQuery.isFunction( html ) ) {
9380
			return this.each( function( i ) {
9381
				jQuery( this ).wrapInner( html.call( this, i ) );
9382
			} );
9383
		}
9384
 
9385
		return this.each( function() {
9386
			var self = jQuery( this ),
9387
				contents = self.contents();
9388
 
9389
			if ( contents.length ) {
9390
				contents.wrapAll( html );
9391
 
9392
			} else {
9393
				self.append( html );
9394
			}
9395
		} );
9396
	},
9397
 
9398
	wrap: function( html ) {
9399
		var isFunction = jQuery.isFunction( html );
9400
 
9401
		return this.each( function( i ) {
9402
			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
9403
		} );
9404
	},
9405
 
9406
	unwrap: function( selector ) {
9407
		this.parent( selector ).not( "body" ).each( function() {
9408
			jQuery( this ).replaceWith( this.childNodes );
9409
		} );
9410
		return this;
9411
	}
9412
} );
9413
 
9414
 
9415
jQuery.expr.pseudos.hidden = function( elem ) {
9416
	return !jQuery.expr.pseudos.visible( elem );
9417
};
9418
jQuery.expr.pseudos.visible = function( elem ) {
9419
	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
9420
};
9421
 
9422
 
9423
 
9424
 
9425
jQuery.ajaxSettings.xhr = function() {
9426
	try {
9427
		return new window.XMLHttpRequest();
9428
	} catch ( e ) {}
9429
};
9430
 
9431
var xhrSuccessStatus = {
9432
 
9433
		// File protocol always yields status code 0, assume 200
9434
		0: 200,
9435
 
9436
		// Support: IE <=9 only
9437
		// #1450: sometimes IE returns 1223 when it should be 204
9438
		1223: 204
9439
	},
9440
	xhrSupported = jQuery.ajaxSettings.xhr();
9441
 
9442
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9443
support.ajax = xhrSupported = !!xhrSupported;
9444
 
9445
jQuery.ajaxTransport( function( options ) {
9446
	var callback, errorCallback;
9447
 
9448
	// Cross domain only allowed if supported through XMLHttpRequest
9449
	if ( support.cors || xhrSupported && !options.crossDomain ) {
9450
		return {
9451
			send: function( headers, complete ) {
9452
				var i,
9453
					xhr = options.xhr();
9454
 
9455
				xhr.open(
9456
					options.type,
9457
					options.url,
9458
					options.async,
9459
					options.username,
9460
					options.password
9461
				);
9462
 
9463
				// Apply custom fields if provided
9464
				if ( options.xhrFields ) {
9465
					for ( i in options.xhrFields ) {
9466
						xhr[ i ] = options.xhrFields[ i ];
9467
					}
9468
				}
9469
 
9470
				// Override mime type if needed
9471
				if ( options.mimeType && xhr.overrideMimeType ) {
9472
					xhr.overrideMimeType( options.mimeType );
9473
				}
9474
 
9475
				// X-Requested-With header
9476
				// For cross-domain requests, seeing as conditions for a preflight are
9477
				// akin to a jigsaw puzzle, we simply never set it to be sure.
9478
				// (it can always be set on a per-request basis or even using ajaxSetup)
9479
				// For same-domain requests, won't change header if already provided.
9480
				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
9481
					headers[ "X-Requested-With" ] = "XMLHttpRequest";
9482
				}
9483
 
9484
				// Set headers
9485
				for ( i in headers ) {
9486
					xhr.setRequestHeader( i, headers[ i ] );
9487
				}
9488
 
9489
				// Callback
9490
				callback = function( type ) {
9491
					return function() {
9492
						if ( callback ) {
9493
							callback = errorCallback = xhr.onload =
9494
								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
9495
 
9496
							if ( type === "abort" ) {
9497
								xhr.abort();
9498
							} else if ( type === "error" ) {
9499
 
9500
								// Support: IE <=9 only
9501
								// On a manual native abort, IE9 throws
9502
								// errors on any property access that is not readyState
9503
								if ( typeof xhr.status !== "number" ) {
9504
									complete( 0, "error" );
9505
								} else {
9506
									complete(
9507
 
9508
										// File: protocol always yields status 0; see #8605, #14207
9509
										xhr.status,
9510
										xhr.statusText
9511
									);
9512
								}
9513
							} else {
9514
								complete(
9515
									xhrSuccessStatus[ xhr.status ] || xhr.status,
9516
									xhr.statusText,
9517
 
9518
									// Support: IE <=9 only
9519
									// IE9 has no XHR2 but throws on binary (trac-11426)
9520
									// For XHR2 non-text, let the caller handle it (gh-2498)
9521
									( xhr.responseType || "text" ) !== "text"  ||
9522
									typeof xhr.responseText !== "string" ?
9523
										{ binary: xhr.response } :
9524
										{ text: xhr.responseText },
9525
									xhr.getAllResponseHeaders()
9526
								);
9527
							}
9528
						}
9529
					};
9530
				};
9531
 
9532
				// Listen to events
9533
				xhr.onload = callback();
9534
				errorCallback = xhr.onerror = callback( "error" );
9535
 
9536
				// Support: IE 9 only
9537
				// Use onreadystatechange to replace onabort
9538
				// to handle uncaught aborts
9539
				if ( xhr.onabort !== undefined ) {
9540
					xhr.onabort = errorCallback;
9541
				} else {
9542
					xhr.onreadystatechange = function() {
9543
 
9544
						// Check readyState before timeout as it changes
9545
						if ( xhr.readyState === 4 ) {
9546
 
9547
							// Allow onerror to be called first,
9548
							// but that will not handle a native abort
9549
							// Also, save errorCallback to a variable
9550
							// as xhr.onerror cannot be accessed
9551
							window.setTimeout( function() {
9552
								if ( callback ) {
9553
									errorCallback();
9554
								}
9555
							} );
9556
						}
9557
					};
9558
				}
9559
 
9560
				// Create the abort callback
9561
				callback = callback( "abort" );
9562
 
9563
				try {
9564
 
9565
					// Do send the request (this may raise an exception)
9566
					xhr.send( options.hasContent && options.data || null );
9567
				} catch ( e ) {
9568
 
9569
					// #14683: Only rethrow if this hasn't been notified as an error yet
9570
					if ( callback ) {
9571
						throw e;
9572
					}
9573
				}
9574
			},
9575
 
9576
			abort: function() {
9577
				if ( callback ) {
9578
					callback();
9579
				}
9580
			}
9581
		};
9582
	}
9583
} );
9584
 
9585
 
9586
 
9587
 
9588
// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
9589
jQuery.ajaxPrefilter( function( s ) {
9590
	if ( s.crossDomain ) {
9591
		s.contents.script = false;
9592
	}
9593
} );
9594
 
9595
// Install script dataType
9596
jQuery.ajaxSetup( {
9597
	accepts: {
9598
		script: "text/javascript, application/javascript, " +
9599
			"application/ecmascript, application/x-ecmascript"
9600
	},
9601
	contents: {
9602
		script: /\b(?:java|ecma)script\b/
9603
	},
9604
	converters: {
9605
		"text script": function( text ) {
9606
			jQuery.globalEval( text );
9607
			return text;
9608
		}
9609
	}
9610
} );
9611
 
9612
// Handle cache's special case and crossDomain
9613
jQuery.ajaxPrefilter( "script", function( s ) {
9614
	if ( s.cache === undefined ) {
9615
		s.cache = false;
9616
	}
9617
	if ( s.crossDomain ) {
9618
		s.type = "GET";
9619
	}
9620
} );
9621
 
9622
// Bind script tag hack transport
9623
jQuery.ajaxTransport( "script", function( s ) {
9624
 
9625
	// This transport only deals with cross domain requests
9626
	if ( s.crossDomain ) {
9627
		var script, callback;
9628
		return {
9629
			send: function( _, complete ) {
9630
				script = jQuery( "<script>" ).prop( {
9631
					charset: s.scriptCharset,
9632
					src: s.url
9633
				} ).on(
9634
					"load error",
9635
					callback = function( evt ) {
9636
						script.remove();
9637
						callback = null;
9638
						if ( evt ) {
9639
							complete( evt.type === "error" ? 404 : 200, evt.type );
9640
						}
9641
					}
9642
				);
9643
 
9644
				// Use native DOM manipulation to avoid our domManip AJAX trickery
9645
				document.head.appendChild( script[ 0 ] );
9646
			},
9647
			abort: function() {
9648
				if ( callback ) {
9649
					callback();
9650
				}
9651
			}
9652
		};
9653
	}
9654
} );
9655
 
9656
 
9657
 
9658
 
9659
var oldCallbacks = [],
9660
	rjsonp = /(=)\?(?=&|$)|\?\?/;
9661
 
9662
// Default jsonp settings
9663
jQuery.ajaxSetup( {
9664
	jsonp: "callback",
9665
	jsonpCallback: function() {
9666
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9667
		this[ callback ] = true;
9668
		return callback;
9669
	}
9670
} );
9671
 
9672
// Detect, normalize options and install callbacks for jsonp requests
9673
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9674
 
9675
	var callbackName, overwritten, responseContainer,
9676
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9677
			"url" :
9678
			typeof s.data === "string" &&
9679
				( s.contentType || "" )
9680
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
9681
				rjsonp.test( s.data ) && "data"
9682
		);
9683
 
9684
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
9685
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9686
 
9687
		// Get callback name, remembering preexisting value associated with it
9688
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9689
			s.jsonpCallback() :
9690
			s.jsonpCallback;
9691
 
9692
		// Insert callback into url or form data
9693
		if ( jsonProp ) {
9694
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9695
		} else if ( s.jsonp !== false ) {
9696
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9697
		}
9698
 
9699
		// Use data converter to retrieve json after script execution
9700
		s.converters[ "script json" ] = function() {
9701
			if ( !responseContainer ) {
9702
				jQuery.error( callbackName + " was not called" );
9703
			}
9704
			return responseContainer[ 0 ];
9705
		};
9706
 
9707
		// Force json dataType
9708
		s.dataTypes[ 0 ] = "json";
9709
 
9710
		// Install callback
9711
		overwritten = window[ callbackName ];
9712
		window[ callbackName ] = function() {
9713
			responseContainer = arguments;
9714
		};
9715
 
9716
		// Clean-up function (fires after converters)
9717
		jqXHR.always( function() {
9718
 
9719
			// If previous value didn't exist - remove it
9720
			if ( overwritten === undefined ) {
9721
				jQuery( window ).removeProp( callbackName );
9722
 
9723
			// Otherwise restore preexisting value
9724
			} else {
9725
				window[ callbackName ] = overwritten;
9726
			}
9727
 
9728
			// Save back as free
9729
			if ( s[ callbackName ] ) {
9730
 
9731
				// Make sure that re-using the options doesn't screw things around
9732
				s.jsonpCallback = originalSettings.jsonpCallback;
9733
 
9734
				// Save the callback name for future use
9735
				oldCallbacks.push( callbackName );
9736
			}
9737
 
9738
			// Call if it was a function and we have a response
9739
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9740
				overwritten( responseContainer[ 0 ] );
9741
			}
9742
 
9743
			responseContainer = overwritten = undefined;
9744
		} );
9745
 
9746
		// Delegate to script
9747
		return "script";
9748
	}
9749
} );
9750
 
9751
 
9752
 
9753
 
9754
// Support: Safari 8 only
9755
// In Safari 8 documents created via document.implementation.createHTMLDocument
9756
// collapse sibling forms: the second one becomes a child of the first one.
9757
// Because of that, this security measure has to be disabled in Safari 8.
9758
// https://bugs.webkit.org/show_bug.cgi?id=137337
9759
support.createHTMLDocument = ( function() {
9760
	var body = document.implementation.createHTMLDocument( "" ).body;
9761
	body.innerHTML = "<form></form><form></form>";
9762
	return body.childNodes.length === 2;
9763
} )();
9764
 
9765
 
9766
// Argument "data" should be string of html
9767
// context (optional): If specified, the fragment will be created in this context,
9768
// defaults to document
9769
// keepScripts (optional): If true, will include scripts passed in the html string
9770
jQuery.parseHTML = function( data, context, keepScripts ) {
9771
	if ( typeof data !== "string" ) {
9772
		return [];
9773
	}
9774
	if ( typeof context === "boolean" ) {
9775
		keepScripts = context;
9776
		context = false;
9777
	}
9778
 
9779
	var base, parsed, scripts;
9780
 
9781
	if ( !context ) {
9782
 
9783
		// Stop scripts or inline event handlers from being executed immediately
9784
		// by using document.implementation
9785
		if ( support.createHTMLDocument ) {
9786
			context = document.implementation.createHTMLDocument( "" );
9787
 
9788
			// Set the base href for the created document
9789
			// so any parsed elements with URLs
9790
			// are based on the document's URL (gh-2965)
9791
			base = context.createElement( "base" );
9792
			base.href = document.location.href;
9793
			context.head.appendChild( base );
9794
		} else {
9795
			context = document;
9796
		}
9797
	}
9798
 
9799
	parsed = rsingleTag.exec( data );
9800
	scripts = !keepScripts && [];
9801
 
9802
	// Single tag
9803
	if ( parsed ) {
9804
		return [ context.createElement( parsed[ 1 ] ) ];
9805
	}
9806
 
9807
	parsed = buildFragment( [ data ], context, scripts );
9808
 
9809
	if ( scripts && scripts.length ) {
9810
		jQuery( scripts ).remove();
9811
	}
9812
 
9813
	return jQuery.merge( [], parsed.childNodes );
9814
};
9815
 
9816
 
9817
/**
9818
 * Load a url into a page
9819
 */
9820
jQuery.fn.load = function( url, params, callback ) {
9821
	var selector, type, response,
9822
		self = this,
9823
		off = url.indexOf( " " );
9824
 
9825
	if ( off > -1 ) {
9826
		selector = stripAndCollapse( url.slice( off ) );
9827
		url = url.slice( 0, off );
9828
	}
9829
 
9830
	// If it's a function
9831
	if ( jQuery.isFunction( params ) ) {
9832
 
9833
		// We assume that it's the callback
9834
		callback = params;
9835
		params = undefined;
9836
 
9837
	// Otherwise, build a param string
9838
	} else if ( params && typeof params === "object" ) {
9839
		type = "POST";
9840
	}
9841
 
9842
	// If we have elements to modify, make the request
9843
	if ( self.length > 0 ) {
9844
		jQuery.ajax( {
9845
			url: url,
9846
 
9847
			// If "type" variable is undefined, then "GET" method will be used.
9848
			// Make value of this field explicit since
9849
			// user can override it through ajaxSetup method
9850
			type: type || "GET",
9851
			dataType: "html",
9852
			data: params
9853
		} ).done( function( responseText ) {
9854
 
9855
			// Save response for use in complete callback
9856
			response = arguments;
9857
 
9858
			self.html( selector ?
9859
 
9860
				// If a selector was specified, locate the right elements in a dummy div
9861
				// Exclude scripts to avoid IE 'Permission Denied' errors
9862
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
9863
 
9864
				// Otherwise use the full result
9865
				responseText );
9866
 
9867
		// If the request succeeds, this function gets "data", "status", "jqXHR"
9868
		// but they are ignored because response was set above.
9869
		// If it fails, this function gets "jqXHR", "status", "error"
9870
		} ).always( callback && function( jqXHR, status ) {
9871
			self.each( function() {
9872
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
9873
			} );
9874
		} );
9875
	}
9876
 
9877
	return this;
9878
};
9879
 
9880
 
9881
 
9882
 
9883
// Attach a bunch of functions for handling common AJAX events
9884
jQuery.each( [
9885
	"ajaxStart",
9886
	"ajaxStop",
9887
	"ajaxComplete",
9888
	"ajaxError",
9889
	"ajaxSuccess",
9890
	"ajaxSend"
9891
], function( i, type ) {
9892
	jQuery.fn[ type ] = function( fn ) {
9893
		return this.on( type, fn );
9894
	};
9895
} );
9896
 
9897
 
9898
 
9899
 
9900
jQuery.expr.pseudos.animated = function( elem ) {
9901
	return jQuery.grep( jQuery.timers, function( fn ) {
9902
		return elem === fn.elem;
9903
	} ).length;
9904
};
9905
 
9906
 
9907
 
9908
 
9909
jQuery.offset = {
9910
	setOffset: function( elem, options, i ) {
9911
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
9912
			position = jQuery.css( elem, "position" ),
9913
			curElem = jQuery( elem ),
9914
			props = {};
9915
 
9916
		// Set position first, in-case top/left are set even on static elem
9917
		if ( position === "static" ) {
9918
			elem.style.position = "relative";
9919
		}
9920
 
9921
		curOffset = curElem.offset();
9922
		curCSSTop = jQuery.css( elem, "top" );
9923
		curCSSLeft = jQuery.css( elem, "left" );
9924
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
9925
			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
9926
 
9927
		// Need to be able to calculate position if either
9928
		// top or left is auto and position is either absolute or fixed
9929
		if ( calculatePosition ) {
9930
			curPosition = curElem.position();
9931
			curTop = curPosition.top;
9932
			curLeft = curPosition.left;
9933
 
9934
		} else {
9935
			curTop = parseFloat( curCSSTop ) || 0;
9936
			curLeft = parseFloat( curCSSLeft ) || 0;
9937
		}
9938
 
9939
		if ( jQuery.isFunction( options ) ) {
9940
 
9941
			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
9942
			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
9943
		}
9944
 
9945
		if ( options.top != null ) {
9946
			props.top = ( options.top - curOffset.top ) + curTop;
9947
		}
9948
		if ( options.left != null ) {
9949
			props.left = ( options.left - curOffset.left ) + curLeft;
9950
		}
9951
 
9952
		if ( "using" in options ) {
9953
			options.using.call( elem, props );
9954
 
9955
		} else {
9956
			curElem.css( props );
9957
		}
9958
	}
9959
};
9960
 
9961
jQuery.fn.extend( {
9962
	offset: function( options ) {
9963
 
9964
		// Preserve chaining for setter
9965
		if ( arguments.length ) {
9966
			return options === undefined ?
9967
				this :
9968
				this.each( function( i ) {
9969
					jQuery.offset.setOffset( this, options, i );
9970
				} );
9971
		}
9972
 
9973
		var doc, docElem, rect, win,
9974
			elem = this[ 0 ];
9975
 
9976
		if ( !elem ) {
9977
			return;
9978
		}
9979
 
9980
		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
9981
		// Support: IE <=11 only
9982
		// Running getBoundingClientRect on a
9983
		// disconnected node in IE throws an error
9984
		if ( !elem.getClientRects().length ) {
9985
			return { top: 0, left: 0 };
9986
		}
9987
 
9988
		rect = elem.getBoundingClientRect();
9989
 
9990
		doc = elem.ownerDocument;
9991
		docElem = doc.documentElement;
9992
		win = doc.defaultView;
9993
 
9994
		return {
9995
			top: rect.top + win.pageYOffset - docElem.clientTop,
9996
			left: rect.left + win.pageXOffset - docElem.clientLeft
9997
		};
9998
	},
9999
 
10000
	position: function() {
10001
		if ( !this[ 0 ] ) {
10002
			return;
10003
		}
10004
 
10005
		var offsetParent, offset,
10006
			elem = this[ 0 ],
10007
			parentOffset = { top: 0, left: 0 };
10008
 
10009
		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10010
		// because it is its only offset parent
10011
		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10012
 
10013
			// Assume getBoundingClientRect is there when computed position is fixed
10014
			offset = elem.getBoundingClientRect();
10015
 
10016
		} else {
10017
 
10018
			// Get *real* offsetParent
10019
			offsetParent = this.offsetParent();
10020
 
10021
			// Get correct offsets
10022
			offset = this.offset();
10023
			if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10024
				parentOffset = offsetParent.offset();
10025
			}
10026
 
10027
			// Add offsetParent borders
10028
			parentOffset = {
10029
				top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
10030
				left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
10031
			};
10032
		}
10033
 
10034
		// Subtract parent offsets and element margins
10035
		return {
10036
			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10037
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
10038
		};
10039
	},
10040
 
10041
	// This method will return documentElement in the following cases:
10042
	// 1) For the element inside the iframe without offsetParent, this method will return
10043
	//    documentElement of the parent window
10044
	// 2) For the hidden or detached element
10045
	// 3) For body or html element, i.e. in case of the html node - it will return itself
10046
	//
10047
	// but those exceptions were never presented as a real life use-cases
10048
	// and might be considered as more preferable results.
10049
	//
10050
	// This logic, however, is not guaranteed and can change at any point in the future
10051
	offsetParent: function() {
10052
		return this.map( function() {
10053
			var offsetParent = this.offsetParent;
10054
 
10055
			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
10056
				offsetParent = offsetParent.offsetParent;
10057
			}
10058
 
10059
			return offsetParent || documentElement;
10060
		} );
10061
	}
10062
} );
10063
 
10064
// Create scrollLeft and scrollTop methods
10065
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10066
	var top = "pageYOffset" === prop;
10067
 
10068
	jQuery.fn[ method ] = function( val ) {
10069
		return access( this, function( elem, method, val ) {
10070
 
10071
			// Coalesce documents and windows
10072
			var win;
10073
			if ( jQuery.isWindow( elem ) ) {
10074
				win = elem;
10075
			} else if ( elem.nodeType === 9 ) {
10076
				win = elem.defaultView;
10077
			}
10078
 
10079
			if ( val === undefined ) {
10080
				return win ? win[ prop ] : elem[ method ];
10081
			}
10082
 
10083
			if ( win ) {
10084
				win.scrollTo(
10085
					!top ? val : win.pageXOffset,
10086
					top ? val : win.pageYOffset
10087
				);
10088
 
10089
			} else {
10090
				elem[ method ] = val;
10091
			}
10092
		}, method, val, arguments.length );
10093
	};
10094
} );
10095
 
10096
// Support: Safari <=7 - 9.1, Chrome <=37 - 49
10097
// Add the top/left cssHooks using jQuery.fn.position
10098
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10099
// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10100
// getComputedStyle returns percent when specified for top/left/bottom/right;
10101
// rather than make the css module depend on the offset module, just check for it here
10102
jQuery.each( [ "top", "left" ], function( i, prop ) {
10103
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10104
		function( elem, computed ) {
10105
			if ( computed ) {
10106
				computed = curCSS( elem, prop );
10107
 
10108
				// If curCSS returns percentage, fallback to offset
10109
				return rnumnonpx.test( computed ) ?
10110
					jQuery( elem ).position()[ prop ] + "px" :
10111
					computed;
10112
			}
10113
		}
10114
	);
10115
} );
10116
 
10117
 
10118
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10119
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10120
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10121
		function( defaultExtra, funcName ) {
10122
 
10123
		// Margin is only for outerHeight, outerWidth
10124
		jQuery.fn[ funcName ] = function( margin, value ) {
10125
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10126
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10127
 
10128
			return access( this, function( elem, type, value ) {
10129
				var doc;
10130
 
10131
				if ( jQuery.isWindow( elem ) ) {
10132
 
10133
					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10134
					return funcName.indexOf( "outer" ) === 0 ?
10135
						elem[ "inner" + name ] :
10136
						elem.document.documentElement[ "client" + name ];
10137
				}
10138
 
10139
				// Get document width or height
10140
				if ( elem.nodeType === 9 ) {
10141
					doc = elem.documentElement;
10142
 
10143
					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
10144
					// whichever is greatest
10145
					return Math.max(
10146
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10147
						elem.body[ "offset" + name ], doc[ "offset" + name ],
10148
						doc[ "client" + name ]
10149
					);
10150
				}
10151
 
10152
				return value === undefined ?
10153
 
10154
					// Get width or height on the element, requesting but not forcing parseFloat
10155
					jQuery.css( elem, type, extra ) :
10156
 
10157
					// Set width or height on the element
10158
					jQuery.style( elem, type, value, extra );
10159
			}, type, chainable ? margin : undefined, chainable );
10160
		};
10161
	} );
10162
} );
10163
 
10164
 
10165
jQuery.fn.extend( {
10166
 
10167
	bind: function( types, data, fn ) {
10168
		return this.on( types, null, data, fn );
10169
	},
10170
	unbind: function( types, fn ) {
10171
		return this.off( types, null, fn );
10172
	},
10173
 
10174
	delegate: function( selector, types, data, fn ) {
10175
		return this.on( types, selector, data, fn );
10176
	},
10177
	undelegate: function( selector, types, fn ) {
10178
 
10179
		// ( namespace ) or ( selector, types [, fn] )
10180
		return arguments.length === 1 ?
10181
			this.off( selector, "**" ) :
10182
			this.off( types, selector || "**", fn );
10183
	}
10184
} );
10185
 
10186
jQuery.holdReady = function( hold ) {
10187
	if ( hold ) {
10188
		jQuery.readyWait++;
10189
	} else {
10190
		jQuery.ready( true );
10191
	}
10192
};
10193
jQuery.isArray = Array.isArray;
10194
jQuery.parseJSON = JSON.parse;
10195
jQuery.nodeName = nodeName;
10196
 
10197
 
10198
 
10199
 
10200
// Register as a named AMD module, since jQuery can be concatenated with other
10201
// files that may use define, but not via a proper concatenation script that
10202
// understands anonymous AMD modules. A named AMD is safest and most robust
10203
// way to register. Lowercase jquery is used because AMD module names are
10204
// derived from file names, and jQuery is normally delivered in a lowercase
10205
// file name. Do this after creating the global so that if an AMD module wants
10206
// to call noConflict to hide this version of jQuery, it will work.
10207
 
10208
// Note that for maximum portability, libraries that are not jQuery should
10209
// declare themselves as anonymous modules, and avoid setting a global if an
10210
// AMD loader is present. jQuery is a special case. For more information, see
10211
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10212
 
10213
if ( typeof define === "function" && define.amd ) {
10214
	define( "jquery", [], function() {
10215
		return jQuery;
10216
	} );
10217
}
10218
 
10219
 
10220
 
10221
 
10222
var
10223
 
10224
	// Map over jQuery in case of overwrite
10225
	_jQuery = window.jQuery,
10226
 
10227
	// Map over the $ in case of overwrite
10228
	_$ = window.$;
10229
 
10230
jQuery.noConflict = function( deep ) {
10231
	if ( window.$ === jQuery ) {
10232
		window.$ = _$;
10233
	}
10234
 
10235
	if ( deep && window.jQuery === jQuery ) {
10236
		window.jQuery = _jQuery;
10237
	}
10238
 
10239
	return jQuery;
10240
};
10241
 
10242
// Expose jQuery and $ identifiers, even in AMD
10243
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10244
// and CommonJS for browser emulators (#13566)
10245
if ( !noGlobal ) {
10246
	window.jQuery = window.$ = jQuery;
10247
}
10248
 
10249
 
10250
 
10251
 
10252
return jQuery;
10253
} );
10254
 
10255
/*!
10256
 * Lightbox v2.10.0
10257
 * by Lokesh Dhakar
10258
 *
10259
 * More info:
10260
 * http://lokeshdhakar.com/projects/lightbox2/
10261
 *
10262
 * Copyright 2007, 2018 Lokesh Dhakar
10263
 * Released under the MIT license
10264
 * https://github.com/lokesh/lightbox2/blob/master/LICENSE
10265
 *
10266
 * @preserve
10267
 */
10268
 
10269
// Uses Node, AMD or browser globals to create a module.
10270
(function (root, factory) {
10271
    if (typeof define === 'function' && define.amd) {
10272
        // AMD. Register as an anonymous module.
10273
        define(['jquery'], factory);
10274
    } else if (typeof exports === 'object') {
10275
        // Node. Does not work with strict CommonJS, but
10276
        // only CommonJS-like environments that support module.exports,
10277
        // like Node.
10278
        module.exports = factory(require('jquery'));
10279
    } else {
10280
        // Browser globals (root is window)
10281
        root.lightbox = factory(root.jQuery);
10282
    }
10283
}(this, function ($) {
10284
 
10285
  function Lightbox(options) {
10286
    this.album = [];
10287
    this.currentImageIndex = void 0;
10288
    this.init();
10289
 
10290
    // options
10291
    this.options = $.extend({}, this.constructor.defaults);
10292
    this.option(options);
10293
  }
10294
 
10295
  // Descriptions of all options available on the demo site:
10296
  // http://lokeshdhakar.com/projects/lightbox2/index.html#options
10297
  Lightbox.defaults = {
10298
    albumLabel: 'Image %1 of %2',
10299
    alwaysShowNavOnTouchDevices: false,
10300
    fadeDuration: 600,
10301
    fitImagesInViewport: true,
10302
    imageFadeDuration: 600,
10303
    // maxWidth: 800,
10304
    // maxHeight: 600,
10305
    positionFromTop: 50,
10306
    resizeDuration: 700,
10307
    showImageNumberLabel: true,
10308
    wrapAround: false,
10309
    disableScrolling: false,
10310
    /*
10311
    Sanitize Title
10312
    If the caption data is trusted, for example you are hardcoding it in, then leave this to false.
10313
    This will free you to add html tags, such as links, in the caption.
10314
 
10315
    If the caption data is user submitted or from some other untrusted source, then set this to true
10316
    to prevent xss and other injection attacks.
10317
     */
10318
    sanitizeTitle: false
10319
  };
10320
 
10321
  Lightbox.prototype.option = function(options) {
10322
    $.extend(this.options, options);
10323
  };
10324
 
10325
  Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
10326
    return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
10327
  };
10328
 
10329
  Lightbox.prototype.init = function() {
10330
    var self = this;
10331
    // Both enable and build methods require the body tag to be in the DOM.
10332
    $(document).ready(function() {
10333
      self.enable();
10334
      self.build();
10335
    });
10336
  };
10337
 
10338
  // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
10339
  // that contain 'lightbox'. When these are clicked, start lightbox.
10340
  Lightbox.prototype.enable = function() {
10341
    var self = this;
10342
    $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
10343
      self.start($(event.currentTarget));
10344
      return false;
10345
    });
10346
  };
10347
 
10348
  // Build html for the lightbox and the overlay.
10349
  // Attach event handlers to the new DOM elements. click click click
10350
  Lightbox.prototype.build = function() {
10351
    if ($('#lightbox').length > 0) {
10352
        return;
10353
    }
10354
 
10355
    var self = this;
10356
    $('<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
10357
 
10358
    // Cache jQuery objects
10359
    this.$lightbox       = $('#lightbox');
10360
    this.$overlay        = $('#lightboxOverlay');
10361
    this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
10362
    this.$container      = this.$lightbox.find('.lb-container');
10363
    this.$image          = this.$lightbox.find('.lb-image');
10364
    this.$nav            = this.$lightbox.find('.lb-nav');
10365
 
10366
    // Store css values for future lookup
10367
    this.containerPadding = {
10368
      top: parseInt(this.$container.css('padding-top'), 10),
10369
      right: parseInt(this.$container.css('padding-right'), 10),
10370
      bottom: parseInt(this.$container.css('padding-bottom'), 10),
10371
      left: parseInt(this.$container.css('padding-left'), 10)
10372
    };
10373
 
10374
    this.imageBorderWidth = {
10375
      top: parseInt(this.$image.css('border-top-width'), 10),
10376
      right: parseInt(this.$image.css('border-right-width'), 10),
10377
      bottom: parseInt(this.$image.css('border-bottom-width'), 10),
10378
      left: parseInt(this.$image.css('border-left-width'), 10)
10379
    };
10380
 
10381
    // Attach event handlers to the newly minted DOM elements
10382
    this.$overlay.hide().on('click', function() {
10383
      self.end();
10384
      return false;
10385
    });
10386
 
10387
    this.$lightbox.hide().on('click', function(event) {
10388
      if ($(event.target).attr('id') === 'lightbox') {
10389
        self.end();
10390
      }
10391
      return false;
10392
    });
10393
 
10394
    this.$outerContainer.on('click', function(event) {
10395
      if ($(event.target).attr('id') === 'lightbox') {
10396
        self.end();
10397
      }
10398
      return false;
10399
    });
10400
 
10401
    this.$lightbox.find('.lb-prev').on('click', function() {
10402
      if (self.currentImageIndex === 0) {
10403
        self.changeImage(self.album.length - 1);
10404
      } else {
10405
        self.changeImage(self.currentImageIndex - 1);
10406
      }
10407
      return false;
10408
    });
10409
 
10410
    this.$lightbox.find('.lb-next').on('click', function() {
10411
      if (self.currentImageIndex === self.album.length - 1) {
10412
        self.changeImage(0);
10413
      } else {
10414
        self.changeImage(self.currentImageIndex + 1);
10415
      }
10416
      return false;
10417
    });
10418
 
10419
    /*
10420
      Show context menu for image on right-click
10421
 
10422
      There is a div containing the navigation that spans the entire image and lives above of it. If
10423
      you right-click, you are right clicking this div and not the image. This prevents users from
10424
      saving the image or using other context menu actions with the image.
10425
 
10426
      To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we
10427
      set pointer-events to none on the nav div. This is so that the upcoming right-click event on
10428
      the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs
10429
      we set the pointer events back to auto for the nav div so it can capture hover and left-click
10430
      events as usual.
10431
     */
10432
    this.$nav.on('mousedown', function(event) {
10433
      if (event.which === 3) {
10434
        self.$nav.css('pointer-events', 'none');
10435
 
10436
        self.$lightbox.one('contextmenu', function() {
10437
          setTimeout(function() {
10438
              this.$nav.css('pointer-events', 'auto');
10439
          }.bind(self), 0);
10440
        });
10441
      }
10442
    });
10443
 
10444
 
10445
    this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
10446
      self.end();
10447
      return false;
10448
    });
10449
  };
10450
 
10451
  // Show overlay and lightbox. If the image is part of a set, add siblings to album array.
10452
  Lightbox.prototype.start = function($link) {
10453
    var self    = this;
10454
    var $window = $(window);
10455
 
10456
    $window.on('resize', $.proxy(this.sizeOverlay, this));
10457
 
10458
    $('select, object, embed').css({
10459
      visibility: 'hidden'
10460
    });
10461
 
10462
    this.sizeOverlay();
10463
 
10464
    this.album = [];
10465
    var imageNumber = 0;
10466
 
10467
    function addToAlbum($link) {
10468
      self.album.push({
10469
        alt: $link.attr('data-alt'),
10470
        link: $link.attr('href'),
10471
        title: $link.attr('data-title') || $link.attr('title')
10472
      });
10473
    }
10474
 
10475
    // Support both data-lightbox attribute and rel attribute implementations
10476
    var dataLightboxValue = $link.attr('data-lightbox');
10477
    var $links;
10478
 
10479
    if (dataLightboxValue) {
10480
      $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
10481
      for (var i = 0; i < $links.length; i = ++i) {
10482
        addToAlbum($($links[i]));
10483
        if ($links[i] === $link[0]) {
10484
          imageNumber = i;
10485
        }
10486
      }
10487
    } else {
10488
      if ($link.attr('rel') === 'lightbox') {
10489
        // If image is not part of a set
10490
        addToAlbum($link);
10491
      } else {
10492
        // If image is part of a set
10493
        $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
10494
        for (var j = 0; j < $links.length; j = ++j) {
10495
          addToAlbum($($links[j]));
10496
          if ($links[j] === $link[0]) {
10497
            imageNumber = j;
10498
          }
10499
        }
10500
      }
10501
    }
10502
 
10503
    // Position Lightbox
10504
    var top  = $window.scrollTop() + this.options.positionFromTop;
10505
    var left = $window.scrollLeft();
10506
    this.$lightbox.css({
10507
      top: top + 'px',
10508
      left: left + 'px'
10509
    }).fadeIn(this.options.fadeDuration);
10510
 
10511
    // Disable scrolling of the page while open
10512
    if (this.options.disableScrolling) {
10513
      $('html').addClass('lb-disable-scrolling');
10514
    }
10515
 
10516
    this.changeImage(imageNumber);
10517
  };
10518
 
10519
  // Hide most UI elements in preparation for the animated resizing of the lightbox.
10520
  Lightbox.prototype.changeImage = function(imageNumber) {
10521
    var self = this;
10522
 
10523
    this.disableKeyboardNav();
10524
    var $image = this.$lightbox.find('.lb-image');
10525
 
10526
    this.$overlay.fadeIn(this.options.fadeDuration);
10527
 
10528
    $('.lb-loader').fadeIn('slow');
10529
    this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
10530
 
10531
    this.$outerContainer.addClass('animating');
10532
 
10533
    // When image to show is preloaded, we send the width and height to sizeContainer()
10534
    var preloader = new Image();
10535
    preloader.onload = function() {
10536
      var $preloader;
10537
      var imageHeight;
10538
      var imageWidth;
10539
      var maxImageHeight;
10540
      var maxImageWidth;
10541
      var windowHeight;
10542
      var windowWidth;
10543
 
10544
      $image.attr({
10545
        'alt': self.album[imageNumber].alt,
10546
        'src': self.album[imageNumber].link
10547
      });
10548
 
10549
      $preloader = $(preloader);
10550
 
10551
      $image.width(preloader.width);
10552
      $image.height(preloader.height);
10553
 
10554
      if (self.options.fitImagesInViewport) {
10555
        // Fit image inside the viewport.
10556
        // Take into account the border around the image and an additional 10px gutter on each side.
10557
 
10558
        windowWidth    = $(window).width();
10559
        windowHeight   = $(window).height();
10560
        maxImageWidth  = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20;
10561
        maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - 120;
10562
 
10563
        // Check if image size is larger then maxWidth|maxHeight in settings
10564
        if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
10565
          maxImageWidth = self.options.maxWidth;
10566
        }
10567
        if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) {
10568
          maxImageHeight = self.options.maxHeight;
10569
        }
10570
 
10571
        // Is the current image's width or height is greater than the maxImageWidth or maxImageHeight
10572
        // option than we need to size down while maintaining the aspect ratio.
10573
        if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
10574
          if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
10575
            imageWidth  = maxImageWidth;
10576
            imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
10577
            $image.width(imageWidth);
10578
            $image.height(imageHeight);
10579
          } else {
10580
            imageHeight = maxImageHeight;
10581
            imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
10582
            $image.width(imageWidth);
10583
            $image.height(imageHeight);
10584
          }
10585
        }
10586
      }
10587
      self.sizeContainer($image.width(), $image.height());
10588
    };
10589
 
10590
    preloader.src          = this.album[imageNumber].link;
10591
    this.currentImageIndex = imageNumber;
10592
  };
10593
 
10594
  // Stretch overlay to fit the viewport
10595
  Lightbox.prototype.sizeOverlay = function() {
10596
    this.$overlay
10597
      .width($(document).width())
10598
      .height($(document).height());
10599
  };
10600
 
10601
  // Animate the size of the lightbox to fit the image we are showing
10602
  Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
10603
    var self = this;
10604
 
10605
    var oldWidth  = this.$outerContainer.outerWidth();
10606
    var oldHeight = this.$outerContainer.outerHeight();
10607
    var newWidth  = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right;
10608
    var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom;
10609
 
10610
    function postResize() {
10611
      self.$lightbox.find('.lb-dataContainer').width(newWidth);
10612
      self.$lightbox.find('.lb-prevLink').height(newHeight);
10613
      self.$lightbox.find('.lb-nextLink').height(newHeight);
10614
      self.showImage();
10615
    }
10616
 
10617
    if (oldWidth !== newWidth || oldHeight !== newHeight) {
10618
      this.$outerContainer.animate({
10619
        width: newWidth,
10620
        height: newHeight
10621
      }, this.options.resizeDuration, 'swing', function() {
10622
        postResize();
10623
      });
10624
    } else {
10625
      postResize();
10626
    }
10627
  };
10628
 
10629
  // Display the image and its details and begin preload neighboring images.
10630
  Lightbox.prototype.showImage = function() {
10631
    this.$lightbox.find('.lb-loader').stop(true).hide();
10632
    this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration);
10633
 
10634
    this.updateNav();
10635
    this.updateDetails();
10636
    this.preloadNeighboringImages();
10637
    this.enableKeyboardNav();
10638
  };
10639
 
10640
  // Display previous and next navigation if appropriate.
10641
  Lightbox.prototype.updateNav = function() {
10642
    // Check to see if the browser supports touch events. If so, we take the conservative approach
10643
    // and assume that mouse hover events are not supported and always show prev/next navigation
10644
    // arrows in image sets.
10645
    var alwaysShowNav = false;
10646
    try {
10647
      document.createEvent('TouchEvent');
10648
      alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
10649
    } catch (e) {}
10650
 
10651
    this.$lightbox.find('.lb-nav').show();
10652
 
10653
    if (this.album.length > 1) {
10654
      if (this.options.wrapAround) {
10655
        if (alwaysShowNav) {
10656
          this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
10657
        }
10658
        this.$lightbox.find('.lb-prev, .lb-next').show();
10659
      } else {
10660
        if (this.currentImageIndex > 0) {
10661
          this.$lightbox.find('.lb-prev').show();
10662
          if (alwaysShowNav) {
10663
            this.$lightbox.find('.lb-prev').css('opacity', '1');
10664
          }
10665
        }
10666
        if (this.currentImageIndex < this.album.length - 1) {
10667
          this.$lightbox.find('.lb-next').show();
10668
          if (alwaysShowNav) {
10669
            this.$lightbox.find('.lb-next').css('opacity', '1');
10670
          }
10671
        }
10672
      }
10673
    }
10674
  };
10675
 
10676
  // Display caption, image number, and closing button.
10677
  Lightbox.prototype.updateDetails = function() {
10678
    var self = this;
10679
 
10680
    // Enable anchor clicks in the injected caption html.
10681
    // Thanks Nate Wright for the fix. @https://github.com/NateWr
10682
    if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
10683
      this.album[this.currentImageIndex].title !== '') {
10684
      var $caption = this.$lightbox.find('.lb-caption');
10685
      if (this.options.sanitizeTitle) {
10686
        $caption.text(this.album[this.currentImageIndex].title);
10687
      } else {
10688
        $caption.html(this.album[this.currentImageIndex].title);
10689
      }
10690
      $caption.fadeIn('fast')
10691
        .find('a').on('click', function(event) {
10692
          if ($(this).attr('target') !== undefined) {
10693
            window.open($(this).attr('href'), $(this).attr('target'));
10694
          } else {
10695
            location.href = $(this).attr('href');
10696
          }
10697
        });
10698
    }
10699
 
10700
    if (this.album.length > 1 && this.options.showImageNumberLabel) {
10701
      var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
10702
      this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
10703
    } else {
10704
      this.$lightbox.find('.lb-number').hide();
10705
    }
10706
 
10707
    this.$outerContainer.removeClass('animating');
10708
 
10709
    this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
10710
      return self.sizeOverlay();
10711
    });
10712
  };
10713
 
10714
  // Preload previous and next images in set.
10715
  Lightbox.prototype.preloadNeighboringImages = function() {
10716
    if (this.album.length > this.currentImageIndex + 1) {
10717
      var preloadNext = new Image();
10718
      preloadNext.src = this.album[this.currentImageIndex + 1].link;
10719
    }
10720
    if (this.currentImageIndex > 0) {
10721
      var preloadPrev = new Image();
10722
      preloadPrev.src = this.album[this.currentImageIndex - 1].link;
10723
    }
10724
  };
10725
 
10726
  Lightbox.prototype.enableKeyboardNav = function() {
10727
    $(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this));
10728
  };
10729
 
10730
  Lightbox.prototype.disableKeyboardNav = function() {
10731
    $(document).off('.keyboard');
10732
  };
10733
 
10734
  Lightbox.prototype.keyboardAction = function(event) {
10735
    var KEYCODE_ESC        = 27;
10736
    var KEYCODE_LEFTARROW  = 37;
10737
    var KEYCODE_RIGHTARROW = 39;
10738
 
10739
    var keycode = event.keyCode;
10740
    var key     = String.fromCharCode(keycode).toLowerCase();
10741
    if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {
10742
      this.end();
10743
    } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {
10744
      if (this.currentImageIndex !== 0) {
10745
        this.changeImage(this.currentImageIndex - 1);
10746
      } else if (this.options.wrapAround && this.album.length > 1) {
10747
        this.changeImage(this.album.length - 1);
10748
      }
10749
    } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {
10750
      if (this.currentImageIndex !== this.album.length - 1) {
10751
        this.changeImage(this.currentImageIndex + 1);
10752
      } else if (this.options.wrapAround && this.album.length > 1) {
10753
        this.changeImage(0);
10754
      }
10755
    }
10756
  };
10757
 
10758
  // Closing time. :-(
10759
  Lightbox.prototype.end = function() {
10760
    this.disableKeyboardNav();
10761
    $(window).off('resize', this.sizeOverlay);
10762
    this.$lightbox.fadeOut(this.options.fadeDuration);
10763
    this.$overlay.fadeOut(this.options.fadeDuration);
10764
    $('select, object, embed').css({
10765
      visibility: 'visible'
10766
    });
10767
    if (this.options.disableScrolling) {
10768
      $('html').removeClass('lb-disable-scrolling');
10769
    }
10770
  };
10771
 
10772
  return new Lightbox();
10773
}));