jquery-rails 4.3.1 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.2.1
2
+ * jQuery JavaScript Library v3.5.1
3
3
  * https://jquery.com/
4
4
  *
5
5
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
9
9
  * Released under the MIT license
10
10
  * https://jquery.org/license
11
11
  *
12
- * Date: 2017-03-20T18:59Z
12
+ * Date: 2020-05-04T22:49Z
13
13
  */
14
14
  ( function( global, factory ) {
15
15
 
@@ -47,13 +47,16 @@
47
47
 
48
48
  var arr = [];
49
49
 
50
- var document = window.document;
51
-
52
50
  var getProto = Object.getPrototypeOf;
53
51
 
54
52
  var slice = arr.slice;
55
53
 
56
- var concat = arr.concat;
54
+ var flat = arr.flat ? function( array ) {
55
+ return arr.flat.call( array );
56
+ } : function( array ) {
57
+ return arr.concat.apply( [], array );
58
+ };
59
+
57
60
 
58
61
  var push = arr.push;
59
62
 
@@ -71,16 +74,72 @@ var ObjectFunctionString = fnToString.call( Object );
71
74
 
72
75
  var support = {};
73
76
 
77
+ var isFunction = function isFunction( obj ) {
78
+
79
+ // Support: Chrome <=57, Firefox <=52
80
+ // In some browsers, typeof returns "function" for HTML <object> elements
81
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
82
+ // We don't want to classify *any* DOM node as a function.
83
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
84
+ };
85
+
86
+
87
+ var isWindow = function isWindow( obj ) {
88
+ return obj != null && obj === obj.window;
89
+ };
90
+
91
+
92
+ var document = window.document;
74
93
 
75
94
 
76
- function DOMEval( code, doc ) {
95
+
96
+ var preservedScriptAttributes = {
97
+ type: true,
98
+ src: true,
99
+ nonce: true,
100
+ noModule: true
101
+ };
102
+
103
+ function DOMEval( code, node, doc ) {
77
104
  doc = doc || document;
78
105
 
79
- var script = doc.createElement( "script" );
106
+ var i, val,
107
+ script = doc.createElement( "script" );
80
108
 
81
109
  script.text = code;
110
+ if ( node ) {
111
+ for ( i in preservedScriptAttributes ) {
112
+
113
+ // Support: Firefox 64+, Edge 18+
114
+ // Some browsers don't support the "nonce" property on scripts.
115
+ // On the other hand, just using `getAttribute` is not enough as
116
+ // the `nonce` attribute is reset to an empty string whenever it
117
+ // becomes browsing-context connected.
118
+ // See https://github.com/whatwg/html/issues/2369
119
+ // See https://html.spec.whatwg.org/#nonce-attributes
120
+ // The `node.getAttribute` check was added for the sake of
121
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
122
+ // via an object.
123
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
124
+ if ( val ) {
125
+ script.setAttribute( i, val );
126
+ }
127
+ }
128
+ }
82
129
  doc.head.appendChild( script ).parentNode.removeChild( script );
83
130
  }
131
+
132
+
133
+ function toType( obj ) {
134
+ if ( obj == null ) {
135
+ return obj + "";
136
+ }
137
+
138
+ // Support: Android <=2.3 only (functionish RegExp)
139
+ return typeof obj === "object" || typeof obj === "function" ?
140
+ class2type[ toString.call( obj ) ] || "object" :
141
+ typeof obj;
142
+ }
84
143
  /* global Symbol */
85
144
  // Defining this global in .eslintrc.json would create a danger of using the global
86
145
  // unguarded in another place, it seems safer to define global only for this module
@@ -88,7 +147,7 @@ var support = {};
88
147
 
89
148
 
90
149
  var
91
- version = "3.2.1",
150
+ version = "3.5.1",
92
151
 
93
152
  // Define a local copy of jQuery
94
153
  jQuery = function( selector, context ) {
@@ -96,19 +155,6 @@ var
96
155
  // The jQuery object is actually just the init constructor 'enhanced'
97
156
  // Need init if jQuery is called (just allow error to be thrown if not included)
98
157
  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
158
  };
113
159
 
114
160
  jQuery.fn = jQuery.prototype = {
@@ -175,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
175
221
  return this.eq( -1 );
176
222
  },
177
223
 
224
+ even: function() {
225
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
226
+ return ( i + 1 ) % 2;
227
+ } ) );
228
+ },
229
+
230
+ odd: function() {
231
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
232
+ return i % 2;
233
+ } ) );
234
+ },
235
+
178
236
  eq: function( i ) {
179
237
  var len = this.length,
180
238
  j = +i + ( i < 0 ? len : 0 );
@@ -209,7 +267,7 @@ jQuery.extend = jQuery.fn.extend = function() {
209
267
  }
210
268
 
211
269
  // Handle case when target is a string or something (possible in deep copy)
212
- if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
270
+ if ( typeof target !== "object" && !isFunction( target ) ) {
213
271
  target = {};
214
272
  }
215
273
 
@@ -226,25 +284,28 @@ jQuery.extend = jQuery.fn.extend = function() {
226
284
 
227
285
  // Extend the base object
228
286
  for ( name in options ) {
229
- src = target[ name ];
230
287
  copy = options[ name ];
231
288
 
289
+ // Prevent Object.prototype pollution
232
290
  // Prevent never-ending loop
233
- if ( target === copy ) {
291
+ if ( name === "__proto__" || target === copy ) {
234
292
  continue;
235
293
  }
236
294
 
237
295
  // Recurse if we're merging plain objects or arrays
238
296
  if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
239
297
  ( copyIsArray = Array.isArray( copy ) ) ) ) {
298
+ src = target[ name ];
240
299
 
241
- if ( copyIsArray ) {
242
- copyIsArray = false;
243
- clone = src && Array.isArray( src ) ? src : [];
244
-
300
+ // Ensure proper type for the source value
301
+ if ( copyIsArray && !Array.isArray( src ) ) {
302
+ clone = [];
303
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
304
+ clone = {};
245
305
  } else {
246
- clone = src && jQuery.isPlainObject( src ) ? src : {};
306
+ clone = src;
247
307
  }
308
+ copyIsArray = false;
248
309
 
249
310
  // Never move original objects, clone them
250
311
  target[ name ] = jQuery.extend( deep, clone, copy );
@@ -275,28 +336,6 @@ jQuery.extend( {
275
336
 
276
337
  noop: function() {},
277
338
 
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
339
  isPlainObject: function( obj ) {
301
340
  var proto, Ctor;
302
341
 
@@ -319,9 +358,6 @@ jQuery.extend( {
319
358
  },
320
359
 
321
360
  isEmptyObject: function( obj ) {
322
-
323
- /* eslint-disable no-unused-vars */
324
- // See https://github.com/eslint/eslint/issues/6125
325
361
  var name;
326
362
 
327
363
  for ( name in obj ) {
@@ -330,27 +366,10 @@ jQuery.extend( {
330
366
  return true;
331
367
  },
332
368
 
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 );
369
+ // Evaluates a script in a provided context; falls back to the global one
370
+ // if not specified.
371
+ globalEval: function( code, options, doc ) {
372
+ DOMEval( code, { nonce: options && options.nonce }, doc );
354
373
  },
355
374
 
356
375
  each: function( obj, callback ) {
@@ -374,13 +393,6 @@ jQuery.extend( {
374
393
  return obj;
375
394
  },
376
395
 
377
- // Support: Android <=4.0 only
378
- trim: function( text ) {
379
- return text == null ?
380
- "" :
381
- ( text + "" ).replace( rtrim, "" );
382
- },
383
-
384
396
  // results is for internal usage only
385
397
  makeArray: function( arr, results ) {
386
398
  var ret = results || [];
@@ -467,43 +479,12 @@ jQuery.extend( {
467
479
  }
468
480
 
469
481
  // Flatten any nested arrays
470
- return concat.apply( [], ret );
482
+ return flat( ret );
471
483
  },
472
484
 
473
485
  // A global GUID counter for objects
474
486
  guid: 1,
475
487
 
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
488
  // jQuery.support is not used in Core but other projects attach their
508
489
  // properties to it so it needs to exist.
509
490
  support: support
@@ -515,7 +496,7 @@ if ( typeof Symbol === "function" ) {
515
496
 
516
497
  // Populate the class2type map
517
498
  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
518
- function( i, name ) {
499
+ function( _i, name ) {
519
500
  class2type[ "[object " + name + "]" ] = name.toLowerCase();
520
501
  } );
521
502
 
@@ -526,9 +507,9 @@ function isArrayLike( obj ) {
526
507
  // hasOwn isn't used here due to false negatives
527
508
  // regarding Nodelist length in IE
528
509
  var length = !!obj && "length" in obj && obj.length,
529
- type = jQuery.type( obj );
510
+ type = toType( obj );
530
511
 
531
- if ( type === "function" || jQuery.isWindow( obj ) ) {
512
+ if ( isFunction( obj ) || isWindow( obj ) ) {
532
513
  return false;
533
514
  }
534
515
 
@@ -537,17 +518,16 @@ function isArrayLike( obj ) {
537
518
  }
538
519
  var Sizzle =
539
520
  /*!
540
- * Sizzle CSS Selector Engine v2.3.3
521
+ * Sizzle CSS Selector Engine v2.3.5
541
522
  * https://sizzlejs.com/
542
523
  *
543
- * Copyright jQuery Foundation and other contributors
524
+ * Copyright JS Foundation and other contributors
544
525
  * Released under the MIT license
545
- * http://jquery.org/license
526
+ * https://js.foundation/
546
527
  *
547
- * Date: 2016-08-08
528
+ * Date: 2020-03-14
548
529
  */
549
- (function( window ) {
550
-
530
+ ( function( window ) {
551
531
  var i,
552
532
  support,
553
533
  Expr,
@@ -578,6 +558,7 @@ var i,
578
558
  classCache = createCache(),
579
559
  tokenCache = createCache(),
580
560
  compilerCache = createCache(),
561
+ nonnativeSelectorCache = createCache(),
581
562
  sortOrder = function( a, b ) {
582
563
  if ( a === b ) {
583
564
  hasDuplicate = true;
@@ -586,61 +567,71 @@ var i,
586
567
  },
587
568
 
588
569
  // Instance methods
589
- hasOwn = ({}).hasOwnProperty,
570
+ hasOwn = ( {} ).hasOwnProperty,
590
571
  arr = [],
591
572
  pop = arr.pop,
592
- push_native = arr.push,
573
+ pushNative = arr.push,
593
574
  push = arr.push,
594
575
  slice = arr.slice,
576
+
595
577
  // Use a stripped-down indexOf as it's faster than native
596
578
  // https://jsperf.com/thor-indexof-vs-for/5
597
579
  indexOf = function( list, elem ) {
598
580
  var i = 0,
599
581
  len = list.length;
600
582
  for ( ; i < len; i++ ) {
601
- if ( list[i] === elem ) {
583
+ if ( list[ i ] === elem ) {
602
584
  return i;
603
585
  }
604
586
  }
605
587
  return -1;
606
588
  },
607
589
 
608
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
590
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
591
+ "ismap|loop|multiple|open|readonly|required|scoped",
609
592
 
610
593
  // Regular expressions
611
594
 
612
595
  // http://www.w3.org/TR/css3-selectors/#whitespace
613
596
  whitespace = "[\\x20\\t\\r\\n\\f]",
614
597
 
615
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
616
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
598
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
599
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
600
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
617
601
 
618
602
  // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
619
603
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
604
+
620
605
  // Operator (capture 2)
621
606
  "*([*^$|!~]?=)" + whitespace +
622
- // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
623
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
624
- "*\\]",
607
+
608
+ // "Attribute values must be CSS identifiers [capture 5]
609
+ // or strings [capture 3 or capture 4]"
610
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
611
+ whitespace + "*\\]",
625
612
 
626
613
  pseudos = ":(" + identifier + ")(?:\\((" +
614
+
627
615
  // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
628
616
  // 1. quoted (capture 3; capture 4 or capture 5)
629
617
  "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
618
+
630
619
  // 2. simple (capture 6)
631
620
  "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
621
+
632
622
  // 3. anything else (capture 2)
633
623
  ".*" +
634
624
  ")\\)|)",
635
625
 
636
626
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
637
627
  rwhitespace = new RegExp( whitespace + "+", "g" ),
638
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
628
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
629
+ whitespace + "+$", "g" ),
639
630
 
640
631
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
641
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
642
-
643
- rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
632
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
633
+ "*" ),
634
+ rdescend = new RegExp( whitespace + "|>" ),
644
635
 
645
636
  rpseudo = new RegExp( pseudos ),
646
637
  ridentifier = new RegExp( "^" + identifier + "$" ),
@@ -651,16 +642,19 @@ var i,
651
642
  "TAG": new RegExp( "^(" + identifier + "|[*])" ),
652
643
  "ATTR": new RegExp( "^" + attributes ),
653
644
  "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" ),
645
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
646
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
647
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
657
648
  "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
649
+
658
650
  // For use in libraries implementing .is()
659
651
  // 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" )
652
+ "needsContext": new RegExp( "^" + whitespace +
653
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
654
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
662
655
  },
663
656
 
657
+ rhtml = /HTML$/i,
664
658
  rinputs = /^(?:input|select|textarea|button)$/i,
665
659
  rheader = /^h\d$/i,
666
660
 
@@ -673,18 +667,21 @@ var i,
673
667
 
674
668
  // CSS escapes
675
669
  // 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 :
670
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
671
+ funescape = function( escape, nonHex ) {
672
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
673
+
674
+ return nonHex ?
675
+
676
+ // Strip the backslash prefix from a non-hex escape sequence
677
+ nonHex :
678
+
679
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
680
+ // Support: IE <=11+
681
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
682
+ // surrogate pair
684
683
  high < 0 ?
685
- // BMP codepoint
686
684
  String.fromCharCode( high + 0x10000 ) :
687
- // Supplemental Plane codepoint (surrogate pair)
688
685
  String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
689
686
  },
690
687
 
@@ -700,7 +697,8 @@ var i,
700
697
  }
701
698
 
702
699
  // 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 ) + " ";
700
+ return ch.slice( 0, -1 ) + "\\" +
701
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
704
702
  }
705
703
 
706
704
  // Other potentially-special ASCII characters get backslash-escaped
@@ -715,9 +713,9 @@ var i,
715
713
  setDocument();
716
714
  },
717
715
 
718
- disabledAncestor = addCombinator(
716
+ inDisabledFieldset = addCombinator(
719
717
  function( elem ) {
720
- return elem.disabled === true && ("form" in elem || "label" in elem);
718
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
721
719
  },
722
720
  { dir: "parentNode", next: "legend" }
723
721
  );
@@ -725,18 +723,20 @@ var i,
725
723
  // Optimize for push.apply( _, NodeList )
726
724
  try {
727
725
  push.apply(
728
- (arr = slice.call( preferredDoc.childNodes )),
726
+ ( arr = slice.call( preferredDoc.childNodes ) ),
729
727
  preferredDoc.childNodes
730
728
  );
729
+
731
730
  // Support: Android<4.0
732
731
  // Detect silently failing push.apply
732
+ // eslint-disable-next-line no-unused-expressions
733
733
  arr[ preferredDoc.childNodes.length ].nodeType;
734
734
  } catch ( e ) {
735
735
  push = { apply: arr.length ?
736
736
 
737
737
  // Leverage slice if possible
738
738
  function( target, els ) {
739
- push_native.apply( target, slice.call(els) );
739
+ pushNative.apply( target, slice.call( els ) );
740
740
  } :
741
741
 
742
742
  // Support: IE<9
@@ -744,8 +744,9 @@ try {
744
744
  function( target, els ) {
745
745
  var j = target.length,
746
746
  i = 0;
747
+
747
748
  // Can't trust NodeList.length
748
- while ( (target[j++] = els[i++]) ) {}
749
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
749
750
  target.length = j - 1;
750
751
  }
751
752
  };
@@ -769,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
769
770
 
770
771
  // Try to shortcut find operations (as opposed to filters) in HTML documents
771
772
  if ( !seed ) {
772
-
773
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
774
- setDocument( context );
775
- }
773
+ setDocument( context );
776
774
  context = context || document;
777
775
 
778
776
  if ( documentIsHTML ) {
779
777
 
780
778
  // If the selector is sufficiently simple, try using a "get*By*" DOM method
781
779
  // (excepting DocumentFragment context, where the methods don't exist)
782
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
780
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
783
781
 
784
782
  // ID selector
785
- if ( (m = match[1]) ) {
783
+ if ( ( m = match[ 1 ] ) ) {
786
784
 
787
785
  // Document context
788
786
  if ( nodeType === 9 ) {
789
- if ( (elem = context.getElementById( m )) ) {
787
+ if ( ( elem = context.getElementById( m ) ) ) {
790
788
 
791
789
  // Support: IE, Opera, Webkit
792
790
  // TODO: identify versions
@@ -805,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
805
803
  // Support: IE, Opera, Webkit
806
804
  // TODO: identify versions
807
805
  // getElementById can match elements by name instead of ID
808
- if ( newContext && (elem = newContext.getElementById( m )) &&
806
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
809
807
  contains( context, elem ) &&
810
808
  elem.id === m ) {
811
809
 
@@ -815,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
815
813
  }
816
814
 
817
815
  // Type selector
818
- } else if ( match[2] ) {
816
+ } else if ( match[ 2 ] ) {
819
817
  push.apply( results, context.getElementsByTagName( selector ) );
820
818
  return results;
821
819
 
822
820
  // Class selector
823
- } else if ( (m = match[3]) && support.getElementsByClassName &&
821
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
824
822
  context.getElementsByClassName ) {
825
823
 
826
824
  push.apply( results, context.getElementsByClassName( m ) );
@@ -830,50 +828,62 @@ function Sizzle( selector, context, results, seed ) {
830
828
 
831
829
  // Take advantage of querySelectorAll
832
830
  if ( support.qsa &&
833
- !compilerCache[ selector + " " ] &&
834
- (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
835
-
836
- if ( nodeType !== 1 ) {
837
- newContext = context;
838
- newSelector = selector;
831
+ !nonnativeSelectorCache[ selector + " " ] &&
832
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
839
833
 
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
834
+ // Support: IE 8 only
843
835
  // Exclude object elements
844
- } else if ( context.nodeName.toLowerCase() !== "object" ) {
836
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
845
837
 
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) );
838
+ newSelector = selector;
839
+ newContext = context;
840
+
841
+ // qSA considers elements outside a scoping root when evaluating child or
842
+ // descendant combinators, which is not what we want.
843
+ // In such cases, we work around the behavior by prefixing every selector in the
844
+ // list with an ID selector referencing the scope context.
845
+ // The technique has to be used as well when a leading combinator is used
846
+ // as such selectors are not recognized by querySelectorAll.
847
+ // Thanks to Andrew Dupont for this technique.
848
+ if ( nodeType === 1 &&
849
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
850
+
851
+ // Expand context for sibling selectors
852
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
853
+ context;
854
+
855
+ // We can use :scope instead of the ID hack if the browser
856
+ // supports it & if we're not changing the context.
857
+ if ( newContext !== context || !support.scope ) {
858
+
859
+ // Capture the context ID, setting it first if necessary
860
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
861
+ nid = nid.replace( rcssescape, fcssescape );
862
+ } else {
863
+ context.setAttribute( "id", ( nid = expando ) );
864
+ }
851
865
  }
852
866
 
853
867
  // Prefix every selector in the list
854
868
  groups = tokenize( selector );
855
869
  i = groups.length;
856
870
  while ( i-- ) {
857
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
871
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
872
+ toSelector( groups[ i ] );
858
873
  }
859
874
  newSelector = groups.join( "," );
860
-
861
- // Expand context for sibling selectors
862
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
863
- context;
864
875
  }
865
876
 
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
+ try {
878
+ push.apply( results,
879
+ newContext.querySelectorAll( newSelector )
880
+ );
881
+ return results;
882
+ } catch ( qsaError ) {
883
+ nonnativeSelectorCache( selector, true );
884
+ } finally {
885
+ if ( nid === expando ) {
886
+ context.removeAttribute( "id" );
877
887
  }
878
888
  }
879
889
  }
@@ -894,12 +904,14 @@ function createCache() {
894
904
  var keys = [];
895
905
 
896
906
  function cache( key, value ) {
907
+
897
908
  // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
898
909
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
910
+
899
911
  // Only keep the most recent entries
900
912
  delete cache[ keys.shift() ];
901
913
  }
902
- return (cache[ key + " " ] = value);
914
+ return ( cache[ key + " " ] = value );
903
915
  }
904
916
  return cache;
905
917
  }
@@ -918,17 +930,19 @@ function markFunction( fn ) {
918
930
  * @param {Function} fn Passed the created element and returns a boolean result
919
931
  */
920
932
  function assert( fn ) {
921
- var el = document.createElement("fieldset");
933
+ var el = document.createElement( "fieldset" );
922
934
 
923
935
  try {
924
936
  return !!fn( el );
925
- } catch (e) {
937
+ } catch ( e ) {
926
938
  return false;
927
939
  } finally {
940
+
928
941
  // Remove from its parent by default
929
942
  if ( el.parentNode ) {
930
943
  el.parentNode.removeChild( el );
931
944
  }
945
+
932
946
  // release memory in IE
933
947
  el = null;
934
948
  }
@@ -940,11 +954,11 @@ function assert( fn ) {
940
954
  * @param {Function} handler The method that will be applied
941
955
  */
942
956
  function addHandle( attrs, handler ) {
943
- var arr = attrs.split("|"),
957
+ var arr = attrs.split( "|" ),
944
958
  i = arr.length;
945
959
 
946
960
  while ( i-- ) {
947
- Expr.attrHandle[ arr[i] ] = handler;
961
+ Expr.attrHandle[ arr[ i ] ] = handler;
948
962
  }
949
963
  }
950
964
 
@@ -966,7 +980,7 @@ function siblingCheck( a, b ) {
966
980
 
967
981
  // Check if b follows a
968
982
  if ( cur ) {
969
- while ( (cur = cur.nextSibling) ) {
983
+ while ( ( cur = cur.nextSibling ) ) {
970
984
  if ( cur === b ) {
971
985
  return -1;
972
986
  }
@@ -994,7 +1008,7 @@ function createInputPseudo( type ) {
994
1008
  function createButtonPseudo( type ) {
995
1009
  return function( elem ) {
996
1010
  var name = elem.nodeName.toLowerCase();
997
- return (name === "input" || name === "button") && elem.type === type;
1011
+ return ( name === "input" || name === "button" ) && elem.type === type;
998
1012
  };
999
1013
  }
1000
1014
 
@@ -1037,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
1037
1051
  // Where there is no isDisabled, check manually
1038
1052
  /* jshint -W018 */
1039
1053
  elem.isDisabled !== !disabled &&
1040
- disabledAncestor( elem ) === disabled;
1054
+ inDisabledFieldset( elem ) === disabled;
1041
1055
  }
1042
1056
 
1043
1057
  return elem.disabled === disabled;
@@ -1059,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
1059
1073
  * @param {Function} fn
1060
1074
  */
1061
1075
  function createPositionalPseudo( fn ) {
1062
- return markFunction(function( argument ) {
1076
+ return markFunction( function( argument ) {
1063
1077
  argument = +argument;
1064
- return markFunction(function( seed, matches ) {
1078
+ return markFunction( function( seed, matches ) {
1065
1079
  var j,
1066
1080
  matchIndexes = fn( [], seed.length, argument ),
1067
1081
  i = matchIndexes.length;
1068
1082
 
1069
1083
  // Match elements found at the specified indexes
1070
1084
  while ( i-- ) {
1071
- if ( seed[ (j = matchIndexes[i]) ] ) {
1072
- seed[j] = !(matches[j] = seed[j]);
1085
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1086
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
1073
1087
  }
1074
1088
  }
1075
- });
1076
- });
1089
+ } );
1090
+ } );
1077
1091
  }
1078
1092
 
1079
1093
  /**
@@ -1094,10 +1108,13 @@ support = Sizzle.support = {};
1094
1108
  * @returns {Boolean} True iff elem is a non-HTML XML node
1095
1109
  */
1096
1110
  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;
1111
+ var namespace = elem.namespaceURI,
1112
+ docElem = ( elem.ownerDocument || elem ).documentElement;
1113
+
1114
+ // Support: IE <=8
1115
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1116
+ // https://bugs.jquery.com/ticket/4833
1117
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1101
1118
  };
1102
1119
 
1103
1120
  /**
@@ -1110,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1110
1127
  doc = node ? node.ownerDocument || node : preferredDoc;
1111
1128
 
1112
1129
  // Return early if doc is invalid or already selected
1113
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1130
+ // Support: IE 11+, Edge 17 - 18+
1131
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1132
+ // two documents; shallow comparisons work.
1133
+ // eslint-disable-next-line eqeqeq
1134
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1114
1135
  return document;
1115
1136
  }
1116
1137
 
@@ -1119,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1119
1140
  docElem = document.documentElement;
1120
1141
  documentIsHTML = !isXML( document );
1121
1142
 
1122
- // Support: IE 9-11, Edge
1143
+ // Support: IE 9 - 11+, Edge 12 - 18+
1123
1144
  // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1124
- if ( preferredDoc !== document &&
1125
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1145
+ // Support: IE 11+, Edge 17 - 18+
1146
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1147
+ // two documents; shallow comparisons work.
1148
+ // eslint-disable-next-line eqeqeq
1149
+ if ( preferredDoc != document &&
1150
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1126
1151
 
1127
1152
  // Support: IE 11, Edge
1128
1153
  if ( subWindow.addEventListener ) {
@@ -1134,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
1134
1159
  }
1135
1160
  }
1136
1161
 
1162
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
1163
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
1164
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
1165
+ // Support: Safari 6.0 only
1166
+ // Safari 6.0 supports :scope but it's an alias of :root there.
1167
+ support.scope = assert( function( el ) {
1168
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
1169
+ return typeof el.querySelectorAll !== "undefined" &&
1170
+ !el.querySelectorAll( ":scope fieldset div" ).length;
1171
+ } );
1172
+
1137
1173
  /* Attributes
1138
1174
  ---------------------------------------------------------------------- */
1139
1175
 
1140
1176
  // Support: IE<8
1141
1177
  // Verify that getAttribute really returns attributes and not properties
1142
1178
  // (excepting IE8 booleans)
1143
- support.attributes = assert(function( el ) {
1179
+ support.attributes = assert( function( el ) {
1144
1180
  el.className = "i";
1145
- return !el.getAttribute("className");
1146
- });
1181
+ return !el.getAttribute( "className" );
1182
+ } );
1147
1183
 
1148
1184
  /* getElement(s)By*
1149
1185
  ---------------------------------------------------------------------- */
1150
1186
 
1151
1187
  // Check if getElementsByTagName("*") returns only elements
1152
- support.getElementsByTagName = assert(function( el ) {
1153
- el.appendChild( document.createComment("") );
1154
- return !el.getElementsByTagName("*").length;
1155
- });
1188
+ support.getElementsByTagName = assert( function( el ) {
1189
+ el.appendChild( document.createComment( "" ) );
1190
+ return !el.getElementsByTagName( "*" ).length;
1191
+ } );
1156
1192
 
1157
1193
  // Support: IE<9
1158
1194
  support.getElementsByClassName = rnative.test( document.getElementsByClassName );
@@ -1161,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
1161
1197
  // Check if getElementById returns elements by name
1162
1198
  // The broken getElementById methods don't pick up programmatically-set names,
1163
1199
  // so use a roundabout getElementsByName test
1164
- support.getById = assert(function( el ) {
1200
+ support.getById = assert( function( el ) {
1165
1201
  docElem.appendChild( el ).id = expando;
1166
1202
  return !document.getElementsByName || !document.getElementsByName( expando ).length;
1167
- });
1203
+ } );
1168
1204
 
1169
1205
  // ID filter and find
1170
1206
  if ( support.getById ) {
1171
- Expr.filter["ID"] = function( id ) {
1207
+ Expr.filter[ "ID" ] = function( id ) {
1172
1208
  var attrId = id.replace( runescape, funescape );
1173
1209
  return function( elem ) {
1174
- return elem.getAttribute("id") === attrId;
1210
+ return elem.getAttribute( "id" ) === attrId;
1175
1211
  };
1176
1212
  };
1177
- Expr.find["ID"] = function( id, context ) {
1213
+ Expr.find[ "ID" ] = function( id, context ) {
1178
1214
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1179
1215
  var elem = context.getElementById( id );
1180
1216
  return elem ? [ elem ] : [];
1181
1217
  }
1182
1218
  };
1183
1219
  } else {
1184
- Expr.filter["ID"] = function( id ) {
1220
+ Expr.filter[ "ID" ] = function( id ) {
1185
1221
  var attrId = id.replace( runescape, funescape );
1186
1222
  return function( elem ) {
1187
1223
  var node = typeof elem.getAttributeNode !== "undefined" &&
1188
- elem.getAttributeNode("id");
1224
+ elem.getAttributeNode( "id" );
1189
1225
  return node && node.value === attrId;
1190
1226
  };
1191
1227
  };
1192
1228
 
1193
1229
  // Support: IE 6 - 7 only
1194
1230
  // getElementById is not reliable as a find shortcut
1195
- Expr.find["ID"] = function( id, context ) {
1231
+ Expr.find[ "ID" ] = function( id, context ) {
1196
1232
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1197
1233
  var node, i, elems,
1198
1234
  elem = context.getElementById( id );
@@ -1200,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1200
1236
  if ( elem ) {
1201
1237
 
1202
1238
  // Verify the id attribute
1203
- node = elem.getAttributeNode("id");
1239
+ node = elem.getAttributeNode( "id" );
1204
1240
  if ( node && node.value === id ) {
1205
1241
  return [ elem ];
1206
1242
  }
@@ -1208,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1208
1244
  // Fall back on getElementsByName
1209
1245
  elems = context.getElementsByName( id );
1210
1246
  i = 0;
1211
- while ( (elem = elems[i++]) ) {
1212
- node = elem.getAttributeNode("id");
1247
+ while ( ( elem = elems[ i++ ] ) ) {
1248
+ node = elem.getAttributeNode( "id" );
1213
1249
  if ( node && node.value === id ) {
1214
1250
  return [ elem ];
1215
1251
  }
@@ -1222,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1222
1258
  }
1223
1259
 
1224
1260
  // Tag
1225
- Expr.find["TAG"] = support.getElementsByTagName ?
1261
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
1226
1262
  function( tag, context ) {
1227
1263
  if ( typeof context.getElementsByTagName !== "undefined" ) {
1228
1264
  return context.getElementsByTagName( tag );
@@ -1237,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
1237
1273
  var elem,
1238
1274
  tmp = [],
1239
1275
  i = 0,
1276
+
1240
1277
  // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1241
1278
  results = context.getElementsByTagName( tag );
1242
1279
 
1243
1280
  // Filter out possible comments
1244
1281
  if ( tag === "*" ) {
1245
- while ( (elem = results[i++]) ) {
1282
+ while ( ( elem = results[ i++ ] ) ) {
1246
1283
  if ( elem.nodeType === 1 ) {
1247
1284
  tmp.push( elem );
1248
1285
  }
@@ -1254,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1254
1291
  };
1255
1292
 
1256
1293
  // Class
1257
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1294
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
1258
1295
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1259
1296
  return context.getElementsByClassName( className );
1260
1297
  }
@@ -1275,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1275
1312
  // See https://bugs.jquery.com/ticket/13378
1276
1313
  rbuggyQSA = [];
1277
1314
 
1278
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1315
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
1316
+
1279
1317
  // Build QSA regex
1280
1318
  // Regex strategy adopted from Diego Perini
1281
- assert(function( el ) {
1319
+ assert( function( el ) {
1320
+
1321
+ var input;
1322
+
1282
1323
  // Select is set to empty string on purpose
1283
1324
  // This is to test IE's treatment of not explicitly
1284
1325
  // setting a boolean content attribute,
@@ -1292,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
1292
1333
  // Nothing should be selected when empty strings follow ^= or $= or *=
1293
1334
  // The test attribute must be unknown in Opera but "safe" for WinRT
1294
1335
  // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1295
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1336
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
1296
1337
  rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1297
1338
  }
1298
1339
 
1299
1340
  // Support: IE8
1300
1341
  // Boolean attributes and "value" are not treated correctly
1301
- if ( !el.querySelectorAll("[selected]").length ) {
1342
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1302
1343
  rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1303
1344
  }
1304
1345
 
1305
1346
  // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1306
1347
  if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1307
- rbuggyQSA.push("~=");
1348
+ rbuggyQSA.push( "~=" );
1349
+ }
1350
+
1351
+ // Support: IE 11+, Edge 15 - 18+
1352
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1353
+ // Adding a temporary attribute to the document before the selection works
1354
+ // around the issue.
1355
+ // Interestingly, IE 10 & older don't seem to have the issue.
1356
+ input = document.createElement( "input" );
1357
+ input.setAttribute( "name", "" );
1358
+ el.appendChild( input );
1359
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1360
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1361
+ whitespace + "*(?:''|\"\")" );
1308
1362
  }
1309
1363
 
1310
1364
  // Webkit/Opera - :checked should return selected option elements
1311
1365
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1312
1366
  // IE8 throws error here and will not see later tests
1313
- if ( !el.querySelectorAll(":checked").length ) {
1314
- rbuggyQSA.push(":checked");
1367
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1368
+ rbuggyQSA.push( ":checked" );
1315
1369
  }
1316
1370
 
1317
1371
  // Support: Safari 8+, iOS 8+
1318
1372
  // https://bugs.webkit.org/show_bug.cgi?id=136851
1319
1373
  // In-page `selector#id sibling-combinator selector` fails
1320
1374
  if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1321
- rbuggyQSA.push(".#.+[+~]");
1375
+ rbuggyQSA.push( ".#.+[+~]" );
1322
1376
  }
1323
- });
1324
1377
 
1325
- assert(function( el ) {
1378
+ // Support: Firefox <=3.6 - 5 only
1379
+ // Old Firefox doesn't throw on a badly-escaped identifier.
1380
+ el.querySelectorAll( "\\\f" );
1381
+ rbuggyQSA.push( "[\\r\\n\\f]" );
1382
+ } );
1383
+
1384
+ assert( function( el ) {
1326
1385
  el.innerHTML = "<a href='' disabled='disabled'></a>" +
1327
1386
  "<select disabled='disabled'><option/></select>";
1328
1387
 
1329
1388
  // Support: Windows 8 Native Apps
1330
1389
  // The type and name attributes are restricted during .innerHTML assignment
1331
- var input = document.createElement("input");
1390
+ var input = document.createElement( "input" );
1332
1391
  input.setAttribute( "type", "hidden" );
1333
1392
  el.appendChild( input ).setAttribute( "name", "D" );
1334
1393
 
1335
1394
  // Support: IE8
1336
1395
  // Enforce case-sensitivity of name attribute
1337
- if ( el.querySelectorAll("[name=d]").length ) {
1396
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
1338
1397
  rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1339
1398
  }
1340
1399
 
1341
1400
  // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1342
1401
  // IE8 throws error here and will not see later tests
1343
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
1402
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
1344
1403
  rbuggyQSA.push( ":enabled", ":disabled" );
1345
1404
  }
1346
1405
 
1347
1406
  // Support: IE9-11+
1348
1407
  // IE's :disabled selector does not pick up the children of disabled fieldsets
1349
1408
  docElem.appendChild( el ).disabled = true;
1350
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
1409
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1351
1410
  rbuggyQSA.push( ":enabled", ":disabled" );
1352
1411
  }
1353
1412
 
1413
+ // Support: Opera 10 - 11 only
1354
1414
  // Opera 10-11 does not throw on post-comma invalid pseudos
1355
- el.querySelectorAll("*,:x");
1356
- rbuggyQSA.push(",.*:");
1357
- });
1415
+ el.querySelectorAll( "*,:x" );
1416
+ rbuggyQSA.push( ",.*:" );
1417
+ } );
1358
1418
  }
1359
1419
 
1360
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1420
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
1361
1421
  docElem.webkitMatchesSelector ||
1362
1422
  docElem.mozMatchesSelector ||
1363
1423
  docElem.oMatchesSelector ||
1364
- docElem.msMatchesSelector) )) ) {
1424
+ docElem.msMatchesSelector ) ) ) ) {
1425
+
1426
+ assert( function( el ) {
1365
1427
 
1366
- assert(function( el ) {
1367
1428
  // Check to see if it's possible to do matchesSelector
1368
1429
  // on a disconnected node (IE 9)
1369
1430
  support.disconnectedMatch = matches.call( el, "*" );
@@ -1372,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1372
1433
  // Gecko does not error, returns false instead
1373
1434
  matches.call( el, "[s!='']:x" );
1374
1435
  rbuggyMatches.push( "!=", pseudos );
1375
- });
1436
+ } );
1376
1437
  }
1377
1438
 
1378
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1379
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1439
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1440
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
1380
1441
 
1381
1442
  /* Contains
1382
1443
  ---------------------------------------------------------------------- */
@@ -1393,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1393
1454
  adown.contains ?
1394
1455
  adown.contains( bup ) :
1395
1456
  a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1396
- ));
1457
+ ) );
1397
1458
  } :
1398
1459
  function( a, b ) {
1399
1460
  if ( b ) {
1400
- while ( (b = b.parentNode) ) {
1461
+ while ( ( b = b.parentNode ) ) {
1401
1462
  if ( b === a ) {
1402
1463
  return true;
1403
1464
  }
@@ -1426,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1426
1487
  }
1427
1488
 
1428
1489
  // Calculate position if both inputs belong to the same document
1429
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1490
+ // Support: IE 11+, Edge 17 - 18+
1491
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1492
+ // two documents; shallow comparisons work.
1493
+ // eslint-disable-next-line eqeqeq
1494
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1430
1495
  a.compareDocumentPosition( b ) :
1431
1496
 
1432
1497
  // Otherwise we know they are disconnected
@@ -1434,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
1434
1499
 
1435
1500
  // Disconnected nodes
1436
1501
  if ( compare & 1 ||
1437
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1502
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1438
1503
 
1439
1504
  // Choose the first element that is related to our preferred document
1440
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1505
+ // Support: IE 11+, Edge 17 - 18+
1506
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1507
+ // two documents; shallow comparisons work.
1508
+ // eslint-disable-next-line eqeqeq
1509
+ if ( a == document || a.ownerDocument == preferredDoc &&
1510
+ contains( preferredDoc, a ) ) {
1441
1511
  return -1;
1442
1512
  }
1443
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1513
+
1514
+ // Support: IE 11+, Edge 17 - 18+
1515
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1516
+ // two documents; shallow comparisons work.
1517
+ // eslint-disable-next-line eqeqeq
1518
+ if ( b == document || b.ownerDocument == preferredDoc &&
1519
+ contains( preferredDoc, b ) ) {
1444
1520
  return 1;
1445
1521
  }
1446
1522
 
@@ -1453,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1453
1529
  return compare & 4 ? -1 : 1;
1454
1530
  } :
1455
1531
  function( a, b ) {
1532
+
1456
1533
  // Exit early if the nodes are identical
1457
1534
  if ( a === b ) {
1458
1535
  hasDuplicate = true;
@@ -1468,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
1468
1545
 
1469
1546
  // Parentless nodes are either documents or disconnected
1470
1547
  if ( !aup || !bup ) {
1471
- return a === document ? -1 :
1472
- b === document ? 1 :
1548
+
1549
+ // Support: IE 11+, Edge 17 - 18+
1550
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1551
+ // two documents; shallow comparisons work.
1552
+ /* eslint-disable eqeqeq */
1553
+ return a == document ? -1 :
1554
+ b == document ? 1 :
1555
+ /* eslint-enable eqeqeq */
1473
1556
  aup ? -1 :
1474
1557
  bup ? 1 :
1475
1558
  sortInput ?
@@ -1483,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
1483
1566
 
1484
1567
  // Otherwise we need full lists of their ancestors for comparison
1485
1568
  cur = a;
1486
- while ( (cur = cur.parentNode) ) {
1569
+ while ( ( cur = cur.parentNode ) ) {
1487
1570
  ap.unshift( cur );
1488
1571
  }
1489
1572
  cur = b;
1490
- while ( (cur = cur.parentNode) ) {
1573
+ while ( ( cur = cur.parentNode ) ) {
1491
1574
  bp.unshift( cur );
1492
1575
  }
1493
1576
 
1494
1577
  // Walk down the tree looking for a discrepancy
1495
- while ( ap[i] === bp[i] ) {
1578
+ while ( ap[ i ] === bp[ i ] ) {
1496
1579
  i++;
1497
1580
  }
1498
1581
 
1499
1582
  return i ?
1583
+
1500
1584
  // Do a sibling check if the nodes have a common ancestor
1501
- siblingCheck( ap[i], bp[i] ) :
1585
+ siblingCheck( ap[ i ], bp[ i ] ) :
1502
1586
 
1503
1587
  // Otherwise nodes in our document sort first
1504
- ap[i] === preferredDoc ? -1 :
1505
- bp[i] === preferredDoc ? 1 :
1588
+ // Support: IE 11+, Edge 17 - 18+
1589
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1590
+ // two documents; shallow comparisons work.
1591
+ /* eslint-disable eqeqeq */
1592
+ ap[ i ] == preferredDoc ? -1 :
1593
+ bp[ i ] == preferredDoc ? 1 :
1594
+ /* eslint-enable eqeqeq */
1506
1595
  0;
1507
1596
  };
1508
1597
 
@@ -1514,16 +1603,10 @@ Sizzle.matches = function( expr, elements ) {
1514
1603
  };
1515
1604
 
1516
1605
  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']" );
1606
+ setDocument( elem );
1524
1607
 
1525
1608
  if ( support.matchesSelector && documentIsHTML &&
1526
- !compilerCache[ expr + " " ] &&
1609
+ !nonnativeSelectorCache[ expr + " " ] &&
1527
1610
  ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1528
1611
  ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1529
1612
 
@@ -1532,32 +1615,46 @@ Sizzle.matchesSelector = function( elem, expr ) {
1532
1615
 
1533
1616
  // IE 9's matchesSelector returns false on disconnected nodes
1534
1617
  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 ) {
1618
+
1619
+ // As well, disconnected nodes are said to be in a document
1620
+ // fragment in IE 9
1621
+ elem.document && elem.document.nodeType !== 11 ) {
1538
1622
  return ret;
1539
1623
  }
1540
- } catch (e) {}
1624
+ } catch ( e ) {
1625
+ nonnativeSelectorCache( expr, true );
1626
+ }
1541
1627
  }
1542
1628
 
1543
1629
  return Sizzle( expr, document, null, [ elem ] ).length > 0;
1544
1630
  };
1545
1631
 
1546
1632
  Sizzle.contains = function( context, elem ) {
1633
+
1547
1634
  // Set document vars if needed
1548
- if ( ( context.ownerDocument || context ) !== document ) {
1635
+ // Support: IE 11+, Edge 17 - 18+
1636
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1637
+ // two documents; shallow comparisons work.
1638
+ // eslint-disable-next-line eqeqeq
1639
+ if ( ( context.ownerDocument || context ) != document ) {
1549
1640
  setDocument( context );
1550
1641
  }
1551
1642
  return contains( context, elem );
1552
1643
  };
1553
1644
 
1554
1645
  Sizzle.attr = function( elem, name ) {
1646
+
1555
1647
  // Set document vars if needed
1556
- if ( ( elem.ownerDocument || elem ) !== document ) {
1648
+ // Support: IE 11+, Edge 17 - 18+
1649
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1650
+ // two documents; shallow comparisons work.
1651
+ // eslint-disable-next-line eqeqeq
1652
+ if ( ( elem.ownerDocument || elem ) != document ) {
1557
1653
  setDocument( elem );
1558
1654
  }
1559
1655
 
1560
1656
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1657
+
1561
1658
  // Don't get fooled by Object.prototype properties (jQuery #13807)
1562
1659
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1563
1660
  fn( elem, name, !documentIsHTML ) :
@@ -1567,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
1567
1664
  val :
1568
1665
  support.attributes || !documentIsHTML ?
1569
1666
  elem.getAttribute( name ) :
1570
- (val = elem.getAttributeNode(name)) && val.specified ?
1667
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
1571
1668
  val.value :
1572
1669
  null;
1573
1670
  };
1574
1671
 
1575
1672
  Sizzle.escape = function( sel ) {
1576
- return (sel + "").replace( rcssescape, fcssescape );
1673
+ return ( sel + "" ).replace( rcssescape, fcssescape );
1577
1674
  };
1578
1675
 
1579
1676
  Sizzle.error = function( msg ) {
@@ -1596,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
1596
1693
  results.sort( sortOrder );
1597
1694
 
1598
1695
  if ( hasDuplicate ) {
1599
- while ( (elem = results[i++]) ) {
1696
+ while ( ( elem = results[ i++ ] ) ) {
1600
1697
  if ( elem === results[ i ] ) {
1601
1698
  j = duplicates.push( i );
1602
1699
  }
@@ -1624,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
1624
1721
  nodeType = elem.nodeType;
1625
1722
 
1626
1723
  if ( !nodeType ) {
1724
+
1627
1725
  // If no nodeType, this is expected to be an array
1628
- while ( (node = elem[i++]) ) {
1726
+ while ( ( node = elem[ i++ ] ) ) {
1727
+
1629
1728
  // Do not traverse comment nodes
1630
1729
  ret += getText( node );
1631
1730
  }
1632
1731
  } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1732
+
1633
1733
  // Use textContent for elements
1634
1734
  // innerText usage removed for consistency of new lines (jQuery #11153)
1635
1735
  if ( typeof elem.textContent === "string" ) {
1636
1736
  return elem.textContent;
1637
1737
  } else {
1738
+
1638
1739
  // Traverse its children
1639
1740
  for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1640
1741
  ret += getText( elem );
@@ -1643,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
1643
1744
  } else if ( nodeType === 3 || nodeType === 4 ) {
1644
1745
  return elem.nodeValue;
1645
1746
  }
1747
+
1646
1748
  // Do not include comment or processing instruction nodes
1647
1749
 
1648
1750
  return ret;
@@ -1670,19 +1772,21 @@ Expr = Sizzle.selectors = {
1670
1772
 
1671
1773
  preFilter: {
1672
1774
  "ATTR": function( match ) {
1673
- match[1] = match[1].replace( runescape, funescape );
1775
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1674
1776
 
1675
1777
  // Move the given value to match[3] whether quoted or unquoted
1676
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1778
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
1779
+ match[ 5 ] || "" ).replace( runescape, funescape );
1677
1780
 
1678
- if ( match[2] === "~=" ) {
1679
- match[3] = " " + match[3] + " ";
1781
+ if ( match[ 2 ] === "~=" ) {
1782
+ match[ 3 ] = " " + match[ 3 ] + " ";
1680
1783
  }
1681
1784
 
1682
1785
  return match.slice( 0, 4 );
1683
1786
  },
1684
1787
 
1685
1788
  "CHILD": function( match ) {
1789
+
1686
1790
  /* matches from matchExpr["CHILD"]
1687
1791
  1 type (only|nth|...)
1688
1792
  2 what (child|of-type)
@@ -1693,22 +1797,25 @@ Expr = Sizzle.selectors = {
1693
1797
  7 sign of y-component
1694
1798
  8 y of y-component
1695
1799
  */
1696
- match[1] = match[1].toLowerCase();
1800
+ match[ 1 ] = match[ 1 ].toLowerCase();
1801
+
1802
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1697
1803
 
1698
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1699
1804
  // nth-* requires argument
1700
- if ( !match[3] ) {
1701
- Sizzle.error( match[0] );
1805
+ if ( !match[ 3 ] ) {
1806
+ Sizzle.error( match[ 0 ] );
1702
1807
  }
1703
1808
 
1704
1809
  // numeric x and y parameters for Expr.filter.CHILD
1705
1810
  // 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" );
1811
+ match[ 4 ] = +( match[ 4 ] ?
1812
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
1813
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
1814
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1708
1815
 
1709
- // other types prohibit arguments
1710
- } else if ( match[3] ) {
1711
- Sizzle.error( match[0] );
1816
+ // other types prohibit arguments
1817
+ } else if ( match[ 3 ] ) {
1818
+ Sizzle.error( match[ 0 ] );
1712
1819
  }
1713
1820
 
1714
1821
  return match;
@@ -1716,26 +1823,28 @@ Expr = Sizzle.selectors = {
1716
1823
 
1717
1824
  "PSEUDO": function( match ) {
1718
1825
  var excess,
1719
- unquoted = !match[6] && match[2];
1826
+ unquoted = !match[ 6 ] && match[ 2 ];
1720
1827
 
1721
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1828
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
1722
1829
  return null;
1723
1830
  }
1724
1831
 
1725
1832
  // Accept quoted arguments as-is
1726
- if ( match[3] ) {
1727
- match[2] = match[4] || match[5] || "";
1833
+ if ( match[ 3 ] ) {
1834
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1728
1835
 
1729
1836
  // Strip excess characters from unquoted arguments
1730
1837
  } else if ( unquoted && rpseudo.test( unquoted ) &&
1838
+
1731
1839
  // Get excess from tokenize (recursively)
1732
- (excess = tokenize( unquoted, true )) &&
1840
+ ( excess = tokenize( unquoted, true ) ) &&
1841
+
1733
1842
  // advance to the next closing parenthesis
1734
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1843
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1735
1844
 
1736
1845
  // excess is a negative index
1737
- match[0] = match[0].slice( 0, excess );
1738
- match[2] = unquoted.slice( 0, excess );
1846
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
1847
+ match[ 2 ] = unquoted.slice( 0, excess );
1739
1848
  }
1740
1849
 
1741
1850
  // Return only captures needed by the pseudo filter method (type and argument)
@@ -1748,7 +1857,9 @@ Expr = Sizzle.selectors = {
1748
1857
  "TAG": function( nodeNameSelector ) {
1749
1858
  var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1750
1859
  return nodeNameSelector === "*" ?
1751
- function() { return true; } :
1860
+ function() {
1861
+ return true;
1862
+ } :
1752
1863
  function( elem ) {
1753
1864
  return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1754
1865
  };
@@ -1758,10 +1869,16 @@ Expr = Sizzle.selectors = {
1758
1869
  var pattern = classCache[ className + " " ];
1759
1870
 
1760
1871
  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
- });
1872
+ ( pattern = new RegExp( "(^|" + whitespace +
1873
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
1874
+ className, function( elem ) {
1875
+ return pattern.test(
1876
+ typeof elem.className === "string" && elem.className ||
1877
+ typeof elem.getAttribute !== "undefined" &&
1878
+ elem.getAttribute( "class" ) ||
1879
+ ""
1880
+ );
1881
+ } );
1765
1882
  },
1766
1883
 
1767
1884
  "ATTR": function( name, operator, check ) {
@@ -1777,6 +1894,8 @@ Expr = Sizzle.selectors = {
1777
1894
 
1778
1895
  result += "";
1779
1896
 
1897
+ /* eslint-disable max-len */
1898
+
1780
1899
  return operator === "=" ? result === check :
1781
1900
  operator === "!=" ? result !== check :
1782
1901
  operator === "^=" ? check && result.indexOf( check ) === 0 :
@@ -1785,10 +1904,12 @@ Expr = Sizzle.selectors = {
1785
1904
  operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1786
1905
  operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1787
1906
  false;
1907
+ /* eslint-enable max-len */
1908
+
1788
1909
  };
1789
1910
  },
1790
1911
 
1791
- "CHILD": function( type, what, argument, first, last ) {
1912
+ "CHILD": function( type, what, _argument, first, last ) {
1792
1913
  var simple = type.slice( 0, 3 ) !== "nth",
1793
1914
  forward = type.slice( -4 ) !== "last",
1794
1915
  ofType = what === "of-type";
@@ -1800,7 +1921,7 @@ Expr = Sizzle.selectors = {
1800
1921
  return !!elem.parentNode;
1801
1922
  } :
1802
1923
 
1803
- function( elem, context, xml ) {
1924
+ function( elem, _context, xml ) {
1804
1925
  var cache, uniqueCache, outerCache, node, nodeIndex, start,
1805
1926
  dir = simple !== forward ? "nextSibling" : "previousSibling",
1806
1927
  parent = elem.parentNode,
@@ -1814,7 +1935,7 @@ Expr = Sizzle.selectors = {
1814
1935
  if ( simple ) {
1815
1936
  while ( dir ) {
1816
1937
  node = elem;
1817
- while ( (node = node[ dir ]) ) {
1938
+ while ( ( node = node[ dir ] ) ) {
1818
1939
  if ( ofType ?
1819
1940
  node.nodeName.toLowerCase() === name :
1820
1941
  node.nodeType === 1 ) {
@@ -1822,6 +1943,7 @@ Expr = Sizzle.selectors = {
1822
1943
  return false;
1823
1944
  }
1824
1945
  }
1946
+
1825
1947
  // Reverse direction for :only-* (if we haven't yet done so)
1826
1948
  start = dir = type === "only" && !start && "nextSibling";
1827
1949
  }
@@ -1837,22 +1959,22 @@ Expr = Sizzle.selectors = {
1837
1959
 
1838
1960
  // ...in a gzip-friendly way
1839
1961
  node = parent;
1840
- outerCache = node[ expando ] || (node[ expando ] = {});
1962
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
1841
1963
 
1842
1964
  // Support: IE <9 only
1843
1965
  // Defend against cloned attroperties (jQuery gh-1709)
1844
1966
  uniqueCache = outerCache[ node.uniqueID ] ||
1845
- (outerCache[ node.uniqueID ] = {});
1967
+ ( outerCache[ node.uniqueID ] = {} );
1846
1968
 
1847
1969
  cache = uniqueCache[ type ] || [];
1848
1970
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1849
1971
  diff = nodeIndex && cache[ 2 ];
1850
1972
  node = nodeIndex && parent.childNodes[ nodeIndex ];
1851
1973
 
1852
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1974
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1853
1975
 
1854
1976
  // Fallback to seeking `elem` from the start
1855
- (diff = nodeIndex = 0) || start.pop()) ) {
1977
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1856
1978
 
1857
1979
  // When found, cache indexes on `parent` and break
1858
1980
  if ( node.nodeType === 1 && ++diff && node === elem ) {
@@ -1862,16 +1984,18 @@ Expr = Sizzle.selectors = {
1862
1984
  }
1863
1985
 
1864
1986
  } else {
1987
+
1865
1988
  // Use previously-cached element index if available
1866
1989
  if ( useCache ) {
1990
+
1867
1991
  // ...in a gzip-friendly way
1868
1992
  node = elem;
1869
- outerCache = node[ expando ] || (node[ expando ] = {});
1993
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
1870
1994
 
1871
1995
  // Support: IE <9 only
1872
1996
  // Defend against cloned attroperties (jQuery gh-1709)
1873
1997
  uniqueCache = outerCache[ node.uniqueID ] ||
1874
- (outerCache[ node.uniqueID ] = {});
1998
+ ( outerCache[ node.uniqueID ] = {} );
1875
1999
 
1876
2000
  cache = uniqueCache[ type ] || [];
1877
2001
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1881,9 +2005,10 @@ Expr = Sizzle.selectors = {
1881
2005
  // xml :nth-child(...)
1882
2006
  // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1883
2007
  if ( diff === false ) {
2008
+
1884
2009
  // 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()) ) {
2010
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
2011
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1887
2012
 
1888
2013
  if ( ( ofType ?
1889
2014
  node.nodeName.toLowerCase() === name :
@@ -1892,12 +2017,13 @@ Expr = Sizzle.selectors = {
1892
2017
 
1893
2018
  // Cache the index of each encountered element
1894
2019
  if ( useCache ) {
1895
- outerCache = node[ expando ] || (node[ expando ] = {});
2020
+ outerCache = node[ expando ] ||
2021
+ ( node[ expando ] = {} );
1896
2022
 
1897
2023
  // Support: IE <9 only
1898
2024
  // Defend against cloned attroperties (jQuery gh-1709)
1899
2025
  uniqueCache = outerCache[ node.uniqueID ] ||
1900
- (outerCache[ node.uniqueID ] = {});
2026
+ ( outerCache[ node.uniqueID ] = {} );
1901
2027
 
1902
2028
  uniqueCache[ type ] = [ dirruns, diff ];
1903
2029
  }
@@ -1918,6 +2044,7 @@ Expr = Sizzle.selectors = {
1918
2044
  },
1919
2045
 
1920
2046
  "PSEUDO": function( pseudo, argument ) {
2047
+
1921
2048
  // pseudo-class names are case-insensitive
1922
2049
  // http://www.w3.org/TR/selectors/#pseudo-classes
1923
2050
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
@@ -1937,15 +2064,15 @@ Expr = Sizzle.selectors = {
1937
2064
  if ( fn.length > 1 ) {
1938
2065
  args = [ pseudo, pseudo, "", argument ];
1939
2066
  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1940
- markFunction(function( seed, matches ) {
2067
+ markFunction( function( seed, matches ) {
1941
2068
  var idx,
1942
2069
  matched = fn( seed, argument ),
1943
2070
  i = matched.length;
1944
2071
  while ( i-- ) {
1945
- idx = indexOf( seed, matched[i] );
1946
- seed[ idx ] = !( matches[ idx ] = matched[i] );
2072
+ idx = indexOf( seed, matched[ i ] );
2073
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1947
2074
  }
1948
- }) :
2075
+ } ) :
1949
2076
  function( elem ) {
1950
2077
  return fn( elem, 0, args );
1951
2078
  };
@@ -1956,8 +2083,10 @@ Expr = Sizzle.selectors = {
1956
2083
  },
1957
2084
 
1958
2085
  pseudos: {
2086
+
1959
2087
  // Potentially complex pseudos
1960
- "not": markFunction(function( selector ) {
2088
+ "not": markFunction( function( selector ) {
2089
+
1961
2090
  // Trim the selector passed to compile
1962
2091
  // to avoid treating leading and trailing
1963
2092
  // spaces as combinators
@@ -1966,39 +2095,40 @@ Expr = Sizzle.selectors = {
1966
2095
  matcher = compile( selector.replace( rtrim, "$1" ) );
1967
2096
 
1968
2097
  return matcher[ expando ] ?
1969
- markFunction(function( seed, matches, context, xml ) {
2098
+ markFunction( function( seed, matches, _context, xml ) {
1970
2099
  var elem,
1971
2100
  unmatched = matcher( seed, null, xml, [] ),
1972
2101
  i = seed.length;
1973
2102
 
1974
2103
  // Match elements unmatched by `matcher`
1975
2104
  while ( i-- ) {
1976
- if ( (elem = unmatched[i]) ) {
1977
- seed[i] = !(matches[i] = elem);
2105
+ if ( ( elem = unmatched[ i ] ) ) {
2106
+ seed[ i ] = !( matches[ i ] = elem );
1978
2107
  }
1979
2108
  }
1980
- }) :
1981
- function( elem, context, xml ) {
1982
- input[0] = elem;
2109
+ } ) :
2110
+ function( elem, _context, xml ) {
2111
+ input[ 0 ] = elem;
1983
2112
  matcher( input, null, xml, results );
2113
+
1984
2114
  // Don't keep the element (issue #299)
1985
- input[0] = null;
2115
+ input[ 0 ] = null;
1986
2116
  return !results.pop();
1987
2117
  };
1988
- }),
2118
+ } ),
1989
2119
 
1990
- "has": markFunction(function( selector ) {
2120
+ "has": markFunction( function( selector ) {
1991
2121
  return function( elem ) {
1992
2122
  return Sizzle( selector, elem ).length > 0;
1993
2123
  };
1994
- }),
2124
+ } ),
1995
2125
 
1996
- "contains": markFunction(function( text ) {
2126
+ "contains": markFunction( function( text ) {
1997
2127
  text = text.replace( runescape, funescape );
1998
2128
  return function( elem ) {
1999
- return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
2129
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
2000
2130
  };
2001
- }),
2131
+ } ),
2002
2132
 
2003
2133
  // "Whether an element is represented by a :lang() selector
2004
2134
  // is based solely on the element's language value
@@ -2008,25 +2138,26 @@ Expr = Sizzle.selectors = {
2008
2138
  // The identifier C does not have to be a valid language name."
2009
2139
  // http://www.w3.org/TR/selectors/#lang-pseudo
2010
2140
  "lang": markFunction( function( lang ) {
2141
+
2011
2142
  // lang value must be a valid identifier
2012
- if ( !ridentifier.test(lang || "") ) {
2143
+ if ( !ridentifier.test( lang || "" ) ) {
2013
2144
  Sizzle.error( "unsupported lang: " + lang );
2014
2145
  }
2015
2146
  lang = lang.replace( runescape, funescape ).toLowerCase();
2016
2147
  return function( elem ) {
2017
2148
  var elemLang;
2018
2149
  do {
2019
- if ( (elemLang = documentIsHTML ?
2150
+ if ( ( elemLang = documentIsHTML ?
2020
2151
  elem.lang :
2021
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
2152
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2022
2153
 
2023
2154
  elemLang = elemLang.toLowerCase();
2024
2155
  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2025
2156
  }
2026
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
2157
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2027
2158
  return false;
2028
2159
  };
2029
- }),
2160
+ } ),
2030
2161
 
2031
2162
  // Miscellaneous
2032
2163
  "target": function( elem ) {
@@ -2039,7 +2170,9 @@ Expr = Sizzle.selectors = {
2039
2170
  },
2040
2171
 
2041
2172
  "focus": function( elem ) {
2042
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
2173
+ return elem === document.activeElement &&
2174
+ ( !document.hasFocus || document.hasFocus() ) &&
2175
+ !!( elem.type || elem.href || ~elem.tabIndex );
2043
2176
  },
2044
2177
 
2045
2178
  // Boolean properties
@@ -2047,16 +2180,20 @@ Expr = Sizzle.selectors = {
2047
2180
  "disabled": createDisabledPseudo( true ),
2048
2181
 
2049
2182
  "checked": function( elem ) {
2183
+
2050
2184
  // In CSS3, :checked should return both checked and selected elements
2051
2185
  // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2052
2186
  var nodeName = elem.nodeName.toLowerCase();
2053
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
2187
+ return ( nodeName === "input" && !!elem.checked ) ||
2188
+ ( nodeName === "option" && !!elem.selected );
2054
2189
  },
2055
2190
 
2056
2191
  "selected": function( elem ) {
2192
+
2057
2193
  // Accessing this property makes selected-by-default
2058
2194
  // options in Safari work properly
2059
2195
  if ( elem.parentNode ) {
2196
+ // eslint-disable-next-line no-unused-expressions
2060
2197
  elem.parentNode.selectedIndex;
2061
2198
  }
2062
2199
 
@@ -2065,6 +2202,7 @@ Expr = Sizzle.selectors = {
2065
2202
 
2066
2203
  // Contents
2067
2204
  "empty": function( elem ) {
2205
+
2068
2206
  // http://www.w3.org/TR/selectors/#empty-pseudo
2069
2207
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2070
2208
  // but not by others (comment: 8; processing instruction: 7; etc.)
@@ -2078,7 +2216,7 @@ Expr = Sizzle.selectors = {
2078
2216
  },
2079
2217
 
2080
2218
  "parent": function( elem ) {
2081
- return !Expr.pseudos["empty"]( elem );
2219
+ return !Expr.pseudos[ "empty" ]( elem );
2082
2220
  },
2083
2221
 
2084
2222
  // Element/input types
@@ -2102,57 +2240,62 @@ Expr = Sizzle.selectors = {
2102
2240
 
2103
2241
  // Support: IE<8
2104
2242
  // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2105
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
2243
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
2244
+ attr.toLowerCase() === "text" );
2106
2245
  },
2107
2246
 
2108
2247
  // Position-in-collection
2109
- "first": createPositionalPseudo(function() {
2248
+ "first": createPositionalPseudo( function() {
2110
2249
  return [ 0 ];
2111
- }),
2250
+ } ),
2112
2251
 
2113
- "last": createPositionalPseudo(function( matchIndexes, length ) {
2252
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
2114
2253
  return [ length - 1 ];
2115
- }),
2254
+ } ),
2116
2255
 
2117
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2256
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
2118
2257
  return [ argument < 0 ? argument + length : argument ];
2119
- }),
2258
+ } ),
2120
2259
 
2121
- "even": createPositionalPseudo(function( matchIndexes, length ) {
2260
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
2122
2261
  var i = 0;
2123
2262
  for ( ; i < length; i += 2 ) {
2124
2263
  matchIndexes.push( i );
2125
2264
  }
2126
2265
  return matchIndexes;
2127
- }),
2266
+ } ),
2128
2267
 
2129
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
2268
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
2130
2269
  var i = 1;
2131
2270
  for ( ; i < length; i += 2 ) {
2132
2271
  matchIndexes.push( i );
2133
2272
  }
2134
2273
  return matchIndexes;
2135
- }),
2274
+ } ),
2136
2275
 
2137
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2138
- var i = argument < 0 ? argument + length : argument;
2276
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2277
+ var i = argument < 0 ?
2278
+ argument + length :
2279
+ argument > length ?
2280
+ length :
2281
+ argument;
2139
2282
  for ( ; --i >= 0; ) {
2140
2283
  matchIndexes.push( i );
2141
2284
  }
2142
2285
  return matchIndexes;
2143
- }),
2286
+ } ),
2144
2287
 
2145
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2288
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
2146
2289
  var i = argument < 0 ? argument + length : argument;
2147
2290
  for ( ; ++i < length; ) {
2148
2291
  matchIndexes.push( i );
2149
2292
  }
2150
2293
  return matchIndexes;
2151
- })
2294
+ } )
2152
2295
  }
2153
2296
  };
2154
2297
 
2155
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
2298
+ Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
2156
2299
 
2157
2300
  // Add button/input type pseudos
2158
2301
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2183,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2183
2326
  while ( soFar ) {
2184
2327
 
2185
2328
  // Comma and first run
2186
- if ( !matched || (match = rcomma.exec( soFar )) ) {
2329
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2187
2330
  if ( match ) {
2331
+
2188
2332
  // Don't consume trailing commas as valid
2189
- soFar = soFar.slice( match[0].length ) || soFar;
2333
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
2190
2334
  }
2191
- groups.push( (tokens = []) );
2335
+ groups.push( ( tokens = [] ) );
2192
2336
  }
2193
2337
 
2194
2338
  matched = false;
2195
2339
 
2196
2340
  // Combinators
2197
- if ( (match = rcombinators.exec( soFar )) ) {
2341
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
2198
2342
  matched = match.shift();
2199
- tokens.push({
2343
+ tokens.push( {
2200
2344
  value: matched,
2345
+
2201
2346
  // Cast descendant combinators to space
2202
- type: match[0].replace( rtrim, " " )
2203
- });
2347
+ type: match[ 0 ].replace( rtrim, " " )
2348
+ } );
2204
2349
  soFar = soFar.slice( matched.length );
2205
2350
  }
2206
2351
 
2207
2352
  // Filters
2208
2353
  for ( type in Expr.filter ) {
2209
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2210
- (match = preFilters[ type ]( match ))) ) {
2354
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2355
+ ( match = preFilters[ type ]( match ) ) ) ) {
2211
2356
  matched = match.shift();
2212
- tokens.push({
2357
+ tokens.push( {
2213
2358
  value: matched,
2214
2359
  type: type,
2215
2360
  matches: match
2216
- });
2361
+ } );
2217
2362
  soFar = soFar.slice( matched.length );
2218
2363
  }
2219
2364
  }
@@ -2230,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2230
2375
  soFar.length :
2231
2376
  soFar ?
2232
2377
  Sizzle.error( selector ) :
2378
+
2233
2379
  // Cache the tokens
2234
2380
  tokenCache( selector, groups ).slice( 0 );
2235
2381
  };
@@ -2239,7 +2385,7 @@ function toSelector( tokens ) {
2239
2385
  len = tokens.length,
2240
2386
  selector = "";
2241
2387
  for ( ; i < len; i++ ) {
2242
- selector += tokens[i].value;
2388
+ selector += tokens[ i ].value;
2243
2389
  }
2244
2390
  return selector;
2245
2391
  }
@@ -2252,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
2252
2398
  doneName = done++;
2253
2399
 
2254
2400
  return combinator.first ?
2401
+
2255
2402
  // Check against closest ancestor/preceding element
2256
2403
  function( elem, context, xml ) {
2257
- while ( (elem = elem[ dir ]) ) {
2404
+ while ( ( elem = elem[ dir ] ) ) {
2258
2405
  if ( elem.nodeType === 1 || checkNonElements ) {
2259
2406
  return matcher( elem, context, xml );
2260
2407
  }
@@ -2269,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
2269
2416
 
2270
2417
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2271
2418
  if ( xml ) {
2272
- while ( (elem = elem[ dir ]) ) {
2419
+ while ( ( elem = elem[ dir ] ) ) {
2273
2420
  if ( elem.nodeType === 1 || checkNonElements ) {
2274
2421
  if ( matcher( elem, context, xml ) ) {
2275
2422
  return true;
@@ -2277,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
2277
2424
  }
2278
2425
  }
2279
2426
  } else {
2280
- while ( (elem = elem[ dir ]) ) {
2427
+ while ( ( elem = elem[ dir ] ) ) {
2281
2428
  if ( elem.nodeType === 1 || checkNonElements ) {
2282
- outerCache = elem[ expando ] || (elem[ expando ] = {});
2429
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2283
2430
 
2284
2431
  // Support: IE <9 only
2285
2432
  // Defend against cloned attroperties (jQuery gh-1709)
2286
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2433
+ uniqueCache = outerCache[ elem.uniqueID ] ||
2434
+ ( outerCache[ elem.uniqueID ] = {} );
2287
2435
 
2288
2436
  if ( skip && skip === elem.nodeName.toLowerCase() ) {
2289
2437
  elem = elem[ dir ] || elem;
2290
- } else if ( (oldCache = uniqueCache[ key ]) &&
2438
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
2291
2439
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2292
2440
 
2293
2441
  // Assign to newCache so results back-propagate to previous elements
2294
- return (newCache[ 2 ] = oldCache[ 2 ]);
2442
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
2295
2443
  } else {
2444
+
2296
2445
  // Reuse newcache so results back-propagate to previous elements
2297
2446
  uniqueCache[ key ] = newCache;
2298
2447
 
2299
2448
  // A match means we're done; a fail means we have to keep checking
2300
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2449
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2301
2450
  return true;
2302
2451
  }
2303
2452
  }
@@ -2313,20 +2462,20 @@ function elementMatcher( matchers ) {
2313
2462
  function( elem, context, xml ) {
2314
2463
  var i = matchers.length;
2315
2464
  while ( i-- ) {
2316
- if ( !matchers[i]( elem, context, xml ) ) {
2465
+ if ( !matchers[ i ]( elem, context, xml ) ) {
2317
2466
  return false;
2318
2467
  }
2319
2468
  }
2320
2469
  return true;
2321
2470
  } :
2322
- matchers[0];
2471
+ matchers[ 0 ];
2323
2472
  }
2324
2473
 
2325
2474
  function multipleContexts( selector, contexts, results ) {
2326
2475
  var i = 0,
2327
2476
  len = contexts.length;
2328
2477
  for ( ; i < len; i++ ) {
2329
- Sizzle( selector, contexts[i], results );
2478
+ Sizzle( selector, contexts[ i ], results );
2330
2479
  }
2331
2480
  return results;
2332
2481
  }
@@ -2339,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) {
2339
2488
  mapped = map != null;
2340
2489
 
2341
2490
  for ( ; i < len; i++ ) {
2342
- if ( (elem = unmatched[i]) ) {
2491
+ if ( ( elem = unmatched[ i ] ) ) {
2343
2492
  if ( !filter || filter( elem, context, xml ) ) {
2344
2493
  newUnmatched.push( elem );
2345
2494
  if ( mapped ) {
@@ -2359,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2359
2508
  if ( postFinder && !postFinder[ expando ] ) {
2360
2509
  postFinder = setMatcher( postFinder, postSelector );
2361
2510
  }
2362
- return markFunction(function( seed, results, context, xml ) {
2511
+ return markFunction( function( seed, results, context, xml ) {
2363
2512
  var temp, i, elem,
2364
2513
  preMap = [],
2365
2514
  postMap = [],
2366
2515
  preexisting = results.length,
2367
2516
 
2368
2517
  // Get initial elements from seed or context
2369
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2518
+ elems = seed || multipleContexts(
2519
+ selector || "*",
2520
+ context.nodeType ? [ context ] : context,
2521
+ []
2522
+ ),
2370
2523
 
2371
2524
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2372
2525
  matcherIn = preFilter && ( seed || !selector ) ?
@@ -2374,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2374
2527
  elems,
2375
2528
 
2376
2529
  matcherOut = matcher ?
2530
+
2377
2531
  // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2378
2532
  postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2379
2533
 
@@ -2397,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2397
2551
  // Un-match failing elements by moving them back to matcherIn
2398
2552
  i = temp.length;
2399
2553
  while ( i-- ) {
2400
- if ( (elem = temp[i]) ) {
2401
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2554
+ if ( ( elem = temp[ i ] ) ) {
2555
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2402
2556
  }
2403
2557
  }
2404
2558
  }
@@ -2406,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2406
2560
  if ( seed ) {
2407
2561
  if ( postFinder || preFilter ) {
2408
2562
  if ( postFinder ) {
2563
+
2409
2564
  // Get the final matcherOut by condensing this intermediate into postFinder contexts
2410
2565
  temp = [];
2411
2566
  i = matcherOut.length;
2412
2567
  while ( i-- ) {
2413
- if ( (elem = matcherOut[i]) ) {
2568
+ if ( ( elem = matcherOut[ i ] ) ) {
2569
+
2414
2570
  // Restore matcherIn since elem is not yet a final match
2415
- temp.push( (matcherIn[i] = elem) );
2571
+ temp.push( ( matcherIn[ i ] = elem ) );
2416
2572
  }
2417
2573
  }
2418
- postFinder( null, (matcherOut = []), temp, xml );
2574
+ postFinder( null, ( matcherOut = [] ), temp, xml );
2419
2575
  }
2420
2576
 
2421
2577
  // Move matched elements from seed to results to keep them synchronized
2422
2578
  i = matcherOut.length;
2423
2579
  while ( i-- ) {
2424
- if ( (elem = matcherOut[i]) &&
2425
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2580
+ if ( ( elem = matcherOut[ i ] ) &&
2581
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
2426
2582
 
2427
- seed[temp] = !(results[temp] = elem);
2583
+ seed[ temp ] = !( results[ temp ] = elem );
2428
2584
  }
2429
2585
  }
2430
2586
  }
@@ -2442,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2442
2598
  push.apply( results, matcherOut );
2443
2599
  }
2444
2600
  }
2445
- });
2601
+ } );
2446
2602
  }
2447
2603
 
2448
2604
  function matcherFromTokens( tokens ) {
2449
2605
  var checkContext, matcher, j,
2450
2606
  len = tokens.length,
2451
- leadingRelative = Expr.relative[ tokens[0].type ],
2452
- implicitRelative = leadingRelative || Expr.relative[" "],
2607
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2608
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
2453
2609
  i = leadingRelative ? 1 : 0,
2454
2610
 
2455
2611
  // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2461,38 +2617,43 @@ function matcherFromTokens( tokens ) {
2461
2617
  }, implicitRelative, true ),
2462
2618
  matchers = [ function( elem, context, xml ) {
2463
2619
  var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2464
- (checkContext = context).nodeType ?
2620
+ ( checkContext = context ).nodeType ?
2465
2621
  matchContext( elem, context, xml ) :
2466
2622
  matchAnyContext( elem, context, xml ) );
2623
+
2467
2624
  // Avoid hanging onto element (issue #299)
2468
2625
  checkContext = null;
2469
2626
  return ret;
2470
2627
  } ];
2471
2628
 
2472
2629
  for ( ; i < len; i++ ) {
2473
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2474
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2630
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2631
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2475
2632
  } else {
2476
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2633
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2477
2634
 
2478
2635
  // Return special upon seeing a positional matcher
2479
2636
  if ( matcher[ expando ] ) {
2637
+
2480
2638
  // Find the next relative operator (if any) for proper handling
2481
2639
  j = ++i;
2482
2640
  for ( ; j < len; j++ ) {
2483
- if ( Expr.relative[ tokens[j].type ] ) {
2641
+ if ( Expr.relative[ tokens[ j ].type ] ) {
2484
2642
  break;
2485
2643
  }
2486
2644
  }
2487
2645
  return setMatcher(
2488
2646
  i > 1 && elementMatcher( matchers ),
2489
2647
  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 === " " ? "*" : "" })
2648
+
2649
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2650
+ tokens
2651
+ .slice( 0, i - 1 )
2652
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2492
2653
  ).replace( rtrim, "$1" ),
2493
2654
  matcher,
2494
2655
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2495
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2656
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2496
2657
  j < len && toSelector( tokens )
2497
2658
  );
2498
2659
  }
@@ -2513,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2513
2674
  unmatched = seed && [],
2514
2675
  setMatched = [],
2515
2676
  contextBackup = outermostContext,
2677
+
2516
2678
  // We must always have either seed elements or outermost context
2517
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2679
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
2680
+
2518
2681
  // Use integer dirruns iff this is the outermost matcher
2519
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2682
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2520
2683
  len = elems.length;
2521
2684
 
2522
2685
  if ( outermost ) {
2523
- outermostContext = context === document || context || outermost;
2686
+
2687
+ // Support: IE 11+, Edge 17 - 18+
2688
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2689
+ // two documents; shallow comparisons work.
2690
+ // eslint-disable-next-line eqeqeq
2691
+ outermostContext = context == document || context || outermost;
2524
2692
  }
2525
2693
 
2526
2694
  // Add elements passing elementMatchers directly to results
2527
2695
  // Support: IE<9, Safari
2528
2696
  // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2529
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2697
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2530
2698
  if ( byElement && elem ) {
2531
2699
  j = 0;
2532
- if ( !context && elem.ownerDocument !== document ) {
2700
+
2701
+ // Support: IE 11+, Edge 17 - 18+
2702
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2703
+ // two documents; shallow comparisons work.
2704
+ // eslint-disable-next-line eqeqeq
2705
+ if ( !context && elem.ownerDocument != document ) {
2533
2706
  setDocument( elem );
2534
2707
  xml = !documentIsHTML;
2535
2708
  }
2536
- while ( (matcher = elementMatchers[j++]) ) {
2537
- if ( matcher( elem, context || document, xml) ) {
2709
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
2710
+ if ( matcher( elem, context || document, xml ) ) {
2538
2711
  results.push( elem );
2539
2712
  break;
2540
2713
  }
@@ -2546,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2546
2719
 
2547
2720
  // Track unmatched elements for set filters
2548
2721
  if ( bySet ) {
2722
+
2549
2723
  // They will have gone through all possible matchers
2550
- if ( (elem = !matcher && elem) ) {
2724
+ if ( ( elem = !matcher && elem ) ) {
2551
2725
  matchedCount--;
2552
2726
  }
2553
2727
 
@@ -2571,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2571
2745
  // numerically zero.
2572
2746
  if ( bySet && i !== matchedCount ) {
2573
2747
  j = 0;
2574
- while ( (matcher = setMatchers[j++]) ) {
2748
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
2575
2749
  matcher( unmatched, setMatched, context, xml );
2576
2750
  }
2577
2751
 
2578
2752
  if ( seed ) {
2753
+
2579
2754
  // Reintegrate element matches to eliminate the need for sorting
2580
2755
  if ( matchedCount > 0 ) {
2581
2756
  while ( i-- ) {
2582
- if ( !(unmatched[i] || setMatched[i]) ) {
2583
- setMatched[i] = pop.call( results );
2757
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2758
+ setMatched[ i ] = pop.call( results );
2584
2759
  }
2585
2760
  }
2586
2761
  }
@@ -2621,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2621
2796
  cached = compilerCache[ selector + " " ];
2622
2797
 
2623
2798
  if ( !cached ) {
2799
+
2624
2800
  // Generate a function of recursive functions that can be used to check each element
2625
2801
  if ( !match ) {
2626
2802
  match = tokenize( selector );
2627
2803
  }
2628
2804
  i = match.length;
2629
2805
  while ( i-- ) {
2630
- cached = matcherFromTokens( match[i] );
2806
+ cached = matcherFromTokens( match[ i ] );
2631
2807
  if ( cached[ expando ] ) {
2632
2808
  setMatchers.push( cached );
2633
2809
  } else {
@@ -2636,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2636
2812
  }
2637
2813
 
2638
2814
  // Cache the compiled function
2639
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2815
+ cached = compilerCache(
2816
+ selector,
2817
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
2818
+ );
2640
2819
 
2641
2820
  // Save selector and tokenization
2642
2821
  cached.selector = selector;
@@ -2656,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2656
2835
  select = Sizzle.select = function( selector, context, results, seed ) {
2657
2836
  var i, tokens, token, type, find,
2658
2837
  compiled = typeof selector === "function" && selector,
2659
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2838
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2660
2839
 
2661
2840
  results = results || [];
2662
2841
 
@@ -2665,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2665
2844
  if ( match.length === 1 ) {
2666
2845
 
2667
2846
  // 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 ] ) {
2847
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2848
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2849
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2671
2850
 
2672
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2851
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
2852
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
2673
2853
  if ( !context ) {
2674
2854
  return results;
2675
2855
 
@@ -2682,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2682
2862
  }
2683
2863
 
2684
2864
  // Fetch a seed set for right-to-left matching
2685
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2865
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
2686
2866
  while ( i-- ) {
2687
- token = tokens[i];
2867
+ token = tokens[ i ];
2688
2868
 
2689
2869
  // Abort if we hit a combinator
2690
- if ( Expr.relative[ (type = token.type) ] ) {
2870
+ if ( Expr.relative[ ( type = token.type ) ] ) {
2691
2871
  break;
2692
2872
  }
2693
- if ( (find = Expr.find[ type ]) ) {
2873
+ if ( ( find = Expr.find[ type ] ) ) {
2874
+
2694
2875
  // 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
- )) ) {
2876
+ if ( ( seed = find(
2877
+ token.matches[ 0 ].replace( runescape, funescape ),
2878
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
2879
+ context
2880
+ ) ) ) {
2699
2881
 
2700
2882
  // If seed is empty or no tokens remain, we can return early
2701
2883
  tokens.splice( i, 1 );
@@ -2726,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2726
2908
  // One-time assignments
2727
2909
 
2728
2910
  // Sort stability
2729
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2911
+ support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2730
2912
 
2731
2913
  // Support: Chrome 14-35+
2732
2914
  // Always assume duplicates if they aren't passed to the comparison function
@@ -2737,58 +2919,59 @@ setDocument();
2737
2919
 
2738
2920
  // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2739
2921
  // Detached nodes confoundingly follow *each other*
2740
- support.sortDetached = assert(function( el ) {
2922
+ support.sortDetached = assert( function( el ) {
2923
+
2741
2924
  // Should return 1, but returns 4 (following)
2742
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2743
- });
2925
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2926
+ } );
2744
2927
 
2745
2928
  // Support: IE<8
2746
2929
  // Prevent attribute/property "interpolation"
2747
2930
  // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2748
- if ( !assert(function( el ) {
2931
+ if ( !assert( function( el ) {
2749
2932
  el.innerHTML = "<a href='#'></a>";
2750
- return el.firstChild.getAttribute("href") === "#" ;
2751
- }) ) {
2933
+ return el.firstChild.getAttribute( "href" ) === "#";
2934
+ } ) ) {
2752
2935
  addHandle( "type|href|height|width", function( elem, name, isXML ) {
2753
2936
  if ( !isXML ) {
2754
2937
  return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2755
2938
  }
2756
- });
2939
+ } );
2757
2940
  }
2758
2941
 
2759
2942
  // Support: IE<9
2760
2943
  // Use defaultValue in place of getAttribute("value")
2761
- if ( !support.attributes || !assert(function( el ) {
2944
+ if ( !support.attributes || !assert( function( el ) {
2762
2945
  el.innerHTML = "<input/>";
2763
2946
  el.firstChild.setAttribute( "value", "" );
2764
2947
  return el.firstChild.getAttribute( "value" ) === "";
2765
- }) ) {
2766
- addHandle( "value", function( elem, name, isXML ) {
2948
+ } ) ) {
2949
+ addHandle( "value", function( elem, _name, isXML ) {
2767
2950
  if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2768
2951
  return elem.defaultValue;
2769
2952
  }
2770
- });
2953
+ } );
2771
2954
  }
2772
2955
 
2773
2956
  // Support: IE<9
2774
2957
  // Use getAttributeNode to fetch booleans when getAttribute lies
2775
- if ( !assert(function( el ) {
2776
- return el.getAttribute("disabled") == null;
2777
- }) ) {
2958
+ if ( !assert( function( el ) {
2959
+ return el.getAttribute( "disabled" ) == null;
2960
+ } ) ) {
2778
2961
  addHandle( booleans, function( elem, name, isXML ) {
2779
2962
  var val;
2780
2963
  if ( !isXML ) {
2781
2964
  return elem[ name ] === true ? name.toLowerCase() :
2782
- (val = elem.getAttributeNode( name )) && val.specified ?
2965
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
2783
2966
  val.value :
2784
- null;
2967
+ null;
2785
2968
  }
2786
- });
2969
+ } );
2787
2970
  }
2788
2971
 
2789
2972
  return Sizzle;
2790
2973
 
2791
- })( window );
2974
+ } )( window );
2792
2975
 
2793
2976
 
2794
2977
 
@@ -2848,11 +3031,9 @@ var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|
2848
3031
 
2849
3032
 
2850
3033
 
2851
- var risSimple = /^.[^:#\[\.,]*$/;
2852
-
2853
3034
  // Implement the identical functionality for filter and not
2854
3035
  function winnow( elements, qualifier, not ) {
2855
- if ( jQuery.isFunction( qualifier ) ) {
3036
+ if ( isFunction( qualifier ) ) {
2856
3037
  return jQuery.grep( elements, function( elem, i ) {
2857
3038
  return !!qualifier.call( elem, i, elem ) !== not;
2858
3039
  } );
@@ -2872,16 +3053,8 @@ function winnow( elements, qualifier, not ) {
2872
3053
  } );
2873
3054
  }
2874
3055
 
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
- } );
3056
+ // Filtered directly for both simple and complex selectors
3057
+ return jQuery.filter( qualifier, elements, not );
2885
3058
  }
2886
3059
 
2887
3060
  jQuery.filter = function( expr, elems, not ) {
@@ -3002,7 +3175,7 @@ var rootjQuery,
3002
3175
  for ( match in context ) {
3003
3176
 
3004
3177
  // Properties of context are called as methods if possible
3005
- if ( jQuery.isFunction( this[ match ] ) ) {
3178
+ if ( isFunction( this[ match ] ) ) {
3006
3179
  this[ match ]( context[ match ] );
3007
3180
 
3008
3181
  // ...and otherwise set as attributes
@@ -3045,7 +3218,7 @@ var rootjQuery,
3045
3218
 
3046
3219
  // HANDLE: $(function)
3047
3220
  // Shortcut for document ready
3048
- } else if ( jQuery.isFunction( selector ) ) {
3221
+ } else if ( isFunction( selector ) ) {
3049
3222
  return root.ready !== undefined ?
3050
3223
  root.ready( selector ) :
3051
3224
 
@@ -3167,7 +3340,7 @@ jQuery.each( {
3167
3340
  parents: function( elem ) {
3168
3341
  return dir( elem, "parentNode" );
3169
3342
  },
3170
- parentsUntil: function( elem, i, until ) {
3343
+ parentsUntil: function( elem, _i, until ) {
3171
3344
  return dir( elem, "parentNode", until );
3172
3345
  },
3173
3346
  next: function( elem ) {
@@ -3182,10 +3355,10 @@ jQuery.each( {
3182
3355
  prevAll: function( elem ) {
3183
3356
  return dir( elem, "previousSibling" );
3184
3357
  },
3185
- nextUntil: function( elem, i, until ) {
3358
+ nextUntil: function( elem, _i, until ) {
3186
3359
  return dir( elem, "nextSibling", until );
3187
3360
  },
3188
- prevUntil: function( elem, i, until ) {
3361
+ prevUntil: function( elem, _i, until ) {
3189
3362
  return dir( elem, "previousSibling", until );
3190
3363
  },
3191
3364
  siblings: function( elem ) {
@@ -3195,18 +3368,24 @@ jQuery.each( {
3195
3368
  return siblings( elem.firstChild );
3196
3369
  },
3197
3370
  contents: function( elem ) {
3198
- if ( nodeName( elem, "iframe" ) ) {
3199
- return elem.contentDocument;
3200
- }
3371
+ if ( elem.contentDocument != null &&
3201
3372
 
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
- }
3373
+ // Support: IE 11+
3374
+ // <object> elements with no `data` attribute has an object
3375
+ // `contentDocument` with a `null` prototype.
3376
+ getProto( elem.contentDocument ) ) {
3208
3377
 
3209
- return jQuery.merge( [], elem.childNodes );
3378
+ return elem.contentDocument;
3379
+ }
3380
+
3381
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
3382
+ // Treat the template element as a regular one in browsers that
3383
+ // don't support it.
3384
+ if ( nodeName( elem, "template" ) ) {
3385
+ elem = elem.content || elem;
3386
+ }
3387
+
3388
+ return jQuery.merge( [], elem.childNodes );
3210
3389
  }
3211
3390
  }, function( name, fn ) {
3212
3391
  jQuery.fn[ name ] = function( until, selector ) {
@@ -3360,11 +3539,11 @@ jQuery.Callbacks = function( options ) {
3360
3539
 
3361
3540
  ( function add( args ) {
3362
3541
  jQuery.each( args, function( _, arg ) {
3363
- if ( jQuery.isFunction( arg ) ) {
3542
+ if ( isFunction( arg ) ) {
3364
3543
  if ( !options.unique || !self.has( arg ) ) {
3365
3544
  list.push( arg );
3366
3545
  }
3367
- } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
3546
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
3368
3547
 
3369
3548
  // Inspect recursively
3370
3549
  add( arg );
@@ -3479,11 +3658,11 @@ function adoptValue( value, resolve, reject, noValue ) {
3479
3658
  try {
3480
3659
 
3481
3660
  // Check for promise aspect first to privilege synchronous behavior
3482
- if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
3661
+ if ( value && isFunction( ( method = value.promise ) ) ) {
3483
3662
  method.call( value ).done( resolve ).fail( reject );
3484
3663
 
3485
3664
  // Other thenables
3486
- } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
3665
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
3487
3666
  method.call( value, resolve, reject );
3488
3667
 
3489
3668
  // Other non-thenables
@@ -3538,17 +3717,17 @@ jQuery.extend( {
3538
3717
  var fns = arguments;
3539
3718
 
3540
3719
  return jQuery.Deferred( function( newDefer ) {
3541
- jQuery.each( tuples, function( i, tuple ) {
3720
+ jQuery.each( tuples, function( _i, tuple ) {
3542
3721
 
3543
3722
  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3544
- var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3723
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
3545
3724
 
3546
3725
  // deferred.progress(function() { bind to newDefer or newDefer.notify })
3547
3726
  // deferred.done(function() { bind to newDefer or newDefer.resolve })
3548
3727
  // deferred.fail(function() { bind to newDefer or newDefer.reject })
3549
3728
  deferred[ tuple[ 1 ] ]( function() {
3550
3729
  var returned = fn && fn.apply( this, arguments );
3551
- if ( returned && jQuery.isFunction( returned.promise ) ) {
3730
+ if ( returned && isFunction( returned.promise ) ) {
3552
3731
  returned.promise()
3553
3732
  .progress( newDefer.notify )
3554
3733
  .done( newDefer.resolve )
@@ -3602,7 +3781,7 @@ jQuery.extend( {
3602
3781
  returned.then;
3603
3782
 
3604
3783
  // Handle a returned thenable
3605
- if ( jQuery.isFunction( then ) ) {
3784
+ if ( isFunction( then ) ) {
3606
3785
 
3607
3786
  // Special processors (notify) just wait for resolution
3608
3787
  if ( special ) {
@@ -3698,7 +3877,7 @@ jQuery.extend( {
3698
3877
  resolve(
3699
3878
  0,
3700
3879
  newDefer,
3701
- jQuery.isFunction( onProgress ) ?
3880
+ isFunction( onProgress ) ?
3702
3881
  onProgress :
3703
3882
  Identity,
3704
3883
  newDefer.notifyWith
@@ -3710,7 +3889,7 @@ jQuery.extend( {
3710
3889
  resolve(
3711
3890
  0,
3712
3891
  newDefer,
3713
- jQuery.isFunction( onFulfilled ) ?
3892
+ isFunction( onFulfilled ) ?
3714
3893
  onFulfilled :
3715
3894
  Identity
3716
3895
  )
@@ -3721,7 +3900,7 @@ jQuery.extend( {
3721
3900
  resolve(
3722
3901
  0,
3723
3902
  newDefer,
3724
- jQuery.isFunction( onRejected ) ?
3903
+ isFunction( onRejected ) ?
3725
3904
  onRejected :
3726
3905
  Thrower
3727
3906
  )
@@ -3761,8 +3940,15 @@ jQuery.extend( {
3761
3940
  // fulfilled_callbacks.disable
3762
3941
  tuples[ 3 - i ][ 2 ].disable,
3763
3942
 
3943
+ // rejected_handlers.disable
3944
+ // fulfilled_handlers.disable
3945
+ tuples[ 3 - i ][ 3 ].disable,
3946
+
3764
3947
  // progress_callbacks.lock
3765
- tuples[ 0 ][ 2 ].lock
3948
+ tuples[ 0 ][ 2 ].lock,
3949
+
3950
+ // progress_handlers.lock
3951
+ tuples[ 0 ][ 3 ].lock
3766
3952
  );
3767
3953
  }
3768
3954
 
@@ -3832,7 +4018,7 @@ jQuery.extend( {
3832
4018
 
3833
4019
  // Use .then() to unwrap secondary thenables (cf. gh-3000)
3834
4020
  if ( master.state() === "pending" ||
3835
- jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
4021
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3836
4022
 
3837
4023
  return master.then();
3838
4024
  }
@@ -3960,7 +4146,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3960
4146
  bulk = key == null;
3961
4147
 
3962
4148
  // Sets many values
3963
- if ( jQuery.type( key ) === "object" ) {
4149
+ if ( toType( key ) === "object" ) {
3964
4150
  chainable = true;
3965
4151
  for ( i in key ) {
3966
4152
  access( elems, fn, i, key[ i ], true, emptyGet, raw );
@@ -3970,7 +4156,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3970
4156
  } else if ( value !== undefined ) {
3971
4157
  chainable = true;
3972
4158
 
3973
- if ( !jQuery.isFunction( value ) ) {
4159
+ if ( !isFunction( value ) ) {
3974
4160
  raw = true;
3975
4161
  }
3976
4162
 
@@ -3984,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3984
4170
  // ...except when executing function values
3985
4171
  } else {
3986
4172
  bulk = fn;
3987
- fn = function( elem, key, value ) {
4173
+ fn = function( elem, _key, value ) {
3988
4174
  return bulk.call( jQuery( elem ), value );
3989
4175
  };
3990
4176
  }
@@ -4012,6 +4198,23 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4012
4198
 
4013
4199
  return len ? fn( elems[ 0 ], key ) : emptyGet;
4014
4200
  };
4201
+
4202
+
4203
+ // Matches dashed string for camelizing
4204
+ var rmsPrefix = /^-ms-/,
4205
+ rdashAlpha = /-([a-z])/g;
4206
+
4207
+ // Used by camelCase as callback to replace()
4208
+ function fcamelCase( _all, letter ) {
4209
+ return letter.toUpperCase();
4210
+ }
4211
+
4212
+ // Convert dashed to camelCase; used by the css and data modules
4213
+ // Support: IE <=9 - 11, Edge 12 - 15
4214
+ // Microsoft forgot to hump their vendor prefix (#9572)
4215
+ function camelCase( string ) {
4216
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4217
+ }
4015
4218
  var acceptData = function( owner ) {
4016
4219
 
4017
4220
  // Accepts only:
@@ -4074,14 +4277,14 @@ Data.prototype = {
4074
4277
  // Handle: [ owner, key, value ] args
4075
4278
  // Always use camelCase key (gh-2257)
4076
4279
  if ( typeof data === "string" ) {
4077
- cache[ jQuery.camelCase( data ) ] = value;
4280
+ cache[ camelCase( data ) ] = value;
4078
4281
 
4079
4282
  // Handle: [ owner, { properties } ] args
4080
4283
  } else {
4081
4284
 
4082
4285
  // Copy the properties one-by-one to the cache object
4083
4286
  for ( prop in data ) {
4084
- cache[ jQuery.camelCase( prop ) ] = data[ prop ];
4287
+ cache[ camelCase( prop ) ] = data[ prop ];
4085
4288
  }
4086
4289
  }
4087
4290
  return cache;
@@ -4091,7 +4294,7 @@ Data.prototype = {
4091
4294
  this.cache( owner ) :
4092
4295
 
4093
4296
  // Always use camelCase key (gh-2257)
4094
- owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
4297
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
4095
4298
  },
4096
4299
  access: function( owner, key, value ) {
4097
4300
 
@@ -4139,9 +4342,9 @@ Data.prototype = {
4139
4342
 
4140
4343
  // If key is an array of keys...
4141
4344
  // We always set camelCase keys, so remove that.
4142
- key = key.map( jQuery.camelCase );
4345
+ key = key.map( camelCase );
4143
4346
  } else {
4144
- key = jQuery.camelCase( key );
4347
+ key = camelCase( key );
4145
4348
 
4146
4349
  // If a key with the spaces exists, use it.
4147
4350
  // Otherwise, create an array by matching non-whitespace
@@ -4287,7 +4490,7 @@ jQuery.fn.extend( {
4287
4490
  if ( attrs[ i ] ) {
4288
4491
  name = attrs[ i ].name;
4289
4492
  if ( name.indexOf( "data-" ) === 0 ) {
4290
- name = jQuery.camelCase( name.slice( 5 ) );
4493
+ name = camelCase( name.slice( 5 ) );
4291
4494
  dataAttr( elem, name, data[ name ] );
4292
4495
  }
4293
4496
  }
@@ -4491,6 +4694,26 @@ var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
4491
4694
 
4492
4695
  var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4493
4696
 
4697
+ var documentElement = document.documentElement;
4698
+
4699
+
4700
+
4701
+ var isAttached = function( elem ) {
4702
+ return jQuery.contains( elem.ownerDocument, elem );
4703
+ },
4704
+ composed = { composed: true };
4705
+
4706
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
4707
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
4708
+ // Support: iOS 10.0-10.2 only
4709
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
4710
+ // leading to errors. We need to check for `getRootNode`.
4711
+ if ( documentElement.getRootNode ) {
4712
+ isAttached = function( elem ) {
4713
+ return jQuery.contains( elem.ownerDocument, elem ) ||
4714
+ elem.getRootNode( composed ) === elem.ownerDocument;
4715
+ };
4716
+ }
4494
4717
  var isHiddenWithinTree = function( elem, el ) {
4495
4718
 
4496
4719
  // isHiddenWithinTree might be called from jQuery#filter function;
@@ -4505,37 +4728,15 @@ var isHiddenWithinTree = function( elem, el ) {
4505
4728
  // Support: Firefox <=43 - 45
4506
4729
  // Disconnected elements can have computed display: none, so first confirm that elem is
4507
4730
  // in the document.
4508
- jQuery.contains( elem.ownerDocument, elem ) &&
4731
+ isAttached( elem ) &&
4509
4732
 
4510
4733
  jQuery.css( elem, "display" ) === "none";
4511
4734
  };
4512
4735
 
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
4736
 
4535
4737
 
4536
4738
  function adjustCSS( elem, prop, valueParts, tween ) {
4537
- var adjusted,
4538
- scale = 1,
4739
+ var adjusted, scale,
4539
4740
  maxIterations = 20,
4540
4741
  currentValue = tween ?
4541
4742
  function() {
@@ -4548,35 +4749,39 @@ function adjustCSS( elem, prop, valueParts, tween ) {
4548
4749
  unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
4549
4750
 
4550
4751
  // Starting value computation is required for potential unit mismatches
4551
- initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4752
+ initialInUnit = elem.nodeType &&
4753
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
4552
4754
  rcssNum.exec( jQuery.css( elem, prop ) );
4553
4755
 
4554
4756
  if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
4555
4757
 
4758
+ // Support: Firefox <=54
4759
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
4760
+ initial = initial / 2;
4761
+
4556
4762
  // Trust units reported by jQuery.css
4557
4763
  unit = unit || initialInUnit[ 3 ];
4558
4764
 
4559
- // Make sure we update the tween properties later on
4560
- valueParts = valueParts || [];
4561
-
4562
4765
  // Iteratively approximate from a nonzero starting point
4563
4766
  initialInUnit = +initial || 1;
4564
4767
 
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";
4768
+ while ( maxIterations-- ) {
4570
4769
 
4571
- // Adjust and apply
4572
- initialInUnit = initialInUnit / scale;
4770
+ // Evaluate and update our best guess (doubling guesses that zero out).
4771
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
4573
4772
  jQuery.style( elem, prop, initialInUnit + unit );
4773
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
4774
+ maxIterations = 0;
4775
+ }
4776
+ initialInUnit = initialInUnit / scale;
4574
4777
 
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
- );
4778
+ }
4779
+
4780
+ initialInUnit = initialInUnit * 2;
4781
+ jQuery.style( elem, prop, initialInUnit + unit );
4782
+
4783
+ // Make sure we update the tween properties later on
4784
+ valueParts = valueParts || [];
4580
4785
  }
4581
4786
 
4582
4787
  if ( valueParts ) {
@@ -4692,17 +4897,46 @@ jQuery.fn.extend( {
4692
4897
  } );
4693
4898
  var rcheckableType = ( /^(?:checkbox|radio)$/i );
4694
4899
 
4695
- var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
4900
+ var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
4696
4901
 
4697
- var rscriptType = ( /^$|\/(?:java|ecma)script/i );
4902
+ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4698
4903
 
4699
4904
 
4700
4905
 
4701
- // We have to close these tags to support XHTML (#13200)
4702
- var wrapMap = {
4906
+ ( function() {
4907
+ var fragment = document.createDocumentFragment(),
4908
+ div = fragment.appendChild( document.createElement( "div" ) ),
4909
+ input = document.createElement( "input" );
4910
+
4911
+ // Support: Android 4.0 - 4.3 only
4912
+ // Check state lost if the name is set (#11217)
4913
+ // Support: Windows Web Apps (WWA)
4914
+ // `name` and `type` must use .setAttribute for WWA (#14901)
4915
+ input.setAttribute( "type", "radio" );
4916
+ input.setAttribute( "checked", "checked" );
4917
+ input.setAttribute( "name", "t" );
4918
+
4919
+ div.appendChild( input );
4920
+
4921
+ // Support: Android <=4.1 only
4922
+ // Older WebKit doesn't clone checked state correctly in fragments
4923
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4924
+
4925
+ // Support: IE <=11 only
4926
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4927
+ div.innerHTML = "<textarea>x</textarea>";
4928
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4703
4929
 
4704
4930
  // Support: IE <=9 only
4705
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
4931
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
4932
+ // the select element.
4933
+ div.innerHTML = "<option></option>";
4934
+ support.option = !!div.lastChild;
4935
+ } )();
4936
+
4937
+
4938
+ // We have to close these tags to support XHTML (#13200)
4939
+ var wrapMap = {
4706
4940
 
4707
4941
  // XHTML parsers do not magically insert elements in the
4708
4942
  // same way that tag soup parsers do. So we cannot shorten
@@ -4715,12 +4949,14 @@ var wrapMap = {
4715
4949
  _default: [ 0, "", "" ]
4716
4950
  };
4717
4951
 
4718
- // Support: IE <=9 only
4719
- wrapMap.optgroup = wrapMap.option;
4720
-
4721
4952
  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4722
4953
  wrapMap.th = wrapMap.td;
4723
4954
 
4955
+ // Support: IE <=9 only
4956
+ if ( !support.option ) {
4957
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4958
+ }
4959
+
4724
4960
 
4725
4961
  function getAll( context, tag ) {
4726
4962
 
@@ -4764,7 +5000,7 @@ function setGlobalEval( elems, refElements ) {
4764
5000
  var rhtml = /<|&#?\w+;/;
4765
5001
 
4766
5002
  function buildFragment( elems, context, scripts, selection, ignored ) {
4767
- var elem, tmp, tag, wrap, contains, j,
5003
+ var elem, tmp, tag, wrap, attached, j,
4768
5004
  fragment = context.createDocumentFragment(),
4769
5005
  nodes = [],
4770
5006
  i = 0,
@@ -4776,7 +5012,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4776
5012
  if ( elem || elem === 0 ) {
4777
5013
 
4778
5014
  // Add nodes directly
4779
- if ( jQuery.type( elem ) === "object" ) {
5015
+ if ( toType( elem ) === "object" ) {
4780
5016
 
4781
5017
  // Support: Android <=4.0 only, PhantomJS 1 only
4782
5018
  // push.apply(_, arraylike) throws on ancient WebKit
@@ -4828,13 +5064,13 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4828
5064
  continue;
4829
5065
  }
4830
5066
 
4831
- contains = jQuery.contains( elem.ownerDocument, elem );
5067
+ attached = isAttached( elem );
4832
5068
 
4833
5069
  // Append to fragment
4834
5070
  tmp = getAll( fragment.appendChild( elem ), "script" );
4835
5071
 
4836
5072
  // Preserve script evaluation history
4837
- if ( contains ) {
5073
+ if ( attached ) {
4838
5074
  setGlobalEval( tmp );
4839
5075
  }
4840
5076
 
@@ -4853,34 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4853
5089
  }
4854
5090
 
4855
5091
 
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
5092
  var
4885
5093
  rkeyEvent = /^key/,
4886
5094
  rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -4894,8 +5102,19 @@ function returnFalse() {
4894
5102
  return false;
4895
5103
  }
4896
5104
 
5105
+ // Support: IE <=9 - 11+
5106
+ // focus() and blur() are asynchronous, except when they are no-op.
5107
+ // So expect focus to be synchronous when the element is already active,
5108
+ // and blur to be synchronous when the element is not already active.
5109
+ // (focus and blur are always synchronous in other supported browsers,
5110
+ // this just defines when we can count on it).
5111
+ function expectSync( elem, type ) {
5112
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
5113
+ }
5114
+
4897
5115
  // Support: IE <=9 only
4898
- // See #13393 for more info
5116
+ // Accessing document.activeElement can throw unexpectedly
5117
+ // https://bugs.jquery.com/ticket/13393
4899
5118
  function safeActiveElement() {
4900
5119
  try {
4901
5120
  return document.activeElement;
@@ -4978,8 +5197,8 @@ jQuery.event = {
4978
5197
  special, handlers, type, namespaces, origType,
4979
5198
  elemData = dataPriv.get( elem );
4980
5199
 
4981
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
4982
- if ( !elemData ) {
5200
+ // Only attach events to objects that accept data
5201
+ if ( !acceptData( elem ) ) {
4983
5202
  return;
4984
5203
  }
4985
5204
 
@@ -5003,7 +5222,7 @@ jQuery.event = {
5003
5222
 
5004
5223
  // Init the element's event structure and main handler, if this is the first
5005
5224
  if ( !( events = elemData.events ) ) {
5006
- events = elemData.events = {};
5225
+ events = elemData.events = Object.create( null );
5007
5226
  }
5008
5227
  if ( !( eventHandle = elemData.handle ) ) {
5009
5228
  eventHandle = elemData.handle = function( e ) {
@@ -5161,12 +5380,15 @@ jQuery.event = {
5161
5380
 
5162
5381
  dispatch: function( nativeEvent ) {
5163
5382
 
5164
- // Make a writable jQuery.Event from the native event object
5165
- var event = jQuery.event.fix( nativeEvent );
5166
-
5167
5383
  var i, j, ret, matched, handleObj, handlerQueue,
5168
5384
  args = new Array( arguments.length ),
5169
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5385
+
5386
+ // Make a writable jQuery.Event from the native event object
5387
+ event = jQuery.event.fix( nativeEvent ),
5388
+
5389
+ handlers = (
5390
+ dataPriv.get( this, "events" ) || Object.create( null )
5391
+ )[ event.type ] || [],
5170
5392
  special = jQuery.event.special[ event.type ] || {};
5171
5393
 
5172
5394
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5195,9 +5417,10 @@ jQuery.event = {
5195
5417
  while ( ( handleObj = matched.handlers[ j++ ] ) &&
5196
5418
  !event.isImmediatePropagationStopped() ) {
5197
5419
 
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 ) ) {
5420
+ // If the event is namespaced, then each handler is only invoked if it is
5421
+ // specially universal or its namespaces are a superset of the event's.
5422
+ if ( !event.rnamespace || handleObj.namespace === false ||
5423
+ event.rnamespace.test( handleObj.namespace ) ) {
5201
5424
 
5202
5425
  event.handleObj = handleObj;
5203
5426
  event.data = handleObj.data;
@@ -5286,7 +5509,7 @@ jQuery.event = {
5286
5509
  enumerable: true,
5287
5510
  configurable: true,
5288
5511
 
5289
- get: jQuery.isFunction( hook ) ?
5512
+ get: isFunction( hook ) ?
5290
5513
  function() {
5291
5514
  if ( this.originalEvent ) {
5292
5515
  return hook( this.originalEvent );
@@ -5321,39 +5544,51 @@ jQuery.event = {
5321
5544
  // Prevent triggered image.load events from bubbling to window.load
5322
5545
  noBubble: true
5323
5546
  },
5324
- focus: {
5547
+ click: {
5325
5548
 
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;
5549
+ // Utilize native event to ensure correct state for checkable inputs
5550
+ setup: function( data ) {
5551
+
5552
+ // For mutual compressibility with _default, replace `this` access with a local var.
5553
+ // `|| data` is dead code meant only to preserve the variable through minification.
5554
+ var el = this || data;
5555
+
5556
+ // Claim the first handler
5557
+ if ( rcheckableType.test( el.type ) &&
5558
+ el.click && nodeName( el, "input" ) ) {
5559
+
5560
+ // dataPriv.set( el, "click", ... )
5561
+ leverageNative( el, "click", returnTrue );
5340
5562
  }
5563
+
5564
+ // Return false to allow normal processing in the caller
5565
+ return false;
5341
5566
  },
5342
- delegateType: "focusout"
5343
- },
5344
- click: {
5567
+ trigger: function( data ) {
5345
5568
 
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;
5569
+ // For mutual compressibility with _default, replace `this` access with a local var.
5570
+ // `|| data` is dead code meant only to preserve the variable through minification.
5571
+ var el = this || data;
5572
+
5573
+ // Force setup before triggering a click
5574
+ if ( rcheckableType.test( el.type ) &&
5575
+ el.click && nodeName( el, "input" ) ) {
5576
+
5577
+ leverageNative( el, "click" );
5351
5578
  }
5579
+
5580
+ // Return non-false to allow normal event-path propagation
5581
+ return true;
5352
5582
  },
5353
5583
 
5354
- // For cross-browser consistency, don't fire native .click() on links
5584
+ // For cross-browser consistency, suppress native .click() on links
5585
+ // Also prevent it if we're currently inside a leveraged native-event stack
5355
5586
  _default: function( event ) {
5356
- return nodeName( event.target, "a" );
5587
+ var target = event.target;
5588
+ return rcheckableType.test( target.type ) &&
5589
+ target.click && nodeName( target, "input" ) &&
5590
+ dataPriv.get( target, "click" ) ||
5591
+ nodeName( target, "a" );
5357
5592
  }
5358
5593
  },
5359
5594
 
@@ -5367,8 +5602,95 @@ jQuery.event = {
5367
5602
  }
5368
5603
  }
5369
5604
  }
5370
- }
5371
- };
5605
+ }
5606
+ };
5607
+
5608
+ // Ensure the presence of an event listener that handles manually-triggered
5609
+ // synthetic events by interrupting progress until reinvoked in response to
5610
+ // *native* events that it fires directly, ensuring that state changes have
5611
+ // already occurred before other listeners are invoked.
5612
+ function leverageNative( el, type, expectSync ) {
5613
+
5614
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5615
+ if ( !expectSync ) {
5616
+ if ( dataPriv.get( el, type ) === undefined ) {
5617
+ jQuery.event.add( el, type, returnTrue );
5618
+ }
5619
+ return;
5620
+ }
5621
+
5622
+ // Register the controller as a special universal handler for all event namespaces
5623
+ dataPriv.set( el, type, false );
5624
+ jQuery.event.add( el, type, {
5625
+ namespace: false,
5626
+ handler: function( event ) {
5627
+ var notAsync, result,
5628
+ saved = dataPriv.get( this, type );
5629
+
5630
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5631
+
5632
+ // Interrupt processing of the outer synthetic .trigger()ed event
5633
+ // Saved data should be false in such cases, but might be a leftover capture object
5634
+ // from an async native handler (gh-4350)
5635
+ if ( !saved.length ) {
5636
+
5637
+ // Store arguments for use when handling the inner native event
5638
+ // There will always be at least one argument (an event object), so this array
5639
+ // will not be confused with a leftover capture object.
5640
+ saved = slice.call( arguments );
5641
+ dataPriv.set( this, type, saved );
5642
+
5643
+ // Trigger the native event and capture its result
5644
+ // Support: IE <=9 - 11+
5645
+ // focus() and blur() are asynchronous
5646
+ notAsync = expectSync( this, type );
5647
+ this[ type ]();
5648
+ result = dataPriv.get( this, type );
5649
+ if ( saved !== result || notAsync ) {
5650
+ dataPriv.set( this, type, false );
5651
+ } else {
5652
+ result = {};
5653
+ }
5654
+ if ( saved !== result ) {
5655
+
5656
+ // Cancel the outer synthetic event
5657
+ event.stopImmediatePropagation();
5658
+ event.preventDefault();
5659
+ return result.value;
5660
+ }
5661
+
5662
+ // If this is an inner synthetic event for an event with a bubbling surrogate
5663
+ // (focus or blur), assume that the surrogate already propagated from triggering the
5664
+ // native event and prevent that from happening again here.
5665
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5666
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5667
+ // less bad than duplication.
5668
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
5669
+ event.stopPropagation();
5670
+ }
5671
+
5672
+ // If this is a native event triggered above, everything is now in order
5673
+ // Fire an inner synthetic event with the original arguments
5674
+ } else if ( saved.length ) {
5675
+
5676
+ // ...and capture the result
5677
+ dataPriv.set( this, type, {
5678
+ value: jQuery.event.trigger(
5679
+
5680
+ // Support: IE <=9 - 11+
5681
+ // Extend with the prototype to reset the above stopImmediatePropagation()
5682
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5683
+ saved.slice( 1 ),
5684
+ this
5685
+ )
5686
+ } );
5687
+
5688
+ // Abort handling of the native event
5689
+ event.stopImmediatePropagation();
5690
+ }
5691
+ }
5692
+ } );
5693
+ }
5372
5694
 
5373
5695
  jQuery.removeEvent = function( elem, type, handle ) {
5374
5696
 
@@ -5421,7 +5743,7 @@ jQuery.Event = function( src, props ) {
5421
5743
  }
5422
5744
 
5423
5745
  // Create a timestamp if incoming event doesn't have one
5424
- this.timeStamp = src && src.timeStamp || jQuery.now();
5746
+ this.timeStamp = src && src.timeStamp || Date.now();
5425
5747
 
5426
5748
  // Mark it as fixed
5427
5749
  this[ jQuery.expando ] = true;
@@ -5482,6 +5804,7 @@ jQuery.each( {
5482
5804
  shiftKey: true,
5483
5805
  view: true,
5484
5806
  "char": true,
5807
+ code: true,
5485
5808
  charCode: true,
5486
5809
  key: true,
5487
5810
  keyCode: true,
@@ -5528,6 +5851,33 @@ jQuery.each( {
5528
5851
  }
5529
5852
  }, jQuery.event.addProp );
5530
5853
 
5854
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5855
+ jQuery.event.special[ type ] = {
5856
+
5857
+ // Utilize native event if possible so blur/focus sequence is correct
5858
+ setup: function() {
5859
+
5860
+ // Claim the first handler
5861
+ // dataPriv.set( this, "focus", ... )
5862
+ // dataPriv.set( this, "blur", ... )
5863
+ leverageNative( this, type, expectSync );
5864
+
5865
+ // Return false to allow normal processing in the caller
5866
+ return false;
5867
+ },
5868
+ trigger: function() {
5869
+
5870
+ // Force setup before trigger
5871
+ leverageNative( this, type );
5872
+
5873
+ // Return non-false to allow normal event-path propagation
5874
+ return true;
5875
+ },
5876
+
5877
+ delegateType: delegateType
5878
+ };
5879
+ } );
5880
+
5531
5881
  // Create mouseenter/leave events using mouseover/out and event-time checks
5532
5882
  // so that event delegation works in jQuery.
5533
5883
  // Do the same for pointerenter/pointerleave and pointerover/pointerout
@@ -5613,21 +5963,13 @@ jQuery.fn.extend( {
5613
5963
 
5614
5964
  var
5615
5965
 
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
5966
+ // Support: IE <=10 - 11, Edge 12 - 13 only
5624
5967
  // In IE/Edge using regex groups here causes severe slowdowns.
5625
5968
  // See https://connect.microsoft.com/IE/feedback/details/1736512/
5626
5969
  rnoInnerhtml = /<script|<style|<link/i,
5627
5970
 
5628
5971
  // checked="checked" or checked
5629
5972
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5630
- rscriptTypeMasked = /^true\/(.*)/,
5631
5973
  rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5632
5974
 
5633
5975
  // Prefer a tbody over its parent table for containing new rows
@@ -5635,7 +5977,7 @@ function manipulationTarget( elem, content ) {
5635
5977
  if ( nodeName( elem, "table" ) &&
5636
5978
  nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
5637
5979
 
5638
- return jQuery( ">tbody", elem )[ 0 ] || elem;
5980
+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
5639
5981
  }
5640
5982
 
5641
5983
  return elem;
@@ -5647,10 +5989,8 @@ function disableScript( elem ) {
5647
5989
  return elem;
5648
5990
  }
5649
5991
  function restoreScript( elem ) {
5650
- var match = rscriptTypeMasked.exec( elem.type );
5651
-
5652
- if ( match ) {
5653
- elem.type = match[ 1 ];
5992
+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
5993
+ elem.type = elem.type.slice( 5 );
5654
5994
  } else {
5655
5995
  elem.removeAttribute( "type" );
5656
5996
  }
@@ -5659,7 +5999,7 @@ function restoreScript( elem ) {
5659
5999
  }
5660
6000
 
5661
6001
  function cloneCopyEvent( src, dest ) {
5662
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
6002
+ var i, l, type, pdataOld, udataOld, udataCur, events;
5663
6003
 
5664
6004
  if ( dest.nodeType !== 1 ) {
5665
6005
  return;
@@ -5667,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
5667
6007
 
5668
6008
  // 1. Copy private data: events, handlers, etc.
5669
6009
  if ( dataPriv.hasData( src ) ) {
5670
- pdataOld = dataPriv.access( src );
5671
- pdataCur = dataPriv.set( dest, pdataOld );
6010
+ pdataOld = dataPriv.get( src );
5672
6011
  events = pdataOld.events;
5673
6012
 
5674
6013
  if ( events ) {
5675
- delete pdataCur.handle;
5676
- pdataCur.events = {};
6014
+ dataPriv.remove( dest, "handle events" );
5677
6015
 
5678
6016
  for ( type in events ) {
5679
6017
  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5709,22 +6047,22 @@ function fixInput( src, dest ) {
5709
6047
  function domManip( collection, args, callback, ignored ) {
5710
6048
 
5711
6049
  // Flatten any nested arrays
5712
- args = concat.apply( [], args );
6050
+ args = flat( args );
5713
6051
 
5714
6052
  var fragment, first, scripts, hasScripts, node, doc,
5715
6053
  i = 0,
5716
6054
  l = collection.length,
5717
6055
  iNoClone = l - 1,
5718
6056
  value = args[ 0 ],
5719
- isFunction = jQuery.isFunction( value );
6057
+ valueIsFunction = isFunction( value );
5720
6058
 
5721
6059
  // We can't cloneNode fragments that contain checked, in WebKit
5722
- if ( isFunction ||
6060
+ if ( valueIsFunction ||
5723
6061
  ( l > 1 && typeof value === "string" &&
5724
6062
  !support.checkClone && rchecked.test( value ) ) ) {
5725
6063
  return collection.each( function( index ) {
5726
6064
  var self = collection.eq( index );
5727
- if ( isFunction ) {
6065
+ if ( valueIsFunction ) {
5728
6066
  args[ 0 ] = value.call( this, index, self.html() );
5729
6067
  }
5730
6068
  domManip( self, args, callback, ignored );
@@ -5778,14 +6116,16 @@ function domManip( collection, args, callback, ignored ) {
5778
6116
  !dataPriv.access( node, "globalEval" ) &&
5779
6117
  jQuery.contains( doc, node ) ) {
5780
6118
 
5781
- if ( node.src ) {
6119
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
5782
6120
 
5783
6121
  // Optional AJAX dependency, but won't run scripts if not present
5784
- if ( jQuery._evalUrl ) {
5785
- jQuery._evalUrl( node.src );
6122
+ if ( jQuery._evalUrl && !node.noModule ) {
6123
+ jQuery._evalUrl( node.src, {
6124
+ nonce: node.nonce || node.getAttribute( "nonce" )
6125
+ }, doc );
5786
6126
  }
5787
6127
  } else {
5788
- DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
6128
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5789
6129
  }
5790
6130
  }
5791
6131
  }
@@ -5807,7 +6147,7 @@ function remove( elem, selector, keepData ) {
5807
6147
  }
5808
6148
 
5809
6149
  if ( node.parentNode ) {
5810
- if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
6150
+ if ( keepData && isAttached( node ) ) {
5811
6151
  setGlobalEval( getAll( node, "script" ) );
5812
6152
  }
5813
6153
  node.parentNode.removeChild( node );
@@ -5819,13 +6159,13 @@ function remove( elem, selector, keepData ) {
5819
6159
 
5820
6160
  jQuery.extend( {
5821
6161
  htmlPrefilter: function( html ) {
5822
- return html.replace( rxhtmlTag, "<$1></$2>" );
6162
+ return html;
5823
6163
  },
5824
6164
 
5825
6165
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5826
6166
  var i, l, srcElements, destElements,
5827
6167
  clone = elem.cloneNode( true ),
5828
- inPage = jQuery.contains( elem.ownerDocument, elem );
6168
+ inPage = isAttached( elem );
5829
6169
 
5830
6170
  // Fix IE cloning issues
5831
6171
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
@@ -6065,8 +6405,6 @@ jQuery.each( {
6065
6405
  return this.pushStack( ret );
6066
6406
  };
6067
6407
  } );
6068
- var rmargin = ( /^margin/ );
6069
-
6070
6408
  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6071
6409
 
6072
6410
  var getStyles = function( elem ) {
@@ -6083,6 +6421,29 @@ var getStyles = function( elem ) {
6083
6421
  return view.getComputedStyle( elem );
6084
6422
  };
6085
6423
 
6424
+ var swap = function( elem, options, callback ) {
6425
+ var ret, name,
6426
+ old = {};
6427
+
6428
+ // Remember the old values, and insert the new ones
6429
+ for ( name in options ) {
6430
+ old[ name ] = elem.style[ name ];
6431
+ elem.style[ name ] = options[ name ];
6432
+ }
6433
+
6434
+ ret = callback.call( elem );
6435
+
6436
+ // Revert the old values
6437
+ for ( name in options ) {
6438
+ elem.style[ name ] = old[ name ];
6439
+ }
6440
+
6441
+ return ret;
6442
+ };
6443
+
6444
+
6445
+ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6446
+
6086
6447
 
6087
6448
 
6088
6449
  ( function() {
@@ -6096,25 +6457,35 @@ var getStyles = function( elem ) {
6096
6457
  return;
6097
6458
  }
6098
6459
 
6460
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
6461
+ "margin-top:1px;padding:0;border:0";
6099
6462
  div.style.cssText =
6100
- "box-sizing:border-box;" +
6101
- "position:relative;display:block;" +
6463
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
6102
6464
  "margin:auto;border:1px;padding:1px;" +
6103
- "top:1%;width:50%";
6104
- div.innerHTML = "";
6105
- documentElement.appendChild( container );
6465
+ "width:60%;top:1%";
6466
+ documentElement.appendChild( container ).appendChild( div );
6106
6467
 
6107
6468
  var divStyle = window.getComputedStyle( div );
6108
6469
  pixelPositionVal = divStyle.top !== "1%";
6109
6470
 
6110
6471
  // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
6111
- reliableMarginLeftVal = divStyle.marginLeft === "2px";
6112
- boxSizingReliableVal = divStyle.width === "4px";
6472
+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
6113
6473
 
6114
- // Support: Android 4.0 - 4.3 only
6474
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
6115
6475
  // Some styles come back with percentage values, even though they shouldn't
6116
- div.style.marginRight = "50%";
6117
- pixelMarginRightVal = divStyle.marginRight === "4px";
6476
+ div.style.right = "60%";
6477
+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
6478
+
6479
+ // Support: IE 9 - 11 only
6480
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
6481
+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
6482
+
6483
+ // Support: IE 9 only
6484
+ // Detect overflow:scroll screwiness (gh-3699)
6485
+ // Support: Chrome <=64
6486
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
6487
+ div.style.position = "absolute";
6488
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
6118
6489
 
6119
6490
  documentElement.removeChild( container );
6120
6491
 
@@ -6123,7 +6494,12 @@ var getStyles = function( elem ) {
6123
6494
  div = null;
6124
6495
  }
6125
6496
 
6126
- var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
6497
+ function roundPixelMeasures( measure ) {
6498
+ return Math.round( parseFloat( measure ) );
6499
+ }
6500
+
6501
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6502
+ reliableTrDimensionsVal, reliableMarginLeftVal,
6127
6503
  container = document.createElement( "div" ),
6128
6504
  div = document.createElement( "div" );
6129
6505
 
@@ -6138,26 +6514,55 @@ var getStyles = function( elem ) {
6138
6514
  div.cloneNode( true ).style.backgroundClip = "";
6139
6515
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
6140
6516
 
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
6517
  jQuery.extend( support, {
6146
- pixelPosition: function() {
6147
- computeStyleTests();
6148
- return pixelPositionVal;
6149
- },
6150
6518
  boxSizingReliable: function() {
6151
6519
  computeStyleTests();
6152
6520
  return boxSizingReliableVal;
6153
6521
  },
6154
- pixelMarginRight: function() {
6522
+ pixelBoxStyles: function() {
6155
6523
  computeStyleTests();
6156
- return pixelMarginRightVal;
6524
+ return pixelBoxStylesVal;
6525
+ },
6526
+ pixelPosition: function() {
6527
+ computeStyleTests();
6528
+ return pixelPositionVal;
6157
6529
  },
6158
6530
  reliableMarginLeft: function() {
6159
6531
  computeStyleTests();
6160
6532
  return reliableMarginLeftVal;
6533
+ },
6534
+ scrollboxSize: function() {
6535
+ computeStyleTests();
6536
+ return scrollboxSizeVal;
6537
+ },
6538
+
6539
+ // Support: IE 9 - 11+, Edge 15 - 18+
6540
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6541
+ // set in CSS while `offset*` properties report correct values.
6542
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
6543
+ // some versions of this test; make sure not to make it pass there!
6544
+ reliableTrDimensions: function() {
6545
+ var table, tr, trChild, trStyle;
6546
+ if ( reliableTrDimensionsVal == null ) {
6547
+ table = document.createElement( "table" );
6548
+ tr = document.createElement( "tr" );
6549
+ trChild = document.createElement( "div" );
6550
+
6551
+ table.style.cssText = "position:absolute;left:-11111px";
6552
+ tr.style.height = "1px";
6553
+ trChild.style.height = "9px";
6554
+
6555
+ documentElement
6556
+ .appendChild( table )
6557
+ .appendChild( tr )
6558
+ .appendChild( trChild );
6559
+
6560
+ trStyle = window.getComputedStyle( tr );
6561
+ reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
6562
+
6563
+ documentElement.removeChild( table );
6564
+ }
6565
+ return reliableTrDimensionsVal;
6161
6566
  }
6162
6567
  } );
6163
6568
  } )();
@@ -6180,7 +6585,7 @@ function curCSS( elem, name, computed ) {
6180
6585
  if ( computed ) {
6181
6586
  ret = computed.getPropertyValue( name ) || computed[ name ];
6182
6587
 
6183
- if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6588
+ if ( ret === "" && !isAttached( elem ) ) {
6184
6589
  ret = jQuery.style( elem, name );
6185
6590
  }
6186
6591
 
@@ -6189,7 +6594,7 @@ function curCSS( elem, name, computed ) {
6189
6594
  // but width seems to be reliably pixels.
6190
6595
  // This is against the CSSOM draft spec:
6191
6596
  // https://drafts.csswg.org/cssom/#resolved-values
6192
- if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6597
+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
6193
6598
 
6194
6599
  // Remember the original values
6195
6600
  width = style.width;
@@ -6236,30 +6641,13 @@ function addGetHookIf( conditionFn, hookFn ) {
6236
6641
  }
6237
6642
 
6238
6643
 
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;
6644
+ var cssPrefixes = [ "Webkit", "Moz", "ms" ],
6645
+ emptyStyle = document.createElement( "div" ).style,
6646
+ vendorProps = {};
6254
6647
 
6255
- // Return a css property mapped to a potentially vendor prefixed property
6648
+ // Return a vendor-prefixed property or undefined
6256
6649
  function vendorPropName( name ) {
6257
6650
 
6258
- // Shortcut for names that are not vendor prefixed
6259
- if ( name in emptyStyle ) {
6260
- return name;
6261
- }
6262
-
6263
6651
  // Check for vendor prefixed names
6264
6652
  var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
6265
6653
  i = cssPrefixes.length;
@@ -6272,17 +6660,34 @@ function vendorPropName( name ) {
6272
6660
  }
6273
6661
  }
6274
6662
 
6275
- // Return a property mapped along what jQuery.cssProps suggests or to
6276
- // a vendor prefixed property.
6663
+ // Return a potentially-mapped jQuery.cssProps or vendor prefixed property
6277
6664
  function finalPropName( name ) {
6278
- var ret = jQuery.cssProps[ name ];
6279
- if ( !ret ) {
6280
- ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
6665
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
6666
+
6667
+ if ( final ) {
6668
+ return final;
6281
6669
  }
6282
- return ret;
6670
+ if ( name in emptyStyle ) {
6671
+ return name;
6672
+ }
6673
+ return vendorProps[ name ] = vendorPropName( name ) || name;
6283
6674
  }
6284
6675
 
6285
- function setPositiveNumber( elem, value, subtract ) {
6676
+
6677
+ var
6678
+
6679
+ // Swappable if display is none or starts with table
6680
+ // except "table", "table-cell", or "table-caption"
6681
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6682
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6683
+ rcustomProp = /^--/,
6684
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6685
+ cssNormalTransform = {
6686
+ letterSpacing: "0",
6687
+ fontWeight: "400"
6688
+ };
6689
+
6690
+ function setPositiveNumber( _elem, value, subtract ) {
6286
6691
 
6287
6692
  // Any relative (+/-) values have already been
6288
6693
  // normalized at this point
@@ -6294,87 +6699,146 @@ function setPositiveNumber( elem, value, subtract ) {
6294
6699
  value;
6295
6700
  }
6296
6701
 
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;
6702
+ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6703
+ var i = dimension === "width" ? 1 : 0,
6704
+ extra = 0,
6705
+ delta = 0;
6304
6706
 
6305
- // Otherwise initialize for horizontal or vertical properties
6306
- } else {
6307
- i = name === "width" ? 1 : 0;
6707
+ // Adjustment may not be necessary
6708
+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
6709
+ return 0;
6308
6710
  }
6309
6711
 
6310
6712
  for ( ; i < 4; i += 2 ) {
6311
6713
 
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 );
6714
+ // Both box models exclude margin
6715
+ if ( box === "margin" ) {
6716
+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6315
6717
  }
6316
6718
 
6317
- if ( isBorderBox ) {
6719
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
6720
+ if ( !isBorderBox ) {
6318
6721
 
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
- }
6722
+ // Add padding
6723
+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6323
6724
 
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 );
6725
+ // For "border" or "margin", add border
6726
+ if ( box !== "padding" ) {
6727
+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6728
+
6729
+ // But still keep track of it otherwise
6730
+ } else {
6731
+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6327
6732
  }
6733
+
6734
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
6735
+ // "padding" or "margin"
6328
6736
  } else {
6329
6737
 
6330
- // At this point, extra isn't content, so add padding
6331
- val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6738
+ // For "content", subtract padding
6739
+ if ( box === "content" ) {
6740
+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6741
+ }
6332
6742
 
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 );
6743
+ // For "content" or "padding", subtract border
6744
+ if ( box !== "margin" ) {
6745
+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6336
6746
  }
6337
6747
  }
6338
6748
  }
6339
6749
 
6340
- return val;
6750
+ // Account for positive content-box scroll gutter when requested by providing computedVal
6751
+ if ( !isBorderBox && computedVal >= 0 ) {
6752
+
6753
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
6754
+ // Assuming integer scroll gutter, subtract the rest and round down
6755
+ delta += Math.max( 0, Math.ceil(
6756
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
6757
+ computedVal -
6758
+ delta -
6759
+ extra -
6760
+ 0.5
6761
+
6762
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
6763
+ // Use an explicit zero to avoid NaN (gh-3964)
6764
+ ) ) || 0;
6765
+ }
6766
+
6767
+ return delta;
6341
6768
  }
6342
6769
 
6343
- function getWidthOrHeight( elem, name, extra ) {
6770
+ function getWidthOrHeight( elem, dimension, extra ) {
6344
6771
 
6345
6772
  // 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";
6773
+ var styles = getStyles( elem ),
6774
+
6775
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
6776
+ // Fake content-box until we know it's needed to know the true value.
6777
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
6778
+ isBorderBox = boxSizingNeeded &&
6779
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6780
+ valueIsBorderBox = isBorderBox,
6350
6781
 
6351
- // Computed unit is not pixels. Stop here and return.
6782
+ val = curCSS( elem, dimension, styles ),
6783
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
6784
+
6785
+ // Support: Firefox <=54
6786
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
6352
6787
  if ( rnumnonpx.test( val ) ) {
6353
- return val;
6788
+ if ( !extra ) {
6789
+ return val;
6790
+ }
6791
+ val = "auto";
6354
6792
  }
6355
6793
 
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
6794
 
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 ) ];
6795
+ // Support: IE 9 - 11 only
6796
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6797
+ // In those cases, the computed value can be trusted to be border-box.
6798
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
6799
+
6800
+ // Support: IE 10 - 11+, Edge 15 - 18+
6801
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6802
+ // set in CSS while `offset*` properties report correct values.
6803
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6804
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6805
+
6806
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6807
+ // This happens for inline elements with no explicit setting (gh-3571)
6808
+ val === "auto" ||
6809
+
6810
+ // Support: Android <=4.1 - 4.3 only
6811
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6812
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6813
+
6814
+ // Make sure the element is visible & connected
6815
+ elem.getClientRects().length ) {
6816
+
6817
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6818
+
6819
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
6820
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
6821
+ // retrieved value as a content box dimension.
6822
+ valueIsBorderBox = offsetProp in elem;
6823
+ if ( valueIsBorderBox ) {
6824
+ val = elem[ offsetProp ];
6825
+ }
6365
6826
  }
6366
6827
 
6367
- // Normalize "", auto, and prepare for extra
6828
+ // Normalize "" and auto
6368
6829
  val = parseFloat( val ) || 0;
6369
6830
 
6370
- // Use the active box-sizing model to add/subtract irrelevant styles
6831
+ // Adjust for the element's box model
6371
6832
  return ( val +
6372
- augmentWidthOrHeight(
6833
+ boxModelAdjustment(
6373
6834
  elem,
6374
- name,
6835
+ dimension,
6375
6836
  extra || ( isBorderBox ? "border" : "content" ),
6376
6837
  valueIsBorderBox,
6377
- styles
6838
+ styles,
6839
+
6840
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
6841
+ val
6378
6842
  )
6379
6843
  ) + "px";
6380
6844
  }
@@ -6404,6 +6868,13 @@ jQuery.extend( {
6404
6868
  "flexGrow": true,
6405
6869
  "flexShrink": true,
6406
6870
  "fontWeight": true,
6871
+ "gridArea": true,
6872
+ "gridColumn": true,
6873
+ "gridColumnEnd": true,
6874
+ "gridColumnStart": true,
6875
+ "gridRow": true,
6876
+ "gridRowEnd": true,
6877
+ "gridRowStart": true,
6407
6878
  "lineHeight": true,
6408
6879
  "opacity": true,
6409
6880
  "order": true,
@@ -6415,9 +6886,7 @@ jQuery.extend( {
6415
6886
 
6416
6887
  // Add in properties whose names you wish to fix before
6417
6888
  // setting or getting the value
6418
- cssProps: {
6419
- "float": "cssFloat"
6420
- },
6889
+ cssProps: {},
6421
6890
 
6422
6891
  // Get and set the style property on a DOM Node
6423
6892
  style: function( elem, name, value, extra ) {
@@ -6429,7 +6898,7 @@ jQuery.extend( {
6429
6898
 
6430
6899
  // Make sure that we're working with the right name
6431
6900
  var ret, type, hooks,
6432
- origName = jQuery.camelCase( name ),
6901
+ origName = camelCase( name ),
6433
6902
  isCustomProp = rcustomProp.test( name ),
6434
6903
  style = elem.style;
6435
6904
 
@@ -6461,7 +6930,9 @@ jQuery.extend( {
6461
6930
  }
6462
6931
 
6463
6932
  // If a number was passed in, add the unit (except for certain CSS properties)
6464
- if ( type === "number" ) {
6933
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
6934
+ // "px" to a few hardcoded values.
6935
+ if ( type === "number" && !isCustomProp ) {
6465
6936
  value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
6466
6937
  }
6467
6938
 
@@ -6497,7 +6968,7 @@ jQuery.extend( {
6497
6968
 
6498
6969
  css: function( elem, name, extra, styles ) {
6499
6970
  var val, num, hooks,
6500
- origName = jQuery.camelCase( name ),
6971
+ origName = camelCase( name ),
6501
6972
  isCustomProp = rcustomProp.test( name );
6502
6973
 
6503
6974
  // Make sure that we're working with the right name. We don't
@@ -6535,8 +7006,8 @@ jQuery.extend( {
6535
7006
  }
6536
7007
  } );
6537
7008
 
6538
- jQuery.each( [ "height", "width" ], function( i, name ) {
6539
- jQuery.cssHooks[ name ] = {
7009
+ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
7010
+ jQuery.cssHooks[ dimension ] = {
6540
7011
  get: function( elem, computed, extra ) {
6541
7012
  if ( computed ) {
6542
7013
 
@@ -6552,29 +7023,52 @@ jQuery.each( [ "height", "width" ], function( i, name ) {
6552
7023
  // in IE throws an error.
6553
7024
  ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6554
7025
  swap( elem, cssShow, function() {
6555
- return getWidthOrHeight( elem, name, extra );
7026
+ return getWidthOrHeight( elem, dimension, extra );
6556
7027
  } ) :
6557
- getWidthOrHeight( elem, name, extra );
7028
+ getWidthOrHeight( elem, dimension, extra );
6558
7029
  }
6559
7030
  },
6560
7031
 
6561
7032
  set: function( elem, value, extra ) {
6562
7033
  var matches,
6563
- styles = extra && getStyles( elem ),
6564
- subtract = extra && augmentWidthOrHeight(
6565
- elem,
6566
- name,
6567
- extra,
7034
+ styles = getStyles( elem ),
7035
+
7036
+ // Only read styles.position if the test has a chance to fail
7037
+ // to avoid forcing a reflow.
7038
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
7039
+ styles.position === "absolute",
7040
+
7041
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
7042
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
7043
+ isBorderBox = boxSizingNeeded &&
6568
7044
  jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6569
- styles
7045
+ subtract = extra ?
7046
+ boxModelAdjustment(
7047
+ elem,
7048
+ dimension,
7049
+ extra,
7050
+ isBorderBox,
7051
+ styles
7052
+ ) :
7053
+ 0;
7054
+
7055
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
7056
+ // faking a content-box to get border and padding (gh-3699)
7057
+ if ( isBorderBox && scrollboxSizeBuggy ) {
7058
+ subtract -= Math.ceil(
7059
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
7060
+ parseFloat( styles[ dimension ] ) -
7061
+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
7062
+ 0.5
6570
7063
  );
7064
+ }
6571
7065
 
6572
7066
  // Convert to pixels if value adjustment is needed
6573
7067
  if ( subtract && ( matches = rcssNum.exec( value ) ) &&
6574
7068
  ( matches[ 3 ] || "px" ) !== "px" ) {
6575
7069
 
6576
- elem.style[ name ] = value;
6577
- value = jQuery.css( elem, name );
7070
+ elem.style[ dimension ] = value;
7071
+ value = jQuery.css( elem, dimension );
6578
7072
  }
6579
7073
 
6580
7074
  return setPositiveNumber( elem, value, subtract );
@@ -6618,7 +7112,7 @@ jQuery.each( {
6618
7112
  }
6619
7113
  };
6620
7114
 
6621
- if ( !rmargin.test( prefix ) ) {
7115
+ if ( prefix !== "margin" ) {
6622
7116
  jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6623
7117
  }
6624
7118
  } );
@@ -6728,9 +7222,9 @@ Tween.propHooks = {
6728
7222
  // Use .style if available and use plain properties where available.
6729
7223
  if ( jQuery.fx.step[ tween.prop ] ) {
6730
7224
  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 ] ) ) {
7225
+ } else if ( tween.elem.nodeType === 1 && (
7226
+ jQuery.cssHooks[ tween.prop ] ||
7227
+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6734
7228
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6735
7229
  } else {
6736
7230
  tween.elem[ tween.prop ] = tween.now;
@@ -6789,7 +7283,7 @@ function createFxNow() {
6789
7283
  window.setTimeout( function() {
6790
7284
  fxNow = undefined;
6791
7285
  } );
6792
- return ( fxNow = jQuery.now() );
7286
+ return ( fxNow = Date.now() );
6793
7287
  }
6794
7288
 
6795
7289
  // Generate parameters to create a standard animation
@@ -6893,9 +7387,10 @@ function defaultPrefilter( elem, props, opts ) {
6893
7387
  // Restrict "overflow" and "display" styles during box animations
6894
7388
  if ( isBox && elem.nodeType === 1 ) {
6895
7389
 
6896
- // Support: IE <=9 - 11, Edge 12 - 13
7390
+ // Support: IE <=9 - 11, Edge 12 - 15
6897
7391
  // Record all 3 overflow attributes because IE does not infer the shorthand
6898
- // from identically-valued overflowX and overflowY
7392
+ // from identically-valued overflowX and overflowY and Edge just mirrors
7393
+ // the overflowX value there.
6899
7394
  opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6900
7395
 
6901
7396
  // Identify a display type, preferring old show/hide data over the CSS cascade
@@ -7003,7 +7498,7 @@ function propFilter( props, specialEasing ) {
7003
7498
 
7004
7499
  // camelCase, specialEasing and expand cssHook pass
7005
7500
  for ( index in props ) {
7006
- name = jQuery.camelCase( index );
7501
+ name = camelCase( index );
7007
7502
  easing = specialEasing[ name ];
7008
7503
  value = props[ index ];
7009
7504
  if ( Array.isArray( value ) ) {
@@ -7128,9 +7623,9 @@ function Animation( elem, properties, options ) {
7128
7623
  for ( ; index < length; index++ ) {
7129
7624
  result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
7130
7625
  if ( result ) {
7131
- if ( jQuery.isFunction( result.stop ) ) {
7626
+ if ( isFunction( result.stop ) ) {
7132
7627
  jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
7133
- jQuery.proxy( result.stop, result );
7628
+ result.stop.bind( result );
7134
7629
  }
7135
7630
  return result;
7136
7631
  }
@@ -7138,7 +7633,7 @@ function Animation( elem, properties, options ) {
7138
7633
 
7139
7634
  jQuery.map( props, createTween, animation );
7140
7635
 
7141
- if ( jQuery.isFunction( animation.opts.start ) ) {
7636
+ if ( isFunction( animation.opts.start ) ) {
7142
7637
  animation.opts.start.call( elem, animation );
7143
7638
  }
7144
7639
 
@@ -7171,7 +7666,7 @@ jQuery.Animation = jQuery.extend( Animation, {
7171
7666
  },
7172
7667
 
7173
7668
  tweener: function( props, callback ) {
7174
- if ( jQuery.isFunction( props ) ) {
7669
+ if ( isFunction( props ) ) {
7175
7670
  callback = props;
7176
7671
  props = [ "*" ];
7177
7672
  } else {
@@ -7203,9 +7698,9 @@ jQuery.Animation = jQuery.extend( Animation, {
7203
7698
  jQuery.speed = function( speed, easing, fn ) {
7204
7699
  var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7205
7700
  complete: fn || !fn && easing ||
7206
- jQuery.isFunction( speed ) && speed,
7701
+ isFunction( speed ) && speed,
7207
7702
  duration: speed,
7208
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7703
+ easing: fn && easing || easing && !isFunction( easing ) && easing
7209
7704
  };
7210
7705
 
7211
7706
  // Go to the end state if fx are off
@@ -7232,7 +7727,7 @@ jQuery.speed = function( speed, easing, fn ) {
7232
7727
  opt.old = opt.complete;
7233
7728
 
7234
7729
  opt.complete = function() {
7235
- if ( jQuery.isFunction( opt.old ) ) {
7730
+ if ( isFunction( opt.old ) ) {
7236
7731
  opt.old.call( this );
7237
7732
  }
7238
7733
 
@@ -7284,7 +7779,7 @@ jQuery.fn.extend( {
7284
7779
  clearQueue = type;
7285
7780
  type = undefined;
7286
7781
  }
7287
- if ( clearQueue && type !== false ) {
7782
+ if ( clearQueue ) {
7288
7783
  this.queue( type || "fx", [] );
7289
7784
  }
7290
7785
 
@@ -7367,7 +7862,7 @@ jQuery.fn.extend( {
7367
7862
  }
7368
7863
  } );
7369
7864
 
7370
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7865
+ jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7371
7866
  var cssFn = jQuery.fn[ name ];
7372
7867
  jQuery.fn[ name ] = function( speed, easing, callback ) {
7373
7868
  return speed == null || typeof speed === "boolean" ?
@@ -7396,7 +7891,7 @@ jQuery.fx.tick = function() {
7396
7891
  i = 0,
7397
7892
  timers = jQuery.timers;
7398
7893
 
7399
- fxNow = jQuery.now();
7894
+ fxNow = Date.now();
7400
7895
 
7401
7896
  for ( ; i < timers.length; i++ ) {
7402
7897
  timer = timers[ i ];
@@ -7588,7 +8083,7 @@ boolHook = {
7588
8083
  }
7589
8084
  };
7590
8085
 
7591
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8086
+ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7592
8087
  var getter = attrHandle[ name ] || jQuery.find.attr;
7593
8088
 
7594
8089
  attrHandle[ name ] = function( elem, name, isXML ) {
@@ -7749,7 +8244,7 @@ jQuery.each( [
7749
8244
 
7750
8245
 
7751
8246
  // Strip and collapse whitespace according to HTML spec
7752
- // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
8247
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
7753
8248
  function stripAndCollapse( value ) {
7754
8249
  var tokens = value.match( rnothtmlwhite ) || [];
7755
8250
  return tokens.join( " " );
@@ -7760,20 +8255,30 @@ function getClass( elem ) {
7760
8255
  return elem.getAttribute && elem.getAttribute( "class" ) || "";
7761
8256
  }
7762
8257
 
8258
+ function classesToArray( value ) {
8259
+ if ( Array.isArray( value ) ) {
8260
+ return value;
8261
+ }
8262
+ if ( typeof value === "string" ) {
8263
+ return value.match( rnothtmlwhite ) || [];
8264
+ }
8265
+ return [];
8266
+ }
8267
+
7763
8268
  jQuery.fn.extend( {
7764
8269
  addClass: function( value ) {
7765
8270
  var classes, elem, cur, curValue, clazz, j, finalValue,
7766
8271
  i = 0;
7767
8272
 
7768
- if ( jQuery.isFunction( value ) ) {
8273
+ if ( isFunction( value ) ) {
7769
8274
  return this.each( function( j ) {
7770
8275
  jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
7771
8276
  } );
7772
8277
  }
7773
8278
 
7774
- if ( typeof value === "string" && value ) {
7775
- classes = value.match( rnothtmlwhite ) || [];
8279
+ classes = classesToArray( value );
7776
8280
 
8281
+ if ( classes.length ) {
7777
8282
  while ( ( elem = this[ i++ ] ) ) {
7778
8283
  curValue = getClass( elem );
7779
8284
  cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
@@ -7802,7 +8307,7 @@ jQuery.fn.extend( {
7802
8307
  var classes, elem, cur, curValue, clazz, j, finalValue,
7803
8308
  i = 0;
7804
8309
 
7805
- if ( jQuery.isFunction( value ) ) {
8310
+ if ( isFunction( value ) ) {
7806
8311
  return this.each( function( j ) {
7807
8312
  jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
7808
8313
  } );
@@ -7812,9 +8317,9 @@ jQuery.fn.extend( {
7812
8317
  return this.attr( "class", "" );
7813
8318
  }
7814
8319
 
7815
- if ( typeof value === "string" && value ) {
7816
- classes = value.match( rnothtmlwhite ) || [];
8320
+ classes = classesToArray( value );
7817
8321
 
8322
+ if ( classes.length ) {
7818
8323
  while ( ( elem = this[ i++ ] ) ) {
7819
8324
  curValue = getClass( elem );
7820
8325
 
@@ -7844,13 +8349,14 @@ jQuery.fn.extend( {
7844
8349
  },
7845
8350
 
7846
8351
  toggleClass: function( value, stateVal ) {
7847
- var type = typeof value;
8352
+ var type = typeof value,
8353
+ isValidValue = type === "string" || Array.isArray( value );
7848
8354
 
7849
- if ( typeof stateVal === "boolean" && type === "string" ) {
8355
+ if ( typeof stateVal === "boolean" && isValidValue ) {
7850
8356
  return stateVal ? this.addClass( value ) : this.removeClass( value );
7851
8357
  }
7852
8358
 
7853
- if ( jQuery.isFunction( value ) ) {
8359
+ if ( isFunction( value ) ) {
7854
8360
  return this.each( function( i ) {
7855
8361
  jQuery( this ).toggleClass(
7856
8362
  value.call( this, i, getClass( this ), stateVal ),
@@ -7862,12 +8368,12 @@ jQuery.fn.extend( {
7862
8368
  return this.each( function() {
7863
8369
  var className, i, self, classNames;
7864
8370
 
7865
- if ( type === "string" ) {
8371
+ if ( isValidValue ) {
7866
8372
 
7867
8373
  // Toggle individual class names
7868
8374
  i = 0;
7869
8375
  self = jQuery( this );
7870
- classNames = value.match( rnothtmlwhite ) || [];
8376
+ classNames = classesToArray( value );
7871
8377
 
7872
8378
  while ( ( className = classNames[ i++ ] ) ) {
7873
8379
 
@@ -7926,7 +8432,7 @@ var rreturn = /\r/g;
7926
8432
 
7927
8433
  jQuery.fn.extend( {
7928
8434
  val: function( value ) {
7929
- var hooks, ret, isFunction,
8435
+ var hooks, ret, valueIsFunction,
7930
8436
  elem = this[ 0 ];
7931
8437
 
7932
8438
  if ( !arguments.length ) {
@@ -7955,7 +8461,7 @@ jQuery.fn.extend( {
7955
8461
  return;
7956
8462
  }
7957
8463
 
7958
- isFunction = jQuery.isFunction( value );
8464
+ valueIsFunction = isFunction( value );
7959
8465
 
7960
8466
  return this.each( function( i ) {
7961
8467
  var val;
@@ -7964,7 +8470,7 @@ jQuery.fn.extend( {
7964
8470
  return;
7965
8471
  }
7966
8472
 
7967
- if ( isFunction ) {
8473
+ if ( valueIsFunction ) {
7968
8474
  val = value.call( this, i, jQuery( this ).val() );
7969
8475
  } else {
7970
8476
  val = value;
@@ -8106,18 +8612,24 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8106
8612
  // Return jQuery for attributes-only inclusion
8107
8613
 
8108
8614
 
8109
- var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
8615
+ support.focusin = "onfocusin" in window;
8616
+
8617
+
8618
+ var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
8619
+ stopPropagationCallback = function( e ) {
8620
+ e.stopPropagation();
8621
+ };
8110
8622
 
8111
8623
  jQuery.extend( jQuery.event, {
8112
8624
 
8113
8625
  trigger: function( event, data, elem, onlyHandlers ) {
8114
8626
 
8115
- var i, cur, tmp, bubbleType, ontype, handle, special,
8627
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
8116
8628
  eventPath = [ elem || document ],
8117
8629
  type = hasOwn.call( event, "type" ) ? event.type : event,
8118
8630
  namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
8119
8631
 
8120
- cur = tmp = elem = elem || document;
8632
+ cur = lastElement = tmp = elem = elem || document;
8121
8633
 
8122
8634
  // Don't do events on text and comment nodes
8123
8635
  if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
@@ -8169,7 +8681,7 @@ jQuery.extend( jQuery.event, {
8169
8681
 
8170
8682
  // Determine event propagation path in advance, per W3C events spec (#9951)
8171
8683
  // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8172
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
8684
+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8173
8685
 
8174
8686
  bubbleType = special.delegateType || type;
8175
8687
  if ( !rfocusMorph.test( bubbleType + type ) ) {
@@ -8189,13 +8701,15 @@ jQuery.extend( jQuery.event, {
8189
8701
  // Fire handlers on the event path
8190
8702
  i = 0;
8191
8703
  while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
8192
-
8704
+ lastElement = cur;
8193
8705
  event.type = i > 1 ?
8194
8706
  bubbleType :
8195
8707
  special.bindType || type;
8196
8708
 
8197
8709
  // jQuery handler
8198
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8710
+ handle = (
8711
+ dataPriv.get( cur, "events" ) || Object.create( null )
8712
+ )[ event.type ] &&
8199
8713
  dataPriv.get( cur, "handle" );
8200
8714
  if ( handle ) {
8201
8715
  handle.apply( cur, data );
@@ -8221,7 +8735,7 @@ jQuery.extend( jQuery.event, {
8221
8735
 
8222
8736
  // Call a native DOM method on the target with the same name as the event.
8223
8737
  // Don't do default actions on window, that's where global variables be (#6170)
8224
- if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
8738
+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8225
8739
 
8226
8740
  // Don't re-trigger an onFOO event when we call its FOO() method
8227
8741
  tmp = elem[ ontype ];
@@ -8232,7 +8746,17 @@ jQuery.extend( jQuery.event, {
8232
8746
 
8233
8747
  // Prevent re-triggering of the same event, since we already bubbled it above
8234
8748
  jQuery.event.triggered = type;
8749
+
8750
+ if ( event.isPropagationStopped() ) {
8751
+ lastElement.addEventListener( type, stopPropagationCallback );
8752
+ }
8753
+
8235
8754
  elem[ type ]();
8755
+
8756
+ if ( event.isPropagationStopped() ) {
8757
+ lastElement.removeEventListener( type, stopPropagationCallback );
8758
+ }
8759
+
8236
8760
  jQuery.event.triggered = undefined;
8237
8761
 
8238
8762
  if ( tmp ) {
@@ -8278,31 +8802,6 @@ jQuery.fn.extend( {
8278
8802
  } );
8279
8803
 
8280
8804
 
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
8805
  // Support: Firefox <=44
8307
8806
  // Firefox doesn't have focus(in | out) events
8308
8807
  // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
@@ -8321,7 +8820,10 @@ if ( !support.focusin ) {
8321
8820
 
8322
8821
  jQuery.event.special[ fix ] = {
8323
8822
  setup: function() {
8324
- var doc = this.ownerDocument || this,
8823
+
8824
+ // Handle: regular nodes (via `this.ownerDocument`), window
8825
+ // (via `this.document`) & document (via `this`).
8826
+ var doc = this.ownerDocument || this.document || this,
8325
8827
  attaches = dataPriv.access( doc, fix );
8326
8828
 
8327
8829
  if ( !attaches ) {
@@ -8330,7 +8832,7 @@ if ( !support.focusin ) {
8330
8832
  dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8331
8833
  },
8332
8834
  teardown: function() {
8333
- var doc = this.ownerDocument || this,
8835
+ var doc = this.ownerDocument || this.document || this,
8334
8836
  attaches = dataPriv.access( doc, fix ) - 1;
8335
8837
 
8336
8838
  if ( !attaches ) {
@@ -8346,7 +8848,7 @@ if ( !support.focusin ) {
8346
8848
  }
8347
8849
  var location = window.location;
8348
8850
 
8349
- var nonce = jQuery.now();
8851
+ var nonce = { guid: Date.now() };
8350
8852
 
8351
8853
  var rquery = ( /\?/ );
8352
8854
 
@@ -8404,7 +8906,7 @@ function buildParams( prefix, obj, traditional, add ) {
8404
8906
  }
8405
8907
  } );
8406
8908
 
8407
- } else if ( !traditional && jQuery.type( obj ) === "object" ) {
8909
+ } else if ( !traditional && toType( obj ) === "object" ) {
8408
8910
 
8409
8911
  // Serialize object item.
8410
8912
  for ( name in obj ) {
@@ -8426,7 +8928,7 @@ jQuery.param = function( a, traditional ) {
8426
8928
  add = function( key, valueOrFunction ) {
8427
8929
 
8428
8930
  // If value is a function, invoke it and use its return value
8429
- var value = jQuery.isFunction( valueOrFunction ) ?
8931
+ var value = isFunction( valueOrFunction ) ?
8430
8932
  valueOrFunction() :
8431
8933
  valueOrFunction;
8432
8934
 
@@ -8434,6 +8936,10 @@ jQuery.param = function( a, traditional ) {
8434
8936
  encodeURIComponent( value == null ? "" : value );
8435
8937
  };
8436
8938
 
8939
+ if ( a == null ) {
8940
+ return "";
8941
+ }
8942
+
8437
8943
  // If an array was passed in, assume that it is an array of form elements.
8438
8944
  if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8439
8945
 
@@ -8474,7 +8980,7 @@ jQuery.fn.extend( {
8474
8980
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8475
8981
  ( this.checked || !rcheckableType.test( type ) );
8476
8982
  } )
8477
- .map( function( i, elem ) {
8983
+ .map( function( _i, elem ) {
8478
8984
  var val = jQuery( this ).val();
8479
8985
 
8480
8986
  if ( val == null ) {
@@ -8544,7 +9050,7 @@ function addToPrefiltersOrTransports( structure ) {
8544
9050
  i = 0,
8545
9051
  dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
8546
9052
 
8547
- if ( jQuery.isFunction( func ) ) {
9053
+ if ( isFunction( func ) ) {
8548
9054
 
8549
9055
  // For each dataType in the dataTypeExpression
8550
9056
  while ( ( dataType = dataTypes[ i++ ] ) ) {
@@ -8936,12 +9442,14 @@ jQuery.extend( {
8936
9442
  if ( !responseHeaders ) {
8937
9443
  responseHeaders = {};
8938
9444
  while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
8939
- responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
9445
+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
9446
+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
9447
+ .concat( match[ 2 ] );
8940
9448
  }
8941
9449
  }
8942
- match = responseHeaders[ key.toLowerCase() ];
9450
+ match = responseHeaders[ key.toLowerCase() + " " ];
8943
9451
  }
8944
- return match == null ? null : match;
9452
+ return match == null ? null : match.join( ", " );
8945
9453
  },
8946
9454
 
8947
9455
  // Raw string
@@ -9016,7 +9524,7 @@ jQuery.extend( {
9016
9524
  if ( s.crossDomain == null ) {
9017
9525
  urlAnchor = document.createElement( "a" );
9018
9526
 
9019
- // Support: IE <=8 - 11, Edge 12 - 13
9527
+ // Support: IE <=8 - 11, Edge 12 - 15
9020
9528
  // IE throws exception on accessing the href property if url is malformed,
9021
9529
  // e.g. http://example.com:80x/
9022
9530
  try {
@@ -9074,8 +9582,8 @@ jQuery.extend( {
9074
9582
  // Remember the hash so we can put it back
9075
9583
  uncached = s.url.slice( cacheURL.length );
9076
9584
 
9077
- // If data is available, append data to url
9078
- if ( s.data ) {
9585
+ // If data is available and should be processed, append data to url
9586
+ if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9079
9587
  cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9080
9588
 
9081
9589
  // #9682: remove data so that it's not used in an eventual retry
@@ -9085,7 +9593,8 @@ jQuery.extend( {
9085
9593
  // Add or update anti-cache param if needed
9086
9594
  if ( s.cache === false ) {
9087
9595
  cacheURL = cacheURL.replace( rantiCache, "$1" );
9088
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9596
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9597
+ uncached;
9089
9598
  }
9090
9599
 
9091
9600
  // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9218,6 +9727,11 @@ jQuery.extend( {
9218
9727
  response = ajaxHandleResponses( s, jqXHR, responses );
9219
9728
  }
9220
9729
 
9730
+ // Use a noop converter for missing script
9731
+ if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
9732
+ s.converters[ "text script" ] = function() {};
9733
+ }
9734
+
9221
9735
  // Convert no matter what (that way responseXXX fields are always set)
9222
9736
  response = ajaxConvert( s, response, jqXHR, isSuccess );
9223
9737
 
@@ -9308,11 +9822,11 @@ jQuery.extend( {
9308
9822
  }
9309
9823
  } );
9310
9824
 
9311
- jQuery.each( [ "get", "post" ], function( i, method ) {
9825
+ jQuery.each( [ "get", "post" ], function( _i, method ) {
9312
9826
  jQuery[ method ] = function( url, data, callback, type ) {
9313
9827
 
9314
9828
  // Shift arguments if data argument was omitted
9315
- if ( jQuery.isFunction( data ) ) {
9829
+ if ( isFunction( data ) ) {
9316
9830
  type = type || callback;
9317
9831
  callback = data;
9318
9832
  data = undefined;
@@ -9329,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9329
9843
  };
9330
9844
  } );
9331
9845
 
9846
+ jQuery.ajaxPrefilter( function( s ) {
9847
+ var i;
9848
+ for ( i in s.headers ) {
9849
+ if ( i.toLowerCase() === "content-type" ) {
9850
+ s.contentType = s.headers[ i ] || "";
9851
+ }
9852
+ }
9853
+ } );
9854
+
9332
9855
 
9333
- jQuery._evalUrl = function( url ) {
9856
+ jQuery._evalUrl = function( url, options, doc ) {
9334
9857
  return jQuery.ajax( {
9335
9858
  url: url,
9336
9859
 
@@ -9340,7 +9863,16 @@ jQuery._evalUrl = function( url ) {
9340
9863
  cache: true,
9341
9864
  async: false,
9342
9865
  global: false,
9343
- "throws": true
9866
+
9867
+ // Only evaluate the response if it is successful (gh-4126)
9868
+ // dataFilter is not invoked for failure responses, so using it instead
9869
+ // of the default converter is kludgy but it works.
9870
+ converters: {
9871
+ "text script": function() {}
9872
+ },
9873
+ dataFilter: function( response ) {
9874
+ jQuery.globalEval( response, options, doc );
9875
+ }
9344
9876
  } );
9345
9877
  };
9346
9878
 
@@ -9350,7 +9882,7 @@ jQuery.fn.extend( {
9350
9882
  var wrap;
9351
9883
 
9352
9884
  if ( this[ 0 ] ) {
9353
- if ( jQuery.isFunction( html ) ) {
9885
+ if ( isFunction( html ) ) {
9354
9886
  html = html.call( this[ 0 ] );
9355
9887
  }
9356
9888
 
@@ -9376,7 +9908,7 @@ jQuery.fn.extend( {
9376
9908
  },
9377
9909
 
9378
9910
  wrapInner: function( html ) {
9379
- if ( jQuery.isFunction( html ) ) {
9911
+ if ( isFunction( html ) ) {
9380
9912
  return this.each( function( i ) {
9381
9913
  jQuery( this ).wrapInner( html.call( this, i ) );
9382
9914
  } );
@@ -9396,10 +9928,10 @@ jQuery.fn.extend( {
9396
9928
  },
9397
9929
 
9398
9930
  wrap: function( html ) {
9399
- var isFunction = jQuery.isFunction( html );
9931
+ var htmlIsFunction = isFunction( html );
9400
9932
 
9401
9933
  return this.each( function( i ) {
9402
- jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
9934
+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
9403
9935
  } );
9404
9936
  },
9405
9937
 
@@ -9491,7 +10023,8 @@ jQuery.ajaxTransport( function( options ) {
9491
10023
  return function() {
9492
10024
  if ( callback ) {
9493
10025
  callback = errorCallback = xhr.onload =
9494
- xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
10026
+ xhr.onerror = xhr.onabort = xhr.ontimeout =
10027
+ xhr.onreadystatechange = null;
9495
10028
 
9496
10029
  if ( type === "abort" ) {
9497
10030
  xhr.abort();
@@ -9531,7 +10064,7 @@ jQuery.ajaxTransport( function( options ) {
9531
10064
 
9532
10065
  // Listen to events
9533
10066
  xhr.onload = callback();
9534
- errorCallback = xhr.onerror = callback( "error" );
10067
+ errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
9535
10068
 
9536
10069
  // Support: IE 9 only
9537
10070
  // Use onreadystatechange to replace onabort
@@ -9622,24 +10155,21 @@ jQuery.ajaxPrefilter( "script", function( s ) {
9622
10155
  // Bind script tag hack transport
9623
10156
  jQuery.ajaxTransport( "script", function( s ) {
9624
10157
 
9625
- // This transport only deals with cross domain requests
9626
- if ( s.crossDomain ) {
10158
+ // This transport only deals with cross domain or forced-by-attrs requests
10159
+ if ( s.crossDomain || s.scriptAttrs ) {
9627
10160
  var script, callback;
9628
10161
  return {
9629
10162
  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 ) {
10163
+ script = jQuery( "<script>" )
10164
+ .attr( s.scriptAttrs || {} )
10165
+ .prop( { charset: s.scriptCharset, src: s.url } )
10166
+ .on( "load error", callback = function( evt ) {
9636
10167
  script.remove();
9637
10168
  callback = null;
9638
10169
  if ( evt ) {
9639
10170
  complete( evt.type === "error" ? 404 : 200, evt.type );
9640
10171
  }
9641
- }
9642
- );
10172
+ } );
9643
10173
 
9644
10174
  // Use native DOM manipulation to avoid our domManip AJAX trickery
9645
10175
  document.head.appendChild( script[ 0 ] );
@@ -9663,7 +10193,7 @@ var oldCallbacks = [],
9663
10193
  jQuery.ajaxSetup( {
9664
10194
  jsonp: "callback",
9665
10195
  jsonpCallback: function() {
9666
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10196
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
9667
10197
  this[ callback ] = true;
9668
10198
  return callback;
9669
10199
  }
@@ -9685,7 +10215,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9685
10215
  if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
9686
10216
 
9687
10217
  // Get callback name, remembering preexisting value associated with it
9688
- callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
10218
+ callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
9689
10219
  s.jsonpCallback() :
9690
10220
  s.jsonpCallback;
9691
10221
 
@@ -9736,7 +10266,7 @@ jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9736
10266
  }
9737
10267
 
9738
10268
  // Call if it was a function and we have a response
9739
- if ( responseContainer && jQuery.isFunction( overwritten ) ) {
10269
+ if ( responseContainer && isFunction( overwritten ) ) {
9740
10270
  overwritten( responseContainer[ 0 ] );
9741
10271
  }
9742
10272
 
@@ -9828,7 +10358,7 @@ jQuery.fn.load = function( url, params, callback ) {
9828
10358
  }
9829
10359
 
9830
10360
  // If it's a function
9831
- if ( jQuery.isFunction( params ) ) {
10361
+ if ( isFunction( params ) ) {
9832
10362
 
9833
10363
  // We assume that it's the callback
9834
10364
  callback = params;
@@ -9880,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
9880
10410
 
9881
10411
 
9882
10412
 
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
10413
  jQuery.expr.pseudos.animated = function( elem ) {
9901
10414
  return jQuery.grep( jQuery.timers, function( fn ) {
9902
10415
  return elem === fn.elem;
@@ -9936,7 +10449,7 @@ jQuery.offset = {
9936
10449
  curLeft = parseFloat( curCSSLeft ) || 0;
9937
10450
  }
9938
10451
 
9939
- if ( jQuery.isFunction( options ) ) {
10452
+ if ( isFunction( options ) ) {
9940
10453
 
9941
10454
  // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
9942
10455
  options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
@@ -9953,12 +10466,20 @@ jQuery.offset = {
9953
10466
  options.using.call( elem, props );
9954
10467
 
9955
10468
  } else {
10469
+ if ( typeof props.top === "number" ) {
10470
+ props.top += "px";
10471
+ }
10472
+ if ( typeof props.left === "number" ) {
10473
+ props.left += "px";
10474
+ }
9956
10475
  curElem.css( props );
9957
10476
  }
9958
10477
  }
9959
10478
  };
9960
10479
 
9961
10480
  jQuery.fn.extend( {
10481
+
10482
+ // offset() relates an element's border box to the document origin
9962
10483
  offset: function( options ) {
9963
10484
 
9964
10485
  // Preserve chaining for setter
@@ -9970,7 +10491,7 @@ jQuery.fn.extend( {
9970
10491
  } );
9971
10492
  }
9972
10493
 
9973
- var doc, docElem, rect, win,
10494
+ var rect, win,
9974
10495
  elem = this[ 0 ];
9975
10496
 
9976
10497
  if ( !elem ) {
@@ -9985,50 +10506,52 @@ jQuery.fn.extend( {
9985
10506
  return { top: 0, left: 0 };
9986
10507
  }
9987
10508
 
10509
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
9988
10510
  rect = elem.getBoundingClientRect();
9989
-
9990
- doc = elem.ownerDocument;
9991
- docElem = doc.documentElement;
9992
- win = doc.defaultView;
9993
-
10511
+ win = elem.ownerDocument.defaultView;
9994
10512
  return {
9995
- top: rect.top + win.pageYOffset - docElem.clientTop,
9996
- left: rect.left + win.pageXOffset - docElem.clientLeft
10513
+ top: rect.top + win.pageYOffset,
10514
+ left: rect.left + win.pageXOffset
9997
10515
  };
9998
10516
  },
9999
10517
 
10518
+ // position() relates an element's margin box to its offset parent's padding box
10519
+ // This corresponds to the behavior of CSS absolute positioning
10000
10520
  position: function() {
10001
10521
  if ( !this[ 0 ] ) {
10002
10522
  return;
10003
10523
  }
10004
10524
 
10005
- var offsetParent, offset,
10525
+ var offsetParent, offset, doc,
10006
10526
  elem = this[ 0 ],
10007
10527
  parentOffset = { top: 0, left: 0 };
10008
10528
 
10009
- // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
10010
- // because it is its only offset parent
10529
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
10011
10530
  if ( jQuery.css( elem, "position" ) === "fixed" ) {
10012
10531
 
10013
- // Assume getBoundingClientRect is there when computed position is fixed
10532
+ // Assume position:fixed implies availability of getBoundingClientRect
10014
10533
  offset = elem.getBoundingClientRect();
10015
10534
 
10016
10535
  } else {
10536
+ offset = this.offset();
10017
10537
 
10018
- // Get *real* offsetParent
10019
- offsetParent = this.offsetParent();
10538
+ // Account for the *real* offset parent, which can be the document or its root element
10539
+ // when a statically positioned element is identified
10540
+ doc = elem.ownerDocument;
10541
+ offsetParent = elem.offsetParent || doc.documentElement;
10542
+ while ( offsetParent &&
10543
+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
10544
+ jQuery.css( offsetParent, "position" ) === "static" ) {
10020
10545
 
10021
- // Get correct offsets
10022
- offset = this.offset();
10023
- if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
10024
- parentOffset = offsetParent.offset();
10546
+ offsetParent = offsetParent.parentNode;
10025
10547
  }
10548
+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
10026
10549
 
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
- };
10550
+ // Incorporate borders into its offset, since they are outside its content origin
10551
+ parentOffset = jQuery( offsetParent ).offset();
10552
+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
10553
+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
10554
+ }
10032
10555
  }
10033
10556
 
10034
10557
  // Subtract parent offsets and element margins
@@ -10070,7 +10593,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10070
10593
 
10071
10594
  // Coalesce documents and windows
10072
10595
  var win;
10073
- if ( jQuery.isWindow( elem ) ) {
10596
+ if ( isWindow( elem ) ) {
10074
10597
  win = elem;
10075
10598
  } else if ( elem.nodeType === 9 ) {
10076
10599
  win = elem.defaultView;
@@ -10099,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10099
10622
  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10100
10623
  // getComputedStyle returns percent when specified for top/left/bottom/right;
10101
10624
  // rather than make the css module depend on the offset module, just check for it here
10102
- jQuery.each( [ "top", "left" ], function( i, prop ) {
10625
+ jQuery.each( [ "top", "left" ], function( _i, prop ) {
10103
10626
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10104
10627
  function( elem, computed ) {
10105
10628
  if ( computed ) {
@@ -10128,7 +10651,7 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10128
10651
  return access( this, function( elem, type, value ) {
10129
10652
  var doc;
10130
10653
 
10131
- if ( jQuery.isWindow( elem ) ) {
10654
+ if ( isWindow( elem ) ) {
10132
10655
 
10133
10656
  // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
10134
10657
  return funcName.indexOf( "outer" ) === 0 ?
@@ -10162,6 +10685,22 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10162
10685
  } );
10163
10686
 
10164
10687
 
10688
+ jQuery.each( [
10689
+ "ajaxStart",
10690
+ "ajaxStop",
10691
+ "ajaxComplete",
10692
+ "ajaxError",
10693
+ "ajaxSuccess",
10694
+ "ajaxSend"
10695
+ ], function( _i, type ) {
10696
+ jQuery.fn[ type ] = function( fn ) {
10697
+ return this.on( type, fn );
10698
+ };
10699
+ } );
10700
+
10701
+
10702
+
10703
+
10165
10704
  jQuery.fn.extend( {
10166
10705
 
10167
10706
  bind: function( types, data, fn ) {
@@ -10180,9 +10719,64 @@ jQuery.fn.extend( {
10180
10719
  return arguments.length === 1 ?
10181
10720
  this.off( selector, "**" ) :
10182
10721
  this.off( types, selector || "**", fn );
10722
+ },
10723
+
10724
+ hover: function( fnOver, fnOut ) {
10725
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10183
10726
  }
10184
10727
  } );
10185
10728
 
10729
+ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10730
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10731
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10732
+ function( _i, name ) {
10733
+
10734
+ // Handle event binding
10735
+ jQuery.fn[ name ] = function( data, fn ) {
10736
+ return arguments.length > 0 ?
10737
+ this.on( name, null, data, fn ) :
10738
+ this.trigger( name );
10739
+ };
10740
+ } );
10741
+
10742
+
10743
+
10744
+
10745
+ // Support: Android <=4.0 only
10746
+ // Make sure we trim BOM and NBSP
10747
+ var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
10748
+
10749
+ // Bind a function to a context, optionally partially applying any
10750
+ // arguments.
10751
+ // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
10752
+ // However, it is not slated for removal any time soon
10753
+ jQuery.proxy = function( fn, context ) {
10754
+ var tmp, args, proxy;
10755
+
10756
+ if ( typeof context === "string" ) {
10757
+ tmp = fn[ context ];
10758
+ context = fn;
10759
+ fn = tmp;
10760
+ }
10761
+
10762
+ // Quick check to determine if target is callable, in the spec
10763
+ // this throws a TypeError, but we will just return undefined.
10764
+ if ( !isFunction( fn ) ) {
10765
+ return undefined;
10766
+ }
10767
+
10768
+ // Simulated bind
10769
+ args = slice.call( arguments, 2 );
10770
+ proxy = function() {
10771
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
10772
+ };
10773
+
10774
+ // Set the guid of unique handler to the same of original handler, so it can be removed
10775
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
10776
+
10777
+ return proxy;
10778
+ };
10779
+
10186
10780
  jQuery.holdReady = function( hold ) {
10187
10781
  if ( hold ) {
10188
10782
  jQuery.readyWait++;
@@ -10193,7 +10787,32 @@ jQuery.holdReady = function( hold ) {
10193
10787
  jQuery.isArray = Array.isArray;
10194
10788
  jQuery.parseJSON = JSON.parse;
10195
10789
  jQuery.nodeName = nodeName;
10790
+ jQuery.isFunction = isFunction;
10791
+ jQuery.isWindow = isWindow;
10792
+ jQuery.camelCase = camelCase;
10793
+ jQuery.type = toType;
10794
+
10795
+ jQuery.now = Date.now;
10796
+
10797
+ jQuery.isNumeric = function( obj ) {
10196
10798
 
10799
+ // As of jQuery 3.0, isNumeric is limited to
10800
+ // strings and numbers (primitives or objects)
10801
+ // that can be coerced to finite numbers (gh-2662)
10802
+ var type = jQuery.type( obj );
10803
+ return ( type === "number" || type === "string" ) &&
10804
+
10805
+ // parseFloat NaNs numeric-cast false positives ("")
10806
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
10807
+ // subtraction forces infinities to NaN
10808
+ !isNaN( obj - parseFloat( obj ) );
10809
+ };
10810
+
10811
+ jQuery.trim = function( text ) {
10812
+ return text == null ?
10813
+ "" :
10814
+ ( text + "" ).replace( rtrim, "" );
10815
+ };
10197
10816
 
10198
10817
 
10199
10818
 
@@ -10242,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
10242
10861
  // Expose jQuery and $ identifiers, even in AMD
10243
10862
  // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10244
10863
  // and CommonJS for browser emulators (#13566)
10245
- if ( !noGlobal ) {
10864
+ if ( typeof noGlobal === "undefined" ) {
10246
10865
  window.jQuery = window.$ = jQuery;
10247
10866
  }
10248
10867