jquery-rails 4.3.5 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,15 +1,12 @@
1
1
  /*!
2
- * jQuery JavaScript Library v3.4.1
2
+ * jQuery JavaScript Library v3.7.0
3
3
  * https://jquery.com/
4
4
  *
5
- * Includes Sizzle.js
6
- * https://sizzlejs.com/
7
- *
8
- * Copyright JS Foundation and other contributors
5
+ * Copyright OpenJS Foundation and other contributors
9
6
  * Released under the MIT license
10
7
  * https://jquery.org/license
11
8
  *
12
- * Date: 2019-05-01T21:04Z
9
+ * Date: 2023-05-11T18:29Z
13
10
  */
14
11
  ( function( global, factory ) {
15
12
 
@@ -23,7 +20,7 @@
23
20
  // (such as Node.js), expose a factory as module.exports.
24
21
  // This accentuates the need for the creation of a real `window`.
25
22
  // e.g. var jQuery = require("jquery")(window);
26
- // See ticket #14549 for more info.
23
+ // See ticket trac-14549 for more info.
27
24
  module.exports = global.document ?
28
25
  factory( global, true ) :
29
26
  function( w ) {
@@ -47,13 +44,16 @@
47
44
 
48
45
  var arr = [];
49
46
 
50
- var document = window.document;
51
-
52
47
  var getProto = Object.getPrototypeOf;
53
48
 
54
49
  var slice = arr.slice;
55
50
 
56
- var concat = arr.concat;
51
+ var flat = arr.flat ? function( array ) {
52
+ return arr.flat.call( array );
53
+ } : function( array ) {
54
+ return arr.concat.apply( [], array );
55
+ };
56
+
57
57
 
58
58
  var push = arr.push;
59
59
 
@@ -73,12 +73,16 @@ var support = {};
73
73
 
74
74
  var isFunction = function isFunction( obj ) {
75
75
 
76
- // Support: Chrome <=57, Firefox <=52
77
- // In some browsers, typeof returns "function" for HTML <object> elements
78
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
79
- // We don't want to classify *any* DOM node as a function.
80
- return typeof obj === "function" && typeof obj.nodeType !== "number";
81
- };
76
+ // Support: Chrome <=57, Firefox <=52
77
+ // In some browsers, typeof returns "function" for HTML <object> elements
78
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
79
+ // We don't want to classify *any* DOM node as a function.
80
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
81
+ // Plus for old WebKit, typeof returns "function" for HTML collections
82
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
83
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
84
+ typeof obj.item !== "function";
85
+ };
82
86
 
83
87
 
84
88
  var isWindow = function isWindow( obj ) {
@@ -86,6 +90,8 @@ var isWindow = function isWindow( obj ) {
86
90
  };
87
91
 
88
92
 
93
+ var document = window.document;
94
+
89
95
 
90
96
 
91
97
  var preservedScriptAttributes = {
@@ -141,8 +147,9 @@ function toType( obj ) {
141
147
 
142
148
 
143
149
 
144
- var
145
- version = "3.4.1",
150
+ var version = "3.7.0",
151
+
152
+ rhtmlSuffix = /HTML$/i,
146
153
 
147
154
  // Define a local copy of jQuery
148
155
  jQuery = function( selector, context ) {
@@ -150,11 +157,7 @@ var
150
157
  // The jQuery object is actually just the init constructor 'enhanced'
151
158
  // Need init if jQuery is called (just allow error to be thrown if not included)
152
159
  return new jQuery.fn.init( selector, context );
153
- },
154
-
155
- // Support: Android <=4.0 only
156
- // Make sure we trim BOM and NBSP
157
- rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
160
+ };
158
161
 
159
162
  jQuery.fn = jQuery.prototype = {
160
163
 
@@ -220,6 +223,18 @@ jQuery.fn = jQuery.prototype = {
220
223
  return this.eq( -1 );
221
224
  },
222
225
 
226
+ even: function() {
227
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
228
+ return ( i + 1 ) % 2;
229
+ } ) );
230
+ },
231
+
232
+ odd: function() {
233
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
234
+ return i % 2;
235
+ } ) );
236
+ },
237
+
223
238
  eq: function( i ) {
224
239
  var len = this.length,
225
240
  j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +368,10 @@ jQuery.extend( {
353
368
  return true;
354
369
  },
355
370
 
356
- // Evaluates a script in a global context
357
- globalEval: function( code, options ) {
358
- DOMEval( code, { nonce: options && options.nonce } );
371
+ // Evaluates a script in a provided context; falls back to the global one
372
+ // if not specified.
373
+ globalEval: function( code, options, doc ) {
374
+ DOMEval( code, { nonce: options && options.nonce }, doc );
359
375
  },
360
376
 
361
377
  each: function( obj, callback ) {
@@ -379,11 +395,31 @@ jQuery.extend( {
379
395
  return obj;
380
396
  },
381
397
 
382
- // Support: Android <=4.0 only
383
- trim: function( text ) {
384
- return text == null ?
385
- "" :
386
- ( text + "" ).replace( rtrim, "" );
398
+
399
+ // Retrieve the text value of an array of DOM nodes
400
+ text: function( elem ) {
401
+ var node,
402
+ ret = "",
403
+ i = 0,
404
+ nodeType = elem.nodeType;
405
+
406
+ if ( !nodeType ) {
407
+
408
+ // If no nodeType, this is expected to be an array
409
+ while ( ( node = elem[ i++ ] ) ) {
410
+
411
+ // Do not traverse comment nodes
412
+ ret += jQuery.text( node );
413
+ }
414
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
415
+ return elem.textContent;
416
+ } else if ( nodeType === 3 || nodeType === 4 ) {
417
+ return elem.nodeValue;
418
+ }
419
+
420
+ // Do not include comment or processing instruction nodes
421
+
422
+ return ret;
387
423
  },
388
424
 
389
425
  // results is for internal usage only
@@ -394,7 +430,7 @@ jQuery.extend( {
394
430
  if ( isArrayLike( Object( arr ) ) ) {
395
431
  jQuery.merge( ret,
396
432
  typeof arr === "string" ?
397
- [ arr ] : arr
433
+ [ arr ] : arr
398
434
  );
399
435
  } else {
400
436
  push.call( ret, arr );
@@ -408,6 +444,15 @@ jQuery.extend( {
408
444
  return arr == null ? -1 : indexOf.call( arr, elem, i );
409
445
  },
410
446
 
447
+ isXMLDoc: function( elem ) {
448
+ var namespace = elem && elem.namespaceURI,
449
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
450
+
451
+ // Assume HTML when documentElement doesn't yet exist, such as inside
452
+ // document fragments.
453
+ return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" );
454
+ },
455
+
411
456
  // Support: Android <=4.0 only, PhantomJS 1 only
412
457
  // push.apply(_, arraylike) throws on ancient WebKit
413
458
  merge: function( first, second ) {
@@ -472,7 +517,7 @@ jQuery.extend( {
472
517
  }
473
518
 
474
519
  // Flatten any nested arrays
475
- return concat.apply( [], ret );
520
+ return flat( ret );
476
521
  },
477
522
 
478
523
  // A global GUID counter for objects
@@ -489,9 +534,9 @@ if ( typeof Symbol === "function" ) {
489
534
 
490
535
  // Populate the class2type map
491
536
  jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
492
- function( i, name ) {
493
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
494
- } );
537
+ function( _i, name ) {
538
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
539
+ } );
495
540
 
496
541
  function isArrayLike( obj ) {
497
542
 
@@ -509,44 +554,98 @@ function isArrayLike( obj ) {
509
554
  return type === "array" || length === 0 ||
510
555
  typeof length === "number" && length > 0 && ( length - 1 ) in obj;
511
556
  }
512
- var Sizzle =
513
- /*!
514
- * Sizzle CSS Selector Engine v2.3.4
515
- * https://sizzlejs.com/
516
- *
517
- * Copyright JS Foundation and other contributors
518
- * Released under the MIT license
519
- * https://js.foundation/
520
- *
521
- * Date: 2019-04-08
522
- */
523
- (function( window ) {
557
+
558
+
559
+ function nodeName( elem, name ) {
560
+
561
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
562
+
563
+ }
564
+ var pop = arr.pop;
565
+
566
+
567
+ var sort = arr.sort;
568
+
569
+
570
+ var splice = arr.splice;
571
+
572
+
573
+ var whitespace = "[\\x20\\t\\r\\n\\f]";
574
+
575
+
576
+ var rtrimCSS = new RegExp(
577
+ "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$",
578
+ "g"
579
+ );
580
+
581
+
582
+
583
+
584
+ // Note: an element does not contain itself
585
+ jQuery.contains = function( a, b ) {
586
+ var bup = b && b.parentNode;
587
+
588
+ return a === bup || !!( bup && bup.nodeType === 1 && (
589
+
590
+ // Support: IE 9 - 11+
591
+ // IE doesn't have `contains` on SVG.
592
+ a.contains ?
593
+ a.contains( bup ) :
594
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
595
+ ) );
596
+ };
597
+
598
+
599
+
600
+
601
+ // CSS string/identifier serialization
602
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
603
+ var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
604
+
605
+ function fcssescape( ch, asCodePoint ) {
606
+ if ( asCodePoint ) {
607
+
608
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
609
+ if ( ch === "\0" ) {
610
+ return "\uFFFD";
611
+ }
612
+
613
+ // Control characters and (dependent upon position) numbers get escaped as code points
614
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
615
+ }
616
+
617
+ // Other potentially-special ASCII characters get backslash-escaped
618
+ return "\\" + ch;
619
+ }
620
+
621
+ jQuery.escapeSelector = function( sel ) {
622
+ return ( sel + "" ).replace( rcssescape, fcssescape );
623
+ };
624
+
625
+
626
+
627
+
628
+ var preferredDoc = document,
629
+ pushNative = push;
630
+
631
+ ( function() {
524
632
 
525
633
  var i,
526
- support,
527
634
  Expr,
528
- getText,
529
- isXML,
530
- tokenize,
531
- compile,
532
- select,
533
635
  outermostContext,
534
636
  sortInput,
535
637
  hasDuplicate,
638
+ push = pushNative,
536
639
 
537
640
  // Local document vars
538
- setDocument,
539
641
  document,
540
- docElem,
642
+ documentElement,
541
643
  documentIsHTML,
542
644
  rbuggyQSA,
543
- rbuggyMatches,
544
645
  matches,
545
- contains,
546
646
 
547
647
  // Instance-specific data
548
- expando = "sizzle" + 1 * new Date(),
549
- preferredDoc = window.document,
648
+ expando = jQuery.expando,
550
649
  dirruns = 0,
551
650
  done = 0,
552
651
  classCache = createCache(),
@@ -560,173 +659,145 @@ var i,
560
659
  return 0;
561
660
  },
562
661
 
563
- // Instance methods
564
- hasOwn = ({}).hasOwnProperty,
565
- arr = [],
566
- pop = arr.pop,
567
- push_native = arr.push,
568
- push = arr.push,
569
- slice = arr.slice,
570
- // Use a stripped-down indexOf as it's faster than native
571
- // https://jsperf.com/thor-indexof-vs-for/5
572
- indexOf = function( list, elem ) {
573
- var i = 0,
574
- len = list.length;
575
- for ( ; i < len; i++ ) {
576
- if ( list[i] === elem ) {
577
- return i;
578
- }
579
- }
580
- return -1;
581
- },
582
-
583
- booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
662
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" +
663
+ "loop|multiple|open|readonly|required|scoped",
584
664
 
585
665
  // Regular expressions
586
666
 
587
- // http://www.w3.org/TR/css3-selectors/#whitespace
588
- whitespace = "[\\x20\\t\\r\\n\\f]",
589
-
590
- // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
591
- identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
667
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
668
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
669
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
592
670
 
593
- // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
671
+ // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors
594
672
  attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
673
+
595
674
  // Operator (capture 2)
596
675
  "*([*^$|!~]?=)" + whitespace +
676
+
597
677
  // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
598
- "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
599
- "*\\]",
678
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
679
+ whitespace + "*\\]",
600
680
 
601
681
  pseudos = ":(" + identifier + ")(?:\\((" +
682
+
602
683
  // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
603
684
  // 1. quoted (capture 3; capture 4 or capture 5)
604
685
  "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
686
+
605
687
  // 2. simple (capture 6)
606
688
  "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
689
+
607
690
  // 3. anything else (capture 2)
608
691
  ".*" +
609
692
  ")\\)|)",
610
693
 
611
694
  // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
612
695
  rwhitespace = new RegExp( whitespace + "+", "g" ),
613
- rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
614
696
 
615
697
  rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
616
- rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
698
+ rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" +
699
+ whitespace + "*" ),
617
700
  rdescend = new RegExp( whitespace + "|>" ),
618
701
 
619
702
  rpseudo = new RegExp( pseudos ),
620
703
  ridentifier = new RegExp( "^" + identifier + "$" ),
621
704
 
622
705
  matchExpr = {
623
- "ID": new RegExp( "^#(" + identifier + ")" ),
624
- "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
625
- "TAG": new RegExp( "^(" + identifier + "|[*])" ),
626
- "ATTR": new RegExp( "^" + attributes ),
627
- "PSEUDO": new RegExp( "^" + pseudos ),
628
- "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
629
- "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
630
- "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
631
- "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
706
+ ID: new RegExp( "^#(" + identifier + ")" ),
707
+ CLASS: new RegExp( "^\\.(" + identifier + ")" ),
708
+ TAG: new RegExp( "^(" + identifier + "|[*])" ),
709
+ ATTR: new RegExp( "^" + attributes ),
710
+ PSEUDO: new RegExp( "^" + pseudos ),
711
+ CHILD: new RegExp(
712
+ "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
713
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
714
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
715
+ bool: new RegExp( "^(?:" + booleans + ")$", "i" ),
716
+
632
717
  // For use in libraries implementing .is()
633
718
  // We use this for POS matching in `select`
634
- "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
635
- whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
719
+ needsContext: new RegExp( "^" + whitespace +
720
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
721
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
636
722
  },
637
723
 
638
- rhtml = /HTML$/i,
639
724
  rinputs = /^(?:input|select|textarea|button)$/i,
640
725
  rheader = /^h\d$/i,
641
726
 
642
- rnative = /^[^{]+\{\s*\[native \w/,
643
-
644
727
  // Easily-parseable/retrievable ID or TAG or CLASS selectors
645
728
  rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
646
729
 
647
730
  rsibling = /[+~]/,
648
731
 
649
732
  // CSS escapes
650
- // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
651
- runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
652
- funescape = function( _, escaped, escapedWhitespace ) {
653
- var high = "0x" + escaped - 0x10000;
654
- // NaN means non-codepoint
655
- // Support: Firefox<24
656
- // Workaround erroneous numeric interpretation of +"0x"
657
- return high !== high || escapedWhitespace ?
658
- escaped :
659
- high < 0 ?
660
- // BMP codepoint
661
- String.fromCharCode( high + 0x10000 ) :
662
- // Supplemental Plane codepoint (surrogate pair)
663
- String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
664
- },
733
+ // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters
734
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace +
735
+ "?|\\\\([^\\r\\n\\f])", "g" ),
736
+ funescape = function( escape, nonHex ) {
737
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
665
738
 
666
- // CSS string/identifier serialization
667
- // https://drafts.csswg.org/cssom/#common-serializing-idioms
668
- rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
669
- fcssescape = function( ch, asCodePoint ) {
670
- if ( asCodePoint ) {
739
+ if ( nonHex ) {
671
740
 
672
- // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
673
- if ( ch === "\0" ) {
674
- return "\uFFFD";
675
- }
676
-
677
- // Control characters and (dependent upon position) numbers get escaped as code points
678
- return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
741
+ // Strip the backslash prefix from a non-hex escape sequence
742
+ return nonHex;
679
743
  }
680
744
 
681
- // Other potentially-special ASCII characters get backslash-escaped
682
- return "\\" + ch;
745
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
746
+ // Support: IE <=11+
747
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
748
+ // surrogate pair
749
+ return high < 0 ?
750
+ String.fromCharCode( high + 0x10000 ) :
751
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
683
752
  },
684
753
 
685
- // Used for iframes
686
- // See setDocument()
754
+ // Used for iframes; see `setDocument`.
755
+ // Support: IE 9 - 11+, Edge 12 - 18+
687
756
  // Removing the function wrapper causes a "Permission Denied"
688
- // error in IE
757
+ // error in IE/Edge.
689
758
  unloadHandler = function() {
690
759
  setDocument();
691
760
  },
692
761
 
693
762
  inDisabledFieldset = addCombinator(
694
763
  function( elem ) {
695
- return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
764
+ return elem.disabled === true && nodeName( elem, "fieldset" );
696
765
  },
697
766
  { dir: "parentNode", next: "legend" }
698
767
  );
699
768
 
769
+ // Support: IE <=9 only
770
+ // Accessing document.activeElement can throw unexpectedly
771
+ // https://bugs.jquery.com/ticket/13393
772
+ function safeActiveElement() {
773
+ try {
774
+ return document.activeElement;
775
+ } catch ( err ) { }
776
+ }
777
+
700
778
  // Optimize for push.apply( _, NodeList )
701
779
  try {
702
780
  push.apply(
703
- (arr = slice.call( preferredDoc.childNodes )),
781
+ ( arr = slice.call( preferredDoc.childNodes ) ),
704
782
  preferredDoc.childNodes
705
783
  );
706
- // Support: Android<4.0
784
+
785
+ // Support: Android <=4.0
707
786
  // Detect silently failing push.apply
787
+ // eslint-disable-next-line no-unused-expressions
708
788
  arr[ preferredDoc.childNodes.length ].nodeType;
709
789
  } catch ( e ) {
710
- push = { apply: arr.length ?
711
-
712
- // Leverage slice if possible
713
- function( target, els ) {
714
- push_native.apply( target, slice.call(els) );
715
- } :
716
-
717
- // Support: IE<9
718
- // Otherwise append directly
719
- function( target, els ) {
720
- var j = target.length,
721
- i = 0;
722
- // Can't trust NodeList.length
723
- while ( (target[j++] = els[i++]) ) {}
724
- target.length = j - 1;
790
+ push = {
791
+ apply: function( target, els ) {
792
+ pushNative.apply( target, slice.call( els ) );
793
+ },
794
+ call: function( target ) {
795
+ pushNative.apply( target, slice.call( arguments, 1 ) );
725
796
  }
726
797
  };
727
798
  }
728
799
 
729
- function Sizzle( selector, context, results, seed ) {
800
+ function find( selector, context, results, seed ) {
730
801
  var m, i, elem, nid, match, groups, newSelector,
731
802
  newContext = context && context.ownerDocument,
732
803
 
@@ -744,30 +815,26 @@ function Sizzle( selector, context, results, seed ) {
744
815
 
745
816
  // Try to shortcut find operations (as opposed to filters) in HTML documents
746
817
  if ( !seed ) {
747
-
748
- if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
749
- setDocument( context );
750
- }
818
+ setDocument( context );
751
819
  context = context || document;
752
820
 
753
821
  if ( documentIsHTML ) {
754
822
 
755
823
  // If the selector is sufficiently simple, try using a "get*By*" DOM method
756
824
  // (excepting DocumentFragment context, where the methods don't exist)
757
- if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
825
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
758
826
 
759
827
  // ID selector
760
- if ( (m = match[1]) ) {
828
+ if ( ( m = match[ 1 ] ) ) {
761
829
 
762
830
  // Document context
763
831
  if ( nodeType === 9 ) {
764
- if ( (elem = context.getElementById( m )) ) {
832
+ if ( ( elem = context.getElementById( m ) ) ) {
765
833
 
766
- // Support: IE, Opera, Webkit
767
- // TODO: identify versions
834
+ // Support: IE 9 only
768
835
  // getElementById can match elements by name instead of ID
769
836
  if ( elem.id === m ) {
770
- results.push( elem );
837
+ push.call( results, elem );
771
838
  return results;
772
839
  }
773
840
  } else {
@@ -777,40 +844,32 @@ function Sizzle( selector, context, results, seed ) {
777
844
  // Element context
778
845
  } else {
779
846
 
780
- // Support: IE, Opera, Webkit
781
- // TODO: identify versions
847
+ // Support: IE 9 only
782
848
  // getElementById can match elements by name instead of ID
783
- if ( newContext && (elem = newContext.getElementById( m )) &&
784
- contains( context, elem ) &&
849
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
850
+ find.contains( context, elem ) &&
785
851
  elem.id === m ) {
786
852
 
787
- results.push( elem );
853
+ push.call( results, elem );
788
854
  return results;
789
855
  }
790
856
  }
791
857
 
792
858
  // Type selector
793
- } else if ( match[2] ) {
859
+ } else if ( match[ 2 ] ) {
794
860
  push.apply( results, context.getElementsByTagName( selector ) );
795
861
  return results;
796
862
 
797
863
  // Class selector
798
- } else if ( (m = match[3]) && support.getElementsByClassName &&
799
- context.getElementsByClassName ) {
800
-
864
+ } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) {
801
865
  push.apply( results, context.getElementsByClassName( m ) );
802
866
  return results;
803
867
  }
804
868
  }
805
869
 
806
870
  // Take advantage of querySelectorAll
807
- if ( support.qsa &&
808
- !nonnativeSelectorCache[ selector + " " ] &&
809
- (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
810
-
811
- // Support: IE 8 only
812
- // Exclude object elements
813
- (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) {
871
+ if ( !nonnativeSelectorCache[ selector + " " ] &&
872
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) {
814
873
 
815
874
  newSelector = selector;
816
875
  newContext = context;
@@ -819,27 +878,40 @@ function Sizzle( selector, context, results, seed ) {
819
878
  // descendant combinators, which is not what we want.
820
879
  // In such cases, we work around the behavior by prefixing every selector in the
821
880
  // list with an ID selector referencing the scope context.
881
+ // The technique has to be used as well when a leading combinator is used
882
+ // as such selectors are not recognized by querySelectorAll.
822
883
  // Thanks to Andrew Dupont for this technique.
823
- if ( nodeType === 1 && rdescend.test( selector ) ) {
884
+ if ( nodeType === 1 &&
885
+ ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {
824
886
 
825
- // Capture the context ID, setting it first if necessary
826
- if ( (nid = context.getAttribute( "id" )) ) {
827
- nid = nid.replace( rcssescape, fcssescape );
828
- } else {
829
- context.setAttribute( "id", (nid = expando) );
887
+ // Expand context for sibling selectors
888
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
889
+ context;
890
+
891
+ // We can use :scope instead of the ID hack if the browser
892
+ // supports it & if we're not changing the context.
893
+ // Support: IE 11+, Edge 17 - 18+
894
+ // IE/Edge sometimes throw a "Permission denied" error when
895
+ // strict-comparing two documents; shallow comparisons work.
896
+ // eslint-disable-next-line eqeqeq
897
+ if ( newContext != context || !support.scope ) {
898
+
899
+ // Capture the context ID, setting it first if necessary
900
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
901
+ nid = jQuery.escapeSelector( nid );
902
+ } else {
903
+ context.setAttribute( "id", ( nid = expando ) );
904
+ }
830
905
  }
831
906
 
832
907
  // Prefix every selector in the list
833
908
  groups = tokenize( selector );
834
909
  i = groups.length;
835
910
  while ( i-- ) {
836
- groups[i] = "#" + nid + " " + toSelector( groups[i] );
911
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
912
+ toSelector( groups[ i ] );
837
913
  }
838
914
  newSelector = groups.join( "," );
839
-
840
- // Expand context for sibling selectors
841
- newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
842
- context;
843
915
  }
844
916
 
845
917
  try {
@@ -859,7 +931,7 @@ function Sizzle( selector, context, results, seed ) {
859
931
  }
860
932
 
861
933
  // All others
862
- return select( selector.replace( rtrim, "$1" ), context, results, seed );
934
+ return select( selector.replace( rtrimCSS, "$1" ), context, results, seed );
863
935
  }
864
936
 
865
937
  /**
@@ -872,18 +944,21 @@ function createCache() {
872
944
  var keys = [];
873
945
 
874
946
  function cache( key, value ) {
875
- // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
947
+
948
+ // Use (key + " ") to avoid collision with native prototype properties
949
+ // (see https://github.com/jquery/sizzle/issues/157)
876
950
  if ( keys.push( key + " " ) > Expr.cacheLength ) {
951
+
877
952
  // Only keep the most recent entries
878
953
  delete cache[ keys.shift() ];
879
954
  }
880
- return (cache[ key + " " ] = value);
955
+ return ( cache[ key + " " ] = value );
881
956
  }
882
957
  return cache;
883
958
  }
884
959
 
885
960
  /**
886
- * Mark a function for special use by Sizzle
961
+ * Mark a function for special use by jQuery selector module
887
962
  * @param {Function} fn The function to mark
888
963
  */
889
964
  function markFunction( fn ) {
@@ -896,72 +971,31 @@ function markFunction( fn ) {
896
971
  * @param {Function} fn Passed the created element and returns a boolean result
897
972
  */
898
973
  function assert( fn ) {
899
- var el = document.createElement("fieldset");
974
+ var el = document.createElement( "fieldset" );
900
975
 
901
976
  try {
902
977
  return !!fn( el );
903
- } catch (e) {
978
+ } catch ( e ) {
904
979
  return false;
905
980
  } finally {
981
+
906
982
  // Remove from its parent by default
907
983
  if ( el.parentNode ) {
908
984
  el.parentNode.removeChild( el );
909
985
  }
986
+
910
987
  // release memory in IE
911
988
  el = null;
912
989
  }
913
990
  }
914
991
 
915
- /**
916
- * Adds the same handler for all of the specified attrs
917
- * @param {String} attrs Pipe-separated list of attributes
918
- * @param {Function} handler The method that will be applied
919
- */
920
- function addHandle( attrs, handler ) {
921
- var arr = attrs.split("|"),
922
- i = arr.length;
923
-
924
- while ( i-- ) {
925
- Expr.attrHandle[ arr[i] ] = handler;
926
- }
927
- }
928
-
929
- /**
930
- * Checks document order of two siblings
931
- * @param {Element} a
932
- * @param {Element} b
933
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
934
- */
935
- function siblingCheck( a, b ) {
936
- var cur = b && a,
937
- diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
938
- a.sourceIndex - b.sourceIndex;
939
-
940
- // Use IE sourceIndex if available on both nodes
941
- if ( diff ) {
942
- return diff;
943
- }
944
-
945
- // Check if b follows a
946
- if ( cur ) {
947
- while ( (cur = cur.nextSibling) ) {
948
- if ( cur === b ) {
949
- return -1;
950
- }
951
- }
952
- }
953
-
954
- return a ? 1 : -1;
955
- }
956
-
957
992
  /**
958
993
  * Returns a function to use in pseudos for input types
959
994
  * @param {String} type
960
995
  */
961
996
  function createInputPseudo( type ) {
962
997
  return function( elem ) {
963
- var name = elem.nodeName.toLowerCase();
964
- return name === "input" && elem.type === type;
998
+ return nodeName( elem, "input" ) && elem.type === type;
965
999
  };
966
1000
  }
967
1001
 
@@ -971,8 +1005,8 @@ function createInputPseudo( type ) {
971
1005
  */
972
1006
  function createButtonPseudo( type ) {
973
1007
  return function( elem ) {
974
- var name = elem.nodeName.toLowerCase();
975
- return (name === "input" || name === "button") && elem.type === type;
1008
+ return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) &&
1009
+ elem.type === type;
976
1010
  };
977
1011
  }
978
1012
 
@@ -1008,12 +1042,11 @@ function createDisabledPseudo( disabled ) {
1008
1042
  }
1009
1043
  }
1010
1044
 
1011
- // Support: IE 6 - 11
1045
+ // Support: IE 6 - 11+
1012
1046
  // Use the isDisabled shortcut property to check for disabled fieldset ancestors
1013
1047
  return elem.isDisabled === disabled ||
1014
1048
 
1015
1049
  // Where there is no isDisabled, check manually
1016
- /* jshint -W018 */
1017
1050
  elem.isDisabled !== !disabled &&
1018
1051
  inDisabledFieldset( elem ) === disabled;
1019
1052
  }
@@ -1037,25 +1070,25 @@ function createDisabledPseudo( disabled ) {
1037
1070
  * @param {Function} fn
1038
1071
  */
1039
1072
  function createPositionalPseudo( fn ) {
1040
- return markFunction(function( argument ) {
1073
+ return markFunction( function( argument ) {
1041
1074
  argument = +argument;
1042
- return markFunction(function( seed, matches ) {
1075
+ return markFunction( function( seed, matches ) {
1043
1076
  var j,
1044
1077
  matchIndexes = fn( [], seed.length, argument ),
1045
1078
  i = matchIndexes.length;
1046
1079
 
1047
1080
  // Match elements found at the specified indexes
1048
1081
  while ( i-- ) {
1049
- if ( seed[ (j = matchIndexes[i]) ] ) {
1050
- seed[j] = !(matches[j] = seed[j]);
1082
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
1083
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
1051
1084
  }
1052
1085
  }
1053
- });
1054
- });
1086
+ } );
1087
+ } );
1055
1088
  }
1056
1089
 
1057
1090
  /**
1058
- * Checks a node for validity as a Sizzle context
1091
+ * Checks a node for validity as a jQuery selector context
1059
1092
  * @param {Element|Object=} context
1060
1093
  * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1061
1094
  */
@@ -1063,117 +1096,116 @@ function testContext( context ) {
1063
1096
  return context && typeof context.getElementsByTagName !== "undefined" && context;
1064
1097
  }
1065
1098
 
1066
- // Expose support vars for convenience
1067
- support = Sizzle.support = {};
1068
-
1069
- /**
1070
- * Detects XML nodes
1071
- * @param {Element|Object} elem An element or a document
1072
- * @returns {Boolean} True iff elem is a non-HTML XML node
1073
- */
1074
- isXML = Sizzle.isXML = function( elem ) {
1075
- var namespace = elem.namespaceURI,
1076
- docElem = (elem.ownerDocument || elem).documentElement;
1077
-
1078
- // Support: IE <=8
1079
- // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
1080
- // https://bugs.jquery.com/ticket/4833
1081
- return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
1082
- };
1083
-
1084
1099
  /**
1085
1100
  * Sets document-related variables once based on the current document
1086
- * @param {Element|Object} [doc] An element or document object to use to set the document
1101
+ * @param {Element|Object} [node] An element or document object to use to set the document
1087
1102
  * @returns {Object} Returns the current document
1088
1103
  */
1089
- setDocument = Sizzle.setDocument = function( node ) {
1090
- var hasCompare, subWindow,
1104
+ function setDocument( node ) {
1105
+ var subWindow,
1091
1106
  doc = node ? node.ownerDocument || node : preferredDoc;
1092
1107
 
1093
1108
  // Return early if doc is invalid or already selected
1094
- if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1109
+ // Support: IE 11+, Edge 17 - 18+
1110
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1111
+ // two documents; shallow comparisons work.
1112
+ // eslint-disable-next-line eqeqeq
1113
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
1095
1114
  return document;
1096
1115
  }
1097
1116
 
1098
1117
  // Update global variables
1099
1118
  document = doc;
1100
- docElem = document.documentElement;
1101
- documentIsHTML = !isXML( document );
1119
+ documentElement = document.documentElement;
1120
+ documentIsHTML = !jQuery.isXMLDoc( document );
1102
1121
 
1103
- // Support: IE 9-11, Edge
1104
- // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
1105
- if ( preferredDoc !== document &&
1106
- (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
1122
+ // Support: iOS 7 only, IE 9 - 11+
1123
+ // Older browsers didn't support unprefixed `matches`.
1124
+ matches = documentElement.matches ||
1125
+ documentElement.webkitMatchesSelector ||
1126
+ documentElement.msMatchesSelector;
1107
1127
 
1108
- // Support: IE 11, Edge
1109
- if ( subWindow.addEventListener ) {
1110
- subWindow.addEventListener( "unload", unloadHandler, false );
1128
+ // Support: IE 9 - 11+, Edge 12 - 18+
1129
+ // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936)
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 ( preferredDoc != document &&
1135
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
1111
1136
 
1112
- // Support: IE 9 - 10 only
1113
- } else if ( subWindow.attachEvent ) {
1114
- subWindow.attachEvent( "onunload", unloadHandler );
1115
- }
1137
+ // Support: IE 9 - 11+, Edge 12 - 18+
1138
+ subWindow.addEventListener( "unload", unloadHandler );
1116
1139
  }
1117
1140
 
1118
- /* Attributes
1119
- ---------------------------------------------------------------------- */
1120
-
1121
- // Support: IE<8
1122
- // Verify that getAttribute really returns attributes and not properties
1123
- // (excepting IE8 booleans)
1124
- support.attributes = assert(function( el ) {
1125
- el.className = "i";
1126
- return !el.getAttribute("className");
1127
- });
1128
-
1129
- /* getElement(s)By*
1130
- ---------------------------------------------------------------------- */
1131
-
1132
- // Check if getElementsByTagName("*") returns only elements
1133
- support.getElementsByTagName = assert(function( el ) {
1134
- el.appendChild( document.createComment("") );
1135
- return !el.getElementsByTagName("*").length;
1136
- });
1137
-
1138
- // Support: IE<9
1139
- support.getElementsByClassName = rnative.test( document.getElementsByClassName );
1140
-
1141
- // Support: IE<10
1141
+ // Support: IE <10
1142
1142
  // Check if getElementById returns elements by name
1143
1143
  // The broken getElementById methods don't pick up programmatically-set names,
1144
1144
  // so use a roundabout getElementsByName test
1145
- support.getById = assert(function( el ) {
1146
- docElem.appendChild( el ).id = expando;
1147
- return !document.getElementsByName || !document.getElementsByName( expando ).length;
1148
- });
1145
+ support.getById = assert( function( el ) {
1146
+ documentElement.appendChild( el ).id = jQuery.expando;
1147
+ return !document.getElementsByName ||
1148
+ !document.getElementsByName( jQuery.expando ).length;
1149
+ } );
1150
+
1151
+ // Support: IE 9 only
1152
+ // Check to see if it's possible to do matchesSelector
1153
+ // on a disconnected node.
1154
+ support.disconnectedMatch = assert( function( el ) {
1155
+ return matches.call( el, "*" );
1156
+ } );
1157
+
1158
+ // Support: IE 9 - 11+, Edge 12 - 18+
1159
+ // IE/Edge don't support the :scope pseudo-class.
1160
+ support.scope = assert( function() {
1161
+ return document.querySelectorAll( ":scope" );
1162
+ } );
1163
+
1164
+ // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only
1165
+ // Make sure the `:has()` argument is parsed unforgivingly.
1166
+ // We include `*` in the test to detect buggy implementations that are
1167
+ // _selectively_ forgiving (specifically when the list includes at least
1168
+ // one valid selector).
1169
+ // Note that we treat complete lack of support for `:has()` as if it were
1170
+ // spec-compliant support, which is fine because use of `:has()` in such
1171
+ // environments will fail in the qSA path and fall back to jQuery traversal
1172
+ // anyway.
1173
+ support.cssHas = assert( function() {
1174
+ try {
1175
+ document.querySelector( ":has(*,:jqfake)" );
1176
+ return false;
1177
+ } catch ( e ) {
1178
+ return true;
1179
+ }
1180
+ } );
1149
1181
 
1150
1182
  // ID filter and find
1151
1183
  if ( support.getById ) {
1152
- Expr.filter["ID"] = function( id ) {
1184
+ Expr.filter.ID = function( id ) {
1153
1185
  var attrId = id.replace( runescape, funescape );
1154
1186
  return function( elem ) {
1155
- return elem.getAttribute("id") === attrId;
1187
+ return elem.getAttribute( "id" ) === attrId;
1156
1188
  };
1157
1189
  };
1158
- Expr.find["ID"] = function( id, context ) {
1190
+ Expr.find.ID = function( id, context ) {
1159
1191
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1160
1192
  var elem = context.getElementById( id );
1161
1193
  return elem ? [ elem ] : [];
1162
1194
  }
1163
1195
  };
1164
1196
  } else {
1165
- Expr.filter["ID"] = function( id ) {
1197
+ Expr.filter.ID = function( id ) {
1166
1198
  var attrId = id.replace( runescape, funescape );
1167
1199
  return function( elem ) {
1168
1200
  var node = typeof elem.getAttributeNode !== "undefined" &&
1169
- elem.getAttributeNode("id");
1201
+ elem.getAttributeNode( "id" );
1170
1202
  return node && node.value === attrId;
1171
1203
  };
1172
1204
  };
1173
1205
 
1174
1206
  // Support: IE 6 - 7 only
1175
1207
  // getElementById is not reliable as a find shortcut
1176
- Expr.find["ID"] = function( id, context ) {
1208
+ Expr.find.ID = function( id, context ) {
1177
1209
  if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
1178
1210
  var node, i, elems,
1179
1211
  elem = context.getElementById( id );
@@ -1181,7 +1213,7 @@ setDocument = Sizzle.setDocument = function( node ) {
1181
1213
  if ( elem ) {
1182
1214
 
1183
1215
  // Verify the id attribute
1184
- node = elem.getAttributeNode("id");
1216
+ node = elem.getAttributeNode( "id" );
1185
1217
  if ( node && node.value === id ) {
1186
1218
  return [ elem ];
1187
1219
  }
@@ -1189,8 +1221,8 @@ setDocument = Sizzle.setDocument = function( node ) {
1189
1221
  // Fall back on getElementsByName
1190
1222
  elems = context.getElementsByName( id );
1191
1223
  i = 0;
1192
- while ( (elem = elems[i++]) ) {
1193
- node = elem.getAttributeNode("id");
1224
+ while ( ( elem = elems[ i++ ] ) ) {
1225
+ node = elem.getAttributeNode( "id" );
1194
1226
  if ( node && node.value === id ) {
1195
1227
  return [ elem ];
1196
1228
  }
@@ -1203,39 +1235,18 @@ setDocument = Sizzle.setDocument = function( node ) {
1203
1235
  }
1204
1236
 
1205
1237
  // Tag
1206
- Expr.find["TAG"] = support.getElementsByTagName ?
1207
- function( tag, context ) {
1208
- if ( typeof context.getElementsByTagName !== "undefined" ) {
1209
- return context.getElementsByTagName( tag );
1210
-
1211
- // DocumentFragment nodes don't have gEBTN
1212
- } else if ( support.qsa ) {
1213
- return context.querySelectorAll( tag );
1214
- }
1215
- } :
1238
+ Expr.find.TAG = function( tag, context ) {
1239
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
1240
+ return context.getElementsByTagName( tag );
1216
1241
 
1217
- function( tag, context ) {
1218
- var elem,
1219
- tmp = [],
1220
- i = 0,
1221
- // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
1222
- results = context.getElementsByTagName( tag );
1223
-
1224
- // Filter out possible comments
1225
- if ( tag === "*" ) {
1226
- while ( (elem = results[i++]) ) {
1227
- if ( elem.nodeType === 1 ) {
1228
- tmp.push( elem );
1229
- }
1230
- }
1231
-
1232
- return tmp;
1233
- }
1234
- return results;
1235
- };
1242
+ // DocumentFragment nodes don't have gEBTN
1243
+ } else {
1244
+ return context.querySelectorAll( tag );
1245
+ }
1246
+ };
1236
1247
 
1237
1248
  // Class
1238
- Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1249
+ Expr.find.CLASS = function( className, context ) {
1239
1250
  if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
1240
1251
  return context.getElementsByClassName( className );
1241
1252
  }
@@ -1246,153 +1257,94 @@ setDocument = Sizzle.setDocument = function( node ) {
1246
1257
 
1247
1258
  // QSA and matchesSelector support
1248
1259
 
1249
- // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1250
- rbuggyMatches = [];
1251
-
1252
- // qSa(:focus) reports false when true (Chrome 21)
1253
- // We allow this because of a bug in IE8/9 that throws an error
1254
- // whenever `document.activeElement` is accessed on an iframe
1255
- // So, we allow :focus to pass through QSA all the time to avoid the IE error
1256
- // See https://bugs.jquery.com/ticket/13378
1257
1260
  rbuggyQSA = [];
1258
1261
 
1259
- if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
1260
- // Build QSA regex
1261
- // Regex strategy adopted from Diego Perini
1262
- assert(function( el ) {
1263
- // Select is set to empty string on purpose
1264
- // This is to test IE's treatment of not explicitly
1265
- // setting a boolean content attribute,
1266
- // since its presence should be enough
1267
- // https://bugs.jquery.com/ticket/12359
1268
- docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
1269
- "<select id='" + expando + "-\r\\' msallowcapture=''>" +
1270
- "<option selected=''></option></select>";
1271
-
1272
- // Support: IE8, Opera 11-12.16
1273
- // Nothing should be selected when empty strings follow ^= or $= or *=
1274
- // The test attribute must be unknown in Opera but "safe" for WinRT
1275
- // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1276
- if ( el.querySelectorAll("[msallowcapture^='']").length ) {
1277
- rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1278
- }
1279
-
1280
- // Support: IE8
1281
- // Boolean attributes and "value" are not treated correctly
1282
- if ( !el.querySelectorAll("[selected]").length ) {
1283
- rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1284
- }
1285
-
1286
- // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
1287
- if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1288
- rbuggyQSA.push("~=");
1289
- }
1290
-
1291
- // Webkit/Opera - :checked should return selected option elements
1292
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1293
- // IE8 throws error here and will not see later tests
1294
- if ( !el.querySelectorAll(":checked").length ) {
1295
- rbuggyQSA.push(":checked");
1296
- }
1297
-
1298
- // Support: Safari 8+, iOS 8+
1299
- // https://bugs.webkit.org/show_bug.cgi?id=136851
1300
- // In-page `selector#id sibling-combinator selector` fails
1301
- if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1302
- rbuggyQSA.push(".#.+[+~]");
1303
- }
1304
- });
1262
+ // Build QSA regex
1263
+ // Regex strategy adopted from Diego Perini
1264
+ assert( function( el ) {
1305
1265
 
1306
- assert(function( el ) {
1307
- el.innerHTML = "<a href='' disabled='disabled'></a>" +
1308
- "<select disabled='disabled'><option/></select>";
1266
+ var input;
1309
1267
 
1310
- // Support: Windows 8 Native Apps
1311
- // The type and name attributes are restricted during .innerHTML assignment
1312
- var input = document.createElement("input");
1313
- input.setAttribute( "type", "hidden" );
1314
- el.appendChild( input ).setAttribute( "name", "D" );
1268
+ documentElement.appendChild( el ).innerHTML =
1269
+ "<a id='" + expando + "' href='' disabled='disabled'></a>" +
1270
+ "<select id='" + expando + "-\r\\' disabled='disabled'>" +
1271
+ "<option selected=''></option></select>";
1315
1272
 
1316
- // Support: IE8
1317
- // Enforce case-sensitivity of name attribute
1318
- if ( el.querySelectorAll("[name=d]").length ) {
1319
- rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1320
- }
1273
+ // Support: iOS <=7 - 8 only
1274
+ // Boolean attributes and "value" are not treated correctly in some XML documents
1275
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
1276
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1277
+ }
1321
1278
 
1322
- // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1323
- // IE8 throws error here and will not see later tests
1324
- if ( el.querySelectorAll(":enabled").length !== 2 ) {
1325
- rbuggyQSA.push( ":enabled", ":disabled" );
1326
- }
1279
+ // Support: iOS <=7 - 8 only
1280
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
1281
+ rbuggyQSA.push( "~=" );
1282
+ }
1327
1283
 
1328
- // Support: IE9-11+
1329
- // IE's :disabled selector does not pick up the children of disabled fieldsets
1330
- docElem.appendChild( el ).disabled = true;
1331
- if ( el.querySelectorAll(":disabled").length !== 2 ) {
1332
- rbuggyQSA.push( ":enabled", ":disabled" );
1333
- }
1284
+ // Support: iOS 8 only
1285
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
1286
+ // In-page `selector#id sibling-combinator selector` fails
1287
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
1288
+ rbuggyQSA.push( ".#.+[+~]" );
1289
+ }
1334
1290
 
1335
- // Opera 10-11 does not throw on post-comma invalid pseudos
1336
- el.querySelectorAll("*,:x");
1337
- rbuggyQSA.push(",.*:");
1338
- });
1339
- }
1291
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1292
+ // In some of the document kinds, these selectors wouldn't work natively.
1293
+ // This is probably OK but for backwards compatibility we want to maintain
1294
+ // handling them through jQuery traversal in jQuery 3.x.
1295
+ if ( !el.querySelectorAll( ":checked" ).length ) {
1296
+ rbuggyQSA.push( ":checked" );
1297
+ }
1340
1298
 
1341
- if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1342
- docElem.webkitMatchesSelector ||
1343
- docElem.mozMatchesSelector ||
1344
- docElem.oMatchesSelector ||
1345
- docElem.msMatchesSelector) )) ) {
1299
+ // Support: Windows 8 Native Apps
1300
+ // The type and name attributes are restricted during .innerHTML assignment
1301
+ input = document.createElement( "input" );
1302
+ input.setAttribute( "type", "hidden" );
1303
+ el.appendChild( input ).setAttribute( "name", "D" );
1304
+
1305
+ // Support: IE 9 - 11+
1306
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
1307
+ // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+
1308
+ // In some of the document kinds, these selectors wouldn't work natively.
1309
+ // This is probably OK but for backwards compatibility we want to maintain
1310
+ // handling them through jQuery traversal in jQuery 3.x.
1311
+ documentElement.appendChild( el ).disabled = true;
1312
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
1313
+ rbuggyQSA.push( ":enabled", ":disabled" );
1314
+ }
1315
+
1316
+ // Support: IE 11+, Edge 15 - 18+
1317
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
1318
+ // Adding a temporary attribute to the document before the selection works
1319
+ // around the issue.
1320
+ // Interestingly, IE 10 & older don't seem to have the issue.
1321
+ input = document.createElement( "input" );
1322
+ input.setAttribute( "name", "" );
1323
+ el.appendChild( input );
1324
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
1325
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
1326
+ whitespace + "*(?:''|\"\")" );
1327
+ }
1328
+ } );
1346
1329
 
1347
- assert(function( el ) {
1348
- // Check to see if it's possible to do matchesSelector
1349
- // on a disconnected node (IE 9)
1350
- support.disconnectedMatch = matches.call( el, "*" );
1330
+ if ( !support.cssHas ) {
1351
1331
 
1352
- // This should fail with an exception
1353
- // Gecko does not error, returns false instead
1354
- matches.call( el, "[s!='']:x" );
1355
- rbuggyMatches.push( "!=", pseudos );
1356
- });
1332
+ // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+
1333
+ // Our regular `try-catch` mechanism fails to detect natively-unsupported
1334
+ // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`)
1335
+ // in browsers that parse the `:has()` argument as a forgiving selector list.
1336
+ // https://drafts.csswg.org/selectors/#relational now requires the argument
1337
+ // to be parsed unforgivingly, but browsers have not yet fully adjusted.
1338
+ rbuggyQSA.push( ":has" );
1357
1339
  }
1358
1340
 
1359
- rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1360
- rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1361
-
1362
- /* Contains
1363
- ---------------------------------------------------------------------- */
1364
- hasCompare = rnative.test( docElem.compareDocumentPosition );
1365
-
1366
- // Element contains another
1367
- // Purposefully self-exclusive
1368
- // As in, an element does not contain itself
1369
- contains = hasCompare || rnative.test( docElem.contains ) ?
1370
- function( a, b ) {
1371
- var adown = a.nodeType === 9 ? a.documentElement : a,
1372
- bup = b && b.parentNode;
1373
- return a === bup || !!( bup && bup.nodeType === 1 && (
1374
- adown.contains ?
1375
- adown.contains( bup ) :
1376
- a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1377
- ));
1378
- } :
1379
- function( a, b ) {
1380
- if ( b ) {
1381
- while ( (b = b.parentNode) ) {
1382
- if ( b === a ) {
1383
- return true;
1384
- }
1385
- }
1386
- }
1387
- return false;
1388
- };
1341
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
1389
1342
 
1390
1343
  /* Sorting
1391
1344
  ---------------------------------------------------------------------- */
1392
1345
 
1393
1346
  // Document order sorting
1394
- sortOrder = hasCompare ?
1395
- function( a, b ) {
1347
+ sortOrder = function( a, b ) {
1396
1348
 
1397
1349
  // Flag for duplicate removal
1398
1350
  if ( a === b ) {
@@ -1407,7 +1359,11 @@ setDocument = Sizzle.setDocument = function( node ) {
1407
1359
  }
1408
1360
 
1409
1361
  // Calculate position if both inputs belong to the same document
1410
- compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1362
+ // Support: IE 11+, Edge 17 - 18+
1363
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1364
+ // two documents; shallow comparisons work.
1365
+ // eslint-disable-next-line eqeqeq
1366
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
1411
1367
  a.compareDocumentPosition( b ) :
1412
1368
 
1413
1369
  // Otherwise we know they are disconnected
@@ -1415,148 +1371,109 @@ setDocument = Sizzle.setDocument = function( node ) {
1415
1371
 
1416
1372
  // Disconnected nodes
1417
1373
  if ( compare & 1 ||
1418
- (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1374
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
1419
1375
 
1420
1376
  // Choose the first element that is related to our preferred document
1421
- if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1377
+ // Support: IE 11+, Edge 17 - 18+
1378
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1379
+ // two documents; shallow comparisons work.
1380
+ // eslint-disable-next-line eqeqeq
1381
+ if ( a === document || a.ownerDocument == preferredDoc &&
1382
+ find.contains( preferredDoc, a ) ) {
1422
1383
  return -1;
1423
1384
  }
1424
- if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1385
+
1386
+ // Support: IE 11+, Edge 17 - 18+
1387
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1388
+ // two documents; shallow comparisons work.
1389
+ // eslint-disable-next-line eqeqeq
1390
+ if ( b === document || b.ownerDocument == preferredDoc &&
1391
+ find.contains( preferredDoc, b ) ) {
1425
1392
  return 1;
1426
1393
  }
1427
1394
 
1428
1395
  // Maintain original order
1429
1396
  return sortInput ?
1430
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1397
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1431
1398
  0;
1432
1399
  }
1433
1400
 
1434
1401
  return compare & 4 ? -1 : 1;
1435
- } :
1436
- function( a, b ) {
1437
- // Exit early if the nodes are identical
1438
- if ( a === b ) {
1439
- hasDuplicate = true;
1440
- return 0;
1441
- }
1442
-
1443
- var cur,
1444
- i = 0,
1445
- aup = a.parentNode,
1446
- bup = b.parentNode,
1447
- ap = [ a ],
1448
- bp = [ b ];
1449
-
1450
- // Parentless nodes are either documents or disconnected
1451
- if ( !aup || !bup ) {
1452
- return a === document ? -1 :
1453
- b === document ? 1 :
1454
- aup ? -1 :
1455
- bup ? 1 :
1456
- sortInput ?
1457
- ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
1458
- 0;
1459
-
1460
- // If the nodes are siblings, we can do a quick check
1461
- } else if ( aup === bup ) {
1462
- return siblingCheck( a, b );
1463
- }
1464
-
1465
- // Otherwise we need full lists of their ancestors for comparison
1466
- cur = a;
1467
- while ( (cur = cur.parentNode) ) {
1468
- ap.unshift( cur );
1469
- }
1470
- cur = b;
1471
- while ( (cur = cur.parentNode) ) {
1472
- bp.unshift( cur );
1473
- }
1474
-
1475
- // Walk down the tree looking for a discrepancy
1476
- while ( ap[i] === bp[i] ) {
1477
- i++;
1478
- }
1479
-
1480
- return i ?
1481
- // Do a sibling check if the nodes have a common ancestor
1482
- siblingCheck( ap[i], bp[i] ) :
1483
-
1484
- // Otherwise nodes in our document sort first
1485
- ap[i] === preferredDoc ? -1 :
1486
- bp[i] === preferredDoc ? 1 :
1487
- 0;
1488
1402
  };
1489
1403
 
1490
1404
  return document;
1491
- };
1405
+ }
1492
1406
 
1493
- Sizzle.matches = function( expr, elements ) {
1494
- return Sizzle( expr, null, null, elements );
1407
+ find.matches = function( expr, elements ) {
1408
+ return find( expr, null, null, elements );
1495
1409
  };
1496
1410
 
1497
- Sizzle.matchesSelector = function( elem, expr ) {
1498
- // Set document vars if needed
1499
- if ( ( elem.ownerDocument || elem ) !== document ) {
1500
- setDocument( elem );
1501
- }
1411
+ find.matchesSelector = function( elem, expr ) {
1412
+ setDocument( elem );
1502
1413
 
1503
- if ( support.matchesSelector && documentIsHTML &&
1414
+ if ( documentIsHTML &&
1504
1415
  !nonnativeSelectorCache[ expr + " " ] &&
1505
- ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1506
- ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1416
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
1507
1417
 
1508
1418
  try {
1509
1419
  var ret = matches.call( elem, expr );
1510
1420
 
1511
1421
  // IE 9's matchesSelector returns false on disconnected nodes
1512
1422
  if ( ret || support.disconnectedMatch ||
1423
+
1513
1424
  // As well, disconnected nodes are said to be in a document
1514
1425
  // fragment in IE 9
1515
1426
  elem.document && elem.document.nodeType !== 11 ) {
1516
1427
  return ret;
1517
1428
  }
1518
- } catch (e) {
1429
+ } catch ( e ) {
1519
1430
  nonnativeSelectorCache( expr, true );
1520
1431
  }
1521
1432
  }
1522
1433
 
1523
- return Sizzle( expr, document, null, [ elem ] ).length > 0;
1434
+ return find( expr, document, null, [ elem ] ).length > 0;
1524
1435
  };
1525
1436
 
1526
- Sizzle.contains = function( context, elem ) {
1437
+ find.contains = function( context, elem ) {
1438
+
1527
1439
  // Set document vars if needed
1528
- if ( ( context.ownerDocument || context ) !== document ) {
1440
+ // Support: IE 11+, Edge 17 - 18+
1441
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1442
+ // two documents; shallow comparisons work.
1443
+ // eslint-disable-next-line eqeqeq
1444
+ if ( ( context.ownerDocument || context ) != document ) {
1529
1445
  setDocument( context );
1530
1446
  }
1531
- return contains( context, elem );
1447
+ return jQuery.contains( context, elem );
1532
1448
  };
1533
1449
 
1534
- Sizzle.attr = function( elem, name ) {
1450
+
1451
+ find.attr = function( elem, name ) {
1452
+
1535
1453
  // Set document vars if needed
1536
- if ( ( elem.ownerDocument || elem ) !== document ) {
1454
+ // Support: IE 11+, Edge 17 - 18+
1455
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
1456
+ // two documents; shallow comparisons work.
1457
+ // eslint-disable-next-line eqeqeq
1458
+ if ( ( elem.ownerDocument || elem ) != document ) {
1537
1459
  setDocument( elem );
1538
1460
  }
1539
1461
 
1540
1462
  var fn = Expr.attrHandle[ name.toLowerCase() ],
1541
- // Don't get fooled by Object.prototype properties (jQuery #13807)
1463
+
1464
+ // Don't get fooled by Object.prototype properties (see trac-13807)
1542
1465
  val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1543
1466
  fn( elem, name, !documentIsHTML ) :
1544
1467
  undefined;
1545
1468
 
1546
- return val !== undefined ?
1547
- val :
1548
- support.attributes || !documentIsHTML ?
1549
- elem.getAttribute( name ) :
1550
- (val = elem.getAttributeNode(name)) && val.specified ?
1551
- val.value :
1552
- null;
1553
- };
1469
+ if ( val !== undefined ) {
1470
+ return val;
1471
+ }
1554
1472
 
1555
- Sizzle.escape = function( sel ) {
1556
- return (sel + "").replace( rcssescape, fcssescape );
1473
+ return elem.getAttribute( name );
1557
1474
  };
1558
1475
 
1559
- Sizzle.error = function( msg ) {
1476
+ find.error = function( msg ) {
1560
1477
  throw new Error( "Syntax error, unrecognized expression: " + msg );
1561
1478
  };
1562
1479
 
@@ -1564,25 +1481,29 @@ Sizzle.error = function( msg ) {
1564
1481
  * Document sorting and removing duplicates
1565
1482
  * @param {ArrayLike} results
1566
1483
  */
1567
- Sizzle.uniqueSort = function( results ) {
1484
+ jQuery.uniqueSort = function( results ) {
1568
1485
  var elem,
1569
1486
  duplicates = [],
1570
1487
  j = 0,
1571
1488
  i = 0;
1572
1489
 
1573
1490
  // Unless we *know* we can detect duplicates, assume their presence
1574
- hasDuplicate = !support.detectDuplicates;
1575
- sortInput = !support.sortStable && results.slice( 0 );
1576
- results.sort( sortOrder );
1491
+ //
1492
+ // Support: Android <=4.0+
1493
+ // Testing for detecting duplicates is unpredictable so instead assume we can't
1494
+ // depend on duplicate detection in all browsers without a stable sort.
1495
+ hasDuplicate = !support.sortStable;
1496
+ sortInput = !support.sortStable && slice.call( results, 0 );
1497
+ sort.call( results, sortOrder );
1577
1498
 
1578
1499
  if ( hasDuplicate ) {
1579
- while ( (elem = results[i++]) ) {
1500
+ while ( ( elem = results[ i++ ] ) ) {
1580
1501
  if ( elem === results[ i ] ) {
1581
1502
  j = duplicates.push( i );
1582
1503
  }
1583
1504
  }
1584
1505
  while ( j-- ) {
1585
- results.splice( duplicates[ j ], 1 );
1506
+ splice.call( results, duplicates[ j ], 1 );
1586
1507
  }
1587
1508
  }
1588
1509
 
@@ -1593,42 +1514,11 @@ Sizzle.uniqueSort = function( results ) {
1593
1514
  return results;
1594
1515
  };
1595
1516
 
1596
- /**
1597
- * Utility function for retrieving the text value of an array of DOM nodes
1598
- * @param {Array|Element} elem
1599
- */
1600
- getText = Sizzle.getText = function( elem ) {
1601
- var node,
1602
- ret = "",
1603
- i = 0,
1604
- nodeType = elem.nodeType;
1605
-
1606
- if ( !nodeType ) {
1607
- // If no nodeType, this is expected to be an array
1608
- while ( (node = elem[i++]) ) {
1609
- // Do not traverse comment nodes
1610
- ret += getText( node );
1611
- }
1612
- } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1613
- // Use textContent for elements
1614
- // innerText usage removed for consistency of new lines (jQuery #11153)
1615
- if ( typeof elem.textContent === "string" ) {
1616
- return elem.textContent;
1617
- } else {
1618
- // Traverse its children
1619
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1620
- ret += getText( elem );
1621
- }
1622
- }
1623
- } else if ( nodeType === 3 || nodeType === 4 ) {
1624
- return elem.nodeValue;
1625
- }
1626
- // Do not include comment or processing instruction nodes
1627
-
1628
- return ret;
1517
+ jQuery.fn.uniqueSort = function() {
1518
+ return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
1629
1519
  };
1630
1520
 
1631
- Expr = Sizzle.selectors = {
1521
+ Expr = jQuery.expr = {
1632
1522
 
1633
1523
  // Can be adjusted by the user
1634
1524
  cacheLength: 50,
@@ -1649,20 +1539,22 @@ Expr = Sizzle.selectors = {
1649
1539
  },
1650
1540
 
1651
1541
  preFilter: {
1652
- "ATTR": function( match ) {
1653
- match[1] = match[1].replace( runescape, funescape );
1542
+ ATTR: function( match ) {
1543
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
1654
1544
 
1655
1545
  // Move the given value to match[3] whether quoted or unquoted
1656
- match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1546
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" )
1547
+ .replace( runescape, funescape );
1657
1548
 
1658
- if ( match[2] === "~=" ) {
1659
- match[3] = " " + match[3] + " ";
1549
+ if ( match[ 2 ] === "~=" ) {
1550
+ match[ 3 ] = " " + match[ 3 ] + " ";
1660
1551
  }
1661
1552
 
1662
1553
  return match.slice( 0, 4 );
1663
1554
  },
1664
1555
 
1665
- "CHILD": function( match ) {
1556
+ CHILD: function( match ) {
1557
+
1666
1558
  /* matches from matchExpr["CHILD"]
1667
1559
  1 type (only|nth|...)
1668
1560
  2 what (child|of-type)
@@ -1673,49 +1565,55 @@ Expr = Sizzle.selectors = {
1673
1565
  7 sign of y-component
1674
1566
  8 y of y-component
1675
1567
  */
1676
- match[1] = match[1].toLowerCase();
1568
+ match[ 1 ] = match[ 1 ].toLowerCase();
1569
+
1570
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
1677
1571
 
1678
- if ( match[1].slice( 0, 3 ) === "nth" ) {
1679
1572
  // nth-* requires argument
1680
- if ( !match[3] ) {
1681
- Sizzle.error( match[0] );
1573
+ if ( !match[ 3 ] ) {
1574
+ find.error( match[ 0 ] );
1682
1575
  }
1683
1576
 
1684
1577
  // numeric x and y parameters for Expr.filter.CHILD
1685
1578
  // remember that false/true cast respectively to 0/1
1686
- match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1687
- match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1579
+ match[ 4 ] = +( match[ 4 ] ?
1580
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
1581
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" )
1582
+ );
1583
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
1688
1584
 
1689
1585
  // other types prohibit arguments
1690
- } else if ( match[3] ) {
1691
- Sizzle.error( match[0] );
1586
+ } else if ( match[ 3 ] ) {
1587
+ find.error( match[ 0 ] );
1692
1588
  }
1693
1589
 
1694
1590
  return match;
1695
1591
  },
1696
1592
 
1697
- "PSEUDO": function( match ) {
1593
+ PSEUDO: function( match ) {
1698
1594
  var excess,
1699
- unquoted = !match[6] && match[2];
1595
+ unquoted = !match[ 6 ] && match[ 2 ];
1700
1596
 
1701
- if ( matchExpr["CHILD"].test( match[0] ) ) {
1597
+ if ( matchExpr.CHILD.test( match[ 0 ] ) ) {
1702
1598
  return null;
1703
1599
  }
1704
1600
 
1705
1601
  // Accept quoted arguments as-is
1706
- if ( match[3] ) {
1707
- match[2] = match[4] || match[5] || "";
1602
+ if ( match[ 3 ] ) {
1603
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
1708
1604
 
1709
1605
  // Strip excess characters from unquoted arguments
1710
1606
  } else if ( unquoted && rpseudo.test( unquoted ) &&
1607
+
1711
1608
  // Get excess from tokenize (recursively)
1712
- (excess = tokenize( unquoted, true )) &&
1609
+ ( excess = tokenize( unquoted, true ) ) &&
1610
+
1713
1611
  // advance to the next closing parenthesis
1714
- (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1612
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
1715
1613
 
1716
1614
  // excess is a negative index
1717
- match[0] = match[0].slice( 0, excess );
1718
- match[2] = unquoted.slice( 0, excess );
1615
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
1616
+ match[ 2 ] = unquoted.slice( 0, excess );
1719
1617
  }
1720
1618
 
1721
1619
  // Return only captures needed by the pseudo filter method (type and argument)
@@ -1725,28 +1623,36 @@ Expr = Sizzle.selectors = {
1725
1623
 
1726
1624
  filter: {
1727
1625
 
1728
- "TAG": function( nodeNameSelector ) {
1729
- var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1626
+ TAG: function( nodeNameSelector ) {
1627
+ var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1730
1628
  return nodeNameSelector === "*" ?
1731
- function() { return true; } :
1629
+ function() {
1630
+ return true;
1631
+ } :
1732
1632
  function( elem ) {
1733
- return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1633
+ return nodeName( elem, expectedNodeName );
1734
1634
  };
1735
1635
  },
1736
1636
 
1737
- "CLASS": function( className ) {
1637
+ CLASS: function( className ) {
1738
1638
  var pattern = classCache[ className + " " ];
1739
1639
 
1740
1640
  return pattern ||
1741
- (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1641
+ ( pattern = new RegExp( "(^|" + whitespace + ")" + className +
1642
+ "(" + whitespace + "|$)" ) ) &&
1742
1643
  classCache( className, function( elem ) {
1743
- return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
1744
- });
1644
+ return pattern.test(
1645
+ typeof elem.className === "string" && elem.className ||
1646
+ typeof elem.getAttribute !== "undefined" &&
1647
+ elem.getAttribute( "class" ) ||
1648
+ ""
1649
+ );
1650
+ } );
1745
1651
  },
1746
1652
 
1747
- "ATTR": function( name, operator, check ) {
1653
+ ATTR: function( name, operator, check ) {
1748
1654
  return function( elem ) {
1749
- var result = Sizzle.attr( elem, name );
1655
+ var result = find.attr( elem, name );
1750
1656
 
1751
1657
  if ( result == null ) {
1752
1658
  return operator === "!=";
@@ -1757,18 +1663,34 @@ Expr = Sizzle.selectors = {
1757
1663
 
1758
1664
  result += "";
1759
1665
 
1760
- return operator === "=" ? result === check :
1761
- operator === "!=" ? result !== check :
1762
- operator === "^=" ? check && result.indexOf( check ) === 0 :
1763
- operator === "*=" ? check && result.indexOf( check ) > -1 :
1764
- operator === "$=" ? check && result.slice( -check.length ) === check :
1765
- operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
1766
- operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1767
- false;
1666
+ if ( operator === "=" ) {
1667
+ return result === check;
1668
+ }
1669
+ if ( operator === "!=" ) {
1670
+ return result !== check;
1671
+ }
1672
+ if ( operator === "^=" ) {
1673
+ return check && result.indexOf( check ) === 0;
1674
+ }
1675
+ if ( operator === "*=" ) {
1676
+ return check && result.indexOf( check ) > -1;
1677
+ }
1678
+ if ( operator === "$=" ) {
1679
+ return check && result.slice( -check.length ) === check;
1680
+ }
1681
+ if ( operator === "~=" ) {
1682
+ return ( " " + result.replace( rwhitespace, " " ) + " " )
1683
+ .indexOf( check ) > -1;
1684
+ }
1685
+ if ( operator === "|=" ) {
1686
+ return result === check || result.slice( 0, check.length + 1 ) === check + "-";
1687
+ }
1688
+
1689
+ return false;
1768
1690
  };
1769
1691
  },
1770
1692
 
1771
- "CHILD": function( type, what, argument, first, last ) {
1693
+ CHILD: function( type, what, _argument, first, last ) {
1772
1694
  var simple = type.slice( 0, 3 ) !== "nth",
1773
1695
  forward = type.slice( -4 ) !== "last",
1774
1696
  ofType = what === "of-type";
@@ -1780,8 +1702,8 @@ Expr = Sizzle.selectors = {
1780
1702
  return !!elem.parentNode;
1781
1703
  } :
1782
1704
 
1783
- function( elem, context, xml ) {
1784
- var cache, uniqueCache, outerCache, node, nodeIndex, start,
1705
+ function( elem, _context, xml ) {
1706
+ var cache, outerCache, node, nodeIndex, start,
1785
1707
  dir = simple !== forward ? "nextSibling" : "previousSibling",
1786
1708
  parent = elem.parentNode,
1787
1709
  name = ofType && elem.nodeName.toLowerCase(),
@@ -1794,14 +1716,15 @@ Expr = Sizzle.selectors = {
1794
1716
  if ( simple ) {
1795
1717
  while ( dir ) {
1796
1718
  node = elem;
1797
- while ( (node = node[ dir ]) ) {
1719
+ while ( ( node = node[ dir ] ) ) {
1798
1720
  if ( ofType ?
1799
- node.nodeName.toLowerCase() === name :
1721
+ nodeName( node, name ) :
1800
1722
  node.nodeType === 1 ) {
1801
1723
 
1802
1724
  return false;
1803
1725
  }
1804
1726
  }
1727
+
1805
1728
  // Reverse direction for :only-* (if we haven't yet done so)
1806
1729
  start = dir = type === "only" && !start && "nextSibling";
1807
1730
  }
@@ -1814,46 +1737,30 @@ Expr = Sizzle.selectors = {
1814
1737
  if ( forward && useCache ) {
1815
1738
 
1816
1739
  // Seek `elem` from a previously-cached index
1817
-
1818
- // ...in a gzip-friendly way
1819
- node = parent;
1820
- outerCache = node[ expando ] || (node[ expando ] = {});
1821
-
1822
- // Support: IE <9 only
1823
- // Defend against cloned attroperties (jQuery gh-1709)
1824
- uniqueCache = outerCache[ node.uniqueID ] ||
1825
- (outerCache[ node.uniqueID ] = {});
1826
-
1827
- cache = uniqueCache[ type ] || [];
1740
+ outerCache = parent[ expando ] || ( parent[ expando ] = {} );
1741
+ cache = outerCache[ type ] || [];
1828
1742
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1829
1743
  diff = nodeIndex && cache[ 2 ];
1830
1744
  node = nodeIndex && parent.childNodes[ nodeIndex ];
1831
1745
 
1832
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1746
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1833
1747
 
1834
1748
  // Fallback to seeking `elem` from the start
1835
- (diff = nodeIndex = 0) || start.pop()) ) {
1749
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1836
1750
 
1837
1751
  // When found, cache indexes on `parent` and break
1838
1752
  if ( node.nodeType === 1 && ++diff && node === elem ) {
1839
- uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
1753
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1840
1754
  break;
1841
1755
  }
1842
1756
  }
1843
1757
 
1844
1758
  } else {
1759
+
1845
1760
  // Use previously-cached element index if available
1846
1761
  if ( useCache ) {
1847
- // ...in a gzip-friendly way
1848
- node = elem;
1849
- outerCache = node[ expando ] || (node[ expando ] = {});
1850
-
1851
- // Support: IE <9 only
1852
- // Defend against cloned attroperties (jQuery gh-1709)
1853
- uniqueCache = outerCache[ node.uniqueID ] ||
1854
- (outerCache[ node.uniqueID ] = {});
1855
-
1856
- cache = uniqueCache[ type ] || [];
1762
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
1763
+ cache = outerCache[ type ] || [];
1857
1764
  nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
1858
1765
  diff = nodeIndex;
1859
1766
  }
@@ -1861,25 +1768,21 @@ Expr = Sizzle.selectors = {
1861
1768
  // xml :nth-child(...)
1862
1769
  // or :nth-last-child(...) or :nth(-last)?-of-type(...)
1863
1770
  if ( diff === false ) {
1771
+
1864
1772
  // Use the same loop as above to seek `elem` from the start
1865
- while ( (node = ++nodeIndex && node && node[ dir ] ||
1866
- (diff = nodeIndex = 0) || start.pop()) ) {
1773
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
1774
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
1867
1775
 
1868
1776
  if ( ( ofType ?
1869
- node.nodeName.toLowerCase() === name :
1777
+ nodeName( node, name ) :
1870
1778
  node.nodeType === 1 ) &&
1871
1779
  ++diff ) {
1872
1780
 
1873
1781
  // Cache the index of each encountered element
1874
1782
  if ( useCache ) {
1875
- outerCache = node[ expando ] || (node[ expando ] = {});
1876
-
1877
- // Support: IE <9 only
1878
- // Defend against cloned attroperties (jQuery gh-1709)
1879
- uniqueCache = outerCache[ node.uniqueID ] ||
1880
- (outerCache[ node.uniqueID ] = {});
1881
-
1882
- uniqueCache[ type ] = [ dirruns, diff ];
1783
+ outerCache = node[ expando ] ||
1784
+ ( node[ expando ] = {} );
1785
+ outerCache[ type ] = [ dirruns, diff ];
1883
1786
  }
1884
1787
 
1885
1788
  if ( node === elem ) {
@@ -1897,18 +1800,19 @@ Expr = Sizzle.selectors = {
1897
1800
  };
1898
1801
  },
1899
1802
 
1900
- "PSEUDO": function( pseudo, argument ) {
1803
+ PSEUDO: function( pseudo, argument ) {
1804
+
1901
1805
  // pseudo-class names are case-insensitive
1902
- // http://www.w3.org/TR/selectors/#pseudo-classes
1806
+ // https://www.w3.org/TR/selectors/#pseudo-classes
1903
1807
  // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1904
1808
  // Remember that setFilters inherits from pseudos
1905
1809
  var args,
1906
1810
  fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1907
- Sizzle.error( "unsupported pseudo: " + pseudo );
1811
+ find.error( "unsupported pseudo: " + pseudo );
1908
1812
 
1909
1813
  // The user may use createPseudo to indicate that
1910
1814
  // arguments are needed to create the filter function
1911
- // just as Sizzle does
1815
+ // just as jQuery does
1912
1816
  if ( fn[ expando ] ) {
1913
1817
  return fn( argument );
1914
1818
  }
@@ -1917,15 +1821,15 @@ Expr = Sizzle.selectors = {
1917
1821
  if ( fn.length > 1 ) {
1918
1822
  args = [ pseudo, pseudo, "", argument ];
1919
1823
  return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1920
- markFunction(function( seed, matches ) {
1824
+ markFunction( function( seed, matches ) {
1921
1825
  var idx,
1922
1826
  matched = fn( seed, argument ),
1923
1827
  i = matched.length;
1924
1828
  while ( i-- ) {
1925
- idx = indexOf( seed, matched[i] );
1926
- seed[ idx ] = !( matches[ idx ] = matched[i] );
1829
+ idx = indexOf.call( seed, matched[ i ] );
1830
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
1927
1831
  }
1928
- }) :
1832
+ } ) :
1929
1833
  function( elem ) {
1930
1834
  return fn( elem, 0, args );
1931
1835
  };
@@ -1936,49 +1840,53 @@ Expr = Sizzle.selectors = {
1936
1840
  },
1937
1841
 
1938
1842
  pseudos: {
1843
+
1939
1844
  // Potentially complex pseudos
1940
- "not": markFunction(function( selector ) {
1845
+ not: markFunction( function( selector ) {
1846
+
1941
1847
  // Trim the selector passed to compile
1942
1848
  // to avoid treating leading and trailing
1943
1849
  // spaces as combinators
1944
1850
  var input = [],
1945
1851
  results = [],
1946
- matcher = compile( selector.replace( rtrim, "$1" ) );
1852
+ matcher = compile( selector.replace( rtrimCSS, "$1" ) );
1947
1853
 
1948
1854
  return matcher[ expando ] ?
1949
- markFunction(function( seed, matches, context, xml ) {
1855
+ markFunction( function( seed, matches, _context, xml ) {
1950
1856
  var elem,
1951
1857
  unmatched = matcher( seed, null, xml, [] ),
1952
1858
  i = seed.length;
1953
1859
 
1954
1860
  // Match elements unmatched by `matcher`
1955
1861
  while ( i-- ) {
1956
- if ( (elem = unmatched[i]) ) {
1957
- seed[i] = !(matches[i] = elem);
1862
+ if ( ( elem = unmatched[ i ] ) ) {
1863
+ seed[ i ] = !( matches[ i ] = elem );
1958
1864
  }
1959
1865
  }
1960
- }) :
1961
- function( elem, context, xml ) {
1962
- input[0] = elem;
1866
+ } ) :
1867
+ function( elem, _context, xml ) {
1868
+ input[ 0 ] = elem;
1963
1869
  matcher( input, null, xml, results );
1964
- // Don't keep the element (issue #299)
1965
- input[0] = null;
1870
+
1871
+ // Don't keep the element
1872
+ // (see https://github.com/jquery/sizzle/issues/299)
1873
+ input[ 0 ] = null;
1966
1874
  return !results.pop();
1967
1875
  };
1968
- }),
1876
+ } ),
1969
1877
 
1970
- "has": markFunction(function( selector ) {
1878
+ has: markFunction( function( selector ) {
1971
1879
  return function( elem ) {
1972
- return Sizzle( selector, elem ).length > 0;
1880
+ return find( selector, elem ).length > 0;
1973
1881
  };
1974
- }),
1882
+ } ),
1975
1883
 
1976
- "contains": markFunction(function( text ) {
1884
+ contains: markFunction( function( text ) {
1977
1885
  text = text.replace( runescape, funescape );
1978
1886
  return function( elem ) {
1979
- return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
1887
+ return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1;
1980
1888
  };
1981
- }),
1889
+ } ),
1982
1890
 
1983
1891
  // "Whether an element is represented by a :lang() selector
1984
1892
  // is based solely on the element's language value
@@ -1986,57 +1894,65 @@ Expr = Sizzle.selectors = {
1986
1894
  // or beginning with the identifier C immediately followed by "-".
1987
1895
  // The matching of C against the element's language value is performed case-insensitively.
1988
1896
  // The identifier C does not have to be a valid language name."
1989
- // http://www.w3.org/TR/selectors/#lang-pseudo
1990
- "lang": markFunction( function( lang ) {
1897
+ // https://www.w3.org/TR/selectors/#lang-pseudo
1898
+ lang: markFunction( function( lang ) {
1899
+
1991
1900
  // lang value must be a valid identifier
1992
- if ( !ridentifier.test(lang || "") ) {
1993
- Sizzle.error( "unsupported lang: " + lang );
1901
+ if ( !ridentifier.test( lang || "" ) ) {
1902
+ find.error( "unsupported lang: " + lang );
1994
1903
  }
1995
1904
  lang = lang.replace( runescape, funescape ).toLowerCase();
1996
1905
  return function( elem ) {
1997
1906
  var elemLang;
1998
1907
  do {
1999
- if ( (elemLang = documentIsHTML ?
1908
+ if ( ( elemLang = documentIsHTML ?
2000
1909
  elem.lang :
2001
- elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1910
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
2002
1911
 
2003
1912
  elemLang = elemLang.toLowerCase();
2004
1913
  return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
2005
1914
  }
2006
- } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1915
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
2007
1916
  return false;
2008
1917
  };
2009
- }),
1918
+ } ),
2010
1919
 
2011
1920
  // Miscellaneous
2012
- "target": function( elem ) {
1921
+ target: function( elem ) {
2013
1922
  var hash = window.location && window.location.hash;
2014
1923
  return hash && hash.slice( 1 ) === elem.id;
2015
1924
  },
2016
1925
 
2017
- "root": function( elem ) {
2018
- return elem === docElem;
1926
+ root: function( elem ) {
1927
+ return elem === documentElement;
2019
1928
  },
2020
1929
 
2021
- "focus": function( elem ) {
2022
- return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1930
+ focus: function( elem ) {
1931
+ return elem === safeActiveElement() &&
1932
+ document.hasFocus() &&
1933
+ !!( elem.type || elem.href || ~elem.tabIndex );
2023
1934
  },
2024
1935
 
2025
1936
  // Boolean properties
2026
- "enabled": createDisabledPseudo( false ),
2027
- "disabled": createDisabledPseudo( true ),
1937
+ enabled: createDisabledPseudo( false ),
1938
+ disabled: createDisabledPseudo( true ),
1939
+
1940
+ checked: function( elem ) {
2028
1941
 
2029
- "checked": function( elem ) {
2030
1942
  // In CSS3, :checked should return both checked and selected elements
2031
- // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
2032
- var nodeName = elem.nodeName.toLowerCase();
2033
- return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1943
+ // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1944
+ return ( nodeName( elem, "input" ) && !!elem.checked ) ||
1945
+ ( nodeName( elem, "option" ) && !!elem.selected );
2034
1946
  },
2035
1947
 
2036
- "selected": function( elem ) {
2037
- // Accessing this property makes selected-by-default
2038
- // options in Safari work properly
1948
+ selected: function( elem ) {
1949
+
1950
+ // Support: IE <=11+
1951
+ // Accessing the selectedIndex property
1952
+ // forces the browser to treat the default option as
1953
+ // selected when in an optgroup.
2039
1954
  if ( elem.parentNode ) {
1955
+ // eslint-disable-next-line no-unused-expressions
2040
1956
  elem.parentNode.selectedIndex;
2041
1957
  }
2042
1958
 
@@ -2044,8 +1960,9 @@ Expr = Sizzle.selectors = {
2044
1960
  },
2045
1961
 
2046
1962
  // Contents
2047
- "empty": function( elem ) {
2048
- // http://www.w3.org/TR/selectors/#empty-pseudo
1963
+ empty: function( elem ) {
1964
+
1965
+ // https://www.w3.org/TR/selectors/#empty-pseudo
2049
1966
  // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
2050
1967
  // but not by others (comment: 8; processing instruction: 7; etc.)
2051
1968
  // nodeType < 6 works because attributes (2) do not appear as children
@@ -2057,86 +1974,92 @@ Expr = Sizzle.selectors = {
2057
1974
  return true;
2058
1975
  },
2059
1976
 
2060
- "parent": function( elem ) {
2061
- return !Expr.pseudos["empty"]( elem );
1977
+ parent: function( elem ) {
1978
+ return !Expr.pseudos.empty( elem );
2062
1979
  },
2063
1980
 
2064
1981
  // Element/input types
2065
- "header": function( elem ) {
1982
+ header: function( elem ) {
2066
1983
  return rheader.test( elem.nodeName );
2067
1984
  },
2068
1985
 
2069
- "input": function( elem ) {
1986
+ input: function( elem ) {
2070
1987
  return rinputs.test( elem.nodeName );
2071
1988
  },
2072
1989
 
2073
- "button": function( elem ) {
2074
- var name = elem.nodeName.toLowerCase();
2075
- return name === "input" && elem.type === "button" || name === "button";
1990
+ button: function( elem ) {
1991
+ return nodeName( elem, "input" ) && elem.type === "button" ||
1992
+ nodeName( elem, "button" );
2076
1993
  },
2077
1994
 
2078
- "text": function( elem ) {
1995
+ text: function( elem ) {
2079
1996
  var attr;
2080
- return elem.nodeName.toLowerCase() === "input" &&
2081
- elem.type === "text" &&
1997
+ return nodeName( elem, "input" ) && elem.type === "text" &&
2082
1998
 
2083
- // Support: IE<8
2084
- // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
2085
- ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1999
+ // Support: IE <10 only
2000
+ // New HTML5 attribute values (e.g., "search") appear
2001
+ // with elem.type === "text"
2002
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
2003
+ attr.toLowerCase() === "text" );
2086
2004
  },
2087
2005
 
2088
2006
  // Position-in-collection
2089
- "first": createPositionalPseudo(function() {
2007
+ first: createPositionalPseudo( function() {
2090
2008
  return [ 0 ];
2091
- }),
2009
+ } ),
2092
2010
 
2093
- "last": createPositionalPseudo(function( matchIndexes, length ) {
2011
+ last: createPositionalPseudo( function( _matchIndexes, length ) {
2094
2012
  return [ length - 1 ];
2095
- }),
2013
+ } ),
2096
2014
 
2097
- "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
2015
+ eq: createPositionalPseudo( function( _matchIndexes, length, argument ) {
2098
2016
  return [ argument < 0 ? argument + length : argument ];
2099
- }),
2017
+ } ),
2100
2018
 
2101
- "even": createPositionalPseudo(function( matchIndexes, length ) {
2019
+ even: createPositionalPseudo( function( matchIndexes, length ) {
2102
2020
  var i = 0;
2103
2021
  for ( ; i < length; i += 2 ) {
2104
2022
  matchIndexes.push( i );
2105
2023
  }
2106
2024
  return matchIndexes;
2107
- }),
2025
+ } ),
2108
2026
 
2109
- "odd": createPositionalPseudo(function( matchIndexes, length ) {
2027
+ odd: createPositionalPseudo( function( matchIndexes, length ) {
2110
2028
  var i = 1;
2111
2029
  for ( ; i < length; i += 2 ) {
2112
2030
  matchIndexes.push( i );
2113
2031
  }
2114
2032
  return matchIndexes;
2115
- }),
2116
-
2117
- "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2118
- var i = argument < 0 ?
2119
- argument + length :
2120
- argument > length ?
2121
- length :
2122
- argument;
2033
+ } ),
2034
+
2035
+ lt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2036
+ var i;
2037
+
2038
+ if ( argument < 0 ) {
2039
+ i = argument + length;
2040
+ } else if ( argument > length ) {
2041
+ i = length;
2042
+ } else {
2043
+ i = argument;
2044
+ }
2045
+
2123
2046
  for ( ; --i >= 0; ) {
2124
2047
  matchIndexes.push( i );
2125
2048
  }
2126
2049
  return matchIndexes;
2127
- }),
2050
+ } ),
2128
2051
 
2129
- "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2052
+ gt: createPositionalPseudo( function( matchIndexes, length, argument ) {
2130
2053
  var i = argument < 0 ? argument + length : argument;
2131
2054
  for ( ; ++i < length; ) {
2132
2055
  matchIndexes.push( i );
2133
2056
  }
2134
2057
  return matchIndexes;
2135
- })
2058
+ } )
2136
2059
  }
2137
2060
  };
2138
2061
 
2139
- Expr.pseudos["nth"] = Expr.pseudos["eq"];
2062
+ Expr.pseudos.nth = Expr.pseudos.eq;
2140
2063
 
2141
2064
  // Add button/input type pseudos
2142
2065
  for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
@@ -2151,7 +2074,7 @@ function setFilters() {}
2151
2074
  setFilters.prototype = Expr.filters = Expr.pseudos;
2152
2075
  Expr.setFilters = new setFilters();
2153
2076
 
2154
- tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2077
+ function tokenize( selector, parseOnly ) {
2155
2078
  var matched, match, tokens, type,
2156
2079
  soFar, groups, preFilters,
2157
2080
  cached = tokenCache[ selector + " " ];
@@ -2167,37 +2090,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2167
2090
  while ( soFar ) {
2168
2091
 
2169
2092
  // Comma and first run
2170
- if ( !matched || (match = rcomma.exec( soFar )) ) {
2093
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
2171
2094
  if ( match ) {
2095
+
2172
2096
  // Don't consume trailing commas as valid
2173
- soFar = soFar.slice( match[0].length ) || soFar;
2097
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
2174
2098
  }
2175
- groups.push( (tokens = []) );
2099
+ groups.push( ( tokens = [] ) );
2176
2100
  }
2177
2101
 
2178
2102
  matched = false;
2179
2103
 
2180
2104
  // Combinators
2181
- if ( (match = rcombinators.exec( soFar )) ) {
2105
+ if ( ( match = rleadingCombinator.exec( soFar ) ) ) {
2182
2106
  matched = match.shift();
2183
- tokens.push({
2107
+ tokens.push( {
2184
2108
  value: matched,
2109
+
2185
2110
  // Cast descendant combinators to space
2186
- type: match[0].replace( rtrim, " " )
2187
- });
2111
+ type: match[ 0 ].replace( rtrimCSS, " " )
2112
+ } );
2188
2113
  soFar = soFar.slice( matched.length );
2189
2114
  }
2190
2115
 
2191
2116
  // Filters
2192
2117
  for ( type in Expr.filter ) {
2193
- if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2194
- (match = preFilters[ type ]( match ))) ) {
2118
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
2119
+ ( match = preFilters[ type ]( match ) ) ) ) {
2195
2120
  matched = match.shift();
2196
- tokens.push({
2121
+ tokens.push( {
2197
2122
  value: matched,
2198
2123
  type: type,
2199
2124
  matches: match
2200
- });
2125
+ } );
2201
2126
  soFar = soFar.slice( matched.length );
2202
2127
  }
2203
2128
  }
@@ -2210,20 +2135,23 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2210
2135
  // Return the length of the invalid excess
2211
2136
  // if we're just parsing
2212
2137
  // Otherwise, throw an error or return tokens
2213
- return parseOnly ?
2214
- soFar.length :
2215
- soFar ?
2216
- Sizzle.error( selector ) :
2217
- // Cache the tokens
2218
- tokenCache( selector, groups ).slice( 0 );
2219
- };
2138
+ if ( parseOnly ) {
2139
+ return soFar.length;
2140
+ }
2141
+
2142
+ return soFar ?
2143
+ find.error( selector ) :
2144
+
2145
+ // Cache the tokens
2146
+ tokenCache( selector, groups ).slice( 0 );
2147
+ }
2220
2148
 
2221
2149
  function toSelector( tokens ) {
2222
2150
  var i = 0,
2223
2151
  len = tokens.length,
2224
2152
  selector = "";
2225
2153
  for ( ; i < len; i++ ) {
2226
- selector += tokens[i].value;
2154
+ selector += tokens[ i ].value;
2227
2155
  }
2228
2156
  return selector;
2229
2157
  }
@@ -2236,9 +2164,10 @@ function addCombinator( matcher, combinator, base ) {
2236
2164
  doneName = done++;
2237
2165
 
2238
2166
  return combinator.first ?
2167
+
2239
2168
  // Check against closest ancestor/preceding element
2240
2169
  function( elem, context, xml ) {
2241
- while ( (elem = elem[ dir ]) ) {
2170
+ while ( ( elem = elem[ dir ] ) ) {
2242
2171
  if ( elem.nodeType === 1 || checkNonElements ) {
2243
2172
  return matcher( elem, context, xml );
2244
2173
  }
@@ -2248,12 +2177,12 @@ function addCombinator( matcher, combinator, base ) {
2248
2177
 
2249
2178
  // Check against all ancestor/preceding elements
2250
2179
  function( elem, context, xml ) {
2251
- var oldCache, uniqueCache, outerCache,
2180
+ var oldCache, outerCache,
2252
2181
  newCache = [ dirruns, doneName ];
2253
2182
 
2254
2183
  // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
2255
2184
  if ( xml ) {
2256
- while ( (elem = elem[ dir ]) ) {
2185
+ while ( ( elem = elem[ dir ] ) ) {
2257
2186
  if ( elem.nodeType === 1 || checkNonElements ) {
2258
2187
  if ( matcher( elem, context, xml ) ) {
2259
2188
  return true;
@@ -2261,27 +2190,24 @@ function addCombinator( matcher, combinator, base ) {
2261
2190
  }
2262
2191
  }
2263
2192
  } else {
2264
- while ( (elem = elem[ dir ]) ) {
2193
+ while ( ( elem = elem[ dir ] ) ) {
2265
2194
  if ( elem.nodeType === 1 || checkNonElements ) {
2266
- outerCache = elem[ expando ] || (elem[ expando ] = {});
2267
-
2268
- // Support: IE <9 only
2269
- // Defend against cloned attroperties (jQuery gh-1709)
2270
- uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
2195
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
2271
2196
 
2272
- if ( skip && skip === elem.nodeName.toLowerCase() ) {
2197
+ if ( skip && nodeName( elem, skip ) ) {
2273
2198
  elem = elem[ dir ] || elem;
2274
- } else if ( (oldCache = uniqueCache[ key ]) &&
2199
+ } else if ( ( oldCache = outerCache[ key ] ) &&
2275
2200
  oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2276
2201
 
2277
2202
  // Assign to newCache so results back-propagate to previous elements
2278
- return (newCache[ 2 ] = oldCache[ 2 ]);
2203
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
2279
2204
  } else {
2205
+
2280
2206
  // Reuse newcache so results back-propagate to previous elements
2281
- uniqueCache[ key ] = newCache;
2207
+ outerCache[ key ] = newCache;
2282
2208
 
2283
2209
  // A match means we're done; a fail means we have to keep checking
2284
- if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2210
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
2285
2211
  return true;
2286
2212
  }
2287
2213
  }
@@ -2297,20 +2223,20 @@ function elementMatcher( matchers ) {
2297
2223
  function( elem, context, xml ) {
2298
2224
  var i = matchers.length;
2299
2225
  while ( i-- ) {
2300
- if ( !matchers[i]( elem, context, xml ) ) {
2226
+ if ( !matchers[ i ]( elem, context, xml ) ) {
2301
2227
  return false;
2302
2228
  }
2303
2229
  }
2304
2230
  return true;
2305
2231
  } :
2306
- matchers[0];
2232
+ matchers[ 0 ];
2307
2233
  }
2308
2234
 
2309
2235
  function multipleContexts( selector, contexts, results ) {
2310
2236
  var i = 0,
2311
2237
  len = contexts.length;
2312
2238
  for ( ; i < len; i++ ) {
2313
- Sizzle( selector, contexts[i], results );
2239
+ find( selector, contexts[ i ], results );
2314
2240
  }
2315
2241
  return results;
2316
2242
  }
@@ -2323,7 +2249,7 @@ function condense( unmatched, map, filter, context, xml ) {
2323
2249
  mapped = map != null;
2324
2250
 
2325
2251
  for ( ; i < len; i++ ) {
2326
- if ( (elem = unmatched[i]) ) {
2252
+ if ( ( elem = unmatched[ i ] ) ) {
2327
2253
  if ( !filter || filter( elem, context, xml ) ) {
2328
2254
  newUnmatched.push( elem );
2329
2255
  if ( mapped ) {
@@ -2343,34 +2269,38 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2343
2269
  if ( postFinder && !postFinder[ expando ] ) {
2344
2270
  postFinder = setMatcher( postFinder, postSelector );
2345
2271
  }
2346
- return markFunction(function( seed, results, context, xml ) {
2347
- var temp, i, elem,
2272
+ return markFunction( function( seed, results, context, xml ) {
2273
+ var temp, i, elem, matcherOut,
2348
2274
  preMap = [],
2349
2275
  postMap = [],
2350
2276
  preexisting = results.length,
2351
2277
 
2352
2278
  // Get initial elements from seed or context
2353
- elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2279
+ elems = seed ||
2280
+ multipleContexts( selector || "*",
2281
+ context.nodeType ? [ context ] : context, [] ),
2354
2282
 
2355
2283
  // Prefilter to get matcher input, preserving a map for seed-results synchronization
2356
2284
  matcherIn = preFilter && ( seed || !selector ) ?
2357
2285
  condense( elems, preMap, preFilter, context, xml ) :
2358
- elems,
2286
+ elems;
2287
+
2288
+ if ( matcher ) {
2359
2289
 
2360
- matcherOut = matcher ?
2361
- // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2362
- postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2290
+ // If we have a postFinder, or filtered seed, or non-seed postFilter
2291
+ // or preexisting results,
2292
+ matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2363
2293
 
2364
- // ...intermediate processing is necessary
2365
- [] :
2294
+ // ...intermediate processing is necessary
2295
+ [] :
2366
2296
 
2367
- // ...otherwise use results directly
2368
- results :
2369
- matcherIn;
2297
+ // ...otherwise use results directly
2298
+ results;
2370
2299
 
2371
- // Find primary matches
2372
- if ( matcher ) {
2300
+ // Find primary matches
2373
2301
  matcher( matcherIn, matcherOut, context, xml );
2302
+ } else {
2303
+ matcherOut = matcherIn;
2374
2304
  }
2375
2305
 
2376
2306
  // Apply postFilter
@@ -2381,8 +2311,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2381
2311
  // Un-match failing elements by moving them back to matcherIn
2382
2312
  i = temp.length;
2383
2313
  while ( i-- ) {
2384
- if ( (elem = temp[i]) ) {
2385
- matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2314
+ if ( ( elem = temp[ i ] ) ) {
2315
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
2386
2316
  }
2387
2317
  }
2388
2318
  }
@@ -2390,25 +2320,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2390
2320
  if ( seed ) {
2391
2321
  if ( postFinder || preFilter ) {
2392
2322
  if ( postFinder ) {
2323
+
2393
2324
  // Get the final matcherOut by condensing this intermediate into postFinder contexts
2394
2325
  temp = [];
2395
2326
  i = matcherOut.length;
2396
2327
  while ( i-- ) {
2397
- if ( (elem = matcherOut[i]) ) {
2328
+ if ( ( elem = matcherOut[ i ] ) ) {
2329
+
2398
2330
  // Restore matcherIn since elem is not yet a final match
2399
- temp.push( (matcherIn[i] = elem) );
2331
+ temp.push( ( matcherIn[ i ] = elem ) );
2400
2332
  }
2401
2333
  }
2402
- postFinder( null, (matcherOut = []), temp, xml );
2334
+ postFinder( null, ( matcherOut = [] ), temp, xml );
2403
2335
  }
2404
2336
 
2405
2337
  // Move matched elements from seed to results to keep them synchronized
2406
2338
  i = matcherOut.length;
2407
2339
  while ( i-- ) {
2408
- if ( (elem = matcherOut[i]) &&
2409
- (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
2340
+ if ( ( elem = matcherOut[ i ] ) &&
2341
+ ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) {
2410
2342
 
2411
- seed[temp] = !(results[temp] = elem);
2343
+ seed[ temp ] = !( results[ temp ] = elem );
2412
2344
  }
2413
2345
  }
2414
2346
  }
@@ -2426,14 +2358,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS
2426
2358
  push.apply( results, matcherOut );
2427
2359
  }
2428
2360
  }
2429
- });
2361
+ } );
2430
2362
  }
2431
2363
 
2432
2364
  function matcherFromTokens( tokens ) {
2433
2365
  var checkContext, matcher, j,
2434
2366
  len = tokens.length,
2435
- leadingRelative = Expr.relative[ tokens[0].type ],
2436
- implicitRelative = leadingRelative || Expr.relative[" "],
2367
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
2368
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
2437
2369
  i = leadingRelative ? 1 : 0,
2438
2370
 
2439
2371
  // The foundational matcher ensures that elements are reachable from top-level context(s)
@@ -2441,42 +2373,52 @@ function matcherFromTokens( tokens ) {
2441
2373
  return elem === checkContext;
2442
2374
  }, implicitRelative, true ),
2443
2375
  matchAnyContext = addCombinator( function( elem ) {
2444
- return indexOf( checkContext, elem ) > -1;
2376
+ return indexOf.call( checkContext, elem ) > -1;
2445
2377
  }, implicitRelative, true ),
2446
2378
  matchers = [ function( elem, context, xml ) {
2447
- var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2448
- (checkContext = context).nodeType ?
2379
+
2380
+ // Support: IE 11+, Edge 17 - 18+
2381
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2382
+ // two documents; shallow comparisons work.
2383
+ // eslint-disable-next-line eqeqeq
2384
+ var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || (
2385
+ ( checkContext = context ).nodeType ?
2449
2386
  matchContext( elem, context, xml ) :
2450
2387
  matchAnyContext( elem, context, xml ) );
2451
- // Avoid hanging onto element (issue #299)
2388
+
2389
+ // Avoid hanging onto element
2390
+ // (see https://github.com/jquery/sizzle/issues/299)
2452
2391
  checkContext = null;
2453
2392
  return ret;
2454
2393
  } ];
2455
2394
 
2456
2395
  for ( ; i < len; i++ ) {
2457
- if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2458
- matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2396
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
2397
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
2459
2398
  } else {
2460
- matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2399
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
2461
2400
 
2462
2401
  // Return special upon seeing a positional matcher
2463
2402
  if ( matcher[ expando ] ) {
2403
+
2464
2404
  // Find the next relative operator (if any) for proper handling
2465
2405
  j = ++i;
2466
2406
  for ( ; j < len; j++ ) {
2467
- if ( Expr.relative[ tokens[j].type ] ) {
2407
+ if ( Expr.relative[ tokens[ j ].type ] ) {
2468
2408
  break;
2469
2409
  }
2470
2410
  }
2471
2411
  return setMatcher(
2472
2412
  i > 1 && elementMatcher( matchers ),
2473
2413
  i > 1 && toSelector(
2414
+
2474
2415
  // If the preceding token was a descendant combinator, insert an implicit any-element `*`
2475
- tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2476
- ).replace( rtrim, "$1" ),
2416
+ tokens.slice( 0, i - 1 )
2417
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
2418
+ ).replace( rtrimCSS, "$1" ),
2477
2419
  matcher,
2478
2420
  i < j && matcherFromTokens( tokens.slice( i, j ) ),
2479
- j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2421
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
2480
2422
  j < len && toSelector( tokens )
2481
2423
  );
2482
2424
  }
@@ -2497,29 +2439,42 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2497
2439
  unmatched = seed && [],
2498
2440
  setMatched = [],
2499
2441
  contextBackup = outermostContext,
2442
+
2500
2443
  // We must always have either seed elements or outermost context
2501
- elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2444
+ elems = seed || byElement && Expr.find.TAG( "*", outermost ),
2445
+
2502
2446
  // Use integer dirruns iff this is the outermost matcher
2503
- dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2447
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
2504
2448
  len = elems.length;
2505
2449
 
2506
2450
  if ( outermost ) {
2507
- outermostContext = context === document || context || outermost;
2451
+
2452
+ // Support: IE 11+, Edge 17 - 18+
2453
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2454
+ // two documents; shallow comparisons work.
2455
+ // eslint-disable-next-line eqeqeq
2456
+ outermostContext = context == document || context || outermost;
2508
2457
  }
2509
2458
 
2510
2459
  // Add elements passing elementMatchers directly to results
2511
- // Support: IE<9, Safari
2512
- // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2513
- for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2460
+ // Support: iOS <=7 - 9 only
2461
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching
2462
+ // elements by id. (see trac-14142)
2463
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
2514
2464
  if ( byElement && elem ) {
2515
2465
  j = 0;
2516
- if ( !context && elem.ownerDocument !== document ) {
2466
+
2467
+ // Support: IE 11+, Edge 17 - 18+
2468
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
2469
+ // two documents; shallow comparisons work.
2470
+ // eslint-disable-next-line eqeqeq
2471
+ if ( !context && elem.ownerDocument != document ) {
2517
2472
  setDocument( elem );
2518
2473
  xml = !documentIsHTML;
2519
2474
  }
2520
- while ( (matcher = elementMatchers[j++]) ) {
2521
- if ( matcher( elem, context || document, xml) ) {
2522
- results.push( elem );
2475
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
2476
+ if ( matcher( elem, context || document, xml ) ) {
2477
+ push.call( results, elem );
2523
2478
  break;
2524
2479
  }
2525
2480
  }
@@ -2530,8 +2485,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2530
2485
 
2531
2486
  // Track unmatched elements for set filters
2532
2487
  if ( bySet ) {
2488
+
2533
2489
  // They will have gone through all possible matchers
2534
- if ( (elem = !matcher && elem) ) {
2490
+ if ( ( elem = !matcher && elem ) ) {
2535
2491
  matchedCount--;
2536
2492
  }
2537
2493
 
@@ -2555,16 +2511,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2555
2511
  // numerically zero.
2556
2512
  if ( bySet && i !== matchedCount ) {
2557
2513
  j = 0;
2558
- while ( (matcher = setMatchers[j++]) ) {
2514
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
2559
2515
  matcher( unmatched, setMatched, context, xml );
2560
2516
  }
2561
2517
 
2562
2518
  if ( seed ) {
2519
+
2563
2520
  // Reintegrate element matches to eliminate the need for sorting
2564
2521
  if ( matchedCount > 0 ) {
2565
2522
  while ( i-- ) {
2566
- if ( !(unmatched[i] || setMatched[i]) ) {
2567
- setMatched[i] = pop.call( results );
2523
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
2524
+ setMatched[ i ] = pop.call( results );
2568
2525
  }
2569
2526
  }
2570
2527
  }
@@ -2580,7 +2537,7 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2580
2537
  if ( outermost && !seed && setMatched.length > 0 &&
2581
2538
  ( matchedCount + setMatchers.length ) > 1 ) {
2582
2539
 
2583
- Sizzle.uniqueSort( results );
2540
+ jQuery.uniqueSort( results );
2584
2541
  }
2585
2542
  }
2586
2543
 
@@ -2598,20 +2555,21 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2598
2555
  superMatcher;
2599
2556
  }
2600
2557
 
2601
- compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2558
+ function compile( selector, match /* Internal Use Only */ ) {
2602
2559
  var i,
2603
2560
  setMatchers = [],
2604
2561
  elementMatchers = [],
2605
2562
  cached = compilerCache[ selector + " " ];
2606
2563
 
2607
2564
  if ( !cached ) {
2565
+
2608
2566
  // Generate a function of recursive functions that can be used to check each element
2609
2567
  if ( !match ) {
2610
2568
  match = tokenize( selector );
2611
2569
  }
2612
2570
  i = match.length;
2613
2571
  while ( i-- ) {
2614
- cached = matcherFromTokens( match[i] );
2572
+ cached = matcherFromTokens( match[ i ] );
2615
2573
  if ( cached[ expando ] ) {
2616
2574
  setMatchers.push( cached );
2617
2575
  } else {
@@ -2620,27 +2578,28 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2620
2578
  }
2621
2579
 
2622
2580
  // Cache the compiled function
2623
- cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2581
+ cached = compilerCache( selector,
2582
+ matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2624
2583
 
2625
2584
  // Save selector and tokenization
2626
2585
  cached.selector = selector;
2627
2586
  }
2628
2587
  return cached;
2629
- };
2588
+ }
2630
2589
 
2631
2590
  /**
2632
- * A low-level selection function that works with Sizzle's compiled
2591
+ * A low-level selection function that works with jQuery's compiled
2633
2592
  * selector functions
2634
2593
  * @param {String|Function} selector A selector or a pre-compiled
2635
- * selector function built with Sizzle.compile
2594
+ * selector function built with jQuery selector compile
2636
2595
  * @param {Element} context
2637
2596
  * @param {Array} [results]
2638
2597
  * @param {Array} [seed] A set of elements to match against
2639
2598
  */
2640
- select = Sizzle.select = function( selector, context, results, seed ) {
2599
+ function select( selector, context, results, seed ) {
2641
2600
  var i, tokens, token, type, find,
2642
2601
  compiled = typeof selector === "function" && selector,
2643
- match = !seed && tokenize( (selector = compiled.selector || selector) );
2602
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
2644
2603
 
2645
2604
  results = results || [];
2646
2605
 
@@ -2649,11 +2608,14 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2649
2608
  if ( match.length === 1 ) {
2650
2609
 
2651
2610
  // Reduce context if the leading compound selector is an ID
2652
- tokens = match[0] = match[0].slice( 0 );
2653
- if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2654
- context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
2655
-
2656
- context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2611
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
2612
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
2613
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
2614
+
2615
+ context = ( Expr.find.ID(
2616
+ token.matches[ 0 ].replace( runescape, funescape ),
2617
+ context
2618
+ ) || [] )[ 0 ];
2657
2619
  if ( !context ) {
2658
2620
  return results;
2659
2621
 
@@ -2666,20 +2628,22 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2666
2628
  }
2667
2629
 
2668
2630
  // Fetch a seed set for right-to-left matching
2669
- i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2631
+ i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length;
2670
2632
  while ( i-- ) {
2671
- token = tokens[i];
2633
+ token = tokens[ i ];
2672
2634
 
2673
2635
  // Abort if we hit a combinator
2674
- if ( Expr.relative[ (type = token.type) ] ) {
2636
+ if ( Expr.relative[ ( type = token.type ) ] ) {
2675
2637
  break;
2676
2638
  }
2677
- if ( (find = Expr.find[ type ]) ) {
2639
+ if ( ( find = Expr.find[ type ] ) ) {
2640
+
2678
2641
  // Search, expanding context for leading sibling combinators
2679
- if ( (seed = find(
2680
- token.matches[0].replace( runescape, funescape ),
2681
- rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2682
- )) ) {
2642
+ if ( ( seed = find(
2643
+ token.matches[ 0 ].replace( runescape, funescape ),
2644
+ rsibling.test( tokens[ 0 ].type ) &&
2645
+ testContext( context.parentNode ) || context
2646
+ ) ) ) {
2683
2647
 
2684
2648
  // If seed is empty or no tokens remain, we can return early
2685
2649
  tokens.splice( i, 1 );
@@ -2705,89 +2669,48 @@ select = Sizzle.select = function( selector, context, results, seed ) {
2705
2669
  !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
2706
2670
  );
2707
2671
  return results;
2708
- };
2672
+ }
2709
2673
 
2710
2674
  // One-time assignments
2711
2675
 
2676
+ // Support: Android <=4.0 - 4.1+
2712
2677
  // Sort stability
2713
- support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2714
-
2715
- // Support: Chrome 14-35+
2716
- // Always assume duplicates if they aren't passed to the comparison function
2717
- support.detectDuplicates = !!hasDuplicate;
2678
+ support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
2718
2679
 
2719
2680
  // Initialize against the default document
2720
2681
  setDocument();
2721
2682
 
2722
- // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2683
+ // Support: Android <=4.0 - 4.1+
2723
2684
  // Detached nodes confoundingly follow *each other*
2724
- support.sortDetached = assert(function( el ) {
2725
- // Should return 1, but returns 4 (following)
2726
- return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
2727
- });
2728
-
2729
- // Support: IE<8
2730
- // Prevent attribute/property "interpolation"
2731
- // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2732
- if ( !assert(function( el ) {
2733
- el.innerHTML = "<a href='#'></a>";
2734
- return el.firstChild.getAttribute("href") === "#" ;
2735
- }) ) {
2736
- addHandle( "type|href|height|width", function( elem, name, isXML ) {
2737
- if ( !isXML ) {
2738
- return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2739
- }
2740
- });
2741
- }
2742
-
2743
- // Support: IE<9
2744
- // Use defaultValue in place of getAttribute("value")
2745
- if ( !support.attributes || !assert(function( el ) {
2746
- el.innerHTML = "<input/>";
2747
- el.firstChild.setAttribute( "value", "" );
2748
- return el.firstChild.getAttribute( "value" ) === "";
2749
- }) ) {
2750
- addHandle( "value", function( elem, name, isXML ) {
2751
- if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2752
- return elem.defaultValue;
2753
- }
2754
- });
2755
- }
2756
-
2757
- // Support: IE<9
2758
- // Use getAttributeNode to fetch booleans when getAttribute lies
2759
- if ( !assert(function( el ) {
2760
- return el.getAttribute("disabled") == null;
2761
- }) ) {
2762
- addHandle( booleans, function( elem, name, isXML ) {
2763
- var val;
2764
- if ( !isXML ) {
2765
- return elem[ name ] === true ? name.toLowerCase() :
2766
- (val = elem.getAttributeNode( name )) && val.specified ?
2767
- val.value :
2768
- null;
2769
- }
2770
- });
2771
- }
2772
-
2773
- return Sizzle;
2774
-
2775
- })( window );
2776
-
2685
+ support.sortDetached = assert( function( el ) {
2777
2686
 
2687
+ // Should return 1, but returns 4 (following)
2688
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
2689
+ } );
2778
2690
 
2779
- jQuery.find = Sizzle;
2780
- jQuery.expr = Sizzle.selectors;
2691
+ jQuery.find = find;
2781
2692
 
2782
2693
  // Deprecated
2783
2694
  jQuery.expr[ ":" ] = jQuery.expr.pseudos;
2784
- jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
2785
- jQuery.text = Sizzle.getText;
2786
- jQuery.isXMLDoc = Sizzle.isXML;
2787
- jQuery.contains = Sizzle.contains;
2788
- jQuery.escapeSelector = Sizzle.escape;
2695
+ jQuery.unique = jQuery.uniqueSort;
2696
+
2697
+ // These have always been private, but they used to be documented
2698
+ // as part of Sizzle so let's maintain them in the 3.x line
2699
+ // for backwards compatibility purposes.
2700
+ find.compile = compile;
2701
+ find.select = select;
2702
+ find.setDocument = setDocument;
2703
+
2704
+ find.escape = jQuery.escapeSelector;
2705
+ find.getText = jQuery.text;
2706
+ find.isXML = jQuery.isXMLDoc;
2707
+ find.selectors = jQuery.expr;
2708
+ find.support = jQuery.support;
2709
+ find.uniqueSort = jQuery.uniqueSort;
2789
2710
 
2711
+ /* eslint-enable */
2790
2712
 
2713
+ } )();
2791
2714
 
2792
2715
 
2793
2716
  var dir = function( elem, dir, until ) {
@@ -2821,13 +2744,6 @@ var siblings = function( n, elem ) {
2821
2744
 
2822
2745
  var rneedsContext = jQuery.expr.match.needsContext;
2823
2746
 
2824
-
2825
-
2826
- function nodeName( elem, name ) {
2827
-
2828
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
2829
-
2830
- };
2831
2747
  var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
2832
2748
 
2833
2749
 
@@ -2926,8 +2842,8 @@ jQuery.fn.extend( {
2926
2842
  var rootjQuery,
2927
2843
 
2928
2844
  // A simple way to check for HTML strings
2929
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2930
- // Strict HTML recognition (#11290: must start with <)
2845
+ // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)
2846
+ // Strict HTML recognition (trac-11290: must start with <)
2931
2847
  // Shortcut simple #id case for speed
2932
2848
  rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
2933
2849
 
@@ -3078,7 +2994,7 @@ jQuery.fn.extend( {
3078
2994
  if ( cur.nodeType < 11 && ( targets ?
3079
2995
  targets.index( cur ) > -1 :
3080
2996
 
3081
- // Don't pass non-elements to Sizzle
2997
+ // Don't pass non-elements to jQuery#find
3082
2998
  cur.nodeType === 1 &&
3083
2999
  jQuery.find.matchesSelector( cur, selectors ) ) ) {
3084
3000
 
@@ -3141,7 +3057,7 @@ jQuery.each( {
3141
3057
  parents: function( elem ) {
3142
3058
  return dir( elem, "parentNode" );
3143
3059
  },
3144
- parentsUntil: function( elem, i, until ) {
3060
+ parentsUntil: function( elem, _i, until ) {
3145
3061
  return dir( elem, "parentNode", until );
3146
3062
  },
3147
3063
  next: function( elem ) {
@@ -3156,10 +3072,10 @@ jQuery.each( {
3156
3072
  prevAll: function( elem ) {
3157
3073
  return dir( elem, "previousSibling" );
3158
3074
  },
3159
- nextUntil: function( elem, i, until ) {
3075
+ nextUntil: function( elem, _i, until ) {
3160
3076
  return dir( elem, "nextSibling", until );
3161
3077
  },
3162
- prevUntil: function( elem, i, until ) {
3078
+ prevUntil: function( elem, _i, until ) {
3163
3079
  return dir( elem, "previousSibling", until );
3164
3080
  },
3165
3081
  siblings: function( elem ) {
@@ -3169,7 +3085,13 @@ jQuery.each( {
3169
3085
  return siblings( elem.firstChild );
3170
3086
  },
3171
3087
  contents: function( elem ) {
3172
- if ( typeof elem.contentDocument !== "undefined" ) {
3088
+ if ( elem.contentDocument != null &&
3089
+
3090
+ // Support: IE 11+
3091
+ // <object> elements with no `data` attribute has an object
3092
+ // `contentDocument` with a `null` prototype.
3093
+ getProto( elem.contentDocument ) ) {
3094
+
3173
3095
  return elem.contentDocument;
3174
3096
  }
3175
3097
 
@@ -3512,7 +3434,7 @@ jQuery.extend( {
3512
3434
  var fns = arguments;
3513
3435
 
3514
3436
  return jQuery.Deferred( function( newDefer ) {
3515
- jQuery.each( tuples, function( i, tuple ) {
3437
+ jQuery.each( tuples, function( _i, tuple ) {
3516
3438
 
3517
3439
  // Map tuples (progress, done, fail) to arguments (done, fail, progress)
3518
3440
  var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3627,7 +3549,7 @@ jQuery.extend( {
3627
3549
 
3628
3550
  if ( jQuery.Deferred.exceptionHook ) {
3629
3551
  jQuery.Deferred.exceptionHook( e,
3630
- process.stackTrace );
3552
+ process.error );
3631
3553
  }
3632
3554
 
3633
3555
  // Support: Promises/A+ section 2.3.3.3.4.1
@@ -3655,10 +3577,17 @@ jQuery.extend( {
3655
3577
  process();
3656
3578
  } else {
3657
3579
 
3658
- // Call an optional hook to record the stack, in case of exception
3580
+ // Call an optional hook to record the error, in case of exception
3659
3581
  // since it's otherwise lost when execution goes async
3660
- if ( jQuery.Deferred.getStackHook ) {
3661
- process.stackTrace = jQuery.Deferred.getStackHook();
3582
+ if ( jQuery.Deferred.getErrorHook ) {
3583
+ process.error = jQuery.Deferred.getErrorHook();
3584
+
3585
+ // The deprecated alias of the above. While the name suggests
3586
+ // returning the stack, not an error instance, jQuery just passes
3587
+ // it directly to `console.warn` so both will work; an instance
3588
+ // just better cooperates with source maps.
3589
+ } else if ( jQuery.Deferred.getStackHook ) {
3590
+ process.error = jQuery.Deferred.getStackHook();
3662
3591
  }
3663
3592
  window.setTimeout( process );
3664
3593
  }
@@ -3792,8 +3721,8 @@ jQuery.extend( {
3792
3721
  resolveContexts = Array( i ),
3793
3722
  resolveValues = slice.call( arguments ),
3794
3723
 
3795
- // the master Deferred
3796
- master = jQuery.Deferred(),
3724
+ // the primary Deferred
3725
+ primary = jQuery.Deferred(),
3797
3726
 
3798
3727
  // subordinate callback factory
3799
3728
  updateFunc = function( i ) {
@@ -3801,30 +3730,30 @@ jQuery.extend( {
3801
3730
  resolveContexts[ i ] = this;
3802
3731
  resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3803
3732
  if ( !( --remaining ) ) {
3804
- master.resolveWith( resolveContexts, resolveValues );
3733
+ primary.resolveWith( resolveContexts, resolveValues );
3805
3734
  }
3806
3735
  };
3807
3736
  };
3808
3737
 
3809
3738
  // Single- and empty arguments are adopted like Promise.resolve
3810
3739
  if ( remaining <= 1 ) {
3811
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
3740
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
3812
3741
  !remaining );
3813
3742
 
3814
3743
  // Use .then() to unwrap secondary thenables (cf. gh-3000)
3815
- if ( master.state() === "pending" ||
3744
+ if ( primary.state() === "pending" ||
3816
3745
  isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
3817
3746
 
3818
- return master.then();
3747
+ return primary.then();
3819
3748
  }
3820
3749
  }
3821
3750
 
3822
3751
  // Multiple arguments are aggregated like Promise.all array elements
3823
3752
  while ( i-- ) {
3824
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
3753
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
3825
3754
  }
3826
3755
 
3827
- return master.promise();
3756
+ return primary.promise();
3828
3757
  }
3829
3758
  } );
3830
3759
 
@@ -3833,12 +3762,16 @@ jQuery.extend( {
3833
3762
  // warn about them ASAP rather than swallowing them by default.
3834
3763
  var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
3835
3764
 
3836
- jQuery.Deferred.exceptionHook = function( error, stack ) {
3765
+ // If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error
3766
+ // captured before the async barrier to get the original error cause
3767
+ // which may otherwise be hidden.
3768
+ jQuery.Deferred.exceptionHook = function( error, asyncError ) {
3837
3769
 
3838
3770
  // Support: IE 8 - 9 only
3839
3771
  // Console exists when dev tools are open, which can happen at any time
3840
3772
  if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
3841
- window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
3773
+ window.console.warn( "jQuery.Deferred exception: " + error.message,
3774
+ error.stack, asyncError );
3842
3775
  }
3843
3776
  };
3844
3777
 
@@ -3878,7 +3811,7 @@ jQuery.extend( {
3878
3811
  isReady: false,
3879
3812
 
3880
3813
  // A counter to track how many items to wait for before
3881
- // the ready event fires. See #6781
3814
+ // the ready event fires. See trac-6781
3882
3815
  readyWait: 1,
3883
3816
 
3884
3817
  // Handle when the DOM is ready
@@ -3965,7 +3898,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3965
3898
  // ...except when executing function values
3966
3899
  } else {
3967
3900
  bulk = fn;
3968
- fn = function( elem, key, value ) {
3901
+ fn = function( elem, _key, value ) {
3969
3902
  return bulk.call( jQuery( elem ), value );
3970
3903
  };
3971
3904
  }
@@ -3975,8 +3908,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3975
3908
  for ( ; i < len; i++ ) {
3976
3909
  fn(
3977
3910
  elems[ i ], key, raw ?
3978
- value :
3979
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
3911
+ value :
3912
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
3980
3913
  );
3981
3914
  }
3982
3915
  }
@@ -4000,13 +3933,13 @@ var rmsPrefix = /^-ms-/,
4000
3933
  rdashAlpha = /-([a-z])/g;
4001
3934
 
4002
3935
  // Used by camelCase as callback to replace()
4003
- function fcamelCase( all, letter ) {
3936
+ function fcamelCase( _all, letter ) {
4004
3937
  return letter.toUpperCase();
4005
3938
  }
4006
3939
 
4007
3940
  // Convert dashed to camelCase; used by the css and data modules
4008
3941
  // Support: IE <=9 - 11, Edge 12 - 15
4009
- // Microsoft forgot to hump their vendor prefix (#9572)
3942
+ // Microsoft forgot to hump their vendor prefix (trac-9572)
4010
3943
  function camelCase( string ) {
4011
3944
  return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
4012
3945
  }
@@ -4042,7 +3975,7 @@ Data.prototype = {
4042
3975
  value = {};
4043
3976
 
4044
3977
  // We can accept data for non-element nodes in modern browsers,
4045
- // but we should not, see #8335.
3978
+ // but we should not, see trac-8335.
4046
3979
  // Always return an empty object.
4047
3980
  if ( acceptData( owner ) ) {
4048
3981
 
@@ -4281,7 +4214,7 @@ jQuery.fn.extend( {
4281
4214
  while ( i-- ) {
4282
4215
 
4283
4216
  // Support: IE 11 only
4284
- // The attrs elements can be null (#14894)
4217
+ // The attrs elements can be null (trac-14894)
4285
4218
  if ( attrs[ i ] ) {
4286
4219
  name = attrs[ i ].name;
4287
4220
  if ( name.indexOf( "data-" ) === 0 ) {
@@ -4528,27 +4461,6 @@ var isHiddenWithinTree = function( elem, el ) {
4528
4461
  jQuery.css( elem, "display" ) === "none";
4529
4462
  };
4530
4463
 
4531
- var swap = function( elem, options, callback, args ) {
4532
- var ret, name,
4533
- old = {};
4534
-
4535
- // Remember the old values, and insert the new ones
4536
- for ( name in options ) {
4537
- old[ name ] = elem.style[ name ];
4538
- elem.style[ name ] = options[ name ];
4539
- }
4540
-
4541
- ret = callback.apply( elem, args || [] );
4542
-
4543
- // Revert the old values
4544
- for ( name in options ) {
4545
- elem.style[ name ] = old[ name ];
4546
- }
4547
-
4548
- return ret;
4549
- };
4550
-
4551
-
4552
4464
 
4553
4465
 
4554
4466
  function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4631,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
4719
4631
 
4720
4632
 
4721
4633
 
4722
- // We have to close these tags to support XHTML (#13200)
4723
- var wrapMap = {
4634
+ ( function() {
4635
+ var fragment = document.createDocumentFragment(),
4636
+ div = fragment.appendChild( document.createElement( "div" ) ),
4637
+ input = document.createElement( "input" );
4638
+
4639
+ // Support: Android 4.0 - 4.3 only
4640
+ // Check state lost if the name is set (trac-11217)
4641
+ // Support: Windows Web Apps (WWA)
4642
+ // `name` and `type` must use .setAttribute for WWA (trac-14901)
4643
+ input.setAttribute( "type", "radio" );
4644
+ input.setAttribute( "checked", "checked" );
4645
+ input.setAttribute( "name", "t" );
4646
+
4647
+ div.appendChild( input );
4648
+
4649
+ // Support: Android <=4.1 only
4650
+ // Older WebKit doesn't clone checked state correctly in fragments
4651
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4652
+
4653
+ // Support: IE <=11 only
4654
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
4655
+ div.innerHTML = "<textarea>x</textarea>";
4656
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4724
4657
 
4725
4658
  // Support: IE <=9 only
4726
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
4659
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
4660
+ // the select element.
4661
+ div.innerHTML = "<option></option>";
4662
+ support.option = !!div.lastChild;
4663
+ } )();
4664
+
4665
+
4666
+ // We have to close these tags to support XHTML (trac-13200)
4667
+ var wrapMap = {
4727
4668
 
4728
4669
  // XHTML parsers do not magically insert elements in the
4729
4670
  // same way that tag soup parsers do. So we cannot shorten
@@ -4736,17 +4677,19 @@ var wrapMap = {
4736
4677
  _default: [ 0, "", "" ]
4737
4678
  };
4738
4679
 
4739
- // Support: IE <=9 only
4740
- wrapMap.optgroup = wrapMap.option;
4741
-
4742
4680
  wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4743
4681
  wrapMap.th = wrapMap.td;
4744
4682
 
4683
+ // Support: IE <=9 only
4684
+ if ( !support.option ) {
4685
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
4686
+ }
4687
+
4745
4688
 
4746
4689
  function getAll( context, tag ) {
4747
4690
 
4748
4691
  // Support: IE <=9 - 11 only
4749
- // Use typeof to avoid zero-argument method invocation on host objects (#15151)
4692
+ // Use typeof to avoid zero-argument method invocation on host objects (trac-15151)
4750
4693
  var ret;
4751
4694
 
4752
4695
  if ( typeof context.getElementsByTagName !== "undefined" ) {
@@ -4829,7 +4772,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4829
4772
  // Remember the top-level container
4830
4773
  tmp = fragment.firstChild;
4831
4774
 
4832
- // Ensure the created nodes are orphaned (#12392)
4775
+ // Ensure the created nodes are orphaned (trac-12392)
4833
4776
  tmp.textContent = "";
4834
4777
  }
4835
4778
  }
@@ -4870,40 +4813,11 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
4870
4813
  }
4871
4814
  }
4872
4815
 
4873
- return fragment;
4874
- }
4875
-
4876
-
4877
- ( function() {
4878
- var fragment = document.createDocumentFragment(),
4879
- div = fragment.appendChild( document.createElement( "div" ) ),
4880
- input = document.createElement( "input" );
4881
-
4882
- // Support: Android 4.0 - 4.3 only
4883
- // Check state lost if the name is set (#11217)
4884
- // Support: Windows Web Apps (WWA)
4885
- // `name` and `type` must use .setAttribute for WWA (#14901)
4886
- input.setAttribute( "type", "radio" );
4887
- input.setAttribute( "checked", "checked" );
4888
- input.setAttribute( "name", "t" );
4889
-
4890
- div.appendChild( input );
4891
-
4892
- // Support: Android <=4.1 only
4893
- // Older WebKit doesn't clone checked state correctly in fragments
4894
- support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4895
-
4896
- // Support: IE <=11 only
4897
- // Make sure textarea (and checkbox) defaultValue is properly cloned
4898
- div.innerHTML = "<textarea>x</textarea>";
4899
- support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4900
- } )();
4901
-
4816
+ return fragment;
4817
+ }
4902
4818
 
4903
- var
4904
- rkeyEvent = /^key/,
4905
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
4906
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4819
+
4820
+ var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
4907
4821
 
4908
4822
  function returnTrue() {
4909
4823
  return true;
@@ -4913,25 +4827,6 @@ function returnFalse() {
4913
4827
  return false;
4914
4828
  }
4915
4829
 
4916
- // Support: IE <=9 - 11+
4917
- // focus() and blur() are asynchronous, except when they are no-op.
4918
- // So expect focus to be synchronous when the element is already active,
4919
- // and blur to be synchronous when the element is not already active.
4920
- // (focus and blur are always synchronous in other supported browsers,
4921
- // this just defines when we can count on it).
4922
- function expectSync( elem, type ) {
4923
- return ( elem === safeActiveElement() ) === ( type === "focus" );
4924
- }
4925
-
4926
- // Support: IE <=9 only
4927
- // Accessing document.activeElement can throw unexpectedly
4928
- // https://bugs.jquery.com/ticket/13393
4929
- function safeActiveElement() {
4930
- try {
4931
- return document.activeElement;
4932
- } catch ( err ) { }
4933
- }
4934
-
4935
4830
  function on( elem, types, selector, data, fn, one ) {
4936
4831
  var origFn, type;
4937
4832
 
@@ -5008,8 +4903,8 @@ jQuery.event = {
5008
4903
  special, handlers, type, namespaces, origType,
5009
4904
  elemData = dataPriv.get( elem );
5010
4905
 
5011
- // Don't attach events to noData or text/comment nodes (but allow plain objects)
5012
- if ( !elemData ) {
4906
+ // Only attach events to objects that accept data
4907
+ if ( !acceptData( elem ) ) {
5013
4908
  return;
5014
4909
  }
5015
4910
 
@@ -5033,7 +4928,7 @@ jQuery.event = {
5033
4928
 
5034
4929
  // Init the element's event structure and main handler, if this is the first
5035
4930
  if ( !( events = elemData.events ) ) {
5036
- events = elemData.events = {};
4931
+ events = elemData.events = Object.create( null );
5037
4932
  }
5038
4933
  if ( !( eventHandle = elemData.handle ) ) {
5039
4934
  eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5086,15 @@ jQuery.event = {
5191
5086
 
5192
5087
  dispatch: function( nativeEvent ) {
5193
5088
 
5194
- // Make a writable jQuery.Event from the native event object
5195
- var event = jQuery.event.fix( nativeEvent );
5196
-
5197
5089
  var i, j, ret, matched, handleObj, handlerQueue,
5198
5090
  args = new Array( arguments.length ),
5199
- handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
5091
+
5092
+ // Make a writable jQuery.Event from the native event object
5093
+ event = jQuery.event.fix( nativeEvent ),
5094
+
5095
+ handlers = (
5096
+ dataPriv.get( this, "events" ) || Object.create( null )
5097
+ )[ event.type ] || [],
5200
5098
  special = jQuery.event.special[ event.type ] || {};
5201
5099
 
5202
5100
  // Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5276,15 +5174,15 @@ jQuery.event = {
5276
5174
 
5277
5175
  for ( ; cur !== this; cur = cur.parentNode || this ) {
5278
5176
 
5279
- // Don't check non-elements (#13208)
5280
- // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
5177
+ // Don't check non-elements (trac-13208)
5178
+ // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)
5281
5179
  if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
5282
5180
  matchedHandlers = [];
5283
5181
  matchedSelectors = {};
5284
5182
  for ( i = 0; i < delegateCount; i++ ) {
5285
5183
  handleObj = handlers[ i ];
5286
5184
 
5287
- // Don't conflict with Object.prototype properties (#13203)
5185
+ // Don't conflict with Object.prototype properties (trac-13203)
5288
5186
  sel = handleObj.selector + " ";
5289
5187
 
5290
5188
  if ( matchedSelectors[ sel ] === undefined ) {
@@ -5320,12 +5218,12 @@ jQuery.event = {
5320
5218
  get: isFunction( hook ) ?
5321
5219
  function() {
5322
5220
  if ( this.originalEvent ) {
5323
- return hook( this.originalEvent );
5221
+ return hook( this.originalEvent );
5324
5222
  }
5325
5223
  } :
5326
5224
  function() {
5327
5225
  if ( this.originalEvent ) {
5328
- return this.originalEvent[ name ];
5226
+ return this.originalEvent[ name ];
5329
5227
  }
5330
5228
  },
5331
5229
 
@@ -5366,7 +5264,7 @@ jQuery.event = {
5366
5264
  el.click && nodeName( el, "input" ) ) {
5367
5265
 
5368
5266
  // dataPriv.set( el, "click", ... )
5369
- leverageNative( el, "click", returnTrue );
5267
+ leverageNative( el, "click", true );
5370
5268
  }
5371
5269
 
5372
5270
  // Return false to allow normal processing in the caller
@@ -5417,10 +5315,10 @@ jQuery.event = {
5417
5315
  // synthetic events by interrupting progress until reinvoked in response to
5418
5316
  // *native* events that it fires directly, ensuring that state changes have
5419
5317
  // already occurred before other listeners are invoked.
5420
- function leverageNative( el, type, expectSync ) {
5318
+ function leverageNative( el, type, isSetup ) {
5421
5319
 
5422
- // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
5423
- if ( !expectSync ) {
5320
+ // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add
5321
+ if ( !isSetup ) {
5424
5322
  if ( dataPriv.get( el, type ) === undefined ) {
5425
5323
  jQuery.event.add( el, type, returnTrue );
5426
5324
  }
@@ -5432,15 +5330,13 @@ function leverageNative( el, type, expectSync ) {
5432
5330
  jQuery.event.add( el, type, {
5433
5331
  namespace: false,
5434
5332
  handler: function( event ) {
5435
- var notAsync, result,
5333
+ var result,
5436
5334
  saved = dataPriv.get( this, type );
5437
5335
 
5438
5336
  if ( ( event.isTrigger & 1 ) && this[ type ] ) {
5439
5337
 
5440
5338
  // Interrupt processing of the outer synthetic .trigger()ed event
5441
- // Saved data should be false in such cases, but might be a leftover capture object
5442
- // from an async native handler (gh-4350)
5443
- if ( !saved.length ) {
5339
+ if ( !saved ) {
5444
5340
 
5445
5341
  // Store arguments for use when handling the inner native event
5446
5342
  // There will always be at least one argument (an event object), so this array
@@ -5449,27 +5345,22 @@ function leverageNative( el, type, expectSync ) {
5449
5345
  dataPriv.set( this, type, saved );
5450
5346
 
5451
5347
  // Trigger the native event and capture its result
5452
- // Support: IE <=9 - 11+
5453
- // focus() and blur() are asynchronous
5454
- notAsync = expectSync( this, type );
5455
5348
  this[ type ]();
5456
5349
  result = dataPriv.get( this, type );
5457
- if ( saved !== result || notAsync ) {
5458
- dataPriv.set( this, type, false );
5459
- } else {
5460
- result = {};
5461
- }
5350
+ dataPriv.set( this, type, false );
5351
+
5462
5352
  if ( saved !== result ) {
5463
5353
 
5464
5354
  // Cancel the outer synthetic event
5465
5355
  event.stopImmediatePropagation();
5466
5356
  event.preventDefault();
5467
- return result.value;
5357
+
5358
+ return result;
5468
5359
  }
5469
5360
 
5470
5361
  // If this is an inner synthetic event for an event with a bubbling surrogate
5471
- // (focus or blur), assume that the surrogate already propagated from triggering the
5472
- // native event and prevent that from happening again here.
5362
+ // (focus or blur), assume that the surrogate already propagated from triggering
5363
+ // the native event and prevent that from happening again here.
5473
5364
  // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
5474
5365
  // bubbling surrogate propagates *after* the non-bubbling base), but that seems
5475
5366
  // less bad than duplication.
@@ -5479,22 +5370,25 @@ function leverageNative( el, type, expectSync ) {
5479
5370
 
5480
5371
  // If this is a native event triggered above, everything is now in order
5481
5372
  // Fire an inner synthetic event with the original arguments
5482
- } else if ( saved.length ) {
5373
+ } else if ( saved ) {
5483
5374
 
5484
5375
  // ...and capture the result
5485
- dataPriv.set( this, type, {
5486
- value: jQuery.event.trigger(
5487
-
5488
- // Support: IE <=9 - 11+
5489
- // Extend with the prototype to reset the above stopImmediatePropagation()
5490
- jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
5491
- saved.slice( 1 ),
5492
- this
5493
- )
5494
- } );
5495
-
5496
- // Abort handling of the native event
5497
- event.stopImmediatePropagation();
5376
+ dataPriv.set( this, type, jQuery.event.trigger(
5377
+ saved[ 0 ],
5378
+ saved.slice( 1 ),
5379
+ this
5380
+ ) );
5381
+
5382
+ // Abort handling of the native event by all jQuery handlers while allowing
5383
+ // native handlers on the same element to run. On target, this is achieved
5384
+ // by stopping immediate propagation just on the jQuery event. However,
5385
+ // the native event is re-wrapped by a jQuery one on each level of the
5386
+ // propagation so the only way to stop it for jQuery is to stop it for
5387
+ // everyone via native `stopPropagation()`. This is not a problem for
5388
+ // focus/blur which don't bubble, but it does also stop click on checkboxes
5389
+ // and radios. We accept this limitation.
5390
+ event.stopPropagation();
5391
+ event.isImmediatePropagationStopped = returnTrue;
5498
5392
  }
5499
5393
  }
5500
5394
  } );
@@ -5532,7 +5426,7 @@ jQuery.Event = function( src, props ) {
5532
5426
 
5533
5427
  // Create target properties
5534
5428
  // Support: Safari <=6 - 7 only
5535
- // Target should not be a text node (#504, #13143)
5429
+ // Target should not be a text node (trac-504, trac-13143)
5536
5430
  this.target = ( src.target && src.target.nodeType === 3 ) ?
5537
5431
  src.target.parentNode :
5538
5432
  src.target;
@@ -5629,49 +5523,77 @@ jQuery.each( {
5629
5523
  targetTouches: true,
5630
5524
  toElement: true,
5631
5525
  touches: true,
5526
+ which: true
5527
+ }, jQuery.event.addProp );
5632
5528
 
5633
- which: function( event ) {
5634
- var button = event.button;
5529
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5635
5530
 
5636
- // Add which for key events
5637
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
5638
- return event.charCode != null ? event.charCode : event.keyCode;
5639
- }
5531
+ function focusMappedHandler( nativeEvent ) {
5532
+ if ( document.documentMode ) {
5640
5533
 
5641
- // Add which for click: 1 === left; 2 === middle; 3 === right
5642
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
5643
- if ( button & 1 ) {
5644
- return 1;
5645
- }
5534
+ // Support: IE 11+
5535
+ // Attach a single focusin/focusout handler on the document while someone wants
5536
+ // focus/blur. This is because the former are synchronous in IE while the latter
5537
+ // are async. In other browsers, all those handlers are invoked synchronously.
5646
5538
 
5647
- if ( button & 2 ) {
5648
- return 3;
5649
- }
5539
+ // `handle` from private data would already wrap the event, but we need
5540
+ // to change the `type` here.
5541
+ var handle = dataPriv.get( this, "handle" ),
5542
+ event = jQuery.event.fix( nativeEvent );
5543
+ event.type = nativeEvent.type === "focusin" ? "focus" : "blur";
5544
+ event.isSimulated = true;
5545
+
5546
+ // First, handle focusin/focusout
5547
+ handle( nativeEvent );
5548
+
5549
+ // ...then, handle focus/blur
5550
+ //
5551
+ // focus/blur don't bubble while focusin/focusout do; simulate the former by only
5552
+ // invoking the handler at the lower level.
5553
+ if ( event.target === event.currentTarget ) {
5650
5554
 
5651
- if ( button & 4 ) {
5652
- return 2;
5555
+ // The setup part calls `leverageNative`, which, in turn, calls
5556
+ // `jQuery.event.add`, so event handle will already have been set
5557
+ // by this point.
5558
+ handle( event );
5653
5559
  }
5560
+ } else {
5654
5561
 
5655
- return 0;
5562
+ // For non-IE browsers, attach a single capturing handler on the document
5563
+ // while someone wants focusin/focusout.
5564
+ jQuery.event.simulate( delegateType, nativeEvent.target,
5565
+ jQuery.event.fix( nativeEvent ) );
5656
5566
  }
5657
-
5658
- return event.which;
5659
5567
  }
5660
- }, jQuery.event.addProp );
5661
5568
 
5662
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
5663
5569
  jQuery.event.special[ type ] = {
5664
5570
 
5665
5571
  // Utilize native event if possible so blur/focus sequence is correct
5666
5572
  setup: function() {
5667
5573
 
5574
+ var attaches;
5575
+
5668
5576
  // Claim the first handler
5669
5577
  // dataPriv.set( this, "focus", ... )
5670
5578
  // dataPriv.set( this, "blur", ... )
5671
- leverageNative( this, type, expectSync );
5579
+ leverageNative( this, type, true );
5672
5580
 
5673
- // Return false to allow normal processing in the caller
5674
- return false;
5581
+ if ( document.documentMode ) {
5582
+
5583
+ // Support: IE 9 - 11+
5584
+ // We use the same native handler for focusin & focus (and focusout & blur)
5585
+ // so we need to coordinate setup & teardown parts between those events.
5586
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5587
+ attaches = dataPriv.get( this, delegateType );
5588
+ if ( !attaches ) {
5589
+ this.addEventListener( delegateType, focusMappedHandler );
5590
+ }
5591
+ dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 );
5592
+ } else {
5593
+
5594
+ // Return false to allow normal processing in the caller
5595
+ return false;
5596
+ }
5675
5597
  },
5676
5598
  trigger: function() {
5677
5599
 
@@ -5682,8 +5604,84 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
5682
5604
  return true;
5683
5605
  },
5684
5606
 
5607
+ teardown: function() {
5608
+ var attaches;
5609
+
5610
+ if ( document.documentMode ) {
5611
+ attaches = dataPriv.get( this, delegateType ) - 1;
5612
+ if ( !attaches ) {
5613
+ this.removeEventListener( delegateType, focusMappedHandler );
5614
+ dataPriv.remove( this, delegateType );
5615
+ } else {
5616
+ dataPriv.set( this, delegateType, attaches );
5617
+ }
5618
+ } else {
5619
+
5620
+ // Return false to indicate standard teardown should be applied
5621
+ return false;
5622
+ }
5623
+ },
5624
+
5625
+ // Suppress native focus or blur if we're currently inside
5626
+ // a leveraged native-event stack
5627
+ _default: function( event ) {
5628
+ return dataPriv.get( event.target, type );
5629
+ },
5630
+
5685
5631
  delegateType: delegateType
5686
5632
  };
5633
+
5634
+ // Support: Firefox <=44
5635
+ // Firefox doesn't have focus(in | out) events
5636
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
5637
+ //
5638
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
5639
+ // focus(in | out) events fire after focus & blur events,
5640
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
5641
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
5642
+ //
5643
+ // Support: IE 9 - 11+
5644
+ // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch,
5645
+ // attach a single handler for both events in IE.
5646
+ jQuery.event.special[ delegateType ] = {
5647
+ setup: function() {
5648
+
5649
+ // Handle: regular nodes (via `this.ownerDocument`), window
5650
+ // (via `this.document`) & document (via `this`).
5651
+ var doc = this.ownerDocument || this.document || this,
5652
+ dataHolder = document.documentMode ? this : doc,
5653
+ attaches = dataPriv.get( dataHolder, delegateType );
5654
+
5655
+ // Support: IE 9 - 11+
5656
+ // We use the same native handler for focusin & focus (and focusout & blur)
5657
+ // so we need to coordinate setup & teardown parts between those events.
5658
+ // Use `delegateType` as the key as `type` is already used by `leverageNative`.
5659
+ if ( !attaches ) {
5660
+ if ( document.documentMode ) {
5661
+ this.addEventListener( delegateType, focusMappedHandler );
5662
+ } else {
5663
+ doc.addEventListener( type, focusMappedHandler, true );
5664
+ }
5665
+ }
5666
+ dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 );
5667
+ },
5668
+ teardown: function() {
5669
+ var doc = this.ownerDocument || this.document || this,
5670
+ dataHolder = document.documentMode ? this : doc,
5671
+ attaches = dataPriv.get( dataHolder, delegateType ) - 1;
5672
+
5673
+ if ( !attaches ) {
5674
+ if ( document.documentMode ) {
5675
+ this.removeEventListener( delegateType, focusMappedHandler );
5676
+ } else {
5677
+ doc.removeEventListener( type, focusMappedHandler, true );
5678
+ }
5679
+ dataPriv.remove( dataHolder, delegateType );
5680
+ } else {
5681
+ dataPriv.set( dataHolder, delegateType, attaches );
5682
+ }
5683
+ }
5684
+ };
5687
5685
  } );
5688
5686
 
5689
5687
  // Create mouseenter/leave events using mouseover/out and event-time checks
@@ -5771,13 +5769,6 @@ jQuery.fn.extend( {
5771
5769
 
5772
5770
  var
5773
5771
 
5774
- /* eslint-disable max-len */
5775
-
5776
- // See https://github.com/eslint/eslint/issues/3229
5777
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
5778
-
5779
- /* eslint-enable */
5780
-
5781
5772
  // Support: IE <=10 - 11, Edge 12 - 13 only
5782
5773
  // In IE/Edge using regex groups here causes severe slowdowns.
5783
5774
  // See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5785,7 +5776,8 @@ var
5785
5776
 
5786
5777
  // checked="checked" or checked
5787
5778
  rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5788
- rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
5779
+
5780
+ rcleanScript = /^\s*<!\[CDATA\[|\]\]>\s*$/g;
5789
5781
 
5790
5782
  // Prefer a tbody over its parent table for containing new rows
5791
5783
  function manipulationTarget( elem, content ) {
@@ -5814,7 +5806,7 @@ function restoreScript( elem ) {
5814
5806
  }
5815
5807
 
5816
5808
  function cloneCopyEvent( src, dest ) {
5817
- var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
5809
+ var i, l, type, pdataOld, udataOld, udataCur, events;
5818
5810
 
5819
5811
  if ( dest.nodeType !== 1 ) {
5820
5812
  return;
@@ -5822,13 +5814,11 @@ function cloneCopyEvent( src, dest ) {
5822
5814
 
5823
5815
  // 1. Copy private data: events, handlers, etc.
5824
5816
  if ( dataPriv.hasData( src ) ) {
5825
- pdataOld = dataPriv.access( src );
5826
- pdataCur = dataPriv.set( dest, pdataOld );
5817
+ pdataOld = dataPriv.get( src );
5827
5818
  events = pdataOld.events;
5828
5819
 
5829
5820
  if ( events ) {
5830
- delete pdataCur.handle;
5831
- pdataCur.events = {};
5821
+ dataPriv.remove( dest, "handle events" );
5832
5822
 
5833
5823
  for ( type in events ) {
5834
5824
  for ( i = 0, l = events[ type ].length; i < l; i++ ) {
@@ -5864,7 +5854,7 @@ function fixInput( src, dest ) {
5864
5854
  function domManip( collection, args, callback, ignored ) {
5865
5855
 
5866
5856
  // Flatten any nested arrays
5867
- args = concat.apply( [], args );
5857
+ args = flat( args );
5868
5858
 
5869
5859
  var fragment, first, scripts, hasScripts, node, doc,
5870
5860
  i = 0,
@@ -5901,7 +5891,7 @@ function domManip( collection, args, callback, ignored ) {
5901
5891
 
5902
5892
  // Use the original fragment for the last item
5903
5893
  // instead of the first because it can end up
5904
- // being emptied incorrectly in certain situations (#8070).
5894
+ // being emptied incorrectly in certain situations (trac-8070).
5905
5895
  for ( ; i < l; i++ ) {
5906
5896
  node = fragment;
5907
5897
 
@@ -5939,9 +5929,15 @@ function domManip( collection, args, callback, ignored ) {
5939
5929
  if ( jQuery._evalUrl && !node.noModule ) {
5940
5930
  jQuery._evalUrl( node.src, {
5941
5931
  nonce: node.nonce || node.getAttribute( "nonce" )
5942
- } );
5932
+ }, doc );
5943
5933
  }
5944
5934
  } else {
5935
+
5936
+ // Unwrap a CDATA section containing script contents. This shouldn't be
5937
+ // needed as in XML documents they're already not visible when
5938
+ // inspecting element contents and in HTML documents they have no
5939
+ // meaning but we're preserving that logic for backwards compatibility.
5940
+ // This will be removed completely in 4.0. See gh-4904.
5945
5941
  DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
5946
5942
  }
5947
5943
  }
@@ -5976,7 +5972,7 @@ function remove( elem, selector, keepData ) {
5976
5972
 
5977
5973
  jQuery.extend( {
5978
5974
  htmlPrefilter: function( html ) {
5979
- return html.replace( rxhtmlTag, "<$1></$2>" );
5975
+ return html;
5980
5976
  },
5981
5977
 
5982
5978
  clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -5988,7 +5984,8 @@ jQuery.extend( {
5988
5984
  if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5989
5985
  !jQuery.isXMLDoc( elem ) ) {
5990
5986
 
5991
- // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
5987
+ // We eschew jQuery#find here for performance reasons:
5988
+ // https://jsperf.com/getall-vs-sizzle/2
5992
5989
  destElements = getAll( clone );
5993
5990
  srcElements = getAll( elem );
5994
5991
 
@@ -6224,9 +6221,12 @@ jQuery.each( {
6224
6221
  } );
6225
6222
  var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6226
6223
 
6224
+ var rcustomProp = /^--/;
6225
+
6226
+
6227
6227
  var getStyles = function( elem ) {
6228
6228
 
6229
- // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
6229
+ // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)
6230
6230
  // IE throws on elements created in popups
6231
6231
  // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
6232
6232
  var view = elem.ownerDocument.defaultView;
@@ -6238,6 +6238,27 @@ var getStyles = function( elem ) {
6238
6238
  return view.getComputedStyle( elem );
6239
6239
  };
6240
6240
 
6241
+ var swap = function( elem, options, callback ) {
6242
+ var ret, name,
6243
+ old = {};
6244
+
6245
+ // Remember the old values, and insert the new ones
6246
+ for ( name in options ) {
6247
+ old[ name ] = elem.style[ name ];
6248
+ elem.style[ name ] = options[ name ];
6249
+ }
6250
+
6251
+ ret = callback.call( elem );
6252
+
6253
+ // Revert the old values
6254
+ for ( name in options ) {
6255
+ elem.style[ name ] = old[ name ];
6256
+ }
6257
+
6258
+ return ret;
6259
+ };
6260
+
6261
+
6241
6262
  var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6242
6263
 
6243
6264
 
@@ -6295,7 +6316,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6295
6316
  }
6296
6317
 
6297
6318
  var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
6298
- reliableMarginLeftVal,
6319
+ reliableTrDimensionsVal, reliableMarginLeftVal,
6299
6320
  container = document.createElement( "div" ),
6300
6321
  div = document.createElement( "div" );
6301
6322
 
@@ -6305,7 +6326,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6305
6326
  }
6306
6327
 
6307
6328
  // Support: IE <=9 - 11 only
6308
- // Style of cloned element affects source element cloned (#8908)
6329
+ // Style of cloned element affects source element cloned (trac-8908)
6309
6330
  div.style.backgroundClip = "content-box";
6310
6331
  div.cloneNode( true ).style.backgroundClip = "";
6311
6332
  support.clearCloneStyle = div.style.backgroundClip === "content-box";
@@ -6330,6 +6351,54 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6330
6351
  scrollboxSize: function() {
6331
6352
  computeStyleTests();
6332
6353
  return scrollboxSizeVal;
6354
+ },
6355
+
6356
+ // Support: IE 9 - 11+, Edge 15 - 18+
6357
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6358
+ // set in CSS while `offset*` properties report correct values.
6359
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
6360
+ // some versions of this test; make sure not to make it pass there!
6361
+ //
6362
+ // Support: Firefox 70+
6363
+ // Only Firefox includes border widths
6364
+ // in computed dimensions. (gh-4529)
6365
+ reliableTrDimensions: function() {
6366
+ var table, tr, trChild, trStyle;
6367
+ if ( reliableTrDimensionsVal == null ) {
6368
+ table = document.createElement( "table" );
6369
+ tr = document.createElement( "tr" );
6370
+ trChild = document.createElement( "div" );
6371
+
6372
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
6373
+ tr.style.cssText = "border:1px solid";
6374
+
6375
+ // Support: Chrome 86+
6376
+ // Height set through cssText does not get applied.
6377
+ // Computed height then comes back as 0.
6378
+ tr.style.height = "1px";
6379
+ trChild.style.height = "9px";
6380
+
6381
+ // Support: Android 8 Chrome 86+
6382
+ // In our bodyBackground.html iframe,
6383
+ // display for all div elements is set to "inline",
6384
+ // which causes a problem only in Android 8 Chrome 86.
6385
+ // Ensuring the div is display: block
6386
+ // gets around this issue.
6387
+ trChild.style.display = "block";
6388
+
6389
+ documentElement
6390
+ .appendChild( table )
6391
+ .appendChild( tr )
6392
+ .appendChild( trChild );
6393
+
6394
+ trStyle = window.getComputedStyle( tr );
6395
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
6396
+ parseInt( trStyle.borderTopWidth, 10 ) +
6397
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
6398
+
6399
+ documentElement.removeChild( table );
6400
+ }
6401
+ return reliableTrDimensionsVal;
6333
6402
  }
6334
6403
  } );
6335
6404
  } )();
@@ -6337,6 +6406,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
6337
6406
 
6338
6407
  function curCSS( elem, name, computed ) {
6339
6408
  var width, minWidth, maxWidth, ret,
6409
+ isCustomProp = rcustomProp.test( name ),
6340
6410
 
6341
6411
  // Support: Firefox 51+
6342
6412
  // Retrieving style before computed somehow
@@ -6347,11 +6417,42 @@ function curCSS( elem, name, computed ) {
6347
6417
  computed = computed || getStyles( elem );
6348
6418
 
6349
6419
  // getPropertyValue is needed for:
6350
- // .css('filter') (IE 9 only, #12537)
6351
- // .css('--customProperty) (#3144)
6420
+ // .css('filter') (IE 9 only, trac-12537)
6421
+ // .css('--customProperty) (gh-3144)
6352
6422
  if ( computed ) {
6423
+
6424
+ // Support: IE <=9 - 11+
6425
+ // IE only supports `"float"` in `getPropertyValue`; in computed styles
6426
+ // it's only available as `"cssFloat"`. We no longer modify properties
6427
+ // sent to `.css()` apart from camelCasing, so we need to check both.
6428
+ // Normally, this would create difference in behavior: if
6429
+ // `getPropertyValue` returns an empty string, the value returned
6430
+ // by `.css()` would be `undefined`. This is usually the case for
6431
+ // disconnected elements. However, in IE even disconnected elements
6432
+ // with no styles return `"none"` for `getPropertyValue( "float" )`
6353
6433
  ret = computed.getPropertyValue( name ) || computed[ name ];
6354
6434
 
6435
+ if ( isCustomProp && ret ) {
6436
+
6437
+ // Support: Firefox 105+, Chrome <=105+
6438
+ // Spec requires trimming whitespace for custom properties (gh-4926).
6439
+ // Firefox only trims leading whitespace. Chrome just collapses
6440
+ // both leading & trailing whitespace to a single space.
6441
+ //
6442
+ // Fall back to `undefined` if empty string returned.
6443
+ // This collapses a missing definition with property defined
6444
+ // and set to an empty string but there's no standard API
6445
+ // allowing us to differentiate them without a performance penalty
6446
+ // and returning `undefined` aligns with older jQuery.
6447
+ //
6448
+ // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED
6449
+ // as whitespace while CSS does not, but this is not a problem
6450
+ // because CSS preprocessing replaces them with U+000A LINE FEED
6451
+ // (which *is* CSS whitespace)
6452
+ // https://www.w3.org/TR/css-syntax-3/#input-preprocessing
6453
+ ret = ret.replace( rtrimCSS, "$1" ) || undefined;
6454
+ }
6455
+
6355
6456
  if ( ret === "" && !isAttached( elem ) ) {
6356
6457
  ret = jQuery.style( elem, name );
6357
6458
  }
@@ -6447,14 +6548,13 @@ var
6447
6548
  // except "table", "table-cell", or "table-caption"
6448
6549
  // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6449
6550
  rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6450
- rcustomProp = /^--/,
6451
6551
  cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6452
6552
  cssNormalTransform = {
6453
6553
  letterSpacing: "0",
6454
6554
  fontWeight: "400"
6455
6555
  };
6456
6556
 
6457
- function setPositiveNumber( elem, value, subtract ) {
6557
+ function setPositiveNumber( _elem, value, subtract ) {
6458
6558
 
6459
6559
  // Any relative (+/-) values have already been
6460
6560
  // normalized at this point
@@ -6469,7 +6569,8 @@ function setPositiveNumber( elem, value, subtract ) {
6469
6569
  function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
6470
6570
  var i = dimension === "width" ? 1 : 0,
6471
6571
  extra = 0,
6472
- delta = 0;
6572
+ delta = 0,
6573
+ marginDelta = 0;
6473
6574
 
6474
6575
  // Adjustment may not be necessary
6475
6576
  if ( box === ( isBorderBox ? "border" : "content" ) ) {
@@ -6479,8 +6580,10 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6479
6580
  for ( ; i < 4; i += 2 ) {
6480
6581
 
6481
6582
  // Both box models exclude margin
6583
+ // Count margin delta separately to only add it after scroll gutter adjustment.
6584
+ // This is needed to make negative margins work with `outerHeight( true )` (gh-3982).
6482
6585
  if ( box === "margin" ) {
6483
- delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6586
+ marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
6484
6587
  }
6485
6588
 
6486
6589
  // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
@@ -6531,7 +6634,7 @@ function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computed
6531
6634
  ) ) || 0;
6532
6635
  }
6533
6636
 
6534
- return delta;
6637
+ return delta + marginDelta;
6535
6638
  }
6536
6639
 
6537
6640
  function getWidthOrHeight( elem, dimension, extra ) {
@@ -6559,17 +6662,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
6559
6662
  }
6560
6663
 
6561
6664
 
6562
- // Fall back to offsetWidth/offsetHeight when value is "auto"
6563
- // This happens for inline elements with no explicit setting (gh-3571)
6564
- // Support: Android <=4.1 - 4.3 only
6565
- // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6566
- // Support: IE 9-11 only
6567
- // Also use offsetWidth/offsetHeight for when box sizing is unreliable
6568
- // We use getClientRects() to check for hidden/disconnected.
6569
- // In those cases, the computed value can be trusted to be border-box
6665
+ // Support: IE 9 - 11 only
6666
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
6667
+ // In those cases, the computed value can be trusted to be border-box.
6570
6668
  if ( ( !support.boxSizingReliable() && isBorderBox ||
6669
+
6670
+ // Support: IE 10 - 11+, Edge 15 - 18+
6671
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
6672
+ // set in CSS while `offset*` properties report correct values.
6673
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
6674
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
6675
+
6676
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
6677
+ // This happens for inline elements with no explicit setting (gh-3571)
6571
6678
  val === "auto" ||
6679
+
6680
+ // Support: Android <=4.1 - 4.3 only
6681
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
6572
6682
  !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
6683
+
6684
+ // Make sure the element is visible & connected
6573
6685
  elem.getClientRects().length ) {
6574
6686
 
6575
6687
  isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
@@ -6620,26 +6732,35 @@ jQuery.extend( {
6620
6732
 
6621
6733
  // Don't automatically add "px" to these possibly-unitless properties
6622
6734
  cssNumber: {
6623
- "animationIterationCount": true,
6624
- "columnCount": true,
6625
- "fillOpacity": true,
6626
- "flexGrow": true,
6627
- "flexShrink": true,
6628
- "fontWeight": true,
6629
- "gridArea": true,
6630
- "gridColumn": true,
6631
- "gridColumnEnd": true,
6632
- "gridColumnStart": true,
6633
- "gridRow": true,
6634
- "gridRowEnd": true,
6635
- "gridRowStart": true,
6636
- "lineHeight": true,
6637
- "opacity": true,
6638
- "order": true,
6639
- "orphans": true,
6640
- "widows": true,
6641
- "zIndex": true,
6642
- "zoom": true
6735
+ animationIterationCount: true,
6736
+ aspectRatio: true,
6737
+ borderImageSlice: true,
6738
+ columnCount: true,
6739
+ flexGrow: true,
6740
+ flexShrink: true,
6741
+ fontWeight: true,
6742
+ gridArea: true,
6743
+ gridColumn: true,
6744
+ gridColumnEnd: true,
6745
+ gridColumnStart: true,
6746
+ gridRow: true,
6747
+ gridRowEnd: true,
6748
+ gridRowStart: true,
6749
+ lineHeight: true,
6750
+ opacity: true,
6751
+ order: true,
6752
+ orphans: true,
6753
+ scale: true,
6754
+ widows: true,
6755
+ zIndex: true,
6756
+ zoom: true,
6757
+
6758
+ // SVG-related
6759
+ fillOpacity: true,
6760
+ floodOpacity: true,
6761
+ stopOpacity: true,
6762
+ strokeMiterlimit: true,
6763
+ strokeOpacity: true
6643
6764
  },
6644
6765
 
6645
6766
  // Add in properties whose names you wish to fix before
@@ -6674,15 +6795,15 @@ jQuery.extend( {
6674
6795
  if ( value !== undefined ) {
6675
6796
  type = typeof value;
6676
6797
 
6677
- // Convert "+=" or "-=" to relative numbers (#7345)
6798
+ // Convert "+=" or "-=" to relative numbers (trac-7345)
6678
6799
  if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
6679
6800
  value = adjustCSS( elem, name, ret );
6680
6801
 
6681
- // Fixes bug #9237
6802
+ // Fixes bug trac-9237
6682
6803
  type = "number";
6683
6804
  }
6684
6805
 
6685
- // Make sure that null and NaN values aren't set (#7116)
6806
+ // Make sure that null and NaN values aren't set (trac-7116)
6686
6807
  if ( value == null || value !== value ) {
6687
6808
  return;
6688
6809
  }
@@ -6764,7 +6885,7 @@ jQuery.extend( {
6764
6885
  }
6765
6886
  } );
6766
6887
 
6767
- jQuery.each( [ "height", "width" ], function( i, dimension ) {
6888
+ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
6768
6889
  jQuery.cssHooks[ dimension ] = {
6769
6890
  get: function( elem, computed, extra ) {
6770
6891
  if ( computed ) {
@@ -6780,10 +6901,10 @@ jQuery.each( [ "height", "width" ], function( i, dimension ) {
6780
6901
  // Running getBoundingClientRect on a disconnected node
6781
6902
  // in IE throws an error.
6782
6903
  ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
6783
- swap( elem, cssShow, function() {
6784
- return getWidthOrHeight( elem, dimension, extra );
6785
- } ) :
6786
- getWidthOrHeight( elem, dimension, extra );
6904
+ swap( elem, cssShow, function() {
6905
+ return getWidthOrHeight( elem, dimension, extra );
6906
+ } ) :
6907
+ getWidthOrHeight( elem, dimension, extra );
6787
6908
  }
6788
6909
  },
6789
6910
 
@@ -6842,7 +6963,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
6842
6963
  swap( elem, { marginLeft: 0 }, function() {
6843
6964
  return elem.getBoundingClientRect().left;
6844
6965
  } )
6845
- ) + "px";
6966
+ ) + "px";
6846
6967
  }
6847
6968
  }
6848
6969
  );
@@ -6981,7 +7102,7 @@ Tween.propHooks = {
6981
7102
  if ( jQuery.fx.step[ tween.prop ] ) {
6982
7103
  jQuery.fx.step[ tween.prop ]( tween );
6983
7104
  } else if ( tween.elem.nodeType === 1 && (
6984
- jQuery.cssHooks[ tween.prop ] ||
7105
+ jQuery.cssHooks[ tween.prop ] ||
6985
7106
  tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
6986
7107
  jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6987
7108
  } else {
@@ -7226,7 +7347,7 @@ function defaultPrefilter( elem, props, opts ) {
7226
7347
 
7227
7348
  anim.done( function() {
7228
7349
 
7229
- /* eslint-enable no-loop-func */
7350
+ /* eslint-enable no-loop-func */
7230
7351
 
7231
7352
  // The final step of a "hide" animation is actually hiding the element
7232
7353
  if ( !hidden ) {
@@ -7306,7 +7427,7 @@ function Animation( elem, properties, options ) {
7306
7427
  remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7307
7428
 
7308
7429
  // Support: Android 2.3 only
7309
- // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
7430
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)
7310
7431
  temp = remaining / animation.duration || 0,
7311
7432
  percent = 1 - temp,
7312
7433
  index = 0,
@@ -7346,7 +7467,7 @@ function Animation( elem, properties, options ) {
7346
7467
  tweens: [],
7347
7468
  createTween: function( prop, end ) {
7348
7469
  var tween = jQuery.Tween( elem, animation.opts, prop, end,
7349
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
7470
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
7350
7471
  animation.tweens.push( tween );
7351
7472
  return tween;
7352
7473
  },
@@ -7519,7 +7640,8 @@ jQuery.fn.extend( {
7519
7640
  anim.stop( true );
7520
7641
  }
7521
7642
  };
7522
- doAnimation.finish = doAnimation;
7643
+
7644
+ doAnimation.finish = doAnimation;
7523
7645
 
7524
7646
  return empty || optall.queue === false ?
7525
7647
  this.each( doAnimation ) :
@@ -7537,7 +7659,7 @@ jQuery.fn.extend( {
7537
7659
  clearQueue = type;
7538
7660
  type = undefined;
7539
7661
  }
7540
- if ( clearQueue && type !== false ) {
7662
+ if ( clearQueue ) {
7541
7663
  this.queue( type || "fx", [] );
7542
7664
  }
7543
7665
 
@@ -7620,7 +7742,7 @@ jQuery.fn.extend( {
7620
7742
  }
7621
7743
  } );
7622
7744
 
7623
- jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
7745
+ jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
7624
7746
  var cssFn = jQuery.fn[ name ];
7625
7747
  jQuery.fn[ name ] = function( speed, easing, callback ) {
7626
7748
  return speed == null || typeof speed === "boolean" ?
@@ -7695,7 +7817,6 @@ jQuery.fx.speeds = {
7695
7817
 
7696
7818
 
7697
7819
  // Based off of the plugin by Clint Helfers, with permission.
7698
- // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
7699
7820
  jQuery.fn.delay = function( time, type ) {
7700
7821
  time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7701
7822
  type = type || "fx";
@@ -7841,7 +7962,7 @@ boolHook = {
7841
7962
  }
7842
7963
  };
7843
7964
 
7844
- jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7965
+ jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
7845
7966
  var getter = attrHandle[ name ] || jQuery.find.attr;
7846
7967
 
7847
7968
  attrHandle[ name ] = function( elem, name, isXML ) {
@@ -7920,8 +8041,7 @@ jQuery.extend( {
7920
8041
  // Support: IE <=9 - 11 only
7921
8042
  // elem.tabIndex doesn't always return the
7922
8043
  // correct value when it hasn't been explicitly set
7923
- // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
7924
- // Use proper attribute retrieval(#12072)
8044
+ // Use proper attribute retrieval (trac-12072)
7925
8045
  var tabindex = jQuery.find.attr( elem, "tabindex" );
7926
8046
 
7927
8047
  if ( tabindex ) {
@@ -8025,8 +8145,7 @@ function classesToArray( value ) {
8025
8145
 
8026
8146
  jQuery.fn.extend( {
8027
8147
  addClass: function( value ) {
8028
- var classes, elem, cur, curValue, clazz, j, finalValue,
8029
- i = 0;
8148
+ var classNames, cur, curValue, className, i, finalValue;
8030
8149
 
8031
8150
  if ( isFunction( value ) ) {
8032
8151
  return this.each( function( j ) {
@@ -8034,36 +8153,35 @@ jQuery.fn.extend( {
8034
8153
  } );
8035
8154
  }
8036
8155
 
8037
- classes = classesToArray( value );
8156
+ classNames = classesToArray( value );
8038
8157
 
8039
- if ( classes.length ) {
8040
- while ( ( elem = this[ i++ ] ) ) {
8041
- curValue = getClass( elem );
8042
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8158
+ if ( classNames.length ) {
8159
+ return this.each( function() {
8160
+ curValue = getClass( this );
8161
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8043
8162
 
8044
8163
  if ( cur ) {
8045
- j = 0;
8046
- while ( ( clazz = classes[ j++ ] ) ) {
8047
- if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8048
- cur += clazz + " ";
8164
+ for ( i = 0; i < classNames.length; i++ ) {
8165
+ className = classNames[ i ];
8166
+ if ( cur.indexOf( " " + className + " " ) < 0 ) {
8167
+ cur += className + " ";
8049
8168
  }
8050
8169
  }
8051
8170
 
8052
8171
  // Only assign if different to avoid unneeded rendering.
8053
8172
  finalValue = stripAndCollapse( cur );
8054
8173
  if ( curValue !== finalValue ) {
8055
- elem.setAttribute( "class", finalValue );
8174
+ this.setAttribute( "class", finalValue );
8056
8175
  }
8057
8176
  }
8058
- }
8177
+ } );
8059
8178
  }
8060
8179
 
8061
8180
  return this;
8062
8181
  },
8063
8182
 
8064
8183
  removeClass: function( value ) {
8065
- var classes, elem, cur, curValue, clazz, j, finalValue,
8066
- i = 0;
8184
+ var classNames, cur, curValue, className, i, finalValue;
8067
8185
 
8068
8186
  if ( isFunction( value ) ) {
8069
8187
  return this.each( function( j ) {
@@ -8075,45 +8193,42 @@ jQuery.fn.extend( {
8075
8193
  return this.attr( "class", "" );
8076
8194
  }
8077
8195
 
8078
- classes = classesToArray( value );
8196
+ classNames = classesToArray( value );
8079
8197
 
8080
- if ( classes.length ) {
8081
- while ( ( elem = this[ i++ ] ) ) {
8082
- curValue = getClass( elem );
8198
+ if ( classNames.length ) {
8199
+ return this.each( function() {
8200
+ curValue = getClass( this );
8083
8201
 
8084
8202
  // This expression is here for better compressibility (see addClass)
8085
- cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8203
+ cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
8086
8204
 
8087
8205
  if ( cur ) {
8088
- j = 0;
8089
- while ( ( clazz = classes[ j++ ] ) ) {
8206
+ for ( i = 0; i < classNames.length; i++ ) {
8207
+ className = classNames[ i ];
8090
8208
 
8091
8209
  // Remove *all* instances
8092
- while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
8093
- cur = cur.replace( " " + clazz + " ", " " );
8210
+ while ( cur.indexOf( " " + className + " " ) > -1 ) {
8211
+ cur = cur.replace( " " + className + " ", " " );
8094
8212
  }
8095
8213
  }
8096
8214
 
8097
8215
  // Only assign if different to avoid unneeded rendering.
8098
8216
  finalValue = stripAndCollapse( cur );
8099
8217
  if ( curValue !== finalValue ) {
8100
- elem.setAttribute( "class", finalValue );
8218
+ this.setAttribute( "class", finalValue );
8101
8219
  }
8102
8220
  }
8103
- }
8221
+ } );
8104
8222
  }
8105
8223
 
8106
8224
  return this;
8107
8225
  },
8108
8226
 
8109
8227
  toggleClass: function( value, stateVal ) {
8110
- var type = typeof value,
8228
+ var classNames, className, i, self,
8229
+ type = typeof value,
8111
8230
  isValidValue = type === "string" || Array.isArray( value );
8112
8231
 
8113
- if ( typeof stateVal === "boolean" && isValidValue ) {
8114
- return stateVal ? this.addClass( value ) : this.removeClass( value );
8115
- }
8116
-
8117
8232
  if ( isFunction( value ) ) {
8118
8233
  return this.each( function( i ) {
8119
8234
  jQuery( this ).toggleClass(
@@ -8123,17 +8238,20 @@ jQuery.fn.extend( {
8123
8238
  } );
8124
8239
  }
8125
8240
 
8126
- return this.each( function() {
8127
- var className, i, self, classNames;
8241
+ if ( typeof stateVal === "boolean" && isValidValue ) {
8242
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
8243
+ }
8244
+
8245
+ classNames = classesToArray( value );
8128
8246
 
8247
+ return this.each( function() {
8129
8248
  if ( isValidValue ) {
8130
8249
 
8131
8250
  // Toggle individual class names
8132
- i = 0;
8133
8251
  self = jQuery( this );
8134
- classNames = classesToArray( value );
8135
8252
 
8136
- while ( ( className = classNames[ i++ ] ) ) {
8253
+ for ( i = 0; i < classNames.length; i++ ) {
8254
+ className = classNames[ i ];
8137
8255
 
8138
8256
  // Check each className given, space separated list
8139
8257
  if ( self.hasClass( className ) ) {
@@ -8159,8 +8277,8 @@ jQuery.fn.extend( {
8159
8277
  if ( this.setAttribute ) {
8160
8278
  this.setAttribute( "class",
8161
8279
  className || value === false ?
8162
- "" :
8163
- dataPriv.get( this, "__className__" ) || ""
8280
+ "" :
8281
+ dataPriv.get( this, "__className__" ) || ""
8164
8282
  );
8165
8283
  }
8166
8284
  }
@@ -8175,7 +8293,7 @@ jQuery.fn.extend( {
8175
8293
  while ( ( elem = this[ i++ ] ) ) {
8176
8294
  if ( elem.nodeType === 1 &&
8177
8295
  ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
8178
- return true;
8296
+ return true;
8179
8297
  }
8180
8298
  }
8181
8299
 
@@ -8267,7 +8385,7 @@ jQuery.extend( {
8267
8385
  val :
8268
8386
 
8269
8387
  // Support: IE <=10 - 11 only
8270
- // option.text throws exceptions (#14686, #14858)
8388
+ // option.text throws exceptions (trac-14686, trac-14858)
8271
8389
  // Strip and collapse whitespace
8272
8390
  // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
8273
8391
  stripAndCollapse( jQuery.text( elem ) );
@@ -8294,7 +8412,7 @@ jQuery.extend( {
8294
8412
  option = options[ i ];
8295
8413
 
8296
8414
  // Support: IE <=9 only
8297
- // IE8-9 doesn't update selected after form reset (#2551)
8415
+ // IE8-9 doesn't update selected after form reset (trac-2551)
8298
8416
  if ( ( option.selected || i === index ) &&
8299
8417
 
8300
8418
  // Don't return options that are disabled or in a disabled optgroup
@@ -8368,9 +8486,39 @@ jQuery.each( [ "radio", "checkbox" ], function() {
8368
8486
 
8369
8487
 
8370
8488
  // Return jQuery for attributes-only inclusion
8489
+ var location = window.location;
8490
+
8491
+ var nonce = { guid: Date.now() };
8492
+
8493
+ var rquery = ( /\?/ );
8494
+
8495
+
8496
+
8497
+ // Cross-browser xml parsing
8498
+ jQuery.parseXML = function( data ) {
8499
+ var xml, parserErrorElem;
8500
+ if ( !data || typeof data !== "string" ) {
8501
+ return null;
8502
+ }
8371
8503
 
8504
+ // Support: IE 9 - 11 only
8505
+ // IE throws on parseFromString with invalid input.
8506
+ try {
8507
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8508
+ } catch ( e ) {}
8372
8509
 
8373
- support.focusin = "onfocusin" in window;
8510
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
8511
+ if ( !xml || parserErrorElem ) {
8512
+ jQuery.error( "Invalid XML: " + (
8513
+ parserErrorElem ?
8514
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
8515
+ return el.textContent;
8516
+ } ).join( "\n" ) :
8517
+ data
8518
+ ) );
8519
+ }
8520
+ return xml;
8521
+ };
8374
8522
 
8375
8523
 
8376
8524
  var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
@@ -8437,8 +8585,8 @@ jQuery.extend( jQuery.event, {
8437
8585
  return;
8438
8586
  }
8439
8587
 
8440
- // Determine event propagation path in advance, per W3C events spec (#9951)
8441
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
8588
+ // Determine event propagation path in advance, per W3C events spec (trac-9951)
8589
+ // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)
8442
8590
  if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
8443
8591
 
8444
8592
  bubbleType = special.delegateType || type;
@@ -8465,7 +8613,7 @@ jQuery.extend( jQuery.event, {
8465
8613
  special.bindType || type;
8466
8614
 
8467
8615
  // jQuery handler
8468
- handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
8616
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
8469
8617
  dataPriv.get( cur, "handle" );
8470
8618
  if ( handle ) {
8471
8619
  handle.apply( cur, data );
@@ -8490,7 +8638,7 @@ jQuery.extend( jQuery.event, {
8490
8638
  acceptData( elem ) ) {
8491
8639
 
8492
8640
  // Call a native DOM method on the target with the same name as the event.
8493
- // Don't do default actions on window, that's where global variables be (#6170)
8641
+ // Don't do default actions on window, that's where global variables be (trac-6170)
8494
8642
  if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
8495
8643
 
8496
8644
  // Don't re-trigger an onFOO event when we call its FOO() method
@@ -8558,77 +8706,6 @@ jQuery.fn.extend( {
8558
8706
  } );
8559
8707
 
8560
8708
 
8561
- // Support: Firefox <=44
8562
- // Firefox doesn't have focus(in | out) events
8563
- // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
8564
- //
8565
- // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
8566
- // focus(in | out) events fire after focus & blur events,
8567
- // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
8568
- // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
8569
- if ( !support.focusin ) {
8570
- jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
8571
-
8572
- // Attach a single capturing handler on the document while someone wants focusin/focusout
8573
- var handler = function( event ) {
8574
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
8575
- };
8576
-
8577
- jQuery.event.special[ fix ] = {
8578
- setup: function() {
8579
- var doc = this.ownerDocument || this,
8580
- attaches = dataPriv.access( doc, fix );
8581
-
8582
- if ( !attaches ) {
8583
- doc.addEventListener( orig, handler, true );
8584
- }
8585
- dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
8586
- },
8587
- teardown: function() {
8588
- var doc = this.ownerDocument || this,
8589
- attaches = dataPriv.access( doc, fix ) - 1;
8590
-
8591
- if ( !attaches ) {
8592
- doc.removeEventListener( orig, handler, true );
8593
- dataPriv.remove( doc, fix );
8594
-
8595
- } else {
8596
- dataPriv.access( doc, fix, attaches );
8597
- }
8598
- }
8599
- };
8600
- } );
8601
- }
8602
- var location = window.location;
8603
-
8604
- var nonce = Date.now();
8605
-
8606
- var rquery = ( /\?/ );
8607
-
8608
-
8609
-
8610
- // Cross-browser xml parsing
8611
- jQuery.parseXML = function( data ) {
8612
- var xml;
8613
- if ( !data || typeof data !== "string" ) {
8614
- return null;
8615
- }
8616
-
8617
- // Support: IE 9 - 11 only
8618
- // IE throws on parseFromString with invalid input.
8619
- try {
8620
- xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
8621
- } catch ( e ) {
8622
- xml = undefined;
8623
- }
8624
-
8625
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
8626
- jQuery.error( "Invalid XML: " + data );
8627
- }
8628
- return xml;
8629
- };
8630
-
8631
-
8632
8709
  var
8633
8710
  rbracket = /\[\]$/,
8634
8711
  rCRLF = /\r?\n/g,
@@ -8724,16 +8801,14 @@ jQuery.fn.extend( {
8724
8801
  // Can add propHook for "elements" to filter or add form elements
8725
8802
  var elements = jQuery.prop( this, "elements" );
8726
8803
  return elements ? jQuery.makeArray( elements ) : this;
8727
- } )
8728
- .filter( function() {
8804
+ } ).filter( function() {
8729
8805
  var type = this.type;
8730
8806
 
8731
8807
  // Use .is( ":disabled" ) so that fieldset[disabled] works
8732
8808
  return this.name && !jQuery( this ).is( ":disabled" ) &&
8733
8809
  rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8734
8810
  ( this.checked || !rcheckableType.test( type ) );
8735
- } )
8736
- .map( function( i, elem ) {
8811
+ } ).map( function( _i, elem ) {
8737
8812
  var val = jQuery( this ).val();
8738
8813
 
8739
8814
  if ( val == null ) {
@@ -8758,7 +8833,7 @@ var
8758
8833
  rantiCache = /([?&])_=[^&]*/,
8759
8834
  rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
8760
8835
 
8761
- // #7653, #8125, #8152: local protocol detection
8836
+ // trac-7653, trac-8125, trac-8152: local protocol detection
8762
8837
  rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8763
8838
  rnoContent = /^(?:GET|HEAD)$/,
8764
8839
  rprotocol = /^\/\//,
@@ -8781,12 +8856,13 @@ var
8781
8856
  */
8782
8857
  transports = {},
8783
8858
 
8784
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8859
+ // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression
8785
8860
  allTypes = "*/".concat( "*" ),
8786
8861
 
8787
8862
  // Anchor tag for parsing the document origin
8788
8863
  originAnchor = document.createElement( "a" );
8789
- originAnchor.href = location.href;
8864
+
8865
+ originAnchor.href = location.href;
8790
8866
 
8791
8867
  // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8792
8868
  function addToPrefiltersOrTransports( structure ) {
@@ -8851,7 +8927,7 @@ function inspectPrefiltersOrTransports( structure, options, originalOptions, jqX
8851
8927
 
8852
8928
  // A special extend for ajax options
8853
8929
  // that takes "flat" options (not to be deep extended)
8854
- // Fixes #9887
8930
+ // Fixes trac-9887
8855
8931
  function ajaxExtend( target, src ) {
8856
8932
  var key, deep,
8857
8933
  flatOptions = jQuery.ajaxSettings.flatOptions || {};
@@ -9167,8 +9243,8 @@ jQuery.extend( {
9167
9243
  // Context for global events is callbackContext if it is a DOM node or jQuery collection
9168
9244
  globalEventContext = s.context &&
9169
9245
  ( callbackContext.nodeType || callbackContext.jquery ) ?
9170
- jQuery( callbackContext ) :
9171
- jQuery.event,
9246
+ jQuery( callbackContext ) :
9247
+ jQuery.event,
9172
9248
 
9173
9249
  // Deferreds
9174
9250
  deferred = jQuery.Deferred(),
@@ -9262,12 +9338,12 @@ jQuery.extend( {
9262
9338
  deferred.promise( jqXHR );
9263
9339
 
9264
9340
  // Add protocol if not provided (prefilters might expect it)
9265
- // Handle falsy url in the settings object (#10093: consistency with old signature)
9341
+ // Handle falsy url in the settings object (trac-10093: consistency with old signature)
9266
9342
  // We also use the url parameter if available
9267
9343
  s.url = ( ( url || s.url || location.href ) + "" )
9268
9344
  .replace( rprotocol, location.protocol + "//" );
9269
9345
 
9270
- // Alias method option to type as per ticket #12004
9346
+ // Alias method option to type as per ticket trac-12004
9271
9347
  s.type = options.method || options.type || s.method || s.type;
9272
9348
 
9273
9349
  // Extract dataTypes list
@@ -9310,7 +9386,7 @@ jQuery.extend( {
9310
9386
  }
9311
9387
 
9312
9388
  // We can fire global events as of now if asked to
9313
- // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
9389
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)
9314
9390
  fireGlobals = jQuery.event && s.global;
9315
9391
 
9316
9392
  // Watch for a new set of requests
@@ -9339,14 +9415,15 @@ jQuery.extend( {
9339
9415
  if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
9340
9416
  cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
9341
9417
 
9342
- // #9682: remove data so that it's not used in an eventual retry
9418
+ // trac-9682: remove data so that it's not used in an eventual retry
9343
9419
  delete s.data;
9344
9420
  }
9345
9421
 
9346
9422
  // Add or update anti-cache param if needed
9347
9423
  if ( s.cache === false ) {
9348
9424
  cacheURL = cacheURL.replace( rantiCache, "$1" );
9349
- uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
9425
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
9426
+ uncached;
9350
9427
  }
9351
9428
 
9352
9429
  // Put hash and anti-cache on the URL that will be requested (gh-1732)
@@ -9479,6 +9556,13 @@ jQuery.extend( {
9479
9556
  response = ajaxHandleResponses( s, jqXHR, responses );
9480
9557
  }
9481
9558
 
9559
+ // Use a noop converter for missing script but not if jsonp
9560
+ if ( !isSuccess &&
9561
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
9562
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
9563
+ s.converters[ "text script" ] = function() {};
9564
+ }
9565
+
9482
9566
  // Convert no matter what (that way responseXXX fields are always set)
9483
9567
  response = ajaxConvert( s, response, jqXHR, isSuccess );
9484
9568
 
@@ -9569,7 +9653,7 @@ jQuery.extend( {
9569
9653
  }
9570
9654
  } );
9571
9655
 
9572
- jQuery.each( [ "get", "post" ], function( i, method ) {
9656
+ jQuery.each( [ "get", "post" ], function( _i, method ) {
9573
9657
  jQuery[ method ] = function( url, data, callback, type ) {
9574
9658
 
9575
9659
  // Shift arguments if data argument was omitted
@@ -9590,12 +9674,21 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
9590
9674
  };
9591
9675
  } );
9592
9676
 
9677
+ jQuery.ajaxPrefilter( function( s ) {
9678
+ var i;
9679
+ for ( i in s.headers ) {
9680
+ if ( i.toLowerCase() === "content-type" ) {
9681
+ s.contentType = s.headers[ i ] || "";
9682
+ }
9683
+ }
9684
+ } );
9685
+
9593
9686
 
9594
- jQuery._evalUrl = function( url, options ) {
9687
+ jQuery._evalUrl = function( url, options, doc ) {
9595
9688
  return jQuery.ajax( {
9596
9689
  url: url,
9597
9690
 
9598
- // Make this explicit, since user can override this through ajaxSetup (#11264)
9691
+ // Make this explicit, since user can override this through ajaxSetup (trac-11264)
9599
9692
  type: "GET",
9600
9693
  dataType: "script",
9601
9694
  cache: true,
@@ -9609,7 +9702,7 @@ jQuery._evalUrl = function( url, options ) {
9609
9702
  "text script": function() {}
9610
9703
  },
9611
9704
  dataFilter: function( response ) {
9612
- jQuery.globalEval( response, options );
9705
+ jQuery.globalEval( response, options, doc );
9613
9706
  }
9614
9707
  } );
9615
9708
  };
@@ -9704,7 +9797,7 @@ var xhrSuccessStatus = {
9704
9797
  0: 200,
9705
9798
 
9706
9799
  // Support: IE <=9 only
9707
- // #1450: sometimes IE returns 1223 when it should be 204
9800
+ // trac-1450: sometimes IE returns 1223 when it should be 204
9708
9801
  1223: 204
9709
9802
  },
9710
9803
  xhrSupported = jQuery.ajaxSettings.xhr();
@@ -9776,7 +9869,7 @@ jQuery.ajaxTransport( function( options ) {
9776
9869
  } else {
9777
9870
  complete(
9778
9871
 
9779
- // File: protocol always yields status 0; see #8605, #14207
9872
+ // File: protocol always yields status 0; see trac-8605, trac-14207
9780
9873
  xhr.status,
9781
9874
  xhr.statusText
9782
9875
  );
@@ -9837,7 +9930,7 @@ jQuery.ajaxTransport( function( options ) {
9837
9930
  xhr.send( options.hasContent && options.data || null );
9838
9931
  } catch ( e ) {
9839
9932
 
9840
- // #14683: Only rethrow if this hasn't been notified as an error yet
9933
+ // trac-14683: Only rethrow if this hasn't been notified as an error yet
9841
9934
  if ( callback ) {
9842
9935
  throw e;
9843
9936
  }
@@ -9931,7 +10024,7 @@ var oldCallbacks = [],
9931
10024
  jQuery.ajaxSetup( {
9932
10025
  jsonp: "callback",
9933
10026
  jsonpCallback: function() {
9934
- var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
10027
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
9935
10028
  this[ callback ] = true;
9936
10029
  return callback;
9937
10030
  }
@@ -10148,23 +10241,6 @@ jQuery.fn.load = function( url, params, callback ) {
10148
10241
 
10149
10242
 
10150
10243
 
10151
- // Attach a bunch of functions for handling common AJAX events
10152
- jQuery.each( [
10153
- "ajaxStart",
10154
- "ajaxStop",
10155
- "ajaxComplete",
10156
- "ajaxError",
10157
- "ajaxSuccess",
10158
- "ajaxSend"
10159
- ], function( i, type ) {
10160
- jQuery.fn[ type ] = function( fn ) {
10161
- return this.on( type, fn );
10162
- };
10163
- } );
10164
-
10165
-
10166
-
10167
-
10168
10244
  jQuery.expr.pseudos.animated = function( elem ) {
10169
10245
  return jQuery.grep( jQuery.timers, function( fn ) {
10170
10246
  return elem === fn.elem;
@@ -10371,7 +10447,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(
10371
10447
  // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
10372
10448
  // getComputedStyle returns percent when specified for top/left/bottom/right;
10373
10449
  // rather than make the css module depend on the offset module, just check for it here
10374
- jQuery.each( [ "top", "left" ], function( i, prop ) {
10450
+ jQuery.each( [ "top", "left" ], function( _i, prop ) {
10375
10451
  jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10376
10452
  function( elem, computed ) {
10377
10453
  if ( computed ) {
@@ -10389,8 +10465,11 @@ jQuery.each( [ "top", "left" ], function( i, prop ) {
10389
10465
 
10390
10466
  // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10391
10467
  jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10392
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
10393
- function( defaultExtra, funcName ) {
10468
+ jQuery.each( {
10469
+ padding: "inner" + name,
10470
+ content: type,
10471
+ "": "outer" + name
10472
+ }, function( defaultExtra, funcName ) {
10394
10473
 
10395
10474
  // Margin is only for outerHeight, outerWidth
10396
10475
  jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10434,25 +10513,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10434
10513
  } );
10435
10514
 
10436
10515
 
10437
- jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
10438
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10439
- "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10440
- function( i, name ) {
10441
-
10442
- // Handle event binding
10443
- jQuery.fn[ name ] = function( data, fn ) {
10444
- return arguments.length > 0 ?
10445
- this.on( name, null, data, fn ) :
10446
- this.trigger( name );
10516
+ jQuery.each( [
10517
+ "ajaxStart",
10518
+ "ajaxStop",
10519
+ "ajaxComplete",
10520
+ "ajaxError",
10521
+ "ajaxSuccess",
10522
+ "ajaxSend"
10523
+ ], function( _i, type ) {
10524
+ jQuery.fn[ type ] = function( fn ) {
10525
+ return this.on( type, fn );
10447
10526
  };
10448
10527
  } );
10449
10528
 
10450
- jQuery.fn.extend( {
10451
- hover: function( fnOver, fnOut ) {
10452
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10453
- }
10454
- } );
10455
-
10456
10529
 
10457
10530
 
10458
10531
 
@@ -10474,9 +10547,37 @@ jQuery.fn.extend( {
10474
10547
  return arguments.length === 1 ?
10475
10548
  this.off( selector, "**" ) :
10476
10549
  this.off( types, selector || "**", fn );
10550
+ },
10551
+
10552
+ hover: function( fnOver, fnOut ) {
10553
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
10477
10554
  }
10478
10555
  } );
10479
10556
 
10557
+ jQuery.each(
10558
+ ( "blur focus focusin focusout resize scroll click dblclick " +
10559
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
10560
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
10561
+ function( _i, name ) {
10562
+
10563
+ // Handle event binding
10564
+ jQuery.fn[ name ] = function( data, fn ) {
10565
+ return arguments.length > 0 ?
10566
+ this.on( name, null, data, fn ) :
10567
+ this.trigger( name );
10568
+ };
10569
+ }
10570
+ );
10571
+
10572
+
10573
+
10574
+
10575
+ // Support: Android <=4.0 only
10576
+ // Make sure we trim BOM and NBSP
10577
+ // Require that the "whitespace run" starts from a non-whitespace
10578
+ // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position.
10579
+ var rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g;
10580
+
10480
10581
  // Bind a function to a context, optionally partially applying any
10481
10582
  // arguments.
10482
10583
  // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10640,11 @@ jQuery.isNumeric = function( obj ) {
10539
10640
  !isNaN( obj - parseFloat( obj ) );
10540
10641
  };
10541
10642
 
10643
+ jQuery.trim = function( text ) {
10644
+ return text == null ?
10645
+ "" :
10646
+ ( text + "" ).replace( rtrim, "$1" );
10647
+ };
10542
10648
 
10543
10649
 
10544
10650
 
@@ -10585,9 +10691,9 @@ jQuery.noConflict = function( deep ) {
10585
10691
  };
10586
10692
 
10587
10693
  // Expose jQuery and $ identifiers, even in AMD
10588
- // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10589
- // and CommonJS for browser emulators (#13566)
10590
- if ( !noGlobal ) {
10694
+ // (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)
10695
+ // and CommonJS for browser emulators (trac-13566)
10696
+ if ( typeof noGlobal === "undefined" ) {
10591
10697
  window.jQuery = window.$ = jQuery;
10592
10698
  }
10593
10699