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