This is an automated email from the ASF dual-hosted git repository.

adityasharma pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 54307be  Fixed: Check embedded Javascript libs vulnerabilities using 
retire.js (OFBIZ-11752)
54307be is described below

commit 54307be1c222d97f5b6f262398d1c3ae122136bf
Author: Aditya Sharma <adityasha...@apache.org>
AuthorDate: Tue Jun 9 15:29:09 2020 +0530

    Fixed: Check embedded Javascript libs vulnerabilities using retire.js 
(OFBIZ-11752)
    
    * Fixed: Check embedded Javascript libs vulnerabilities using retire.js
    (OFBIZ-11752)
    
    Upgraded jQuery to 3.5.2 and jQuery migrate to 3.3.0 to vulnerabilities of 
medium severity
    Regex in its jQuery.htmlPrefilter sometimes may introduce XSS; 
https://blog.jquery.com/2020/04/10/jquery-3-5-0-released/
    
    * Fixed: console error TypeError: document is undefined
    (OFBIZ-11752)
    
    As the document object was not passed to the IFFE call for the FORMALIZE 
function, it gives console error for the missing document object when accessed
---
 .../webapp/common/js/jquery/jquery-3.4.1.min.js    |    2 -
 .../js/jquery/{jquery-3.4.1.js => jquery-3.5.1.js} | 1238 ++++++++++++--------
 .../webapp/common/js/jquery/jquery-3.5.1.min.js    |    2 +
 .../common/js/jquery/jquery-migrate-3.0.0.js       |  540 ---------
 .../common/js/jquery/jquery-migrate-3.0.0.min.js   |    2 -
 .../common/js/jquery/jquery-migrate-3.3.0.js       |  838 +++++++++++++
 .../common/js/jquery/jquery-migrate-3.3.0.min.js   |    2 +
 .../webapp/common/js/util/application.js           |    2 +-
 themes/common-theme/widget/CommonScreens.xml       |    8 +-
 themes/common-theme/widget/Theme.xml               |    6 +-
 10 files changed, 1606 insertions(+), 1034 deletions(-)

diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js
deleted file mode 100644
index a1c07fd..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | 
jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof 
module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw
 new Error("jQuery requires a window with a document");return 
t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use 
strict";var 
t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof
 e& [...]
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
similarity index 91%
rename from themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js
rename to themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
index 773ad95..5093733 100644
--- a/themes/common-theme/webapp/common/js/jquery/jquery-3.4.1.js
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v3.4.1
+ * jQuery JavaScript Library v3.5.1
  * https://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2019-05-01T21:04Z
+ * Date: 2020-05-04T22:49Z
  */
 ( function( global, factory ) {
 
@@ -47,13 +47,16 @@
 
 var arr = [];
 
-var document = window.document;
-
 var getProto = Object.getPrototypeOf;
 
 var slice = arr.slice;
 
-var concat = arr.concat;
+var flat = arr.flat ? function( array ) {
+       return arr.flat.call( array );
+} : function( array ) {
+       return arr.concat.apply( [], array );
+};
+
 
 var push = arr.push;
 
@@ -86,6 +89,8 @@ var isWindow = function isWindow( obj ) {
        };
 
 
+var document = window.document;
+
 
 
        var preservedScriptAttributes = {
@@ -142,7 +147,7 @@ function toType( obj ) {
 
 
 var
-       version = "3.4.1",
+       version = "3.5.1",
 
        // Define a local copy of jQuery
        jQuery = function( selector, context ) {
@@ -150,11 +155,7 @@ var
                // The jQuery object is actually just the init constructor 
'enhanced'
                // Need init if jQuery is called (just allow error to be thrown 
if not included)
                return new jQuery.fn.init( selector, context );
-       },
-
-       // Support: Android <=4.0 only
-       // Make sure we trim BOM and NBSP
-       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+       };
 
 jQuery.fn = jQuery.prototype = {
 
@@ -220,6 +221,18 @@ jQuery.fn = jQuery.prototype = {
                return this.eq( -1 );
        },
 
+       even: function() {
+               return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+                       return ( i + 1 ) % 2;
+               } ) );
+       },
+
+       odd: function() {
+               return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+                       return i % 2;
+               } ) );
+       },
+
        eq: function( i ) {
                var len = this.length,
                        j = +i + ( i < 0 ? len : 0 );
@@ -353,9 +366,10 @@ jQuery.extend( {
                return true;
        },
 
-       // Evaluates a script in a global context
-       globalEval: function( code, options ) {
-               DOMEval( code, { nonce: options && options.nonce } );
+       // Evaluates a script in a provided context; falls back to the global 
one
+       // if not specified.
+       globalEval: function( code, options, doc ) {
+               DOMEval( code, { nonce: options && options.nonce }, doc );
        },
 
        each: function( obj, callback ) {
@@ -379,13 +393,6 @@ jQuery.extend( {
                return obj;
        },
 
-       // Support: Android <=4.0 only
-       trim: function( text ) {
-               return text == null ?
-                       "" :
-                       ( text + "" ).replace( rtrim, "" );
-       },
-
        // results is for internal usage only
        makeArray: function( arr, results ) {
                var ret = results || [];
@@ -472,7 +479,7 @@ jQuery.extend( {
                }
 
                // Flatten any nested arrays
-               return concat.apply( [], ret );
+               return flat( ret );
        },
 
        // A global GUID counter for objects
@@ -489,7 +496,7 @@ if ( typeof Symbol === "function" ) {
 
 // Populate the class2type map
 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error 
Symbol".split( " " ),
-function( i, name ) {
+function( _i, name ) {
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
 } );
 
@@ -511,17 +518,16 @@ function isArrayLike( obj ) {
 }
 var Sizzle =
 /*!
- * Sizzle CSS Selector Engine v2.3.4
+ * Sizzle CSS Selector Engine v2.3.5
  * https://sizzlejs.com/
  *
  * Copyright JS Foundation and other contributors
  * Released under the MIT license
  * https://js.foundation/
  *
- * Date: 2019-04-08
+ * Date: 2020-03-14
  */
-(function( window ) {
-
+( function( window ) {
 var i,
        support,
        Expr,
@@ -561,59 +567,70 @@ var i,
        },
 
        // Instance methods
-       hasOwn = ({}).hasOwnProperty,
+       hasOwn = ( {} ).hasOwnProperty,
        arr = [],
        pop = arr.pop,
-       push_native = arr.push,
+       pushNative = arr.push,
        push = arr.push,
        slice = arr.slice,
+
        // Use a stripped-down indexOf as it's faster than native
        // https://jsperf.com/thor-indexof-vs-for/5
        indexOf = function( list, elem ) {
                var i = 0,
                        len = list.length;
                for ( ; i < len; i++ ) {
-                       if ( list[i] === elem ) {
+                       if ( list[ i ] === elem ) {
                                return i;
                        }
                }
                return -1;
        },
 
-       booleans = 
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+       booleans = 
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+               "ismap|loop|multiple|open|readonly|required|scoped",
 
        // Regular expressions
 
        // http://www.w3.org/TR/css3-selectors/#whitespace
        whitespace = "[\\x20\\t\\r\\n\\f]",
 
-       // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-       identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+       // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+       identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+               "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
 
        // Attribute selectors: 
http://www.w3.org/TR/selectors/#attribute-selectors
        attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + 
whitespace +
+
                // Operator (capture 2)
                "*([*^$|!~]?=)" + whitespace +
-               // "Attribute values must be CSS identifiers [capture 5] or 
strings [capture 3 or capture 4]"
-               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + 
identifier + "))|)" + whitespace +
-               "*\\]",
+
+               // "Attribute values must be CSS identifiers [capture 5]
+               // or strings [capture 3 or capture 4]"
+               "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + 
identifier + "))|)" +
+               whitespace + "*\\]",
 
        pseudos = ":(" + identifier + ")(?:\\((" +
+
                // To reduce the number of selectors needing tokenize in the 
preFilter, prefer arguments:
                // 1. quoted (capture 3; capture 4 or capture 5)
                "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
                // 2. simple (capture 6)
                "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
                // 3. anything else (capture 2)
                ".*" +
                ")\\)|)",
 
        // Leading and non-escaped trailing whitespace, capturing some 
non-whitespace characters preceding the latter
        rwhitespace = new RegExp( whitespace + "+", "g" ),
-       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 
whitespace + "+$", "g" ),
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+               whitespace + "+$", "g" ),
 
        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + 
")" + whitespace + "*" ),
+       rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + 
")" + whitespace +
+               "*" ),
        rdescend = new RegExp( whitespace + "|>" ),
 
        rpseudo = new RegExp( pseudos ),
@@ -625,14 +642,16 @@ var i,
                "TAG": new RegExp( "^(" + identifier + "|[*])" ),
                "ATTR": new RegExp( "^" + attributes ),
                "PSEUDO": new RegExp( "^" + pseudos ),
-               "CHILD": new RegExp( 
"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + 
"*(?:([+-]|)" + whitespace +
-                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+               "CHILD": new RegExp( 
"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+                       whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + 
whitespace + "*(?:([+-]|)" +
+                       whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" 
),
                "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
                // For use in libraries implementing .is()
                // We use this for POS matching in `select`
-               "needsContext": new RegExp( "^" + whitespace + 
"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-                       whitespace + "*((?:-\\d)?\\d*)" + whitespace + 
"*\\)|)(?=[^-]|$)", "i" )
+               "needsContext": new RegExp( "^" + whitespace +
+                       "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + 
whitespace +
+                       "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", 
"i" )
        },
 
        rhtml = /HTML$/i,
@@ -648,18 +667,21 @@ var i,
 
        // CSS escapes
        // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-       runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + 
whitespace + ")|.)", "ig" ),
-       funescape = function( _, escaped, escapedWhitespace ) {
-               var high = "0x" + escaped - 0x10000;
-               // NaN means non-codepoint
-               // Support: Firefox<24
-               // Workaround erroneous numeric interpretation of +"0x"
-               return high !== high || escapedWhitespace ?
-                       escaped :
+       runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + 
"?|\\\\([^\\r\\n\\f])", "g" ),
+       funescape = function( escape, nonHex ) {
+               var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+               return nonHex ?
+
+                       // Strip the backslash prefix from a non-hex escape 
sequence
+                       nonHex :
+
+                       // Replace a hexadecimal escape sequence with the 
encoded Unicode code point
+                       // Support: IE <=11+
+                       // For values outside the Basic Multilingual Plane 
(BMP), manually construct a
+                       // surrogate pair
                        high < 0 ?
-                               // BMP codepoint
                                String.fromCharCode( high + 0x10000 ) :
-                               // Supplemental Plane codepoint (surrogate pair)
                                String.fromCharCode( high >> 10 | 0xD800, high 
& 0x3FF | 0xDC00 );
        },
 
@@ -675,7 +697,8 @@ var i,
                        }
 
                        // Control characters and (dependent upon position) 
numbers get escaped as code points
-                       return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( 
ch.length - 1 ).toString( 16 ) + " ";
+                       return ch.slice( 0, -1 ) + "\\" +
+                               ch.charCodeAt( ch.length - 1 ).toString( 16 ) + 
" ";
                }
 
                // Other potentially-special ASCII characters get 
backslash-escaped
@@ -700,18 +723,20 @@ var i,
 // Optimize for push.apply( _, NodeList )
 try {
        push.apply(
-               (arr = slice.call( preferredDoc.childNodes )),
+               ( arr = slice.call( preferredDoc.childNodes ) ),
                preferredDoc.childNodes
        );
+
        // Support: Android<4.0
        // Detect silently failing push.apply
+       // eslint-disable-next-line no-unused-expressions
        arr[ preferredDoc.childNodes.length ].nodeType;
 } catch ( e ) {
        push = { apply: arr.length ?
 
                // Leverage slice if possible
                function( target, els ) {
-                       push_native.apply( target, slice.call(els) );
+                       pushNative.apply( target, slice.call( els ) );
                } :
 
                // Support: IE<9
@@ -719,8 +744,9 @@ try {
                function( target, els ) {
                        var j = target.length,
                                i = 0;
+
                        // Can't trust NodeList.length
-                       while ( (target[j++] = els[i++]) ) {}
+                       while ( ( target[ j++ ] = els[ i++ ] ) ) {}
                        target.length = j - 1;
                }
        };
@@ -744,24 +770,21 @@ function Sizzle( selector, context, results, seed ) {
 
        // Try to shortcut find operations (as opposed to filters) in HTML 
documents
        if ( !seed ) {
-
-               if ( ( context ? context.ownerDocument || context : 
preferredDoc ) !== document ) {
-                       setDocument( context );
-               }
+               setDocument( context );
                context = context || document;
 
                if ( documentIsHTML ) {
 
                        // If the selector is sufficiently simple, try using a 
"get*By*" DOM method
                        // (excepting DocumentFragment context, where the 
methods don't exist)
-                       if ( nodeType !== 11 && (match = rquickExpr.exec( 
selector )) ) {
+                       if ( nodeType !== 11 && ( match = rquickExpr.exec( 
selector ) ) ) {
 
                                // ID selector
-                               if ( (m = match[1]) ) {
+                               if ( ( m = match[ 1 ] ) ) {
 
                                        // Document context
                                        if ( nodeType === 9 ) {
-                                               if ( (elem = 
context.getElementById( m )) ) {
+                                               if ( ( elem = 
context.getElementById( m ) ) ) {
 
                                                        // Support: IE, Opera, 
Webkit
                                                        // TODO: identify 
versions
@@ -780,7 +803,7 @@ function Sizzle( selector, context, results, seed ) {
                                                // Support: IE, Opera, Webkit
                                                // TODO: identify versions
                                                // getElementById can match 
elements by name instead of ID
-                                               if ( newContext && (elem = 
newContext.getElementById( m )) &&
+                                               if ( newContext && ( elem = 
newContext.getElementById( m ) ) &&
                                                        contains( context, elem 
) &&
                                                        elem.id === m ) {
 
@@ -790,12 +813,12 @@ function Sizzle( selector, context, results, seed ) {
                                        }
 
                                // Type selector
-                               } else if ( match[2] ) {
+                               } else if ( match[ 2 ] ) {
                                        push.apply( results, 
context.getElementsByTagName( selector ) );
                                        return results;
 
                                // Class selector
-                               } else if ( (m = match[3]) && 
support.getElementsByClassName &&
+                               } else if ( ( m = match[ 3 ] ) && 
support.getElementsByClassName &&
                                        context.getElementsByClassName ) {
 
                                        push.apply( results, 
context.getElementsByClassName( m ) );
@@ -806,11 +829,11 @@ function Sizzle( selector, context, results, seed ) {
                        // Take advantage of querySelectorAll
                        if ( support.qsa &&
                                !nonnativeSelectorCache[ selector + " " ] &&
-                               (!rbuggyQSA || !rbuggyQSA.test( selector )) &&
+                               ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
 
                                // Support: IE 8 only
                                // Exclude object elements
-                               (nodeType !== 1 || 
context.nodeName.toLowerCase() !== "object") ) {
+                               ( nodeType !== 1 || 
context.nodeName.toLowerCase() !== "object" ) ) {
 
                                newSelector = selector;
                                newContext = context;
@@ -819,27 +842,36 @@ function Sizzle( selector, context, results, seed ) {
                                // descendant combinators, which is not what we 
want.
                                // In such cases, we work around the behavior 
by prefixing every selector in the
                                // list with an ID selector referencing the 
scope context.
+                               // The technique has to be used as well when a 
leading combinator is used
+                               // as such selectors are not recognized by 
querySelectorAll.
                                // Thanks to Andrew Dupont for this technique.
-                               if ( nodeType === 1 && rdescend.test( selector 
) ) {
+                               if ( nodeType === 1 &&
+                                       ( rdescend.test( selector ) || 
rcombinators.test( selector ) ) ) {
 
-                                       // Capture the context ID, setting it 
first if necessary
-                                       if ( (nid = context.getAttribute( "id" 
)) ) {
-                                               nid = nid.replace( rcssescape, 
fcssescape );
-                                       } else {
-                                               context.setAttribute( "id", 
(nid = expando) );
+                                       // Expand context for sibling selectors
+                                       newContext = rsibling.test( selector ) 
&& testContext( context.parentNode ) ||
+                                               context;
+
+                                       // We can use :scope instead of the ID 
hack if the browser
+                                       // supports it & if we're not changing 
the context.
+                                       if ( newContext !== context || 
!support.scope ) {
+
+                                               // Capture the context ID, 
setting it first if necessary
+                                               if ( ( nid = 
context.getAttribute( "id" ) ) ) {
+                                                       nid = nid.replace( 
rcssescape, fcssescape );
+                                               } else {
+                                                       context.setAttribute( 
"id", ( nid = expando ) );
+                                               }
                                        }
 
                                        // Prefix every selector in the list
                                        groups = tokenize( selector );
                                        i = groups.length;
                                        while ( i-- ) {
-                                               groups[i] = "#" + nid + " " + 
toSelector( groups[i] );
+                                               groups[ i ] = ( nid ? "#" + nid 
: ":scope" ) + " " +
+                                                       toSelector( groups[ i ] 
);
                                        }
                                        newSelector = groups.join( "," );
-
-                                       // Expand context for sibling selectors
-                                       newContext = rsibling.test( selector ) 
&& testContext( context.parentNode ) ||
-                                               context;
                                }
 
                                try {
@@ -872,12 +904,14 @@ function createCache() {
        var keys = [];
 
        function cache( key, value ) {
+
                // Use (key + " ") to avoid collision with native prototype 
properties (see Issue #157)
                if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
                        // Only keep the most recent entries
                        delete cache[ keys.shift() ];
                }
-               return (cache[ key + " " ] = value);
+               return ( cache[ key + " " ] = value );
        }
        return cache;
 }
@@ -896,17 +930,19 @@ function markFunction( fn ) {
  * @param {Function} fn Passed the created element and returns a boolean result
  */
 function assert( fn ) {
-       var el = document.createElement("fieldset");
+       var el = document.createElement( "fieldset" );
 
        try {
                return !!fn( el );
-       } catch (e) {
+       } catch ( e ) {
                return false;
        } finally {
+
                // Remove from its parent by default
                if ( el.parentNode ) {
                        el.parentNode.removeChild( el );
                }
+
                // release memory in IE
                el = null;
        }
@@ -918,11 +954,11 @@ function assert( fn ) {
  * @param {Function} handler The method that will be applied
  */
 function addHandle( attrs, handler ) {
-       var arr = attrs.split("|"),
+       var arr = attrs.split( "|" ),
                i = arr.length;
 
        while ( i-- ) {
-               Expr.attrHandle[ arr[i] ] = handler;
+               Expr.attrHandle[ arr[ i ] ] = handler;
        }
 }
 
@@ -944,7 +980,7 @@ function siblingCheck( a, b ) {
 
        // Check if b follows a
        if ( cur ) {
-               while ( (cur = cur.nextSibling) ) {
+               while ( ( cur = cur.nextSibling ) ) {
                        if ( cur === b ) {
                                return -1;
                        }
@@ -972,7 +1008,7 @@ function createInputPseudo( type ) {
 function createButtonPseudo( type ) {
        return function( elem ) {
                var name = elem.nodeName.toLowerCase();
-               return (name === "input" || name === "button") && elem.type === 
type;
+               return ( name === "input" || name === "button" ) && elem.type 
=== type;
        };
 }
 
@@ -1015,7 +1051,7 @@ function createDisabledPseudo( disabled ) {
                                        // Where there is no isDisabled, check 
manually
                                        /* jshint -W018 */
                                        elem.isDisabled !== !disabled &&
-                                               inDisabledFieldset( elem ) === 
disabled;
+                                       inDisabledFieldset( elem ) === disabled;
                        }
 
                        return elem.disabled === disabled;
@@ -1037,21 +1073,21 @@ function createDisabledPseudo( disabled ) {
  * @param {Function} fn
  */
 function createPositionalPseudo( fn ) {
-       return markFunction(function( argument ) {
+       return markFunction( function( argument ) {
                argument = +argument;
-               return markFunction(function( seed, matches ) {
+               return markFunction( function( seed, matches ) {
                        var j,
                                matchIndexes = fn( [], seed.length, argument ),
                                i = matchIndexes.length;
 
                        // Match elements found at the specified indexes
                        while ( i-- ) {
-                               if ( seed[ (j = matchIndexes[i]) ] ) {
-                                       seed[j] = !(matches[j] = seed[j]);
+                               if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+                                       seed[ j ] = !( matches[ j ] = seed[ j ] 
);
                                }
                        }
-               });
-       });
+               } );
+       } );
 }
 
 /**
@@ -1073,7 +1109,7 @@ support = Sizzle.support = {};
  */
 isXML = Sizzle.isXML = function( elem ) {
        var namespace = elem.namespaceURI,
-               docElem = (elem.ownerDocument || elem).documentElement;
+               docElem = ( elem.ownerDocument || elem ).documentElement;
 
        // Support: IE <=8
        // Assume HTML when documentElement doesn't yet exist, such as inside 
loading iframes
@@ -1091,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) {
                doc = node ? node.ownerDocument || node : preferredDoc;
 
        // Return early if doc is invalid or already selected
-       if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+       // Support: IE 11+, Edge 17 - 18+
+       // IE/Edge sometimes throw a "Permission denied" error when 
strict-comparing
+       // two documents; shallow comparisons work.
+       // eslint-disable-next-line eqeqeq
+       if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
                return document;
        }
 
@@ -1100,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) {
        docElem = document.documentElement;
        documentIsHTML = !isXML( document );
 
-       // Support: IE 9-11, Edge
+       // Support: IE 9 - 11+, Edge 12 - 18+
        // Accessing iframe documents after unload throws "permission denied" 
errors (jQuery #13936)
-       if ( preferredDoc !== document &&
-               (subWindow = document.defaultView) && subWindow.top !== 
subWindow ) {
+       // Support: IE 11+, Edge 17 - 18+
+       // IE/Edge sometimes throw a "Permission denied" error when 
strict-comparing
+       // two documents; shallow comparisons work.
+       // eslint-disable-next-line eqeqeq
+       if ( preferredDoc != document &&
+               ( subWindow = document.defaultView ) && subWindow.top !== 
subWindow ) {
 
                // Support: IE 11, Edge
                if ( subWindow.addEventListener ) {
@@ -1115,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) {
                }
        }
 
+       // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox 
<=3.6 - 31 only,
+       // Safari 4 - 5 only, Opera <=11.6 - 12.x only
+       // IE/Edge & older browsers don't support the :scope pseudo-class.
+       // Support: Safari 6.0 only
+       // Safari 6.0 supports :scope but it's an alias of :root there.
+       support.scope = assert( function( el ) {
+               docElem.appendChild( el ).appendChild( document.createElement( 
"div" ) );
+               return typeof el.querySelectorAll !== "undefined" &&
+                       !el.querySelectorAll( ":scope fieldset div" ).length;
+       } );
+
        /* Attributes
        ---------------------------------------------------------------------- 
*/
 
        // Support: IE<8
        // Verify that getAttribute really returns attributes and not properties
        // (excepting IE8 booleans)
-       support.attributes = assert(function( el ) {
+       support.attributes = assert( function( el ) {
                el.className = "i";
-               return !el.getAttribute("className");
-       });
+               return !el.getAttribute( "className" );
+       } );
 
        /* getElement(s)By*
        ---------------------------------------------------------------------- 
*/
 
        // Check if getElementsByTagName("*") returns only elements
-       support.getElementsByTagName = assert(function( el ) {
-               el.appendChild( document.createComment("") );
-               return !el.getElementsByTagName("*").length;
-       });
+       support.getElementsByTagName = assert( function( el ) {
+               el.appendChild( document.createComment( "" ) );
+               return !el.getElementsByTagName( "*" ).length;
+       } );
 
        // Support: IE<9
        support.getElementsByClassName = rnative.test( 
document.getElementsByClassName );
@@ -1142,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) {
        // Check if getElementById returns elements by name
        // The broken getElementById methods don't pick up programmatically-set 
names,
        // so use a roundabout getElementsByName test
-       support.getById = assert(function( el ) {
+       support.getById = assert( function( el ) {
                docElem.appendChild( el ).id = expando;
                return !document.getElementsByName || 
!document.getElementsByName( expando ).length;
-       });
+       } );
 
        // ID filter and find
        if ( support.getById ) {
-               Expr.filter["ID"] = function( id ) {
+               Expr.filter[ "ID" ] = function( id ) {
                        var attrId = id.replace( runescape, funescape );
                        return function( elem ) {
-                               return elem.getAttribute("id") === attrId;
+                               return elem.getAttribute( "id" ) === attrId;
                        };
                };
-               Expr.find["ID"] = function( id, context ) {
+               Expr.find[ "ID" ] = function( id, context ) {
                        if ( typeof context.getElementById !== "undefined" && 
documentIsHTML ) {
                                var elem = context.getElementById( id );
                                return elem ? [ elem ] : [];
                        }
                };
        } else {
-               Expr.filter["ID"] =  function( id ) {
+               Expr.filter[ "ID" ] =  function( id ) {
                        var attrId = id.replace( runescape, funescape );
                        return function( elem ) {
                                var node = typeof elem.getAttributeNode !== 
"undefined" &&
-                                       elem.getAttributeNode("id");
+                                       elem.getAttributeNode( "id" );
                                return node && node.value === attrId;
                        };
                };
 
                // Support: IE 6 - 7 only
                // getElementById is not reliable as a find shortcut
-               Expr.find["ID"] = function( id, context ) {
+               Expr.find[ "ID" ] = function( id, context ) {
                        if ( typeof context.getElementById !== "undefined" && 
documentIsHTML ) {
                                var node, i, elems,
                                        elem = context.getElementById( id );
@@ -1181,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                                if ( elem ) {
 
                                        // Verify the id attribute
-                                       node = elem.getAttributeNode("id");
+                                       node = elem.getAttributeNode( "id" );
                                        if ( node && node.value === id ) {
                                                return [ elem ];
                                        }
@@ -1189,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) {
                                        // Fall back on getElementsByName
                                        elems = context.getElementsByName( id );
                                        i = 0;
-                                       while ( (elem = elems[i++]) ) {
-                                               node = 
elem.getAttributeNode("id");
+                                       while ( ( elem = elems[ i++ ] ) ) {
+                                               node = elem.getAttributeNode( 
"id" );
                                                if ( node && node.value === id 
) {
                                                        return [ elem ];
                                                }
@@ -1203,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) {
        }
 
        // Tag
-       Expr.find["TAG"] = support.getElementsByTagName ?
+       Expr.find[ "TAG" ] = support.getElementsByTagName ?
                function( tag, context ) {
                        if ( typeof context.getElementsByTagName !== 
"undefined" ) {
                                return context.getElementsByTagName( tag );
@@ -1218,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) {
                        var elem,
                                tmp = [],
                                i = 0,
+
                                // By happy coincidence, a (broken) gEBTN 
appears on DocumentFragment nodes too
                                results = context.getElementsByTagName( tag );
 
                        // Filter out possible comments
                        if ( tag === "*" ) {
-                               while ( (elem = results[i++]) ) {
+                               while ( ( elem = results[ i++ ] ) ) {
                                        if ( elem.nodeType === 1 ) {
                                                tmp.push( elem );
                                        }
@@ -1235,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                };
 
        // Class
-       Expr.find["CLASS"] = support.getElementsByClassName && function( 
className, context ) {
+       Expr.find[ "CLASS" ] = support.getElementsByClassName && function( 
className, context ) {
                if ( typeof context.getElementsByClassName !== "undefined" && 
documentIsHTML ) {
                        return context.getElementsByClassName( className );
                }
@@ -1256,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) {
        // See https://bugs.jquery.com/ticket/13378
        rbuggyQSA = [];
 
-       if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+       if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
                // Build QSA regex
                // Regex strategy adopted from Diego Perini
-               assert(function( el ) {
+               assert( function( el ) {
+
+                       var input;
+
                        // Select is set to empty string on purpose
                        // This is to test IE's treatment of not explicitly
                        // setting a boolean content attribute,
@@ -1273,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // Nothing should be selected when empty strings follow 
^= or $= or *=
                        // The test attribute must be unknown in Opera but 
"safe" for WinRT
                        // 
https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-                       if ( el.querySelectorAll("[msallowcapture^='']").length 
) {
+                       if ( el.querySelectorAll( "[msallowcapture^='']" 
).length ) {
                                rbuggyQSA.push( "[*^$]=" + whitespace + 
"*(?:''|\"\")" );
                        }
 
                        // Support: IE8
                        // Boolean attributes and "value" are not treated 
correctly
-                       if ( !el.querySelectorAll("[selected]").length ) {
+                       if ( !el.querySelectorAll( "[selected]" ).length ) {
                                rbuggyQSA.push( "\\[" + whitespace + 
"*(?:value|" + booleans + ")" );
                        }
 
                        // Support: Chrome<29, Android<4.4, Safari<7.0+, 
iOS<7.0+, PhantomJS<1.9.8+
                        if ( !el.querySelectorAll( "[id~=" + expando + "-]" 
).length ) {
-                               rbuggyQSA.push("~=");
+                               rbuggyQSA.push( "~=" );
+                       }
+
+                       // Support: IE 11+, Edge 15 - 18+
+                       // IE 11/Edge don't find elements on a `[name='']` 
query in some cases.
+                       // Adding a temporary attribute to the document before 
the selection works
+                       // around the issue.
+                       // Interestingly, IE 10 & older don't seem to have the 
issue.
+                       input = document.createElement( "input" );
+                       input.setAttribute( "name", "" );
+                       el.appendChild( input );
+                       if ( !el.querySelectorAll( "[name='']" ).length ) {
+                               rbuggyQSA.push( "\\[" + whitespace + "*name" + 
whitespace + "*=" +
+                                       whitespace + "*(?:''|\"\")" );
                        }
 
                        // Webkit/Opera - :checked should return selected 
option elements
                        // 
http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        // IE8 throws error here and will not see later tests
-                       if ( !el.querySelectorAll(":checked").length ) {
-                               rbuggyQSA.push(":checked");
+                       if ( !el.querySelectorAll( ":checked" ).length ) {
+                               rbuggyQSA.push( ":checked" );
                        }
 
                        // Support: Safari 8+, iOS 8+
                        // https://bugs.webkit.org/show_bug.cgi?id=136851
                        // In-page `selector#id sibling-combinator selector` 
fails
                        if ( !el.querySelectorAll( "a#" + expando + "+*" 
).length ) {
-                               rbuggyQSA.push(".#.+[+~]");
+                               rbuggyQSA.push( ".#.+[+~]" );
                        }
-               });
 
-               assert(function( el ) {
+                       // Support: Firefox <=3.6 - 5 only
+                       // Old Firefox doesn't throw on a badly-escaped 
identifier.
+                       el.querySelectorAll( "\\\f" );
+                       rbuggyQSA.push( "[\\r\\n\\f]" );
+               } );
+
+               assert( function( el ) {
                        el.innerHTML = "<a href='' disabled='disabled'></a>" +
                                "<select 
disabled='disabled'><option/></select>";
 
                        // Support: Windows 8 Native Apps
                        // The type and name attributes are restricted during 
.innerHTML assignment
-                       var input = document.createElement("input");
+                       var input = document.createElement( "input" );
                        input.setAttribute( "type", "hidden" );
                        el.appendChild( input ).setAttribute( "name", "D" );
 
                        // Support: IE8
                        // Enforce case-sensitivity of name attribute
-                       if ( el.querySelectorAll("[name=d]").length ) {
+                       if ( el.querySelectorAll( "[name=d]" ).length ) {
                                rbuggyQSA.push( "name" + whitespace + 
"*[*^$|!~]?=" );
                        }
 
                        // FF 3.5 - :enabled/:disabled and hidden elements 
(hidden elements are still enabled)
                        // IE8 throws error here and will not see later tests
-                       if ( el.querySelectorAll(":enabled").length !== 2 ) {
+                       if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
                                rbuggyQSA.push( ":enabled", ":disabled" );
                        }
 
                        // Support: IE9-11+
                        // IE's :disabled selector does not pick up the 
children of disabled fieldsets
                        docElem.appendChild( el ).disabled = true;
-                       if ( el.querySelectorAll(":disabled").length !== 2 ) {
+                       if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
                                rbuggyQSA.push( ":enabled", ":disabled" );
                        }
 
+                       // Support: Opera 10 - 11 only
                        // Opera 10-11 does not throw on post-comma invalid 
pseudos
-                       el.querySelectorAll("*,:x");
-                       rbuggyQSA.push(",.*:");
-               });
+                       el.querySelectorAll( "*,:x" );
+                       rbuggyQSA.push( ",.*:" );
+               } );
        }
 
-       if ( (support.matchesSelector = rnative.test( (matches = 
docElem.matches ||
+       if ( ( support.matchesSelector = rnative.test( ( matches = 
docElem.matches ||
                docElem.webkitMatchesSelector ||
                docElem.mozMatchesSelector ||
                docElem.oMatchesSelector ||
-               docElem.msMatchesSelector) )) ) {
+               docElem.msMatchesSelector ) ) ) ) {
+
+               assert( function( el ) {
 
-               assert(function( el ) {
                        // Check to see if it's possible to do matchesSelector
                        // on a disconnected node (IE 9)
                        support.disconnectedMatch = matches.call( el, "*" );
@@ -1353,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) {
                        // Gecko does not error, returns false instead
                        matches.call( el, "[s!='']:x" );
                        rbuggyMatches.push( "!=", pseudos );
-               });
+               } );
        }
 
-       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-       rbuggyMatches = rbuggyMatches.length && new RegExp( 
rbuggyMatches.join("|") );
+       rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+       rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( 
"|" ) );
 
        /* Contains
        ---------------------------------------------------------------------- 
*/
@@ -1374,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) {
                                adown.contains ?
                                        adown.contains( bup ) :
                                        a.compareDocumentPosition && 
a.compareDocumentPosition( bup ) & 16
-                       ));
+                       ) );
                } :
                function( a, b ) {
                        if ( b ) {
-                               while ( (b = b.parentNode) ) {
+                               while ( ( b = b.parentNode ) ) {
                                        if ( b === a ) {
                                                return true;
                                        }
@@ -1407,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) {
                }
 
                // Calculate position if both inputs belong to the same document
-               compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) 
?
+               // Support: IE 11+, Edge 17 - 18+
+               // IE/Edge sometimes throw a "Permission denied" error when 
strict-comparing
+               // two documents; shallow comparisons work.
+               // eslint-disable-next-line eqeqeq
+               compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
                        a.compareDocumentPosition( b ) :
 
                        // Otherwise we know they are disconnected
@@ -1415,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                // Disconnected nodes
                if ( compare & 1 ||
-                       (!support.sortDetached && b.compareDocumentPosition( a 
) === compare) ) {
+                       ( !support.sortDetached && b.compareDocumentPosition( a 
) === compare ) ) {
 
                        // Choose the first element that is related to our 
preferred document
-                       if ( a === document || a.ownerDocument === preferredDoc 
&& contains(preferredDoc, a) ) {
+                       // Support: IE 11+, Edge 17 - 18+
+                       // IE/Edge sometimes throw a "Permission denied" error 
when strict-comparing
+                       // two documents; shallow comparisons work.
+                       // eslint-disable-next-line eqeqeq
+                       if ( a == document || a.ownerDocument == preferredDoc &&
+                               contains( preferredDoc, a ) ) {
                                return -1;
                        }
-                       if ( b === document || b.ownerDocument === preferredDoc 
&& contains(preferredDoc, b) ) {
+
+                       // Support: IE 11+, Edge 17 - 18+
+                       // IE/Edge sometimes throw a "Permission denied" error 
when strict-comparing
+                       // two documents; shallow comparisons work.
+                       // eslint-disable-next-line eqeqeq
+                       if ( b == document || b.ownerDocument == preferredDoc &&
+                               contains( preferredDoc, b ) ) {
                                return 1;
                        }
 
@@ -1434,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) {
                return compare & 4 ? -1 : 1;
        } :
        function( a, b ) {
+
                // Exit early if the nodes are identical
                if ( a === b ) {
                        hasDuplicate = true;
@@ -1449,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                // Parentless nodes are either documents or disconnected
                if ( !aup || !bup ) {
-                       return a === document ? -1 :
-                               b === document ? 1 :
+
+                       // Support: IE 11+, Edge 17 - 18+
+                       // IE/Edge sometimes throw a "Permission denied" error 
when strict-comparing
+                       // two documents; shallow comparisons work.
+                       /* eslint-disable eqeqeq */
+                       return a == document ? -1 :
+                               b == document ? 1 :
+                               /* eslint-enable eqeqeq */
                                aup ? -1 :
                                bup ? 1 :
                                sortInput ?
@@ -1464,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) {
 
                // Otherwise we need full lists of their ancestors for 
comparison
                cur = a;
-               while ( (cur = cur.parentNode) ) {
+               while ( ( cur = cur.parentNode ) ) {
                        ap.unshift( cur );
                }
                cur = b;
-               while ( (cur = cur.parentNode) ) {
+               while ( ( cur = cur.parentNode ) ) {
                        bp.unshift( cur );
                }
 
                // Walk down the tree looking for a discrepancy
-               while ( ap[i] === bp[i] ) {
+               while ( ap[ i ] === bp[ i ] ) {
                        i++;
                }
 
                return i ?
+
                        // Do a sibling check if the nodes have a common 
ancestor
-                       siblingCheck( ap[i], bp[i] ) :
+                       siblingCheck( ap[ i ], bp[ i ] ) :
 
                        // Otherwise nodes in our document sort first
-                       ap[i] === preferredDoc ? -1 :
-                       bp[i] === preferredDoc ? 1 :
+                       // Support: IE 11+, Edge 17 - 18+
+                       // IE/Edge sometimes throw a "Permission denied" error 
when strict-comparing
+                       // two documents; shallow comparisons work.
+                       /* eslint-disable eqeqeq */
+                       ap[ i ] == preferredDoc ? -1 :
+                       bp[ i ] == preferredDoc ? 1 :
+                       /* eslint-enable eqeqeq */
                        0;
        };
 
@@ -1495,10 +1603,7 @@ Sizzle.matches = function( expr, elements ) {
 };
 
 Sizzle.matchesSelector = function( elem, expr ) {
-       // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
-               setDocument( elem );
-       }
+       setDocument( elem );
 
        if ( support.matchesSelector && documentIsHTML &&
                !nonnativeSelectorCache[ expr + " " ] &&
@@ -1510,12 +1615,13 @@ Sizzle.matchesSelector = function( elem, expr ) {
 
                        // IE 9's matchesSelector returns false on disconnected 
nodes
                        if ( ret || support.disconnectedMatch ||
-                                       // As well, disconnected nodes are said 
to be in a document
-                                       // fragment in IE 9
-                                       elem.document && elem.document.nodeType 
!== 11 ) {
+
+                               // As well, disconnected nodes are said to be 
in a document
+                               // fragment in IE 9
+                               elem.document && elem.document.nodeType !== 11 
) {
                                return ret;
                        }
-               } catch (e) {
+               } catch ( e ) {
                        nonnativeSelectorCache( expr, true );
                }
        }
@@ -1524,20 +1630,31 @@ Sizzle.matchesSelector = function( elem, expr ) {
 };
 
 Sizzle.contains = function( context, elem ) {
+
        // Set document vars if needed
-       if ( ( context.ownerDocument || context ) !== document ) {
+       // Support: IE 11+, Edge 17 - 18+
+       // IE/Edge sometimes throw a "Permission denied" error when 
strict-comparing
+       // two documents; shallow comparisons work.
+       // eslint-disable-next-line eqeqeq
+       if ( ( context.ownerDocument || context ) != document ) {
                setDocument( context );
        }
        return contains( context, elem );
 };
 
 Sizzle.attr = function( elem, name ) {
+
        // Set document vars if needed
-       if ( ( elem.ownerDocument || elem ) !== document ) {
+       // Support: IE 11+, Edge 17 - 18+
+       // IE/Edge sometimes throw a "Permission denied" error when 
strict-comparing
+       // two documents; shallow comparisons work.
+       // eslint-disable-next-line eqeqeq
+       if ( ( elem.ownerDocument || elem ) != document ) {
                setDocument( elem );
        }
 
        var fn = Expr.attrHandle[ name.toLowerCase() ],
+
                // Don't get fooled by Object.prototype properties (jQuery 
#13807)
                val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
                        fn( elem, name, !documentIsHTML ) :
@@ -1547,13 +1664,13 @@ Sizzle.attr = function( elem, name ) {
                val :
                support.attributes || !documentIsHTML ?
                        elem.getAttribute( name ) :
-                       (val = elem.getAttributeNode(name)) && val.specified ?
+                       ( val = elem.getAttributeNode( name ) ) && 
val.specified ?
                                val.value :
                                null;
 };
 
 Sizzle.escape = function( sel ) {
-       return (sel + "").replace( rcssescape, fcssescape );
+       return ( sel + "" ).replace( rcssescape, fcssescape );
 };
 
 Sizzle.error = function( msg ) {
@@ -1576,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) {
        results.sort( sortOrder );
 
        if ( hasDuplicate ) {
-               while ( (elem = results[i++]) ) {
+               while ( ( elem = results[ i++ ] ) ) {
                        if ( elem === results[ i ] ) {
                                j = duplicates.push( i );
                        }
@@ -1604,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) {
                nodeType = elem.nodeType;
 
        if ( !nodeType ) {
+
                // If no nodeType, this is expected to be an array
-               while ( (node = elem[i++]) ) {
+               while ( ( node = elem[ i++ ] ) ) {
+
                        // Do not traverse comment nodes
                        ret += getText( node );
                }
        } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
                // Use textContent for elements
                // innerText usage removed for consistency of new lines (jQuery 
#11153)
                if ( typeof elem.textContent === "string" ) {
                        return elem.textContent;
                } else {
+
                        // Traverse its children
                        for ( elem = elem.firstChild; elem; elem = 
elem.nextSibling ) {
                                ret += getText( elem );
@@ -1623,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) {
        } else if ( nodeType === 3 || nodeType === 4 ) {
                return elem.nodeValue;
        }
+
        // Do not include comment or processing instruction nodes
 
        return ret;
@@ -1650,19 +1772,21 @@ Expr = Sizzle.selectors = {
 
        preFilter: {
                "ATTR": function( match ) {
-                       match[1] = match[1].replace( runescape, funescape );
+                       match[ 1 ] = match[ 1 ].replace( runescape, funescape );
 
                        // Move the given value to match[3] whether quoted or 
unquoted
-                       match[3] = ( match[3] || match[4] || match[5] || "" 
).replace( runescape, funescape );
+                       match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+                               match[ 5 ] || "" ).replace( runescape, 
funescape );
 
-                       if ( match[2] === "~=" ) {
-                               match[3] = " " + match[3] + " ";
+                       if ( match[ 2 ] === "~=" ) {
+                               match[ 3 ] = " " + match[ 3 ] + " ";
                        }
 
                        return match.slice( 0, 4 );
                },
 
                "CHILD": function( match ) {
+
                        /* matches from matchExpr["CHILD"]
                                1 type (only|nth|...)
                                2 what (child|of-type)
@@ -1673,22 +1797,25 @@ Expr = Sizzle.selectors = {
                                7 sign of y-component
                                8 y of y-component
                        */
-                       match[1] = match[1].toLowerCase();
+                       match[ 1 ] = match[ 1 ].toLowerCase();
+
+                       if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
 
-                       if ( match[1].slice( 0, 3 ) === "nth" ) {
                                // nth-* requires argument
-                               if ( !match[3] ) {
-                                       Sizzle.error( match[0] );
+                               if ( !match[ 3 ] ) {
+                                       Sizzle.error( match[ 0 ] );
                                }
 
                                // numeric x and y parameters for 
Expr.filter.CHILD
                                // remember that false/true cast respectively 
to 0/1
-                               match[4] = +( match[4] ? match[5] + (match[6] 
|| 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-                               match[5] = +( ( match[7] + match[8] ) || 
match[3] === "odd" );
+                               match[ 4 ] = +( match[ 4 ] ?
+                                       match[ 5 ] + ( match[ 6 ] || 1 ) :
+                                       2 * ( match[ 3 ] === "even" || match[ 3 
] === "odd" ) );
+                               match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || 
match[ 3 ] === "odd" );
 
-                       // other types prohibit arguments
-                       } else if ( match[3] ) {
-                               Sizzle.error( match[0] );
+                               // other types prohibit arguments
+                       } else if ( match[ 3 ] ) {
+                               Sizzle.error( match[ 0 ] );
                        }
 
                        return match;
@@ -1696,26 +1823,28 @@ Expr = Sizzle.selectors = {
 
                "PSEUDO": function( match ) {
                        var excess,
-                               unquoted = !match[6] && match[2];
+                               unquoted = !match[ 6 ] && match[ 2 ];
 
-                       if ( matchExpr["CHILD"].test( match[0] ) ) {
+                       if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
                                return null;
                        }
 
                        // Accept quoted arguments as-is
-                       if ( match[3] ) {
-                               match[2] = match[4] || match[5] || "";
+                       if ( match[ 3 ] ) {
+                               match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
 
                        // Strip excess characters from unquoted arguments
                        } else if ( unquoted && rpseudo.test( unquoted ) &&
+
                                // Get excess from tokenize (recursively)
-                               (excess = tokenize( unquoted, true )) &&
+                               ( excess = tokenize( unquoted, true ) ) &&
+
                                // advance to the next closing parenthesis
-                               (excess = unquoted.indexOf( ")", 
unquoted.length - excess ) - unquoted.length) ) {
+                               ( excess = unquoted.indexOf( ")", 
unquoted.length - excess ) - unquoted.length ) ) {
 
                                // excess is a negative index
-                               match[0] = match[0].slice( 0, excess );
-                               match[2] = unquoted.slice( 0, excess );
+                               match[ 0 ] = match[ 0 ].slice( 0, excess );
+                               match[ 2 ] = unquoted.slice( 0, excess );
                        }
 
                        // Return only captures needed by the pseudo filter 
method (type and argument)
@@ -1728,7 +1857,9 @@ Expr = Sizzle.selectors = {
                "TAG": function( nodeNameSelector ) {
                        var nodeName = nodeNameSelector.replace( runescape, 
funescape ).toLowerCase();
                        return nodeNameSelector === "*" ?
-                               function() { return true; } :
+                               function() {
+                                       return true;
+                               } :
                                function( elem ) {
                                        return elem.nodeName && 
elem.nodeName.toLowerCase() === nodeName;
                                };
@@ -1738,10 +1869,16 @@ Expr = Sizzle.selectors = {
                        var pattern = classCache[ className + " " ];
 
                        return pattern ||
-                               (pattern = new RegExp( "(^|" + whitespace + ")" 
+ className + "(" + whitespace + "|$)" )) &&
-                               classCache( className, function( elem ) {
-                                       return pattern.test( typeof 
elem.className === "string" && elem.className || typeof elem.getAttribute !== 
"undefined" && elem.getAttribute("class") || "" );
-                               });
+                               ( pattern = new RegExp( "(^|" + whitespace +
+                                       ")" + className + "(" + whitespace + 
"|$)" ) ) && classCache(
+                                               className, function( elem ) {
+                                                       return pattern.test(
+                                                               typeof 
elem.className === "string" && elem.className ||
+                                                               typeof 
elem.getAttribute !== "undefined" &&
+                                                                       
elem.getAttribute( "class" ) ||
+                                                               ""
+                                                       );
+                               } );
                },
 
                "ATTR": function( name, operator, check ) {
@@ -1757,6 +1894,8 @@ Expr = Sizzle.selectors = {
 
                                result += "";
 
+                               /* eslint-disable max-len */
+
                                return operator === "=" ? result === check :
                                        operator === "!=" ? result !== check :
                                        operator === "^=" ? check && 
result.indexOf( check ) === 0 :
@@ -1765,10 +1904,12 @@ Expr = Sizzle.selectors = {
                                        operator === "~=" ? ( " " + 
result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
                                        operator === "|=" ? result === check || 
result.slice( 0, check.length + 1 ) === check + "-" :
                                        false;
+                               /* eslint-enable max-len */
+
                        };
                },
 
-               "CHILD": function( type, what, argument, first, last ) {
+               "CHILD": function( type, what, _argument, first, last ) {
                        var simple = type.slice( 0, 3 ) !== "nth",
                                forward = type.slice( -4 ) !== "last",
                                ofType = what === "of-type";
@@ -1780,7 +1921,7 @@ Expr = Sizzle.selectors = {
                                        return !!elem.parentNode;
                                } :
 
-                               function( elem, context, xml ) {
+                               function( elem, _context, xml ) {
                                        var cache, uniqueCache, outerCache, 
node, nodeIndex, start,
                                                dir = simple !== forward ? 
"nextSibling" : "previousSibling",
                                                parent = elem.parentNode,
@@ -1794,7 +1935,7 @@ Expr = Sizzle.selectors = {
                                                if ( simple ) {
                                                        while ( dir ) {
                                                                node = elem;
-                                                               while ( (node = 
node[ dir ]) ) {
+                                                               while ( ( node 
= node[ dir ] ) ) {
                                                                        if ( 
ofType ?
                                                                                
node.nodeName.toLowerCase() === name :
                                                                                
node.nodeType === 1 ) {
@@ -1802,6 +1943,7 @@ Expr = Sizzle.selectors = {
                                                                                
return false;
                                                                        }
                                                                }
+
                                                                // Reverse 
direction for :only-* (if we haven't yet done so)
                                                                start = dir = 
type === "only" && !start && "nextSibling";
                                                        }
@@ -1817,22 +1959,22 @@ Expr = Sizzle.selectors = {
 
                                                        // ...in a 
gzip-friendly way
                                                        node = parent;
-                                                       outerCache = node[ 
expando ] || (node[ expando ] = {});
+                                                       outerCache = node[ 
expando ] || ( node[ expando ] = {} );
 
                                                        // Support: IE <9 only
                                                        // Defend against 
cloned attroperties (jQuery gh-1709)
                                                        uniqueCache = 
outerCache[ node.uniqueID ] ||
-                                                               (outerCache[ 
node.uniqueID ] = {});
+                                                               ( outerCache[ 
node.uniqueID ] = {} );
 
                                                        cache = uniqueCache[ 
type ] || [];
                                                        nodeIndex = cache[ 0 ] 
=== dirruns && cache[ 1 ];
                                                        diff = nodeIndex && 
cache[ 2 ];
                                                        node = nodeIndex && 
parent.childNodes[ nodeIndex ];
 
-                                                       while ( (node = 
++nodeIndex && node && node[ dir ] ||
+                                                       while ( ( node = 
++nodeIndex && node && node[ dir ] ||
 
                                                                // Fallback to 
seeking `elem` from the start
-                                                               (diff = 
nodeIndex = 0) || start.pop()) ) {
+                                                               ( diff = 
nodeIndex = 0 ) || start.pop() ) ) {
 
                                                                // When found, 
cache indexes on `parent` and break
                                                                if ( 
node.nodeType === 1 && ++diff && node === elem ) {
@@ -1842,16 +1984,18 @@ Expr = Sizzle.selectors = {
                                                        }
 
                                                } else {
+
                                                        // Use 
previously-cached element index if available
                                                        if ( useCache ) {
+
                                                                // ...in a 
gzip-friendly way
                                                                node = elem;
-                                                               outerCache = 
node[ expando ] || (node[ expando ] = {});
+                                                               outerCache = 
node[ expando ] || ( node[ expando ] = {} );
 
                                                                // Support: IE 
<9 only
                                                                // Defend 
against cloned attroperties (jQuery gh-1709)
                                                                uniqueCache = 
outerCache[ node.uniqueID ] ||
-                                                                       
(outerCache[ node.uniqueID ] = {});
+                                                                       ( 
outerCache[ node.uniqueID ] = {} );
 
                                                                cache = 
uniqueCache[ type ] || [];
                                                                nodeIndex = 
cache[ 0 ] === dirruns && cache[ 1 ];
@@ -1861,9 +2005,10 @@ Expr = Sizzle.selectors = {
                                                        // xml :nth-child(...)
                                                        // or 
:nth-last-child(...) or :nth(-last)?-of-type(...)
                                                        if ( diff === false ) {
+
                                                                // Use the same 
loop as above to seek `elem` from the start
-                                                               while ( (node = 
++nodeIndex && node && node[ dir ] ||
-                                                                       (diff = 
nodeIndex = 0) || start.pop()) ) {
+                                                               while ( ( node 
= ++nodeIndex && node && node[ dir ] ||
+                                                                       ( diff 
= nodeIndex = 0 ) || start.pop() ) ) {
 
                                                                        if ( ( 
ofType ?
                                                                                
node.nodeName.toLowerCase() === name :
@@ -1872,12 +2017,13 @@ Expr = Sizzle.selectors = {
 
                                                                                
// Cache the index of each encountered element
                                                                                
if ( useCache ) {
-                                                                               
        outerCache = node[ expando ] || (node[ expando ] = {});
+                                                                               
        outerCache = node[ expando ] ||
+                                                                               
                ( node[ expando ] = {} );
 
                                                                                
        // Support: IE <9 only
                                                                                
        // Defend against cloned attroperties (jQuery gh-1709)
                                                                                
        uniqueCache = outerCache[ node.uniqueID ] ||
-                                                                               
                (outerCache[ node.uniqueID ] = {});
+                                                                               
                ( outerCache[ node.uniqueID ] = {} );
 
                                                                                
        uniqueCache[ type ] = [ dirruns, diff ];
                                                                                
}
@@ -1898,6 +2044,7 @@ Expr = Sizzle.selectors = {
                },
 
                "PSEUDO": function( pseudo, argument ) {
+
                        // pseudo-class names are case-insensitive
                        // http://www.w3.org/TR/selectors/#pseudo-classes
                        // Prioritize by case sensitivity in case custom 
pseudos are added with uppercase letters
@@ -1917,15 +2064,15 @@ Expr = Sizzle.selectors = {
                        if ( fn.length > 1 ) {
                                args = [ pseudo, pseudo, "", argument ];
                                return Expr.setFilters.hasOwnProperty( 
pseudo.toLowerCase() ) ?
-                                       markFunction(function( seed, matches ) {
+                                       markFunction( function( seed, matches ) 
{
                                                var idx,
                                                        matched = fn( seed, 
argument ),
                                                        i = matched.length;
                                                while ( i-- ) {
-                                                       idx = indexOf( seed, 
matched[i] );
-                                                       seed[ idx ] = !( 
matches[ idx ] = matched[i] );
+                                                       idx = indexOf( seed, 
matched[ i ] );
+                                                       seed[ idx ] = !( 
matches[ idx ] = matched[ i ] );
                                                }
-                                       }) :
+                                       } ) :
                                        function( elem ) {
                                                return fn( elem, 0, args );
                                        };
@@ -1936,8 +2083,10 @@ Expr = Sizzle.selectors = {
        },
 
        pseudos: {
+
                // Potentially complex pseudos
-               "not": markFunction(function( selector ) {
+               "not": markFunction( function( selector ) {
+
                        // Trim the selector passed to compile
                        // to avoid treating leading and trailing
                        // spaces as combinators
@@ -1946,39 +2095,40 @@ Expr = Sizzle.selectors = {
                                matcher = compile( selector.replace( rtrim, 
"$1" ) );
 
                        return matcher[ expando ] ?
-                               markFunction(function( seed, matches, context, 
xml ) {
+                               markFunction( function( seed, matches, 
_context, xml ) {
                                        var elem,
                                                unmatched = matcher( seed, 
null, xml, [] ),
                                                i = seed.length;
 
                                        // Match elements unmatched by `matcher`
                                        while ( i-- ) {
-                                               if ( (elem = unmatched[i]) ) {
-                                                       seed[i] = !(matches[i] 
= elem);
+                                               if ( ( elem = unmatched[ i ] ) 
) {
+                                                       seed[ i ] = !( matches[ 
i ] = elem );
                                                }
                                        }
-                               }) :
-                               function( elem, context, xml ) {
-                                       input[0] = elem;
+                               } ) :
+                               function( elem, _context, xml ) {
+                                       input[ 0 ] = elem;
                                        matcher( input, null, xml, results );
+
                                        // Don't keep the element (issue #299)
-                                       input[0] = null;
+                                       input[ 0 ] = null;
                                        return !results.pop();
                                };
-               }),
+               } ),
 
-               "has": markFunction(function( selector ) {
+               "has": markFunction( function( selector ) {
                        return function( elem ) {
                                return Sizzle( selector, elem ).length > 0;
                        };
-               }),
+               } ),
 
-               "contains": markFunction(function( text ) {
+               "contains": markFunction( function( text ) {
                        text = text.replace( runescape, funescape );
                        return function( elem ) {
                                return ( elem.textContent || getText( elem ) 
).indexOf( text ) > -1;
                        };
-               }),
+               } ),
 
                // "Whether an element is represented by a :lang() selector
                // is based solely on the element's language value
@@ -1988,25 +2138,26 @@ Expr = Sizzle.selectors = {
                // The identifier C does not have to be a valid language name."
                // http://www.w3.org/TR/selectors/#lang-pseudo
                "lang": markFunction( function( lang ) {
+
                        // lang value must be a valid identifier
-                       if ( !ridentifier.test(lang || "") ) {
+                       if ( !ridentifier.test( lang || "" ) ) {
                                Sizzle.error( "unsupported lang: " + lang );
                        }
                        lang = lang.replace( runescape, funescape 
).toLowerCase();
                        return function( elem ) {
                                var elemLang;
                                do {
-                                       if ( (elemLang = documentIsHTML ?
+                                       if ( ( elemLang = documentIsHTML ?
                                                elem.lang :
-                                               elem.getAttribute("xml:lang") 
|| elem.getAttribute("lang")) ) {
+                                               elem.getAttribute( "xml:lang" ) 
|| elem.getAttribute( "lang" ) ) ) {
 
                                                elemLang = 
elemLang.toLowerCase();
                                                return elemLang === lang || 
elemLang.indexOf( lang + "-" ) === 0;
                                        }
-                               } while ( (elem = elem.parentNode) && 
elem.nodeType === 1 );
+                               } while ( ( elem = elem.parentNode ) && 
elem.nodeType === 1 );
                                return false;
                        };
-               }),
+               } ),
 
                // Miscellaneous
                "target": function( elem ) {
@@ -2019,7 +2170,9 @@ Expr = Sizzle.selectors = {
                },
 
                "focus": function( elem ) {
-                       return elem === document.activeElement && 
(!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || 
~elem.tabIndex);
+                       return elem === document.activeElement &&
+                               ( !document.hasFocus || document.hasFocus() ) &&
+                               !!( elem.type || elem.href || ~elem.tabIndex );
                },
 
                // Boolean properties
@@ -2027,16 +2180,20 @@ Expr = Sizzle.selectors = {
                "disabled": createDisabledPseudo( true ),
 
                "checked": function( elem ) {
+
                        // In CSS3, :checked should return both checked and 
selected elements
                        // 
http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
                        var nodeName = elem.nodeName.toLowerCase();
-                       return (nodeName === "input" && !!elem.checked) || 
(nodeName === "option" && !!elem.selected);
+                       return ( nodeName === "input" && !!elem.checked ) ||
+                               ( nodeName === "option" && !!elem.selected );
                },
 
                "selected": function( elem ) {
+
                        // Accessing this property makes selected-by-default
                        // options in Safari work properly
                        if ( elem.parentNode ) {
+                               // eslint-disable-next-line 
no-unused-expressions
                                elem.parentNode.selectedIndex;
                        }
 
@@ -2045,6 +2202,7 @@ Expr = Sizzle.selectors = {
 
                // Contents
                "empty": function( elem ) {
+
                        // http://www.w3.org/TR/selectors/#empty-pseudo
                        // :empty is negated by element (1) or content nodes 
(text: 3; cdata: 4; entity ref: 5),
                        //   but not by others (comment: 8; processing 
instruction: 7; etc.)
@@ -2058,7 +2216,7 @@ Expr = Sizzle.selectors = {
                },
 
                "parent": function( elem ) {
-                       return !Expr.pseudos["empty"]( elem );
+                       return !Expr.pseudos[ "empty" ]( elem );
                },
 
                // Element/input types
@@ -2082,39 +2240,40 @@ Expr = Sizzle.selectors = {
 
                                // Support: IE<8
                                // New HTML5 attribute values (e.g., "search") 
appear with elem.type === "text"
-                               ( (attr = elem.getAttribute("type")) == null || 
attr.toLowerCase() === "text" );
+                               ( ( attr = elem.getAttribute( "type" ) ) == 
null ||
+                                       attr.toLowerCase() === "text" );
                },
 
                // Position-in-collection
-               "first": createPositionalPseudo(function() {
+               "first": createPositionalPseudo( function() {
                        return [ 0 ];
-               }),
+               } ),
 
-               "last": createPositionalPseudo(function( matchIndexes, length ) 
{
+               "last": createPositionalPseudo( function( _matchIndexes, length 
) {
                        return [ length - 1 ];
-               }),
+               } ),
 
-               "eq": createPositionalPseudo(function( matchIndexes, length, 
argument ) {
+               "eq": createPositionalPseudo( function( _matchIndexes, length, 
argument ) {
                        return [ argument < 0 ? argument + length : argument ];
-               }),
+               } ),
 
-               "even": createPositionalPseudo(function( matchIndexes, length ) 
{
+               "even": createPositionalPseudo( function( matchIndexes, length 
) {
                        var i = 0;
                        for ( ; i < length; i += 2 ) {
                                matchIndexes.push( i );
                        }
                        return matchIndexes;
-               }),
+               } ),
 
-               "odd": createPositionalPseudo(function( matchIndexes, length ) {
+               "odd": createPositionalPseudo( function( matchIndexes, length ) 
{
                        var i = 1;
                        for ( ; i < length; i += 2 ) {
                                matchIndexes.push( i );
                        }
                        return matchIndexes;
-               }),
+               } ),
 
-               "lt": createPositionalPseudo(function( matchIndexes, length, 
argument ) {
+               "lt": createPositionalPseudo( function( matchIndexes, length, 
argument ) {
                        var i = argument < 0 ?
                                argument + length :
                                argument > length ?
@@ -2124,19 +2283,19 @@ Expr = Sizzle.selectors = {
                                matchIndexes.push( i );
                        }
                        return matchIndexes;
-               }),
+               } ),
 
-               "gt": createPositionalPseudo(function( matchIndexes, length, 
argument ) {
+               "gt": createPositionalPseudo( function( matchIndexes, length, 
argument ) {
                        var i = argument < 0 ? argument + length : argument;
                        for ( ; ++i < length; ) {
                                matchIndexes.push( i );
                        }
                        return matchIndexes;
-               })
+               } )
        }
 };
 
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
 
 // Add button/input type pseudos
 for ( i in { radio: true, checkbox: true, file: true, password: true, image: 
true } ) {
@@ -2167,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, 
parseOnly ) {
        while ( soFar ) {
 
                // Comma and first run
-               if ( !matched || (match = rcomma.exec( soFar )) ) {
+               if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
                        if ( match ) {
+
                                // Don't consume trailing commas as valid
-                               soFar = soFar.slice( match[0].length ) || soFar;
+                               soFar = soFar.slice( match[ 0 ].length ) || 
soFar;
                        }
-                       groups.push( (tokens = []) );
+                       groups.push( ( tokens = [] ) );
                }
 
                matched = false;
 
                // Combinators
-               if ( (match = rcombinators.exec( soFar )) ) {
+               if ( ( match = rcombinators.exec( soFar ) ) ) {
                        matched = match.shift();
-                       tokens.push({
+                       tokens.push( {
                                value: matched,
+
                                // Cast descendant combinators to space
-                               type: match[0].replace( rtrim, " " )
-                       });
+                               type: match[ 0 ].replace( rtrim, " " )
+                       } );
                        soFar = soFar.slice( matched.length );
                }
 
                // Filters
                for ( type in Expr.filter ) {
-                       if ( (match = matchExpr[ type ].exec( soFar )) && 
(!preFilters[ type ] ||
-                               (match = preFilters[ type ]( match ))) ) {
+                       if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( 
!preFilters[ type ] ||
+                               ( match = preFilters[ type ]( match ) ) ) ) {
                                matched = match.shift();
-                               tokens.push({
+                               tokens.push( {
                                        value: matched,
                                        type: type,
                                        matches: match
-                               });
+                               } );
                                soFar = soFar.slice( matched.length );
                        }
                }
@@ -2214,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, 
parseOnly ) {
                soFar.length :
                soFar ?
                        Sizzle.error( selector ) :
+
                        // Cache the tokens
                        tokenCache( selector, groups ).slice( 0 );
 };
@@ -2223,7 +2385,7 @@ function toSelector( tokens ) {
                len = tokens.length,
                selector = "";
        for ( ; i < len; i++ ) {
-               selector += tokens[i].value;
+               selector += tokens[ i ].value;
        }
        return selector;
 }
@@ -2236,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) {
                doneName = done++;
 
        return combinator.first ?
+
                // Check against closest ancestor/preceding element
                function( elem, context, xml ) {
-                       while ( (elem = elem[ dir ]) ) {
+                       while ( ( elem = elem[ dir ] ) ) {
                                if ( elem.nodeType === 1 || checkNonElements ) {
                                        return matcher( elem, context, xml );
                                }
@@ -2253,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) {
 
                        // We can't set arbitrary data on XML nodes, so they 
don't benefit from combinator caching
                        if ( xml ) {
-                               while ( (elem = elem[ dir ]) ) {
+                               while ( ( elem = elem[ dir ] ) ) {
                                        if ( elem.nodeType === 1 || 
checkNonElements ) {
                                                if ( matcher( elem, context, 
xml ) ) {
                                                        return true;
@@ -2261,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) {
                                        }
                                }
                        } else {
-                               while ( (elem = elem[ dir ]) ) {
+                               while ( ( elem = elem[ dir ] ) ) {
                                        if ( elem.nodeType === 1 || 
checkNonElements ) {
-                                               outerCache = elem[ expando ] || 
(elem[ expando ] = {});
+                                               outerCache = elem[ expando ] || 
( elem[ expando ] = {} );
 
                                                // Support: IE <9 only
                                                // Defend against cloned 
attroperties (jQuery gh-1709)
-                                               uniqueCache = outerCache[ 
elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+                                               uniqueCache = outerCache[ 
elem.uniqueID ] ||
+                                                       ( outerCache[ 
elem.uniqueID ] = {} );
 
                                                if ( skip && skip === 
elem.nodeName.toLowerCase() ) {
                                                        elem = elem[ dir ] || 
elem;
-                                               } else if ( (oldCache = 
uniqueCache[ key ]) &&
+                                               } else if ( ( oldCache = 
uniqueCache[ key ] ) &&
                                                        oldCache[ 0 ] === 
dirruns && oldCache[ 1 ] === doneName ) {
 
                                                        // Assign to newCache 
so results back-propagate to previous elements
-                                                       return (newCache[ 2 ] = 
oldCache[ 2 ]);
+                                                       return ( newCache[ 2 ] 
= oldCache[ 2 ] );
                                                } else {
+
                                                        // Reuse newcache so 
results back-propagate to previous elements
                                                        uniqueCache[ key ] = 
newCache;
 
                                                        // A match means we're 
done; a fail means we have to keep checking
-                                                       if ( (newCache[ 2 ] = 
matcher( elem, context, xml )) ) {
+                                                       if ( ( newCache[ 2 ] = 
matcher( elem, context, xml ) ) ) {
                                                                return true;
                                                        }
                                                }
@@ -2297,20 +2462,20 @@ function elementMatcher( matchers ) {
                function( elem, context, xml ) {
                        var i = matchers.length;
                        while ( i-- ) {
-                               if ( !matchers[i]( elem, context, xml ) ) {
+                               if ( !matchers[ i ]( elem, context, xml ) ) {
                                        return false;
                                }
                        }
                        return true;
                } :
-               matchers[0];
+               matchers[ 0 ];
 }
 
 function multipleContexts( selector, contexts, results ) {
        var i = 0,
                len = contexts.length;
        for ( ; i < len; i++ ) {
-               Sizzle( selector, contexts[i], results );
+               Sizzle( selector, contexts[ i ], results );
        }
        return results;
 }
@@ -2323,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) 
{
                mapped = map != null;
 
        for ( ; i < len; i++ ) {
-               if ( (elem = unmatched[i]) ) {
+               if ( ( elem = unmatched[ i ] ) ) {
                        if ( !filter || filter( elem, context, xml ) ) {
                                newUnmatched.push( elem );
                                if ( mapped ) {
@@ -2343,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, 
postFilter, postFinder, postS
        if ( postFinder && !postFinder[ expando ] ) {
                postFinder = setMatcher( postFinder, postSelector );
        }
-       return markFunction(function( seed, results, context, xml ) {
+       return markFunction( function( seed, results, context, xml ) {
                var temp, i, elem,
                        preMap = [],
                        postMap = [],
                        preexisting = results.length,
 
                        // Get initial elements from seed or context
-                       elems = seed || multipleContexts( selector || "*", 
context.nodeType ? [ context ] : context, [] ),
+                       elems = seed || multipleContexts(
+                               selector || "*",
+                               context.nodeType ? [ context ] : context,
+                               []
+                       ),
 
                        // Prefilter to get matcher input, preserving a map for 
seed-results synchronization
                        matcherIn = preFilter && ( seed || !selector ) ?
@@ -2358,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, 
postFilter, postFinder, postS
                                elems,
 
                        matcherOut = matcher ?
+
                                // If we have a postFinder, or filtered seed, 
or non-seed postFilter or preexisting results,
                                postFinder || ( seed ? preFilter : preexisting 
|| postFilter ) ?
 
@@ -2381,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, 
postFilter, postFinder, postS
                        // Un-match failing elements by moving them back to 
matcherIn
                        i = temp.length;
                        while ( i-- ) {
-                               if ( (elem = temp[i]) ) {
-                                       matcherOut[ postMap[i] ] = !(matcherIn[ 
postMap[i] ] = elem);
+                               if ( ( elem = temp[ i ] ) ) {
+                                       matcherOut[ postMap[ i ] ] = !( 
matcherIn[ postMap[ i ] ] = elem );
                                }
                        }
                }
@@ -2390,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, 
postFilter, postFinder, postS
                if ( seed ) {
                        if ( postFinder || preFilter ) {
                                if ( postFinder ) {
+
                                        // Get the final matcherOut by 
condensing this intermediate into postFinder contexts
                                        temp = [];
                                        i = matcherOut.length;
                                        while ( i-- ) {
-                                               if ( (elem = matcherOut[i]) ) {
+                                               if ( ( elem = matcherOut[ i ] ) 
) {
+
                                                        // Restore matcherIn 
since elem is not yet a final match
-                                                       temp.push( 
(matcherIn[i] = elem) );
+                                                       temp.push( ( matcherIn[ 
i ] = elem ) );
                                                }
                                        }
-                                       postFinder( null, (matcherOut = []), 
temp, xml );
+                                       postFinder( null, ( matcherOut = [] ), 
temp, xml );
                                }
 
                                // Move matched elements from seed to results 
to keep them synchronized
                                i = matcherOut.length;
                                while ( i-- ) {
-                                       if ( (elem = matcherOut[i]) &&
-                                               (temp = postFinder ? indexOf( 
seed, elem ) : preMap[i]) > -1 ) {
+                                       if ( ( elem = matcherOut[ i ] ) &&
+                                               ( temp = postFinder ? indexOf( 
seed, elem ) : preMap[ i ] ) > -1 ) {
 
-                                               seed[temp] = !(results[temp] = 
elem);
+                                               seed[ temp ] = !( results[ temp 
] = elem );
                                        }
                                }
                        }
@@ -2426,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, 
postFilter, postFinder, postS
                                push.apply( results, matcherOut );
                        }
                }
-       });
+       } );
 }
 
 function matcherFromTokens( tokens ) {
        var checkContext, matcher, j,
                len = tokens.length,
-               leadingRelative = Expr.relative[ tokens[0].type ],
-               implicitRelative = leadingRelative || Expr.relative[" "],
+               leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+               implicitRelative = leadingRelative || Expr.relative[ " " ],
                i = leadingRelative ? 1 : 0,
 
                // The foundational matcher ensures that elements are reachable 
from top-level context(s)
@@ -2445,38 +2617,43 @@ function matcherFromTokens( tokens ) {
                }, implicitRelative, true ),
                matchers = [ function( elem, context, xml ) {
                        var ret = ( !leadingRelative && ( xml || context !== 
outermostContext ) ) || (
-                               (checkContext = context).nodeType ?
+                               ( checkContext = context ).nodeType ?
                                        matchContext( elem, context, xml ) :
                                        matchAnyContext( elem, context, xml ) );
+
                        // Avoid hanging onto element (issue #299)
                        checkContext = null;
                        return ret;
                } ];
 
        for ( ; i < len; i++ ) {
-               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-                       matchers = [ addCombinator(elementMatcher( matchers ), 
matcher) ];
+               if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+                       matchers = [ addCombinator( elementMatcher( matchers ), 
matcher ) ];
                } else {
-                       matcher = Expr.filter[ tokens[i].type ].apply( null, 
tokens[i].matches );
+                       matcher = Expr.filter[ tokens[ i ].type ].apply( null, 
tokens[ i ].matches );
 
                        // Return special upon seeing a positional matcher
                        if ( matcher[ expando ] ) {
+
                                // Find the next relative operator (if any) for 
proper handling
                                j = ++i;
                                for ( ; j < len; j++ ) {
-                                       if ( Expr.relative[ tokens[j].type ] ) {
+                                       if ( Expr.relative[ tokens[ j ].type ] 
) {
                                                break;
                                        }
                                }
                                return setMatcher(
                                        i > 1 && elementMatcher( matchers ),
                                        i > 1 && toSelector(
-                                               // If the preceding token was a 
descendant combinator, insert an implicit any-element `*`
-                                               tokens.slice( 0, i - 1 
).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+
+                                       // If the preceding token was a 
descendant combinator, insert an implicit any-element `*`
+                                       tokens
+                                               .slice( 0, i - 1 )
+                                               .concat( { value: tokens[ i - 2 
].type === " " ? "*" : "" } )
                                        ).replace( rtrim, "$1" ),
                                        matcher,
                                        i < j && matcherFromTokens( 
tokens.slice( i, j ) ),
-                                       j < len && matcherFromTokens( (tokens = 
tokens.slice( j )) ),
+                                       j < len && matcherFromTokens( ( tokens 
= tokens.slice( j ) ) ),
                                        j < len && toSelector( tokens )
                                );
                        }
@@ -2497,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, 
setMatchers ) {
                                unmatched = seed && [],
                                setMatched = [],
                                contextBackup = outermostContext,
+
                                // We must always have either seed elements or 
outermost context
-                               elems = seed || byElement && Expr.find["TAG"]( 
"*", outermost ),
+                               elems = seed || byElement && Expr.find[ "TAG" 
]( "*", outermost ),
+
                                // Use integer dirruns iff this is the 
outermost matcher
-                               dirrunsUnique = (dirruns += contextBackup == 
null ? 1 : Math.random() || 0.1),
+                               dirrunsUnique = ( dirruns += contextBackup == 
null ? 1 : Math.random() || 0.1 ),
                                len = elems.length;
 
                        if ( outermost ) {
-                               outermostContext = context === document || 
context || outermost;
+
+                               // Support: IE 11+, Edge 17 - 18+
+                               // IE/Edge sometimes throw a "Permission 
denied" error when strict-comparing
+                               // two documents; shallow comparisons work.
+                               // eslint-disable-next-line eqeqeq
+                               outermostContext = context == document || 
context || outermost;
                        }
 
                        // Add elements passing elementMatchers directly to 
results
                        // Support: IE<9, Safari
                        // Tolerate NodeList properties (IE: "length"; Safari: 
<number>) matching elements by id
-                       for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+                       for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ 
) {
                                if ( byElement && elem ) {
                                        j = 0;
-                                       if ( !context && elem.ownerDocument !== 
document ) {
+
+                                       // Support: IE 11+, Edge 17 - 18+
+                                       // IE/Edge sometimes throw a 
"Permission denied" error when strict-comparing
+                                       // two documents; shallow comparisons 
work.
+                                       // eslint-disable-next-line eqeqeq
+                                       if ( !context && elem.ownerDocument != 
document ) {
                                                setDocument( elem );
                                                xml = !documentIsHTML;
                                        }
-                                       while ( (matcher = 
elementMatchers[j++]) ) {
-                                               if ( matcher( elem, context || 
document, xml) ) {
+                                       while ( ( matcher = elementMatchers[ 
j++ ] ) ) {
+                                               if ( matcher( elem, context || 
document, xml ) ) {
                                                        results.push( elem );
                                                        break;
                                                }
@@ -2530,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, 
setMatchers ) {
 
                                // Track unmatched elements for set filters
                                if ( bySet ) {
+
                                        // They will have gone through all 
possible matchers
-                                       if ( (elem = !matcher && elem) ) {
+                                       if ( ( elem = !matcher && elem ) ) {
                                                matchedCount--;
                                        }
 
@@ -2555,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, 
setMatchers ) {
                        // numerically zero.
                        if ( bySet && i !== matchedCount ) {
                                j = 0;
-                               while ( (matcher = setMatchers[j++]) ) {
+                               while ( ( matcher = setMatchers[ j++ ] ) ) {
                                        matcher( unmatched, setMatched, 
context, xml );
                                }
 
                                if ( seed ) {
+
                                        // Reintegrate element matches to 
eliminate the need for sorting
                                        if ( matchedCount > 0 ) {
                                                while ( i-- ) {
-                                                       if ( !(unmatched[i] || 
setMatched[i]) ) {
-                                                               setMatched[i] = 
pop.call( results );
+                                                       if ( !( unmatched[ i ] 
|| setMatched[ i ] ) ) {
+                                                               setMatched[ i ] 
= pop.call( results );
                                                        }
                                                }
                                        }
@@ -2605,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* 
Internal Use Only */ ) {
                cached = compilerCache[ selector + " " ];
 
        if ( !cached ) {
+
                // Generate a function of recursive functions that can be used 
to check each element
                if ( !match ) {
                        match = tokenize( selector );
                }
                i = match.length;
                while ( i-- ) {
-                       cached = matcherFromTokens( match[i] );
+                       cached = matcherFromTokens( match[ i ] );
                        if ( cached[ expando ] ) {
                                setMatchers.push( cached );
                        } else {
@@ -2620,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* 
Internal Use Only */ ) {
                }
 
                // Cache the compiled function
-               cached = compilerCache( selector, matcherFromGroupMatchers( 
elementMatchers, setMatchers ) );
+               cached = compilerCache(
+                       selector,
+                       matcherFromGroupMatchers( elementMatchers, setMatchers )
+               );
 
                // Save selector and tokenization
                cached.selector = selector;
@@ -2640,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* 
Internal Use Only */ ) {
 select = Sizzle.select = function( selector, context, results, seed ) {
        var i, tokens, token, type, find,
                compiled = typeof selector === "function" && selector,
-               match = !seed && tokenize( (selector = compiled.selector || 
selector) );
+               match = !seed && tokenize( ( selector = compiled.selector || 
selector ) );
 
        results = results || [];
 
@@ -2649,11 +2844,12 @@ select = Sizzle.select = function( selector, context, 
results, seed ) {
        if ( match.length === 1 ) {
 
                // Reduce context if the leading compound selector is an ID
-               tokens = match[0] = match[0].slice( 0 );
-               if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-                               context.nodeType === 9 && documentIsHTML && 
Expr.relative[ tokens[1].type ] ) {
+               tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+               if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" 
&&
+                       context.nodeType === 9 && documentIsHTML && 
Expr.relative[ tokens[ 1 ].type ] ) {
 
-                       context = ( Expr.find["ID"]( 
token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+                       context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+                               .replace( runescape, funescape ), context ) || 
[] )[ 0 ];
                        if ( !context ) {
                                return results;
 
@@ -2666,20 +2862,22 @@ select = Sizzle.select = function( selector, context, 
results, seed ) {
                }
 
                // Fetch a seed set for right-to-left matching
-               i = matchExpr["needsContext"].test( selector ) ? 0 : 
tokens.length;
+               i = matchExpr[ "needsContext" ].test( selector ) ? 0 : 
tokens.length;
                while ( i-- ) {
-                       token = tokens[i];
+                       token = tokens[ i ];
 
                        // Abort if we hit a combinator
-                       if ( Expr.relative[ (type = token.type) ] ) {
+                       if ( Expr.relative[ ( type = token.type ) ] ) {
                                break;
                        }
-                       if ( (find = Expr.find[ type ]) ) {
+                       if ( ( find = Expr.find[ type ] ) ) {
+
                                // Search, expanding context for leading 
sibling combinators
-                               if ( (seed = find(
-                                       token.matches[0].replace( runescape, 
funescape ),
-                                       rsibling.test( tokens[0].type ) && 
testContext( context.parentNode ) || context
-                               )) ) {
+                               if ( ( seed = find(
+                                       token.matches[ 0 ].replace( runescape, 
funescape ),
+                                       rsibling.test( tokens[ 0 ].type ) && 
testContext( context.parentNode ) ||
+                                               context
+                               ) ) ) {
 
                                        // If seed is empty or no tokens 
remain, we can return early
                                        tokens.splice( i, 1 );
@@ -2710,7 +2908,7 @@ select = Sizzle.select = function( selector, context, 
results, seed ) {
 // One-time assignments
 
 // Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === 
expando;
 
 // Support: Chrome 14-35+
 // Always assume duplicates if they aren't passed to the comparison function
@@ -2721,58 +2919,59 @@ setDocument();
 
 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
 // Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
+support.sortDetached = assert( function( el ) {
+
        // Should return 1, but returns 4 (following)
-       return el.compareDocumentPosition( document.createElement("fieldset") ) 
& 1;
-});
+       return el.compareDocumentPosition( document.createElement( "fieldset" ) 
) & 1;
+} );
 
 // Support: IE<8
 // Prevent attribute/property "interpolation"
 // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
+if ( !assert( function( el ) {
        el.innerHTML = "<a href='#'></a>";
-       return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
+       return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
        addHandle( "type|href|height|width", function( elem, name, isXML ) {
                if ( !isXML ) {
                        return elem.getAttribute( name, name.toLowerCase() === 
"type" ? 1 : 2 );
                }
-       });
+       } );
 }
 
 // Support: IE<9
 // Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
+if ( !support.attributes || !assert( function( el ) {
        el.innerHTML = "<input/>";
        el.firstChild.setAttribute( "value", "" );
        return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
-       addHandle( "value", function( elem, name, isXML ) {
+} ) ) {
+       addHandle( "value", function( elem, _name, isXML ) {
                if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
                        return elem.defaultValue;
                }
-       });
+       } );
 }
 
 // Support: IE<9
 // Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
-       return el.getAttribute("disabled") == null;
-}) ) {
+if ( !assert( function( el ) {
+       return el.getAttribute( "disabled" ) == null;
+} ) ) {
        addHandle( booleans, function( elem, name, isXML ) {
                var val;
                if ( !isXML ) {
                        return elem[ name ] === true ? name.toLowerCase() :
-                                       (val = elem.getAttributeNode( name )) 
&& val.specified ?
+                               ( val = elem.getAttributeNode( name ) ) && 
val.specified ?
                                        val.value :
-                               null;
+                                       null;
                }
-       });
+       } );
 }
 
 return Sizzle;
 
-})( window );
+} )( window );
 
 
 
@@ -3141,7 +3340,7 @@ jQuery.each( {
        parents: function( elem ) {
                return dir( elem, "parentNode" );
        },
-       parentsUntil: function( elem, i, until ) {
+       parentsUntil: function( elem, _i, until ) {
                return dir( elem, "parentNode", until );
        },
        next: function( elem ) {
@@ -3156,10 +3355,10 @@ jQuery.each( {
        prevAll: function( elem ) {
                return dir( elem, "previousSibling" );
        },
-       nextUntil: function( elem, i, until ) {
+       nextUntil: function( elem, _i, until ) {
                return dir( elem, "nextSibling", until );
        },
-       prevUntil: function( elem, i, until ) {
+       prevUntil: function( elem, _i, until ) {
                return dir( elem, "previousSibling", until );
        },
        siblings: function( elem ) {
@@ -3169,7 +3368,13 @@ jQuery.each( {
                return siblings( elem.firstChild );
        },
        contents: function( elem ) {
-               if ( typeof elem.contentDocument !== "undefined" ) {
+               if ( elem.contentDocument != null &&
+
+                       // Support: IE 11+
+                       // <object> elements with no `data` attribute has an 
object
+                       // `contentDocument` with a `null` prototype.
+                       getProto( elem.contentDocument ) ) {
+
                        return elem.contentDocument;
                }
 
@@ -3512,7 +3717,7 @@ jQuery.extend( {
                                        var fns = arguments;
 
                                        return jQuery.Deferred( function( 
newDefer ) {
-                                               jQuery.each( tuples, function( 
i, tuple ) {
+                                               jQuery.each( tuples, function( 
_i, tuple ) {
 
                                                        // Map tuples 
(progress, done, fail) to arguments (done, fail, progress)
                                                        var fn = isFunction( 
fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
@@ -3965,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, 
emptyGet, raw ) {
                        // ...except when executing function values
                        } else {
                                bulk = fn;
-                               fn = function( elem, key, value ) {
+                               fn = function( elem, _key, value ) {
                                        return bulk.call( jQuery( elem ), value 
);
                                };
                        }
@@ -4000,7 +4205,7 @@ var rmsPrefix = /^-ms-/,
        rdashAlpha = /-([a-z])/g;
 
 // Used by camelCase as callback to replace()
-function fcamelCase( all, letter ) {
+function fcamelCase( _all, letter ) {
        return letter.toUpperCase();
 }
 
@@ -4528,27 +4733,6 @@ var isHiddenWithinTree = function( elem, el ) {
                        jQuery.css( elem, "display" ) === "none";
        };
 
-var swap = function( elem, options, callback, args ) {
-       var ret, name,
-               old = {};
-
-       // Remember the old values, and insert the new ones
-       for ( name in options ) {
-               old[ name ] = elem.style[ name ];
-               elem.style[ name ] = options[ name ];
-       }
-
-       ret = callback.apply( elem, args || [] );
-
-       // Revert the old values
-       for ( name in options ) {
-               elem.style[ name ] = old[ name ];
-       }
-
-       return ret;
-};
-
-
 
 
 function adjustCSS( elem, prop, valueParts, tween ) {
@@ -4719,11 +4903,40 @@ var rscriptType = ( 
/^$|^module$|\/(?:java|ecma)script/i );
 
 
 
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
+( function() {
+       var fragment = document.createDocumentFragment(),
+               div = fragment.appendChild( document.createElement( "div" ) ),
+               input = document.createElement( "input" );
+
+       // Support: Android 4.0 - 4.3 only
+       // Check state lost if the name is set (#11217)
+       // Support: Windows Web Apps (WWA)
+       // `name` and `type` must use .setAttribute for WWA (#14901)
+       input.setAttribute( "type", "radio" );
+       input.setAttribute( "checked", "checked" );
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+
+       // Support: Android <=4.1 only
+       // Older WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = div.cloneNode( true ).cloneNode( true 
).lastChild.checked;
+
+       // Support: IE <=11 only
+       // Make sure textarea (and checkbox) defaultValue is properly cloned
+       div.innerHTML = "<textarea>x</textarea>";
+       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
 
        // Support: IE <=9 only
-       option: [ 1, "<select multiple='multiple'>", "</select>" ],
+       // IE <=9 replaces <option> tags with their contents when inserted 
outside of
+       // the select element.
+       div.innerHTML = "<option></option>";
+       support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
 
        // XHTML parsers do not magically insert elements in the
        // same way that tag soup parsers do. So we cannot shorten
@@ -4736,12 +4949,14 @@ var wrapMap = {
        _default: [ 0, "", "" ]
 };
 
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = 
wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
+// Support: IE <=9 only
+if ( !support.option ) {
+       wrapMap.optgroup = wrapMap.option = [ 1, "<select 
multiple='multiple'>", "</select>" ];
+}
+
 
 function getAll( context, tag ) {
 
@@ -4874,32 +5089,6 @@ function buildFragment( elems, context, scripts, 
selection, ignored ) {
 }
 
 
-( function() {
-       var fragment = document.createDocumentFragment(),
-               div = fragment.appendChild( document.createElement( "div" ) ),
-               input = document.createElement( "input" );
-
-       // Support: Android 4.0 - 4.3 only
-       // Check state lost if the name is set (#11217)
-       // Support: Windows Web Apps (WWA)
-       // `name` and `type` must use .setAttribute for WWA (#14901)
-       input.setAttribute( "type", "radio" );
-       input.setAttribute( "checked", "checked" );
-       input.setAttribute( "name", "t" );
-
-       div.appendChild( input );
-
-       // Support: Android <=4.1 only
-       // Older WebKit doesn't clone checked state correctly in fragments
-       support.checkClone = div.cloneNode( true ).cloneNode( true 
).lastChild.checked;
-
-       // Support: IE <=11 only
-       // Make sure textarea (and checkbox) defaultValue is properly cloned
-       div.innerHTML = "<textarea>x</textarea>";
-       support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
 var
        rkeyEvent = /^key/,
        rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
@@ -5008,8 +5197,8 @@ jQuery.event = {
                        special, handlers, type, namespaces, origType,
                        elemData = dataPriv.get( elem );
 
-               // Don't attach events to noData or text/comment nodes (but 
allow plain objects)
-               if ( !elemData ) {
+               // Only attach events to objects that accept data
+               if ( !acceptData( elem ) ) {
                        return;
                }
 
@@ -5033,7 +5222,7 @@ jQuery.event = {
 
                // Init the element's event structure and main handler, if this 
is the first
                if ( !( events = elemData.events ) ) {
-                       events = elemData.events = {};
+                       events = elemData.events = Object.create( null );
                }
                if ( !( eventHandle = elemData.handle ) ) {
                        eventHandle = elemData.handle = function( e ) {
@@ -5191,12 +5380,15 @@ jQuery.event = {
 
        dispatch: function( nativeEvent ) {
 
-               // Make a writable jQuery.Event from the native event object
-               var event = jQuery.event.fix( nativeEvent );
-
                var i, j, ret, matched, handleObj, handlerQueue,
                        args = new Array( arguments.length ),
-                       handlers = ( dataPriv.get( this, "events" ) || {} )[ 
event.type ] || [],
+
+                       // Make a writable jQuery.Event from the native event 
object
+                       event = jQuery.event.fix( nativeEvent ),
+
+                       handlers = (
+                                       dataPriv.get( this, "events" ) || 
Object.create( null )
+                               )[ event.type ] || [],
                        special = jQuery.event.special[ event.type ] || {};
 
                // Use the fix-ed jQuery.Event rather than the (read-only) 
native event
@@ -5771,13 +5963,6 @@ jQuery.fn.extend( {
 
 var
 
-       /* eslint-disable max-len */
-
-       // See https://github.com/eslint/eslint/issues/3229
-       rxhtmlTag = 
/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
-       /* eslint-enable */
-
        // Support: IE <=10 - 11, Edge 12 - 13 only
        // In IE/Edge using regex groups here causes severe slowdowns.
        // See https://connect.microsoft.com/IE/feedback/details/1736512/
@@ -5814,7 +5999,7 @@ function restoreScript( elem ) {
 }
 
 function cloneCopyEvent( src, dest ) {
-       var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+       var i, l, type, pdataOld, udataOld, udataCur, events;
 
        if ( dest.nodeType !== 1 ) {
                return;
@@ -5822,13 +6007,11 @@ function cloneCopyEvent( src, dest ) {
 
        // 1. Copy private data: events, handlers, etc.
        if ( dataPriv.hasData( src ) ) {
-               pdataOld = dataPriv.access( src );
-               pdataCur = dataPriv.set( dest, pdataOld );
+               pdataOld = dataPriv.get( src );
                events = pdataOld.events;
 
                if ( events ) {
-                       delete pdataCur.handle;
-                       pdataCur.events = {};
+                       dataPriv.remove( dest, "handle events" );
 
                        for ( type in events ) {
                                for ( i = 0, l = events[ type ].length; i < l; 
i++ ) {
@@ -5864,7 +6047,7 @@ function fixInput( src, dest ) {
 function domManip( collection, args, callback, ignored ) {
 
        // Flatten any nested arrays
-       args = concat.apply( [], args );
+       args = flat( args );
 
        var fragment, first, scripts, hasScripts, node, doc,
                i = 0,
@@ -5939,7 +6122,7 @@ function domManip( collection, args, callback, ignored ) {
                                                        if ( jQuery._evalUrl && 
!node.noModule ) {
                                                                
jQuery._evalUrl( node.src, {
                                                                        nonce: 
node.nonce || node.getAttribute( "nonce" )
-                                                               } );
+                                                               }, doc );
                                                        }
                                                } else {
                                                        DOMEval( 
node.textContent.replace( rcleanScript, "" ), node, doc );
@@ -5976,7 +6159,7 @@ function remove( elem, selector, keepData ) {
 
 jQuery.extend( {
        htmlPrefilter: function( html ) {
-               return html.replace( rxhtmlTag, "<$1></$2>" );
+               return html;
        },
 
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
@@ -6238,6 +6421,27 @@ var getStyles = function( elem ) {
                return view.getComputedStyle( elem );
        };
 
+var swap = function( elem, options, callback ) {
+       var ret, name,
+               old = {};
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.call( elem );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+};
+
+
 var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
 
 
@@ -6295,7 +6499,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
        }
 
        var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, 
pixelBoxStylesVal,
-               reliableMarginLeftVal,
+               reliableTrDimensionsVal, reliableMarginLeftVal,
                container = document.createElement( "div" ),
                div = document.createElement( "div" );
 
@@ -6330,6 +6534,35 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
                scrollboxSize: function() {
                        computeStyleTests();
                        return scrollboxSizeVal;
+               },
+
+               // Support: IE 9 - 11+, Edge 15 - 18+
+               // IE/Edge misreport `getComputedStyle` of table rows with 
width/height
+               // set in CSS while `offset*` properties report correct values.
+               // Behavior in IE 9 is more subtle than in newer versions & it 
passes
+               // some versions of this test; make sure not to make it pass 
there!
+               reliableTrDimensions: function() {
+                       var table, tr, trChild, trStyle;
+                       if ( reliableTrDimensionsVal == null ) {
+                               table = document.createElement( "table" );
+                               tr = document.createElement( "tr" );
+                               trChild = document.createElement( "div" );
+
+                               table.style.cssText = 
"position:absolute;left:-11111px";
+                               tr.style.height = "1px";
+                               trChild.style.height = "9px";
+
+                               documentElement
+                                       .appendChild( table )
+                                       .appendChild( tr )
+                                       .appendChild( trChild );
+
+                               trStyle = window.getComputedStyle( tr );
+                               reliableTrDimensionsVal = parseInt( 
trStyle.height ) > 3;
+
+                               documentElement.removeChild( table );
+                       }
+                       return reliableTrDimensionsVal;
                }
        } );
 } )();
@@ -6454,7 +6687,7 @@ var
                fontWeight: "400"
        };
 
-function setPositiveNumber( elem, value, subtract ) {
+function setPositiveNumber( _elem, value, subtract ) {
 
        // Any relative (+/-) values have already been
        // normalized at this point
@@ -6559,17 +6792,26 @@ function getWidthOrHeight( elem, dimension, extra ) {
        }
 
 
-       // Fall back to offsetWidth/offsetHeight when value is "auto"
-       // This happens for inline elements with no explicit setting (gh-3571)
-       // Support: Android <=4.1 - 4.3 only
-       // Also use offsetWidth/offsetHeight for misreported inline dimensions 
(gh-3602)
-       // Support: IE 9-11 only
-       // Also use offsetWidth/offsetHeight for when box sizing is unreliable
-       // We use getClientRects() to check for hidden/disconnected.
-       // In those cases, the computed value can be trusted to be border-box
+       // Support: IE 9 - 11 only
+       // Use offsetWidth/offsetHeight for when box sizing is unreliable.
+       // In those cases, the computed value can be trusted to be border-box.
        if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+               // Support: IE 10 - 11+, Edge 15 - 18+
+               // IE/Edge misreport `getComputedStyle` of table rows with 
width/height
+               // set in CSS while `offset*` properties report correct values.
+               // Interestingly, in some cases IE 9 doesn't suffer from this 
issue.
+               !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+               // Fall back to offsetWidth/offsetHeight when value is "auto"
+               // This happens for inline elements with no explicit setting 
(gh-3571)
                val === "auto" ||
+
+               // Support: Android <=4.1 - 4.3 only
+               // Also use offsetWidth/offsetHeight for misreported inline 
dimensions (gh-3602)
                !parseFloat( val ) && jQuery.css( elem, "display", false, 
styles ) === "inline" ) &&
+
+               // Make sure the element is visible & connected
                elem.getClientRects().length ) {
 
                isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) 
=== "border-box";
@@ -6764,7 +7006,7 @@ jQuery.extend( {
        }
 } );
 
-jQuery.each( [ "height", "width" ], function( i, dimension ) {
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
        jQuery.cssHooks[ dimension ] = {
                get: function( elem, computed, extra ) {
                        if ( computed ) {
@@ -7537,7 +7779,7 @@ jQuery.fn.extend( {
                        clearQueue = type;
                        type = undefined;
                }
-               if ( clearQueue && type !== false ) {
+               if ( clearQueue ) {
                        this.queue( type || "fx", [] );
                }
 
@@ -7620,7 +7862,7 @@ jQuery.fn.extend( {
        }
 } );
 
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
        var cssFn = jQuery.fn[ name ];
        jQuery.fn[ name ] = function( speed, easing, callback ) {
                return speed == null || typeof speed === "boolean" ?
@@ -7841,7 +8083,7 @@ boolHook = {
        }
 };
 
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name 
) {
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name 
) {
        var getter = attrHandle[ name ] || jQuery.find.attr;
 
        attrHandle[ name ] = function( elem, name, isXML ) {
@@ -8465,7 +8707,9 @@ jQuery.extend( jQuery.event, {
                                special.bindType || type;
 
                        // jQuery handler
-                       handle = ( dataPriv.get( cur, "events" ) || {} )[ 
event.type ] &&
+                       handle = (
+                                       dataPriv.get( cur, "events" ) || 
Object.create( null )
+                               )[ event.type ] &&
                                dataPriv.get( cur, "handle" );
                        if ( handle ) {
                                handle.apply( cur, data );
@@ -8576,7 +8820,10 @@ if ( !support.focusin ) {
 
                jQuery.event.special[ fix ] = {
                        setup: function() {
-                               var doc = this.ownerDocument || this,
+
+                               // Handle: regular nodes (via 
`this.ownerDocument`), window
+                               // (via `this.document`) & document (via 
`this`).
+                               var doc = this.ownerDocument || this.document 
|| this,
                                        attaches = dataPriv.access( doc, fix );
 
                                if ( !attaches ) {
@@ -8585,7 +8832,7 @@ if ( !support.focusin ) {
                                dataPriv.access( doc, fix, ( attaches || 0 ) + 
1 );
                        },
                        teardown: function() {
-                               var doc = this.ownerDocument || this,
+                               var doc = this.ownerDocument || this.document 
|| this,
                                        attaches = dataPriv.access( doc, fix ) 
- 1;
 
                                if ( !attaches ) {
@@ -8601,7 +8848,7 @@ if ( !support.focusin ) {
 }
 var location = window.location;
 
-var nonce = Date.now();
+var nonce = { guid: Date.now() };
 
 var rquery = ( /\?/ );
 
@@ -8733,7 +8980,7 @@ jQuery.fn.extend( {
                                rsubmittable.test( this.nodeName ) && 
!rsubmitterTypes.test( type ) &&
                                ( this.checked || !rcheckableType.test( type ) 
);
                } )
-               .map( function( i, elem ) {
+               .map( function( _i, elem ) {
                        var val = jQuery( this ).val();
 
                        if ( val == null ) {
@@ -9346,7 +9593,8 @@ jQuery.extend( {
                        // Add or update anti-cache param if needed
                        if ( s.cache === false ) {
                                cacheURL = cacheURL.replace( rantiCache, "$1" );
-                               uncached = ( rquery.test( cacheURL ) ? "&" : 
"?" ) + "_=" + ( nonce++ ) + uncached;
+                               uncached = ( rquery.test( cacheURL ) ? "&" : 
"?" ) + "_=" + ( nonce.guid++ ) +
+                                       uncached;
                        }
 
                        // Put hash and anti-cache on the URL that will be 
requested (gh-1732)
@@ -9479,6 +9727,11 @@ jQuery.extend( {
                                response = ajaxHandleResponses( s, jqXHR, 
responses );
                        }
 
+                       // Use a noop converter for missing script
+                       if ( !isSuccess && jQuery.inArray( "script", 
s.dataTypes ) > -1 ) {
+                               s.converters[ "text script" ] = function() {};
+                       }
+
                        // Convert no matter what (that way responseXXX fields 
are always set)
                        response = ajaxConvert( s, response, jqXHR, isSuccess );
 
@@ -9569,7 +9822,7 @@ jQuery.extend( {
        }
 } );
 
-jQuery.each( [ "get", "post" ], function( i, method ) {
+jQuery.each( [ "get", "post" ], function( _i, method ) {
        jQuery[ method ] = function( url, data, callback, type ) {
 
                // Shift arguments if data argument was omitted
@@ -9590,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) {
        };
 } );
 
+jQuery.ajaxPrefilter( function( s ) {
+       var i;
+       for ( i in s.headers ) {
+               if ( i.toLowerCase() === "content-type" ) {
+                       s.contentType = s.headers[ i ] || "";
+               }
+       }
+} );
+
 
-jQuery._evalUrl = function( url, options ) {
+jQuery._evalUrl = function( url, options, doc ) {
        return jQuery.ajax( {
                url: url,
 
@@ -9609,7 +9871,7 @@ jQuery._evalUrl = function( url, options ) {
                        "text script": function() {}
                },
                dataFilter: function( response ) {
-                       jQuery.globalEval( response, options );
+                       jQuery.globalEval( response, options, doc );
                }
        } );
 };
@@ -9931,7 +10193,7 @@ var oldCallbacks = [],
 jQuery.ajaxSetup( {
        jsonp: "callback",
        jsonpCallback: function() {
-               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( 
nonce++ ) );
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( 
nonce.guid++ ) );
                this[ callback ] = true;
                return callback;
        }
@@ -10148,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) {
 
 
 
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
-       "ajaxStart",
-       "ajaxStop",
-       "ajaxComplete",
-       "ajaxError",
-       "ajaxSuccess",
-       "ajaxSend"
-], function( i, type ) {
-       jQuery.fn[ type ] = function( fn ) {
-               return this.on( type, fn );
-       };
-} );
-
-
-
-
 jQuery.expr.pseudos.animated = function( elem ) {
        return jQuery.grep( jQuery.timers, function( fn ) {
                return elem === fn.elem;
@@ -10221,6 +10466,12 @@ jQuery.offset = {
                        options.using.call( elem, props );
 
                } else {
+                       if ( typeof props.top === "number" ) {
+                               props.top += "px";
+                       }
+                       if ( typeof props.left === "number" ) {
+                               props.left += "px";
+                       }
                        curElem.css( props );
                }
        }
@@ -10371,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: 
"pageYOffset" }, function(
 // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
 // getComputedStyle returns percent when specified for top/left/bottom/right;
 // rather than make the css module depend on the offset module, just check for 
it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
                function( elem, computed ) {
                        if ( computed ) {
@@ -10434,25 +10685,19 @@ jQuery.each( { Height: "height", Width: "width" }, 
function( name, type ) {
 } );
 
 
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " 
+
-       "change select submit keydown keypress keyup contextmenu" ).split( " " 
),
-       function( i, name ) {
-
-       // Handle event binding
-       jQuery.fn[ name ] = function( data, fn ) {
-               return arguments.length > 0 ?
-                       this.on( name, null, data, fn ) :
-                       this.trigger( name );
+jQuery.each( [
+       "ajaxStart",
+       "ajaxStop",
+       "ajaxComplete",
+       "ajaxError",
+       "ajaxSuccess",
+       "ajaxSend"
+], function( _i, type ) {
+       jQuery.fn[ type ] = function( fn ) {
+               return this.on( type, fn );
        };
 } );
 
-jQuery.fn.extend( {
-       hover: function( fnOver, fnOut ) {
-               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-       }
-} );
-
 
 
 
@@ -10474,9 +10719,33 @@ jQuery.fn.extend( {
                return arguments.length === 1 ?
                        this.off( selector, "**" ) :
                        this.off( types, selector || "**", fn );
+       },
+
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        }
 } );
 
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " 
+
+       "change select submit keydown keypress keyup contextmenu" ).split( " " 
),
+       function( _i, name ) {
+
+               // Handle event binding
+               jQuery.fn[ name ] = function( data, fn ) {
+                       return arguments.length > 0 ?
+                               this.on( name, null, data, fn ) :
+                               this.trigger( name );
+               };
+       } );
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
 // Bind a function to a context, optionally partially applying any
 // arguments.
 // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
@@ -10539,6 +10808,11 @@ jQuery.isNumeric = function( obj ) {
                !isNaN( obj - parseFloat( obj ) );
 };
 
+jQuery.trim = function( text ) {
+       return text == null ?
+               "" :
+               ( text + "" ).replace( rtrim, "" );
+};
 
 
 
@@ -10587,7 +10861,7 @@ jQuery.noConflict = function( deep ) {
 // Expose jQuery and $ identifiers, even in AMD
 // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
 // and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
+if ( typeof noGlobal === "undefined" ) {
        window.jQuery = window.$ = jQuery;
 }
 
diff --git a/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js
new file mode 100644
index 0000000..b061403
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-3.5.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | 
jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof 
module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw
 new Error("jQuery requires a window with a document");return 
t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use 
strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return 
t.flat.call(e)}:function(e){return 
t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=
 [...]
diff --git 
a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js
deleted file mode 100644
index 05b1a80..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.js
+++ /dev/null
@@ -1,540 +0,0 @@
-/*!
- * jQuery Migrate - v3.0.0 - 2016-06-09
- * Copyright jQuery Foundation and other contributors
- */
-(function( jQuery, window ) {
-"use strict";
-
-
-jQuery.migrateVersion = "3.0.0";
-
-
-( function() {
-
-       // Support: IE9 only
-       // IE9 only creates console object when dev tools are first opened
-       // Also, avoid Function#bind here to simplify PhantomJS usage
-       var log = window.console && window.console.log &&
-                       function() { window.console.log.apply( window.console, 
arguments ); },
-               rbadVersions = /^[12]\./;
-
-       if ( !log ) {
-               return;
-       }
-
-       // Need jQuery 3.0.0+ and no older Migrate loaded
-       if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
-               log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
-       }
-       if ( jQuery.migrateWarnings ) {
-               log( "JQMIGRATE: Migrate plugin loaded multiple times" );
-       }
-
-       // Show a message on the console so devs know we're active
-       log( "JQMIGRATE: Migrate is installed" +
-               ( jQuery.migrateMute ? "" : " with logging active" ) +
-               ", version " + jQuery.migrateVersion );
-
-} )();
-
-var warnedAbout = {};
-
-// List of warnings already given; public read only
-jQuery.migrateWarnings = [];
-
-// Set to false to disable traces that appear with warnings
-if ( jQuery.migrateTrace === undefined ) {
-       jQuery.migrateTrace = true;
-}
-
-// Forget any warnings we've already given; public
-jQuery.migrateReset = function() {
-       warnedAbout = {};
-       jQuery.migrateWarnings.length = 0;
-};
-
-function migrateWarn( msg ) {
-       var console = window.console;
-       if ( !warnedAbout[ msg ] ) {
-               warnedAbout[ msg ] = true;
-               jQuery.migrateWarnings.push( msg );
-               if ( console && console.warn && !jQuery.migrateMute ) {
-                       console.warn( "JQMIGRATE: " + msg );
-                       if ( jQuery.migrateTrace && console.trace ) {
-                               console.trace();
-                       }
-               }
-       }
-}
-
-function migrateWarnProp( obj, prop, value, msg ) {
-       Object.defineProperty( obj, prop, {
-               configurable: true,
-               enumerable: true,
-               get: function() {
-                       migrateWarn( msg );
-                       return value;
-               }
-       } );
-}
-
-if ( document.compatMode === "BackCompat" ) {
-
-       // JQuery has never supported or tested Quirks Mode
-       migrateWarn( "jQuery is not compatible with Quirks Mode" );
-}
-
-
-var oldInit = jQuery.fn.init,
-       oldIsNumeric = jQuery.isNumeric,
-       oldFind = jQuery.find,
-       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
-       rattrHashGlob = 
/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
-
-jQuery.fn.init = function( arg1 ) {
-       var args = Array.prototype.slice.call( arguments );
-
-       if ( typeof arg1 === "string" && arg1 === "#" ) {
-
-               // JQuery( "#" ) is a bogus ID selector, but it returned an 
empty set before jQuery 3.0
-               migrateWarn( "jQuery( '#' ) is not a valid selector" );
-               args[ 0 ] = [];
-       }
-
-       return oldInit.apply( this, args );
-};
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.find = function( selector ) {
-       var args = Array.prototype.slice.call( arguments );
-
-       // Support: PhantomJS 1.x
-       // String#match fails to match when used with a //g RegExp, only on 
some strings
-       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
-
-               // The nonstandard and undocumented unquoted-hash was removed 
in jQuery 1.12.0
-               // First see if qS thinks it's a valid selector, if so avoid a 
false positive
-               try {
-                       document.querySelector( selector );
-               } catch ( err1 ) {
-
-                       // Didn't *look* valid to qSA, warn and try quoting 
what we think is the value
-                       selector = selector.replace( rattrHashGlob, function( 
_, attr, op, value ) {
-                               return "[" + attr + op + "\"" + value + "\"]";
-                       } );
-
-                       // If the regexp *may* have created an invalid 
selector, don't update it
-                       // Note that there may be false alarms if selector uses 
jQuery extensions
-                       try {
-                               document.querySelector( selector );
-                               migrateWarn( "Attribute selector with '#' must 
be quoted: " + args[ 0 ] );
-                               args[ 0 ] = selector;
-                       } catch ( err2 ) {
-                               migrateWarn( "Attribute selector with '#' was 
not fixed: " + args[ 0 ] );
-                       }
-               }
-       }
-
-       return oldFind.apply( this, args );
-};
-
-// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
-var findProp;
-for ( findProp in oldFind ) {
-       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
-               jQuery.find[ findProp ] = oldFind[ findProp ];
-       }
-}
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
-       migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" 
);
-       return this.length;
-};
-
-jQuery.parseJSON = function() {
-       migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
-       return JSON.parse.apply( null, arguments );
-};
-
-jQuery.isNumeric = function( val ) {
-
-       // The jQuery 2.2.3 implementation of isNumeric
-       function isNumeric2( obj ) {
-               var realStringObj = obj && obj.toString();
-               return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( 
realStringObj ) + 1 ) >= 0;
-       }
-
-       var newValue = oldIsNumeric( val ),
-               oldValue = isNumeric2( val );
-
-       if ( newValue !== oldValue ) {
-               migrateWarn( "jQuery.isNumeric() should not be called on 
constructed objects" );
-       }
-
-       return oldValue;
-};
-
-migrateWarnProp( jQuery, "unique", jQuery.uniqueSort,
-       "jQuery.unique is deprecated, use jQuery.uniqueSort" );
-
-// Now jQuery.expr.pseudos is the standard incantation
-migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
-       "jQuery.expr.filters is now jQuery.expr.pseudos" );
-migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
-       "jQuery.expr[\":\"] is now jQuery.expr.pseudos" );
-
-
-var oldAjax = jQuery.ajax;
-
-jQuery.ajax = function( ) {
-       var jQXHR = oldAjax.apply( this, arguments );
-
-       // Be sure we got a jQXHR (e.g., not sync)
-       if ( jQXHR.promise ) {
-               migrateWarnProp( jQXHR, "success", jQXHR.done,
-                       "jQXHR.success is deprecated and removed" );
-               migrateWarnProp( jQXHR, "error", jQXHR.fail,
-                       "jQXHR.error is deprecated and removed" );
-               migrateWarnProp( jQXHR, "complete", jQXHR.always,
-                       "jQXHR.complete is deprecated and removed" );
-       }
-
-       return jQXHR;
-};
-
-
-var oldRemoveAttr = jQuery.fn.removeAttr,
-       oldToggleClass = jQuery.fn.toggleClass,
-       rmatchNonSpace = /\S+/g;
-
-jQuery.fn.removeAttr = function( name ) {
-       var self = this;
-
-       jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
-               if ( jQuery.expr.match.bool.test( attr ) ) {
-                       migrateWarn( "jQuery.fn.removeAttr no longer sets 
boolean properties: " + attr );
-                       self.prop( attr, false );
-               }
-       } );
-
-       return oldRemoveAttr.apply( this, arguments );
-};
-
-jQuery.fn.toggleClass = function( state ) {
-
-       // Only deprecating no-args or single boolean arg
-       if ( state !== undefined && typeof state !== "boolean" ) {
-               return oldToggleClass.apply( this, arguments );
-       }
-
-       migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
-
-       // Toggle entire class name of each element
-       return this.each( function() {
-               var className = this.getAttribute && this.getAttribute( "class" 
) || "";
-
-               if ( className ) {
-                       jQuery.data( this, "__className__", className );
-               }
-
-               // If the element has a class name or if we're passed `false`,
-               // then remove the whole classname (if there was one, the above 
saved it).
-               // Otherwise bring back whatever was previously saved (if 
anything),
-               // falling back to the empty string if nothing was stored.
-               if ( this.setAttribute ) {
-                       this.setAttribute( "class",
-                               className || state === false ?
-                               "" :
-                               jQuery.data( this, "__className__" ) || ""
-                       );
-               }
-       } );
-};
-
-
-var internalSwapCall = false;
-
-// If this version of jQuery has .swap(), don't false-alarm on internal uses
-if ( jQuery.swap ) {
-       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, 
name ) {
-               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name 
].get;
-
-               if ( oldHook ) {
-                       jQuery.cssHooks[ name ].get = function() {
-                               var ret;
-
-                               internalSwapCall = true;
-                               ret = oldHook.apply( this, arguments );
-                               internalSwapCall = false;
-                               return ret;
-                       };
-               }
-       } );
-}
-
-jQuery.swap = function( elem, options, callback, args ) {
-       var ret, name,
-               old = {};
-
-       if ( !internalSwapCall ) {
-               migrateWarn( "jQuery.swap() is undocumented and deprecated" );
-       }
-
-       // Remember the old values, and insert the new ones
-       for ( name in options ) {
-               old[ name ] = elem.style[ name ];
-               elem.style[ name ] = options[ name ];
-       }
-
-       ret = callback.apply( elem, args || [] );
-
-       // Revert the old values
-       for ( name in options ) {
-               elem.style[ name ] = old[ name ];
-       }
-
-       return ret;
-};
-
-var oldData = jQuery.data;
-
-jQuery.data = function( elem, name, value ) {
-       var curData;
-
-       // If the name is transformed, look for the un-transformed name in the 
data object
-       if ( name && name !== jQuery.camelCase( name ) ) {
-               curData = jQuery.hasData( elem ) && oldData.call( this, elem );
-               if ( curData && name in curData ) {
-                       migrateWarn( "jQuery.data() always sets/gets camelCased 
names: " + name );
-                       if ( arguments.length > 2 ) {
-                               curData[ name ] = value;
-                       }
-                       return curData[ name ];
-               }
-       }
-
-       return oldData.apply( this, arguments );
-};
-
-var oldTweenRun = jQuery.Tween.prototype.run;
-
-jQuery.Tween.prototype.run = function( percent ) {
-       if ( jQuery.easing[ this.easing ].length > 1 ) {
-               migrateWarn(
-                       "easing function " +
-                       "\"jQuery.easing." + this.easing.toString() +
-                       "\" should use only first argument"
-               );
-
-               jQuery.easing[ this.easing ] = jQuery.easing[ this.easing 
].bind(
-                       jQuery.easing,
-                       percent, this.options.duration * percent, 0, 1, 
this.options.duration
-               );
-       }
-
-       oldTweenRun.apply( this, arguments );
-};
-
-var oldLoad = jQuery.fn.load,
-       originalFix = jQuery.event.fix;
-
-jQuery.event.props = [];
-jQuery.event.fixHooks = {};
-
-jQuery.event.fix = function( originalEvent ) {
-       var event,
-               type = originalEvent.type,
-               fixHook = this.fixHooks[ type ],
-               props = jQuery.event.props;
-
-       if ( props.length ) {
-               migrateWarn( "jQuery.event.props are deprecated and removed: " 
+ props.join() );
-               while ( props.length ) {
-                       jQuery.event.addProp( props.pop() );
-               }
-       }
-
-       if ( fixHook && !fixHook._migrated_ ) {
-               fixHook._migrated_ = true;
-               migrateWarn( "jQuery.event.fixHooks are deprecated and removed: 
" + type );
-               if ( ( props = fixHook.props ) && props.length ) {
-                       while ( props.length ) {
-                          jQuery.event.addProp( props.pop() );
-                       }
-               }
-       }
-
-       event = originalFix.call( this, originalEvent );
-
-       return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent 
) : event;
-};
-
-jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
-
-       jQuery.fn[ name ] = function() {
-               var args = Array.prototype.slice.call( arguments, 0 );
-
-               // If this is an ajax load() the first arg should be the string 
URL;
-               // technically this could also be the "Anything" arg of the 
event .load()
-               // which just goes to show why this dumb signature has been 
deprecated!
-               // jQuery custom builds that exclude the Ajax module 
justifiably die here.
-               if ( name === "load" && typeof args[ 0 ] === "string" ) {
-                       return oldLoad.apply( this, args );
-               }
-
-               migrateWarn( "jQuery.fn." + name + "() is deprecated" );
-
-               args.splice( 0, 0, name );
-               if ( arguments.length ) {
-                       return this.on.apply( this, args );
-               }
-
-               // Use .triggerHandler here because:
-               // - load and unload events don't need to bubble, only applied 
to window or image
-               // - error event should not bubble to window, although it does 
pre-1.7
-               // See http://bugs.jquery.com/ticket/11820
-               this.triggerHandler.apply( this, args );
-               return this;
-       };
-
-} );
-
-// Trigger "ready" event only once, on document ready
-jQuery( function() {
-       jQuery( document ).triggerHandler( "ready" );
-} );
-
-jQuery.event.special.ready = {
-       setup: function() {
-               if ( this === document ) {
-                       migrateWarn( "'ready' event is deprecated" );
-               }
-       }
-};
-
-jQuery.fn.extend( {
-
-       bind: function( types, data, fn ) {
-               migrateWarn( "jQuery.fn.bind() is deprecated" );
-               return this.on( types, null, data, fn );
-       },
-       unbind: function( types, fn ) {
-               migrateWarn( "jQuery.fn.unbind() is deprecated" );
-               return this.off( types, null, fn );
-       },
-       delegate: function( selector, types, data, fn ) {
-               migrateWarn( "jQuery.fn.delegate() is deprecated" );
-               return this.on( types, selector, data, fn );
-       },
-       undelegate: function( selector, types, fn ) {
-               migrateWarn( "jQuery.fn.undelegate() is deprecated" );
-               return arguments.length === 1 ?
-                       this.off( selector, "**" ) :
-                       this.off( types, selector || "**", fn );
-       }
-} );
-
-
-var oldOffset = jQuery.fn.offset;
-
-jQuery.fn.offset = function() {
-       var docElem,
-               elem = this[ 0 ],
-               origin = { top: 0, left: 0 };
-
-       if ( !elem || !elem.nodeType ) {
-               migrateWarn( "jQuery.fn.offset() requires a valid DOM element" 
);
-               return origin;
-       }
-
-       docElem = ( elem.ownerDocument || document ).documentElement;
-       if ( !jQuery.contains( docElem, elem ) ) {
-               migrateWarn( "jQuery.fn.offset() requires an element connected 
to a document" );
-               return origin;
-       }
-
-       return oldOffset.apply( this, arguments );
-};
-
-
-var oldParam = jQuery.param;
-
-jQuery.param = function( data, traditional ) {
-       var ajaxTraditional = jQuery.ajaxSettings && 
jQuery.ajaxSettings.traditional;
-
-       if ( traditional === undefined && ajaxTraditional ) {
-
-               migrateWarn( "jQuery.param() no longer uses 
jQuery.ajaxSettings.traditional" );
-               traditional = ajaxTraditional;
-       }
-
-       return oldParam.call( this, data, traditional );
-};
-
-var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
-
-jQuery.fn.andSelf = function() {
-       migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" );
-       return oldSelf.apply( this, arguments );
-};
-
-
-var oldDeferred = jQuery.Deferred,
-       tuples = [
-
-               // Action, add listener, callbacks, .then handlers, final state
-               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
-                       jQuery.Callbacks( "once memory" ), "resolved" ],
-               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
-                       jQuery.Callbacks( "once memory" ), "rejected" ],
-               [ "notify", "progress", jQuery.Callbacks( "memory" ),
-                       jQuery.Callbacks( "memory" ) ]
-       ];
-
-jQuery.Deferred = function( func ) {
-       var deferred = oldDeferred(),
-               promise = deferred.promise();
-
-       deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress 
*/ ) {
-               var fns = arguments;
-
-               migrateWarn( "deferred.pipe() is deprecated" );
-
-               return jQuery.Deferred( function( newDefer ) {
-                       jQuery.each( tuples, function( i, tuple ) {
-                               var fn = jQuery.isFunction( fns[ i ] ) && fns[ 
i ];
-
-                               // Deferred.done(function() { bind to newDefer 
or newDefer.resolve })
-                               // deferred.fail(function() { bind to newDefer 
or newDefer.reject })
-                               // deferred.progress(function() { bind to 
newDefer or newDefer.notify })
-                               deferred[ tuple[ 1 ] ]( function() {
-                                       var returned = fn && fn.apply( this, 
arguments );
-                                       if ( returned && jQuery.isFunction( 
returned.promise ) ) {
-                                               returned.promise()
-                                                       .done( newDefer.resolve 
)
-                                                       .fail( newDefer.reject )
-                                                       .progress( 
newDefer.notify );
-                                       } else {
-                                               newDefer[ tuple[ 0 ] + "With" ](
-                                                       this === promise ? 
newDefer.promise() : this,
-                                                       fn ? [ returned ] : 
arguments
-                                               );
-                                       }
-                               } );
-                       } );
-                       fns = null;
-               } ).promise();
-
-       };
-
-       if ( func ) {
-               func.call( deferred, deferred );
-       }
-
-       return deferred;
-};
-
-
-
-})( jQuery, window );
diff --git 
a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js
deleted file mode 100644
index a2813c5..0000000
--- a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.0.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Migrate v3.0.0 | (c) jQuery Foundation and other contributors | 
jquery.org/license */
-"undefined"==typeof 
jQuery.migrateMute&&(jQuery.migrateMute=!0),function(a,b){"use strict";function 
c(c){var 
d=b.console;e[c]||(e[c]=!0,a.migrateWarnings.push(c),d&&d.warn&&!a.migrateMute&&(d.warn("JQMIGRATE:
 "+c),a.migrateTrace&&d.trace&&d.trace()))}function 
d(a,b,d,e){Object.defineProperty(a,b,{configurable:!0,enumerable:!0,get:function(){return
 c(e),d}})}a.migrateVersion="3.0.0",function(){var 
c=b.console&&b.console.log&&function(){b.console.log.apply(b.console,arguments)},d=/^[12]\./
 [...]
\ No newline at end of file
diff --git 
a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js
new file mode 100644
index 0000000..d0585ce
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.js
@@ -0,0 +1,838 @@
+/*!
+ * jQuery Migrate - v3.3.0 - 2020-05-05T01:57Z
+ * Copyright OpenJS Foundation and other contributors
+ */
+( function( factory ) {
+       "use strict";
+
+       if ( typeof define === "function" && define.amd ) {
+
+               // AMD. Register as an anonymous module.
+               define( [ "jquery" ], function( jQuery ) {
+                       return factory( jQuery, window );
+               } );
+       } else if ( typeof module === "object" && module.exports ) {
+
+               // Node/CommonJS
+               // eslint-disable-next-line no-undef
+               module.exports = factory( require( "jquery" ), window );
+       } else {
+
+               // Browser globals
+               factory( jQuery, window );
+       }
+} )( function( jQuery, window ) {
+"use strict";
+
+jQuery.migrateVersion = "3.3.0";
+
+// Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2
+function compareVersions( v1, v2 ) {
+       var i,
+               rVersionParts = /^(\d+)\.(\d+)\.(\d+)/,
+               v1p = rVersionParts.exec( v1 ) || [ ],
+               v2p = rVersionParts.exec( v2 ) || [ ];
+
+       for ( i = 1; i <= 3; i++ ) {
+               if ( +v1p[ i ] > +v2p[ i ] ) {
+                       return 1;
+               }
+               if ( +v1p[ i ] < +v2p[ i ] ) {
+                       return -1;
+               }
+       }
+       return 0;
+}
+
+function jQueryVersionSince( version ) {
+       return compareVersions( jQuery.fn.jquery, version ) >= 0;
+}
+
+( function() {
+
+       // Support: IE9 only
+       // IE9 only creates console object when dev tools are first opened
+       // IE9 console is a host object, callable but doesn't have .apply()
+       if ( !window.console || !window.console.log ) {
+               return;
+       }
+
+       // Need jQuery 3.0.0+ and no older Migrate loaded
+       if ( !jQuery || !jQueryVersionSince( "3.0.0" ) ) {
+               window.console.log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
+       }
+       if ( jQuery.migrateWarnings ) {
+               window.console.log( "JQMIGRATE: Migrate plugin loaded multiple 
times" );
+       }
+
+       // Show a message on the console so devs know we're active
+       window.console.log( "JQMIGRATE: Migrate is installed" +
+               ( jQuery.migrateMute ? "" : " with logging active" ) +
+               ", version " + jQuery.migrateVersion );
+
+} )();
+
+var warnedAbout = {};
+
+// By default each warning is only reported once.
+jQuery.migrateDeduplicateWarnings = true;
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+       jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+       warnedAbout = {};
+       jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg ) {
+       var console = window.console;
+       if ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) {
+               warnedAbout[ msg ] = true;
+               jQuery.migrateWarnings.push( msg );
+               if ( console && console.warn && !jQuery.migrateMute ) {
+                       console.warn( "JQMIGRATE: " + msg );
+                       if ( jQuery.migrateTrace && console.trace ) {
+                               console.trace();
+                       }
+               }
+       }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+       Object.defineProperty( obj, prop, {
+               configurable: true,
+               enumerable: true,
+               get: function() {
+                       migrateWarn( msg );
+                       return value;
+               },
+               set: function( newValue ) {
+                       migrateWarn( msg );
+                       value = newValue;
+               }
+       } );
+}
+
+function migrateWarnFunc( obj, prop, newFunc, msg ) {
+       obj[ prop ] = function() {
+               migrateWarn( msg );
+               return newFunc.apply( this, arguments );
+       };
+}
+
+if ( window.document.compatMode === "BackCompat" ) {
+
+       // JQuery has never supported or tested Quirks Mode
+       migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+var findProp,
+       class2type = {},
+       oldInit = jQuery.fn.init,
+       oldFind = jQuery.find,
+
+       rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
+       rattrHashGlob = 
/\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
+
+       // Support: Android <=4.0 only
+       // Make sure we trim BOM and NBSP
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn.init = function( arg1 ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       if ( typeof arg1 === "string" && arg1 === "#" ) {
+
+               // JQuery( "#" ) is a bogus ID selector, but it returned an 
empty set before jQuery 3.0
+               migrateWarn( "jQuery( '#' ) is not a valid selector" );
+               args[ 0 ] = [];
+       }
+
+       return oldInit.apply( this, args );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.find = function( selector ) {
+       var args = Array.prototype.slice.call( arguments );
+
+       // Support: PhantomJS 1.x
+       // String#match fails to match when used with a //g RegExp, only on 
some strings
+       if ( typeof selector === "string" && rattrHashTest.test( selector ) ) {
+
+               // The nonstandard and undocumented unquoted-hash was removed 
in jQuery 1.12.0
+               // First see if qS thinks it's a valid selector, if so avoid a 
false positive
+               try {
+                       window.document.querySelector( selector );
+               } catch ( err1 ) {
+
+                       // Didn't *look* valid to qSA, warn and try quoting 
what we think is the value
+                       selector = selector.replace( rattrHashGlob, function( 
_, attr, op, value ) {
+                               return "[" + attr + op + "\"" + value + "\"]";
+                       } );
+
+                       // If the regexp *may* have created an invalid 
selector, don't update it
+                       // Note that there may be false alarms if selector uses 
jQuery extensions
+                       try {
+                               window.document.querySelector( selector );
+                               migrateWarn( "Attribute selector with '#' must 
be quoted: " + args[ 0 ] );
+                               args[ 0 ] = selector;
+                       } catch ( err2 ) {
+                               migrateWarn( "Attribute selector with '#' was 
not fixed: " + args[ 0 ] );
+                       }
+               }
+       }
+
+       return oldFind.apply( this, args );
+};
+
+// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML)
+for ( findProp in oldFind ) {
+       if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) {
+               jQuery.find[ findProp ] = oldFind[ findProp ];
+       }
+}
+
+// The number of elements contained in the matched element set
+migrateWarnFunc( jQuery.fn, "size", function() {
+       return this.length;
+},
+"jQuery.fn.size() is deprecated and removed; use the .length property" );
+
+migrateWarnFunc( jQuery, "parseJSON", function() {
+       return JSON.parse.apply( null, arguments );
+},
+"jQuery.parseJSON is deprecated; use JSON.parse" );
+
+migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady,
+       "jQuery.holdReady is deprecated" );
+
+migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort,
+       "jQuery.unique is deprecated; use jQuery.uniqueSort" );
+
+// Now jQuery.expr.pseudos is the standard incantation
+migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
+       "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" );
+migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
+       "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" );
+
+// Prior to jQuery 3.1.1 there were internal refs so we don't warn there
+if ( jQueryVersionSince( "3.1.1" ) ) {
+       migrateWarnFunc( jQuery, "trim", function( text ) {
+               return text == null ?
+                       "" :
+                       ( text + "" ).replace( rtrim, "" );
+       },
+       "jQuery.trim is deprecated; use String.prototype.trim" );
+}
+
+// Prior to jQuery 3.2 there were internal refs so we don't warn there
+if ( jQueryVersionSince( "3.2.0" ) ) {
+       migrateWarnFunc( jQuery, "nodeName", function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toLowerCase() === 
name.toLowerCase();
+       },
+       "jQuery.nodeName is deprecated" );
+}
+
+if ( jQueryVersionSince( "3.3.0" ) ) {
+
+       migrateWarnFunc( jQuery, "isNumeric", function( obj ) {
+
+                       // As of jQuery 3.0, isNumeric is limited to
+                       // strings and numbers (primitives or objects)
+                       // that can be coerced to finite numbers (gh-2662)
+                       var type = typeof obj;
+                       return ( type === "number" || type === "string" ) &&
+
+                               // parseFloat NaNs numeric-cast false positives 
("")
+                               // ...but misinterprets leading-number strings, 
e.g. hex literals ("0x...")
+                               // subtraction forces infinities to NaN
+                               !isNaN( obj - parseFloat( obj ) );
+               },
+               "jQuery.isNumeric() is deprecated"
+       );
+
+       // Populate the class2type map
+       jQuery.each( "Boolean Number String Function Array Date RegExp Object 
Error Symbol".
+               split( " " ),
+       function( _, name ) {
+               class2type[ "[object " + name + "]" ] = name.toLowerCase();
+       } );
+
+       migrateWarnFunc( jQuery, "type", function( obj ) {
+               if ( obj == null ) {
+                       return obj + "";
+               }
+
+               // Support: Android <=2.3 only (functionish RegExp)
+               return typeof obj === "object" || typeof obj === "function" ?
+                       class2type[ Object.prototype.toString.call( obj ) ] || 
"object" :
+                       typeof obj;
+       },
+       "jQuery.type is deprecated" );
+
+       migrateWarnFunc( jQuery, "isFunction",
+               function( obj ) {
+                       return typeof obj === "function";
+               },
+               "jQuery.isFunction() is deprecated" );
+
+       migrateWarnFunc( jQuery, "isWindow",
+               function( obj ) {
+                       return obj != null && obj === obj.window;
+               },
+               "jQuery.isWindow() is deprecated"
+       );
+
+       migrateWarnFunc( jQuery, "isArray", Array.isArray,
+               "jQuery.isArray is deprecated; use Array.isArray"
+       );
+}
+
+// Support jQuery slim which excludes the ajax module
+if ( jQuery.ajax ) {
+
+var oldAjax = jQuery.ajax;
+
+jQuery.ajax = function( ) {
+       var jQXHR = oldAjax.apply( this, arguments );
+
+       // Be sure we got a jQXHR (e.g., not sync)
+       if ( jQXHR.promise ) {
+               migrateWarnFunc( jQXHR, "success", jQXHR.done,
+                       "jQXHR.success is deprecated and removed" );
+               migrateWarnFunc( jQXHR, "error", jQXHR.fail,
+                       "jQXHR.error is deprecated and removed" );
+               migrateWarnFunc( jQXHR, "complete", jQXHR.always,
+                       "jQXHR.complete is deprecated and removed" );
+       }
+
+       return jQXHR;
+};
+
+}
+
+var oldRemoveAttr = jQuery.fn.removeAttr,
+       oldToggleClass = jQuery.fn.toggleClass,
+       rmatchNonSpace = /\S+/g;
+
+jQuery.fn.removeAttr = function( name ) {
+       var self = this;
+
+       jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) {
+               if ( jQuery.expr.match.bool.test( attr ) ) {
+                       migrateWarn( "jQuery.fn.removeAttr no longer sets 
boolean properties: " + attr );
+                       self.prop( attr, false );
+               }
+       } );
+
+       return oldRemoveAttr.apply( this, arguments );
+};
+
+jQuery.fn.toggleClass = function( state ) {
+
+       // Only deprecating no-args or single boolean arg
+       if ( state !== undefined && typeof state !== "boolean" ) {
+               return oldToggleClass.apply( this, arguments );
+       }
+
+       migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
+
+       // Toggle entire class name of each element
+       return this.each( function() {
+               var className = this.getAttribute && this.getAttribute( "class" 
) || "";
+
+               if ( className ) {
+                       jQuery.data( this, "__className__", className );
+               }
+
+               // If the element has a class name or if we're passed `false`,
+               // then remove the whole classname (if there was one, the above 
saved it).
+               // Otherwise bring back whatever was previously saved (if 
anything),
+               // falling back to the empty string if nothing was stored.
+               if ( this.setAttribute ) {
+                       this.setAttribute( "class",
+                               className || state === false ?
+                               "" :
+                               jQuery.data( this, "__className__" ) || ""
+                       );
+               }
+       } );
+};
+
+function camelCase( string ) {
+       return string.replace( /-([a-z])/g, function( _, letter ) {
+               return letter.toUpperCase();
+       } );
+}
+
+var oldFnCss,
+       internalSwapCall = false,
+       ralphaStart = /^[a-z]/,
+
+       // The regex visualized:
+       //
+       //                         /----------\
+       //                        |            |    /-------\
+       //                        |  / Top  \  |   |         |
+       //         /--- Border ---+-| Right  |-+---+- Width -+---\
+       //        |                 | Bottom |                    |
+       //        |                  \ Left /                     |
+       //        |                                               |
+       //        |                              /----------\     |
+       //        |          /-------------\    |            |    |- END
+       //        |         |               |   |  / Top  \  |    |
+       //        |         |  / Margin  \  |   | | Right  | |    |
+       //        |---------+-|           |-+---+-| Bottom |-+----|
+       //        |            \ Padding /         \ Left /       |
+       // BEGIN -|                                               |
+       //        |                /---------\                    |
+       //        |               |           |                   |
+       //        |               |  / Min \  |    / Width  \     |
+       //         \--------------+-|       |-+---|          |---/
+       //                           \ Max /       \ Height /
+       rautoPx = 
/^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/;
+
+// If this version of jQuery has .swap(), don't false-alarm on internal uses
+if ( jQuery.swap ) {
+       jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, 
name ) {
+               var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name 
].get;
+
+               if ( oldHook ) {
+                       jQuery.cssHooks[ name ].get = function() {
+                               var ret;
+
+                               internalSwapCall = true;
+                               ret = oldHook.apply( this, arguments );
+                               internalSwapCall = false;
+                               return ret;
+                       };
+               }
+       } );
+}
+
+jQuery.swap = function( elem, options, callback, args ) {
+       var ret, name,
+               old = {};
+
+       if ( !internalSwapCall ) {
+               migrateWarn( "jQuery.swap() is undocumented and deprecated" );
+       }
+
+       // Remember the old values, and insert the new ones
+       for ( name in options ) {
+               old[ name ] = elem.style[ name ];
+               elem.style[ name ] = options[ name ];
+       }
+
+       ret = callback.apply( elem, args || [] );
+
+       // Revert the old values
+       for ( name in options ) {
+               elem.style[ name ] = old[ name ];
+       }
+
+       return ret;
+};
+
+if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) {
+
+       jQuery.cssProps = new Proxy( jQuery.cssProps || {}, {
+               set: function() {
+                       migrateWarn( "JQMIGRATE: jQuery.cssProps is deprecated" 
);
+                       return Reflect.set.apply( this, arguments );
+               }
+       } );
+}
+
+// Create a dummy jQuery.cssNumber if missing. It won't be used by jQuery but
+// it will prevent code adding new keys to it unconditionally from crashing.
+if ( !jQuery.cssNumber ) {
+       jQuery.cssNumber = {};
+}
+
+function isAutoPx( prop ) {
+
+       // The first test is used to ensure that:
+       // 1. The prop starts with a lowercase letter (as we uppercase it for 
the second regex).
+       // 2. The prop is not empty.
+       return ralphaStart.test( prop ) &&
+               rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) );
+}
+
+oldFnCss = jQuery.fn.css;
+
+jQuery.fn.css = function( name, value ) {
+       var origThis = this;
+       if ( typeof name !== "string" ) {
+               jQuery.each( name, function( n, v ) {
+                       jQuery.fn.css.call( origThis, n, v );
+               } );
+       }
+       if ( typeof value === "number" && !isAutoPx( camelCase( name ) ) ) {
+               migrateWarn( "Use of number-typed values is deprecated in 
jQuery.fn.css" );
+       }
+
+       return oldFnCss.apply( this, arguments );
+};
+
+var oldData = jQuery.data;
+
+jQuery.data = function( elem, name, value ) {
+       var curData, sameKeys, key;
+
+       // Name can be an object, and each entry in the object is meant to be 
set as data
+       if ( name && typeof name === "object" && arguments.length === 2 ) {
+               curData = jQuery.hasData( elem ) && oldData.call( this, elem );
+               sameKeys = {};
+               for ( key in name ) {
+                       if ( key !== camelCase( key ) ) {
+                               migrateWarn( "jQuery.data() always sets/gets 
camelCased names: " + key );
+                               curData[ key ] = name[ key ];
+                       } else {
+                               sameKeys[ key ] = name[ key ];
+                       }
+               }
+
+               oldData.call( this, elem, sameKeys );
+
+               return name;
+       }
+
+       // If the name is transformed, look for the un-transformed name in the 
data object
+       if ( name && typeof name === "string" && name !== camelCase( name ) ) {
+               curData = jQuery.hasData( elem ) && oldData.call( this, elem );
+               if ( curData && name in curData ) {
+                       migrateWarn( "jQuery.data() always sets/gets camelCased 
names: " + name );
+                       if ( arguments.length > 2 ) {
+                               curData[ name ] = value;
+                       }
+                       return curData[ name ];
+               }
+       }
+
+       return oldData.apply( this, arguments );
+};
+
+// Support jQuery slim which excludes the effects module
+if ( jQuery.fx ) {
+
+var intervalValue, intervalMsg,
+       oldTweenRun = jQuery.Tween.prototype.run,
+       linearEasing = function( pct ) {
+               return pct;
+       };
+
+jQuery.Tween.prototype.run = function( ) {
+       if ( jQuery.easing[ this.easing ].length > 1 ) {
+               migrateWarn(
+                       "'jQuery.easing." + this.easing.toString() + "' should 
use only one argument"
+               );
+
+               jQuery.easing[ this.easing ] = linearEasing;
+       }
+
+       oldTweenRun.apply( this, arguments );
+};
+
+intervalValue = jQuery.fx.interval || 13;
+intervalMsg = "jQuery.fx.interval is deprecated";
+
+// Support: IE9, Android <=4.4
+// Avoid false positives on browsers that lack rAF
+// Don't warn if document is hidden, jQuery uses setTimeout (#292)
+if ( window.requestAnimationFrame ) {
+       Object.defineProperty( jQuery.fx, "interval", {
+               configurable: true,
+               enumerable: true,
+               get: function() {
+                       if ( !window.document.hidden ) {
+                               migrateWarn( intervalMsg );
+                       }
+                       return intervalValue;
+               },
+               set: function( newValue ) {
+                       migrateWarn( intervalMsg );
+                       intervalValue = newValue;
+               }
+       } );
+}
+
+}
+
+var oldLoad = jQuery.fn.load,
+       oldEventAdd = jQuery.event.add,
+       originalFix = jQuery.event.fix;
+
+jQuery.event.props = [];
+jQuery.event.fixHooks = {};
+
+migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat,
+       "jQuery.event.props.concat() is deprecated and removed" );
+
+jQuery.event.fix = function( originalEvent ) {
+       var event,
+               type = originalEvent.type,
+               fixHook = this.fixHooks[ type ],
+               props = jQuery.event.props;
+
+       if ( props.length ) {
+               migrateWarn( "jQuery.event.props are deprecated and removed: " 
+ props.join() );
+               while ( props.length ) {
+                       jQuery.event.addProp( props.pop() );
+               }
+       }
+
+       if ( fixHook && !fixHook._migrated_ ) {
+               fixHook._migrated_ = true;
+               migrateWarn( "jQuery.event.fixHooks are deprecated and removed: 
" + type );
+               if ( ( props = fixHook.props ) && props.length ) {
+                       while ( props.length ) {
+                               jQuery.event.addProp( props.pop() );
+                       }
+               }
+       }
+
+       event = originalFix.call( this, originalEvent );
+
+       return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent 
) : event;
+};
+
+jQuery.event.add = function( elem, types ) {
+
+       // This misses the multiple-types case but that seems awfully rare
+       if ( elem === window && types === "load" && window.document.readyState 
=== "complete" ) {
+               migrateWarn( "jQuery(window).on('load'...) called after load 
event occurred" );
+       }
+       return oldEventAdd.apply( this, arguments );
+};
+
+jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
+
+       jQuery.fn[ name ] = function() {
+               var args = Array.prototype.slice.call( arguments, 0 );
+
+               // If this is an ajax load() the first arg should be the string 
URL;
+               // technically this could also be the "Anything" arg of the 
event .load()
+               // which just goes to show why this dumb signature has been 
deprecated!
+               // jQuery custom builds that exclude the Ajax module 
justifiably die here.
+               if ( name === "load" && typeof args[ 0 ] === "string" ) {
+                       return oldLoad.apply( this, args );
+               }
+
+               migrateWarn( "jQuery.fn." + name + "() is deprecated" );
+
+               args.splice( 0, 0, name );
+               if ( arguments.length ) {
+                       return this.on.apply( this, args );
+               }
+
+               // Use .triggerHandler here because:
+               // - load and unload events don't need to bubble, only applied 
to window or image
+               // - error event should not bubble to window, although it does 
pre-1.7
+               // See http://bugs.jquery.com/ticket/11820
+               this.triggerHandler.apply( this, args );
+               return this;
+       };
+
+} );
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " 
+
+       "change select submit keydown keypress keyup contextmenu" ).split( " " 
),
+       function( _i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               migrateWarn( "jQuery.fn." + name + "() event shorthand is 
deprecated" );
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
+} );
+
+// Trigger "ready" event only once, on document ready
+jQuery( function() {
+       jQuery( window.document ).triggerHandler( "ready" );
+} );
+
+jQuery.event.special.ready = {
+       setup: function() {
+               if ( this === window.document ) {
+                       migrateWarn( "'ready' event is deprecated" );
+               }
+       }
+};
+
+jQuery.fn.extend( {
+
+       bind: function( types, data, fn ) {
+               migrateWarn( "jQuery.fn.bind() is deprecated" );
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               migrateWarn( "jQuery.fn.unbind() is deprecated" );
+               return this.off( types, null, fn );
+       },
+       delegate: function( selector, types, data, fn ) {
+               migrateWarn( "jQuery.fn.delegate() is deprecated" );
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               migrateWarn( "jQuery.fn.undelegate() is deprecated" );
+               return arguments.length === 1 ?
+                       this.off( selector, "**" ) :
+                       this.off( types, selector || "**", fn );
+       },
+       hover: function( fnOver, fnOut ) {
+               migrateWarn( "jQuery.fn.hover() is deprecated" );
+               return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut 
|| fnOver );
+       }
+} );
+
+var rxhtmlTag = 
/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+       origHtmlPrefilter = jQuery.htmlPrefilter,
+       makeMarkup = function( html ) {
+               var doc = window.document.implementation.createHTMLDocument( "" 
);
+               doc.body.innerHTML = html;
+               return doc.body && doc.body.innerHTML;
+       },
+       warnIfChanged = function( html ) {
+               var changed = html.replace( rxhtmlTag, "<$1></$2>" );
+               if ( changed !== html && makeMarkup( html ) !== makeMarkup( 
changed ) ) {
+                       migrateWarn( "HTML tags must be properly nested and 
closed: " + html );
+               }
+       };
+
+jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() {
+       jQuery.htmlPrefilter = function( html ) {
+               warnIfChanged( html );
+               return html.replace( rxhtmlTag, "<$1></$2>" );
+       };
+};
+
+jQuery.htmlPrefilter = function( html ) {
+       warnIfChanged( html );
+       return origHtmlPrefilter( html );
+};
+
+var oldOffset = jQuery.fn.offset;
+
+jQuery.fn.offset = function() {
+       var docElem,
+               elem = this[ 0 ],
+               bogus = { top: 0, left: 0 };
+
+       if ( !elem || !elem.nodeType ) {
+               migrateWarn( "jQuery.fn.offset() requires a valid DOM element" 
);
+               return undefined;
+       }
+
+       docElem = ( elem.ownerDocument || window.document ).documentElement;
+       if ( !jQuery.contains( docElem, elem ) ) {
+               migrateWarn( "jQuery.fn.offset() requires an element connected 
to a document" );
+               return bogus;
+       }
+
+       return oldOffset.apply( this, arguments );
+};
+
+// Support jQuery slim which excludes the ajax module
+// The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional`
+// so it doesn't make sense for the slim build.
+if ( jQuery.ajax ) {
+
+var oldParam = jQuery.param;
+
+jQuery.param = function( data, traditional ) {
+       var ajaxTraditional = jQuery.ajaxSettings && 
jQuery.ajaxSettings.traditional;
+
+       if ( traditional === undefined && ajaxTraditional ) {
+
+               migrateWarn( "jQuery.param() no longer uses 
jQuery.ajaxSettings.traditional" );
+               traditional = ajaxTraditional;
+       }
+
+       return oldParam.call( this, data, traditional );
+};
+
+}
+
+var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+       migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use 
jQuery.fn.addBack()" );
+       return oldSelf.apply( this, arguments );
+};
+
+// Support jQuery slim which excludes the deferred module in jQuery 4.0+
+if ( jQuery.Deferred ) {
+
+var oldDeferred = jQuery.Deferred,
+       tuples = [
+
+               // Action, add listener, callbacks, .then handlers, final state
+               [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "resolved" ],
+               [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+                       jQuery.Callbacks( "once memory" ), "rejected" ],
+               [ "notify", "progress", jQuery.Callbacks( "memory" ),
+                       jQuery.Callbacks( "memory" ) ]
+       ];
+
+jQuery.Deferred = function( func ) {
+       var deferred = oldDeferred(),
+               promise = deferred.promise();
+
+       deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress 
*/ ) {
+               var fns = arguments;
+
+               migrateWarn( "deferred.pipe() is deprecated" );
+
+               return jQuery.Deferred( function( newDefer ) {
+                       jQuery.each( tuples, function( i, tuple ) {
+                               var fn = typeof fns[ i ] === "function" && fns[ 
i ];
+
+                               // Deferred.done(function() { bind to newDefer 
or newDefer.resolve })
+                               // deferred.fail(function() { bind to newDefer 
or newDefer.reject })
+                               // deferred.progress(function() { bind to 
newDefer or newDefer.notify })
+                               deferred[ tuple[ 1 ] ]( function() {
+                                       var returned = fn && fn.apply( this, 
arguments );
+                                       if ( returned && typeof 
returned.promise === "function" ) {
+                                               returned.promise()
+                                                       .done( newDefer.resolve 
)
+                                                       .fail( newDefer.reject )
+                                                       .progress( 
newDefer.notify );
+                                       } else {
+                                               newDefer[ tuple[ 0 ] + "With" ](
+                                                       this === promise ? 
newDefer.promise() : this,
+                                                       fn ? [ returned ] : 
arguments
+                                               );
+                                       }
+                               } );
+                       } );
+                       fns = null;
+               } ).promise();
+
+       };
+
+       if ( func ) {
+               func.call( deferred, deferred );
+       }
+
+       return deferred;
+};
+
+// Preserve handler of uncaught exceptions in promise chains
+jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook;
+
+}
+
+return jQuery;
+} );
diff --git 
a/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js 
b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js
new file mode 100644
index 0000000..411afbd
--- /dev/null
+++ b/themes/common-theme/webapp/common/js/jquery/jquery-migrate-3.3.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery Migrate v3.3.0 | (c) OpenJS Foundation and other contributors | 
jquery.org/license */
+"undefined"==typeof 
jQuery.migrateMute&&(jQuery.migrateMute=!0),function(t){"use 
strict";"function"==typeof 
define&&define.amd?define(["jquery"],function(e){return 
t(e,window)}):"object"==typeof 
module&&module.exports?module.exports=t(require("jquery"),window):t(jQuery,window)}(function(s,n){"use
 strict";function e(e){return 0<=function(e,t){var 
r,n=/^(\d+)\.(\d+)\.(\d+)/,i=n.exec(e)||[],o=n.exec(t)||[];for(r=1;r<=3;r++){if(+i[r]>+o[r])return
 1;if(+i[r]<+o[r])return-1}return 0}(s.fn.jque [...]
diff --git a/themes/common-theme/webapp/common/js/util/application.js 
b/themes/common-theme/webapp/common/js/util/application.js
index ec6c0db..fbecfef 100644
--- a/themes/common-theme/webapp/common/js/util/application.js
+++ b/themes/common-theme/webapp/common/js/util/application.js
@@ -191,7 +191,7 @@ var FORMALIZE = (function($, window, document, undefined) {
             }
         }
     };
-})(jQuery, this);
+})(jQuery, this, document);
 
 jQuery(document).ready(function() {
     FORMALIZE.go();
diff --git a/themes/common-theme/widget/CommonScreens.xml 
b/themes/common-theme/widget/CommonScreens.xml
index 9c9172b..2a49029 100644
--- a/themes/common-theme/widget/CommonScreens.xml
+++ b/themes/common-theme/widget/CommonScreens.xml
@@ -358,8 +358,8 @@ under the License.
                         <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/ui/jquery-ui-1.12.1.min.js"/>
                         <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/plugins/validate/jquery.validate.min.js"/>
                         <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js" 
global="true"/>
-                        <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-migrate-3.0.0.min.js" global="true"/>
-                        <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-3.4.1.min.js" global="true"/>
+                        <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-migrate-3.3.0.min.js" global="true"/>
+                        <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-3.5.1.min.js" global="true"/>
                         <set field="layoutSettings.javaScripts[]" 
value="/common/js/util/OfbizUtil.js" global="true"/>
                     </actions>
                     <widgets>
@@ -449,8 +449,8 @@ under the License.
                 <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/plugins/fjTimer/jquerytimer-min.js" global="true"/>
                 <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/plugins/validate/jquery.validate.min.js" 
global="true"/>
                 <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js" 
global="true"/>
-                <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-migrate-3.0.0.min.js" global="true" />
-                <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-3.4.1.min.js" global="true"/>
+                <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-migrate-3.3.0.min.js" global="true" />
+                <set field="layoutSettings.javaScripts[+0]" 
value="/common/js/jquery/jquery-3.5.1.min.js" global="true"/>
                     <!-- jQuery CSSs -->
                 <set field="layoutSettings.styleSheets[+0]" 
value="/common/js/jquery/plugins/select2/css/select2-4.0.6.css" global="true"/>
                 <set field="layoutSettings.styleSheets[+0]" 
value="/common/js/jquery/ui/jquery-ui-1.12.1.min.css" global="true" />
diff --git a/themes/common-theme/widget/Theme.xml 
b/themes/common-theme/widget/Theme.xml
index 3fee75f..a99fde3 100644
--- a/themes/common-theme/widget/Theme.xml
+++ b/themes/common-theme/widget/Theme.xml
@@ -45,7 +45,7 @@ under the License.
     </widget-properties>
 
     <theme-properties> <!--specific properties dedicate to this theme -->
-        <!--jgrowl properties-->    
+        <!--jgrowl properties-->
         <property name="jgrowlPosition" value="center" 
type="String"/><!--possible value: top-left, top-right, bottom-left, 
bottom-right, center-->
         <property name="jgrowlWidth" value="800" type="Integer"/>
         <property name="jgrowlHeight" value="" type="Integer"/>
@@ -57,8 +57,8 @@ under the License.
         <property name="VT_NAV_TMPLT_LOC" 
value="component://flatgrey/template/AppBar.ftl"/>
         <property name="VT_MSG_TMPLT_LOC" 
value="component://common-theme/template/includes/Messages.ftl"/>
         <!--javascript libs-->
-        <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/jquery-3.4.1.min.js"/>
-        <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/jquery-migrate-3.0.0.min.js"/>
+        <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/jquery-3.5.1.min.js"/>
+        <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/jquery-migrate-3.3.0.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/plugins/browser-plugin/jquery.browser-0.1.0.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/ui/jquery-ui-1.12.1.min.js"/>
         <property name="VT_HDR_JAVASCRIPT['add']" 
value="/common/js/jquery/plugins/select2/js/select2-4.0.6.js"/>

Reply via email to