Make WordPress Core

Ticket #37110: 37110.3.diff

File 37110.3.diff, 532.1 KB (added by adamsilverstein, 8 years ago)
  • src/wp-admin/js/customize-controls.js

    diff --git src/wp-admin/js/customize-controls.js src/wp-admin/js/customize-controls.js
    index af93b06ce5..8cf185eb8e 100644
     
    546546                                return;
    547547                        }
    548548
    549                         duration = ( 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 );
     549                        duration = ( api.previewer && 'resolved' === api.previewer.deferred.active.state() ? args.duration : 0 );
    550550
    551551                        if ( construct.extended( api.Panel ) ) {
    552552                                // If this is a panel is not currently expanded but another panel is expanded, do not animate.
  • src/wp-admin/js/customize-nav-menus.js

    diff --git src/wp-admin/js/customize-nav-menus.js src/wp-admin/js/customize-nav-menus.js
    index 2bc192c6a0..19e143fa90 100644
     
    216216                        });
    217217
    218218                        // Load available items if it looks like we'll need them.
    219                         api.panel( 'nav_menus' ).container.bind( 'expanded', function() {
     219                        api.panel( 'nav_menus' ).container.on( 'expanded', function() {
    220220                                if ( ! self.rendered ) {
    221221                                        self.initList();
    222222                                        self.rendered = true;
  • src/wp-includes/js/customize-base.js

    diff --git src/wp-includes/js/customize-base.js src/wp-includes/js/customize-base.js
    index 3fdb92423f..bc18866c46 100644
    window.wp = window.wp || {}; 
    567567                        };
    568568
    569569                        this.bind( this.update );
    570                         this.element.bind( this.events, this.refresh );
     570                        this.element.on( this.events, this.refresh );
    571571                },
    572572
    573573                find: function( selector ) {
  • new file src/wp-includes/js/jquery/jquery-legacy.js

    diff --git src/wp-includes/js/jquery/jquery-legacy.js src/wp-includes/js/jquery/jquery-legacy.js
    new file mode 100644
    index 0000000000..292c720a4e
    - +  
     1/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
     2!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
     3}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
     4marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
     5padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
     6jQuery.noConflict();
  • src/wp-includes/js/jquery/jquery-migrate.js

    diff --git src/wp-includes/js/jquery/jquery-migrate.js src/wp-includes/js/jquery/jquery-migrate.js
    index 89437ebed9..05b1a803c2 100644
     
    11/*!
    2  * jQuery Migrate - v1.4.1 - 2016-05-19
     2 * jQuery Migrate - v3.0.0 - 2016-06-09
    33 * Copyright jQuery Foundation and other contributors
    44 */
    5 (function( jQuery, window, undefined ) {
    6 // See http://bugs.jquery.com/ticket/13335
    7 // "use strict";
     5(function( jQuery, window ) {
     6"use strict";
    87
    98
    10 jQuery.migrateVersion = "1.4.1";
     9jQuery.migrateVersion = "3.0.0";
    1110
    1211
    13 var warnedAbout = {};
     12( function() {
    1413
    15 // List of warnings already given; public read only
    16 jQuery.migrateWarnings = [];
     14        // Support: IE9 only
     15        // IE9 only creates console object when dev tools are first opened
     16        // Also, avoid Function#bind here to simplify PhantomJS usage
     17        var log = window.console && window.console.log &&
     18                        function() { window.console.log.apply( window.console, arguments ); },
     19                rbadVersions = /^[12]\./;
     20
     21        if ( !log ) {
     22                return;
     23        }
    1724
    18 // Set to true to prevent console output; migrateWarnings still maintained
    19 // jQuery.migrateMute = false;
     25        // Need jQuery 3.0.0+ and no older Migrate loaded
     26        if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) {
     27                log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" );
     28        }
     29        if ( jQuery.migrateWarnings ) {
     30                log( "JQMIGRATE: Migrate plugin loaded multiple times" );
     31        }
    2032
    21 // Show a message on the console so devs know we're active
    22 if ( window.console && window.console.log ) {
    23         window.console.log( "JQMIGRATE: Migrate is installed" +
     33        // Show a message on the console so devs know we're active
     34        log( "JQMIGRATE: Migrate is installed" +
    2435                ( jQuery.migrateMute ? "" : " with logging active" ) +
    2536                ", version " + jQuery.migrateVersion );
    26 }
     37
     38} )();
     39
     40var warnedAbout = {};
     41
     42// List of warnings already given; public read only
     43jQuery.migrateWarnings = [];
    2744
    2845// Set to false to disable traces that appear with warnings
    2946if ( jQuery.migrateTrace === undefined ) {
    jQuery.migrateReset = function() { 
    3653        jQuery.migrateWarnings.length = 0;
    3754};
    3855
    39 function migrateWarn( msg) {
     56function migrateWarn( msg ) {
    4057        var console = window.console;
    4158        if ( !warnedAbout[ msg ] ) {
    4259                warnedAbout[ msg ] = true;
    function migrateWarn( msg) { 
    5168}
    5269
    5370function migrateWarnProp( obj, prop, value, msg ) {
    54         if ( Object.defineProperty ) {
    55                 // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
    56                 // allow property to be overwritten in case some other plugin wants it
    57                 try {
    58                         Object.defineProperty( obj, prop, {
    59                                 configurable: true,
    60                                 enumerable: true,
    61                                 get: function() {
    62                                         migrateWarn( msg );
    63                                         return value;
    64                                 },
    65                                 set: function( newValue ) {
    66                                         migrateWarn( msg );
    67                                         value = newValue;
    68                                 }
    69                         });
    70                         return;
    71                 } catch( err ) {
    72                         // IE8 is a dope about Object.defineProperty, can't warn there
     71        Object.defineProperty( obj, prop, {
     72                configurable: true,
     73                enumerable: true,
     74                get: function() {
     75                        migrateWarn( msg );
     76                        return value;
    7377                }
    74         }
    75 
    76         // Non-ES5 (or broken) browser; just set the property
    77         jQuery._definePropertyBroken = true;
    78         obj[ prop ] = value;
     78        } );
    7979}
    8080
    8181if ( document.compatMode === "BackCompat" ) {
    82         // jQuery has never supported or tested Quirks Mode
     82
     83        // JQuery has never supported or tested Quirks Mode
    8384        migrateWarn( "jQuery is not compatible with Quirks Mode" );
    8485}
    8586
    8687
    87 var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
    88         oldAttr = jQuery.attr,
    89         valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
    90                 function() { return null; },
    91         valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
    92                 function() { return undefined; },
    93         rnoType = /^(?:input|button)$/i,
    94         rnoAttrNodeType = /^[238]$/,
    95         rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
    96         ruseDefault = /^(?:checked|selected)$/i;
    97 
    98 // jQuery.attrFn
    99 migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
    100 
    101 jQuery.attr = function( elem, name, value, pass ) {
    102         var lowerName = name.toLowerCase(),
    103                 nType = elem && elem.nodeType;
    104 
    105         if ( pass ) {
    106                 // Since pass is used internally, we only warn for new jQuery
    107                 // versions where there isn't a pass arg in the formal params
    108                 if ( oldAttr.length < 4 ) {
    109                         migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
    110                 }
    111                 if ( elem && !rnoAttrNodeType.test( nType ) &&
    112                         (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
    113                         return jQuery( elem )[ name ]( value );
    114                 }
    115         }
    116 
    117         // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
    118         // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
    119         if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
    120                 migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
    121         }
    122 
    123         // Restore boolHook for boolean property/attribute synchronization
    124         if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
    125                 jQuery.attrHooks[ lowerName ] = {
    126                         get: function( elem, name ) {
    127                                 // Align boolean attributes with corresponding properties
    128                                 // Fall back to attribute presence where some booleans are not supported
    129                                 var attrNode,
    130                                         property = jQuery.prop( elem, name );
    131                                 return property === true || typeof property !== "boolean" &&
    132                                         ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
    133 
    134                                         name.toLowerCase() :
    135                                         undefined;
    136                         },
    137                         set: function( elem, value, name ) {
    138                                 var propName;
    139                                 if ( value === false ) {
    140                                         // Remove boolean attributes when set to false
    141                                         jQuery.removeAttr( elem, name );
    142                                 } else {
    143                                         // value is true since we know at this point it's type boolean and not false
    144                                         // Set boolean attributes to the same name and set the DOM property
    145                                         propName = jQuery.propFix[ name ] || name;
    146                                         if ( propName in elem ) {
    147                                                 // Only set the IDL specifically if it already exists on the element
    148                                                 elem[ propName ] = true;
    149                                         }
    150 
    151                                         elem.setAttribute( name, name.toLowerCase() );
    152                                 }
    153                                 return name;
    154                         }
    155                 };
    156 
    157                 // Warn only for attributes that can remain distinct from their properties post-1.9
    158                 if ( ruseDefault.test( lowerName ) ) {
    159                         migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" );
    160                 }
    161         }
    162 
    163         return oldAttr.call( jQuery, elem, name, value );
    164 };
    165 
    166 // attrHooks: value
    167 jQuery.attrHooks.value = {
    168         get: function( elem, name ) {
    169                 var nodeName = ( elem.nodeName || "" ).toLowerCase();
    170                 if ( nodeName === "button" ) {
    171                         return valueAttrGet.apply( this, arguments );
    172                 }
    173                 if ( nodeName !== "input" && nodeName !== "option" ) {
    174                         migrateWarn("jQuery.fn.attr('value') no longer gets properties");
    175                 }
    176                 return name in elem ?
    177                         elem.value :
    178                         null;
    179         },
    180         set: function( elem, value ) {
    181                 var nodeName = ( elem.nodeName || "" ).toLowerCase();
    182                 if ( nodeName === "button" ) {
    183                         return valueAttrSet.apply( this, arguments );
    184                 }
    185                 if ( nodeName !== "input" && nodeName !== "option" ) {
    186                         migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
    187                 }
    188                 // Does not return so that setAttribute is also used
    189                 elem.value = value;
    190         }
    191 };
    192 
    193 
    194 var matched, browser,
    195         oldInit = jQuery.fn.init,
     88var oldInit = jQuery.fn.init,
     89        oldIsNumeric = jQuery.isNumeric,
    19690        oldFind = jQuery.find,
    197         oldParseJSON = jQuery.parseJSON,
    198         rspaceAngle = /^\s*</,
    19991        rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/,
    200         rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g,
    201         // Note: XSS check is done below after string is trimmed
    202         rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/;
    203 
    204 // $(html) "looks like html" rule change
    205 jQuery.fn.init = function( selector, context, rootjQuery ) {
    206         var match, ret;
    207 
    208         if ( selector && typeof selector === "string" ) {
    209                 if ( !jQuery.isPlainObject( context ) &&
    210                                 (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) {
    211 
    212                         // This is an HTML string according to the "old" rules; is it still?
    213                         if ( !rspaceAngle.test( selector ) ) {
    214                                 migrateWarn("$(html) HTML strings must start with '<' character");
    215                         }
    216                         if ( match[ 3 ] ) {
    217                                 migrateWarn("$(html) HTML text after last tag is ignored");
    218                         }
    219 
    220                         // Consistently reject any HTML-like string starting with a hash (gh-9521)
    221                         // Note that this may break jQuery 1.6.x code that otherwise would work.
    222                         if ( match[ 0 ].charAt( 0 ) === "#" ) {
    223                                 migrateWarn("HTML string cannot start with a '#' character");
    224                                 jQuery.error("JQMIGRATE: Invalid selector string (XSS)");
    225                         }
    226 
    227                         // Now process using loose rules; let pre-1.8 play too
    228                         // Is this a jQuery context? parseHTML expects a DOM element (#178)
    229                         if ( context && context.context && context.context.nodeType ) {
    230                                 context = context.context;
    231                         }
    232 
    233                         if ( jQuery.parseHTML ) {
    234                                 return oldInit.call( this,
    235                                                 jQuery.parseHTML( match[ 2 ], context && context.ownerDocument ||
    236                                                         context || document, true ), context, rootjQuery );
    237                         }
    238                 }
    239         }
     92        rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g;
    24093
    241         ret = oldInit.apply( this, arguments );
     94jQuery.fn.init = function( arg1 ) {
     95        var args = Array.prototype.slice.call( arguments );
    24296
    243         // Fill in selector and context properties so .live() works
    244         if ( selector && selector.selector !== undefined ) {
    245                 // A jQuery object, copy its properties
    246                 ret.selector = selector.selector;
    247                 ret.context = selector.context;
     97        if ( typeof arg1 === "string" && arg1 === "#" ) {
    24898
    249         } else {
    250                 ret.selector = typeof selector === "string" ? selector : "";
    251                 if ( selector ) {
    252                         ret.context = selector.nodeType? selector : context || document;
    253                 }
     99                // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0
     100                migrateWarn( "jQuery( '#' ) is not a valid selector" );
     101                args[ 0 ] = [];
    254102        }
    255103
    256         return ret;
     104        return oldInit.apply( this, args );
    257105};
    258106jQuery.fn.init.prototype = jQuery.fn;
    259107
    for ( findProp in oldFind ) { 
    298146        }
    299147}
    300148
    301 // Let $.parseJSON(falsy_value) return null
    302 jQuery.parseJSON = function( json ) {
    303         if ( !json ) {
    304                 migrateWarn("jQuery.parseJSON requires a valid JSON string");
    305                 return null;
    306         }
    307         return oldParseJSON.apply( this, arguments );
     149// The number of elements contained in the matched element set
     150jQuery.fn.size = function() {
     151        migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
     152        return this.length;
    308153};
    309154
    310 jQuery.uaMatch = function( ua ) {
    311         ua = ua.toLowerCase();
    312 
    313         var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
    314                 /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
    315                 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
    316                 /(msie) ([\w.]+)/.exec( ua ) ||
    317                 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
    318                 [];
    319 
    320         return {
    321                 browser: match[ 1 ] || "",
    322                 version: match[ 2 ] || "0"
    323         };
     155jQuery.parseJSON = function() {
     156        migrateWarn( "jQuery.parseJSON is deprecated; use JSON.parse" );
     157        return JSON.parse.apply( null, arguments );
    324158};
    325159
    326 // Don't clobber any existing jQuery.browser in case it's different
    327 if ( !jQuery.browser ) {
    328         matched = jQuery.uaMatch( navigator.userAgent );
    329         browser = {};
     160jQuery.isNumeric = function( val ) {
    330161
    331         if ( matched.browser ) {
    332                 browser[ matched.browser ] = true;
    333                 browser.version = matched.version;
     162        // The jQuery 2.2.3 implementation of isNumeric
     163        function isNumeric2( obj ) {
     164                var realStringObj = obj && obj.toString();
     165                return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
    334166        }
    335167
    336         // Chrome is Webkit, but Webkit is also Safari.
    337         if ( browser.chrome ) {
    338                 browser.webkit = true;
    339         } else if ( browser.webkit ) {
    340                 browser.safari = true;
     168        var newValue = oldIsNumeric( val ),
     169                oldValue = isNumeric2( val );
     170
     171        if ( newValue !== oldValue ) {
     172                migrateWarn( "jQuery.isNumeric() should not be called on constructed objects" );
    341173        }
    342174
    343         jQuery.browser = browser;
    344 }
     175        return oldValue;
     176};
     177
     178migrateWarnProp( jQuery, "unique", jQuery.uniqueSort,
     179        "jQuery.unique is deprecated, use jQuery.uniqueSort" );
    345180
    346 // Warn if the code tries to get jQuery.browser
    347 migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
     181// Now jQuery.expr.pseudos is the standard incantation
     182migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos,
     183        "jQuery.expr.filters is now jQuery.expr.pseudos" );
     184migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos,
     185        "jQuery.expr[\":\"] is now jQuery.expr.pseudos" );
    348186
    349 // jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7
    350 jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat");
    351 migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" );
    352 migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" );
    353187
    354 jQuery.sub = function() {
    355         function jQuerySub( selector, context ) {
    356                 return new jQuerySub.fn.init( selector, context );
     188var oldAjax = jQuery.ajax;
     189
     190jQuery.ajax = function( ) {
     191        var jQXHR = oldAjax.apply( this, arguments );
     192
     193        // Be sure we got a jQXHR (e.g., not sync)
     194        if ( jQXHR.promise ) {
     195                migrateWarnProp( jQXHR, "success", jQXHR.done,
     196                        "jQXHR.success is deprecated and removed" );
     197                migrateWarnProp( jQXHR, "error", jQXHR.fail,
     198                        "jQXHR.error is deprecated and removed" );
     199                migrateWarnProp( jQXHR, "complete", jQXHR.always,
     200                        "jQXHR.complete is deprecated and removed" );
    357201        }
    358         jQuery.extend( true, jQuerySub, this );
    359         jQuerySub.superclass = this;
    360         jQuerySub.fn = jQuerySub.prototype = this();
    361         jQuerySub.fn.constructor = jQuerySub;
    362         jQuerySub.sub = this.sub;
    363         jQuerySub.fn.init = function init( selector, context ) {
    364                 var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub );
    365                 return instance instanceof jQuerySub ?
    366                         instance :
    367                         jQuerySub( instance );
    368         };
    369         jQuerySub.fn.init.prototype = jQuerySub.fn;
    370         var rootjQuerySub = jQuerySub(document);
    371         migrateWarn( "jQuery.sub() is deprecated" );
    372         return jQuerySub;
     202
     203        return jQXHR;
    373204};
    374205
    375 // The number of elements contained in the matched element set
    376 jQuery.fn.size = function() {
    377         migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" );
    378         return this.length;
     206
     207var oldRemoveAttr = jQuery.fn.removeAttr,
     208        oldToggleClass = jQuery.fn.toggleClass,
     209        rmatchNonSpace = /\S+/g;
     210
     211jQuery.fn.removeAttr = function( name ) {
     212        var self = this;
     213
     214        jQuery.each( name.match( rmatchNonSpace ), function( i, attr ) {
     215                if ( jQuery.expr.match.bool.test( attr ) ) {
     216                        migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr );
     217                        self.prop( attr, false );
     218                }
     219        } );
     220
     221        return oldRemoveAttr.apply( this, arguments );
     222};
     223
     224jQuery.fn.toggleClass = function( state ) {
     225
     226        // Only deprecating no-args or single boolean arg
     227        if ( state !== undefined && typeof state !== "boolean" ) {
     228                return oldToggleClass.apply( this, arguments );
     229        }
     230
     231        migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" );
     232
     233        // Toggle entire class name of each element
     234        return this.each( function() {
     235                var className = this.getAttribute && this.getAttribute( "class" ) || "";
     236
     237                if ( className ) {
     238                        jQuery.data( this, "__className__", className );
     239                }
     240
     241                // If the element has a class name or if we're passed `false`,
     242                // then remove the whole classname (if there was one, the above saved it).
     243                // Otherwise bring back whatever was previously saved (if anything),
     244                // falling back to the empty string if nothing was stored.
     245                if ( this.setAttribute ) {
     246                        this.setAttribute( "class",
     247                                className || state === false ?
     248                                "" :
     249                                jQuery.data( this, "__className__" ) || ""
     250                        );
     251                }
     252        } );
    379253};
    380254
    381255
    if ( jQuery.swap ) { 
    396270                                return ret;
    397271                        };
    398272                }
    399         });
     273        } );
    400274}
    401275
    402276jQuery.swap = function( elem, options, callback, args ) {
    jQuery.swap = function( elem, options, callback, args ) { 
    423297        return ret;
    424298};
    425299
     300var oldData = jQuery.data;
    426301
    427 // Ensure that $.ajax gets the new parseJSON defined in core.js
    428 jQuery.ajaxSetup({
    429         converters: {
    430                 "text json": jQuery.parseJSON
    431         }
    432 });
    433 
    434 
    435 var oldFnData = jQuery.fn.data;
    436 
    437 jQuery.fn.data = function( name ) {
    438         var ret, evt,
    439                 elem = this[0];
     302jQuery.data = function( elem, name, value ) {
     303        var curData;
    440304
    441         // Handles 1.7 which has this behavior and 1.8 which doesn't
    442         if ( elem && name === "events" && arguments.length === 1 ) {
    443                 ret = jQuery.data( elem, name );
    444                 evt = jQuery._data( elem, name );
    445                 if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
    446                         migrateWarn("Use of jQuery.fn.data('events') is deprecated");
    447                         return evt;
     305        // If the name is transformed, look for the un-transformed name in the data object
     306        if ( name && name !== jQuery.camelCase( name ) ) {
     307                curData = jQuery.hasData( elem ) && oldData.call( this, elem );
     308                if ( curData && name in curData ) {
     309                        migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name );
     310                        if ( arguments.length > 2 ) {
     311                                curData[ name ] = value;
     312                        }
     313                        return curData[ name ];
    448314                }
    449315        }
    450         return oldFnData.apply( this, arguments );
     316
     317        return oldData.apply( this, arguments );
    451318};
    452319
     320var oldTweenRun = jQuery.Tween.prototype.run;
    453321
    454 var rscriptType = /\/(java|ecma)script/i;
     322jQuery.Tween.prototype.run = function( percent ) {
     323        if ( jQuery.easing[ this.easing ].length > 1 ) {
     324                migrateWarn(
     325                        "easing function " +
     326                        "\"jQuery.easing." + this.easing.toString() +
     327                        "\" should use only first argument"
     328                );
    455329
    456 // Since jQuery.clean is used internally on older versions, we only shim if it's missing
    457 if ( !jQuery.clean ) {
    458         jQuery.clean = function( elems, context, fragment, scripts ) {
    459                 // Set context per 1.8 logic
    460                 context = context || document;
    461                 context = !context.nodeType && context[0] || context;
    462                 context = context.ownerDocument || context;
     330                jQuery.easing[ this.easing ] = jQuery.easing[ this.easing ].bind(
     331                        jQuery.easing,
     332                        percent, this.options.duration * percent, 0, 1, this.options.duration
     333                );
     334        }
    463335
    464                 migrateWarn("jQuery.clean() is deprecated");
     336        oldTweenRun.apply( this, arguments );
     337};
    465338
    466                 var i, elem, handleScript, jsTags,
    467                         ret = [];
     339var oldLoad = jQuery.fn.load,
     340        originalFix = jQuery.event.fix;
    468341
    469                 jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
     342jQuery.event.props = [];
     343jQuery.event.fixHooks = {};
    470344
    471                 // Complex logic lifted directly from jQuery 1.8
    472                 if ( fragment ) {
    473                         // Special handling of each script element
    474                         handleScript = function( elem ) {
    475                                 // Check if we consider it executable
    476                                 if ( !elem.type || rscriptType.test( elem.type ) ) {
    477                                         // Detach the script and store it in the scripts array (if provided) or the fragment
    478                                         // Return truthy to indicate that it has been handled
    479                                         return scripts ?
    480                                                 scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
    481                                                 fragment.appendChild( elem );
    482                                 }
    483                         };
     345jQuery.event.fix = function( originalEvent ) {
     346        var event,
     347                type = originalEvent.type,
     348                fixHook = this.fixHooks[ type ],
     349                props = jQuery.event.props;
    484350
    485                         for ( i = 0; (elem = ret[i]) != null; i++ ) {
    486                                 // Check if we're done after handling an executable script
    487                                 if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
    488                                         // Append to fragment and handle embedded scripts
    489                                         fragment.appendChild( elem );
    490                                         if ( typeof elem.getElementsByTagName !== "undefined" ) {
    491                                                 // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
    492                                                 jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
    493 
    494                                                 // Splice the scripts into ret after their former ancestor and advance our index beyond them
    495                                                 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
    496                                                 i += jsTags.length;
    497                                         }
    498                                 }
    499                         }
     351        if ( props.length ) {
     352                migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() );
     353                while ( props.length ) {
     354                        jQuery.event.addProp( props.pop() );
    500355                }
     356        }
    501357
    502                 return ret;
    503         };
    504 }
    505 
    506 var eventAdd = jQuery.event.add,
    507         eventRemove = jQuery.event.remove,
    508         eventTrigger = jQuery.event.trigger,
    509         oldToggle = jQuery.fn.toggle,
    510         oldLive = jQuery.fn.live,
    511         oldDie = jQuery.fn.die,
    512         oldLoad = jQuery.fn.load,
    513         ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
    514         rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
    515         rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
    516         hoverHack = function( events ) {
    517                 if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
    518                         return events;
    519                 }
    520                 if ( rhoverHack.test( events ) ) {
    521                         migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
     358        if ( fixHook && !fixHook._migrated_ ) {
     359                fixHook._migrated_ = true;
     360                migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type );
     361                if ( ( props = fixHook.props ) && props.length ) {
     362                        while ( props.length ) {
     363                           jQuery.event.addProp( props.pop() );
     364                        }
    522365                }
    523                 return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
    524         };
    525 
    526 // Event props removed in 1.9, put them back if needed; no practical way to warn them
    527 if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
    528         jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
    529 }
     366        }
    530367
    531 // Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
    532 if ( jQuery.event.dispatch ) {
    533         migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
    534 }
     368        event = originalFix.call( this, originalEvent );
    535369
    536 // Support for 'hover' pseudo-event and ajax event warnings
    537 jQuery.event.add = function( elem, types, handler, data, selector ){
    538         if ( elem !== document && rajaxEvent.test( types ) ) {
    539                 migrateWarn( "AJAX events should be attached to document: " + types );
    540         }
    541         eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
    542 };
    543 jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
    544         eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
     370        return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
    545371};
    546372
    547373jQuery.each( [ "load", "unload", "error" ], function( _, name ) {
    jQuery.each( [ "load", "unload", "error" ], function( _, name ) { 
    561387
    562388                args.splice( 0, 0, name );
    563389                if ( arguments.length ) {
    564                         return this.bind.apply( this, args );
     390                        return this.on.apply( this, args );
    565391                }
    566392
    567393                // Use .triggerHandler here because:
    jQuery.each( [ "load", "unload", "error" ], function( _, name ) { 
    572398                return this;
    573399        };
    574400
    575 });
     401} );
    576402
    577 jQuery.fn.toggle = function( fn, fn2 ) {
     403// Trigger "ready" event only once, on document ready
     404jQuery( function() {
     405        jQuery( document ).triggerHandler( "ready" );
     406} );
    578407
    579         // Don't mess with animation or css toggles
    580         if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
    581                 return oldToggle.apply( this, arguments );
    582         }
    583         migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
    584 
    585         // Save reference to arguments for access in closure
    586         var args = arguments,
    587                 guid = fn.guid || jQuery.guid++,
    588                 i = 0,
    589                 toggler = function( event ) {
    590                         // Figure out which function to execute
    591                         var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
    592                         jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
    593 
    594                         // Make sure that clicks stop
    595                         event.preventDefault();
    596 
    597                         // and execute the function
    598                         return args[ lastToggle ].apply( this, arguments ) || false;
    599                 };
    600 
    601         // link all the functions, so any of them can unbind this click handler
    602         toggler.guid = guid;
    603         while ( i < args.length ) {
    604                 args[ i++ ].guid = guid;
     408jQuery.event.special.ready = {
     409        setup: function() {
     410                if ( this === document ) {
     411                        migrateWarn( "'ready' event is deprecated" );
     412                }
    605413        }
    606 
    607         return this.click( toggler );
    608414};
    609415
    610 jQuery.fn.live = function( types, data, fn ) {
    611         migrateWarn("jQuery.fn.live() is deprecated");
    612         if ( oldLive ) {
    613                 return oldLive.apply( this, arguments );
     416jQuery.fn.extend( {
     417
     418        bind: function( types, data, fn ) {
     419                migrateWarn( "jQuery.fn.bind() is deprecated" );
     420                return this.on( types, null, data, fn );
     421        },
     422        unbind: function( types, fn ) {
     423                migrateWarn( "jQuery.fn.unbind() is deprecated" );
     424                return this.off( types, null, fn );
     425        },
     426        delegate: function( selector, types, data, fn ) {
     427                migrateWarn( "jQuery.fn.delegate() is deprecated" );
     428                return this.on( types, selector, data, fn );
     429        },
     430        undelegate: function( selector, types, fn ) {
     431                migrateWarn( "jQuery.fn.undelegate() is deprecated" );
     432                return arguments.length === 1 ?
     433                        this.off( selector, "**" ) :
     434                        this.off( types, selector || "**", fn );
    614435        }
    615         jQuery( this.context ).on( types, this.selector, data, fn );
    616         return this;
    617 };
     436} );
    618437
    619 jQuery.fn.die = function( types, fn ) {
    620         migrateWarn("jQuery.fn.die() is deprecated");
    621         if ( oldDie ) {
    622                 return oldDie.apply( this, arguments );
     438
     439var oldOffset = jQuery.fn.offset;
     440
     441jQuery.fn.offset = function() {
     442        var docElem,
     443                elem = this[ 0 ],
     444                origin = { top: 0, left: 0 };
     445
     446        if ( !elem || !elem.nodeType ) {
     447                migrateWarn( "jQuery.fn.offset() requires a valid DOM element" );
     448                return origin;
    623449        }
    624         jQuery( this.context ).off( types, this.selector || "**", fn );
    625         return this;
    626 };
    627450
    628 // Turn global events into document-triggered events
    629 jQuery.event.trigger = function( event, data, elem, onlyHandlers  ){
    630         if ( !elem && !rajaxEvent.test( event ) ) {
    631                 migrateWarn( "Global events are undocumented and deprecated" );
     451        docElem = ( elem.ownerDocument || document ).documentElement;
     452        if ( !jQuery.contains( docElem, elem ) ) {
     453                migrateWarn( "jQuery.fn.offset() requires an element connected to a document" );
     454                return origin;
    632455        }
    633         return eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );
     456
     457        return oldOffset.apply( this, arguments );
    634458};
    635 jQuery.each( ajaxEvents.split("|"),
    636         function( _, name ) {
    637                 jQuery.event.special[ name ] = {
    638                         setup: function() {
    639                                 var elem = this;
    640 
    641                                 // The document needs no shimming; must be !== for oldIE
    642                                 if ( elem !== document ) {
    643                                         jQuery.event.add( document, name + "." + jQuery.guid, function() {
    644                                                 jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true );
    645                                         });
    646                                         jQuery._data( this, name, jQuery.guid++ );
    647                                 }
    648                                 return false;
    649                         },
    650                         teardown: function() {
    651                                 if ( this !== document ) {
    652                                         jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
    653                                 }
    654                                 return false;
    655                         }
    656                 };
    657         }
    658 );
    659459
    660 jQuery.event.special.ready = {
    661         setup: function() {
    662                 if ( this === document ) {
    663                         migrateWarn( "'ready' event is deprecated" );
    664                 }
     460
     461var oldParam = jQuery.param;
     462
     463jQuery.param = function( data, traditional ) {
     464        var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
     465
     466        if ( traditional === undefined && ajaxTraditional ) {
     467
     468                migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" );
     469                traditional = ajaxTraditional;
    665470        }
     471
     472        return oldParam.call( this, data, traditional );
    666473};
    667474
    668 var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack,
    669         oldFnFind = jQuery.fn.find;
     475var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
    670476
    671477jQuery.fn.andSelf = function() {
    672         migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
     478        migrateWarn( "jQuery.fn.andSelf() replaced by jQuery.fn.addBack()" );
    673479        return oldSelf.apply( this, arguments );
    674480};
    675481
    676 jQuery.fn.find = function( selector ) {
    677         var ret = oldFnFind.apply( this, arguments );
    678         ret.context = this.context;
    679         ret.selector = this.selector ? this.selector + " " + selector : selector;
    680         return ret;
    681 };
    682 
    683482
    684 // jQuery 1.6 did not support Callbacks, do not warn there
    685 if ( jQuery.Callbacks ) {
    686 
    687         var oldDeferred = jQuery.Deferred,
    688                 tuples = [
    689                         // action, add listener, callbacks, .then handlers, final state
    690                         [ "resolve", "done", jQuery.Callbacks("once memory"),
    691                                 jQuery.Callbacks("once memory"), "resolved" ],
    692                         [ "reject", "fail", jQuery.Callbacks("once memory"),
    693                                 jQuery.Callbacks("once memory"), "rejected" ],
    694                         [ "notify", "progress", jQuery.Callbacks("memory"),
    695                                 jQuery.Callbacks("memory") ]
    696                 ];
    697 
    698         jQuery.Deferred = function( func ) {
    699                 var deferred = oldDeferred(),
    700                         promise = deferred.promise();
    701 
    702                 deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
    703                         var fns = arguments;
    704 
    705                         migrateWarn( "deferred.pipe() is deprecated" );
    706 
    707                         return jQuery.Deferred(function( newDefer ) {
    708                                 jQuery.each( tuples, function( i, tuple ) {
    709                                         var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
    710                                         // deferred.done(function() { bind to newDefer or newDefer.resolve })
    711                                         // deferred.fail(function() { bind to newDefer or newDefer.reject })
    712                                         // deferred.progress(function() { bind to newDefer or newDefer.notify })
    713                                         deferred[ tuple[1] ](function() {
    714                                                 var returned = fn && fn.apply( this, arguments );
    715                                                 if ( returned && jQuery.isFunction( returned.promise ) ) {
    716                                                         returned.promise()
    717                                                                 .done( newDefer.resolve )
    718                                                                 .fail( newDefer.reject )
    719                                                                 .progress( newDefer.notify );
    720                                                 } else {
    721                                                         newDefer[ tuple[ 0 ] + "With" ](
    722                                                                 this === promise ? newDefer.promise() : this,
    723                                                                 fn ? [ returned ] : arguments
    724                                                         );
    725                                                 }
    726                                         });
    727                                 });
    728                                 fns = null;
    729                         }).promise();
    730 
    731                 };
    732 
    733                 deferred.isResolved = function() {
    734                         migrateWarn( "deferred.isResolved is deprecated" );
    735                         return deferred.state() === "resolved";
    736                 };
    737 
    738                 deferred.isRejected = function() {
    739                         migrateWarn( "deferred.isRejected is deprecated" );
    740                         return deferred.state() === "rejected";
    741                 };
    742 
    743                 if ( func ) {
    744                         func.call( deferred, deferred );
    745                 }
     483var oldDeferred = jQuery.Deferred,
     484        tuples = [
     485
     486                // Action, add listener, callbacks, .then handlers, final state
     487                [ "resolve", "done", jQuery.Callbacks( "once memory" ),
     488                        jQuery.Callbacks( "once memory" ), "resolved" ],
     489                [ "reject", "fail", jQuery.Callbacks( "once memory" ),
     490                        jQuery.Callbacks( "once memory" ), "rejected" ],
     491                [ "notify", "progress", jQuery.Callbacks( "memory" ),
     492                        jQuery.Callbacks( "memory" ) ]
     493        ];
     494
     495jQuery.Deferred = function( func ) {
     496        var deferred = oldDeferred(),
     497                promise = deferred.promise();
     498
     499        deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) {
     500                var fns = arguments;
     501
     502                migrateWarn( "deferred.pipe() is deprecated" );
     503
     504                return jQuery.Deferred( function( newDefer ) {
     505                        jQuery.each( tuples, function( i, tuple ) {
     506                                var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
     507
     508                                // Deferred.done(function() { bind to newDefer or newDefer.resolve })
     509                                // deferred.fail(function() { bind to newDefer or newDefer.reject })
     510                                // deferred.progress(function() { bind to newDefer or newDefer.notify })
     511                                deferred[ tuple[ 1 ] ]( function() {
     512                                        var returned = fn && fn.apply( this, arguments );
     513                                        if ( returned && jQuery.isFunction( returned.promise ) ) {
     514                                                returned.promise()
     515                                                        .done( newDefer.resolve )
     516                                                        .fail( newDefer.reject )
     517                                                        .progress( newDefer.notify );
     518                                        } else {
     519                                                newDefer[ tuple[ 0 ] + "With" ](
     520                                                        this === promise ? newDefer.promise() : this,
     521                                                        fn ? [ returned ] : arguments
     522                                                );
     523                                        }
     524                                } );
     525                        } );
     526                        fns = null;
     527                } ).promise();
    746528
    747                 return deferred;
    748529        };
    749530
    750 }
     531        if ( func ) {
     532                func.call( deferred, deferred );
     533        }
     534
     535        return deferred;
     536};
     537
     538
    751539
    752540})( jQuery, window );
  • src/wp-includes/js/jquery/jquery.js

    diff --git src/wp-includes/js/jquery/jquery.js src/wp-includes/js/jquery/jquery.js
    index 292c720a4e..d2d8ca4790 100644
     
    1 /*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
    2 !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
    3 }return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
    4 marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
    5 padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
    6 jQuery.noConflict();
     1/*!
     2 * jQuery JavaScript Library v3.2.1
     3 * https://jquery.com/
     4 *
     5 * Includes Sizzle.js
     6 * https://sizzlejs.com/
     7 *
     8 * Copyright JS Foundation and other contributors
     9 * Released under the MIT license
     10 * https://jquery.org/license
     11 *
     12 * Date: 2017-03-20T18:59Z
     13 */
     14( function( global, factory ) {
     15
     16        "use strict";
     17
     18        if ( typeof module === "object" && typeof module.exports === "object" ) {
     19
     20                // For CommonJS and CommonJS-like environments where a proper `window`
     21                // is present, execute the factory and get jQuery.
     22                // For environments that do not have a `window` with a `document`
     23                // (such as Node.js), expose a factory as module.exports.
     24                // This accentuates the need for the creation of a real `window`.
     25                // e.g. var jQuery = require("jquery")(window);
     26                // See ticket #14549 for more info.
     27                module.exports = global.document ?
     28                        factory( global, true ) :
     29                        function( w ) {
     30                                if ( !w.document ) {
     31                                        throw new Error( "jQuery requires a window with a document" );
     32                                }
     33                                return factory( w );
     34                        };
     35        } else {
     36                factory( global );
     37        }
     38
     39// Pass this if window is not defined yet
     40} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
     41
     42// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
     43// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
     44// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
     45// enough that all such attempts are guarded in a try block.
     46"use strict";
     47
     48var arr = [];
     49
     50var document = window.document;
     51
     52var getProto = Object.getPrototypeOf;
     53
     54var slice = arr.slice;
     55
     56var concat = arr.concat;
     57
     58var push = arr.push;
     59
     60var indexOf = arr.indexOf;
     61
     62var class2type = {};
     63
     64var toString = class2type.toString;
     65
     66var hasOwn = class2type.hasOwnProperty;
     67
     68var fnToString = hasOwn.toString;
     69
     70var ObjectFunctionString = fnToString.call( Object );
     71
     72var support = {};
     73
     74
     75
     76        function DOMEval( code, doc ) {
     77                doc = doc || document;
     78
     79                var script = doc.createElement( "script" );
     80
     81                script.text = code;
     82                doc.head.appendChild( script ).parentNode.removeChild( script );
     83        }
     84/* global Symbol */
     85// Defining this global in .eslintrc.json would create a danger of using the global
     86// unguarded in another place, it seems safer to define global only for this module
     87
     88
     89
     90var
     91        version = "3.2.1",
     92
     93        // Define a local copy of jQuery
     94        jQuery = function( selector, context ) {
     95
     96                // The jQuery object is actually just the init constructor 'enhanced'
     97                // Need init if jQuery is called (just allow error to be thrown if not included)
     98                return new jQuery.fn.init( selector, context );
     99        },
     100
     101        // Support: Android <=4.0 only
     102        // Make sure we trim BOM and NBSP
     103        rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
     104
     105        // Matches dashed string for camelizing
     106        rmsPrefix = /^-ms-/,
     107        rdashAlpha = /-([a-z])/g,
     108
     109        // Used by jQuery.camelCase as callback to replace()
     110        fcamelCase = function( all, letter ) {
     111                return letter.toUpperCase();
     112        };
     113
     114jQuery.fn = jQuery.prototype = {
     115
     116        // The current version of jQuery being used
     117        jquery: version,
     118
     119        constructor: jQuery,
     120
     121        // The default length of a jQuery object is 0
     122        length: 0,
     123
     124        toArray: function() {
     125                return slice.call( this );
     126        },
     127
     128        // Get the Nth element in the matched element set OR
     129        // Get the whole matched element set as a clean array
     130        get: function( num ) {
     131
     132                // Return all the elements in a clean array
     133                if ( num == null ) {
     134                        return slice.call( this );
     135                }
     136
     137                // Return just the one element from the set
     138                return num < 0 ? this[ num + this.length ] : this[ num ];
     139        },
     140
     141        // Take an array of elements and push it onto the stack
     142        // (returning the new matched element set)
     143        pushStack: function( elems ) {
     144
     145                // Build a new jQuery matched element set
     146                var ret = jQuery.merge( this.constructor(), elems );
     147
     148                // Add the old object onto the stack (as a reference)
     149                ret.prevObject = this;
     150
     151                // Return the newly-formed element set
     152                return ret;
     153        },
     154
     155        // Execute a callback for every element in the matched set.
     156        each: function( callback ) {
     157                return jQuery.each( this, callback );
     158        },
     159
     160        map: function( callback ) {
     161                return this.pushStack( jQuery.map( this, function( elem, i ) {
     162                        return callback.call( elem, i, elem );
     163                } ) );
     164        },
     165
     166        slice: function() {
     167                return this.pushStack( slice.apply( this, arguments ) );
     168        },
     169
     170        first: function() {
     171                return this.eq( 0 );
     172        },
     173
     174        last: function() {
     175                return this.eq( -1 );
     176        },
     177
     178        eq: function( i ) {
     179                var len = this.length,
     180                        j = +i + ( i < 0 ? len : 0 );
     181                return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
     182        },
     183
     184        end: function() {
     185                return this.prevObject || this.constructor();
     186        },
     187
     188        // For internal use only.
     189        // Behaves like an Array's method, not like a jQuery method.
     190        push: push,
     191        sort: arr.sort,
     192        splice: arr.splice
     193};
     194
     195jQuery.extend = jQuery.fn.extend = function() {
     196        var options, name, src, copy, copyIsArray, clone,
     197                target = arguments[ 0 ] || {},
     198                i = 1,
     199                length = arguments.length,
     200                deep = false;
     201
     202        // Handle a deep copy situation
     203        if ( typeof target === "boolean" ) {
     204                deep = target;
     205
     206                // Skip the boolean and the target
     207                target = arguments[ i ] || {};
     208                i++;
     209        }
     210
     211        // Handle case when target is a string or something (possible in deep copy)
     212        if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
     213                target = {};
     214        }
     215
     216        // Extend jQuery itself if only one argument is passed
     217        if ( i === length ) {
     218                target = this;
     219                i--;
     220        }
     221
     222        for ( ; i < length; i++ ) {
     223
     224                // Only deal with non-null/undefined values
     225                if ( ( options = arguments[ i ] ) != null ) {
     226
     227                        // Extend the base object
     228                        for ( name in options ) {
     229                                src = target[ name ];
     230                                copy = options[ name ];
     231
     232                                // Prevent never-ending loop
     233                                if ( target === copy ) {
     234                                        continue;
     235                                }
     236
     237                                // Recurse if we're merging plain objects or arrays
     238                                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
     239                                        ( copyIsArray = Array.isArray( copy ) ) ) ) {
     240
     241                                        if ( copyIsArray ) {
     242                                                copyIsArray = false;
     243                                                clone = src && Array.isArray( src ) ? src : [];
     244
     245                                        } else {
     246                                                clone = src && jQuery.isPlainObject( src ) ? src : {};
     247                                        }
     248
     249                                        // Never move original objects, clone them
     250                                        target[ name ] = jQuery.extend( deep, clone, copy );
     251
     252                                // Don't bring in undefined values
     253                                } else if ( copy !== undefined ) {
     254                                        target[ name ] = copy;
     255                                }
     256                        }
     257                }
     258        }
     259
     260        // Return the modified object
     261        return target;
     262};
     263
     264jQuery.extend( {
     265
     266        // Unique for each copy of jQuery on the page
     267        expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
     268
     269        // Assume jQuery is ready without the ready module
     270        isReady: true,
     271
     272        error: function( msg ) {
     273                throw new Error( msg );
     274        },
     275
     276        noop: function() {},
     277
     278        isFunction: function( obj ) {
     279                return jQuery.type( obj ) === "function";
     280        },
     281
     282        isWindow: function( obj ) {
     283                return obj != null && obj === obj.window;
     284        },
     285
     286        isNumeric: function( obj ) {
     287
     288                // As of jQuery 3.0, isNumeric is limited to
     289                // strings and numbers (primitives or objects)
     290                // that can be coerced to finite numbers (gh-2662)
     291                var type = jQuery.type( obj );
     292                return ( type === "number" || type === "string" ) &&
     293
     294                        // parseFloat NaNs numeric-cast false positives ("")
     295                        // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
     296                        // subtraction forces infinities to NaN
     297                        !isNaN( obj - parseFloat( obj ) );
     298        },
     299
     300        isPlainObject: function( obj ) {
     301                var proto, Ctor;
     302
     303                // Detect obvious negatives
     304                // Use toString instead of jQuery.type to catch host objects
     305                if ( !obj || toString.call( obj ) !== "[object Object]" ) {
     306                        return false;
     307                }
     308
     309                proto = getProto( obj );
     310
     311                // Objects with no prototype (e.g., `Object.create( null )`) are plain
     312                if ( !proto ) {
     313                        return true;
     314                }
     315
     316                // Objects with prototype are plain iff they were constructed by a global Object function
     317                Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
     318                return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
     319        },
     320
     321        isEmptyObject: function( obj ) {
     322
     323                /* eslint-disable no-unused-vars */
     324                // See https://github.com/eslint/eslint/issues/6125
     325                var name;
     326
     327                for ( name in obj ) {
     328                        return false;
     329                }
     330                return true;
     331        },
     332
     333        type: function( obj ) {
     334                if ( obj == null ) {
     335                        return obj + "";
     336                }
     337
     338                // Support: Android <=2.3 only (functionish RegExp)
     339                return typeof obj === "object" || typeof obj === "function" ?
     340                        class2type[ toString.call( obj ) ] || "object" :
     341                        typeof obj;
     342        },
     343
     344        // Evaluates a script in a global context
     345        globalEval: function( code ) {
     346                DOMEval( code );
     347        },
     348
     349        // Convert dashed to camelCase; used by the css and data modules
     350        // Support: IE <=9 - 11, Edge 12 - 13
     351        // Microsoft forgot to hump their vendor prefix (#9572)
     352        camelCase: function( string ) {
     353                return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
     354        },
     355
     356        each: function( obj, callback ) {
     357                var length, i = 0;
     358
     359                if ( isArrayLike( obj ) ) {
     360                        length = obj.length;
     361                        for ( ; i < length; i++ ) {
     362                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
     363                                        break;
     364                                }
     365                        }
     366                } else {
     367                        for ( i in obj ) {
     368                                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
     369                                        break;
     370                                }
     371                        }
     372                }
     373
     374                return obj;
     375        },
     376
     377        // Support: Android <=4.0 only
     378        trim: function( text ) {
     379                return text == null ?
     380                        "" :
     381                        ( text + "" ).replace( rtrim, "" );
     382        },
     383
     384        // results is for internal usage only
     385        makeArray: function( arr, results ) {
     386                var ret = results || [];
     387
     388                if ( arr != null ) {
     389                        if ( isArrayLike( Object( arr ) ) ) {
     390                                jQuery.merge( ret,
     391                                        typeof arr === "string" ?
     392                                        [ arr ] : arr
     393                                );
     394                        } else {
     395                                push.call( ret, arr );
     396                        }
     397                }
     398
     399                return ret;
     400        },
     401
     402        inArray: function( elem, arr, i ) {
     403                return arr == null ? -1 : indexOf.call( arr, elem, i );
     404        },
     405
     406        // Support: Android <=4.0 only, PhantomJS 1 only
     407        // push.apply(_, arraylike) throws on ancient WebKit
     408        merge: function( first, second ) {
     409                var len = +second.length,
     410                        j = 0,
     411                        i = first.length;
     412
     413                for ( ; j < len; j++ ) {
     414                        first[ i++ ] = second[ j ];
     415                }
     416
     417                first.length = i;
     418
     419                return first;
     420        },
     421
     422        grep: function( elems, callback, invert ) {
     423                var callbackInverse,
     424                        matches = [],
     425                        i = 0,
     426                        length = elems.length,
     427                        callbackExpect = !invert;
     428
     429                // Go through the array, only saving the items
     430                // that pass the validator function
     431                for ( ; i < length; i++ ) {
     432                        callbackInverse = !callback( elems[ i ], i );
     433                        if ( callbackInverse !== callbackExpect ) {
     434                                matches.push( elems[ i ] );
     435                        }
     436                }
     437
     438                return matches;
     439        },
     440
     441        // arg is for internal usage only
     442        map: function( elems, callback, arg ) {
     443                var length, value,
     444                        i = 0,
     445                        ret = [];
     446
     447                // Go through the array, translating each of the items to their new values
     448                if ( isArrayLike( elems ) ) {
     449                        length = elems.length;
     450                        for ( ; i < length; i++ ) {
     451                                value = callback( elems[ i ], i, arg );
     452
     453                                if ( value != null ) {
     454                                        ret.push( value );
     455                                }
     456                        }
     457
     458                // Go through every key on the object,
     459                } else {
     460                        for ( i in elems ) {
     461                                value = callback( elems[ i ], i, arg );
     462
     463                                if ( value != null ) {
     464                                        ret.push( value );
     465                                }
     466                        }
     467                }
     468
     469                // Flatten any nested arrays
     470                return concat.apply( [], ret );
     471        },
     472
     473        // A global GUID counter for objects
     474        guid: 1,
     475
     476        // Bind a function to a context, optionally partially applying any
     477        // arguments.
     478        proxy: function( fn, context ) {
     479                var tmp, args, proxy;
     480
     481                if ( typeof context === "string" ) {
     482                        tmp = fn[ context ];
     483                        context = fn;
     484                        fn = tmp;
     485                }
     486
     487                // Quick check to determine if target is callable, in the spec
     488                // this throws a TypeError, but we will just return undefined.
     489                if ( !jQuery.isFunction( fn ) ) {
     490                        return undefined;
     491                }
     492
     493                // Simulated bind
     494                args = slice.call( arguments, 2 );
     495                proxy = function() {
     496                        return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
     497                };
     498
     499                // Set the guid of unique handler to the same of original handler, so it can be removed
     500                proxy.guid = fn.guid = fn.guid || jQuery.guid++;
     501
     502                return proxy;
     503        },
     504
     505        now: Date.now,
     506
     507        // jQuery.support is not used in Core but other projects attach their
     508        // properties to it so it needs to exist.
     509        support: support
     510} );
     511
     512if ( typeof Symbol === "function" ) {
     513        jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
     514}
     515
     516// Populate the class2type map
     517jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
     518function( i, name ) {
     519        class2type[ "[object " + name + "]" ] = name.toLowerCase();
     520} );
     521
     522function isArrayLike( obj ) {
     523
     524        // Support: real iOS 8.2 only (not reproducible in simulator)
     525        // `in` check used to prevent JIT error (gh-2145)
     526        // hasOwn isn't used here due to false negatives
     527        // regarding Nodelist length in IE
     528        var length = !!obj && "length" in obj && obj.length,
     529                type = jQuery.type( obj );
     530
     531        if ( type === "function" || jQuery.isWindow( obj ) ) {
     532                return false;
     533        }
     534
     535        return type === "array" || length === 0 ||
     536                typeof length === "number" && length > 0 && ( length - 1 ) in obj;
     537}
     538var Sizzle =
     539/*!
     540 * Sizzle CSS Selector Engine v2.3.3
     541 * https://sizzlejs.com/
     542 *
     543 * Copyright jQuery Foundation and other contributors
     544 * Released under the MIT license
     545 * http://jquery.org/license
     546 *
     547 * Date: 2016-08-08
     548 */
     549(function( window ) {
     550
     551var i,
     552        support,
     553        Expr,
     554        getText,
     555        isXML,
     556        tokenize,
     557        compile,
     558        select,
     559        outermostContext,
     560        sortInput,
     561        hasDuplicate,
     562
     563        // Local document vars
     564        setDocument,
     565        document,
     566        docElem,
     567        documentIsHTML,
     568        rbuggyQSA,
     569        rbuggyMatches,
     570        matches,
     571        contains,
     572
     573        // Instance-specific data
     574        expando = "sizzle" + 1 * new Date(),
     575        preferredDoc = window.document,
     576        dirruns = 0,
     577        done = 0,
     578        classCache = createCache(),
     579        tokenCache = createCache(),
     580        compilerCache = createCache(),
     581        sortOrder = function( a, b ) {
     582                if ( a === b ) {
     583                        hasDuplicate = true;
     584                }
     585                return 0;
     586        },
     587
     588        // Instance methods
     589        hasOwn = ({}).hasOwnProperty,
     590        arr = [],
     591        pop = arr.pop,
     592        push_native = arr.push,
     593        push = arr.push,
     594        slice = arr.slice,
     595        // Use a stripped-down indexOf as it's faster than native
     596        // https://jsperf.com/thor-indexof-vs-for/5
     597        indexOf = function( list, elem ) {
     598                var i = 0,
     599                        len = list.length;
     600                for ( ; i < len; i++ ) {
     601                        if ( list[i] === elem ) {
     602                                return i;
     603                        }
     604                }
     605                return -1;
     606        },
     607
     608        booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
     609
     610        // Regular expressions
     611
     612        // http://www.w3.org/TR/css3-selectors/#whitespace
     613        whitespace = "[\\x20\\t\\r\\n\\f]",
     614
     615        // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
     616        identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
     617
     618        // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
     619        attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
     620                // Operator (capture 2)
     621                "*([*^$|!~]?=)" + whitespace +
     622                // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
     623                "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
     624                "*\\]",
     625
     626        pseudos = ":(" + identifier + ")(?:\\((" +
     627                // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
     628                // 1. quoted (capture 3; capture 4 or capture 5)
     629                "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
     630                // 2. simple (capture 6)
     631                "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
     632                // 3. anything else (capture 2)
     633                ".*" +
     634                ")\\)|)",
     635
     636        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
     637        rwhitespace = new RegExp( whitespace + "+", "g" ),
     638        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
     639
     640        rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
     641        rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
     642
     643        rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
     644
     645        rpseudo = new RegExp( pseudos ),
     646        ridentifier = new RegExp( "^" + identifier + "$" ),
     647
     648        matchExpr = {
     649                "ID": new RegExp( "^#(" + identifier + ")" ),
     650                "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
     651                "TAG": new RegExp( "^(" + identifier + "|[*])" ),
     652                "ATTR": new RegExp( "^" + attributes ),
     653                "PSEUDO": new RegExp( "^" + pseudos ),
     654                "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
     655                        "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
     656                        "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
     657                "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
     658                // For use in libraries implementing .is()
     659                // We use this for POS matching in `select`
     660                "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
     661                        whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
     662        },
     663
     664        rinputs = /^(?:input|select|textarea|button)$/i,
     665        rheader = /^h\d$/i,
     666
     667        rnative = /^[^{]+\{\s*\[native \w/,
     668
     669        // Easily-parseable/retrievable ID or TAG or CLASS selectors
     670        rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
     671
     672        rsibling = /[+~]/,
     673
     674        // CSS escapes
     675        // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
     676        runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
     677        funescape = function( _, escaped, escapedWhitespace ) {
     678                var high = "0x" + escaped - 0x10000;
     679                // NaN means non-codepoint
     680                // Support: Firefox<24
     681                // Workaround erroneous numeric interpretation of +"0x"
     682                return high !== high || escapedWhitespace ?
     683                        escaped :
     684                        high < 0 ?
     685                                // BMP codepoint
     686                                String.fromCharCode( high + 0x10000 ) :
     687                                // Supplemental Plane codepoint (surrogate pair)
     688                                String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
     689        },
     690
     691        // CSS string/identifier serialization
     692        // https://drafts.csswg.org/cssom/#common-serializing-idioms
     693        rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
     694        fcssescape = function( ch, asCodePoint ) {
     695                if ( asCodePoint ) {
     696
     697                        // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
     698                        if ( ch === "\0" ) {
     699                                return "\uFFFD";
     700                        }
     701
     702                        // Control characters and (dependent upon position) numbers get escaped as code points
     703                        return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
     704                }
     705
     706                // Other potentially-special ASCII characters get backslash-escaped
     707                return "\\" + ch;
     708        },
     709
     710        // Used for iframes
     711        // See setDocument()
     712        // Removing the function wrapper causes a "Permission Denied"
     713        // error in IE
     714        unloadHandler = function() {
     715                setDocument();
     716        },
     717
     718        disabledAncestor = addCombinator(
     719                function( elem ) {
     720                        return elem.disabled === true && ("form" in elem || "label" in elem);
     721                },
     722                { dir: "parentNode", next: "legend" }
     723        );
     724
     725// Optimize for push.apply( _, NodeList )
     726try {
     727        push.apply(
     728                (arr = slice.call( preferredDoc.childNodes )),
     729                preferredDoc.childNodes
     730        );
     731        // Support: Android<4.0
     732        // Detect silently failing push.apply
     733        arr[ preferredDoc.childNodes.length ].nodeType;
     734} catch ( e ) {
     735        push = { apply: arr.length ?
     736
     737                // Leverage slice if possible
     738                function( target, els ) {
     739                        push_native.apply( target, slice.call(els) );
     740                } :
     741
     742                // Support: IE<9
     743                // Otherwise append directly
     744                function( target, els ) {
     745                        var j = target.length,
     746                                i = 0;
     747                        // Can't trust NodeList.length
     748                        while ( (target[j++] = els[i++]) ) {}
     749                        target.length = j - 1;
     750                }
     751        };
     752}
     753
     754function Sizzle( selector, context, results, seed ) {
     755        var m, i, elem, nid, match, groups, newSelector,
     756                newContext = context && context.ownerDocument,
     757
     758                // nodeType defaults to 9, since context defaults to document
     759                nodeType = context ? context.nodeType : 9;
     760
     761        results = results || [];
     762
     763        // Return early from calls with invalid selector or context
     764        if ( typeof selector !== "string" || !selector ||
     765                nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
     766
     767                return results;
     768        }
     769
     770        // Try to shortcut find operations (as opposed to filters) in HTML documents
     771        if ( !seed ) {
     772
     773                if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
     774                        setDocument( context );
     775                }
     776                context = context || document;
     777
     778                if ( documentIsHTML ) {
     779
     780                        // If the selector is sufficiently simple, try using a "get*By*" DOM method
     781                        // (excepting DocumentFragment context, where the methods don't exist)
     782                        if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
     783
     784                                // ID selector
     785                                if ( (m = match[1]) ) {
     786
     787                                        // Document context
     788                                        if ( nodeType === 9 ) {
     789                                                if ( (elem = context.getElementById( m )) ) {
     790
     791                                                        // Support: IE, Opera, Webkit
     792                                                        // TODO: identify versions
     793                                                        // getElementById can match elements by name instead of ID
     794                                                        if ( elem.id === m ) {
     795                                                                results.push( elem );
     796                                                                return results;
     797                                                        }
     798                                                } else {
     799                                                        return results;
     800                                                }
     801
     802                                        // Element context
     803                                        } else {
     804
     805                                                // Support: IE, Opera, Webkit
     806                                                // TODO: identify versions
     807                                                // getElementById can match elements by name instead of ID
     808                                                if ( newContext && (elem = newContext.getElementById( m )) &&
     809                                                        contains( context, elem ) &&
     810                                                        elem.id === m ) {
     811
     812                                                        results.push( elem );
     813                                                        return results;
     814                                                }
     815                                        }
     816
     817                                // Type selector
     818                                } else if ( match[2] ) {
     819                                        push.apply( results, context.getElementsByTagName( selector ) );
     820                                        return results;
     821
     822                                // Class selector
     823                                } else if ( (m = match[3]) && support.getElementsByClassName &&
     824                                        context.getElementsByClassName ) {
     825
     826                                        push.apply( results, context.getElementsByClassName( m ) );
     827                                        return results;
     828                                }
     829                        }
     830
     831                        // Take advantage of querySelectorAll
     832                        if ( support.qsa &&
     833                                !compilerCache[ selector + " " ] &&
     834                                (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
     835
     836                                if ( nodeType !== 1 ) {
     837                                        newContext = context;
     838                                        newSelector = selector;
     839
     840                                // qSA looks outside Element context, which is not what we want
     841                                // Thanks to Andrew Dupont for this workaround technique
     842                                // Support: IE <=8
     843                                // Exclude object elements
     844                                } else if ( context.nodeName.toLowerCase() !== "object" ) {
     845
     846                                        // Capture the context ID, setting it first if necessary
     847                                        if ( (nid = context.getAttribute( "id" )) ) {
     848                                                nid = nid.replace( rcssescape, fcssescape );
     849                                        } else {
     850                                                context.setAttribute( "id", (nid = expando) );
     851                                        }
     852
     853                                        // Prefix every selector in the list
     854                                        groups = tokenize( selector );
     855                                        i = groups.length;
     856                                        while ( i-- ) {
     857                                                groups[i] = "#" + nid + " " + toSelector( groups[i] );
     858                                        }
     859                                        newSelector = groups.join( "," );
     860
     861                                        // Expand context for sibling selectors
     862                                        newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
     863                                                context;
     864                                }
     865
     866                                if ( newSelector ) {
     867                                        try {
     868                                                push.apply( results,
     869                                                        newContext.querySelectorAll( newSelector )
     870                                                );
     871                                                return results;
     872                                        } catch ( qsaError ) {
     873                                        } finally {
     874                                                if ( nid === expando ) {
     875                                                        context.removeAttribute( "id" );
     876                                                }
     877                                        }
     878                                }
     879                        }
     880                }
     881        }
     882
     883        // All others
     884        return select( selector.replace( rtrim, "$1" ), context, results, seed );
     885}
     886
     887/**
     888 * Create key-value caches of limited size
     889 * @returns {function(string, object)} Returns the Object data after storing it on itself with
     890 *      property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
     891 *      deleting the oldest entry
     892 */
     893function createCache() {
     894        var keys = [];
     895
     896        function cache( key, value ) {
     897                // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
     898                if ( keys.push( key + " " ) > Expr.cacheLength ) {
     899                        // Only keep the most recent entries
     900                        delete cache[ keys.shift() ];
     901                }
     902                return (cache[ key + " " ] = value);
     903        }
     904        return cache;
     905}
     906
     907/**
     908 * Mark a function for special use by Sizzle
     909 * @param {Function} fn The function to mark
     910 */
     911function markFunction( fn ) {
     912        fn[ expando ] = true;
     913        return fn;
     914}
     915
     916/**
     917 * Support testing using an element
     918 * @param {Function} fn Passed the created element and returns a boolean result
     919 */
     920function assert( fn ) {
     921        var el = document.createElement("fieldset");
     922
     923        try {
     924                return !!fn( el );
     925        } catch (e) {
     926                return false;
     927        } finally {
     928                // Remove from its parent by default
     929                if ( el.parentNode ) {
     930                        el.parentNode.removeChild( el );
     931                }
     932                // release memory in IE
     933                el = null;
     934        }
     935}
     936
     937/**
     938 * Adds the same handler for all of the specified attrs
     939 * @param {String} attrs Pipe-separated list of attributes
     940 * @param {Function} handler The method that will be applied
     941 */
     942function addHandle( attrs, handler ) {
     943        var arr = attrs.split("|"),
     944                i = arr.length;
     945
     946        while ( i-- ) {
     947                Expr.attrHandle[ arr[i] ] = handler;
     948        }
     949}
     950
     951/**
     952 * Checks document order of two siblings
     953 * @param {Element} a
     954 * @param {Element} b
     955 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
     956 */
     957function siblingCheck( a, b ) {
     958        var cur = b && a,
     959                diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
     960                        a.sourceIndex - b.sourceIndex;
     961
     962        // Use IE sourceIndex if available on both nodes
     963        if ( diff ) {
     964                return diff;
     965        }
     966
     967        // Check if b follows a
     968        if ( cur ) {
     969                while ( (cur = cur.nextSibling) ) {
     970                        if ( cur === b ) {
     971                                return -1;
     972                        }
     973                }
     974        }
     975
     976        return a ? 1 : -1;
     977}
     978
     979/**
     980 * Returns a function to use in pseudos for input types
     981 * @param {String} type
     982 */
     983function createInputPseudo( type ) {
     984        return function( elem ) {
     985                var name = elem.nodeName.toLowerCase();
     986                return name === "input" && elem.type === type;
     987        };
     988}
     989
     990/**
     991 * Returns a function to use in pseudos for buttons
     992 * @param {String} type
     993 */
     994function createButtonPseudo( type ) {
     995        return function( elem ) {
     996                var name = elem.nodeName.toLowerCase();
     997                return (name === "input" || name === "button") && elem.type === type;
     998        };
     999}
     1000
     1001/**
     1002 * Returns a function to use in pseudos for :enabled/:disabled
     1003 * @param {Boolean} disabled true for :disabled; false for :enabled
     1004 */
     1005function createDisabledPseudo( disabled ) {
     1006
     1007        // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
     1008        return function( elem ) {
     1009
     1010                // Only certain elements can match :enabled or :disabled
     1011                // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
     1012                // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
     1013                if ( "form" in elem ) {
     1014
     1015                        // Check for inherited disabledness on relevant non-disabled elements:
     1016                        // * listed form-associated elements in a disabled fieldset
     1017                        //   https://html.spec.whatwg.org/multipage/forms.html#category-listed
     1018                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
     1019                        // * option elements in a disabled optgroup
     1020                        //   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
     1021                        // All such elements have a "form" property.
     1022                        if ( elem.parentNode && elem.disabled === false ) {
     1023
     1024                                // Option elements defer to a parent optgroup if present
     1025                                if ( "label" in elem ) {
     1026                                        if ( "label" in elem.parentNode ) {
     1027                                                return elem.parentNode.disabled === disabled;
     1028                                        } else {
     1029                                                return elem.disabled === disabled;
     1030                                        }
     1031                                }
     1032
     1033                                // Support: IE 6 - 11
     1034                                // Use the isDisabled shortcut property to check for disabled fieldset ancestors
     1035                                return elem.isDisabled === disabled ||
     1036
     1037                                        // Where there is no isDisabled, check manually
     1038                                        /* jshint -W018 */
     1039                                        elem.isDisabled !== !disabled &&
     1040                                                disabledAncestor( elem ) === disabled;
     1041                        }
     1042
     1043                        return elem.disabled === disabled;
     1044
     1045                // Try to winnow out elements that can't be disabled before trusting the disabled property.
     1046                // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
     1047                // even exist on them, let alone have a boolean value.
     1048                } else if ( "label" in elem ) {
     1049                        return elem.disabled === disabled;
     1050                }
     1051
     1052                // Remaining elements are neither :enabled nor :disabled
     1053                return false;
     1054        };
     1055}
     1056
     1057/**
     1058 * Returns a function to use in pseudos for positionals
     1059 * @param {Function} fn
     1060 */
     1061function createPositionalPseudo( fn ) {
     1062        return markFunction(function( argument ) {
     1063                argument = +argument;
     1064                return markFunction(function( seed, matches ) {
     1065                        var j,
     1066                                matchIndexes = fn( [], seed.length, argument ),
     1067                                i = matchIndexes.length;
     1068
     1069                        // Match elements found at the specified indexes
     1070                        while ( i-- ) {
     1071                                if ( seed[ (j = matchIndexes[i]) ] ) {
     1072                                        seed[j] = !(matches[j] = seed[j]);
     1073                                }
     1074                        }
     1075                });
     1076        });
     1077}
     1078
     1079/**
     1080 * Checks a node for validity as a Sizzle context
     1081 * @param {Element|Object=} context
     1082 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
     1083 */
     1084function testContext( context ) {
     1085        return context && typeof context.getElementsByTagName !== "undefined" && context;
     1086}
     1087
     1088// Expose support vars for convenience
     1089support = Sizzle.support = {};
     1090
     1091/**
     1092 * Detects XML nodes
     1093 * @param {Element|Object} elem An element or a document
     1094 * @returns {Boolean} True iff elem is a non-HTML XML node
     1095 */
     1096isXML = Sizzle.isXML = function( elem ) {
     1097        // documentElement is verified for cases where it doesn't yet exist
     1098        // (such as loading iframes in IE - #4833)
     1099        var documentElement = elem && (elem.ownerDocument || elem).documentElement;
     1100        return documentElement ? documentElement.nodeName !== "HTML" : false;
     1101};
     1102
     1103/**
     1104 * Sets document-related variables once based on the current document
     1105 * @param {Element|Object} [doc] An element or document object to use to set the document
     1106 * @returns {Object} Returns the current document
     1107 */
     1108setDocument = Sizzle.setDocument = function( node ) {
     1109        var hasCompare, subWindow,
     1110                doc = node ? node.ownerDocument || node : preferredDoc;
     1111
     1112        // Return early if doc is invalid or already selected
     1113        if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
     1114                return document;
     1115        }
     1116
     1117        // Update global variables
     1118        document = doc;
     1119        docElem = document.documentElement;
     1120        documentIsHTML = !isXML( document );
     1121
     1122        // Support: IE 9-11, Edge
     1123        // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
     1124        if ( preferredDoc !== document &&
     1125                (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
     1126
     1127                // Support: IE 11, Edge
     1128                if ( subWindow.addEventListener ) {
     1129                        subWindow.addEventListener( "unload", unloadHandler, false );
     1130
     1131                // Support: IE 9 - 10 only
     1132                } else if ( subWindow.attachEvent ) {
     1133                        subWindow.attachEvent( "onunload", unloadHandler );
     1134                }
     1135        }
     1136
     1137        /* Attributes
     1138        ---------------------------------------------------------------------- */
     1139
     1140        // Support: IE<8
     1141        // Verify that getAttribute really returns attributes and not properties
     1142        // (excepting IE8 booleans)
     1143        support.attributes = assert(function( el ) {
     1144                el.className = "i";
     1145                return !el.getAttribute("className");
     1146        });
     1147
     1148        /* getElement(s)By*
     1149        ---------------------------------------------------------------------- */
     1150
     1151        // Check if getElementsByTagName("*") returns only elements
     1152        support.getElementsByTagName = assert(function( el ) {
     1153                el.appendChild( document.createComment("") );
     1154                return !el.getElementsByTagName("*").length;
     1155        });
     1156
     1157        // Support: IE<9
     1158        support.getElementsByClassName = rnative.test( document.getElementsByClassName );
     1159
     1160        // Support: IE<10
     1161        // Check if getElementById returns elements by name
     1162        // The broken getElementById methods don't pick up programmatically-set names,
     1163        // so use a roundabout getElementsByName test
     1164        support.getById = assert(function( el ) {
     1165                docElem.appendChild( el ).id = expando;
     1166                return !document.getElementsByName || !document.getElementsByName( expando ).length;
     1167        });
     1168
     1169        // ID filter and find
     1170        if ( support.getById ) {
     1171                Expr.filter["ID"] = function( id ) {
     1172                        var attrId = id.replace( runescape, funescape );
     1173                        return function( elem ) {
     1174                                return elem.getAttribute("id") === attrId;
     1175                        };
     1176                };
     1177                Expr.find["ID"] = function( id, context ) {
     1178                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
     1179                                var elem = context.getElementById( id );
     1180                                return elem ? [ elem ] : [];
     1181                        }
     1182                };
     1183        } else {
     1184                Expr.filter["ID"] =  function( id ) {
     1185                        var attrId = id.replace( runescape, funescape );
     1186                        return function( elem ) {
     1187                                var node = typeof elem.getAttributeNode !== "undefined" &&
     1188                                        elem.getAttributeNode("id");
     1189                                return node && node.value === attrId;
     1190                        };
     1191                };
     1192
     1193                // Support: IE 6 - 7 only
     1194                // getElementById is not reliable as a find shortcut
     1195                Expr.find["ID"] = function( id, context ) {
     1196                        if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
     1197                                var node, i, elems,
     1198                                        elem = context.getElementById( id );
     1199
     1200                                if ( elem ) {
     1201
     1202                                        // Verify the id attribute
     1203                                        node = elem.getAttributeNode("id");
     1204                                        if ( node && node.value === id ) {
     1205                                                return [ elem ];
     1206                                        }
     1207
     1208                                        // Fall back on getElementsByName
     1209                                        elems = context.getElementsByName( id );
     1210                                        i = 0;
     1211                                        while ( (elem = elems[i++]) ) {
     1212                                                node = elem.getAttributeNode("id");
     1213                                                if ( node && node.value === id ) {
     1214                                                        return [ elem ];
     1215                                                }
     1216                                        }
     1217                                }
     1218
     1219                                return [];
     1220                        }
     1221                };
     1222        }
     1223
     1224        // Tag
     1225        Expr.find["TAG"] = support.getElementsByTagName ?
     1226                function( tag, context ) {
     1227                        if ( typeof context.getElementsByTagName !== "undefined" ) {
     1228                                return context.getElementsByTagName( tag );
     1229
     1230                        // DocumentFragment nodes don't have gEBTN
     1231                        } else if ( support.qsa ) {
     1232                                return context.querySelectorAll( tag );
     1233                        }
     1234                } :
     1235
     1236                function( tag, context ) {
     1237                        var elem,
     1238                                tmp = [],
     1239                                i = 0,
     1240                                // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
     1241                                results = context.getElementsByTagName( tag );
     1242
     1243                        // Filter out possible comments
     1244                        if ( tag === "*" ) {
     1245                                while ( (elem = results[i++]) ) {
     1246                                        if ( elem.nodeType === 1 ) {
     1247                                                tmp.push( elem );
     1248                                        }
     1249                                }
     1250
     1251                                return tmp;
     1252                        }
     1253                        return results;
     1254                };
     1255
     1256        // Class
     1257        Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
     1258                if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
     1259                        return context.getElementsByClassName( className );
     1260                }
     1261        };
     1262
     1263        /* QSA/matchesSelector
     1264        ---------------------------------------------------------------------- */
     1265
     1266        // QSA and matchesSelector support
     1267
     1268        // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
     1269        rbuggyMatches = [];
     1270
     1271        // qSa(:focus) reports false when true (Chrome 21)
     1272        // We allow this because of a bug in IE8/9 that throws an error
     1273        // whenever `document.activeElement` is accessed on an iframe
     1274        // So, we allow :focus to pass through QSA all the time to avoid the IE error
     1275        // See https://bugs.jquery.com/ticket/13378
     1276        rbuggyQSA = [];
     1277
     1278        if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
     1279                // Build QSA regex
     1280                // Regex strategy adopted from Diego Perini
     1281                assert(function( el ) {
     1282                        // Select is set to empty string on purpose
     1283                        // This is to test IE's treatment of not explicitly
     1284                        // setting a boolean content attribute,
     1285                        // since its presence should be enough
     1286                        // https://bugs.jquery.com/ticket/12359
     1287                        docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
     1288                                "<select id='" + expando + "-\r\\' msallowcapture=''>" +
     1289                                "<option selected=''></option></select>";
     1290
     1291                        // Support: IE8, Opera 11-12.16
     1292                        // Nothing should be selected when empty strings follow ^= or $= or *=
     1293                        // The test attribute must be unknown in Opera but "safe" for WinRT
     1294                        // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
     1295                        if ( el.querySelectorAll("[msallowcapture^='']").length ) {
     1296                                rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
     1297                        }
     1298
     1299                        // Support: IE8
     1300                        // Boolean attributes and "value" are not treated correctly
     1301                        if ( !el.querySelectorAll("[selected]").length ) {
     1302                                rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
     1303                        }
     1304
     1305                        // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
     1306                        if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
     1307                                rbuggyQSA.push("~=");
     1308                        }
     1309
     1310                        // Webkit/Opera - :checked should return selected option elements
     1311                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     1312                        // IE8 throws error here and will not see later tests
     1313                        if ( !el.querySelectorAll(":checked").length ) {
     1314                                rbuggyQSA.push(":checked");
     1315                        }
     1316
     1317                        // Support: Safari 8+, iOS 8+
     1318                        // https://bugs.webkit.org/show_bug.cgi?id=136851
     1319                        // In-page `selector#id sibling-combinator selector` fails
     1320                        if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
     1321                                rbuggyQSA.push(".#.+[+~]");
     1322                        }
     1323                });
     1324
     1325                assert(function( el ) {
     1326                        el.innerHTML = "<a href='' disabled='disabled'></a>" +
     1327                                "<select disabled='disabled'><option/></select>";
     1328
     1329                        // Support: Windows 8 Native Apps
     1330                        // The type and name attributes are restricted during .innerHTML assignment
     1331                        var input = document.createElement("input");
     1332                        input.setAttribute( "type", "hidden" );
     1333                        el.appendChild( input ).setAttribute( "name", "D" );
     1334
     1335                        // Support: IE8
     1336                        // Enforce case-sensitivity of name attribute
     1337                        if ( el.querySelectorAll("[name=d]").length ) {
     1338                                rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
     1339                        }
     1340
     1341                        // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
     1342                        // IE8 throws error here and will not see later tests
     1343                        if ( el.querySelectorAll(":enabled").length !== 2 ) {
     1344                                rbuggyQSA.push( ":enabled", ":disabled" );
     1345                        }
     1346
     1347                        // Support: IE9-11+
     1348                        // IE's :disabled selector does not pick up the children of disabled fieldsets
     1349                        docElem.appendChild( el ).disabled = true;
     1350                        if ( el.querySelectorAll(":disabled").length !== 2 ) {
     1351                                rbuggyQSA.push( ":enabled", ":disabled" );
     1352                        }
     1353
     1354                        // Opera 10-11 does not throw on post-comma invalid pseudos
     1355                        el.querySelectorAll("*,:x");
     1356                        rbuggyQSA.push(",.*:");
     1357                });
     1358        }
     1359
     1360        if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
     1361                docElem.webkitMatchesSelector ||
     1362                docElem.mozMatchesSelector ||
     1363                docElem.oMatchesSelector ||
     1364                docElem.msMatchesSelector) )) ) {
     1365
     1366                assert(function( el ) {
     1367                        // Check to see if it's possible to do matchesSelector
     1368                        // on a disconnected node (IE 9)
     1369                        support.disconnectedMatch = matches.call( el, "*" );
     1370
     1371                        // This should fail with an exception
     1372                        // Gecko does not error, returns false instead
     1373                        matches.call( el, "[s!='']:x" );
     1374                        rbuggyMatches.push( "!=", pseudos );
     1375                });
     1376        }
     1377
     1378        rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
     1379        rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
     1380
     1381        /* Contains
     1382        ---------------------------------------------------------------------- */
     1383        hasCompare = rnative.test( docElem.compareDocumentPosition );
     1384
     1385        // Element contains another
     1386        // Purposefully self-exclusive
     1387        // As in, an element does not contain itself
     1388        contains = hasCompare || rnative.test( docElem.contains ) ?
     1389                function( a, b ) {
     1390                        var adown = a.nodeType === 9 ? a.documentElement : a,
     1391                                bup = b && b.parentNode;
     1392                        return a === bup || !!( bup && bup.nodeType === 1 && (
     1393                                adown.contains ?
     1394                                        adown.contains( bup ) :
     1395                                        a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
     1396                        ));
     1397                } :
     1398                function( a, b ) {
     1399                        if ( b ) {
     1400                                while ( (b = b.parentNode) ) {
     1401                                        if ( b === a ) {
     1402                                                return true;
     1403                                        }
     1404                                }
     1405                        }
     1406                        return false;
     1407                };
     1408
     1409        /* Sorting
     1410        ---------------------------------------------------------------------- */
     1411
     1412        // Document order sorting
     1413        sortOrder = hasCompare ?
     1414        function( a, b ) {
     1415
     1416                // Flag for duplicate removal
     1417                if ( a === b ) {
     1418                        hasDuplicate = true;
     1419                        return 0;
     1420                }
     1421
     1422                // Sort on method existence if only one input has compareDocumentPosition
     1423                var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
     1424                if ( compare ) {
     1425                        return compare;
     1426                }
     1427
     1428                // Calculate position if both inputs belong to the same document
     1429                compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
     1430                        a.compareDocumentPosition( b ) :
     1431
     1432                        // Otherwise we know they are disconnected
     1433                        1;
     1434
     1435                // Disconnected nodes
     1436                if ( compare & 1 ||
     1437                        (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
     1438
     1439                        // Choose the first element that is related to our preferred document
     1440                        if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
     1441                                return -1;
     1442                        }
     1443                        if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
     1444                                return 1;
     1445                        }
     1446
     1447                        // Maintain original order
     1448                        return sortInput ?
     1449                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
     1450                                0;
     1451                }
     1452
     1453                return compare & 4 ? -1 : 1;
     1454        } :
     1455        function( a, b ) {
     1456                // Exit early if the nodes are identical
     1457                if ( a === b ) {
     1458                        hasDuplicate = true;
     1459                        return 0;
     1460                }
     1461
     1462                var cur,
     1463                        i = 0,
     1464                        aup = a.parentNode,
     1465                        bup = b.parentNode,
     1466                        ap = [ a ],
     1467                        bp = [ b ];
     1468
     1469                // Parentless nodes are either documents or disconnected
     1470                if ( !aup || !bup ) {
     1471                        return a === document ? -1 :
     1472                                b === document ? 1 :
     1473                                aup ? -1 :
     1474                                bup ? 1 :
     1475                                sortInput ?
     1476                                ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
     1477                                0;
     1478
     1479                // If the nodes are siblings, we can do a quick check
     1480                } else if ( aup === bup ) {
     1481                        return siblingCheck( a, b );
     1482                }
     1483
     1484                // Otherwise we need full lists of their ancestors for comparison
     1485                cur = a;
     1486                while ( (cur = cur.parentNode) ) {
     1487                        ap.unshift( cur );
     1488                }
     1489                cur = b;
     1490                while ( (cur = cur.parentNode) ) {
     1491                        bp.unshift( cur );
     1492                }
     1493
     1494                // Walk down the tree looking for a discrepancy
     1495                while ( ap[i] === bp[i] ) {
     1496                        i++;
     1497                }
     1498
     1499                return i ?
     1500                        // Do a sibling check if the nodes have a common ancestor
     1501                        siblingCheck( ap[i], bp[i] ) :
     1502
     1503                        // Otherwise nodes in our document sort first
     1504                        ap[i] === preferredDoc ? -1 :
     1505                        bp[i] === preferredDoc ? 1 :
     1506                        0;
     1507        };
     1508
     1509        return document;
     1510};
     1511
     1512Sizzle.matches = function( expr, elements ) {
     1513        return Sizzle( expr, null, null, elements );
     1514};
     1515
     1516Sizzle.matchesSelector = function( elem, expr ) {
     1517        // Set document vars if needed
     1518        if ( ( elem.ownerDocument || elem ) !== document ) {
     1519                setDocument( elem );
     1520        }
     1521
     1522        // Make sure that attribute selectors are quoted
     1523        expr = expr.replace( rattributeQuotes, "='$1']" );
     1524
     1525        if ( support.matchesSelector && documentIsHTML &&
     1526                !compilerCache[ expr + " " ] &&
     1527                ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
     1528                ( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
     1529
     1530                try {
     1531                        var ret = matches.call( elem, expr );
     1532
     1533                        // IE 9's matchesSelector returns false on disconnected nodes
     1534                        if ( ret || support.disconnectedMatch ||
     1535                                        // As well, disconnected nodes are said to be in a document
     1536                                        // fragment in IE 9
     1537                                        elem.document && elem.document.nodeType !== 11 ) {
     1538                                return ret;
     1539                        }
     1540                } catch (e) {}
     1541        }
     1542
     1543        return Sizzle( expr, document, null, [ elem ] ).length > 0;
     1544};
     1545
     1546Sizzle.contains = function( context, elem ) {
     1547        // Set document vars if needed
     1548        if ( ( context.ownerDocument || context ) !== document ) {
     1549                setDocument( context );
     1550        }
     1551        return contains( context, elem );
     1552};
     1553
     1554Sizzle.attr = function( elem, name ) {
     1555        // Set document vars if needed
     1556        if ( ( elem.ownerDocument || elem ) !== document ) {
     1557                setDocument( elem );
     1558        }
     1559
     1560        var fn = Expr.attrHandle[ name.toLowerCase() ],
     1561                // Don't get fooled by Object.prototype properties (jQuery #13807)
     1562                val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
     1563                        fn( elem, name, !documentIsHTML ) :
     1564                        undefined;
     1565
     1566        return val !== undefined ?
     1567                val :
     1568                support.attributes || !documentIsHTML ?
     1569                        elem.getAttribute( name ) :
     1570                        (val = elem.getAttributeNode(name)) && val.specified ?
     1571                                val.value :
     1572                                null;
     1573};
     1574
     1575Sizzle.escape = function( sel ) {
     1576        return (sel + "").replace( rcssescape, fcssescape );
     1577};
     1578
     1579Sizzle.error = function( msg ) {
     1580        throw new Error( "Syntax error, unrecognized expression: " + msg );
     1581};
     1582
     1583/**
     1584 * Document sorting and removing duplicates
     1585 * @param {ArrayLike} results
     1586 */
     1587Sizzle.uniqueSort = function( results ) {
     1588        var elem,
     1589                duplicates = [],
     1590                j = 0,
     1591                i = 0;
     1592
     1593        // Unless we *know* we can detect duplicates, assume their presence
     1594        hasDuplicate = !support.detectDuplicates;
     1595        sortInput = !support.sortStable && results.slice( 0 );
     1596        results.sort( sortOrder );
     1597
     1598        if ( hasDuplicate ) {
     1599                while ( (elem = results[i++]) ) {
     1600                        if ( elem === results[ i ] ) {
     1601                                j = duplicates.push( i );
     1602                        }
     1603                }
     1604                while ( j-- ) {
     1605                        results.splice( duplicates[ j ], 1 );
     1606                }
     1607        }
     1608
     1609        // Clear input after sorting to release objects
     1610        // See https://github.com/jquery/sizzle/pull/225
     1611        sortInput = null;
     1612
     1613        return results;
     1614};
     1615
     1616/**
     1617 * Utility function for retrieving the text value of an array of DOM nodes
     1618 * @param {Array|Element} elem
     1619 */
     1620getText = Sizzle.getText = function( elem ) {
     1621        var node,
     1622                ret = "",
     1623                i = 0,
     1624                nodeType = elem.nodeType;
     1625
     1626        if ( !nodeType ) {
     1627                // If no nodeType, this is expected to be an array
     1628                while ( (node = elem[i++]) ) {
     1629                        // Do not traverse comment nodes
     1630                        ret += getText( node );
     1631                }
     1632        } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
     1633                // Use textContent for elements
     1634                // innerText usage removed for consistency of new lines (jQuery #11153)
     1635                if ( typeof elem.textContent === "string" ) {
     1636                        return elem.textContent;
     1637                } else {
     1638                        // Traverse its children
     1639                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     1640                                ret += getText( elem );
     1641                        }
     1642                }
     1643        } else if ( nodeType === 3 || nodeType === 4 ) {
     1644                return elem.nodeValue;
     1645        }
     1646        // Do not include comment or processing instruction nodes
     1647
     1648        return ret;
     1649};
     1650
     1651Expr = Sizzle.selectors = {
     1652
     1653        // Can be adjusted by the user
     1654        cacheLength: 50,
     1655
     1656        createPseudo: markFunction,
     1657
     1658        match: matchExpr,
     1659
     1660        attrHandle: {},
     1661
     1662        find: {},
     1663
     1664        relative: {
     1665                ">": { dir: "parentNode", first: true },
     1666                " ": { dir: "parentNode" },
     1667                "+": { dir: "previousSibling", first: true },
     1668                "~": { dir: "previousSibling" }
     1669        },
     1670
     1671        preFilter: {
     1672                "ATTR": function( match ) {
     1673                        match[1] = match[1].replace( runescape, funescape );
     1674
     1675                        // Move the given value to match[3] whether quoted or unquoted
     1676                        match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
     1677
     1678                        if ( match[2] === "~=" ) {
     1679                                match[3] = " " + match[3] + " ";
     1680                        }
     1681
     1682                        return match.slice( 0, 4 );
     1683                },
     1684
     1685                "CHILD": function( match ) {
     1686                        /* matches from matchExpr["CHILD"]
     1687                                1 type (only|nth|...)
     1688                                2 what (child|of-type)
     1689                                3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     1690                                4 xn-component of xn+y argument ([+-]?\d*n|)
     1691                                5 sign of xn-component
     1692                                6 x of xn-component
     1693                                7 sign of y-component
     1694                                8 y of y-component
     1695                        */
     1696                        match[1] = match[1].toLowerCase();
     1697
     1698                        if ( match[1].slice( 0, 3 ) === "nth" ) {
     1699                                // nth-* requires argument
     1700                                if ( !match[3] ) {
     1701                                        Sizzle.error( match[0] );
     1702                                }
     1703
     1704                                // numeric x and y parameters for Expr.filter.CHILD
     1705                                // remember that false/true cast respectively to 0/1
     1706                                match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
     1707                                match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
     1708
     1709                        // other types prohibit arguments
     1710                        } else if ( match[3] ) {
     1711                                Sizzle.error( match[0] );
     1712                        }
     1713
     1714                        return match;
     1715                },
     1716
     1717                "PSEUDO": function( match ) {
     1718                        var excess,
     1719                                unquoted = !match[6] && match[2];
     1720
     1721                        if ( matchExpr["CHILD"].test( match[0] ) ) {
     1722                                return null;
     1723                        }
     1724
     1725                        // Accept quoted arguments as-is
     1726                        if ( match[3] ) {
     1727                                match[2] = match[4] || match[5] || "";
     1728
     1729                        // Strip excess characters from unquoted arguments
     1730                        } else if ( unquoted && rpseudo.test( unquoted ) &&
     1731                                // Get excess from tokenize (recursively)
     1732                                (excess = tokenize( unquoted, true )) &&
     1733                                // advance to the next closing parenthesis
     1734                                (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
     1735
     1736                                // excess is a negative index
     1737                                match[0] = match[0].slice( 0, excess );
     1738                                match[2] = unquoted.slice( 0, excess );
     1739                        }
     1740
     1741                        // Return only captures needed by the pseudo filter method (type and argument)
     1742                        return match.slice( 0, 3 );
     1743                }
     1744        },
     1745
     1746        filter: {
     1747
     1748                "TAG": function( nodeNameSelector ) {
     1749                        var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
     1750                        return nodeNameSelector === "*" ?
     1751                                function() { return true; } :
     1752                                function( elem ) {
     1753                                        return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
     1754                                };
     1755                },
     1756
     1757                "CLASS": function( className ) {
     1758                        var pattern = classCache[ className + " " ];
     1759
     1760                        return pattern ||
     1761                                (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
     1762                                classCache( className, function( elem ) {
     1763                                        return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
     1764                                });
     1765                },
     1766
     1767                "ATTR": function( name, operator, check ) {
     1768                        return function( elem ) {
     1769                                var result = Sizzle.attr( elem, name );
     1770
     1771                                if ( result == null ) {
     1772                                        return operator === "!=";
     1773                                }
     1774                                if ( !operator ) {
     1775                                        return true;
     1776                                }
     1777
     1778                                result += "";
     1779
     1780                                return operator === "=" ? result === check :
     1781                                        operator === "!=" ? result !== check :
     1782                                        operator === "^=" ? check && result.indexOf( check ) === 0 :
     1783                                        operator === "*=" ? check && result.indexOf( check ) > -1 :
     1784                                        operator === "$=" ? check && result.slice( -check.length ) === check :
     1785                                        operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
     1786                                        operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
     1787                                        false;
     1788                        };
     1789                },
     1790
     1791                "CHILD": function( type, what, argument, first, last ) {
     1792                        var simple = type.slice( 0, 3 ) !== "nth",
     1793                                forward = type.slice( -4 ) !== "last",
     1794                                ofType = what === "of-type";
     1795
     1796                        return first === 1 && last === 0 ?
     1797
     1798                                // Shortcut for :nth-*(n)
     1799                                function( elem ) {
     1800                                        return !!elem.parentNode;
     1801                                } :
     1802
     1803                                function( elem, context, xml ) {
     1804                                        var cache, uniqueCache, outerCache, node, nodeIndex, start,
     1805                                                dir = simple !== forward ? "nextSibling" : "previousSibling",
     1806                                                parent = elem.parentNode,
     1807                                                name = ofType && elem.nodeName.toLowerCase(),
     1808                                                useCache = !xml && !ofType,
     1809                                                diff = false;
     1810
     1811                                        if ( parent ) {
     1812
     1813                                                // :(first|last|only)-(child|of-type)
     1814                                                if ( simple ) {
     1815                                                        while ( dir ) {
     1816                                                                node = elem;
     1817                                                                while ( (node = node[ dir ]) ) {
     1818                                                                        if ( ofType ?
     1819                                                                                node.nodeName.toLowerCase() === name :
     1820                                                                                node.nodeType === 1 ) {
     1821
     1822                                                                                return false;
     1823                                                                        }
     1824                                                                }
     1825                                                                // Reverse direction for :only-* (if we haven't yet done so)
     1826                                                                start = dir = type === "only" && !start && "nextSibling";
     1827                                                        }
     1828                                                        return true;
     1829                                                }
     1830
     1831                                                start = [ forward ? parent.firstChild : parent.lastChild ];
     1832
     1833                                                // non-xml :nth-child(...) stores cache data on `parent`
     1834                                                if ( forward && useCache ) {
     1835
     1836                                                        // Seek `elem` from a previously-cached index
     1837
     1838                                                        // ...in a gzip-friendly way
     1839                                                        node = parent;
     1840                                                        outerCache = node[ expando ] || (node[ expando ] = {});
     1841
     1842                                                        // Support: IE <9 only
     1843                                                        // Defend against cloned attroperties (jQuery gh-1709)
     1844                                                        uniqueCache = outerCache[ node.uniqueID ] ||
     1845                                                                (outerCache[ node.uniqueID ] = {});
     1846
     1847                                                        cache = uniqueCache[ type ] || [];
     1848                                                        nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
     1849                                                        diff = nodeIndex && cache[ 2 ];
     1850                                                        node = nodeIndex && parent.childNodes[ nodeIndex ];
     1851
     1852                                                        while ( (node = ++nodeIndex && node && node[ dir ] ||
     1853
     1854                                                                // Fallback to seeking `elem` from the start
     1855                                                                (diff = nodeIndex = 0) || start.pop()) ) {
     1856
     1857                                                                // When found, cache indexes on `parent` and break
     1858                                                                if ( node.nodeType === 1 && ++diff && node === elem ) {
     1859                                                                        uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
     1860                                                                        break;
     1861                                                                }
     1862                                                        }
     1863
     1864                                                } else {
     1865                                                        // Use previously-cached element index if available
     1866                                                        if ( useCache ) {
     1867                                                                // ...in a gzip-friendly way
     1868                                                                node = elem;
     1869                                                                outerCache = node[ expando ] || (node[ expando ] = {});
     1870
     1871                                                                // Support: IE <9 only
     1872                                                                // Defend against cloned attroperties (jQuery gh-1709)
     1873                                                                uniqueCache = outerCache[ node.uniqueID ] ||
     1874                                                                        (outerCache[ node.uniqueID ] = {});
     1875
     1876                                                                cache = uniqueCache[ type ] || [];
     1877                                                                nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
     1878                                                                diff = nodeIndex;
     1879                                                        }
     1880
     1881                                                        // xml :nth-child(...)
     1882                                                        // or :nth-last-child(...) or :nth(-last)?-of-type(...)
     1883                                                        if ( diff === false ) {
     1884                                                                // Use the same loop as above to seek `elem` from the start
     1885                                                                while ( (node = ++nodeIndex && node && node[ dir ] ||
     1886                                                                        (diff = nodeIndex = 0) || start.pop()) ) {
     1887
     1888                                                                        if ( ( ofType ?
     1889                                                                                node.nodeName.toLowerCase() === name :
     1890                                                                                node.nodeType === 1 ) &&
     1891                                                                                ++diff ) {
     1892
     1893                                                                                // Cache the index of each encountered element
     1894                                                                                if ( useCache ) {
     1895                                                                                        outerCache = node[ expando ] || (node[ expando ] = {});
     1896
     1897                                                                                        // Support: IE <9 only
     1898                                                                                        // Defend against cloned attroperties (jQuery gh-1709)
     1899                                                                                        uniqueCache = outerCache[ node.uniqueID ] ||
     1900                                                                                                (outerCache[ node.uniqueID ] = {});
     1901
     1902                                                                                        uniqueCache[ type ] = [ dirruns, diff ];
     1903                                                                                }
     1904
     1905                                                                                if ( node === elem ) {
     1906                                                                                        break;
     1907                                                                                }
     1908                                                                        }
     1909                                                                }
     1910                                                        }
     1911                                                }
     1912
     1913                                                // Incorporate the offset, then check against cycle size
     1914                                                diff -= last;
     1915                                                return diff === first || ( diff % first === 0 && diff / first >= 0 );
     1916                                        }
     1917                                };
     1918                },
     1919
     1920                "PSEUDO": function( pseudo, argument ) {
     1921                        // pseudo-class names are case-insensitive
     1922                        // http://www.w3.org/TR/selectors/#pseudo-classes
     1923                        // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
     1924                        // Remember that setFilters inherits from pseudos
     1925                        var args,
     1926                                fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
     1927                                        Sizzle.error( "unsupported pseudo: " + pseudo );
     1928
     1929                        // The user may use createPseudo to indicate that
     1930                        // arguments are needed to create the filter function
     1931                        // just as Sizzle does
     1932                        if ( fn[ expando ] ) {
     1933                                return fn( argument );
     1934                        }
     1935
     1936                        // But maintain support for old signatures
     1937                        if ( fn.length > 1 ) {
     1938                                args = [ pseudo, pseudo, "", argument ];
     1939                                return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
     1940                                        markFunction(function( seed, matches ) {
     1941                                                var idx,
     1942                                                        matched = fn( seed, argument ),
     1943                                                        i = matched.length;
     1944                                                while ( i-- ) {
     1945                                                        idx = indexOf( seed, matched[i] );
     1946                                                        seed[ idx ] = !( matches[ idx ] = matched[i] );
     1947                                                }
     1948                                        }) :
     1949                                        function( elem ) {
     1950                                                return fn( elem, 0, args );
     1951                                        };
     1952                        }
     1953
     1954                        return fn;
     1955                }
     1956        },
     1957
     1958        pseudos: {
     1959                // Potentially complex pseudos
     1960                "not": markFunction(function( selector ) {
     1961                        // Trim the selector passed to compile
     1962                        // to avoid treating leading and trailing
     1963                        // spaces as combinators
     1964                        var input = [],
     1965                                results = [],
     1966                                matcher = compile( selector.replace( rtrim, "$1" ) );
     1967
     1968                        return matcher[ expando ] ?
     1969                                markFunction(function( seed, matches, context, xml ) {
     1970                                        var elem,
     1971                                                unmatched = matcher( seed, null, xml, [] ),
     1972                                                i = seed.length;
     1973
     1974                                        // Match elements unmatched by `matcher`
     1975                                        while ( i-- ) {
     1976                                                if ( (elem = unmatched[i]) ) {
     1977                                                        seed[i] = !(matches[i] = elem);
     1978                                                }
     1979                                        }
     1980                                }) :
     1981                                function( elem, context, xml ) {
     1982                                        input[0] = elem;
     1983                                        matcher( input, null, xml, results );
     1984                                        // Don't keep the element (issue #299)
     1985                                        input[0] = null;
     1986                                        return !results.pop();
     1987                                };
     1988                }),
     1989
     1990                "has": markFunction(function( selector ) {
     1991                        return function( elem ) {
     1992                                return Sizzle( selector, elem ).length > 0;
     1993                        };
     1994                }),
     1995
     1996                "contains": markFunction(function( text ) {
     1997                        text = text.replace( runescape, funescape );
     1998                        return function( elem ) {
     1999                                return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
     2000                        };
     2001                }),
     2002
     2003                // "Whether an element is represented by a :lang() selector
     2004                // is based solely on the element's language value
     2005                // being equal to the identifier C,
     2006                // or beginning with the identifier C immediately followed by "-".
     2007                // The matching of C against the element's language value is performed case-insensitively.
     2008                // The identifier C does not have to be a valid language name."
     2009                // http://www.w3.org/TR/selectors/#lang-pseudo
     2010                "lang": markFunction( function( lang ) {
     2011                        // lang value must be a valid identifier
     2012                        if ( !ridentifier.test(lang || "") ) {
     2013                                Sizzle.error( "unsupported lang: " + lang );
     2014                        }
     2015                        lang = lang.replace( runescape, funescape ).toLowerCase();
     2016                        return function( elem ) {
     2017                                var elemLang;
     2018                                do {
     2019                                        if ( (elemLang = documentIsHTML ?
     2020                                                elem.lang :
     2021                                                elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
     2022
     2023                                                elemLang = elemLang.toLowerCase();
     2024                                                return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
     2025                                        }
     2026                                } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
     2027                                return false;
     2028                        };
     2029                }),
     2030
     2031                // Miscellaneous
     2032                "target": function( elem ) {
     2033                        var hash = window.location && window.location.hash;
     2034                        return hash && hash.slice( 1 ) === elem.id;
     2035                },
     2036
     2037                "root": function( elem ) {
     2038                        return elem === docElem;
     2039                },
     2040
     2041                "focus": function( elem ) {
     2042                        return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
     2043                },
     2044
     2045                // Boolean properties
     2046                "enabled": createDisabledPseudo( false ),
     2047                "disabled": createDisabledPseudo( true ),
     2048
     2049                "checked": function( elem ) {
     2050                        // In CSS3, :checked should return both checked and selected elements
     2051                        // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
     2052                        var nodeName = elem.nodeName.toLowerCase();
     2053                        return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
     2054                },
     2055
     2056                "selected": function( elem ) {
     2057                        // Accessing this property makes selected-by-default
     2058                        // options in Safari work properly
     2059                        if ( elem.parentNode ) {
     2060                                elem.parentNode.selectedIndex;
     2061                        }
     2062
     2063                        return elem.selected === true;
     2064                },
     2065
     2066                // Contents
     2067                "empty": function( elem ) {
     2068                        // http://www.w3.org/TR/selectors/#empty-pseudo
     2069                        // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
     2070                        //   but not by others (comment: 8; processing instruction: 7; etc.)
     2071                        // nodeType < 6 works because attributes (2) do not appear as children
     2072                        for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
     2073                                if ( elem.nodeType < 6 ) {
     2074                                        return false;
     2075                                }
     2076                        }
     2077                        return true;
     2078                },
     2079
     2080                "parent": function( elem ) {
     2081                        return !Expr.pseudos["empty"]( elem );
     2082                },
     2083
     2084                // Element/input types
     2085                "header": function( elem ) {
     2086                        return rheader.test( elem.nodeName );
     2087                },
     2088
     2089                "input": function( elem ) {
     2090                        return rinputs.test( elem.nodeName );
     2091                },
     2092
     2093                "button": function( elem ) {
     2094                        var name = elem.nodeName.toLowerCase();
     2095                        return name === "input" && elem.type === "button" || name === "button";
     2096                },
     2097
     2098                "text": function( elem ) {
     2099                        var attr;
     2100                        return elem.nodeName.toLowerCase() === "input" &&
     2101                                elem.type === "text" &&
     2102
     2103                                // Support: IE<8
     2104                                // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
     2105                                ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
     2106                },
     2107
     2108                // Position-in-collection
     2109                "first": createPositionalPseudo(function() {
     2110                        return [ 0 ];
     2111                }),
     2112
     2113                "last": createPositionalPseudo(function( matchIndexes, length ) {
     2114                        return [ length - 1 ];
     2115                }),
     2116
     2117                "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2118                        return [ argument < 0 ? argument + length : argument ];
     2119                }),
     2120
     2121                "even": createPositionalPseudo(function( matchIndexes, length ) {
     2122                        var i = 0;
     2123                        for ( ; i < length; i += 2 ) {
     2124                                matchIndexes.push( i );
     2125                        }
     2126                        return matchIndexes;
     2127                }),
     2128
     2129                "odd": createPositionalPseudo(function( matchIndexes, length ) {
     2130                        var i = 1;
     2131                        for ( ; i < length; i += 2 ) {
     2132                                matchIndexes.push( i );
     2133                        }
     2134                        return matchIndexes;
     2135                }),
     2136
     2137                "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2138                        var i = argument < 0 ? argument + length : argument;
     2139                        for ( ; --i >= 0; ) {
     2140                                matchIndexes.push( i );
     2141                        }
     2142                        return matchIndexes;
     2143                }),
     2144
     2145                "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
     2146                        var i = argument < 0 ? argument + length : argument;
     2147                        for ( ; ++i < length; ) {
     2148                                matchIndexes.push( i );
     2149                        }
     2150                        return matchIndexes;
     2151                })
     2152        }
     2153};
     2154
     2155Expr.pseudos["nth"] = Expr.pseudos["eq"];
     2156
     2157// Add button/input type pseudos
     2158for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
     2159        Expr.pseudos[ i ] = createInputPseudo( i );
     2160}
     2161for ( i in { submit: true, reset: true } ) {
     2162        Expr.pseudos[ i ] = createButtonPseudo( i );
     2163}
     2164
     2165// Easy API for creating new setFilters
     2166function setFilters() {}
     2167setFilters.prototype = Expr.filters = Expr.pseudos;
     2168Expr.setFilters = new setFilters();
     2169
     2170tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
     2171        var matched, match, tokens, type,
     2172                soFar, groups, preFilters,
     2173                cached = tokenCache[ selector + " " ];
     2174
     2175        if ( cached ) {
     2176                return parseOnly ? 0 : cached.slice( 0 );
     2177        }
     2178
     2179        soFar = selector;
     2180        groups = [];
     2181        preFilters = Expr.preFilter;
     2182
     2183        while ( soFar ) {
     2184
     2185                // Comma and first run
     2186                if ( !matched || (match = rcomma.exec( soFar )) ) {
     2187                        if ( match ) {
     2188                                // Don't consume trailing commas as valid
     2189                                soFar = soFar.slice( match[0].length ) || soFar;
     2190                        }
     2191                        groups.push( (tokens = []) );
     2192                }
     2193
     2194                matched = false;
     2195
     2196                // Combinators
     2197                if ( (match = rcombinators.exec( soFar )) ) {
     2198                        matched = match.shift();
     2199                        tokens.push({
     2200                                value: matched,
     2201                                // Cast descendant combinators to space
     2202                                type: match[0].replace( rtrim, " " )
     2203                        });
     2204                        soFar = soFar.slice( matched.length );
     2205                }
     2206
     2207                // Filters
     2208                for ( type in Expr.filter ) {
     2209                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
     2210                                (match = preFilters[ type ]( match ))) ) {
     2211                                matched = match.shift();
     2212                                tokens.push({
     2213                                        value: matched,
     2214                                        type: type,
     2215                                        matches: match
     2216                                });
     2217                                soFar = soFar.slice( matched.length );
     2218                        }
     2219                }
     2220
     2221                if ( !matched ) {
     2222                        break;
     2223                }
     2224        }
     2225
     2226        // Return the length of the invalid excess
     2227        // if we're just parsing
     2228        // Otherwise, throw an error or return tokens
     2229        return parseOnly ?
     2230                soFar.length :
     2231                soFar ?
     2232                        Sizzle.error( selector ) :
     2233                        // Cache the tokens
     2234                        tokenCache( selector, groups ).slice( 0 );
     2235};
     2236
     2237function toSelector( tokens ) {
     2238        var i = 0,
     2239                len = tokens.length,
     2240                selector = "";
     2241        for ( ; i < len; i++ ) {
     2242                selector += tokens[i].value;
     2243        }
     2244        return selector;
     2245}
     2246
     2247function addCombinator( matcher, combinator, base ) {
     2248        var dir = combinator.dir,
     2249                skip = combinator.next,
     2250                key = skip || dir,
     2251                checkNonElements = base && key === "parentNode",
     2252                doneName = done++;
     2253
     2254        return combinator.first ?
     2255                // Check against closest ancestor/preceding element
     2256                function( elem, context, xml ) {
     2257                        while ( (elem = elem[ dir ]) ) {
     2258                                if ( elem.nodeType === 1 || checkNonElements ) {
     2259                                        return matcher( elem, context, xml );
     2260                                }
     2261                        }
     2262                        return false;
     2263                } :
     2264
     2265                // Check against all ancestor/preceding elements
     2266                function( elem, context, xml ) {
     2267                        var oldCache, uniqueCache, outerCache,
     2268                                newCache = [ dirruns, doneName ];
     2269
     2270                        // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
     2271                        if ( xml ) {
     2272                                while ( (elem = elem[ dir ]) ) {
     2273                                        if ( elem.nodeType === 1 || checkNonElements ) {
     2274                                                if ( matcher( elem, context, xml ) ) {
     2275                                                        return true;
     2276                                                }
     2277                                        }
     2278                                }
     2279                        } else {
     2280                                while ( (elem = elem[ dir ]) ) {
     2281                                        if ( elem.nodeType === 1 || checkNonElements ) {
     2282                                                outerCache = elem[ expando ] || (elem[ expando ] = {});
     2283
     2284                                                // Support: IE <9 only
     2285                                                // Defend against cloned attroperties (jQuery gh-1709)
     2286                                                uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
     2287
     2288                                                if ( skip && skip === elem.nodeName.toLowerCase() ) {
     2289                                                        elem = elem[ dir ] || elem;
     2290                                                } else if ( (oldCache = uniqueCache[ key ]) &&
     2291                                                        oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
     2292
     2293                                                        // Assign to newCache so results back-propagate to previous elements
     2294                                                        return (newCache[ 2 ] = oldCache[ 2 ]);
     2295                                                } else {
     2296                                                        // Reuse newcache so results back-propagate to previous elements
     2297                                                        uniqueCache[ key ] = newCache;
     2298
     2299                                                        // A match means we're done; a fail means we have to keep checking
     2300                                                        if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
     2301                                                                return true;
     2302                                                        }
     2303                                                }
     2304                                        }
     2305                                }
     2306                        }
     2307                        return false;
     2308                };
     2309}
     2310
     2311function elementMatcher( matchers ) {
     2312        return matchers.length > 1 ?
     2313                function( elem, context, xml ) {
     2314                        var i = matchers.length;
     2315                        while ( i-- ) {
     2316                                if ( !matchers[i]( elem, context, xml ) ) {
     2317                                        return false;
     2318                                }
     2319                        }
     2320                        return true;
     2321                } :
     2322                matchers[0];
     2323}
     2324
     2325function multipleContexts( selector, contexts, results ) {
     2326        var i = 0,
     2327                len = contexts.length;
     2328        for ( ; i < len; i++ ) {
     2329                Sizzle( selector, contexts[i], results );
     2330        }
     2331        return results;
     2332}
     2333
     2334function condense( unmatched, map, filter, context, xml ) {
     2335        var elem,
     2336                newUnmatched = [],
     2337                i = 0,
     2338                len = unmatched.length,
     2339                mapped = map != null;
     2340
     2341        for ( ; i < len; i++ ) {
     2342                if ( (elem = unmatched[i]) ) {
     2343                        if ( !filter || filter( elem, context, xml ) ) {
     2344                                newUnmatched.push( elem );
     2345                                if ( mapped ) {
     2346                                        map.push( i );
     2347                                }
     2348                        }
     2349                }
     2350        }
     2351
     2352        return newUnmatched;
     2353}
     2354
     2355function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
     2356        if ( postFilter && !postFilter[ expando ] ) {
     2357                postFilter = setMatcher( postFilter );
     2358        }
     2359        if ( postFinder && !postFinder[ expando ] ) {
     2360                postFinder = setMatcher( postFinder, postSelector );
     2361        }
     2362        return markFunction(function( seed, results, context, xml ) {
     2363                var temp, i, elem,
     2364                        preMap = [],
     2365                        postMap = [],
     2366                        preexisting = results.length,
     2367
     2368                        // Get initial elements from seed or context
     2369                        elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
     2370
     2371                        // Prefilter to get matcher input, preserving a map for seed-results synchronization
     2372                        matcherIn = preFilter && ( seed || !selector ) ?
     2373                                condense( elems, preMap, preFilter, context, xml ) :
     2374                                elems,
     2375
     2376                        matcherOut = matcher ?
     2377                                // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
     2378                                postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
     2379
     2380                                        // ...intermediate processing is necessary
     2381                                        [] :
     2382
     2383                                        // ...otherwise use results directly
     2384                                        results :
     2385                                matcherIn;
     2386
     2387                // Find primary matches
     2388                if ( matcher ) {
     2389                        matcher( matcherIn, matcherOut, context, xml );
     2390                }
     2391
     2392                // Apply postFilter
     2393                if ( postFilter ) {
     2394                        temp = condense( matcherOut, postMap );
     2395                        postFilter( temp, [], context, xml );
     2396
     2397                        // Un-match failing elements by moving them back to matcherIn
     2398                        i = temp.length;
     2399                        while ( i-- ) {
     2400                                if ( (elem = temp[i]) ) {
     2401                                        matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
     2402                                }
     2403                        }
     2404                }
     2405
     2406                if ( seed ) {
     2407                        if ( postFinder || preFilter ) {
     2408                                if ( postFinder ) {
     2409                                        // Get the final matcherOut by condensing this intermediate into postFinder contexts
     2410                                        temp = [];
     2411                                        i = matcherOut.length;
     2412                                        while ( i-- ) {
     2413                                                if ( (elem = matcherOut[i]) ) {
     2414                                                        // Restore matcherIn since elem is not yet a final match
     2415                                                        temp.push( (matcherIn[i] = elem) );
     2416                                                }
     2417                                        }
     2418                                        postFinder( null, (matcherOut = []), temp, xml );
     2419                                }
     2420
     2421                                // Move matched elements from seed to results to keep them synchronized
     2422                                i = matcherOut.length;
     2423                                while ( i-- ) {
     2424                                        if ( (elem = matcherOut[i]) &&
     2425                                                (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
     2426
     2427                                                seed[temp] = !(results[temp] = elem);
     2428                                        }
     2429                                }
     2430                        }
     2431
     2432                // Add elements to results, through postFinder if defined
     2433                } else {
     2434                        matcherOut = condense(
     2435                                matcherOut === results ?
     2436                                        matcherOut.splice( preexisting, matcherOut.length ) :
     2437                                        matcherOut
     2438                        );
     2439                        if ( postFinder ) {
     2440                                postFinder( null, results, matcherOut, xml );
     2441                        } else {
     2442                                push.apply( results, matcherOut );
     2443                        }
     2444                }
     2445        });
     2446}
     2447
     2448function matcherFromTokens( tokens ) {
     2449        var checkContext, matcher, j,
     2450                len = tokens.length,
     2451                leadingRelative = Expr.relative[ tokens[0].type ],
     2452                implicitRelative = leadingRelative || Expr.relative[" "],
     2453                i = leadingRelative ? 1 : 0,
     2454
     2455                // The foundational matcher ensures that elements are reachable from top-level context(s)
     2456                matchContext = addCombinator( function( elem ) {
     2457                        return elem === checkContext;
     2458                }, implicitRelative, true ),
     2459                matchAnyContext = addCombinator( function( elem ) {
     2460                        return indexOf( checkContext, elem ) > -1;
     2461                }, implicitRelative, true ),
     2462                matchers = [ function( elem, context, xml ) {
     2463                        var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
     2464                                (checkContext = context).nodeType ?
     2465                                        matchContext( elem, context, xml ) :
     2466                                        matchAnyContext( elem, context, xml ) );
     2467                        // Avoid hanging onto element (issue #299)
     2468                        checkContext = null;
     2469                        return ret;
     2470                } ];
     2471
     2472        for ( ; i < len; i++ ) {
     2473                if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
     2474                        matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
     2475                } else {
     2476                        matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
     2477
     2478                        // Return special upon seeing a positional matcher
     2479                        if ( matcher[ expando ] ) {
     2480                                // Find the next relative operator (if any) for proper handling
     2481                                j = ++i;
     2482                                for ( ; j < len; j++ ) {
     2483                                        if ( Expr.relative[ tokens[j].type ] ) {
     2484                                                break;
     2485                                        }
     2486                                }
     2487                                return setMatcher(
     2488                                        i > 1 && elementMatcher( matchers ),
     2489                                        i > 1 && toSelector(
     2490                                                // If the preceding token was a descendant combinator, insert an implicit any-element `*`
     2491                                                tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
     2492                                        ).replace( rtrim, "$1" ),
     2493                                        matcher,
     2494                                        i < j && matcherFromTokens( tokens.slice( i, j ) ),
     2495                                        j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
     2496                                        j < len && toSelector( tokens )
     2497                                );
     2498                        }
     2499                        matchers.push( matcher );
     2500                }
     2501        }
     2502
     2503        return elementMatcher( matchers );
     2504}
     2505
     2506function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
     2507        var bySet = setMatchers.length > 0,
     2508                byElement = elementMatchers.length > 0,
     2509                superMatcher = function( seed, context, xml, results, outermost ) {
     2510                        var elem, j, matcher,
     2511                                matchedCount = 0,
     2512                                i = "0",
     2513                                unmatched = seed && [],
     2514                                setMatched = [],
     2515                                contextBackup = outermostContext,
     2516                                // We must always have either seed elements or outermost context
     2517                                elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
     2518                                // Use integer dirruns iff this is the outermost matcher
     2519                                dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
     2520                                len = elems.length;
     2521
     2522                        if ( outermost ) {
     2523                                outermostContext = context === document || context || outermost;
     2524                        }
     2525
     2526                        // Add elements passing elementMatchers directly to results
     2527                        // Support: IE<9, Safari
     2528                        // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
     2529                        for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
     2530                                if ( byElement && elem ) {
     2531                                        j = 0;
     2532                                        if ( !context && elem.ownerDocument !== document ) {
     2533                                                setDocument( elem );
     2534                                                xml = !documentIsHTML;
     2535                                        }
     2536                                        while ( (matcher = elementMatchers[j++]) ) {
     2537                                                if ( matcher( elem, context || document, xml) ) {
     2538                                                        results.push( elem );
     2539                                                        break;
     2540                                                }
     2541                                        }
     2542                                        if ( outermost ) {
     2543                                                dirruns = dirrunsUnique;
     2544                                        }
     2545                                }
     2546
     2547                                // Track unmatched elements for set filters
     2548                                if ( bySet ) {
     2549                                        // They will have gone through all possible matchers
     2550                                        if ( (elem = !matcher && elem) ) {
     2551                                                matchedCount--;
     2552                                        }
     2553
     2554                                        // Lengthen the array for every element, matched or not
     2555                                        if ( seed ) {
     2556                                                unmatched.push( elem );
     2557                                        }
     2558                                }
     2559                        }
     2560
     2561                        // `i` is now the count of elements visited above, and adding it to `matchedCount`
     2562                        // makes the latter nonnegative.
     2563                        matchedCount += i;
     2564
     2565                        // Apply set filters to unmatched elements
     2566                        // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
     2567                        // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
     2568                        // no element matchers and no seed.
     2569                        // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
     2570                        // case, which will result in a "00" `matchedCount` that differs from `i` but is also
     2571                        // numerically zero.
     2572                        if ( bySet && i !== matchedCount ) {
     2573                                j = 0;
     2574                                while ( (matcher = setMatchers[j++]) ) {
     2575                                        matcher( unmatched, setMatched, context, xml );
     2576                                }
     2577
     2578                                if ( seed ) {
     2579                                        // Reintegrate element matches to eliminate the need for sorting
     2580                                        if ( matchedCount > 0 ) {
     2581                                                while ( i-- ) {
     2582                                                        if ( !(unmatched[i] || setMatched[i]) ) {
     2583                                                                setMatched[i] = pop.call( results );
     2584                                                        }
     2585                                                }
     2586                                        }
     2587
     2588                                        // Discard index placeholder values to get only actual matches
     2589                                        setMatched = condense( setMatched );
     2590                                }
     2591
     2592                                // Add matches to results
     2593                                push.apply( results, setMatched );
     2594
     2595                                // Seedless set matches succeeding multiple successful matchers stipulate sorting
     2596                                if ( outermost && !seed && setMatched.length > 0 &&
     2597                                        ( matchedCount + setMatchers.length ) > 1 ) {
     2598
     2599                                        Sizzle.uniqueSort( results );
     2600                                }
     2601                        }
     2602
     2603                        // Override manipulation of globals by nested matchers
     2604                        if ( outermost ) {
     2605                                dirruns = dirrunsUnique;
     2606                                outermostContext = contextBackup;
     2607                        }
     2608
     2609                        return unmatched;
     2610                };
     2611
     2612        return bySet ?
     2613                markFunction( superMatcher ) :
     2614                superMatcher;
     2615}
     2616
     2617compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
     2618        var i,
     2619                setMatchers = [],
     2620                elementMatchers = [],
     2621                cached = compilerCache[ selector + " " ];
     2622
     2623        if ( !cached ) {
     2624                // Generate a function of recursive functions that can be used to check each element
     2625                if ( !match ) {
     2626                        match = tokenize( selector );
     2627                }
     2628                i = match.length;
     2629                while ( i-- ) {
     2630                        cached = matcherFromTokens( match[i] );
     2631                        if ( cached[ expando ] ) {
     2632                                setMatchers.push( cached );
     2633                        } else {
     2634                                elementMatchers.push( cached );
     2635                        }
     2636                }
     2637
     2638                // Cache the compiled function
     2639                cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
     2640
     2641                // Save selector and tokenization
     2642                cached.selector = selector;
     2643        }
     2644        return cached;
     2645};
     2646
     2647/**
     2648 * A low-level selection function that works with Sizzle's compiled
     2649 *  selector functions
     2650 * @param {String|Function} selector A selector or a pre-compiled
     2651 *  selector function built with Sizzle.compile
     2652 * @param {Element} context
     2653 * @param {Array} [results]
     2654 * @param {Array} [seed] A set of elements to match against
     2655 */
     2656select = Sizzle.select = function( selector, context, results, seed ) {
     2657        var i, tokens, token, type, find,
     2658                compiled = typeof selector === "function" && selector,
     2659                match = !seed && tokenize( (selector = compiled.selector || selector) );
     2660
     2661        results = results || [];
     2662
     2663        // Try to minimize operations if there is only one selector in the list and no seed
     2664        // (the latter of which guarantees us context)
     2665        if ( match.length === 1 ) {
     2666
     2667                // Reduce context if the leading compound selector is an ID
     2668                tokens = match[0] = match[0].slice( 0 );
     2669                if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
     2670                                context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
     2671
     2672                        context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
     2673                        if ( !context ) {
     2674                                return results;
     2675
     2676                        // Precompiled matchers will still verify ancestry, so step up a level
     2677                        } else if ( compiled ) {
     2678                                context = context.parentNode;
     2679                        }
     2680
     2681                        selector = selector.slice( tokens.shift().value.length );
     2682                }
     2683
     2684                // Fetch a seed set for right-to-left matching
     2685                i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
     2686                while ( i-- ) {
     2687                        token = tokens[i];
     2688
     2689                        // Abort if we hit a combinator
     2690                        if ( Expr.relative[ (type = token.type) ] ) {
     2691                                break;
     2692                        }
     2693                        if ( (find = Expr.find[ type ]) ) {
     2694                                // Search, expanding context for leading sibling combinators
     2695                                if ( (seed = find(
     2696                                        token.matches[0].replace( runescape, funescape ),
     2697                                        rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
     2698                                )) ) {
     2699
     2700                                        // If seed is empty or no tokens remain, we can return early
     2701                                        tokens.splice( i, 1 );
     2702                                        selector = seed.length && toSelector( tokens );
     2703                                        if ( !selector ) {
     2704                                                push.apply( results, seed );
     2705                                                return results;
     2706                                        }
     2707
     2708                                        break;
     2709                                }
     2710                        }
     2711                }
     2712        }
     2713
     2714        // Compile and execute a filtering function if one is not provided
     2715        // Provide `match` to avoid retokenization if we modified the selector above
     2716        ( compiled || compile( selector, match ) )(
     2717                seed,
     2718                context,
     2719                !documentIsHTML,
     2720                results,
     2721                !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
     2722        );
     2723        return results;
     2724};
     2725
     2726// One-time assignments
     2727
     2728// Sort stability
     2729support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
     2730
     2731// Support: Chrome 14-35+
     2732// Always assume duplicates if they aren't passed to the comparison function
     2733support.detectDuplicates = !!hasDuplicate;
     2734
     2735// Initialize against the default document
     2736setDocument();
     2737
     2738// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
     2739// Detached nodes confoundingly follow *each other*
     2740support.sortDetached = assert(function( el ) {
     2741        // Should return 1, but returns 4 (following)
     2742        return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
     2743});
     2744
     2745// Support: IE<8
     2746// Prevent attribute/property "interpolation"
     2747// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
     2748if ( !assert(function( el ) {
     2749        el.innerHTML = "<a href='#'></a>";
     2750        return el.firstChild.getAttribute("href") === "#" ;
     2751}) ) {
     2752        addHandle( "type|href|height|width", function( elem, name, isXML ) {
     2753                if ( !isXML ) {
     2754                        return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
     2755                }
     2756        });
     2757}
     2758
     2759// Support: IE<9
     2760// Use defaultValue in place of getAttribute("value")
     2761if ( !support.attributes || !assert(function( el ) {
     2762        el.innerHTML = "<input/>";
     2763        el.firstChild.setAttribute( "value", "" );
     2764        return el.firstChild.getAttribute( "value" ) === "";
     2765}) ) {
     2766        addHandle( "value", function( elem, name, isXML ) {
     2767                if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
     2768                        return elem.defaultValue;
     2769                }
     2770        });
     2771}
     2772
     2773// Support: IE<9
     2774// Use getAttributeNode to fetch booleans when getAttribute lies
     2775if ( !assert(function( el ) {
     2776        return el.getAttribute("disabled") == null;
     2777}) ) {
     2778        addHandle( booleans, function( elem, name, isXML ) {
     2779                var val;
     2780                if ( !isXML ) {
     2781                        return elem[ name ] === true ? name.toLowerCase() :
     2782                                        (val = elem.getAttributeNode( name )) && val.specified ?
     2783                                        val.value :
     2784                                null;
     2785                }
     2786        });
     2787}
     2788
     2789return Sizzle;
     2790
     2791})( window );
     2792
     2793
     2794
     2795jQuery.find = Sizzle;
     2796jQuery.expr = Sizzle.selectors;
     2797
     2798// Deprecated
     2799jQuery.expr[ ":" ] = jQuery.expr.pseudos;
     2800jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
     2801jQuery.text = Sizzle.getText;
     2802jQuery.isXMLDoc = Sizzle.isXML;
     2803jQuery.contains = Sizzle.contains;
     2804jQuery.escapeSelector = Sizzle.escape;
     2805
     2806
     2807
     2808
     2809var dir = function( elem, dir, until ) {
     2810        var matched = [],
     2811                truncate = until !== undefined;
     2812
     2813        while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
     2814                if ( elem.nodeType === 1 ) {
     2815                        if ( truncate && jQuery( elem ).is( until ) ) {
     2816                                break;
     2817                        }
     2818                        matched.push( elem );
     2819                }
     2820        }
     2821        return matched;
     2822};
     2823
     2824
     2825var siblings = function( n, elem ) {
     2826        var matched = [];
     2827
     2828        for ( ; n; n = n.nextSibling ) {
     2829                if ( n.nodeType === 1 && n !== elem ) {
     2830                        matched.push( n );
     2831                }
     2832        }
     2833
     2834        return matched;
     2835};
     2836
     2837
     2838var rneedsContext = jQuery.expr.match.needsContext;
     2839
     2840
     2841
     2842function nodeName( elem, name ) {
     2843
     2844  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
     2845
     2846};
     2847var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
     2848
     2849
     2850
     2851var risSimple = /^.[^:#\[\.,]*$/;
     2852
     2853// Implement the identical functionality for filter and not
     2854function winnow( elements, qualifier, not ) {
     2855        if ( jQuery.isFunction( qualifier ) ) {
     2856                return jQuery.grep( elements, function( elem, i ) {
     2857                        return !!qualifier.call( elem, i, elem ) !== not;
     2858                } );
     2859        }
     2860
     2861        // Single element
     2862        if ( qualifier.nodeType ) {
     2863                return jQuery.grep( elements, function( elem ) {
     2864                        return ( elem === qualifier ) !== not;
     2865                } );
     2866        }
     2867
     2868        // Arraylike of elements (jQuery, arguments, Array)
     2869        if ( typeof qualifier !== "string" ) {
     2870                return jQuery.grep( elements, function( elem ) {
     2871                        return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
     2872                } );
     2873        }
     2874
     2875        // Simple selector that can be filtered directly, removing non-Elements
     2876        if ( risSimple.test( qualifier ) ) {
     2877                return jQuery.filter( qualifier, elements, not );
     2878        }
     2879
     2880        // Complex selector, compare the two sets, removing non-Elements
     2881        qualifier = jQuery.filter( qualifier, elements );
     2882        return jQuery.grep( elements, function( elem ) {
     2883                return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1;
     2884        } );
     2885}
     2886
     2887jQuery.filter = function( expr, elems, not ) {
     2888        var elem = elems[ 0 ];
     2889
     2890        if ( not ) {
     2891                expr = ":not(" + expr + ")";
     2892        }
     2893
     2894        if ( elems.length === 1 && elem.nodeType === 1 ) {
     2895                return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
     2896        }
     2897
     2898        return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
     2899                return elem.nodeType === 1;
     2900        } ) );
     2901};
     2902
     2903jQuery.fn.extend( {
     2904        find: function( selector ) {
     2905                var i, ret,
     2906                        len = this.length,
     2907                        self = this;
     2908
     2909                if ( typeof selector !== "string" ) {
     2910                        return this.pushStack( jQuery( selector ).filter( function() {
     2911                                for ( i = 0; i < len; i++ ) {
     2912                                        if ( jQuery.contains( self[ i ], this ) ) {
     2913                                                return true;
     2914                                        }
     2915                                }
     2916                        } ) );
     2917                }
     2918
     2919                ret = this.pushStack( [] );
     2920
     2921                for ( i = 0; i < len; i++ ) {
     2922                        jQuery.find( selector, self[ i ], ret );
     2923                }
     2924
     2925                return len > 1 ? jQuery.uniqueSort( ret ) : ret;
     2926        },
     2927        filter: function( selector ) {
     2928                return this.pushStack( winnow( this, selector || [], false ) );
     2929        },
     2930        not: function( selector ) {
     2931                return this.pushStack( winnow( this, selector || [], true ) );
     2932        },
     2933        is: function( selector ) {
     2934                return !!winnow(
     2935                        this,
     2936
     2937                        // If this is a positional/relative selector, check membership in the returned set
     2938                        // so $("p:first").is("p:last") won't return true for a doc with two "p".
     2939                        typeof selector === "string" && rneedsContext.test( selector ) ?
     2940                                jQuery( selector ) :
     2941                                selector || [],
     2942                        false
     2943                ).length;
     2944        }
     2945} );
     2946
     2947
     2948// Initialize a jQuery object
     2949
     2950
     2951// A central reference to the root jQuery(document)
     2952var rootjQuery,
     2953
     2954        // A simple way to check for HTML strings
     2955        // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
     2956        // Strict HTML recognition (#11290: must start with <)
     2957        // Shortcut simple #id case for speed
     2958        rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
     2959
     2960        init = jQuery.fn.init = function( selector, context, root ) {
     2961                var match, elem;
     2962
     2963                // HANDLE: $(""), $(null), $(undefined), $(false)
     2964                if ( !selector ) {
     2965                        return this;
     2966                }
     2967
     2968                // Method init() accepts an alternate rootjQuery
     2969                // so migrate can support jQuery.sub (gh-2101)
     2970                root = root || rootjQuery;
     2971
     2972                // Handle HTML strings
     2973                if ( typeof selector === "string" ) {
     2974                        if ( selector[ 0 ] === "<" &&
     2975                                selector[ selector.length - 1 ] === ">" &&
     2976                                selector.length >= 3 ) {
     2977
     2978                                // Assume that strings that start and end with <> are HTML and skip the regex check
     2979                                match = [ null, selector, null ];
     2980
     2981                        } else {
     2982                                match = rquickExpr.exec( selector );
     2983                        }
     2984
     2985                        // Match html or make sure no context is specified for #id
     2986                        if ( match && ( match[ 1 ] || !context ) ) {
     2987
     2988                                // HANDLE: $(html) -> $(array)
     2989                                if ( match[ 1 ] ) {
     2990                                        context = context instanceof jQuery ? context[ 0 ] : context;
     2991
     2992                                        // Option to run scripts is true for back-compat
     2993                                        // Intentionally let the error be thrown if parseHTML is not present
     2994                                        jQuery.merge( this, jQuery.parseHTML(
     2995                                                match[ 1 ],
     2996                                                context && context.nodeType ? context.ownerDocument || context : document,
     2997                                                true
     2998                                        ) );
     2999
     3000                                        // HANDLE: $(html, props)
     3001                                        if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
     3002                                                for ( match in context ) {
     3003
     3004                                                        // Properties of context are called as methods if possible
     3005                                                        if ( jQuery.isFunction( this[ match ] ) ) {
     3006                                                                this[ match ]( context[ match ] );
     3007
     3008                                                        // ...and otherwise set as attributes
     3009                                                        } else {
     3010                                                                this.attr( match, context[ match ] );
     3011                                                        }
     3012                                                }
     3013                                        }
     3014
     3015                                        return this;
     3016
     3017                                // HANDLE: $(#id)
     3018                                } else {
     3019                                        elem = document.getElementById( match[ 2 ] );
     3020
     3021                                        if ( elem ) {
     3022
     3023                                                // Inject the element directly into the jQuery object
     3024                                                this[ 0 ] = elem;
     3025                                                this.length = 1;
     3026                                        }
     3027                                        return this;
     3028                                }
     3029
     3030                        // HANDLE: $(expr, $(...))
     3031                        } else if ( !context || context.jquery ) {
     3032                                return ( context || root ).find( selector );
     3033
     3034                        // HANDLE: $(expr, context)
     3035                        // (which is just equivalent to: $(context).find(expr)
     3036                        } else {
     3037                                return this.constructor( context ).find( selector );
     3038                        }
     3039
     3040                // HANDLE: $(DOMElement)
     3041                } else if ( selector.nodeType ) {
     3042                        this[ 0 ] = selector;
     3043                        this.length = 1;
     3044                        return this;
     3045
     3046                // HANDLE: $(function)
     3047                // Shortcut for document ready
     3048                } else if ( jQuery.isFunction( selector ) ) {
     3049                        return root.ready !== undefined ?
     3050                                root.ready( selector ) :
     3051
     3052                                // Execute immediately if ready is not present
     3053                                selector( jQuery );
     3054                }
     3055
     3056                return jQuery.makeArray( selector, this );
     3057        };
     3058
     3059// Give the init function the jQuery prototype for later instantiation
     3060init.prototype = jQuery.fn;
     3061
     3062// Initialize central reference
     3063rootjQuery = jQuery( document );
     3064
     3065
     3066var rparentsprev = /^(?:parents|prev(?:Until|All))/,
     3067
     3068        // Methods guaranteed to produce a unique set when starting from a unique set
     3069        guaranteedUnique = {
     3070                children: true,
     3071                contents: true,
     3072                next: true,
     3073                prev: true
     3074        };
     3075
     3076jQuery.fn.extend( {
     3077        has: function( target ) {
     3078                var targets = jQuery( target, this ),
     3079                        l = targets.length;
     3080
     3081                return this.filter( function() {
     3082                        var i = 0;
     3083                        for ( ; i < l; i++ ) {
     3084                                if ( jQuery.contains( this, targets[ i ] ) ) {
     3085                                        return true;
     3086                                }
     3087                        }
     3088                } );
     3089        },
     3090
     3091        closest: function( selectors, context ) {
     3092                var cur,
     3093                        i = 0,
     3094                        l = this.length,
     3095                        matched = [],
     3096                        targets = typeof selectors !== "string" && jQuery( selectors );
     3097
     3098                // Positional selectors never match, since there's no _selection_ context
     3099                if ( !rneedsContext.test( selectors ) ) {
     3100                        for ( ; i < l; i++ ) {
     3101                                for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
     3102
     3103                                        // Always skip document fragments
     3104                                        if ( cur.nodeType < 11 && ( targets ?
     3105                                                targets.index( cur ) > -1 :
     3106
     3107                                                // Don't pass non-elements to Sizzle
     3108                                                cur.nodeType === 1 &&
     3109                                                        jQuery.find.matchesSelector( cur, selectors ) ) ) {
     3110
     3111                                                matched.push( cur );
     3112                                                break;
     3113                                        }
     3114                                }
     3115                        }
     3116                }
     3117
     3118                return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
     3119        },
     3120
     3121        // Determine the position of an element within the set
     3122        index: function( elem ) {
     3123
     3124                // No argument, return index in parent
     3125                if ( !elem ) {
     3126                        return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
     3127                }
     3128
     3129                // Index in selector
     3130                if ( typeof elem === "string" ) {
     3131                        return indexOf.call( jQuery( elem ), this[ 0 ] );
     3132                }
     3133
     3134                // Locate the position of the desired element
     3135                return indexOf.call( this,
     3136
     3137                        // If it receives a jQuery object, the first element is used
     3138                        elem.jquery ? elem[ 0 ] : elem
     3139                );
     3140        },
     3141
     3142        add: function( selector, context ) {
     3143                return this.pushStack(
     3144                        jQuery.uniqueSort(
     3145                                jQuery.merge( this.get(), jQuery( selector, context ) )
     3146                        )
     3147                );
     3148        },
     3149
     3150        addBack: function( selector ) {
     3151                return this.add( selector == null ?
     3152                        this.prevObject : this.prevObject.filter( selector )
     3153                );
     3154        }
     3155} );
     3156
     3157function sibling( cur, dir ) {
     3158        while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
     3159        return cur;
     3160}
     3161
     3162jQuery.each( {
     3163        parent: function( elem ) {
     3164                var parent = elem.parentNode;
     3165                return parent && parent.nodeType !== 11 ? parent : null;
     3166        },
     3167        parents: function( elem ) {
     3168                return dir( elem, "parentNode" );
     3169        },
     3170        parentsUntil: function( elem, i, until ) {
     3171                return dir( elem, "parentNode", until );
     3172        },
     3173        next: function( elem ) {
     3174                return sibling( elem, "nextSibling" );
     3175        },
     3176        prev: function( elem ) {
     3177                return sibling( elem, "previousSibling" );
     3178        },
     3179        nextAll: function( elem ) {
     3180                return dir( elem, "nextSibling" );
     3181        },
     3182        prevAll: function( elem ) {
     3183                return dir( elem, "previousSibling" );
     3184        },
     3185        nextUntil: function( elem, i, until ) {
     3186                return dir( elem, "nextSibling", until );
     3187        },
     3188        prevUntil: function( elem, i, until ) {
     3189                return dir( elem, "previousSibling", until );
     3190        },
     3191        siblings: function( elem ) {
     3192                return siblings( ( elem.parentNode || {} ).firstChild, elem );
     3193        },
     3194        children: function( elem ) {
     3195                return siblings( elem.firstChild );
     3196        },
     3197        contents: function( elem ) {
     3198        if ( nodeName( elem, "iframe" ) ) {
     3199            return elem.contentDocument;
     3200        }
     3201
     3202        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
     3203        // Treat the template element as a regular one in browsers that
     3204        // don't support it.
     3205        if ( nodeName( elem, "template" ) ) {
     3206            elem = elem.content || elem;
     3207        }
     3208
     3209        return jQuery.merge( [], elem.childNodes );
     3210        }
     3211}, function( name, fn ) {
     3212        jQuery.fn[ name ] = function( until, selector ) {
     3213                var matched = jQuery.map( this, fn, until );
     3214
     3215                if ( name.slice( -5 ) !== "Until" ) {
     3216                        selector = until;
     3217                }
     3218
     3219                if ( selector && typeof selector === "string" ) {
     3220                        matched = jQuery.filter( selector, matched );
     3221                }
     3222
     3223                if ( this.length > 1 ) {
     3224
     3225                        // Remove duplicates
     3226                        if ( !guaranteedUnique[ name ] ) {
     3227                                jQuery.uniqueSort( matched );
     3228                        }
     3229
     3230                        // Reverse order for parents* and prev-derivatives
     3231                        if ( rparentsprev.test( name ) ) {
     3232                                matched.reverse();
     3233                        }
     3234                }
     3235
     3236                return this.pushStack( matched );
     3237        };
     3238} );
     3239var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
     3240
     3241
     3242
     3243// Convert String-formatted options into Object-formatted ones
     3244function createOptions( options ) {
     3245        var object = {};
     3246        jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
     3247                object[ flag ] = true;
     3248        } );
     3249        return object;
     3250}
     3251
     3252/*
     3253 * Create a callback list using the following parameters:
     3254 *
     3255 *      options: an optional list of space-separated options that will change how
     3256 *                      the callback list behaves or a more traditional option object
     3257 *
     3258 * By default a callback list will act like an event callback list and can be
     3259 * "fired" multiple times.
     3260 *
     3261 * Possible options:
     3262 *
     3263 *      once:                   will ensure the callback list can only be fired once (like a Deferred)
     3264 *
     3265 *      memory:                 will keep track of previous values and will call any callback added
     3266 *                                      after the list has been fired right away with the latest "memorized"
     3267 *                                      values (like a Deferred)
     3268 *
     3269 *      unique:                 will ensure a callback can only be added once (no duplicate in the list)
     3270 *
     3271 *      stopOnFalse:    interrupt callings when a callback returns false
     3272 *
     3273 */
     3274jQuery.Callbacks = function( options ) {
     3275
     3276        // Convert options from String-formatted to Object-formatted if needed
     3277        // (we check in cache first)
     3278        options = typeof options === "string" ?
     3279                createOptions( options ) :
     3280                jQuery.extend( {}, options );
     3281
     3282        var // Flag to know if list is currently firing
     3283                firing,
     3284
     3285                // Last fire value for non-forgettable lists
     3286                memory,
     3287
     3288                // Flag to know if list was already fired
     3289                fired,
     3290
     3291                // Flag to prevent firing
     3292                locked,
     3293
     3294                // Actual callback list
     3295                list = [],
     3296
     3297                // Queue of execution data for repeatable lists
     3298                queue = [],
     3299
     3300                // Index of currently firing callback (modified by add/remove as needed)
     3301                firingIndex = -1,
     3302
     3303                // Fire callbacks
     3304                fire = function() {
     3305
     3306                        // Enforce single-firing
     3307                        locked = locked || options.once;
     3308
     3309                        // Execute callbacks for all pending executions,
     3310                        // respecting firingIndex overrides and runtime changes
     3311                        fired = firing = true;
     3312                        for ( ; queue.length; firingIndex = -1 ) {
     3313                                memory = queue.shift();
     3314                                while ( ++firingIndex < list.length ) {
     3315
     3316                                        // Run callback and check for early termination
     3317                                        if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
     3318                                                options.stopOnFalse ) {
     3319
     3320                                                // Jump to end and forget the data so .add doesn't re-fire
     3321                                                firingIndex = list.length;
     3322                                                memory = false;
     3323                                        }
     3324                                }
     3325                        }
     3326
     3327                        // Forget the data if we're done with it
     3328                        if ( !options.memory ) {
     3329                                memory = false;
     3330                        }
     3331
     3332                        firing = false;
     3333
     3334                        // Clean up if we're done firing for good
     3335                        if ( locked ) {
     3336
     3337                                // Keep an empty list if we have data for future add calls
     3338                                if ( memory ) {
     3339                                        list = [];
     3340
     3341                                // Otherwise, this object is spent
     3342                                } else {
     3343                                        list = "";
     3344                                }
     3345                        }
     3346                },
     3347
     3348                // Actual Callbacks object
     3349                self = {
     3350
     3351                        // Add a callback or a collection of callbacks to the list
     3352                        add: function() {
     3353                                if ( list ) {
     3354
     3355                                        // If we have memory from a past run, we should fire after adding
     3356                                        if ( memory && !firing ) {
     3357                                                firingIndex = list.length - 1;
     3358                                                queue.push( memory );
     3359                                        }
     3360
     3361                                        ( function add( args ) {
     3362                                                jQuery.each( args, function( _, arg ) {
     3363                                                        if ( jQuery.isFunction( arg ) ) {
     3364                                                                if ( !options.unique || !self.has( arg ) ) {
     3365                                                                        list.push( arg );
     3366                                                                }
     3367                                                        } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
     3368
     3369                                                                // Inspect recursively
     3370                                                                add( arg );
     3371                                                        }
     3372                                                } );
     3373                                        } )( arguments );
     3374
     3375                                        if ( memory && !firing ) {
     3376                                                fire();
     3377                                        }
     3378                                }
     3379                                return this;
     3380                        },
     3381
     3382                        // Remove a callback from the list
     3383                        remove: function() {
     3384                                jQuery.each( arguments, function( _, arg ) {
     3385                                        var index;
     3386                                        while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
     3387                                                list.splice( index, 1 );
     3388
     3389                                                // Handle firing indexes
     3390                                                if ( index <= firingIndex ) {
     3391                                                        firingIndex--;
     3392                                                }
     3393                                        }
     3394                                } );
     3395                                return this;
     3396                        },
     3397
     3398                        // Check if a given callback is in the list.
     3399                        // If no argument is given, return whether or not list has callbacks attached.
     3400                        has: function( fn ) {
     3401                                return fn ?
     3402                                        jQuery.inArray( fn, list ) > -1 :
     3403                                        list.length > 0;
     3404                        },
     3405
     3406                        // Remove all callbacks from the list
     3407                        empty: function() {
     3408                                if ( list ) {
     3409                                        list = [];
     3410                                }
     3411                                return this;
     3412                        },
     3413
     3414                        // Disable .fire and .add
     3415                        // Abort any current/pending executions
     3416                        // Clear all callbacks and values
     3417                        disable: function() {
     3418                                locked = queue = [];
     3419                                list = memory = "";
     3420                                return this;
     3421                        },
     3422                        disabled: function() {
     3423                                return !list;
     3424                        },
     3425
     3426                        // Disable .fire
     3427                        // Also disable .add unless we have memory (since it would have no effect)
     3428                        // Abort any pending executions
     3429                        lock: function() {
     3430                                locked = queue = [];
     3431                                if ( !memory && !firing ) {
     3432                                        list = memory = "";
     3433                                }
     3434                                return this;
     3435                        },
     3436                        locked: function() {
     3437                                return !!locked;
     3438                        },
     3439
     3440                        // Call all callbacks with the given context and arguments
     3441                        fireWith: function( context, args ) {
     3442                                if ( !locked ) {
     3443                                        args = args || [];
     3444                                        args = [ context, args.slice ? args.slice() : args ];
     3445                                        queue.push( args );
     3446                                        if ( !firing ) {
     3447                                                fire();
     3448                                        }
     3449                                }
     3450                                return this;
     3451                        },
     3452
     3453                        // Call all the callbacks with the given arguments
     3454                        fire: function() {
     3455                                self.fireWith( this, arguments );
     3456                                return this;
     3457                        },
     3458
     3459                        // To know if the callbacks have already been called at least once
     3460                        fired: function() {
     3461                                return !!fired;
     3462                        }
     3463                };
     3464
     3465        return self;
     3466};
     3467
     3468
     3469function Identity( v ) {
     3470        return v;
     3471}
     3472function Thrower( ex ) {
     3473        throw ex;
     3474}
     3475
     3476function adoptValue( value, resolve, reject, noValue ) {
     3477        var method;
     3478
     3479        try {
     3480
     3481                // Check for promise aspect first to privilege synchronous behavior
     3482                if ( value && jQuery.isFunction( ( method = value.promise ) ) ) {
     3483                        method.call( value ).done( resolve ).fail( reject );
     3484
     3485                // Other thenables
     3486                } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) {
     3487                        method.call( value, resolve, reject );
     3488
     3489                // Other non-thenables
     3490                } else {
     3491
     3492                        // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
     3493                        // * false: [ value ].slice( 0 ) => resolve( value )
     3494                        // * true: [ value ].slice( 1 ) => resolve()
     3495                        resolve.apply( undefined, [ value ].slice( noValue ) );
     3496                }
     3497
     3498        // For Promises/A+, convert exceptions into rejections
     3499        // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
     3500        // Deferred#then to conditionally suppress rejection.
     3501        } catch ( value ) {
     3502
     3503                // Support: Android 4.0 only
     3504                // Strict mode functions invoked without .call/.apply get global-object context
     3505                reject.apply( undefined, [ value ] );
     3506        }
     3507}
     3508
     3509jQuery.extend( {
     3510
     3511        Deferred: function( func ) {
     3512                var tuples = [
     3513
     3514                                // action, add listener, callbacks,
     3515                                // ... .then handlers, argument index, [final state]
     3516                                [ "notify", "progress", jQuery.Callbacks( "memory" ),
     3517                                        jQuery.Callbacks( "memory" ), 2 ],
     3518                                [ "resolve", "done", jQuery.Callbacks( "once memory" ),
     3519                                        jQuery.Callbacks( "once memory" ), 0, "resolved" ],
     3520                                [ "reject", "fail", jQuery.Callbacks( "once memory" ),
     3521                                        jQuery.Callbacks( "once memory" ), 1, "rejected" ]
     3522                        ],
     3523                        state = "pending",
     3524                        promise = {
     3525                                state: function() {
     3526                                        return state;
     3527                                },
     3528                                always: function() {
     3529                                        deferred.done( arguments ).fail( arguments );
     3530                                        return this;
     3531                                },
     3532                                "catch": function( fn ) {
     3533                                        return promise.then( null, fn );
     3534                                },
     3535
     3536                                // Keep pipe for back-compat
     3537                                pipe: function( /* fnDone, fnFail, fnProgress */ ) {
     3538                                        var fns = arguments;
     3539
     3540                                        return jQuery.Deferred( function( newDefer ) {
     3541                                                jQuery.each( tuples, function( i, tuple ) {
     3542
     3543                                                        // Map tuples (progress, done, fail) to arguments (done, fail, progress)
     3544                                                        var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
     3545
     3546                                                        // deferred.progress(function() { bind to newDefer or newDefer.notify })
     3547                                                        // deferred.done(function() { bind to newDefer or newDefer.resolve })
     3548                                                        // deferred.fail(function() { bind to newDefer or newDefer.reject })
     3549                                                        deferred[ tuple[ 1 ] ]( function() {
     3550                                                                var returned = fn && fn.apply( this, arguments );
     3551                                                                if ( returned && jQuery.isFunction( returned.promise ) ) {
     3552                                                                        returned.promise()
     3553                                                                                .progress( newDefer.notify )
     3554                                                                                .done( newDefer.resolve )
     3555                                                                                .fail( newDefer.reject );
     3556                                                                } else {
     3557                                                                        newDefer[ tuple[ 0 ] + "With" ](
     3558                                                                                this,
     3559                                                                                fn ? [ returned ] : arguments
     3560                                                                        );
     3561                                                                }
     3562                                                        } );
     3563                                                } );
     3564                                                fns = null;
     3565                                        } ).promise();
     3566                                },
     3567                                then: function( onFulfilled, onRejected, onProgress ) {
     3568                                        var maxDepth = 0;
     3569                                        function resolve( depth, deferred, handler, special ) {
     3570                                                return function() {
     3571                                                        var that = this,
     3572                                                                args = arguments,
     3573                                                                mightThrow = function() {
     3574                                                                        var returned, then;
     3575
     3576                                                                        // Support: Promises/A+ section 2.3.3.3.3
     3577                                                                        // https://promisesaplus.com/#point-59
     3578                                                                        // Ignore double-resolution attempts
     3579                                                                        if ( depth < maxDepth ) {
     3580                                                                                return;
     3581                                                                        }
     3582
     3583                                                                        returned = handler.apply( that, args );
     3584
     3585                                                                        // Support: Promises/A+ section 2.3.1
     3586                                                                        // https://promisesaplus.com/#point-48
     3587                                                                        if ( returned === deferred.promise() ) {
     3588                                                                                throw new TypeError( "Thenable self-resolution" );
     3589                                                                        }
     3590
     3591                                                                        // Support: Promises/A+ sections 2.3.3.1, 3.5
     3592                                                                        // https://promisesaplus.com/#point-54
     3593                                                                        // https://promisesaplus.com/#point-75
     3594                                                                        // Retrieve `then` only once
     3595                                                                        then = returned &&
     3596
     3597                                                                                // Support: Promises/A+ section 2.3.4
     3598                                                                                // https://promisesaplus.com/#point-64
     3599                                                                                // Only check objects and functions for thenability
     3600                                                                                ( typeof returned === "object" ||
     3601                                                                                        typeof returned === "function" ) &&
     3602                                                                                returned.then;
     3603
     3604                                                                        // Handle a returned thenable
     3605                                                                        if ( jQuery.isFunction( then ) ) {
     3606
     3607                                                                                // Special processors (notify) just wait for resolution
     3608                                                                                if ( special ) {
     3609                                                                                        then.call(
     3610                                                                                                returned,
     3611                                                                                                resolve( maxDepth, deferred, Identity, special ),
     3612                                                                                                resolve( maxDepth, deferred, Thrower, special )
     3613                                                                                        );
     3614
     3615                                                                                // Normal processors (resolve) also hook into progress
     3616                                                                                } else {
     3617
     3618                                                                                        // ...and disregard older resolution values
     3619                                                                                        maxDepth++;
     3620
     3621                                                                                        then.call(
     3622                                                                                                returned,
     3623                                                                                                resolve( maxDepth, deferred, Identity, special ),
     3624                                                                                                resolve( maxDepth, deferred, Thrower, special ),
     3625                                                                                                resolve( maxDepth, deferred, Identity,
     3626                                                                                                        deferred.notifyWith )
     3627                                                                                        );
     3628                                                                                }
     3629
     3630                                                                        // Handle all other returned values
     3631                                                                        } else {
     3632
     3633                                                                                // Only substitute handlers pass on context
     3634                                                                                // and multiple values (non-spec behavior)
     3635                                                                                if ( handler !== Identity ) {
     3636                                                                                        that = undefined;
     3637                                                                                        args = [ returned ];
     3638                                                                                }
     3639
     3640                                                                                // Process the value(s)
     3641                                                                                // Default process is resolve
     3642                                                                                ( special || deferred.resolveWith )( that, args );
     3643                                                                        }
     3644                                                                },
     3645
     3646                                                                // Only normal processors (resolve) catch and reject exceptions
     3647                                                                process = special ?
     3648                                                                        mightThrow :
     3649                                                                        function() {
     3650                                                                                try {
     3651                                                                                        mightThrow();
     3652                                                                                } catch ( e ) {
     3653
     3654                                                                                        if ( jQuery.Deferred.exceptionHook ) {
     3655                                                                                                jQuery.Deferred.exceptionHook( e,
     3656                                                                                                        process.stackTrace );
     3657                                                                                        }
     3658
     3659                                                                                        // Support: Promises/A+ section 2.3.3.3.4.1
     3660                                                                                        // https://promisesaplus.com/#point-61
     3661                                                                                        // Ignore post-resolution exceptions
     3662                                                                                        if ( depth + 1 >= maxDepth ) {
     3663
     3664                                                                                                // Only substitute handlers pass on context
     3665                                                                                                // and multiple values (non-spec behavior)
     3666                                                                                                if ( handler !== Thrower ) {
     3667                                                                                                        that = undefined;
     3668                                                                                                        args = [ e ];
     3669                                                                                                }
     3670
     3671                                                                                                deferred.rejectWith( that, args );
     3672                                                                                        }
     3673                                                                                }
     3674                                                                        };
     3675
     3676                                                        // Support: Promises/A+ section 2.3.3.3.1
     3677                                                        // https://promisesaplus.com/#point-57
     3678                                                        // Re-resolve promises immediately to dodge false rejection from
     3679                                                        // subsequent errors
     3680                                                        if ( depth ) {
     3681                                                                process();
     3682                                                        } else {
     3683
     3684                                                                // Call an optional hook to record the stack, in case of exception
     3685                                                                // since it's otherwise lost when execution goes async
     3686                                                                if ( jQuery.Deferred.getStackHook ) {
     3687                                                                        process.stackTrace = jQuery.Deferred.getStackHook();
     3688                                                                }
     3689                                                                window.setTimeout( process );
     3690                                                        }
     3691                                                };
     3692                                        }
     3693
     3694                                        return jQuery.Deferred( function( newDefer ) {
     3695
     3696                                                // progress_handlers.add( ... )
     3697                                                tuples[ 0 ][ 3 ].add(
     3698                                                        resolve(
     3699                                                                0,
     3700                                                                newDefer,
     3701                                                                jQuery.isFunction( onProgress ) ?
     3702                                                                        onProgress :
     3703                                                                        Identity,
     3704                                                                newDefer.notifyWith
     3705                                                        )
     3706                                                );
     3707
     3708                                                // fulfilled_handlers.add( ... )
     3709                                                tuples[ 1 ][ 3 ].add(
     3710                                                        resolve(
     3711                                                                0,
     3712                                                                newDefer,
     3713                                                                jQuery.isFunction( onFulfilled ) ?
     3714                                                                        onFulfilled :
     3715                                                                        Identity
     3716                                                        )
     3717                                                );
     3718
     3719                                                // rejected_handlers.add( ... )
     3720                                                tuples[ 2 ][ 3 ].add(
     3721                                                        resolve(
     3722                                                                0,
     3723                                                                newDefer,
     3724                                                                jQuery.isFunction( onRejected ) ?
     3725                                                                        onRejected :
     3726                                                                        Thrower
     3727                                                        )
     3728                                                );
     3729                                        } ).promise();
     3730                                },
     3731
     3732                                // Get a promise for this deferred
     3733                                // If obj is provided, the promise aspect is added to the object
     3734                                promise: function( obj ) {
     3735                                        return obj != null ? jQuery.extend( obj, promise ) : promise;
     3736                                }
     3737                        },
     3738                        deferred = {};
     3739
     3740                // Add list-specific methods
     3741                jQuery.each( tuples, function( i, tuple ) {
     3742                        var list = tuple[ 2 ],
     3743                                stateString = tuple[ 5 ];
     3744
     3745                        // promise.progress = list.add
     3746                        // promise.done = list.add
     3747                        // promise.fail = list.add
     3748                        promise[ tuple[ 1 ] ] = list.add;
     3749
     3750                        // Handle state
     3751                        if ( stateString ) {
     3752                                list.add(
     3753                                        function() {
     3754
     3755                                                // state = "resolved" (i.e., fulfilled)
     3756                                                // state = "rejected"
     3757                                                state = stateString;
     3758                                        },
     3759
     3760                                        // rejected_callbacks.disable
     3761                                        // fulfilled_callbacks.disable
     3762                                        tuples[ 3 - i ][ 2 ].disable,
     3763
     3764                                        // progress_callbacks.lock
     3765                                        tuples[ 0 ][ 2 ].lock
     3766                                );
     3767                        }
     3768
     3769                        // progress_handlers.fire
     3770                        // fulfilled_handlers.fire
     3771                        // rejected_handlers.fire
     3772                        list.add( tuple[ 3 ].fire );
     3773
     3774                        // deferred.notify = function() { deferred.notifyWith(...) }
     3775                        // deferred.resolve = function() { deferred.resolveWith(...) }
     3776                        // deferred.reject = function() { deferred.rejectWith(...) }
     3777                        deferred[ tuple[ 0 ] ] = function() {
     3778                                deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
     3779                                return this;
     3780                        };
     3781
     3782                        // deferred.notifyWith = list.fireWith
     3783                        // deferred.resolveWith = list.fireWith
     3784                        // deferred.rejectWith = list.fireWith
     3785                        deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
     3786                } );
     3787
     3788                // Make the deferred a promise
     3789                promise.promise( deferred );
     3790
     3791                // Call given func if any
     3792                if ( func ) {
     3793                        func.call( deferred, deferred );
     3794                }
     3795
     3796                // All done!
     3797                return deferred;
     3798        },
     3799
     3800        // Deferred helper
     3801        when: function( singleValue ) {
     3802                var
     3803
     3804                        // count of uncompleted subordinates
     3805                        remaining = arguments.length,
     3806
     3807                        // count of unprocessed arguments
     3808                        i = remaining,
     3809
     3810                        // subordinate fulfillment data
     3811                        resolveContexts = Array( i ),
     3812                        resolveValues = slice.call( arguments ),
     3813
     3814                        // the master Deferred
     3815                        master = jQuery.Deferred(),
     3816
     3817                        // subordinate callback factory
     3818                        updateFunc = function( i ) {
     3819                                return function( value ) {
     3820                                        resolveContexts[ i ] = this;
     3821                                        resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
     3822                                        if ( !( --remaining ) ) {
     3823                                                master.resolveWith( resolveContexts, resolveValues );
     3824                                        }
     3825                                };
     3826                        };
     3827
     3828                // Single- and empty arguments are adopted like Promise.resolve
     3829                if ( remaining <= 1 ) {
     3830                        adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
     3831                                !remaining );
     3832
     3833                        // Use .then() to unwrap secondary thenables (cf. gh-3000)
     3834                        if ( master.state() === "pending" ||
     3835                                jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
     3836
     3837                                return master.then();
     3838                        }
     3839                }
     3840
     3841                // Multiple arguments are aggregated like Promise.all array elements
     3842                while ( i-- ) {
     3843                        adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
     3844                }
     3845
     3846                return master.promise();
     3847        }
     3848} );
     3849
     3850
     3851// These usually indicate a programmer mistake during development,
     3852// warn about them ASAP rather than swallowing them by default.
     3853var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
     3854
     3855jQuery.Deferred.exceptionHook = function( error, stack ) {
     3856
     3857        // Support: IE 8 - 9 only
     3858        // Console exists when dev tools are open, which can happen at any time
     3859        if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
     3860                window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
     3861        }
     3862};
     3863
     3864
     3865
     3866
     3867jQuery.readyException = function( error ) {
     3868        window.setTimeout( function() {
     3869                throw error;
     3870        } );
     3871};
     3872
     3873
     3874
     3875
     3876// The deferred used on DOM ready
     3877var readyList = jQuery.Deferred();
     3878
     3879jQuery.fn.ready = function( fn ) {
     3880
     3881        readyList
     3882                .then( fn )
     3883
     3884                // Wrap jQuery.readyException in a function so that the lookup
     3885                // happens at the time of error handling instead of callback
     3886                // registration.
     3887                .catch( function( error ) {
     3888                        jQuery.readyException( error );
     3889                } );
     3890
     3891        return this;
     3892};
     3893
     3894jQuery.extend( {
     3895
     3896        // Is the DOM ready to be used? Set to true once it occurs.
     3897        isReady: false,
     3898
     3899        // A counter to track how many items to wait for before
     3900        // the ready event fires. See #6781
     3901        readyWait: 1,
     3902
     3903        // Handle when the DOM is ready
     3904        ready: function( wait ) {
     3905
     3906                // Abort if there are pending holds or we're already ready
     3907                if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
     3908                        return;
     3909                }
     3910
     3911                // Remember that the DOM is ready
     3912                jQuery.isReady = true;
     3913
     3914                // If a normal DOM Ready event fired, decrement, and wait if need be
     3915                if ( wait !== true && --jQuery.readyWait > 0 ) {
     3916                        return;
     3917                }
     3918
     3919                // If there are functions bound, to execute
     3920                readyList.resolveWith( document, [ jQuery ] );
     3921        }
     3922} );
     3923
     3924jQuery.ready.then = readyList.then;
     3925
     3926// The ready event handler and self cleanup method
     3927function completed() {
     3928        document.removeEventListener( "DOMContentLoaded", completed );
     3929        window.removeEventListener( "load", completed );
     3930        jQuery.ready();
     3931}
     3932
     3933// Catch cases where $(document).ready() is called
     3934// after the browser event has already occurred.
     3935// Support: IE <=9 - 10 only
     3936// Older IE sometimes signals "interactive" too soon
     3937if ( document.readyState === "complete" ||
     3938        ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
     3939
     3940        // Handle it asynchronously to allow scripts the opportunity to delay ready
     3941        window.setTimeout( jQuery.ready );
     3942
     3943} else {
     3944
     3945        // Use the handy event callback
     3946        document.addEventListener( "DOMContentLoaded", completed );
     3947
     3948        // A fallback to window.onload, that will always work
     3949        window.addEventListener( "load", completed );
     3950}
     3951
     3952
     3953
     3954
     3955// Multifunctional method to get and set values of a collection
     3956// The value/s can optionally be executed if it's a function
     3957var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
     3958        var i = 0,
     3959                len = elems.length,
     3960                bulk = key == null;
     3961
     3962        // Sets many values
     3963        if ( jQuery.type( key ) === "object" ) {
     3964                chainable = true;
     3965                for ( i in key ) {
     3966                        access( elems, fn, i, key[ i ], true, emptyGet, raw );
     3967                }
     3968
     3969        // Sets one value
     3970        } else if ( value !== undefined ) {
     3971                chainable = true;
     3972
     3973                if ( !jQuery.isFunction( value ) ) {
     3974                        raw = true;
     3975                }
     3976
     3977                if ( bulk ) {
     3978
     3979                        // Bulk operations run against the entire set
     3980                        if ( raw ) {
     3981                                fn.call( elems, value );
     3982                                fn = null;
     3983
     3984                        // ...except when executing function values
     3985                        } else {
     3986                                bulk = fn;
     3987                                fn = function( elem, key, value ) {
     3988                                        return bulk.call( jQuery( elem ), value );
     3989                                };
     3990                        }
     3991                }
     3992
     3993                if ( fn ) {
     3994                        for ( ; i < len; i++ ) {
     3995                                fn(
     3996                                        elems[ i ], key, raw ?
     3997                                        value :
     3998                                        value.call( elems[ i ], i, fn( elems[ i ], key ) )
     3999                                );
     4000                        }
     4001                }
     4002        }
     4003
     4004        if ( chainable ) {
     4005                return elems;
     4006        }
     4007
     4008        // Gets
     4009        if ( bulk ) {
     4010                return fn.call( elems );
     4011        }
     4012
     4013        return len ? fn( elems[ 0 ], key ) : emptyGet;
     4014};
     4015var acceptData = function( owner ) {
     4016
     4017        // Accepts only:
     4018        //  - Node
     4019        //    - Node.ELEMENT_NODE
     4020        //    - Node.DOCUMENT_NODE
     4021        //  - Object
     4022        //    - Any
     4023        return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
     4024};
     4025
     4026
     4027
     4028
     4029function Data() {
     4030        this.expando = jQuery.expando + Data.uid++;
     4031}
     4032
     4033Data.uid = 1;
     4034
     4035Data.prototype = {
     4036
     4037        cache: function( owner ) {
     4038
     4039                // Check if the owner object already has a cache
     4040                var value = owner[ this.expando ];
     4041
     4042                // If not, create one
     4043                if ( !value ) {
     4044                        value = {};
     4045
     4046                        // We can accept data for non-element nodes in modern browsers,
     4047                        // but we should not, see #8335.
     4048                        // Always return an empty object.
     4049                        if ( acceptData( owner ) ) {
     4050
     4051                                // If it is a node unlikely to be stringify-ed or looped over
     4052                                // use plain assignment
     4053                                if ( owner.nodeType ) {
     4054                                        owner[ this.expando ] = value;
     4055
     4056                                // Otherwise secure it in a non-enumerable property
     4057                                // configurable must be true to allow the property to be
     4058                                // deleted when data is removed
     4059                                } else {
     4060                                        Object.defineProperty( owner, this.expando, {
     4061                                                value: value,
     4062                                                configurable: true
     4063                                        } );
     4064                                }
     4065                        }
     4066                }
     4067
     4068                return value;
     4069        },
     4070        set: function( owner, data, value ) {
     4071                var prop,
     4072                        cache = this.cache( owner );
     4073
     4074                // Handle: [ owner, key, value ] args
     4075                // Always use camelCase key (gh-2257)
     4076                if ( typeof data === "string" ) {
     4077                        cache[ jQuery.camelCase( data ) ] = value;
     4078
     4079                // Handle: [ owner, { properties } ] args
     4080                } else {
     4081
     4082                        // Copy the properties one-by-one to the cache object
     4083                        for ( prop in data ) {
     4084                                cache[ jQuery.camelCase( prop ) ] = data[ prop ];
     4085                        }
     4086                }
     4087                return cache;
     4088        },
     4089        get: function( owner, key ) {
     4090                return key === undefined ?
     4091                        this.cache( owner ) :
     4092
     4093                        // Always use camelCase key (gh-2257)
     4094                        owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ];
     4095        },
     4096        access: function( owner, key, value ) {
     4097
     4098                // In cases where either:
     4099                //
     4100                //   1. No key was specified
     4101                //   2. A string key was specified, but no value provided
     4102                //
     4103                // Take the "read" path and allow the get method to determine
     4104                // which value to return, respectively either:
     4105                //
     4106                //   1. The entire cache object
     4107                //   2. The data stored at the key
     4108                //
     4109                if ( key === undefined ||
     4110                                ( ( key && typeof key === "string" ) && value === undefined ) ) {
     4111
     4112                        return this.get( owner, key );
     4113                }
     4114
     4115                // When the key is not a string, or both a key and value
     4116                // are specified, set or extend (existing objects) with either:
     4117                //
     4118                //   1. An object of properties
     4119                //   2. A key and value
     4120                //
     4121                this.set( owner, key, value );
     4122
     4123                // Since the "set" path can have two possible entry points
     4124                // return the expected data based on which path was taken[*]
     4125                return value !== undefined ? value : key;
     4126        },
     4127        remove: function( owner, key ) {
     4128                var i,
     4129                        cache = owner[ this.expando ];
     4130
     4131                if ( cache === undefined ) {
     4132                        return;
     4133                }
     4134
     4135                if ( key !== undefined ) {
     4136
     4137                        // Support array or space separated string of keys
     4138                        if ( Array.isArray( key ) ) {
     4139
     4140                                // If key is an array of keys...
     4141                                // We always set camelCase keys, so remove that.
     4142                                key = key.map( jQuery.camelCase );
     4143                        } else {
     4144                                key = jQuery.camelCase( key );
     4145
     4146                                // If a key with the spaces exists, use it.
     4147                                // Otherwise, create an array by matching non-whitespace
     4148                                key = key in cache ?
     4149                                        [ key ] :
     4150                                        ( key.match( rnothtmlwhite ) || [] );
     4151                        }
     4152
     4153                        i = key.length;
     4154
     4155                        while ( i-- ) {
     4156                                delete cache[ key[ i ] ];
     4157                        }
     4158                }
     4159
     4160                // Remove the expando if there's no more data
     4161                if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
     4162
     4163                        // Support: Chrome <=35 - 45
     4164                        // Webkit & Blink performance suffers when deleting properties
     4165                        // from DOM nodes, so set to undefined instead
     4166                        // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
     4167                        if ( owner.nodeType ) {
     4168                                owner[ this.expando ] = undefined;
     4169                        } else {
     4170                                delete owner[ this.expando ];
     4171                        }
     4172                }
     4173        },
     4174        hasData: function( owner ) {
     4175                var cache = owner[ this.expando ];
     4176                return cache !== undefined && !jQuery.isEmptyObject( cache );
     4177        }
     4178};
     4179var dataPriv = new Data();
     4180
     4181var dataUser = new Data();
     4182
     4183
     4184
     4185//      Implementation Summary
     4186//
     4187//      1. Enforce API surface and semantic compatibility with 1.9.x branch
     4188//      2. Improve the module's maintainability by reducing the storage
     4189//              paths to a single mechanism.
     4190//      3. Use the same single mechanism to support "private" and "user" data.
     4191//      4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
     4192//      5. Avoid exposing implementation details on user objects (eg. expando properties)
     4193//      6. Provide a clear path for implementation upgrade to WeakMap in 2014
     4194
     4195var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
     4196        rmultiDash = /[A-Z]/g;
     4197
     4198function getData( data ) {
     4199        if ( data === "true" ) {
     4200                return true;
     4201        }
     4202
     4203        if ( data === "false" ) {
     4204                return false;
     4205        }
     4206
     4207        if ( data === "null" ) {
     4208                return null;
     4209        }
     4210
     4211        // Only convert to a number if it doesn't change the string
     4212        if ( data === +data + "" ) {
     4213                return +data;
     4214        }
     4215
     4216        if ( rbrace.test( data ) ) {
     4217                return JSON.parse( data );
     4218        }
     4219
     4220        return data;
     4221}
     4222
     4223function dataAttr( elem, key, data ) {
     4224        var name;
     4225
     4226        // If nothing was found internally, try to fetch any
     4227        // data from the HTML5 data-* attribute
     4228        if ( data === undefined && elem.nodeType === 1 ) {
     4229                name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
     4230                data = elem.getAttribute( name );
     4231
     4232                if ( typeof data === "string" ) {
     4233                        try {
     4234                                data = getData( data );
     4235                        } catch ( e ) {}
     4236
     4237                        // Make sure we set the data so it isn't changed later
     4238                        dataUser.set( elem, key, data );
     4239                } else {
     4240                        data = undefined;
     4241                }
     4242        }
     4243        return data;
     4244}
     4245
     4246jQuery.extend( {
     4247        hasData: function( elem ) {
     4248                return dataUser.hasData( elem ) || dataPriv.hasData( elem );
     4249        },
     4250
     4251        data: function( elem, name, data ) {
     4252                return dataUser.access( elem, name, data );
     4253        },
     4254
     4255        removeData: function( elem, name ) {
     4256                dataUser.remove( elem, name );
     4257        },
     4258
     4259        // TODO: Now that all calls to _data and _removeData have been replaced
     4260        // with direct calls to dataPriv methods, these can be deprecated.
     4261        _data: function( elem, name, data ) {
     4262                return dataPriv.access( elem, name, data );
     4263        },
     4264
     4265        _removeData: function( elem, name ) {
     4266                dataPriv.remove( elem, name );
     4267        }
     4268} );
     4269
     4270jQuery.fn.extend( {
     4271        data: function( key, value ) {
     4272                var i, name, data,
     4273                        elem = this[ 0 ],
     4274                        attrs = elem && elem.attributes;
     4275
     4276                // Gets all values
     4277                if ( key === undefined ) {
     4278                        if ( this.length ) {
     4279                                data = dataUser.get( elem );
     4280
     4281                                if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
     4282                                        i = attrs.length;
     4283                                        while ( i-- ) {
     4284
     4285                                                // Support: IE 11 only
     4286                                                // The attrs elements can be null (#14894)
     4287                                                if ( attrs[ i ] ) {
     4288                                                        name = attrs[ i ].name;
     4289                                                        if ( name.indexOf( "data-" ) === 0 ) {
     4290                                                                name = jQuery.camelCase( name.slice( 5 ) );
     4291                                                                dataAttr( elem, name, data[ name ] );
     4292                                                        }
     4293                                                }
     4294                                        }
     4295                                        dataPriv.set( elem, "hasDataAttrs", true );
     4296                                }
     4297                        }
     4298
     4299                        return data;
     4300                }
     4301
     4302                // Sets multiple values
     4303                if ( typeof key === "object" ) {
     4304                        return this.each( function() {
     4305                                dataUser.set( this, key );
     4306                        } );
     4307                }
     4308
     4309                return access( this, function( value ) {
     4310                        var data;
     4311
     4312                        // The calling jQuery object (element matches) is not empty
     4313                        // (and therefore has an element appears at this[ 0 ]) and the
     4314                        // `value` parameter was not undefined. An empty jQuery object
     4315                        // will result in `undefined` for elem = this[ 0 ] which will
     4316                        // throw an exception if an attempt to read a data cache is made.
     4317                        if ( elem && value === undefined ) {
     4318
     4319                                // Attempt to get data from the cache
     4320                                // The key will always be camelCased in Data
     4321                                data = dataUser.get( elem, key );
     4322                                if ( data !== undefined ) {
     4323                                        return data;
     4324                                }
     4325
     4326                                // Attempt to "discover" the data in
     4327                                // HTML5 custom data-* attrs
     4328                                data = dataAttr( elem, key );
     4329                                if ( data !== undefined ) {
     4330                                        return data;
     4331                                }
     4332
     4333                                // We tried really hard, but the data doesn't exist.
     4334                                return;
     4335                        }
     4336
     4337                        // Set the data...
     4338                        this.each( function() {
     4339
     4340                                // We always store the camelCased key
     4341                                dataUser.set( this, key, value );
     4342                        } );
     4343                }, null, value, arguments.length > 1, null, true );
     4344        },
     4345
     4346        removeData: function( key ) {
     4347                return this.each( function() {
     4348                        dataUser.remove( this, key );
     4349                } );
     4350        }
     4351} );
     4352
     4353
     4354jQuery.extend( {
     4355        queue: function( elem, type, data ) {
     4356                var queue;
     4357
     4358                if ( elem ) {
     4359                        type = ( type || "fx" ) + "queue";
     4360                        queue = dataPriv.get( elem, type );
     4361
     4362                        // Speed up dequeue by getting out quickly if this is just a lookup
     4363                        if ( data ) {
     4364                                if ( !queue || Array.isArray( data ) ) {
     4365                                        queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
     4366                                } else {
     4367                                        queue.push( data );
     4368                                }
     4369                        }
     4370                        return queue || [];
     4371                }
     4372        },
     4373
     4374        dequeue: function( elem, type ) {
     4375                type = type || "fx";
     4376
     4377                var queue = jQuery.queue( elem, type ),
     4378                        startLength = queue.length,
     4379                        fn = queue.shift(),
     4380                        hooks = jQuery._queueHooks( elem, type ),
     4381                        next = function() {
     4382                                jQuery.dequeue( elem, type );
     4383                        };
     4384
     4385                // If the fx queue is dequeued, always remove the progress sentinel
     4386                if ( fn === "inprogress" ) {
     4387                        fn = queue.shift();
     4388                        startLength--;
     4389                }
     4390
     4391                if ( fn ) {
     4392
     4393                        // Add a progress sentinel to prevent the fx queue from being
     4394                        // automatically dequeued
     4395                        if ( type === "fx" ) {
     4396                                queue.unshift( "inprogress" );
     4397                        }
     4398
     4399                        // Clear up the last queue stop function
     4400                        delete hooks.stop;
     4401                        fn.call( elem, next, hooks );
     4402                }
     4403
     4404                if ( !startLength && hooks ) {
     4405                        hooks.empty.fire();
     4406                }
     4407        },
     4408
     4409        // Not public - generate a queueHooks object, or return the current one
     4410        _queueHooks: function( elem, type ) {
     4411                var key = type + "queueHooks";
     4412                return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
     4413                        empty: jQuery.Callbacks( "once memory" ).add( function() {
     4414                                dataPriv.remove( elem, [ type + "queue", key ] );
     4415                        } )
     4416                } );
     4417        }
     4418} );
     4419
     4420jQuery.fn.extend( {
     4421        queue: function( type, data ) {
     4422                var setter = 2;
     4423
     4424                if ( typeof type !== "string" ) {
     4425                        data = type;
     4426                        type = "fx";
     4427                        setter--;
     4428                }
     4429
     4430                if ( arguments.length < setter ) {
     4431                        return jQuery.queue( this[ 0 ], type );
     4432                }
     4433
     4434                return data === undefined ?
     4435                        this :
     4436                        this.each( function() {
     4437                                var queue = jQuery.queue( this, type, data );
     4438
     4439                                // Ensure a hooks for this queue
     4440                                jQuery._queueHooks( this, type );
     4441
     4442                                if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
     4443                                        jQuery.dequeue( this, type );
     4444                                }
     4445                        } );
     4446        },
     4447        dequeue: function( type ) {
     4448                return this.each( function() {
     4449                        jQuery.dequeue( this, type );
     4450                } );
     4451        },
     4452        clearQueue: function( type ) {
     4453                return this.queue( type || "fx", [] );
     4454        },
     4455
     4456        // Get a promise resolved when queues of a certain type
     4457        // are emptied (fx is the type by default)
     4458        promise: function( type, obj ) {
     4459                var tmp,
     4460                        count = 1,
     4461                        defer = jQuery.Deferred(),
     4462                        elements = this,
     4463                        i = this.length,
     4464                        resolve = function() {
     4465                                if ( !( --count ) ) {
     4466                                        defer.resolveWith( elements, [ elements ] );
     4467                                }
     4468                        };
     4469
     4470                if ( typeof type !== "string" ) {
     4471                        obj = type;
     4472                        type = undefined;
     4473                }
     4474                type = type || "fx";
     4475
     4476                while ( i-- ) {
     4477                        tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
     4478                        if ( tmp && tmp.empty ) {
     4479                                count++;
     4480                                tmp.empty.add( resolve );
     4481                        }
     4482                }
     4483                resolve();
     4484                return defer.promise( obj );
     4485        }
     4486} );
     4487var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
     4488
     4489var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
     4490
     4491
     4492var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
     4493
     4494var isHiddenWithinTree = function( elem, el ) {
     4495
     4496                // isHiddenWithinTree might be called from jQuery#filter function;
     4497                // in that case, element will be second argument
     4498                elem = el || elem;
     4499
     4500                // Inline style trumps all
     4501                return elem.style.display === "none" ||
     4502                        elem.style.display === "" &&
     4503
     4504                        // Otherwise, check computed style
     4505                        // Support: Firefox <=43 - 45
     4506                        // Disconnected elements can have computed display: none, so first confirm that elem is
     4507                        // in the document.
     4508                        jQuery.contains( elem.ownerDocument, elem ) &&
     4509
     4510                        jQuery.css( elem, "display" ) === "none";
     4511        };
     4512
     4513var swap = function( elem, options, callback, args ) {
     4514        var ret, name,
     4515                old = {};
     4516
     4517        // Remember the old values, and insert the new ones
     4518        for ( name in options ) {
     4519                old[ name ] = elem.style[ name ];
     4520                elem.style[ name ] = options[ name ];
     4521        }
     4522
     4523        ret = callback.apply( elem, args || [] );
     4524
     4525        // Revert the old values
     4526        for ( name in options ) {
     4527                elem.style[ name ] = old[ name ];
     4528        }
     4529
     4530        return ret;
     4531};
     4532
     4533
     4534
     4535
     4536function adjustCSS( elem, prop, valueParts, tween ) {
     4537        var adjusted,
     4538                scale = 1,
     4539                maxIterations = 20,
     4540                currentValue = tween ?
     4541                        function() {
     4542                                return tween.cur();
     4543                        } :
     4544                        function() {
     4545                                return jQuery.css( elem, prop, "" );
     4546                        },
     4547                initial = currentValue(),
     4548                unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
     4549
     4550                // Starting value computation is required for potential unit mismatches
     4551                initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
     4552                        rcssNum.exec( jQuery.css( elem, prop ) );
     4553
     4554        if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
     4555
     4556                // Trust units reported by jQuery.css
     4557                unit = unit || initialInUnit[ 3 ];
     4558
     4559                // Make sure we update the tween properties later on
     4560                valueParts = valueParts || [];
     4561
     4562                // Iteratively approximate from a nonzero starting point
     4563                initialInUnit = +initial || 1;
     4564
     4565                do {
     4566
     4567                        // If previous iteration zeroed out, double until we get *something*.
     4568                        // Use string for doubling so we don't accidentally see scale as unchanged below
     4569                        scale = scale || ".5";
     4570
     4571                        // Adjust and apply
     4572                        initialInUnit = initialInUnit / scale;
     4573                        jQuery.style( elem, prop, initialInUnit + unit );
     4574
     4575                // Update scale, tolerating zero or NaN from tween.cur()
     4576                // Break the loop if scale is unchanged or perfect, or if we've just had enough.
     4577                } while (
     4578                        scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
     4579                );
     4580        }
     4581
     4582        if ( valueParts ) {
     4583                initialInUnit = +initialInUnit || +initial || 0;
     4584
     4585                // Apply relative offset (+=/-=) if specified
     4586                adjusted = valueParts[ 1 ] ?
     4587                        initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
     4588                        +valueParts[ 2 ];
     4589                if ( tween ) {
     4590                        tween.unit = unit;
     4591                        tween.start = initialInUnit;
     4592                        tween.end = adjusted;
     4593                }
     4594        }
     4595        return adjusted;
     4596}
     4597
     4598
     4599var defaultDisplayMap = {};
     4600
     4601function getDefaultDisplay( elem ) {
     4602        var temp,
     4603                doc = elem.ownerDocument,
     4604                nodeName = elem.nodeName,
     4605                display = defaultDisplayMap[ nodeName ];
     4606
     4607        if ( display ) {
     4608                return display;
     4609        }
     4610
     4611        temp = doc.body.appendChild( doc.createElement( nodeName ) );
     4612        display = jQuery.css( temp, "display" );
     4613
     4614        temp.parentNode.removeChild( temp );
     4615
     4616        if ( display === "none" ) {
     4617                display = "block";
     4618        }
     4619        defaultDisplayMap[ nodeName ] = display;
     4620
     4621        return display;
     4622}
     4623
     4624function showHide( elements, show ) {
     4625        var display, elem,
     4626                values = [],
     4627                index = 0,
     4628                length = elements.length;
     4629
     4630        // Determine new display value for elements that need to change
     4631        for ( ; index < length; index++ ) {
     4632                elem = elements[ index ];
     4633                if ( !elem.style ) {
     4634                        continue;
     4635                }
     4636
     4637                display = elem.style.display;
     4638                if ( show ) {
     4639
     4640                        // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
     4641                        // check is required in this first loop unless we have a nonempty display value (either
     4642                        // inline or about-to-be-restored)
     4643                        if ( display === "none" ) {
     4644                                values[ index ] = dataPriv.get( elem, "display" ) || null;
     4645                                if ( !values[ index ] ) {
     4646                                        elem.style.display = "";
     4647                                }
     4648                        }
     4649                        if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
     4650                                values[ index ] = getDefaultDisplay( elem );
     4651                        }
     4652                } else {
     4653                        if ( display !== "none" ) {
     4654                                values[ index ] = "none";
     4655
     4656                                // Remember what we're overwriting
     4657                                dataPriv.set( elem, "display", display );
     4658                        }
     4659                }
     4660        }
     4661
     4662        // Set the display of the elements in a second loop to avoid constant reflow
     4663        for ( index = 0; index < length; index++ ) {
     4664                if ( values[ index ] != null ) {
     4665                        elements[ index ].style.display = values[ index ];
     4666                }
     4667        }
     4668
     4669        return elements;
     4670}
     4671
     4672jQuery.fn.extend( {
     4673        show: function() {
     4674                return showHide( this, true );
     4675        },
     4676        hide: function() {
     4677                return showHide( this );
     4678        },
     4679        toggle: function( state ) {
     4680                if ( typeof state === "boolean" ) {
     4681                        return state ? this.show() : this.hide();
     4682                }
     4683
     4684                return this.each( function() {
     4685                        if ( isHiddenWithinTree( this ) ) {
     4686                                jQuery( this ).show();
     4687                        } else {
     4688                                jQuery( this ).hide();
     4689                        }
     4690                } );
     4691        }
     4692} );
     4693var rcheckableType = ( /^(?:checkbox|radio)$/i );
     4694
     4695var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
     4696
     4697var rscriptType = ( /^$|\/(?:java|ecma)script/i );
     4698
     4699
     4700
     4701// We have to close these tags to support XHTML (#13200)
     4702var wrapMap = {
     4703
     4704        // Support: IE <=9 only
     4705        option: [ 1, "<select multiple='multiple'>", "</select>" ],
     4706
     4707        // XHTML parsers do not magically insert elements in the
     4708        // same way that tag soup parsers do. So we cannot shorten
     4709        // this by omitting <tbody> or other required elements.
     4710        thead: [ 1, "<table>", "</table>" ],
     4711        col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
     4712        tr: [ 2, "<table><tbody>", "</tbody></table>" ],
     4713        td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
     4714
     4715        _default: [ 0, "", "" ]
     4716};
     4717
     4718// Support: IE <=9 only
     4719wrapMap.optgroup = wrapMap.option;
     4720
     4721wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
     4722wrapMap.th = wrapMap.td;
     4723
     4724
     4725function getAll( context, tag ) {
     4726
     4727        // Support: IE <=9 - 11 only
     4728        // Use typeof to avoid zero-argument method invocation on host objects (#15151)
     4729        var ret;
     4730
     4731        if ( typeof context.getElementsByTagName !== "undefined" ) {
     4732                ret = context.getElementsByTagName( tag || "*" );
     4733
     4734        } else if ( typeof context.querySelectorAll !== "undefined" ) {
     4735                ret = context.querySelectorAll( tag || "*" );
     4736
     4737        } else {
     4738                ret = [];
     4739        }
     4740
     4741        if ( tag === undefined || tag && nodeName( context, tag ) ) {
     4742                return jQuery.merge( [ context ], ret );
     4743        }
     4744
     4745        return ret;
     4746}
     4747
     4748
     4749// Mark scripts as having already been evaluated
     4750function setGlobalEval( elems, refElements ) {
     4751        var i = 0,
     4752                l = elems.length;
     4753
     4754        for ( ; i < l; i++ ) {
     4755                dataPriv.set(
     4756                        elems[ i ],
     4757                        "globalEval",
     4758                        !refElements || dataPriv.get( refElements[ i ], "globalEval" )
     4759                );
     4760        }
     4761}
     4762
     4763
     4764var rhtml = /<|&#?\w+;/;
     4765
     4766function buildFragment( elems, context, scripts, selection, ignored ) {
     4767        var elem, tmp, tag, wrap, contains, j,
     4768                fragment = context.createDocumentFragment(),
     4769                nodes = [],
     4770                i = 0,
     4771                l = elems.length;
     4772
     4773        for ( ; i < l; i++ ) {
     4774                elem = elems[ i ];
     4775
     4776                if ( elem || elem === 0 ) {
     4777
     4778                        // Add nodes directly
     4779                        if ( jQuery.type( elem ) === "object" ) {
     4780
     4781                                // Support: Android <=4.0 only, PhantomJS 1 only
     4782                                // push.apply(_, arraylike) throws on ancient WebKit
     4783                                jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
     4784
     4785                        // Convert non-html into a text node
     4786                        } else if ( !rhtml.test( elem ) ) {
     4787                                nodes.push( context.createTextNode( elem ) );
     4788
     4789                        // Convert html into DOM nodes
     4790                        } else {
     4791                                tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
     4792
     4793                                // Deserialize a standard representation
     4794                                tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
     4795                                wrap = wrapMap[ tag ] || wrapMap._default;
     4796                                tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
     4797
     4798                                // Descend through wrappers to the right content
     4799                                j = wrap[ 0 ];
     4800                                while ( j-- ) {
     4801                                        tmp = tmp.lastChild;
     4802                                }
     4803
     4804                                // Support: Android <=4.0 only, PhantomJS 1 only
     4805                                // push.apply(_, arraylike) throws on ancient WebKit
     4806                                jQuery.merge( nodes, tmp.childNodes );
     4807
     4808                                // Remember the top-level container
     4809                                tmp = fragment.firstChild;
     4810
     4811                                // Ensure the created nodes are orphaned (#12392)
     4812                                tmp.textContent = "";
     4813                        }
     4814                }
     4815        }
     4816
     4817        // Remove wrapper from fragment
     4818        fragment.textContent = "";
     4819
     4820        i = 0;
     4821        while ( ( elem = nodes[ i++ ] ) ) {
     4822
     4823                // Skip elements already in the context collection (trac-4087)
     4824                if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
     4825                        if ( ignored ) {
     4826                                ignored.push( elem );
     4827                        }
     4828                        continue;
     4829                }
     4830
     4831                contains = jQuery.contains( elem.ownerDocument, elem );
     4832
     4833                // Append to fragment
     4834                tmp = getAll( fragment.appendChild( elem ), "script" );
     4835
     4836                // Preserve script evaluation history
     4837                if ( contains ) {
     4838                        setGlobalEval( tmp );
     4839                }
     4840
     4841                // Capture executables
     4842                if ( scripts ) {
     4843                        j = 0;
     4844                        while ( ( elem = tmp[ j++ ] ) ) {
     4845                                if ( rscriptType.test( elem.type || "" ) ) {
     4846                                        scripts.push( elem );
     4847                                }
     4848                        }
     4849                }
     4850        }
     4851
     4852        return fragment;
     4853}
     4854
     4855
     4856( function() {
     4857        var fragment = document.createDocumentFragment(),
     4858                div = fragment.appendChild( document.createElement( "div" ) ),
     4859                input = document.createElement( "input" );
     4860
     4861        // Support: Android 4.0 - 4.3 only
     4862        // Check state lost if the name is set (#11217)
     4863        // Support: Windows Web Apps (WWA)
     4864        // `name` and `type` must use .setAttribute for WWA (#14901)
     4865        input.setAttribute( "type", "radio" );
     4866        input.setAttribute( "checked", "checked" );
     4867        input.setAttribute( "name", "t" );
     4868
     4869        div.appendChild( input );
     4870
     4871        // Support: Android <=4.1 only
     4872        // Older WebKit doesn't clone checked state correctly in fragments
     4873        support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
     4874
     4875        // Support: IE <=11 only
     4876        // Make sure textarea (and checkbox) defaultValue is properly cloned
     4877        div.innerHTML = "<textarea>x</textarea>";
     4878        support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
     4879} )();
     4880var documentElement = document.documentElement;
     4881
     4882
     4883
     4884var
     4885        rkeyEvent = /^key/,
     4886        rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
     4887        rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
     4888
     4889function returnTrue() {
     4890        return true;
     4891}
     4892
     4893function returnFalse() {
     4894        return false;
     4895}
     4896
     4897// Support: IE <=9 only
     4898// See #13393 for more info
     4899function safeActiveElement() {
     4900        try {
     4901                return document.activeElement;
     4902        } catch ( err ) { }
     4903}
     4904
     4905function on( elem, types, selector, data, fn, one ) {
     4906        var origFn, type;
     4907
     4908        // Types can be a map of types/handlers
     4909        if ( typeof types === "object" ) {
     4910
     4911                // ( types-Object, selector, data )
     4912                if ( typeof selector !== "string" ) {
     4913
     4914                        // ( types-Object, data )
     4915                        data = data || selector;
     4916                        selector = undefined;
     4917                }
     4918                for ( type in types ) {
     4919                        on( elem, type, selector, data, types[ type ], one );
     4920                }
     4921                return elem;
     4922        }
     4923
     4924        if ( data == null && fn == null ) {
     4925
     4926                // ( types, fn )
     4927                fn = selector;
     4928                data = selector = undefined;
     4929        } else if ( fn == null ) {
     4930                if ( typeof selector === "string" ) {
     4931
     4932                        // ( types, selector, fn )
     4933                        fn = data;
     4934                        data = undefined;
     4935                } else {
     4936
     4937                        // ( types, data, fn )
     4938                        fn = data;
     4939                        data = selector;
     4940                        selector = undefined;
     4941                }
     4942        }
     4943        if ( fn === false ) {
     4944                fn = returnFalse;
     4945        } else if ( !fn ) {
     4946                return elem;
     4947        }
     4948
     4949        if ( one === 1 ) {
     4950                origFn = fn;
     4951                fn = function( event ) {
     4952
     4953                        // Can use an empty set, since event contains the info
     4954                        jQuery().off( event );
     4955                        return origFn.apply( this, arguments );
     4956                };
     4957
     4958                // Use same guid so caller can remove using origFn
     4959                fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
     4960        }
     4961        return elem.each( function() {
     4962                jQuery.event.add( this, types, fn, data, selector );
     4963        } );
     4964}
     4965
     4966/*
     4967 * Helper functions for managing events -- not part of the public interface.
     4968 * Props to Dean Edwards' addEvent library for many of the ideas.
     4969 */
     4970jQuery.event = {
     4971
     4972        global: {},
     4973
     4974        add: function( elem, types, handler, data, selector ) {
     4975
     4976                var handleObjIn, eventHandle, tmp,
     4977                        events, t, handleObj,
     4978                        special, handlers, type, namespaces, origType,
     4979                        elemData = dataPriv.get( elem );
     4980
     4981                // Don't attach events to noData or text/comment nodes (but allow plain objects)
     4982                if ( !elemData ) {
     4983                        return;
     4984                }
     4985
     4986                // Caller can pass in an object of custom data in lieu of the handler
     4987                if ( handler.handler ) {
     4988                        handleObjIn = handler;
     4989                        handler = handleObjIn.handler;
     4990                        selector = handleObjIn.selector;
     4991                }
     4992
     4993                // Ensure that invalid selectors throw exceptions at attach time
     4994                // Evaluate against documentElement in case elem is a non-element node (e.g., document)
     4995                if ( selector ) {
     4996                        jQuery.find.matchesSelector( documentElement, selector );
     4997                }
     4998
     4999                // Make sure that the handler has a unique ID, used to find/remove it later
     5000                if ( !handler.guid ) {
     5001                        handler.guid = jQuery.guid++;
     5002                }
     5003
     5004                // Init the element's event structure and main handler, if this is the first
     5005                if ( !( events = elemData.events ) ) {
     5006                        events = elemData.events = {};
     5007                }
     5008                if ( !( eventHandle = elemData.handle ) ) {
     5009                        eventHandle = elemData.handle = function( e ) {
     5010
     5011                                // Discard the second event of a jQuery.event.trigger() and
     5012                                // when an event is called after a page has unloaded
     5013                                return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
     5014                                        jQuery.event.dispatch.apply( elem, arguments ) : undefined;
     5015                        };
     5016                }
     5017
     5018                // Handle multiple events separated by a space
     5019                types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
     5020                t = types.length;
     5021                while ( t-- ) {
     5022                        tmp = rtypenamespace.exec( types[ t ] ) || [];
     5023                        type = origType = tmp[ 1 ];
     5024                        namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
     5025
     5026                        // There *must* be a type, no attaching namespace-only handlers
     5027                        if ( !type ) {
     5028                                continue;
     5029                        }
     5030
     5031                        // If event changes its type, use the special event handlers for the changed type
     5032                        special = jQuery.event.special[ type ] || {};
     5033
     5034                        // If selector defined, determine special event api type, otherwise given type
     5035                        type = ( selector ? special.delegateType : special.bindType ) || type;
     5036
     5037                        // Update special based on newly reset type
     5038                        special = jQuery.event.special[ type ] || {};
     5039
     5040                        // handleObj is passed to all event handlers
     5041                        handleObj = jQuery.extend( {
     5042                                type: type,
     5043                                origType: origType,
     5044                                data: data,
     5045                                handler: handler,
     5046                                guid: handler.guid,
     5047                                selector: selector,
     5048                                needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
     5049                                namespace: namespaces.join( "." )
     5050                        }, handleObjIn );
     5051
     5052                        // Init the event handler queue if we're the first
     5053                        if ( !( handlers = events[ type ] ) ) {
     5054                                handlers = events[ type ] = [];
     5055                                handlers.delegateCount = 0;
     5056
     5057                                // Only use addEventListener if the special events handler returns false
     5058                                if ( !special.setup ||
     5059                                        special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
     5060
     5061                                        if ( elem.addEventListener ) {
     5062                                                elem.addEventListener( type, eventHandle );
     5063                                        }
     5064                                }
     5065                        }
     5066
     5067                        if ( special.add ) {
     5068                                special.add.call( elem, handleObj );
     5069
     5070                                if ( !handleObj.handler.guid ) {
     5071                                        handleObj.handler.guid = handler.guid;
     5072                                }
     5073                        }
     5074
     5075                        // Add to the element's handler list, delegates in front
     5076                        if ( selector ) {
     5077                                handlers.splice( handlers.delegateCount++, 0, handleObj );
     5078                        } else {
     5079                                handlers.push( handleObj );
     5080                        }
     5081
     5082                        // Keep track of which events have ever been used, for event optimization
     5083                        jQuery.event.global[ type ] = true;
     5084                }
     5085
     5086        },
     5087
     5088        // Detach an event or set of events from an element
     5089        remove: function( elem, types, handler, selector, mappedTypes ) {
     5090
     5091                var j, origCount, tmp,
     5092                        events, t, handleObj,
     5093                        special, handlers, type, namespaces, origType,
     5094                        elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
     5095
     5096                if ( !elemData || !( events = elemData.events ) ) {
     5097                        return;
     5098                }
     5099
     5100                // Once for each type.namespace in types; type may be omitted
     5101                types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
     5102                t = types.length;
     5103                while ( t-- ) {
     5104                        tmp = rtypenamespace.exec( types[ t ] ) || [];
     5105                        type = origType = tmp[ 1 ];
     5106                        namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
     5107
     5108                        // Unbind all events (on this namespace, if provided) for the element
     5109                        if ( !type ) {
     5110                                for ( type in events ) {
     5111                                        jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
     5112                                }
     5113                                continue;
     5114                        }
     5115
     5116                        special = jQuery.event.special[ type ] || {};
     5117                        type = ( selector ? special.delegateType : special.bindType ) || type;
     5118                        handlers = events[ type ] || [];
     5119                        tmp = tmp[ 2 ] &&
     5120                                new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
     5121
     5122                        // Remove matching events
     5123                        origCount = j = handlers.length;
     5124                        while ( j-- ) {
     5125                                handleObj = handlers[ j ];
     5126
     5127                                if ( ( mappedTypes || origType === handleObj.origType ) &&
     5128                                        ( !handler || handler.guid === handleObj.guid ) &&
     5129                                        ( !tmp || tmp.test( handleObj.namespace ) ) &&
     5130                                        ( !selector || selector === handleObj.selector ||
     5131                                                selector === "**" && handleObj.selector ) ) {
     5132                                        handlers.splice( j, 1 );
     5133
     5134                                        if ( handleObj.selector ) {
     5135                                                handlers.delegateCount--;
     5136                                        }
     5137                                        if ( special.remove ) {
     5138                                                special.remove.call( elem, handleObj );
     5139                                        }
     5140                                }
     5141                        }
     5142
     5143                        // Remove generic event handler if we removed something and no more handlers exist
     5144                        // (avoids potential for endless recursion during removal of special event handlers)
     5145                        if ( origCount && !handlers.length ) {
     5146                                if ( !special.teardown ||
     5147                                        special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
     5148
     5149                                        jQuery.removeEvent( elem, type, elemData.handle );
     5150                                }
     5151
     5152                                delete events[ type ];
     5153                        }
     5154                }
     5155
     5156                // Remove data and the expando if it's no longer used
     5157                if ( jQuery.isEmptyObject( events ) ) {
     5158                        dataPriv.remove( elem, "handle events" );
     5159                }
     5160        },
     5161
     5162        dispatch: function( nativeEvent ) {
     5163
     5164                // Make a writable jQuery.Event from the native event object
     5165                var event = jQuery.event.fix( nativeEvent );
     5166
     5167                var i, j, ret, matched, handleObj, handlerQueue,
     5168                        args = new Array( arguments.length ),
     5169                        handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
     5170                        special = jQuery.event.special[ event.type ] || {};
     5171
     5172                // Use the fix-ed jQuery.Event rather than the (read-only) native event
     5173                args[ 0 ] = event;
     5174
     5175                for ( i = 1; i < arguments.length; i++ ) {
     5176                        args[ i ] = arguments[ i ];
     5177                }
     5178
     5179                event.delegateTarget = this;
     5180
     5181                // Call the preDispatch hook for the mapped type, and let it bail if desired
     5182                if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
     5183                        return;
     5184                }
     5185
     5186                // Determine handlers
     5187                handlerQueue = jQuery.event.handlers.call( this, event, handlers );
     5188
     5189                // Run delegates first; they may want to stop propagation beneath us
     5190                i = 0;
     5191                while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
     5192                        event.currentTarget = matched.elem;
     5193
     5194                        j = 0;
     5195                        while ( ( handleObj = matched.handlers[ j++ ] ) &&
     5196                                !event.isImmediatePropagationStopped() ) {
     5197
     5198                                // Triggered event must either 1) have no namespace, or 2) have namespace(s)
     5199                                // a subset or equal to those in the bound event (both can have no namespace).
     5200                                if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
     5201
     5202                                        event.handleObj = handleObj;
     5203                                        event.data = handleObj.data;
     5204
     5205                                        ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
     5206                                                handleObj.handler ).apply( matched.elem, args );
     5207
     5208                                        if ( ret !== undefined ) {
     5209                                                if ( ( event.result = ret ) === false ) {
     5210                                                        event.preventDefault();
     5211                                                        event.stopPropagation();
     5212                                                }
     5213                                        }
     5214                                }
     5215                        }
     5216                }
     5217
     5218                // Call the postDispatch hook for the mapped type
     5219                if ( special.postDispatch ) {
     5220                        special.postDispatch.call( this, event );
     5221                }
     5222
     5223                return event.result;
     5224        },
     5225
     5226        handlers: function( event, handlers ) {
     5227                var i, handleObj, sel, matchedHandlers, matchedSelectors,
     5228                        handlerQueue = [],
     5229                        delegateCount = handlers.delegateCount,
     5230                        cur = event.target;
     5231
     5232                // Find delegate handlers
     5233                if ( delegateCount &&
     5234
     5235                        // Support: IE <=9
     5236                        // Black-hole SVG <use> instance trees (trac-13180)
     5237                        cur.nodeType &&
     5238
     5239                        // Support: Firefox <=42
     5240                        // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
     5241                        // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
     5242                        // Support: IE 11 only
     5243                        // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
     5244                        !( event.type === "click" && event.button >= 1 ) ) {
     5245
     5246                        for ( ; cur !== this; cur = cur.parentNode || this ) {
     5247
     5248                                // Don't check non-elements (#13208)
     5249                                // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
     5250                                if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
     5251                                        matchedHandlers = [];
     5252                                        matchedSelectors = {};
     5253                                        for ( i = 0; i < delegateCount; i++ ) {
     5254                                                handleObj = handlers[ i ];
     5255
     5256                                                // Don't conflict with Object.prototype properties (#13203)
     5257                                                sel = handleObj.selector + " ";
     5258
     5259                                                if ( matchedSelectors[ sel ] === undefined ) {
     5260                                                        matchedSelectors[ sel ] = handleObj.needsContext ?
     5261                                                                jQuery( sel, this ).index( cur ) > -1 :
     5262                                                                jQuery.find( sel, this, null, [ cur ] ).length;
     5263                                                }
     5264                                                if ( matchedSelectors[ sel ] ) {
     5265                                                        matchedHandlers.push( handleObj );
     5266                                                }
     5267                                        }
     5268                                        if ( matchedHandlers.length ) {
     5269                                                handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
     5270                                        }
     5271                                }
     5272                        }
     5273                }
     5274
     5275                // Add the remaining (directly-bound) handlers
     5276                cur = this;
     5277                if ( delegateCount < handlers.length ) {
     5278                        handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
     5279                }
     5280
     5281                return handlerQueue;
     5282        },
     5283
     5284        addProp: function( name, hook ) {
     5285                Object.defineProperty( jQuery.Event.prototype, name, {
     5286                        enumerable: true,
     5287                        configurable: true,
     5288
     5289                        get: jQuery.isFunction( hook ) ?
     5290                                function() {
     5291                                        if ( this.originalEvent ) {
     5292                                                        return hook( this.originalEvent );
     5293                                        }
     5294                                } :
     5295                                function() {
     5296                                        if ( this.originalEvent ) {
     5297                                                        return this.originalEvent[ name ];
     5298                                        }
     5299                                },
     5300
     5301                        set: function( value ) {
     5302                                Object.defineProperty( this, name, {
     5303                                        enumerable: true,
     5304                                        configurable: true,
     5305                                        writable: true,
     5306                                        value: value
     5307                                } );
     5308                        }
     5309                } );
     5310        },
     5311
     5312        fix: function( originalEvent ) {
     5313                return originalEvent[ jQuery.expando ] ?
     5314                        originalEvent :
     5315                        new jQuery.Event( originalEvent );
     5316        },
     5317
     5318        special: {
     5319                load: {
     5320
     5321                        // Prevent triggered image.load events from bubbling to window.load
     5322                        noBubble: true
     5323                },
     5324                focus: {
     5325
     5326                        // Fire native event if possible so blur/focus sequence is correct
     5327                        trigger: function() {
     5328                                if ( this !== safeActiveElement() && this.focus ) {
     5329                                        this.focus();
     5330                                        return false;
     5331                                }
     5332                        },
     5333                        delegateType: "focusin"
     5334                },
     5335                blur: {
     5336                        trigger: function() {
     5337                                if ( this === safeActiveElement() && this.blur ) {
     5338                                        this.blur();
     5339                                        return false;
     5340                                }
     5341                        },
     5342                        delegateType: "focusout"
     5343                },
     5344                click: {
     5345
     5346                        // For checkbox, fire native event so checked state will be right
     5347                        trigger: function() {
     5348                                if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
     5349                                        this.click();
     5350                                        return false;
     5351                                }
     5352                        },
     5353
     5354                        // For cross-browser consistency, don't fire native .click() on links
     5355                        _default: function( event ) {
     5356                                return nodeName( event.target, "a" );
     5357                        }
     5358                },
     5359
     5360                beforeunload: {
     5361                        postDispatch: function( event ) {
     5362
     5363                                // Support: Firefox 20+
     5364                                // Firefox doesn't alert if the returnValue field is not set.
     5365                                if ( event.result !== undefined && event.originalEvent ) {
     5366                                        event.originalEvent.returnValue = event.result;
     5367                                }
     5368                        }
     5369                }
     5370        }
     5371};
     5372
     5373jQuery.removeEvent = function( elem, type, handle ) {
     5374
     5375        // This "if" is needed for plain objects
     5376        if ( elem.removeEventListener ) {
     5377                elem.removeEventListener( type, handle );
     5378        }
     5379};
     5380
     5381jQuery.Event = function( src, props ) {
     5382
     5383        // Allow instantiation without the 'new' keyword
     5384        if ( !( this instanceof jQuery.Event ) ) {
     5385                return new jQuery.Event( src, props );
     5386        }
     5387
     5388        // Event object
     5389        if ( src && src.type ) {
     5390                this.originalEvent = src;
     5391                this.type = src.type;
     5392
     5393                // Events bubbling up the document may have been marked as prevented
     5394                // by a handler lower down the tree; reflect the correct value.
     5395                this.isDefaultPrevented = src.defaultPrevented ||
     5396                                src.defaultPrevented === undefined &&
     5397
     5398                                // Support: Android <=2.3 only
     5399                                src.returnValue === false ?
     5400                        returnTrue :
     5401                        returnFalse;
     5402
     5403                // Create target properties
     5404                // Support: Safari <=6 - 7 only
     5405                // Target should not be a text node (#504, #13143)
     5406                this.target = ( src.target && src.target.nodeType === 3 ) ?
     5407                        src.target.parentNode :
     5408                        src.target;
     5409
     5410                this.currentTarget = src.currentTarget;
     5411                this.relatedTarget = src.relatedTarget;
     5412
     5413        // Event type
     5414        } else {
     5415                this.type = src;
     5416        }
     5417
     5418        // Put explicitly provided properties onto the event object
     5419        if ( props ) {
     5420                jQuery.extend( this, props );
     5421        }
     5422
     5423        // Create a timestamp if incoming event doesn't have one
     5424        this.timeStamp = src && src.timeStamp || jQuery.now();
     5425
     5426        // Mark it as fixed
     5427        this[ jQuery.expando ] = true;
     5428};
     5429
     5430// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
     5431// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
     5432jQuery.Event.prototype = {
     5433        constructor: jQuery.Event,
     5434        isDefaultPrevented: returnFalse,
     5435        isPropagationStopped: returnFalse,
     5436        isImmediatePropagationStopped: returnFalse,
     5437        isSimulated: false,
     5438
     5439        preventDefault: function() {
     5440                var e = this.originalEvent;
     5441
     5442                this.isDefaultPrevented = returnTrue;
     5443
     5444                if ( e && !this.isSimulated ) {
     5445                        e.preventDefault();
     5446                }
     5447        },
     5448        stopPropagation: function() {
     5449                var e = this.originalEvent;
     5450
     5451                this.isPropagationStopped = returnTrue;
     5452
     5453                if ( e && !this.isSimulated ) {
     5454                        e.stopPropagation();
     5455                }
     5456        },
     5457        stopImmediatePropagation: function() {
     5458                var e = this.originalEvent;
     5459
     5460                this.isImmediatePropagationStopped = returnTrue;
     5461
     5462                if ( e && !this.isSimulated ) {
     5463                        e.stopImmediatePropagation();
     5464                }
     5465
     5466                this.stopPropagation();
     5467        }
     5468};
     5469
     5470// Includes all common event props including KeyEvent and MouseEvent specific props
     5471jQuery.each( {
     5472        altKey: true,
     5473        bubbles: true,
     5474        cancelable: true,
     5475        changedTouches: true,
     5476        ctrlKey: true,
     5477        detail: true,
     5478        eventPhase: true,
     5479        metaKey: true,
     5480        pageX: true,
     5481        pageY: true,
     5482        shiftKey: true,
     5483        view: true,
     5484        "char": true,
     5485        charCode: true,
     5486        key: true,
     5487        keyCode: true,
     5488        button: true,
     5489        buttons: true,
     5490        clientX: true,
     5491        clientY: true,
     5492        offsetX: true,
     5493        offsetY: true,
     5494        pointerId: true,
     5495        pointerType: true,
     5496        screenX: true,
     5497        screenY: true,
     5498        targetTouches: true,
     5499        toElement: true,
     5500        touches: true,
     5501
     5502        which: function( event ) {
     5503                var button = event.button;
     5504
     5505                // Add which for key events
     5506                if ( event.which == null && rkeyEvent.test( event.type ) ) {
     5507                        return event.charCode != null ? event.charCode : event.keyCode;
     5508                }
     5509
     5510                // Add which for click: 1 === left; 2 === middle; 3 === right
     5511                if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
     5512                        if ( button & 1 ) {
     5513                                return 1;
     5514                        }
     5515
     5516                        if ( button & 2 ) {
     5517                                return 3;
     5518                        }
     5519
     5520                        if ( button & 4 ) {
     5521                                return 2;
     5522                        }
     5523
     5524                        return 0;
     5525                }
     5526
     5527                return event.which;
     5528        }
     5529}, jQuery.event.addProp );
     5530
     5531// Create mouseenter/leave events using mouseover/out and event-time checks
     5532// so that event delegation works in jQuery.
     5533// Do the same for pointerenter/pointerleave and pointerover/pointerout
     5534//
     5535// Support: Safari 7 only
     5536// Safari sends mouseenter too often; see:
     5537// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
     5538// for the description of the bug (it existed in older Chrome versions as well).
     5539jQuery.each( {
     5540        mouseenter: "mouseover",
     5541        mouseleave: "mouseout",
     5542        pointerenter: "pointerover",
     5543        pointerleave: "pointerout"
     5544}, function( orig, fix ) {
     5545        jQuery.event.special[ orig ] = {
     5546                delegateType: fix,
     5547                bindType: fix,
     5548
     5549                handle: function( event ) {
     5550                        var ret,
     5551                                target = this,
     5552                                related = event.relatedTarget,
     5553                                handleObj = event.handleObj;
     5554
     5555                        // For mouseenter/leave call the handler if related is outside the target.
     5556                        // NB: No relatedTarget if the mouse left/entered the browser window
     5557                        if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
     5558                                event.type = handleObj.origType;
     5559                                ret = handleObj.handler.apply( this, arguments );
     5560                                event.type = fix;
     5561                        }
     5562                        return ret;
     5563                }
     5564        };
     5565} );
     5566
     5567jQuery.fn.extend( {
     5568
     5569        on: function( types, selector, data, fn ) {
     5570                return on( this, types, selector, data, fn );
     5571        },
     5572        one: function( types, selector, data, fn ) {
     5573                return on( this, types, selector, data, fn, 1 );
     5574        },
     5575        off: function( types, selector, fn ) {
     5576                var handleObj, type;
     5577                if ( types && types.preventDefault && types.handleObj ) {
     5578
     5579                        // ( event )  dispatched jQuery.Event
     5580                        handleObj = types.handleObj;
     5581                        jQuery( types.delegateTarget ).off(
     5582                                handleObj.namespace ?
     5583                                        handleObj.origType + "." + handleObj.namespace :
     5584                                        handleObj.origType,
     5585                                handleObj.selector,
     5586                                handleObj.handler
     5587                        );
     5588                        return this;
     5589                }
     5590                if ( typeof types === "object" ) {
     5591
     5592                        // ( types-object [, selector] )
     5593                        for ( type in types ) {
     5594                                this.off( type, selector, types[ type ] );
     5595                        }
     5596                        return this;
     5597                }
     5598                if ( selector === false || typeof selector === "function" ) {
     5599
     5600                        // ( types [, fn] )
     5601                        fn = selector;
     5602                        selector = undefined;
     5603                }
     5604                if ( fn === false ) {
     5605                        fn = returnFalse;
     5606                }
     5607                return this.each( function() {
     5608                        jQuery.event.remove( this, types, fn, selector );
     5609                } );
     5610        }
     5611} );
     5612
     5613
     5614var
     5615
     5616        /* eslint-disable max-len */
     5617
     5618        // See https://github.com/eslint/eslint/issues/3229
     5619        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
     5620
     5621        /* eslint-enable */
     5622
     5623        // Support: IE <=10 - 11, Edge 12 - 13
     5624        // In IE/Edge using regex groups here causes severe slowdowns.
     5625        // See https://connect.microsoft.com/IE/feedback/details/1736512/
     5626        rnoInnerhtml = /<script|<style|<link/i,
     5627
     5628        // checked="checked" or checked
     5629        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
     5630        rscriptTypeMasked = /^true\/(.*)/,
     5631        rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
     5632
     5633// Prefer a tbody over its parent table for containing new rows
     5634function manipulationTarget( elem, content ) {
     5635        if ( nodeName( elem, "table" ) &&
     5636                nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
     5637
     5638                return jQuery( ">tbody", elem )[ 0 ] || elem;
     5639        }
     5640
     5641        return elem;
     5642}
     5643
     5644// Replace/restore the type attribute of script elements for safe DOM manipulation
     5645function disableScript( elem ) {
     5646        elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
     5647        return elem;
     5648}
     5649function restoreScript( elem ) {
     5650        var match = rscriptTypeMasked.exec( elem.type );
     5651
     5652        if ( match ) {
     5653                elem.type = match[ 1 ];
     5654        } else {
     5655                elem.removeAttribute( "type" );
     5656        }
     5657
     5658        return elem;
     5659}
     5660
     5661function cloneCopyEvent( src, dest ) {
     5662        var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
     5663
     5664        if ( dest.nodeType !== 1 ) {
     5665                return;
     5666        }
     5667
     5668        // 1. Copy private data: events, handlers, etc.
     5669        if ( dataPriv.hasData( src ) ) {
     5670                pdataOld = dataPriv.access( src );
     5671                pdataCur = dataPriv.set( dest, pdataOld );
     5672                events = pdataOld.events;
     5673
     5674                if ( events ) {
     5675                        delete pdataCur.handle;
     5676                        pdataCur.events = {};
     5677
     5678                        for ( type in events ) {
     5679                                for ( i = 0, l = events[ type ].length; i < l; i++ ) {
     5680                                        jQuery.event.add( dest, type, events[ type ][ i ] );
     5681                                }
     5682                        }
     5683                }
     5684        }
     5685
     5686        // 2. Copy user data
     5687        if ( dataUser.hasData( src ) ) {
     5688                udataOld = dataUser.access( src );
     5689                udataCur = jQuery.extend( {}, udataOld );
     5690
     5691                dataUser.set( dest, udataCur );
     5692        }
     5693}
     5694
     5695// Fix IE bugs, see support tests
     5696function fixInput( src, dest ) {
     5697        var nodeName = dest.nodeName.toLowerCase();
     5698
     5699        // Fails to persist the checked state of a cloned checkbox or radio button.
     5700        if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
     5701                dest.checked = src.checked;
     5702
     5703        // Fails to return the selected option to the default selected state when cloning options
     5704        } else if ( nodeName === "input" || nodeName === "textarea" ) {
     5705                dest.defaultValue = src.defaultValue;
     5706        }
     5707}
     5708
     5709function domManip( collection, args, callback, ignored ) {
     5710
     5711        // Flatten any nested arrays
     5712        args = concat.apply( [], args );
     5713
     5714        var fragment, first, scripts, hasScripts, node, doc,
     5715                i = 0,
     5716                l = collection.length,
     5717                iNoClone = l - 1,
     5718                value = args[ 0 ],
     5719                isFunction = jQuery.isFunction( value );
     5720
     5721        // We can't cloneNode fragments that contain checked, in WebKit
     5722        if ( isFunction ||
     5723                        ( l > 1 && typeof value === "string" &&
     5724                                !support.checkClone && rchecked.test( value ) ) ) {
     5725                return collection.each( function( index ) {
     5726                        var self = collection.eq( index );
     5727                        if ( isFunction ) {
     5728                                args[ 0 ] = value.call( this, index, self.html() );
     5729                        }
     5730                        domManip( self, args, callback, ignored );
     5731                } );
     5732        }
     5733
     5734        if ( l ) {
     5735                fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
     5736                first = fragment.firstChild;
     5737
     5738                if ( fragment.childNodes.length === 1 ) {
     5739                        fragment = first;
     5740                }
     5741
     5742                // Require either new content or an interest in ignored elements to invoke the callback
     5743                if ( first || ignored ) {
     5744                        scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
     5745                        hasScripts = scripts.length;
     5746
     5747                        // Use the original fragment for the last item
     5748                        // instead of the first because it can end up
     5749                        // being emptied incorrectly in certain situations (#8070).
     5750                        for ( ; i < l; i++ ) {
     5751                                node = fragment;
     5752
     5753                                if ( i !== iNoClone ) {
     5754                                        node = jQuery.clone( node, true, true );
     5755
     5756                                        // Keep references to cloned scripts for later restoration
     5757                                        if ( hasScripts ) {
     5758
     5759                                                // Support: Android <=4.0 only, PhantomJS 1 only
     5760                                                // push.apply(_, arraylike) throws on ancient WebKit
     5761                                                jQuery.merge( scripts, getAll( node, "script" ) );
     5762                                        }
     5763                                }
     5764
     5765                                callback.call( collection[ i ], node, i );
     5766                        }
     5767
     5768                        if ( hasScripts ) {
     5769                                doc = scripts[ scripts.length - 1 ].ownerDocument;
     5770
     5771                                // Reenable scripts
     5772                                jQuery.map( scripts, restoreScript );
     5773
     5774                                // Evaluate executable scripts on first document insertion
     5775                                for ( i = 0; i < hasScripts; i++ ) {
     5776                                        node = scripts[ i ];
     5777                                        if ( rscriptType.test( node.type || "" ) &&
     5778                                                !dataPriv.access( node, "globalEval" ) &&
     5779                                                jQuery.contains( doc, node ) ) {
     5780
     5781                                                if ( node.src ) {
     5782
     5783                                                        // Optional AJAX dependency, but won't run scripts if not present
     5784                                                        if ( jQuery._evalUrl ) {
     5785                                                                jQuery._evalUrl( node.src );
     5786                                                        }
     5787                                                } else {
     5788                                                        DOMEval( node.textContent.replace( rcleanScript, "" ), doc );
     5789                                                }
     5790                                        }
     5791                                }
     5792                        }
     5793                }
     5794        }
     5795
     5796        return collection;
     5797}
     5798
     5799function remove( elem, selector, keepData ) {
     5800        var node,
     5801                nodes = selector ? jQuery.filter( selector, elem ) : elem,
     5802                i = 0;
     5803
     5804        for ( ; ( node = nodes[ i ] ) != null; i++ ) {
     5805                if ( !keepData && node.nodeType === 1 ) {
     5806                        jQuery.cleanData( getAll( node ) );
     5807                }
     5808
     5809                if ( node.parentNode ) {
     5810                        if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
     5811                                setGlobalEval( getAll( node, "script" ) );
     5812                        }
     5813                        node.parentNode.removeChild( node );
     5814                }
     5815        }
     5816
     5817        return elem;
     5818}
     5819
     5820jQuery.extend( {
     5821        htmlPrefilter: function( html ) {
     5822                return html.replace( rxhtmlTag, "<$1></$2>" );
     5823        },
     5824
     5825        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
     5826                var i, l, srcElements, destElements,
     5827                        clone = elem.cloneNode( true ),
     5828                        inPage = jQuery.contains( elem.ownerDocument, elem );
     5829
     5830                // Fix IE cloning issues
     5831                if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
     5832                                !jQuery.isXMLDoc( elem ) ) {
     5833
     5834                        // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
     5835                        destElements = getAll( clone );
     5836                        srcElements = getAll( elem );
     5837
     5838                        for ( i = 0, l = srcElements.length; i < l; i++ ) {
     5839                                fixInput( srcElements[ i ], destElements[ i ] );
     5840                        }
     5841                }
     5842
     5843                // Copy the events from the original to the clone
     5844                if ( dataAndEvents ) {
     5845                        if ( deepDataAndEvents ) {
     5846                                srcElements = srcElements || getAll( elem );
     5847                                destElements = destElements || getAll( clone );
     5848
     5849                                for ( i = 0, l = srcElements.length; i < l; i++ ) {
     5850                                        cloneCopyEvent( srcElements[ i ], destElements[ i ] );
     5851                                }
     5852                        } else {
     5853                                cloneCopyEvent( elem, clone );
     5854                        }
     5855                }
     5856
     5857                // Preserve script evaluation history
     5858                destElements = getAll( clone, "script" );
     5859                if ( destElements.length > 0 ) {
     5860                        setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
     5861                }
     5862
     5863                // Return the cloned set
     5864                return clone;
     5865        },
     5866
     5867        cleanData: function( elems ) {
     5868                var data, elem, type,
     5869                        special = jQuery.event.special,
     5870                        i = 0;
     5871
     5872                for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
     5873                        if ( acceptData( elem ) ) {
     5874                                if ( ( data = elem[ dataPriv.expando ] ) ) {
     5875                                        if ( data.events ) {
     5876                                                for ( type in data.events ) {
     5877                                                        if ( special[ type ] ) {
     5878                                                                jQuery.event.remove( elem, type );
     5879
     5880                                                        // This is a shortcut to avoid jQuery.event.remove's overhead
     5881                                                        } else {
     5882                                                                jQuery.removeEvent( elem, type, data.handle );
     5883                                                        }
     5884                                                }
     5885                                        }
     5886
     5887                                        // Support: Chrome <=35 - 45+
     5888                                        // Assign undefined instead of using delete, see Data#remove
     5889                                        elem[ dataPriv.expando ] = undefined;
     5890                                }
     5891                                if ( elem[ dataUser.expando ] ) {
     5892
     5893                                        // Support: Chrome <=35 - 45+
     5894                                        // Assign undefined instead of using delete, see Data#remove
     5895                                        elem[ dataUser.expando ] = undefined;
     5896                                }
     5897                        }
     5898                }
     5899        }
     5900} );
     5901
     5902jQuery.fn.extend( {
     5903        detach: function( selector ) {
     5904                return remove( this, selector, true );
     5905        },
     5906
     5907        remove: function( selector ) {
     5908                return remove( this, selector );
     5909        },
     5910
     5911        text: function( value ) {
     5912                return access( this, function( value ) {
     5913                        return value === undefined ?
     5914                                jQuery.text( this ) :
     5915                                this.empty().each( function() {
     5916                                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
     5917                                                this.textContent = value;
     5918                                        }
     5919                                } );
     5920                }, null, value, arguments.length );
     5921        },
     5922
     5923        append: function() {
     5924                return domManip( this, arguments, function( elem ) {
     5925                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
     5926                                var target = manipulationTarget( this, elem );
     5927                                target.appendChild( elem );
     5928                        }
     5929                } );
     5930        },
     5931
     5932        prepend: function() {
     5933                return domManip( this, arguments, function( elem ) {
     5934                        if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
     5935                                var target = manipulationTarget( this, elem );
     5936                                target.insertBefore( elem, target.firstChild );
     5937                        }
     5938                } );
     5939        },
     5940
     5941        before: function() {
     5942                return domManip( this, arguments, function( elem ) {
     5943                        if ( this.parentNode ) {
     5944                                this.parentNode.insertBefore( elem, this );
     5945                        }
     5946                } );
     5947        },
     5948
     5949        after: function() {
     5950                return domManip( this, arguments, function( elem ) {
     5951                        if ( this.parentNode ) {
     5952                                this.parentNode.insertBefore( elem, this.nextSibling );
     5953                        }
     5954                } );
     5955        },
     5956
     5957        empty: function() {
     5958                var elem,
     5959                        i = 0;
     5960
     5961                for ( ; ( elem = this[ i ] ) != null; i++ ) {
     5962                        if ( elem.nodeType === 1 ) {
     5963
     5964                                // Prevent memory leaks
     5965                                jQuery.cleanData( getAll( elem, false ) );
     5966
     5967                                // Remove any remaining nodes
     5968                                elem.textContent = "";
     5969                        }
     5970                }
     5971
     5972                return this;
     5973        },
     5974
     5975        clone: function( dataAndEvents, deepDataAndEvents ) {
     5976                dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
     5977                deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
     5978
     5979                return this.map( function() {
     5980                        return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
     5981                } );
     5982        },
     5983
     5984        html: function( value ) {
     5985                return access( this, function( value ) {
     5986                        var elem = this[ 0 ] || {},
     5987                                i = 0,
     5988                                l = this.length;
     5989
     5990                        if ( value === undefined && elem.nodeType === 1 ) {
     5991                                return elem.innerHTML;
     5992                        }
     5993
     5994                        // See if we can take a shortcut and just use innerHTML
     5995                        if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
     5996                                !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
     5997
     5998                                value = jQuery.htmlPrefilter( value );
     5999
     6000                                try {
     6001                                        for ( ; i < l; i++ ) {
     6002                                                elem = this[ i ] || {};
     6003
     6004                                                // Remove element nodes and prevent memory leaks
     6005                                                if ( elem.nodeType === 1 ) {
     6006                                                        jQuery.cleanData( getAll( elem, false ) );
     6007                                                        elem.innerHTML = value;
     6008                                                }
     6009                                        }
     6010
     6011                                        elem = 0;
     6012
     6013                                // If using innerHTML throws an exception, use the fallback method
     6014                                } catch ( e ) {}
     6015                        }
     6016
     6017                        if ( elem ) {
     6018                                this.empty().append( value );
     6019                        }
     6020                }, null, value, arguments.length );
     6021        },
     6022
     6023        replaceWith: function() {
     6024                var ignored = [];
     6025
     6026                // Make the changes, replacing each non-ignored context element with the new content
     6027                return domManip( this, arguments, function( elem ) {
     6028                        var parent = this.parentNode;
     6029
     6030                        if ( jQuery.inArray( this, ignored ) < 0 ) {
     6031                                jQuery.cleanData( getAll( this ) );
     6032                                if ( parent ) {
     6033                                        parent.replaceChild( elem, this );
     6034                                }
     6035                        }
     6036
     6037                // Force callback invocation
     6038                }, ignored );
     6039        }
     6040} );
     6041
     6042jQuery.each( {
     6043        appendTo: "append",
     6044        prependTo: "prepend",
     6045        insertBefore: "before",
     6046        insertAfter: "after",
     6047        replaceAll: "replaceWith"
     6048}, function( name, original ) {
     6049        jQuery.fn[ name ] = function( selector ) {
     6050                var elems,
     6051                        ret = [],
     6052                        insert = jQuery( selector ),
     6053                        last = insert.length - 1,
     6054                        i = 0;
     6055
     6056                for ( ; i <= last; i++ ) {
     6057                        elems = i === last ? this : this.clone( true );
     6058                        jQuery( insert[ i ] )[ original ]( elems );
     6059
     6060                        // Support: Android <=4.0 only, PhantomJS 1 only
     6061                        // .get() because push.apply(_, arraylike) throws on ancient WebKit
     6062                        push.apply( ret, elems.get() );
     6063                }
     6064
     6065                return this.pushStack( ret );
     6066        };
     6067} );
     6068var rmargin = ( /^margin/ );
     6069
     6070var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
     6071
     6072var getStyles = function( elem ) {
     6073
     6074                // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
     6075                // IE throws on elements created in popups
     6076                // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
     6077                var view = elem.ownerDocument.defaultView;
     6078
     6079                if ( !view || !view.opener ) {
     6080                        view = window;
     6081                }
     6082
     6083                return view.getComputedStyle( elem );
     6084        };
     6085
     6086
     6087
     6088( function() {
     6089
     6090        // Executing both pixelPosition & boxSizingReliable tests require only one layout
     6091        // so they're executed at the same time to save the second computation.
     6092        function computeStyleTests() {
     6093
     6094                // This is a singleton, we need to execute it only once
     6095                if ( !div ) {
     6096                        return;
     6097                }
     6098
     6099                div.style.cssText =
     6100                        "box-sizing:border-box;" +
     6101                        "position:relative;display:block;" +
     6102                        "margin:auto;border:1px;padding:1px;" +
     6103                        "top:1%;width:50%";
     6104                div.innerHTML = "";
     6105                documentElement.appendChild( container );
     6106
     6107                var divStyle = window.getComputedStyle( div );
     6108                pixelPositionVal = divStyle.top !== "1%";
     6109
     6110                // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
     6111                reliableMarginLeftVal = divStyle.marginLeft === "2px";
     6112                boxSizingReliableVal = divStyle.width === "4px";
     6113
     6114                // Support: Android 4.0 - 4.3 only
     6115                // Some styles come back with percentage values, even though they shouldn't
     6116                div.style.marginRight = "50%";
     6117                pixelMarginRightVal = divStyle.marginRight === "4px";
     6118
     6119                documentElement.removeChild( container );
     6120
     6121                // Nullify the div so it wouldn't be stored in the memory and
     6122                // it will also be a sign that checks already performed
     6123                div = null;
     6124        }
     6125
     6126        var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
     6127                container = document.createElement( "div" ),
     6128                div = document.createElement( "div" );
     6129
     6130        // Finish early in limited (non-browser) environments
     6131        if ( !div.style ) {
     6132                return;
     6133        }
     6134
     6135        // Support: IE <=9 - 11 only
     6136        // Style of cloned element affects source element cloned (#8908)
     6137        div.style.backgroundClip = "content-box";
     6138        div.cloneNode( true ).style.backgroundClip = "";
     6139        support.clearCloneStyle = div.style.backgroundClip === "content-box";
     6140
     6141        container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
     6142                "padding:0;margin-top:1px;position:absolute";
     6143        container.appendChild( div );
     6144
     6145        jQuery.extend( support, {
     6146                pixelPosition: function() {
     6147                        computeStyleTests();
     6148                        return pixelPositionVal;
     6149                },
     6150                boxSizingReliable: function() {
     6151                        computeStyleTests();
     6152                        return boxSizingReliableVal;
     6153                },
     6154                pixelMarginRight: function() {
     6155                        computeStyleTests();
     6156                        return pixelMarginRightVal;
     6157                },
     6158                reliableMarginLeft: function() {
     6159                        computeStyleTests();
     6160                        return reliableMarginLeftVal;
     6161                }
     6162        } );
     6163} )();
     6164
     6165
     6166function curCSS( elem, name, computed ) {
     6167        var width, minWidth, maxWidth, ret,
     6168
     6169                // Support: Firefox 51+
     6170                // Retrieving style before computed somehow
     6171                // fixes an issue with getting wrong values
     6172                // on detached elements
     6173                style = elem.style;
     6174
     6175        computed = computed || getStyles( elem );
     6176
     6177        // getPropertyValue is needed for:
     6178        //   .css('filter') (IE 9 only, #12537)
     6179        //   .css('--customProperty) (#3144)
     6180        if ( computed ) {
     6181                ret = computed.getPropertyValue( name ) || computed[ name ];
     6182
     6183                if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
     6184                        ret = jQuery.style( elem, name );
     6185                }
     6186
     6187                // A tribute to the "awesome hack by Dean Edwards"
     6188                // Android Browser returns percentage for some values,
     6189                // but width seems to be reliably pixels.
     6190                // This is against the CSSOM draft spec:
     6191                // https://drafts.csswg.org/cssom/#resolved-values
     6192                if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
     6193
     6194                        // Remember the original values
     6195                        width = style.width;
     6196                        minWidth = style.minWidth;
     6197                        maxWidth = style.maxWidth;
     6198
     6199                        // Put in the new values to get a computed value out
     6200                        style.minWidth = style.maxWidth = style.width = ret;
     6201                        ret = computed.width;
     6202
     6203                        // Revert the changed values
     6204                        style.width = width;
     6205                        style.minWidth = minWidth;
     6206                        style.maxWidth = maxWidth;
     6207                }
     6208        }
     6209
     6210        return ret !== undefined ?
     6211
     6212                // Support: IE <=9 - 11 only
     6213                // IE returns zIndex value as an integer.
     6214                ret + "" :
     6215                ret;
     6216}
     6217
     6218
     6219function addGetHookIf( conditionFn, hookFn ) {
     6220
     6221        // Define the hook, we'll check on the first run if it's really needed.
     6222        return {
     6223                get: function() {
     6224                        if ( conditionFn() ) {
     6225
     6226                                // Hook not needed (or it's not possible to use it due
     6227                                // to missing dependency), remove it.
     6228                                delete this.get;
     6229                                return;
     6230                        }
     6231
     6232                        // Hook needed; redefine it so that the support test is not executed again.
     6233                        return ( this.get = hookFn ).apply( this, arguments );
     6234                }
     6235        };
     6236}
     6237
     6238
     6239var
     6240
     6241        // Swappable if display is none or starts with table
     6242        // except "table", "table-cell", or "table-caption"
     6243        // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
     6244        rdisplayswap = /^(none|table(?!-c[ea]).+)/,
     6245        rcustomProp = /^--/,
     6246        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
     6247        cssNormalTransform = {
     6248                letterSpacing: "0",
     6249                fontWeight: "400"
     6250        },
     6251
     6252        cssPrefixes = [ "Webkit", "Moz", "ms" ],
     6253        emptyStyle = document.createElement( "div" ).style;
     6254
     6255// Return a css property mapped to a potentially vendor prefixed property
     6256function vendorPropName( name ) {
     6257
     6258        // Shortcut for names that are not vendor prefixed
     6259        if ( name in emptyStyle ) {
     6260                return name;
     6261        }
     6262
     6263        // Check for vendor prefixed names
     6264        var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
     6265                i = cssPrefixes.length;
     6266
     6267        while ( i-- ) {
     6268                name = cssPrefixes[ i ] + capName;
     6269                if ( name in emptyStyle ) {
     6270                        return name;
     6271                }
     6272        }
     6273}
     6274
     6275// Return a property mapped along what jQuery.cssProps suggests or to
     6276// a vendor prefixed property.
     6277function finalPropName( name ) {
     6278        var ret = jQuery.cssProps[ name ];
     6279        if ( !ret ) {
     6280                ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
     6281        }
     6282        return ret;
     6283}
     6284
     6285function setPositiveNumber( elem, value, subtract ) {
     6286
     6287        // Any relative (+/-) values have already been
     6288        // normalized at this point
     6289        var matches = rcssNum.exec( value );
     6290        return matches ?
     6291
     6292                // Guard against undefined "subtract", e.g., when used as in cssHooks
     6293                Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
     6294                value;
     6295}
     6296
     6297function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
     6298        var i,
     6299                val = 0;
     6300
     6301        // If we already have the right measurement, avoid augmentation
     6302        if ( extra === ( isBorderBox ? "border" : "content" ) ) {
     6303                i = 4;
     6304
     6305        // Otherwise initialize for horizontal or vertical properties
     6306        } else {
     6307                i = name === "width" ? 1 : 0;
     6308        }
     6309
     6310        for ( ; i < 4; i += 2 ) {
     6311
     6312                // Both box models exclude margin, so add it if we want it
     6313                if ( extra === "margin" ) {
     6314                        val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
     6315                }
     6316
     6317                if ( isBorderBox ) {
     6318
     6319                        // border-box includes padding, so remove it if we want content
     6320                        if ( extra === "content" ) {
     6321                                val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
     6322                        }
     6323
     6324                        // At this point, extra isn't border nor margin, so remove border
     6325                        if ( extra !== "margin" ) {
     6326                                val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
     6327                        }
     6328                } else {
     6329
     6330                        // At this point, extra isn't content, so add padding
     6331                        val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
     6332
     6333                        // At this point, extra isn't content nor padding, so add border
     6334                        if ( extra !== "padding" ) {
     6335                                val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
     6336                        }
     6337                }
     6338        }
     6339
     6340        return val;
     6341}
     6342
     6343function getWidthOrHeight( elem, name, extra ) {
     6344
     6345        // Start with computed style
     6346        var valueIsBorderBox,
     6347                styles = getStyles( elem ),
     6348                val = curCSS( elem, name, styles ),
     6349                isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
     6350
     6351        // Computed unit is not pixels. Stop here and return.
     6352        if ( rnumnonpx.test( val ) ) {
     6353                return val;
     6354        }
     6355
     6356        // Check for style in case a browser which returns unreliable values
     6357        // for getComputedStyle silently falls back to the reliable elem.style
     6358        valueIsBorderBox = isBorderBox &&
     6359                ( support.boxSizingReliable() || val === elem.style[ name ] );
     6360
     6361        // Fall back to offsetWidth/Height when value is "auto"
     6362        // This happens for inline elements with no explicit setting (gh-3571)
     6363        if ( val === "auto" ) {
     6364                val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ];
     6365        }
     6366
     6367        // Normalize "", auto, and prepare for extra
     6368        val = parseFloat( val ) || 0;
     6369
     6370        // Use the active box-sizing model to add/subtract irrelevant styles
     6371        return ( val +
     6372                augmentWidthOrHeight(
     6373                        elem,
     6374                        name,
     6375                        extra || ( isBorderBox ? "border" : "content" ),
     6376                        valueIsBorderBox,
     6377                        styles
     6378                )
     6379        ) + "px";
     6380}
     6381
     6382jQuery.extend( {
     6383
     6384        // Add in style property hooks for overriding the default
     6385        // behavior of getting and setting a style property
     6386        cssHooks: {
     6387                opacity: {
     6388                        get: function( elem, computed ) {
     6389                                if ( computed ) {
     6390
     6391                                        // We should always get a number back from opacity
     6392                                        var ret = curCSS( elem, "opacity" );
     6393                                        return ret === "" ? "1" : ret;
     6394                                }
     6395                        }
     6396                }
     6397        },
     6398
     6399        // Don't automatically add "px" to these possibly-unitless properties
     6400        cssNumber: {
     6401                "animationIterationCount": true,
     6402                "columnCount": true,
     6403                "fillOpacity": true,
     6404                "flexGrow": true,
     6405                "flexShrink": true,
     6406                "fontWeight": true,
     6407                "lineHeight": true,
     6408                "opacity": true,
     6409                "order": true,
     6410                "orphans": true,
     6411                "widows": true,
     6412                "zIndex": true,
     6413                "zoom": true
     6414        },
     6415
     6416        // Add in properties whose names you wish to fix before
     6417        // setting or getting the value
     6418        cssProps: {
     6419                "float": "cssFloat"
     6420        },
     6421
     6422        // Get and set the style property on a DOM Node
     6423        style: function( elem, name, value, extra ) {
     6424
     6425                // Don't set styles on text and comment nodes
     6426                if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
     6427                        return;
     6428                }
     6429
     6430                // Make sure that we're working with the right name
     6431                var ret, type, hooks,
     6432                        origName = jQuery.camelCase( name ),
     6433                        isCustomProp = rcustomProp.test( name ),
     6434                        style = elem.style;
     6435
     6436                // Make sure that we're working with the right name. We don't
     6437                // want to query the value if it is a CSS custom property
     6438                // since they are user-defined.
     6439                if ( !isCustomProp ) {
     6440                        name = finalPropName( origName );
     6441                }
     6442
     6443                // Gets hook for the prefixed version, then unprefixed version
     6444                hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
     6445
     6446                // Check if we're setting a value
     6447                if ( value !== undefined ) {
     6448                        type = typeof value;
     6449
     6450                        // Convert "+=" or "-=" to relative numbers (#7345)
     6451                        if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
     6452                                value = adjustCSS( elem, name, ret );
     6453
     6454                                // Fixes bug #9237
     6455                                type = "number";
     6456                        }
     6457
     6458                        // Make sure that null and NaN values aren't set (#7116)
     6459                        if ( value == null || value !== value ) {
     6460                                return;
     6461                        }
     6462
     6463                        // If a number was passed in, add the unit (except for certain CSS properties)
     6464                        if ( type === "number" ) {
     6465                                value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
     6466                        }
     6467
     6468                        // background-* props affect original clone's values
     6469                        if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
     6470                                style[ name ] = "inherit";
     6471                        }
     6472
     6473                        // If a hook was provided, use that value, otherwise just set the specified value
     6474                        if ( !hooks || !( "set" in hooks ) ||
     6475                                ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
     6476
     6477                                if ( isCustomProp ) {
     6478                                        style.setProperty( name, value );
     6479                                } else {
     6480                                        style[ name ] = value;
     6481                                }
     6482                        }
     6483
     6484                } else {
     6485
     6486                        // If a hook was provided get the non-computed value from there
     6487                        if ( hooks && "get" in hooks &&
     6488                                ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
     6489
     6490                                return ret;
     6491                        }
     6492
     6493                        // Otherwise just get the value from the style object
     6494                        return style[ name ];
     6495                }
     6496        },
     6497
     6498        css: function( elem, name, extra, styles ) {
     6499                var val, num, hooks,
     6500                        origName = jQuery.camelCase( name ),
     6501                        isCustomProp = rcustomProp.test( name );
     6502
     6503                // Make sure that we're working with the right name. We don't
     6504                // want to modify the value if it is a CSS custom property
     6505                // since they are user-defined.
     6506                if ( !isCustomProp ) {
     6507                        name = finalPropName( origName );
     6508                }
     6509
     6510                // Try prefixed name followed by the unprefixed name
     6511                hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
     6512
     6513                // If a hook was provided get the computed value from there
     6514                if ( hooks && "get" in hooks ) {
     6515                        val = hooks.get( elem, true, extra );
     6516                }
     6517
     6518                // Otherwise, if a way to get the computed value exists, use that
     6519                if ( val === undefined ) {
     6520                        val = curCSS( elem, name, styles );
     6521                }
     6522
     6523                // Convert "normal" to computed value
     6524                if ( val === "normal" && name in cssNormalTransform ) {
     6525                        val = cssNormalTransform[ name ];
     6526                }
     6527
     6528                // Make numeric if forced or a qualifier was provided and val looks numeric
     6529                if ( extra === "" || extra ) {
     6530                        num = parseFloat( val );
     6531                        return extra === true || isFinite( num ) ? num || 0 : val;
     6532                }
     6533
     6534                return val;
     6535        }
     6536} );
     6537
     6538jQuery.each( [ "height", "width" ], function( i, name ) {
     6539        jQuery.cssHooks[ name ] = {
     6540                get: function( elem, computed, extra ) {
     6541                        if ( computed ) {
     6542
     6543                                // Certain elements can have dimension info if we invisibly show them
     6544                                // but it must have a current display style that would benefit
     6545                                return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
     6546
     6547                                        // Support: Safari 8+
     6548                                        // Table columns in Safari have non-zero offsetWidth & zero
     6549                                        // getBoundingClientRect().width unless display is changed.
     6550                                        // Support: IE <=11 only
     6551                                        // Running getBoundingClientRect on a disconnected node
     6552                                        // in IE throws an error.
     6553                                        ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
     6554                                                swap( elem, cssShow, function() {
     6555                                                        return getWidthOrHeight( elem, name, extra );
     6556                                                } ) :
     6557                                                getWidthOrHeight( elem, name, extra );
     6558                        }
     6559                },
     6560
     6561                set: function( elem, value, extra ) {
     6562                        var matches,
     6563                                styles = extra && getStyles( elem ),
     6564                                subtract = extra && augmentWidthOrHeight(
     6565                                        elem,
     6566                                        name,
     6567                                        extra,
     6568                                        jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
     6569                                        styles
     6570                                );
     6571
     6572                        // Convert to pixels if value adjustment is needed
     6573                        if ( subtract && ( matches = rcssNum.exec( value ) ) &&
     6574                                ( matches[ 3 ] || "px" ) !== "px" ) {
     6575
     6576                                elem.style[ name ] = value;
     6577                                value = jQuery.css( elem, name );
     6578                        }
     6579
     6580                        return setPositiveNumber( elem, value, subtract );
     6581                }
     6582        };
     6583} );
     6584
     6585jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
     6586        function( elem, computed ) {
     6587                if ( computed ) {
     6588                        return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
     6589                                elem.getBoundingClientRect().left -
     6590                                        swap( elem, { marginLeft: 0 }, function() {
     6591                                                return elem.getBoundingClientRect().left;
     6592                                        } )
     6593                                ) + "px";
     6594                }
     6595        }
     6596);
     6597
     6598// These hooks are used by animate to expand properties
     6599jQuery.each( {
     6600        margin: "",
     6601        padding: "",
     6602        border: "Width"
     6603}, function( prefix, suffix ) {
     6604        jQuery.cssHooks[ prefix + suffix ] = {
     6605                expand: function( value ) {
     6606                        var i = 0,
     6607                                expanded = {},
     6608
     6609                                // Assumes a single number if not a string
     6610                                parts = typeof value === "string" ? value.split( " " ) : [ value ];
     6611
     6612                        for ( ; i < 4; i++ ) {
     6613                                expanded[ prefix + cssExpand[ i ] + suffix ] =
     6614                                        parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
     6615                        }
     6616
     6617                        return expanded;
     6618                }
     6619        };
     6620
     6621        if ( !rmargin.test( prefix ) ) {
     6622                jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
     6623        }
     6624} );
     6625
     6626jQuery.fn.extend( {
     6627        css: function( name, value ) {
     6628                return access( this, function( elem, name, value ) {
     6629                        var styles, len,
     6630                                map = {},
     6631                                i = 0;
     6632
     6633                        if ( Array.isArray( name ) ) {
     6634                                styles = getStyles( elem );
     6635                                len = name.length;
     6636
     6637                                for ( ; i < len; i++ ) {
     6638                                        map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
     6639                                }
     6640
     6641                                return map;
     6642                        }
     6643
     6644                        return value !== undefined ?
     6645                                jQuery.style( elem, name, value ) :
     6646                                jQuery.css( elem, name );
     6647                }, name, value, arguments.length > 1 );
     6648        }
     6649} );
     6650
     6651
     6652function Tween( elem, options, prop, end, easing ) {
     6653        return new Tween.prototype.init( elem, options, prop, end, easing );
     6654}
     6655jQuery.Tween = Tween;
     6656
     6657Tween.prototype = {
     6658        constructor: Tween,
     6659        init: function( elem, options, prop, end, easing, unit ) {
     6660                this.elem = elem;
     6661                this.prop = prop;
     6662                this.easing = easing || jQuery.easing._default;
     6663                this.options = options;
     6664                this.start = this.now = this.cur();
     6665                this.end = end;
     6666                this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
     6667        },
     6668        cur: function() {
     6669                var hooks = Tween.propHooks[ this.prop ];
     6670
     6671                return hooks && hooks.get ?
     6672                        hooks.get( this ) :
     6673                        Tween.propHooks._default.get( this );
     6674        },
     6675        run: function( percent ) {
     6676                var eased,
     6677                        hooks = Tween.propHooks[ this.prop ];
     6678
     6679                if ( this.options.duration ) {
     6680                        this.pos = eased = jQuery.easing[ this.easing ](
     6681                                percent, this.options.duration * percent, 0, 1, this.options.duration
     6682                        );
     6683                } else {
     6684                        this.pos = eased = percent;
     6685                }
     6686                this.now = ( this.end - this.start ) * eased + this.start;
     6687
     6688                if ( this.options.step ) {
     6689                        this.options.step.call( this.elem, this.now, this );
     6690                }
     6691
     6692                if ( hooks && hooks.set ) {
     6693                        hooks.set( this );
     6694                } else {
     6695                        Tween.propHooks._default.set( this );
     6696                }
     6697                return this;
     6698        }
     6699};
     6700
     6701Tween.prototype.init.prototype = Tween.prototype;
     6702
     6703Tween.propHooks = {
     6704        _default: {
     6705                get: function( tween ) {
     6706                        var result;
     6707
     6708                        // Use a property on the element directly when it is not a DOM element,
     6709                        // or when there is no matching style property that exists.
     6710                        if ( tween.elem.nodeType !== 1 ||
     6711                                tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
     6712                                return tween.elem[ tween.prop ];
     6713                        }
     6714
     6715                        // Passing an empty string as a 3rd parameter to .css will automatically
     6716                        // attempt a parseFloat and fallback to a string if the parse fails.
     6717                        // Simple values such as "10px" are parsed to Float;
     6718                        // complex values such as "rotate(1rad)" are returned as-is.
     6719                        result = jQuery.css( tween.elem, tween.prop, "" );
     6720
     6721                        // Empty strings, null, undefined and "auto" are converted to 0.
     6722                        return !result || result === "auto" ? 0 : result;
     6723                },
     6724                set: function( tween ) {
     6725
     6726                        // Use step hook for back compat.
     6727                        // Use cssHook if its there.
     6728                        // Use .style if available and use plain properties where available.
     6729                        if ( jQuery.fx.step[ tween.prop ] ) {
     6730                                jQuery.fx.step[ tween.prop ]( tween );
     6731                        } else if ( tween.elem.nodeType === 1 &&
     6732                                ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
     6733                                        jQuery.cssHooks[ tween.prop ] ) ) {
     6734                                jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
     6735                        } else {
     6736                                tween.elem[ tween.prop ] = tween.now;
     6737                        }
     6738                }
     6739        }
     6740};
     6741
     6742// Support: IE <=9 only
     6743// Panic based approach to setting things on disconnected nodes
     6744Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
     6745        set: function( tween ) {
     6746                if ( tween.elem.nodeType && tween.elem.parentNode ) {
     6747                        tween.elem[ tween.prop ] = tween.now;
     6748                }
     6749        }
     6750};
     6751
     6752jQuery.easing = {
     6753        linear: function( p ) {
     6754                return p;
     6755        },
     6756        swing: function( p ) {
     6757                return 0.5 - Math.cos( p * Math.PI ) / 2;
     6758        },
     6759        _default: "swing"
     6760};
     6761
     6762jQuery.fx = Tween.prototype.init;
     6763
     6764// Back compat <1.8 extension point
     6765jQuery.fx.step = {};
     6766
     6767
     6768
     6769
     6770var
     6771        fxNow, inProgress,
     6772        rfxtypes = /^(?:toggle|show|hide)$/,
     6773        rrun = /queueHooks$/;
     6774
     6775function schedule() {
     6776        if ( inProgress ) {
     6777                if ( document.hidden === false && window.requestAnimationFrame ) {
     6778                        window.requestAnimationFrame( schedule );
     6779                } else {
     6780                        window.setTimeout( schedule, jQuery.fx.interval );
     6781                }
     6782
     6783                jQuery.fx.tick();
     6784        }
     6785}
     6786
     6787// Animations created synchronously will run synchronously
     6788function createFxNow() {
     6789        window.setTimeout( function() {
     6790                fxNow = undefined;
     6791        } );
     6792        return ( fxNow = jQuery.now() );
     6793}
     6794
     6795// Generate parameters to create a standard animation
     6796function genFx( type, includeWidth ) {
     6797        var which,
     6798                i = 0,
     6799                attrs = { height: type };
     6800
     6801        // If we include width, step value is 1 to do all cssExpand values,
     6802        // otherwise step value is 2 to skip over Left and Right
     6803        includeWidth = includeWidth ? 1 : 0;
     6804        for ( ; i < 4; i += 2 - includeWidth ) {
     6805                which = cssExpand[ i ];
     6806                attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
     6807        }
     6808
     6809        if ( includeWidth ) {
     6810                attrs.opacity = attrs.width = type;
     6811        }
     6812
     6813        return attrs;
     6814}
     6815
     6816function createTween( value, prop, animation ) {
     6817        var tween,
     6818                collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
     6819                index = 0,
     6820                length = collection.length;
     6821        for ( ; index < length; index++ ) {
     6822                if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
     6823
     6824                        // We're done with this property
     6825                        return tween;
     6826                }
     6827        }
     6828}
     6829
     6830function defaultPrefilter( elem, props, opts ) {
     6831        var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
     6832                isBox = "width" in props || "height" in props,
     6833                anim = this,
     6834                orig = {},
     6835                style = elem.style,
     6836                hidden = elem.nodeType && isHiddenWithinTree( elem ),
     6837                dataShow = dataPriv.get( elem, "fxshow" );
     6838
     6839        // Queue-skipping animations hijack the fx hooks
     6840        if ( !opts.queue ) {
     6841                hooks = jQuery._queueHooks( elem, "fx" );
     6842                if ( hooks.unqueued == null ) {
     6843                        hooks.unqueued = 0;
     6844                        oldfire = hooks.empty.fire;
     6845                        hooks.empty.fire = function() {
     6846                                if ( !hooks.unqueued ) {
     6847                                        oldfire();
     6848                                }
     6849                        };
     6850                }
     6851                hooks.unqueued++;
     6852
     6853                anim.always( function() {
     6854
     6855                        // Ensure the complete handler is called before this completes
     6856                        anim.always( function() {
     6857                                hooks.unqueued--;
     6858                                if ( !jQuery.queue( elem, "fx" ).length ) {
     6859                                        hooks.empty.fire();
     6860                                }
     6861                        } );
     6862                } );
     6863        }
     6864
     6865        // Detect show/hide animations
     6866        for ( prop in props ) {
     6867                value = props[ prop ];
     6868                if ( rfxtypes.test( value ) ) {
     6869                        delete props[ prop ];
     6870                        toggle = toggle || value === "toggle";
     6871                        if ( value === ( hidden ? "hide" : "show" ) ) {
     6872
     6873                                // Pretend to be hidden if this is a "show" and
     6874                                // there is still data from a stopped show/hide
     6875                                if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
     6876                                        hidden = true;
     6877
     6878                                // Ignore all other no-op show/hide data
     6879                                } else {
     6880                                        continue;
     6881                                }
     6882                        }
     6883                        orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
     6884                }
     6885        }
     6886
     6887        // Bail out if this is a no-op like .hide().hide()
     6888        propTween = !jQuery.isEmptyObject( props );
     6889        if ( !propTween && jQuery.isEmptyObject( orig ) ) {
     6890                return;
     6891        }
     6892
     6893        // Restrict "overflow" and "display" styles during box animations
     6894        if ( isBox && elem.nodeType === 1 ) {
     6895
     6896                // Support: IE <=9 - 11, Edge 12 - 13
     6897                // Record all 3 overflow attributes because IE does not infer the shorthand
     6898                // from identically-valued overflowX and overflowY
     6899                opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
     6900
     6901                // Identify a display type, preferring old show/hide data over the CSS cascade
     6902                restoreDisplay = dataShow && dataShow.display;
     6903                if ( restoreDisplay == null ) {
     6904                        restoreDisplay = dataPriv.get( elem, "display" );
     6905                }
     6906                display = jQuery.css( elem, "display" );
     6907                if ( display === "none" ) {
     6908                        if ( restoreDisplay ) {
     6909                                display = restoreDisplay;
     6910                        } else {
     6911
     6912                                // Get nonempty value(s) by temporarily forcing visibility
     6913                                showHide( [ elem ], true );
     6914                                restoreDisplay = elem.style.display || restoreDisplay;
     6915                                display = jQuery.css( elem, "display" );
     6916                                showHide( [ elem ] );
     6917                        }
     6918                }
     6919
     6920                // Animate inline elements as inline-block
     6921                if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
     6922                        if ( jQuery.css( elem, "float" ) === "none" ) {
     6923
     6924                                // Restore the original display value at the end of pure show/hide animations
     6925                                if ( !propTween ) {
     6926                                        anim.done( function() {
     6927                                                style.display = restoreDisplay;
     6928                                        } );
     6929                                        if ( restoreDisplay == null ) {
     6930                                                display = style.display;
     6931                                                restoreDisplay = display === "none" ? "" : display;
     6932                                        }
     6933                                }
     6934                                style.display = "inline-block";
     6935                        }
     6936                }
     6937        }
     6938
     6939        if ( opts.overflow ) {
     6940                style.overflow = "hidden";
     6941                anim.always( function() {
     6942                        style.overflow = opts.overflow[ 0 ];
     6943                        style.overflowX = opts.overflow[ 1 ];
     6944                        style.overflowY = opts.overflow[ 2 ];
     6945                } );
     6946        }
     6947
     6948        // Implement show/hide animations
     6949        propTween = false;
     6950        for ( prop in orig ) {
     6951
     6952                // General show/hide setup for this element animation
     6953                if ( !propTween ) {
     6954                        if ( dataShow ) {
     6955                                if ( "hidden" in dataShow ) {
     6956                                        hidden = dataShow.hidden;
     6957                                }
     6958                        } else {
     6959                                dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
     6960                        }
     6961
     6962                        // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
     6963                        if ( toggle ) {
     6964                                dataShow.hidden = !hidden;
     6965                        }
     6966
     6967                        // Show elements before animating them
     6968                        if ( hidden ) {
     6969                                showHide( [ elem ], true );
     6970                        }
     6971
     6972                        /* eslint-disable no-loop-func */
     6973
     6974                        anim.done( function() {
     6975
     6976                        /* eslint-enable no-loop-func */
     6977
     6978                                // The final step of a "hide" animation is actually hiding the element
     6979                                if ( !hidden ) {
     6980                                        showHide( [ elem ] );
     6981                                }
     6982                                dataPriv.remove( elem, "fxshow" );
     6983                                for ( prop in orig ) {
     6984                                        jQuery.style( elem, prop, orig[ prop ] );
     6985                                }
     6986                        } );
     6987                }
     6988
     6989                // Per-property setup
     6990                propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
     6991                if ( !( prop in dataShow ) ) {
     6992                        dataShow[ prop ] = propTween.start;
     6993                        if ( hidden ) {
     6994                                propTween.end = propTween.start;
     6995                                propTween.start = 0;
     6996                        }
     6997                }
     6998        }
     6999}
     7000
     7001function propFilter( props, specialEasing ) {
     7002        var index, name, easing, value, hooks;
     7003
     7004        // camelCase, specialEasing and expand cssHook pass
     7005        for ( index in props ) {
     7006                name = jQuery.camelCase( index );
     7007                easing = specialEasing[ name ];
     7008                value = props[ index ];
     7009                if ( Array.isArray( value ) ) {
     7010                        easing = value[ 1 ];
     7011                        value = props[ index ] = value[ 0 ];
     7012                }
     7013
     7014                if ( index !== name ) {
     7015                        props[ name ] = value;
     7016                        delete props[ index ];
     7017                }
     7018
     7019                hooks = jQuery.cssHooks[ name ];
     7020                if ( hooks && "expand" in hooks ) {
     7021                        value = hooks.expand( value );
     7022                        delete props[ name ];
     7023
     7024                        // Not quite $.extend, this won't overwrite existing keys.
     7025                        // Reusing 'index' because we have the correct "name"
     7026                        for ( index in value ) {
     7027                                if ( !( index in props ) ) {
     7028                                        props[ index ] = value[ index ];
     7029                                        specialEasing[ index ] = easing;
     7030                                }
     7031                        }
     7032                } else {
     7033                        specialEasing[ name ] = easing;
     7034                }
     7035        }
     7036}
     7037
     7038function Animation( elem, properties, options ) {
     7039        var result,
     7040                stopped,
     7041                index = 0,
     7042                length = Animation.prefilters.length,
     7043                deferred = jQuery.Deferred().always( function() {
     7044
     7045                        // Don't match elem in the :animated selector
     7046                        delete tick.elem;
     7047                } ),
     7048                tick = function() {
     7049                        if ( stopped ) {
     7050                                return false;
     7051                        }
     7052                        var currentTime = fxNow || createFxNow(),
     7053                                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
     7054
     7055                                // Support: Android 2.3 only
     7056                                // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
     7057                                temp = remaining / animation.duration || 0,
     7058                                percent = 1 - temp,
     7059                                index = 0,
     7060                                length = animation.tweens.length;
     7061
     7062                        for ( ; index < length; index++ ) {
     7063                                animation.tweens[ index ].run( percent );
     7064                        }
     7065
     7066                        deferred.notifyWith( elem, [ animation, percent, remaining ] );
     7067
     7068                        // If there's more to do, yield
     7069                        if ( percent < 1 && length ) {
     7070                                return remaining;
     7071                        }
     7072
     7073                        // If this was an empty animation, synthesize a final progress notification
     7074                        if ( !length ) {
     7075                                deferred.notifyWith( elem, [ animation, 1, 0 ] );
     7076                        }
     7077
     7078                        // Resolve the animation and report its conclusion
     7079                        deferred.resolveWith( elem, [ animation ] );
     7080                        return false;
     7081                },
     7082                animation = deferred.promise( {
     7083                        elem: elem,
     7084                        props: jQuery.extend( {}, properties ),
     7085                        opts: jQuery.extend( true, {
     7086                                specialEasing: {},
     7087                                easing: jQuery.easing._default
     7088                        }, options ),
     7089                        originalProperties: properties,
     7090                        originalOptions: options,
     7091                        startTime: fxNow || createFxNow(),
     7092                        duration: options.duration,
     7093                        tweens: [],
     7094                        createTween: function( prop, end ) {
     7095                                var tween = jQuery.Tween( elem, animation.opts, prop, end,
     7096                                                animation.opts.specialEasing[ prop ] || animation.opts.easing );
     7097                                animation.tweens.push( tween );
     7098                                return tween;
     7099                        },
     7100                        stop: function( gotoEnd ) {
     7101                                var index = 0,
     7102
     7103                                        // If we are going to the end, we want to run all the tweens
     7104                                        // otherwise we skip this part
     7105                                        length = gotoEnd ? animation.tweens.length : 0;
     7106                                if ( stopped ) {
     7107                                        return this;
     7108                                }
     7109                                stopped = true;
     7110                                for ( ; index < length; index++ ) {
     7111                                        animation.tweens[ index ].run( 1 );
     7112                                }
     7113
     7114                                // Resolve when we played the last frame; otherwise, reject
     7115                                if ( gotoEnd ) {
     7116                                        deferred.notifyWith( elem, [ animation, 1, 0 ] );
     7117                                        deferred.resolveWith( elem, [ animation, gotoEnd ] );
     7118                                } else {
     7119                                        deferred.rejectWith( elem, [ animation, gotoEnd ] );
     7120                                }
     7121                                return this;
     7122                        }
     7123                } ),
     7124                props = animation.props;
     7125
     7126        propFilter( props, animation.opts.specialEasing );
     7127
     7128        for ( ; index < length; index++ ) {
     7129                result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
     7130                if ( result ) {
     7131                        if ( jQuery.isFunction( result.stop ) ) {
     7132                                jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
     7133                                        jQuery.proxy( result.stop, result );
     7134                        }
     7135                        return result;
     7136                }
     7137        }
     7138
     7139        jQuery.map( props, createTween, animation );
     7140
     7141        if ( jQuery.isFunction( animation.opts.start ) ) {
     7142                animation.opts.start.call( elem, animation );
     7143        }
     7144
     7145        // Attach callbacks from options
     7146        animation
     7147                .progress( animation.opts.progress )
     7148                .done( animation.opts.done, animation.opts.complete )
     7149                .fail( animation.opts.fail )
     7150                .always( animation.opts.always );
     7151
     7152        jQuery.fx.timer(
     7153                jQuery.extend( tick, {
     7154                        elem: elem,
     7155                        anim: animation,
     7156                        queue: animation.opts.queue
     7157                } )
     7158        );
     7159
     7160        return animation;
     7161}
     7162
     7163jQuery.Animation = jQuery.extend( Animation, {
     7164
     7165        tweeners: {
     7166                "*": [ function( prop, value ) {
     7167                        var tween = this.createTween( prop, value );
     7168                        adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
     7169                        return tween;
     7170                } ]
     7171        },
     7172
     7173        tweener: function( props, callback ) {
     7174                if ( jQuery.isFunction( props ) ) {
     7175                        callback = props;
     7176                        props = [ "*" ];
     7177                } else {
     7178                        props = props.match( rnothtmlwhite );
     7179                }
     7180
     7181                var prop,
     7182                        index = 0,
     7183                        length = props.length;
     7184
     7185                for ( ; index < length; index++ ) {
     7186                        prop = props[ index ];
     7187                        Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
     7188                        Animation.tweeners[ prop ].unshift( callback );
     7189                }
     7190        },
     7191
     7192        prefilters: [ defaultPrefilter ],
     7193
     7194        prefilter: function( callback, prepend ) {
     7195                if ( prepend ) {
     7196                        Animation.prefilters.unshift( callback );
     7197                } else {
     7198                        Animation.prefilters.push( callback );
     7199                }
     7200        }
     7201} );
     7202
     7203jQuery.speed = function( speed, easing, fn ) {
     7204        var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
     7205                complete: fn || !fn && easing ||
     7206                        jQuery.isFunction( speed ) && speed,
     7207                duration: speed,
     7208                easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
     7209        };
     7210
     7211        // Go to the end state if fx are off
     7212        if ( jQuery.fx.off ) {
     7213                opt.duration = 0;
     7214
     7215        } else {
     7216                if ( typeof opt.duration !== "number" ) {
     7217                        if ( opt.duration in jQuery.fx.speeds ) {
     7218                                opt.duration = jQuery.fx.speeds[ opt.duration ];
     7219
     7220                        } else {
     7221                                opt.duration = jQuery.fx.speeds._default;
     7222                        }
     7223                }
     7224        }
     7225
     7226        // Normalize opt.queue - true/undefined/null -> "fx"
     7227        if ( opt.queue == null || opt.queue === true ) {
     7228                opt.queue = "fx";
     7229        }
     7230
     7231        // Queueing
     7232        opt.old = opt.complete;
     7233
     7234        opt.complete = function() {
     7235                if ( jQuery.isFunction( opt.old ) ) {
     7236                        opt.old.call( this );
     7237                }
     7238
     7239                if ( opt.queue ) {
     7240                        jQuery.dequeue( this, opt.queue );
     7241                }
     7242        };
     7243
     7244        return opt;
     7245};
     7246
     7247jQuery.fn.extend( {
     7248        fadeTo: function( speed, to, easing, callback ) {
     7249
     7250                // Show any hidden elements after setting opacity to 0
     7251                return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
     7252
     7253                        // Animate to the value specified
     7254                        .end().animate( { opacity: to }, speed, easing, callback );
     7255        },
     7256        animate: function( prop, speed, easing, callback ) {
     7257                var empty = jQuery.isEmptyObject( prop ),
     7258                        optall = jQuery.speed( speed, easing, callback ),
     7259                        doAnimation = function() {
     7260
     7261                                // Operate on a copy of prop so per-property easing won't be lost
     7262                                var anim = Animation( this, jQuery.extend( {}, prop ), optall );
     7263
     7264                                // Empty animations, or finishing resolves immediately
     7265                                if ( empty || dataPriv.get( this, "finish" ) ) {
     7266                                        anim.stop( true );
     7267                                }
     7268                        };
     7269                        doAnimation.finish = doAnimation;
     7270
     7271                return empty || optall.queue === false ?
     7272                        this.each( doAnimation ) :
     7273                        this.queue( optall.queue, doAnimation );
     7274        },
     7275        stop: function( type, clearQueue, gotoEnd ) {
     7276                var stopQueue = function( hooks ) {
     7277                        var stop = hooks.stop;
     7278                        delete hooks.stop;
     7279                        stop( gotoEnd );
     7280                };
     7281
     7282                if ( typeof type !== "string" ) {
     7283                        gotoEnd = clearQueue;
     7284                        clearQueue = type;
     7285                        type = undefined;
     7286                }
     7287                if ( clearQueue && type !== false ) {
     7288                        this.queue( type || "fx", [] );
     7289                }
     7290
     7291                return this.each( function() {
     7292                        var dequeue = true,
     7293                                index = type != null && type + "queueHooks",
     7294                                timers = jQuery.timers,
     7295                                data = dataPriv.get( this );
     7296
     7297                        if ( index ) {
     7298                                if ( data[ index ] && data[ index ].stop ) {
     7299                                        stopQueue( data[ index ] );
     7300                                }
     7301                        } else {
     7302                                for ( index in data ) {
     7303                                        if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
     7304                                                stopQueue( data[ index ] );
     7305                                        }
     7306                                }
     7307                        }
     7308
     7309                        for ( index = timers.length; index--; ) {
     7310                                if ( timers[ index ].elem === this &&
     7311                                        ( type == null || timers[ index ].queue === type ) ) {
     7312
     7313                                        timers[ index ].anim.stop( gotoEnd );
     7314                                        dequeue = false;
     7315                                        timers.splice( index, 1 );
     7316                                }
     7317                        }
     7318
     7319                        // Start the next in the queue if the last step wasn't forced.
     7320                        // Timers currently will call their complete callbacks, which
     7321                        // will dequeue but only if they were gotoEnd.
     7322                        if ( dequeue || !gotoEnd ) {
     7323                                jQuery.dequeue( this, type );
     7324                        }
     7325                } );
     7326        },
     7327        finish: function( type ) {
     7328                if ( type !== false ) {
     7329                        type = type || "fx";
     7330                }
     7331                return this.each( function() {
     7332                        var index,
     7333                                data = dataPriv.get( this ),
     7334                                queue = data[ type + "queue" ],
     7335                                hooks = data[ type + "queueHooks" ],
     7336                                timers = jQuery.timers,
     7337                                length = queue ? queue.length : 0;
     7338
     7339                        // Enable finishing flag on private data
     7340                        data.finish = true;
     7341
     7342                        // Empty the queue first
     7343                        jQuery.queue( this, type, [] );
     7344
     7345                        if ( hooks && hooks.stop ) {
     7346                                hooks.stop.call( this, true );
     7347                        }
     7348
     7349                        // Look for any active animations, and finish them
     7350                        for ( index = timers.length; index--; ) {
     7351                                if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
     7352                                        timers[ index ].anim.stop( true );
     7353                                        timers.splice( index, 1 );
     7354                                }
     7355                        }
     7356
     7357                        // Look for any animations in the old queue and finish them
     7358                        for ( index = 0; index < length; index++ ) {
     7359                                if ( queue[ index ] && queue[ index ].finish ) {
     7360                                        queue[ index ].finish.call( this );
     7361                                }
     7362                        }
     7363
     7364                        // Turn off finishing flag
     7365                        delete data.finish;
     7366                } );
     7367        }
     7368} );
     7369
     7370jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
     7371        var cssFn = jQuery.fn[ name ];
     7372        jQuery.fn[ name ] = function( speed, easing, callback ) {
     7373                return speed == null || typeof speed === "boolean" ?
     7374                        cssFn.apply( this, arguments ) :
     7375                        this.animate( genFx( name, true ), speed, easing, callback );
     7376        };
     7377} );
     7378
     7379// Generate shortcuts for custom animations
     7380jQuery.each( {
     7381        slideDown: genFx( "show" ),
     7382        slideUp: genFx( "hide" ),
     7383        slideToggle: genFx( "toggle" ),
     7384        fadeIn: { opacity: "show" },
     7385        fadeOut: { opacity: "hide" },
     7386        fadeToggle: { opacity: "toggle" }
     7387}, function( name, props ) {
     7388        jQuery.fn[ name ] = function( speed, easing, callback ) {
     7389                return this.animate( props, speed, easing, callback );
     7390        };
     7391} );
     7392
     7393jQuery.timers = [];
     7394jQuery.fx.tick = function() {
     7395        var timer,
     7396                i = 0,
     7397                timers = jQuery.timers;
     7398
     7399        fxNow = jQuery.now();
     7400
     7401        for ( ; i < timers.length; i++ ) {
     7402                timer = timers[ i ];
     7403
     7404                // Run the timer and safely remove it when done (allowing for external removal)
     7405                if ( !timer() && timers[ i ] === timer ) {
     7406                        timers.splice( i--, 1 );
     7407                }
     7408        }
     7409
     7410        if ( !timers.length ) {
     7411                jQuery.fx.stop();
     7412        }
     7413        fxNow = undefined;
     7414};
     7415
     7416jQuery.fx.timer = function( timer ) {
     7417        jQuery.timers.push( timer );
     7418        jQuery.fx.start();
     7419};
     7420
     7421jQuery.fx.interval = 13;
     7422jQuery.fx.start = function() {
     7423        if ( inProgress ) {
     7424                return;
     7425        }
     7426
     7427        inProgress = true;
     7428        schedule();
     7429};
     7430
     7431jQuery.fx.stop = function() {
     7432        inProgress = null;
     7433};
     7434
     7435jQuery.fx.speeds = {
     7436        slow: 600,
     7437        fast: 200,
     7438
     7439        // Default speed
     7440        _default: 400
     7441};
     7442
     7443
     7444// Based off of the plugin by Clint Helfers, with permission.
     7445// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
     7446jQuery.fn.delay = function( time, type ) {
     7447        time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
     7448        type = type || "fx";
     7449
     7450        return this.queue( type, function( next, hooks ) {
     7451                var timeout = window.setTimeout( next, time );
     7452                hooks.stop = function() {
     7453                        window.clearTimeout( timeout );
     7454                };
     7455        } );
     7456};
     7457
     7458
     7459( function() {
     7460        var input = document.createElement( "input" ),
     7461                select = document.createElement( "select" ),
     7462                opt = select.appendChild( document.createElement( "option" ) );
     7463
     7464        input.type = "checkbox";
     7465
     7466        // Support: Android <=4.3 only
     7467        // Default value for a checkbox should be "on"
     7468        support.checkOn = input.value !== "";
     7469
     7470        // Support: IE <=11 only
     7471        // Must access selectedIndex to make default options select
     7472        support.optSelected = opt.selected;
     7473
     7474        // Support: IE <=11 only
     7475        // An input loses its value after becoming a radio
     7476        input = document.createElement( "input" );
     7477        input.value = "t";
     7478        input.type = "radio";
     7479        support.radioValue = input.value === "t";
     7480} )();
     7481
     7482
     7483var boolHook,
     7484        attrHandle = jQuery.expr.attrHandle;
     7485
     7486jQuery.fn.extend( {
     7487        attr: function( name, value ) {
     7488                return access( this, jQuery.attr, name, value, arguments.length > 1 );
     7489        },
     7490
     7491        removeAttr: function( name ) {
     7492                return this.each( function() {
     7493                        jQuery.removeAttr( this, name );
     7494                } );
     7495        }
     7496} );
     7497
     7498jQuery.extend( {
     7499        attr: function( elem, name, value ) {
     7500                var ret, hooks,
     7501                        nType = elem.nodeType;
     7502
     7503                // Don't get/set attributes on text, comment and attribute nodes
     7504                if ( nType === 3 || nType === 8 || nType === 2 ) {
     7505                        return;
     7506                }
     7507
     7508                // Fallback to prop when attributes are not supported
     7509                if ( typeof elem.getAttribute === "undefined" ) {
     7510                        return jQuery.prop( elem, name, value );
     7511                }
     7512
     7513                // Attribute hooks are determined by the lowercase version
     7514                // Grab necessary hook if one is defined
     7515                if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
     7516                        hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
     7517                                ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
     7518                }
     7519
     7520                if ( value !== undefined ) {
     7521                        if ( value === null ) {
     7522                                jQuery.removeAttr( elem, name );
     7523                                return;
     7524                        }
     7525
     7526                        if ( hooks && "set" in hooks &&
     7527                                ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
     7528                                return ret;
     7529                        }
     7530
     7531                        elem.setAttribute( name, value + "" );
     7532                        return value;
     7533                }
     7534
     7535                if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
     7536                        return ret;
     7537                }
     7538
     7539                ret = jQuery.find.attr( elem, name );
     7540
     7541                // Non-existent attributes return null, we normalize to undefined
     7542                return ret == null ? undefined : ret;
     7543        },
     7544
     7545        attrHooks: {
     7546                type: {
     7547                        set: function( elem, value ) {
     7548                                if ( !support.radioValue && value === "radio" &&
     7549                                        nodeName( elem, "input" ) ) {
     7550                                        var val = elem.value;
     7551                                        elem.setAttribute( "type", value );
     7552                                        if ( val ) {
     7553                                                elem.value = val;
     7554                                        }
     7555                                        return value;
     7556                                }
     7557                        }
     7558                }
     7559        },
     7560
     7561        removeAttr: function( elem, value ) {
     7562                var name,
     7563                        i = 0,
     7564
     7565                        // Attribute names can contain non-HTML whitespace characters
     7566                        // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
     7567                        attrNames = value && value.match( rnothtmlwhite );
     7568
     7569                if ( attrNames && elem.nodeType === 1 ) {
     7570                        while ( ( name = attrNames[ i++ ] ) ) {
     7571                                elem.removeAttribute( name );
     7572                        }
     7573                }
     7574        }
     7575} );
     7576
     7577// Hooks for boolean attributes
     7578boolHook = {
     7579        set: function( elem, value, name ) {
     7580                if ( value === false ) {
     7581
     7582                        // Remove boolean attributes when set to false
     7583                        jQuery.removeAttr( elem, name );
     7584                } else {
     7585                        elem.setAttribute( name, name );
     7586                }
     7587                return name;
     7588        }
     7589};
     7590
     7591jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
     7592        var getter = attrHandle[ name ] || jQuery.find.attr;
     7593
     7594        attrHandle[ name ] = function( elem, name, isXML ) {
     7595                var ret, handle,
     7596                        lowercaseName = name.toLowerCase();
     7597
     7598                if ( !isXML ) {
     7599
     7600                        // Avoid an infinite loop by temporarily removing this function from the getter
     7601                        handle = attrHandle[ lowercaseName ];
     7602                        attrHandle[ lowercaseName ] = ret;
     7603                        ret = getter( elem, name, isXML ) != null ?
     7604                                lowercaseName :
     7605                                null;
     7606                        attrHandle[ lowercaseName ] = handle;
     7607                }
     7608                return ret;
     7609        };
     7610} );
     7611
     7612
     7613
     7614
     7615var rfocusable = /^(?:input|select|textarea|button)$/i,
     7616        rclickable = /^(?:a|area)$/i;
     7617
     7618jQuery.fn.extend( {
     7619        prop: function( name, value ) {
     7620                return access( this, jQuery.prop, name, value, arguments.length > 1 );
     7621        },
     7622
     7623        removeProp: function( name ) {
     7624                return this.each( function() {
     7625                        delete this[ jQuery.propFix[ name ] || name ];
     7626                } );
     7627        }
     7628} );
     7629
     7630jQuery.extend( {
     7631        prop: function( elem, name, value ) {
     7632                var ret, hooks,
     7633                        nType = elem.nodeType;
     7634
     7635                // Don't get/set properties on text, comment and attribute nodes
     7636                if ( nType === 3 || nType === 8 || nType === 2 ) {
     7637                        return;
     7638                }
     7639
     7640                if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
     7641
     7642                        // Fix name and attach hooks
     7643                        name = jQuery.propFix[ name ] || name;
     7644                        hooks = jQuery.propHooks[ name ];
     7645                }
     7646
     7647                if ( value !== undefined ) {
     7648                        if ( hooks && "set" in hooks &&
     7649                                ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
     7650                                return ret;
     7651                        }
     7652
     7653                        return ( elem[ name ] = value );
     7654                }
     7655
     7656                if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
     7657                        return ret;
     7658                }
     7659
     7660                return elem[ name ];
     7661        },
     7662
     7663        propHooks: {
     7664                tabIndex: {
     7665                        get: function( elem ) {
     7666
     7667                                // Support: IE <=9 - 11 only
     7668                                // elem.tabIndex doesn't always return the
     7669                                // correct value when it hasn't been explicitly set
     7670                                // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
     7671                                // Use proper attribute retrieval(#12072)
     7672                                var tabindex = jQuery.find.attr( elem, "tabindex" );
     7673
     7674                                if ( tabindex ) {
     7675                                        return parseInt( tabindex, 10 );
     7676                                }
     7677
     7678                                if (
     7679                                        rfocusable.test( elem.nodeName ) ||
     7680                                        rclickable.test( elem.nodeName ) &&
     7681                                        elem.href
     7682                                ) {
     7683                                        return 0;
     7684                                }
     7685
     7686                                return -1;
     7687                        }
     7688                }
     7689        },
     7690
     7691        propFix: {
     7692                "for": "htmlFor",
     7693                "class": "className"
     7694        }
     7695} );
     7696
     7697// Support: IE <=11 only
     7698// Accessing the selectedIndex property
     7699// forces the browser to respect setting selected
     7700// on the option
     7701// The getter ensures a default option is selected
     7702// when in an optgroup
     7703// eslint rule "no-unused-expressions" is disabled for this code
     7704// since it considers such accessions noop
     7705if ( !support.optSelected ) {
     7706        jQuery.propHooks.selected = {
     7707                get: function( elem ) {
     7708
     7709                        /* eslint no-unused-expressions: "off" */
     7710
     7711                        var parent = elem.parentNode;
     7712                        if ( parent && parent.parentNode ) {
     7713                                parent.parentNode.selectedIndex;
     7714                        }
     7715                        return null;
     7716                },
     7717                set: function( elem ) {
     7718
     7719                        /* eslint no-unused-expressions: "off" */
     7720
     7721                        var parent = elem.parentNode;
     7722                        if ( parent ) {
     7723                                parent.selectedIndex;
     7724
     7725                                if ( parent.parentNode ) {
     7726                                        parent.parentNode.selectedIndex;
     7727                                }
     7728                        }
     7729                }
     7730        };
     7731}
     7732
     7733jQuery.each( [
     7734        "tabIndex",
     7735        "readOnly",
     7736        "maxLength",
     7737        "cellSpacing",
     7738        "cellPadding",
     7739        "rowSpan",
     7740        "colSpan",
     7741        "useMap",
     7742        "frameBorder",
     7743        "contentEditable"
     7744], function() {
     7745        jQuery.propFix[ this.toLowerCase() ] = this;
     7746} );
     7747
     7748
     7749
     7750
     7751        // Strip and collapse whitespace according to HTML spec
     7752        // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace
     7753        function stripAndCollapse( value ) {
     7754                var tokens = value.match( rnothtmlwhite ) || [];
     7755                return tokens.join( " " );
     7756        }
     7757
     7758
     7759function getClass( elem ) {
     7760        return elem.getAttribute && elem.getAttribute( "class" ) || "";
     7761}
     7762
     7763jQuery.fn.extend( {
     7764        addClass: function( value ) {
     7765                var classes, elem, cur, curValue, clazz, j, finalValue,
     7766                        i = 0;
     7767
     7768                if ( jQuery.isFunction( value ) ) {
     7769                        return this.each( function( j ) {
     7770                                jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
     7771                        } );
     7772                }
     7773
     7774                if ( typeof value === "string" && value ) {
     7775                        classes = value.match( rnothtmlwhite ) || [];
     7776
     7777                        while ( ( elem = this[ i++ ] ) ) {
     7778                                curValue = getClass( elem );
     7779                                cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
     7780
     7781                                if ( cur ) {
     7782                                        j = 0;
     7783                                        while ( ( clazz = classes[ j++ ] ) ) {
     7784                                                if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
     7785                                                        cur += clazz + " ";
     7786                                                }
     7787                                        }
     7788
     7789                                        // Only assign if different to avoid unneeded rendering.
     7790                                        finalValue = stripAndCollapse( cur );
     7791                                        if ( curValue !== finalValue ) {
     7792                                                elem.setAttribute( "class", finalValue );
     7793                                        }
     7794                                }
     7795                        }
     7796                }
     7797
     7798                return this;
     7799        },
     7800
     7801        removeClass: function( value ) {
     7802                var classes, elem, cur, curValue, clazz, j, finalValue,
     7803                        i = 0;
     7804
     7805                if ( jQuery.isFunction( value ) ) {
     7806                        return this.each( function( j ) {
     7807                                jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
     7808                        } );
     7809                }
     7810
     7811                if ( !arguments.length ) {
     7812                        return this.attr( "class", "" );
     7813                }
     7814
     7815                if ( typeof value === "string" && value ) {
     7816                        classes = value.match( rnothtmlwhite ) || [];
     7817
     7818                        while ( ( elem = this[ i++ ] ) ) {
     7819                                curValue = getClass( elem );
     7820
     7821                                // This expression is here for better compressibility (see addClass)
     7822                                cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
     7823
     7824                                if ( cur ) {
     7825                                        j = 0;
     7826                                        while ( ( clazz = classes[ j++ ] ) ) {
     7827
     7828                                                // Remove *all* instances
     7829                                                while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
     7830                                                        cur = cur.replace( " " + clazz + " ", " " );
     7831                                                }
     7832                                        }
     7833
     7834                                        // Only assign if different to avoid unneeded rendering.
     7835                                        finalValue = stripAndCollapse( cur );
     7836                                        if ( curValue !== finalValue ) {
     7837                                                elem.setAttribute( "class", finalValue );
     7838                                        }
     7839                                }
     7840                        }
     7841                }
     7842
     7843                return this;
     7844        },
     7845
     7846        toggleClass: function( value, stateVal ) {
     7847                var type = typeof value;
     7848
     7849                if ( typeof stateVal === "boolean" && type === "string" ) {
     7850                        return stateVal ? this.addClass( value ) : this.removeClass( value );
     7851                }
     7852
     7853                if ( jQuery.isFunction( value ) ) {
     7854                        return this.each( function( i ) {
     7855                                jQuery( this ).toggleClass(
     7856                                        value.call( this, i, getClass( this ), stateVal ),
     7857                                        stateVal
     7858                                );
     7859                        } );
     7860                }
     7861
     7862                return this.each( function() {
     7863                        var className, i, self, classNames;
     7864
     7865                        if ( type === "string" ) {
     7866
     7867                                // Toggle individual class names
     7868                                i = 0;
     7869                                self = jQuery( this );
     7870                                classNames = value.match( rnothtmlwhite ) || [];
     7871
     7872                                while ( ( className = classNames[ i++ ] ) ) {
     7873
     7874                                        // Check each className given, space separated list
     7875                                        if ( self.hasClass( className ) ) {
     7876                                                self.removeClass( className );
     7877                                        } else {
     7878                                                self.addClass( className );
     7879                                        }
     7880                                }
     7881
     7882                        // Toggle whole class name
     7883                        } else if ( value === undefined || type === "boolean" ) {
     7884                                className = getClass( this );
     7885                                if ( className ) {
     7886
     7887                                        // Store className if set
     7888                                        dataPriv.set( this, "__className__", className );
     7889                                }
     7890
     7891                                // If the element has a class name or if we're passed `false`,
     7892                                // then remove the whole classname (if there was one, the above saved it).
     7893                                // Otherwise bring back whatever was previously saved (if anything),
     7894                                // falling back to the empty string if nothing was stored.
     7895                                if ( this.setAttribute ) {
     7896                                        this.setAttribute( "class",
     7897                                                className || value === false ?
     7898                                                "" :
     7899                                                dataPriv.get( this, "__className__" ) || ""
     7900                                        );
     7901                                }
     7902                        }
     7903                } );
     7904        },
     7905
     7906        hasClass: function( selector ) {
     7907                var className, elem,
     7908                        i = 0;
     7909
     7910                className = " " + selector + " ";
     7911                while ( ( elem = this[ i++ ] ) ) {
     7912                        if ( elem.nodeType === 1 &&
     7913                                ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
     7914                                        return true;
     7915                        }
     7916                }
     7917
     7918                return false;
     7919        }
     7920} );
     7921
     7922
     7923
     7924
     7925var rreturn = /\r/g;
     7926
     7927jQuery.fn.extend( {
     7928        val: function( value ) {
     7929                var hooks, ret, isFunction,
     7930                        elem = this[ 0 ];
     7931
     7932                if ( !arguments.length ) {
     7933                        if ( elem ) {
     7934                                hooks = jQuery.valHooks[ elem.type ] ||
     7935                                        jQuery.valHooks[ elem.nodeName.toLowerCase() ];
     7936
     7937                                if ( hooks &&
     7938                                        "get" in hooks &&
     7939                                        ( ret = hooks.get( elem, "value" ) ) !== undefined
     7940                                ) {
     7941                                        return ret;
     7942                                }
     7943
     7944                                ret = elem.value;
     7945
     7946                                // Handle most common string cases
     7947                                if ( typeof ret === "string" ) {
     7948                                        return ret.replace( rreturn, "" );
     7949                                }
     7950
     7951                                // Handle cases where value is null/undef or number
     7952                                return ret == null ? "" : ret;
     7953                        }
     7954
     7955                        return;
     7956                }
     7957
     7958                isFunction = jQuery.isFunction( value );
     7959
     7960                return this.each( function( i ) {
     7961                        var val;
     7962
     7963                        if ( this.nodeType !== 1 ) {
     7964                                return;
     7965                        }
     7966
     7967                        if ( isFunction ) {
     7968                                val = value.call( this, i, jQuery( this ).val() );
     7969                        } else {
     7970                                val = value;
     7971                        }
     7972
     7973                        // Treat null/undefined as ""; convert numbers to string
     7974                        if ( val == null ) {
     7975                                val = "";
     7976
     7977                        } else if ( typeof val === "number" ) {
     7978                                val += "";
     7979
     7980                        } else if ( Array.isArray( val ) ) {
     7981                                val = jQuery.map( val, function( value ) {
     7982                                        return value == null ? "" : value + "";
     7983                                } );
     7984                        }
     7985
     7986                        hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
     7987
     7988                        // If set returns undefined, fall back to normal setting
     7989                        if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
     7990                                this.value = val;
     7991                        }
     7992                } );
     7993        }
     7994} );
     7995
     7996jQuery.extend( {
     7997        valHooks: {
     7998                option: {
     7999                        get: function( elem ) {
     8000
     8001                                var val = jQuery.find.attr( elem, "value" );
     8002                                return val != null ?
     8003                                        val :
     8004
     8005                                        // Support: IE <=10 - 11 only
     8006                                        // option.text throws exceptions (#14686, #14858)
     8007                                        // Strip and collapse whitespace
     8008                                        // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
     8009                                        stripAndCollapse( jQuery.text( elem ) );
     8010                        }
     8011                },
     8012                select: {
     8013                        get: function( elem ) {
     8014                                var value, option, i,
     8015                                        options = elem.options,
     8016                                        index = elem.selectedIndex,
     8017                                        one = elem.type === "select-one",
     8018                                        values = one ? null : [],
     8019                                        max = one ? index + 1 : options.length;
     8020
     8021                                if ( index < 0 ) {
     8022                                        i = max;
     8023
     8024                                } else {
     8025                                        i = one ? index : 0;
     8026                                }
     8027
     8028                                // Loop through all the selected options
     8029                                for ( ; i < max; i++ ) {
     8030                                        option = options[ i ];
     8031
     8032                                        // Support: IE <=9 only
     8033                                        // IE8-9 doesn't update selected after form reset (#2551)
     8034                                        if ( ( option.selected || i === index ) &&
     8035
     8036                                                        // Don't return options that are disabled or in a disabled optgroup
     8037                                                        !option.disabled &&
     8038                                                        ( !option.parentNode.disabled ||
     8039                                                                !nodeName( option.parentNode, "optgroup" ) ) ) {
     8040
     8041                                                // Get the specific value for the option
     8042                                                value = jQuery( option ).val();
     8043
     8044                                                // We don't need an array for one selects
     8045                                                if ( one ) {
     8046                                                        return value;
     8047                                                }
     8048
     8049                                                // Multi-Selects return an array
     8050                                                values.push( value );
     8051                                        }
     8052                                }
     8053
     8054                                return values;
     8055                        },
     8056
     8057                        set: function( elem, value ) {
     8058                                var optionSet, option,
     8059                                        options = elem.options,
     8060                                        values = jQuery.makeArray( value ),
     8061                                        i = options.length;
     8062
     8063                                while ( i-- ) {
     8064                                        option = options[ i ];
     8065
     8066                                        /* eslint-disable no-cond-assign */
     8067
     8068                                        if ( option.selected =
     8069                                                jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
     8070                                        ) {
     8071                                                optionSet = true;
     8072                                        }
     8073
     8074                                        /* eslint-enable no-cond-assign */
     8075                                }
     8076
     8077                                // Force browsers to behave consistently when non-matching value is set
     8078                                if ( !optionSet ) {
     8079                                        elem.selectedIndex = -1;
     8080                                }
     8081                                return values;
     8082                        }
     8083                }
     8084        }
     8085} );
     8086
     8087// Radios and checkboxes getter/setter
     8088jQuery.each( [ "radio", "checkbox" ], function() {
     8089        jQuery.valHooks[ this ] = {
     8090                set: function( elem, value ) {
     8091                        if ( Array.isArray( value ) ) {
     8092                                return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
     8093                        }
     8094                }
     8095        };
     8096        if ( !support.checkOn ) {
     8097                jQuery.valHooks[ this ].get = function( elem ) {
     8098                        return elem.getAttribute( "value" ) === null ? "on" : elem.value;
     8099                };
     8100        }
     8101} );
     8102
     8103
     8104
     8105
     8106// Return jQuery for attributes-only inclusion
     8107
     8108
     8109var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
     8110
     8111jQuery.extend( jQuery.event, {
     8112
     8113        trigger: function( event, data, elem, onlyHandlers ) {
     8114
     8115                var i, cur, tmp, bubbleType, ontype, handle, special,
     8116                        eventPath = [ elem || document ],
     8117                        type = hasOwn.call( event, "type" ) ? event.type : event,
     8118                        namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
     8119
     8120                cur = tmp = elem = elem || document;
     8121
     8122                // Don't do events on text and comment nodes
     8123                if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
     8124                        return;
     8125                }
     8126
     8127                // focus/blur morphs to focusin/out; ensure we're not firing them right now
     8128                if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
     8129                        return;
     8130                }
     8131
     8132                if ( type.indexOf( "." ) > -1 ) {
     8133
     8134                        // Namespaced trigger; create a regexp to match event type in handle()
     8135                        namespaces = type.split( "." );
     8136                        type = namespaces.shift();
     8137                        namespaces.sort();
     8138                }
     8139                ontype = type.indexOf( ":" ) < 0 && "on" + type;
     8140
     8141                // Caller can pass in a jQuery.Event object, Object, or just an event type string
     8142                event = event[ jQuery.expando ] ?
     8143                        event :
     8144                        new jQuery.Event( type, typeof event === "object" && event );
     8145
     8146                // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
     8147                event.isTrigger = onlyHandlers ? 2 : 3;
     8148                event.namespace = namespaces.join( "." );
     8149                event.rnamespace = event.namespace ?
     8150                        new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
     8151                        null;
     8152
     8153                // Clean up the event in case it is being reused
     8154                event.result = undefined;
     8155                if ( !event.target ) {
     8156                        event.target = elem;
     8157                }
     8158
     8159                // Clone any incoming data and prepend the event, creating the handler arg list
     8160                data = data == null ?
     8161                        [ event ] :
     8162                        jQuery.makeArray( data, [ event ] );
     8163
     8164                // Allow special events to draw outside the lines
     8165                special = jQuery.event.special[ type ] || {};
     8166                if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
     8167                        return;
     8168                }
     8169
     8170                // Determine event propagation path in advance, per W3C events spec (#9951)
     8171                // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
     8172                if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
     8173
     8174                        bubbleType = special.delegateType || type;
     8175                        if ( !rfocusMorph.test( bubbleType + type ) ) {
     8176                                cur = cur.parentNode;
     8177                        }
     8178                        for ( ; cur; cur = cur.parentNode ) {
     8179                                eventPath.push( cur );
     8180                                tmp = cur;
     8181                        }
     8182
     8183                        // Only add window if we got to document (e.g., not plain obj or detached DOM)
     8184                        if ( tmp === ( elem.ownerDocument || document ) ) {
     8185                                eventPath.push( tmp.defaultView || tmp.parentWindow || window );
     8186                        }
     8187                }
     8188
     8189                // Fire handlers on the event path
     8190                i = 0;
     8191                while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
     8192
     8193                        event.type = i > 1 ?
     8194                                bubbleType :
     8195                                special.bindType || type;
     8196
     8197                        // jQuery handler
     8198                        handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
     8199                                dataPriv.get( cur, "handle" );
     8200                        if ( handle ) {
     8201                                handle.apply( cur, data );
     8202                        }
     8203
     8204                        // Native handler
     8205                        handle = ontype && cur[ ontype ];
     8206                        if ( handle && handle.apply && acceptData( cur ) ) {
     8207                                event.result = handle.apply( cur, data );
     8208                                if ( event.result === false ) {
     8209                                        event.preventDefault();
     8210                                }
     8211                        }
     8212                }
     8213                event.type = type;
     8214
     8215                // If nobody prevented the default action, do it now
     8216                if ( !onlyHandlers && !event.isDefaultPrevented() ) {
     8217
     8218                        if ( ( !special._default ||
     8219                                special._default.apply( eventPath.pop(), data ) === false ) &&
     8220                                acceptData( elem ) ) {
     8221
     8222                                // Call a native DOM method on the target with the same name as the event.
     8223                                // Don't do default actions on window, that's where global variables be (#6170)
     8224                                if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
     8225
     8226                                        // Don't re-trigger an onFOO event when we call its FOO() method
     8227                                        tmp = elem[ ontype ];
     8228
     8229                                        if ( tmp ) {
     8230                                                elem[ ontype ] = null;
     8231                                        }
     8232
     8233                                        // Prevent re-triggering of the same event, since we already bubbled it above
     8234                                        jQuery.event.triggered = type;
     8235                                        elem[ type ]();
     8236                                        jQuery.event.triggered = undefined;
     8237
     8238                                        if ( tmp ) {
     8239                                                elem[ ontype ] = tmp;
     8240                                        }
     8241                                }
     8242                        }
     8243                }
     8244
     8245                return event.result;
     8246        },
     8247
     8248        // Piggyback on a donor event to simulate a different one
     8249        // Used only for `focus(in | out)` events
     8250        simulate: function( type, elem, event ) {
     8251                var e = jQuery.extend(
     8252                        new jQuery.Event(),
     8253                        event,
     8254                        {
     8255                                type: type,
     8256                                isSimulated: true
     8257                        }
     8258                );
     8259
     8260                jQuery.event.trigger( e, null, elem );
     8261        }
     8262
     8263} );
     8264
     8265jQuery.fn.extend( {
     8266
     8267        trigger: function( type, data ) {
     8268                return this.each( function() {
     8269                        jQuery.event.trigger( type, data, this );
     8270                } );
     8271        },
     8272        triggerHandler: function( type, data ) {
     8273                var elem = this[ 0 ];
     8274                if ( elem ) {
     8275                        return jQuery.event.trigger( type, data, elem, true );
     8276                }
     8277        }
     8278} );
     8279
     8280
     8281jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
     8282        "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
     8283        "change select submit keydown keypress keyup contextmenu" ).split( " " ),
     8284        function( i, name ) {
     8285
     8286        // Handle event binding
     8287        jQuery.fn[ name ] = function( data, fn ) {
     8288                return arguments.length > 0 ?
     8289                        this.on( name, null, data, fn ) :
     8290                        this.trigger( name );
     8291        };
     8292} );
     8293
     8294jQuery.fn.extend( {
     8295        hover: function( fnOver, fnOut ) {
     8296                return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
     8297        }
     8298} );
     8299
     8300
     8301
     8302
     8303support.focusin = "onfocusin" in window;
     8304
     8305
     8306// Support: Firefox <=44
     8307// Firefox doesn't have focus(in | out) events
     8308// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
     8309//
     8310// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
     8311// focus(in | out) events fire after focus & blur events,
     8312// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
     8313// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
     8314if ( !support.focusin ) {
     8315        jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
     8316
     8317                // Attach a single capturing handler on the document while someone wants focusin/focusout
     8318                var handler = function( event ) {
     8319                        jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
     8320                };
     8321
     8322                jQuery.event.special[ fix ] = {
     8323                        setup: function() {
     8324                                var doc = this.ownerDocument || this,
     8325                                        attaches = dataPriv.access( doc, fix );
     8326
     8327                                if ( !attaches ) {
     8328                                        doc.addEventListener( orig, handler, true );
     8329                                }
     8330                                dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
     8331                        },
     8332                        teardown: function() {
     8333                                var doc = this.ownerDocument || this,
     8334                                        attaches = dataPriv.access( doc, fix ) - 1;
     8335
     8336                                if ( !attaches ) {
     8337                                        doc.removeEventListener( orig, handler, true );
     8338                                        dataPriv.remove( doc, fix );
     8339
     8340                                } else {
     8341                                        dataPriv.access( doc, fix, attaches );
     8342                                }
     8343                        }
     8344                };
     8345        } );
     8346}
     8347var location = window.location;
     8348
     8349var nonce = jQuery.now();
     8350
     8351var rquery = ( /\?/ );
     8352
     8353
     8354
     8355// Cross-browser xml parsing
     8356jQuery.parseXML = function( data ) {
     8357        var xml;
     8358        if ( !data || typeof data !== "string" ) {
     8359                return null;
     8360        }
     8361
     8362        // Support: IE 9 - 11 only
     8363        // IE throws on parseFromString with invalid input.
     8364        try {
     8365                xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
     8366        } catch ( e ) {
     8367                xml = undefined;
     8368        }
     8369
     8370        if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
     8371                jQuery.error( "Invalid XML: " + data );
     8372        }
     8373        return xml;
     8374};
     8375
     8376
     8377var
     8378        rbracket = /\[\]$/,
     8379        rCRLF = /\r?\n/g,
     8380        rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
     8381        rsubmittable = /^(?:input|select|textarea|keygen)/i;
     8382
     8383function buildParams( prefix, obj, traditional, add ) {
     8384        var name;
     8385
     8386        if ( Array.isArray( obj ) ) {
     8387
     8388                // Serialize array item.
     8389                jQuery.each( obj, function( i, v ) {
     8390                        if ( traditional || rbracket.test( prefix ) ) {
     8391
     8392                                // Treat each array item as a scalar.
     8393                                add( prefix, v );
     8394
     8395                        } else {
     8396
     8397                                // Item is non-scalar (array or object), encode its numeric index.
     8398                                buildParams(
     8399                                        prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
     8400                                        v,
     8401                                        traditional,
     8402                                        add
     8403                                );
     8404                        }
     8405                } );
     8406
     8407        } else if ( !traditional && jQuery.type( obj ) === "object" ) {
     8408
     8409                // Serialize object item.
     8410                for ( name in obj ) {
     8411                        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
     8412                }
     8413
     8414        } else {
     8415
     8416                // Serialize scalar item.
     8417                add( prefix, obj );
     8418        }
     8419}
     8420
     8421// Serialize an array of form elements or a set of
     8422// key/values into a query string
     8423jQuery.param = function( a, traditional ) {
     8424        var prefix,
     8425                s = [],
     8426                add = function( key, valueOrFunction ) {
     8427
     8428                        // If value is a function, invoke it and use its return value
     8429                        var value = jQuery.isFunction( valueOrFunction ) ?
     8430                                valueOrFunction() :
     8431                                valueOrFunction;
     8432
     8433                        s[ s.length ] = encodeURIComponent( key ) + "=" +
     8434                                encodeURIComponent( value == null ? "" : value );
     8435                };
     8436
     8437        // If an array was passed in, assume that it is an array of form elements.
     8438        if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
     8439
     8440                // Serialize the form elements
     8441                jQuery.each( a, function() {
     8442                        add( this.name, this.value );
     8443                } );
     8444
     8445        } else {
     8446
     8447                // If traditional, encode the "old" way (the way 1.3.2 or older
     8448                // did it), otherwise encode params recursively.
     8449                for ( prefix in a ) {
     8450                        buildParams( prefix, a[ prefix ], traditional, add );
     8451                }
     8452        }
     8453
     8454        // Return the resulting serialization
     8455        return s.join( "&" );
     8456};
     8457
     8458jQuery.fn.extend( {
     8459        serialize: function() {
     8460                return jQuery.param( this.serializeArray() );
     8461        },
     8462        serializeArray: function() {
     8463                return this.map( function() {
     8464
     8465                        // Can add propHook for "elements" to filter or add form elements
     8466                        var elements = jQuery.prop( this, "elements" );
     8467                        return elements ? jQuery.makeArray( elements ) : this;
     8468                } )
     8469                .filter( function() {
     8470                        var type = this.type;
     8471
     8472                        // Use .is( ":disabled" ) so that fieldset[disabled] works
     8473                        return this.name && !jQuery( this ).is( ":disabled" ) &&
     8474                                rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
     8475                                ( this.checked || !rcheckableType.test( type ) );
     8476                } )
     8477                .map( function( i, elem ) {
     8478                        var val = jQuery( this ).val();
     8479
     8480                        if ( val == null ) {
     8481                                return null;
     8482                        }
     8483
     8484                        if ( Array.isArray( val ) ) {
     8485                                return jQuery.map( val, function( val ) {
     8486                                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
     8487                                } );
     8488                        }
     8489
     8490                        return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
     8491                } ).get();
     8492        }
     8493} );
     8494
     8495
     8496var
     8497        r20 = /%20/g,
     8498        rhash = /#.*$/,
     8499        rantiCache = /([?&])_=[^&]*/,
     8500        rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
     8501
     8502        // #7653, #8125, #8152: local protocol detection
     8503        rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
     8504        rnoContent = /^(?:GET|HEAD)$/,
     8505        rprotocol = /^\/\//,
     8506
     8507        /* Prefilters
     8508         * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
     8509         * 2) These are called:
     8510         *    - BEFORE asking for a transport
     8511         *    - AFTER param serialization (s.data is a string if s.processData is true)
     8512         * 3) key is the dataType
     8513         * 4) the catchall symbol "*" can be used
     8514         * 5) execution will start with transport dataType and THEN continue down to "*" if needed
     8515         */
     8516        prefilters = {},
     8517
     8518        /* Transports bindings
     8519         * 1) key is the dataType
     8520         * 2) the catchall symbol "*" can be used
     8521         * 3) selection will start with transport dataType and THEN go to "*" if needed
     8522         */
     8523        transports = {},
     8524
     8525        // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
     8526        allTypes = "*/".concat( "*" ),
     8527
     8528        // Anchor tag for parsing the document origin
     8529        originAnchor = document.createElement( "a" );
     8530        originAnchor.href = location.href;
     8531
     8532// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
     8533function addToPrefiltersOrTransports( structure ) {
     8534
     8535        // dataTypeExpression is optional and defaults to "*"
     8536        return function( dataTypeExpression, func ) {
     8537
     8538                if ( typeof dataTypeExpression !== "string" ) {
     8539                        func = dataTypeExpression;
     8540                        dataTypeExpression = "*";
     8541                }
     8542
     8543                var dataType,
     8544                        i = 0,
     8545                        dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
     8546
     8547                if ( jQuery.isFunction( func ) ) {
     8548
     8549                        // For each dataType in the dataTypeExpression
     8550                        while ( ( dataType = dataTypes[ i++ ] ) ) {
     8551
     8552                                // Prepend if requested
     8553                                if ( dataType[ 0 ] === "+" ) {
     8554                                        dataType = dataType.slice( 1 ) || "*";
     8555                                        ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
     8556
     8557                                // Otherwise append
     8558                                } else {
     8559                                        ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
     8560                                }
     8561                        }
     8562                }
     8563        };
     8564}
     8565
     8566// Base inspection function for prefilters and transports
     8567function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
     8568
     8569        var inspected = {},
     8570                seekingTransport = ( structure === transports );
     8571
     8572        function inspect( dataType ) {
     8573                var selected;
     8574                inspected[ dataType ] = true;
     8575                jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
     8576                        var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
     8577                        if ( typeof dataTypeOrTransport === "string" &&
     8578                                !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
     8579
     8580                                options.dataTypes.unshift( dataTypeOrTransport );
     8581                                inspect( dataTypeOrTransport );
     8582                                return false;
     8583                        } else if ( seekingTransport ) {
     8584                                return !( selected = dataTypeOrTransport );
     8585                        }
     8586                } );
     8587                return selected;
     8588        }
     8589
     8590        return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
     8591}
     8592
     8593// A special extend for ajax options
     8594// that takes "flat" options (not to be deep extended)
     8595// Fixes #9887
     8596function ajaxExtend( target, src ) {
     8597        var key, deep,
     8598                flatOptions = jQuery.ajaxSettings.flatOptions || {};
     8599
     8600        for ( key in src ) {
     8601                if ( src[ key ] !== undefined ) {
     8602                        ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
     8603                }
     8604        }
     8605        if ( deep ) {
     8606                jQuery.extend( true, target, deep );
     8607        }
     8608
     8609        return target;
     8610}
     8611
     8612/* Handles responses to an ajax request:
     8613 * - finds the right dataType (mediates between content-type and expected dataType)
     8614 * - returns the corresponding response
     8615 */
     8616function ajaxHandleResponses( s, jqXHR, responses ) {
     8617
     8618        var ct, type, finalDataType, firstDataType,
     8619                contents = s.contents,
     8620                dataTypes = s.dataTypes;
     8621
     8622        // Remove auto dataType and get content-type in the process
     8623        while ( dataTypes[ 0 ] === "*" ) {
     8624                dataTypes.shift();
     8625                if ( ct === undefined ) {
     8626                        ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
     8627                }
     8628        }
     8629
     8630        // Check if we're dealing with a known content-type
     8631        if ( ct ) {
     8632                for ( type in contents ) {
     8633                        if ( contents[ type ] && contents[ type ].test( ct ) ) {
     8634                                dataTypes.unshift( type );
     8635                                break;
     8636                        }
     8637                }
     8638        }
     8639
     8640        // Check to see if we have a response for the expected dataType
     8641        if ( dataTypes[ 0 ] in responses ) {
     8642                finalDataType = dataTypes[ 0 ];
     8643        } else {
     8644
     8645                // Try convertible dataTypes
     8646                for ( type in responses ) {
     8647                        if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
     8648                                finalDataType = type;
     8649                                break;
     8650                        }
     8651                        if ( !firstDataType ) {
     8652                                firstDataType = type;
     8653                        }
     8654                }
     8655
     8656                // Or just use first one
     8657                finalDataType = finalDataType || firstDataType;
     8658        }
     8659
     8660        // If we found a dataType
     8661        // We add the dataType to the list if needed
     8662        // and return the corresponding response
     8663        if ( finalDataType ) {
     8664                if ( finalDataType !== dataTypes[ 0 ] ) {
     8665                        dataTypes.unshift( finalDataType );
     8666                }
     8667                return responses[ finalDataType ];
     8668        }
     8669}
     8670
     8671/* Chain conversions given the request and the original response
     8672 * Also sets the responseXXX fields on the jqXHR instance
     8673 */
     8674function ajaxConvert( s, response, jqXHR, isSuccess ) {
     8675        var conv2, current, conv, tmp, prev,
     8676                converters = {},
     8677
     8678                // Work with a copy of dataTypes in case we need to modify it for conversion
     8679                dataTypes = s.dataTypes.slice();
     8680
     8681        // Create converters map with lowercased keys
     8682        if ( dataTypes[ 1 ] ) {
     8683                for ( conv in s.converters ) {
     8684                        converters[ conv.toLowerCase() ] = s.converters[ conv ];
     8685                }
     8686        }
     8687
     8688        current = dataTypes.shift();
     8689
     8690        // Convert to each sequential dataType
     8691        while ( current ) {
     8692
     8693                if ( s.responseFields[ current ] ) {
     8694                        jqXHR[ s.responseFields[ current ] ] = response;
     8695                }
     8696
     8697                // Apply the dataFilter if provided
     8698                if ( !prev && isSuccess && s.dataFilter ) {
     8699                        response = s.dataFilter( response, s.dataType );
     8700                }
     8701
     8702                prev = current;
     8703                current = dataTypes.shift();
     8704
     8705                if ( current ) {
     8706
     8707                        // There's only work to do if current dataType is non-auto
     8708                        if ( current === "*" ) {
     8709
     8710                                current = prev;
     8711
     8712                        // Convert response if prev dataType is non-auto and differs from current
     8713                        } else if ( prev !== "*" && prev !== current ) {
     8714
     8715                                // Seek a direct converter
     8716                                conv = converters[ prev + " " + current ] || converters[ "* " + current ];
     8717
     8718                                // If none found, seek a pair
     8719                                if ( !conv ) {
     8720                                        for ( conv2 in converters ) {
     8721
     8722                                                // If conv2 outputs current
     8723                                                tmp = conv2.split( " " );
     8724                                                if ( tmp[ 1 ] === current ) {
     8725
     8726                                                        // If prev can be converted to accepted input
     8727                                                        conv = converters[ prev + " " + tmp[ 0 ] ] ||
     8728                                                                converters[ "* " + tmp[ 0 ] ];
     8729                                                        if ( conv ) {
     8730
     8731                                                                // Condense equivalence converters
     8732                                                                if ( conv === true ) {
     8733                                                                        conv = converters[ conv2 ];
     8734
     8735                                                                // Otherwise, insert the intermediate dataType
     8736                                                                } else if ( converters[ conv2 ] !== true ) {
     8737                                                                        current = tmp[ 0 ];
     8738                                                                        dataTypes.unshift( tmp[ 1 ] );
     8739                                                                }
     8740                                                                break;
     8741                                                        }
     8742                                                }
     8743                                        }
     8744                                }
     8745
     8746                                // Apply converter (if not an equivalence)
     8747                                if ( conv !== true ) {
     8748
     8749                                        // Unless errors are allowed to bubble, catch and return them
     8750                                        if ( conv && s.throws ) {
     8751                                                response = conv( response );
     8752                                        } else {
     8753                                                try {
     8754                                                        response = conv( response );
     8755                                                } catch ( e ) {
     8756                                                        return {
     8757                                                                state: "parsererror",
     8758                                                                error: conv ? e : "No conversion from " + prev + " to " + current
     8759                                                        };
     8760                                                }
     8761                                        }
     8762                                }
     8763                        }
     8764                }
     8765        }
     8766
     8767        return { state: "success", data: response };
     8768}
     8769
     8770jQuery.extend( {
     8771
     8772        // Counter for holding the number of active queries
     8773        active: 0,
     8774
     8775        // Last-Modified header cache for next request
     8776        lastModified: {},
     8777        etag: {},
     8778
     8779        ajaxSettings: {
     8780                url: location.href,
     8781                type: "GET",
     8782                isLocal: rlocalProtocol.test( location.protocol ),
     8783                global: true,
     8784                processData: true,
     8785                async: true,
     8786                contentType: "application/x-www-form-urlencoded; charset=UTF-8",
     8787
     8788                /*
     8789                timeout: 0,
     8790                data: null,
     8791                dataType: null,
     8792                username: null,
     8793                password: null,
     8794                cache: null,
     8795                throws: false,
     8796                traditional: false,
     8797                headers: {},
     8798                */
     8799
     8800                accepts: {
     8801                        "*": allTypes,
     8802                        text: "text/plain",
     8803                        html: "text/html",
     8804                        xml: "application/xml, text/xml",
     8805                        json: "application/json, text/javascript"
     8806                },
     8807
     8808                contents: {
     8809                        xml: /\bxml\b/,
     8810                        html: /\bhtml/,
     8811                        json: /\bjson\b/
     8812                },
     8813
     8814                responseFields: {
     8815                        xml: "responseXML",
     8816                        text: "responseText",
     8817                        json: "responseJSON"
     8818                },
     8819
     8820                // Data converters
     8821                // Keys separate source (or catchall "*") and destination types with a single space
     8822                converters: {
     8823
     8824                        // Convert anything to text
     8825                        "* text": String,
     8826
     8827                        // Text to html (true = no transformation)
     8828                        "text html": true,
     8829
     8830                        // Evaluate text as a json expression
     8831                        "text json": JSON.parse,
     8832
     8833                        // Parse text as xml
     8834                        "text xml": jQuery.parseXML
     8835                },
     8836
     8837                // For options that shouldn't be deep extended:
     8838                // you can add your own custom options here if
     8839                // and when you create one that shouldn't be
     8840                // deep extended (see ajaxExtend)
     8841                flatOptions: {
     8842                        url: true,
     8843                        context: true
     8844                }
     8845        },
     8846
     8847        // Creates a full fledged settings object into target
     8848        // with both ajaxSettings and settings fields.
     8849        // If target is omitted, writes into ajaxSettings.
     8850        ajaxSetup: function( target, settings ) {
     8851                return settings ?
     8852
     8853                        // Building a settings object
     8854                        ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
     8855
     8856                        // Extending ajaxSettings
     8857                        ajaxExtend( jQuery.ajaxSettings, target );
     8858        },
     8859
     8860        ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
     8861        ajaxTransport: addToPrefiltersOrTransports( transports ),
     8862
     8863        // Main method
     8864        ajax: function( url, options ) {
     8865
     8866                // If url is an object, simulate pre-1.5 signature
     8867                if ( typeof url === "object" ) {
     8868                        options = url;
     8869                        url = undefined;
     8870                }
     8871
     8872                // Force options to be an object
     8873                options = options || {};
     8874
     8875                var transport,
     8876
     8877                        // URL without anti-cache param
     8878                        cacheURL,
     8879
     8880                        // Response headers
     8881                        responseHeadersString,
     8882                        responseHeaders,
     8883
     8884                        // timeout handle
     8885                        timeoutTimer,
     8886
     8887                        // Url cleanup var
     8888                        urlAnchor,
     8889
     8890                        // Request state (becomes false upon send and true upon completion)
     8891                        completed,
     8892
     8893                        // To know if global events are to be dispatched
     8894                        fireGlobals,
     8895
     8896                        // Loop variable
     8897                        i,
     8898
     8899                        // uncached part of the url
     8900                        uncached,
     8901
     8902                        // Create the final options object
     8903                        s = jQuery.ajaxSetup( {}, options ),
     8904
     8905                        // Callbacks context
     8906                        callbackContext = s.context || s,
     8907
     8908                        // Context for global events is callbackContext if it is a DOM node or jQuery collection
     8909                        globalEventContext = s.context &&
     8910                                ( callbackContext.nodeType || callbackContext.jquery ) ?
     8911                                        jQuery( callbackContext ) :
     8912                                        jQuery.event,
     8913
     8914                        // Deferreds
     8915                        deferred = jQuery.Deferred(),
     8916                        completeDeferred = jQuery.Callbacks( "once memory" ),
     8917
     8918                        // Status-dependent callbacks
     8919                        statusCode = s.statusCode || {},
     8920
     8921                        // Headers (they are sent all at once)
     8922                        requestHeaders = {},
     8923                        requestHeadersNames = {},
     8924
     8925                        // Default abort message
     8926                        strAbort = "canceled",
     8927
     8928                        // Fake xhr
     8929                        jqXHR = {
     8930                                readyState: 0,
     8931
     8932                                // Builds headers hashtable if needed
     8933                                getResponseHeader: function( key ) {
     8934                                        var match;
     8935                                        if ( completed ) {
     8936                                                if ( !responseHeaders ) {
     8937                                                        responseHeaders = {};
     8938                                                        while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
     8939                                                                responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
     8940                                                        }
     8941                                                }
     8942                                                match = responseHeaders[ key.toLowerCase() ];
     8943                                        }
     8944                                        return match == null ? null : match;
     8945                                },
     8946
     8947                                // Raw string
     8948                                getAllResponseHeaders: function() {
     8949                                        return completed ? responseHeadersString : null;
     8950                                },
     8951
     8952                                // Caches the header
     8953                                setRequestHeader: function( name, value ) {
     8954                                        if ( completed == null ) {
     8955                                                name = requestHeadersNames[ name.toLowerCase() ] =
     8956                                                        requestHeadersNames[ name.toLowerCase() ] || name;
     8957                                                requestHeaders[ name ] = value;
     8958                                        }
     8959                                        return this;
     8960                                },
     8961
     8962                                // Overrides response content-type header
     8963                                overrideMimeType: function( type ) {
     8964                                        if ( completed == null ) {
     8965                                                s.mimeType = type;
     8966                                        }
     8967                                        return this;
     8968                                },
     8969
     8970                                // Status-dependent callbacks
     8971                                statusCode: function( map ) {
     8972                                        var code;
     8973                                        if ( map ) {
     8974                                                if ( completed ) {
     8975
     8976                                                        // Execute the appropriate callbacks
     8977                                                        jqXHR.always( map[ jqXHR.status ] );
     8978                                                } else {
     8979
     8980                                                        // Lazy-add the new callbacks in a way that preserves old ones
     8981                                                        for ( code in map ) {
     8982                                                                statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
     8983                                                        }
     8984                                                }
     8985                                        }
     8986                                        return this;
     8987                                },
     8988
     8989                                // Cancel the request
     8990                                abort: function( statusText ) {
     8991                                        var finalText = statusText || strAbort;
     8992                                        if ( transport ) {
     8993                                                transport.abort( finalText );
     8994                                        }
     8995                                        done( 0, finalText );
     8996                                        return this;
     8997                                }
     8998                        };
     8999
     9000                // Attach deferreds
     9001                deferred.promise( jqXHR );
     9002
     9003                // Add protocol if not provided (prefilters might expect it)
     9004                // Handle falsy url in the settings object (#10093: consistency with old signature)
     9005                // We also use the url parameter if available
     9006                s.url = ( ( url || s.url || location.href ) + "" )
     9007                        .replace( rprotocol, location.protocol + "//" );
     9008
     9009                // Alias method option to type as per ticket #12004
     9010                s.type = options.method || options.type || s.method || s.type;
     9011
     9012                // Extract dataTypes list
     9013                s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
     9014
     9015                // A cross-domain request is in order when the origin doesn't match the current origin.
     9016                if ( s.crossDomain == null ) {
     9017                        urlAnchor = document.createElement( "a" );
     9018
     9019                        // Support: IE <=8 - 11, Edge 12 - 13
     9020                        // IE throws exception on accessing the href property if url is malformed,
     9021                        // e.g. http://example.com:80x/
     9022                        try {
     9023                                urlAnchor.href = s.url;
     9024
     9025                                // Support: IE <=8 - 11 only
     9026                                // Anchor's host property isn't correctly set when s.url is relative
     9027                                urlAnchor.href = urlAnchor.href;
     9028                                s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
     9029                                        urlAnchor.protocol + "//" + urlAnchor.host;
     9030                        } catch ( e ) {
     9031
     9032                                // If there is an error parsing the URL, assume it is crossDomain,
     9033                                // it can be rejected by the transport if it is invalid
     9034                                s.crossDomain = true;
     9035                        }
     9036                }
     9037
     9038                // Convert data if not already a string
     9039                if ( s.data && s.processData && typeof s.data !== "string" ) {
     9040                        s.data = jQuery.param( s.data, s.traditional );
     9041                }
     9042
     9043                // Apply prefilters
     9044                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
     9045
     9046                // If request was aborted inside a prefilter, stop there
     9047                if ( completed ) {
     9048                        return jqXHR;
     9049                }
     9050
     9051                // We can fire global events as of now if asked to
     9052                // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
     9053                fireGlobals = jQuery.event && s.global;
     9054
     9055                // Watch for a new set of requests
     9056                if ( fireGlobals && jQuery.active++ === 0 ) {
     9057                        jQuery.event.trigger( "ajaxStart" );
     9058                }
     9059
     9060                // Uppercase the type
     9061                s.type = s.type.toUpperCase();
     9062
     9063                // Determine if request has content
     9064                s.hasContent = !rnoContent.test( s.type );
     9065
     9066                // Save the URL in case we're toying with the If-Modified-Since
     9067                // and/or If-None-Match header later on
     9068                // Remove hash to simplify url manipulation
     9069                cacheURL = s.url.replace( rhash, "" );
     9070
     9071                // More options handling for requests with no content
     9072                if ( !s.hasContent ) {
     9073
     9074                        // Remember the hash so we can put it back
     9075                        uncached = s.url.slice( cacheURL.length );
     9076
     9077                        // If data is available, append data to url
     9078                        if ( s.data ) {
     9079                                cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
     9080
     9081                                // #9682: remove data so that it's not used in an eventual retry
     9082                                delete s.data;
     9083                        }
     9084
     9085                        // Add or update anti-cache param if needed
     9086                        if ( s.cache === false ) {
     9087                                cacheURL = cacheURL.replace( rantiCache, "$1" );
     9088                                uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
     9089                        }
     9090
     9091                        // Put hash and anti-cache on the URL that will be requested (gh-1732)
     9092                        s.url = cacheURL + uncached;
     9093
     9094                // Change '%20' to '+' if this is encoded form body content (gh-2658)
     9095                } else if ( s.data && s.processData &&
     9096                        ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
     9097                        s.data = s.data.replace( r20, "+" );
     9098                }
     9099
     9100                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
     9101                if ( s.ifModified ) {
     9102                        if ( jQuery.lastModified[ cacheURL ] ) {
     9103                                jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
     9104                        }
     9105                        if ( jQuery.etag[ cacheURL ] ) {
     9106                                jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
     9107                        }
     9108                }
     9109
     9110                // Set the correct header, if data is being sent
     9111                if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
     9112                        jqXHR.setRequestHeader( "Content-Type", s.contentType );
     9113                }
     9114
     9115                // Set the Accepts header for the server, depending on the dataType
     9116                jqXHR.setRequestHeader(
     9117                        "Accept",
     9118                        s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
     9119                                s.accepts[ s.dataTypes[ 0 ] ] +
     9120                                        ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
     9121                                s.accepts[ "*" ]
     9122                );
     9123
     9124                // Check for headers option
     9125                for ( i in s.headers ) {
     9126                        jqXHR.setRequestHeader( i, s.headers[ i ] );
     9127                }
     9128
     9129                // Allow custom headers/mimetypes and early abort
     9130                if ( s.beforeSend &&
     9131                        ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
     9132
     9133                        // Abort if not done already and return
     9134                        return jqXHR.abort();
     9135                }
     9136
     9137                // Aborting is no longer a cancellation
     9138                strAbort = "abort";
     9139
     9140                // Install callbacks on deferreds
     9141                completeDeferred.add( s.complete );
     9142                jqXHR.done( s.success );
     9143                jqXHR.fail( s.error );
     9144
     9145                // Get transport
     9146                transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
     9147
     9148                // If no transport, we auto-abort
     9149                if ( !transport ) {
     9150                        done( -1, "No Transport" );
     9151                } else {
     9152                        jqXHR.readyState = 1;
     9153
     9154                        // Send global event
     9155                        if ( fireGlobals ) {
     9156                                globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
     9157                        }
     9158
     9159                        // If request was aborted inside ajaxSend, stop there
     9160                        if ( completed ) {
     9161                                return jqXHR;
     9162                        }
     9163
     9164                        // Timeout
     9165                        if ( s.async && s.timeout > 0 ) {
     9166                                timeoutTimer = window.setTimeout( function() {
     9167                                        jqXHR.abort( "timeout" );
     9168                                }, s.timeout );
     9169                        }
     9170
     9171                        try {
     9172                                completed = false;
     9173                                transport.send( requestHeaders, done );
     9174                        } catch ( e ) {
     9175
     9176                                // Rethrow post-completion exceptions
     9177                                if ( completed ) {
     9178                                        throw e;
     9179                                }
     9180
     9181                                // Propagate others as results
     9182                                done( -1, e );
     9183                        }
     9184                }
     9185
     9186                // Callback for when everything is done
     9187                function done( status, nativeStatusText, responses, headers ) {
     9188                        var isSuccess, success, error, response, modified,
     9189                                statusText = nativeStatusText;
     9190
     9191                        // Ignore repeat invocations
     9192                        if ( completed ) {
     9193                                return;
     9194                        }
     9195
     9196                        completed = true;
     9197
     9198                        // Clear timeout if it exists
     9199                        if ( timeoutTimer ) {
     9200                                window.clearTimeout( timeoutTimer );
     9201                        }
     9202
     9203                        // Dereference transport for early garbage collection
     9204                        // (no matter how long the jqXHR object will be used)
     9205                        transport = undefined;
     9206
     9207                        // Cache response headers
     9208                        responseHeadersString = headers || "";
     9209
     9210                        // Set readyState
     9211                        jqXHR.readyState = status > 0 ? 4 : 0;
     9212
     9213                        // Determine if successful
     9214                        isSuccess = status >= 200 && status < 300 || status === 304;
     9215
     9216                        // Get response data
     9217                        if ( responses ) {
     9218                                response = ajaxHandleResponses( s, jqXHR, responses );
     9219                        }
     9220
     9221                        // Convert no matter what (that way responseXXX fields are always set)
     9222                        response = ajaxConvert( s, response, jqXHR, isSuccess );
     9223
     9224                        // If successful, handle type chaining
     9225                        if ( isSuccess ) {
     9226
     9227                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
     9228                                if ( s.ifModified ) {
     9229                                        modified = jqXHR.getResponseHeader( "Last-Modified" );
     9230                                        if ( modified ) {
     9231                                                jQuery.lastModified[ cacheURL ] = modified;
     9232                                        }
     9233                                        modified = jqXHR.getResponseHeader( "etag" );
     9234                                        if ( modified ) {
     9235                                                jQuery.etag[ cacheURL ] = modified;
     9236                                        }
     9237                                }
     9238
     9239                                // if no content
     9240                                if ( status === 204 || s.type === "HEAD" ) {
     9241                                        statusText = "nocontent";
     9242
     9243                                // if not modified
     9244                                } else if ( status === 304 ) {
     9245                                        statusText = "notmodified";
     9246
     9247                                // If we have data, let's convert it
     9248                                } else {
     9249                                        statusText = response.state;
     9250                                        success = response.data;
     9251                                        error = response.error;
     9252                                        isSuccess = !error;
     9253                                }
     9254                        } else {
     9255
     9256                                // Extract error from statusText and normalize for non-aborts
     9257                                error = statusText;
     9258                                if ( status || !statusText ) {
     9259                                        statusText = "error";
     9260                                        if ( status < 0 ) {
     9261                                                status = 0;
     9262                                        }
     9263                                }
     9264                        }
     9265
     9266                        // Set data for the fake xhr object
     9267                        jqXHR.status = status;
     9268                        jqXHR.statusText = ( nativeStatusText || statusText ) + "";
     9269
     9270                        // Success/Error
     9271                        if ( isSuccess ) {
     9272                                deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
     9273                        } else {
     9274                                deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
     9275                        }
     9276
     9277                        // Status-dependent callbacks
     9278                        jqXHR.statusCode( statusCode );
     9279                        statusCode = undefined;
     9280
     9281                        if ( fireGlobals ) {
     9282                                globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
     9283                                        [ jqXHR, s, isSuccess ? success : error ] );
     9284                        }
     9285
     9286                        // Complete
     9287                        completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
     9288
     9289                        if ( fireGlobals ) {
     9290                                globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
     9291
     9292                                // Handle the global AJAX counter
     9293                                if ( !( --jQuery.active ) ) {
     9294                                        jQuery.event.trigger( "ajaxStop" );
     9295                                }
     9296                        }
     9297                }
     9298
     9299                return jqXHR;
     9300        },
     9301
     9302        getJSON: function( url, data, callback ) {
     9303                return jQuery.get( url, data, callback, "json" );
     9304        },
     9305
     9306        getScript: function( url, callback ) {
     9307                return jQuery.get( url, undefined, callback, "script" );
     9308        }
     9309} );
     9310
     9311jQuery.each( [ "get", "post" ], function( i, method ) {
     9312        jQuery[ method ] = function( url, data, callback, type ) {
     9313
     9314                // Shift arguments if data argument was omitted
     9315                if ( jQuery.isFunction( data ) ) {
     9316                        type = type || callback;
     9317                        callback = data;
     9318                        data = undefined;
     9319                }
     9320
     9321                // The url can be an options object (which then must have .url)
     9322                return jQuery.ajax( jQuery.extend( {
     9323                        url: url,
     9324                        type: method,
     9325                        dataType: type,
     9326                        data: data,
     9327                        success: callback
     9328                }, jQuery.isPlainObject( url ) && url ) );
     9329        };
     9330} );
     9331
     9332
     9333jQuery._evalUrl = function( url ) {
     9334        return jQuery.ajax( {
     9335                url: url,
     9336
     9337                // Make this explicit, since user can override this through ajaxSetup (#11264)
     9338                type: "GET",
     9339                dataType: "script",
     9340                cache: true,
     9341                async: false,
     9342                global: false,
     9343                "throws": true
     9344        } );
     9345};
     9346
     9347
     9348jQuery.fn.extend( {
     9349        wrapAll: function( html ) {
     9350                var wrap;
     9351
     9352                if ( this[ 0 ] ) {
     9353                        if ( jQuery.isFunction( html ) ) {
     9354                                html = html.call( this[ 0 ] );
     9355                        }
     9356
     9357                        // The elements to wrap the target around
     9358                        wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
     9359
     9360                        if ( this[ 0 ].parentNode ) {
     9361                                wrap.insertBefore( this[ 0 ] );
     9362                        }
     9363
     9364                        wrap.map( function() {
     9365                                var elem = this;
     9366
     9367                                while ( elem.firstElementChild ) {
     9368                                        elem = elem.firstElementChild;
     9369                                }
     9370
     9371                                return elem;
     9372                        } ).append( this );
     9373                }
     9374
     9375                return this;
     9376        },
     9377
     9378        wrapInner: function( html ) {
     9379                if ( jQuery.isFunction( html ) ) {
     9380                        return this.each( function( i ) {
     9381                                jQuery( this ).wrapInner( html.call( this, i ) );
     9382                        } );
     9383                }
     9384
     9385                return this.each( function() {
     9386                        var self = jQuery( this ),
     9387                                contents = self.contents();
     9388
     9389                        if ( contents.length ) {
     9390                                contents.wrapAll( html );
     9391
     9392                        } else {
     9393                                self.append( html );
     9394                        }
     9395                } );
     9396        },
     9397
     9398        wrap: function( html ) {
     9399                var isFunction = jQuery.isFunction( html );
     9400
     9401                return this.each( function( i ) {
     9402                        jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
     9403                } );
     9404        },
     9405
     9406        unwrap: function( selector ) {
     9407                this.parent( selector ).not( "body" ).each( function() {
     9408                        jQuery( this ).replaceWith( this.childNodes );
     9409                } );
     9410                return this;
     9411        }
     9412} );
     9413
     9414
     9415jQuery.expr.pseudos.hidden = function( elem ) {
     9416        return !jQuery.expr.pseudos.visible( elem );
     9417};
     9418jQuery.expr.pseudos.visible = function( elem ) {
     9419        return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
     9420};
     9421
     9422
     9423
     9424
     9425jQuery.ajaxSettings.xhr = function() {
     9426        try {
     9427                return new window.XMLHttpRequest();
     9428        } catch ( e ) {}
     9429};
     9430
     9431var xhrSuccessStatus = {
     9432
     9433                // File protocol always yields status code 0, assume 200
     9434                0: 200,
     9435
     9436                // Support: IE <=9 only
     9437                // #1450: sometimes IE returns 1223 when it should be 204
     9438                1223: 204
     9439        },
     9440        xhrSupported = jQuery.ajaxSettings.xhr();
     9441
     9442support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
     9443support.ajax = xhrSupported = !!xhrSupported;
     9444
     9445jQuery.ajaxTransport( function( options ) {
     9446        var callback, errorCallback;
     9447
     9448        // Cross domain only allowed if supported through XMLHttpRequest
     9449        if ( support.cors || xhrSupported && !options.crossDomain ) {
     9450                return {
     9451                        send: function( headers, complete ) {
     9452                                var i,
     9453                                        xhr = options.xhr();
     9454
     9455                                xhr.open(
     9456                                        options.type,
     9457                                        options.url,
     9458                                        options.async,
     9459                                        options.username,
     9460                                        options.password
     9461                                );
     9462
     9463                                // Apply custom fields if provided
     9464                                if ( options.xhrFields ) {
     9465                                        for ( i in options.xhrFields ) {
     9466                                                xhr[ i ] = options.xhrFields[ i ];
     9467                                        }
     9468                                }
     9469
     9470                                // Override mime type if needed
     9471                                if ( options.mimeType && xhr.overrideMimeType ) {
     9472                                        xhr.overrideMimeType( options.mimeType );
     9473                                }
     9474
     9475                                // X-Requested-With header
     9476                                // For cross-domain requests, seeing as conditions for a preflight are
     9477                                // akin to a jigsaw puzzle, we simply never set it to be sure.
     9478                                // (it can always be set on a per-request basis or even using ajaxSetup)
     9479                                // For same-domain requests, won't change header if already provided.
     9480                                if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
     9481                                        headers[ "X-Requested-With" ] = "XMLHttpRequest";
     9482                                }
     9483
     9484                                // Set headers
     9485                                for ( i in headers ) {
     9486                                        xhr.setRequestHeader( i, headers[ i ] );
     9487                                }
     9488
     9489                                // Callback
     9490                                callback = function( type ) {
     9491                                        return function() {
     9492                                                if ( callback ) {
     9493                                                        callback = errorCallback = xhr.onload =
     9494                                                                xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
     9495
     9496                                                        if ( type === "abort" ) {
     9497                                                                xhr.abort();
     9498                                                        } else if ( type === "error" ) {
     9499
     9500                                                                // Support: IE <=9 only
     9501                                                                // On a manual native abort, IE9 throws
     9502                                                                // errors on any property access that is not readyState
     9503                                                                if ( typeof xhr.status !== "number" ) {
     9504                                                                        complete( 0, "error" );
     9505                                                                } else {
     9506                                                                        complete(
     9507
     9508                                                                                // File: protocol always yields status 0; see #8605, #14207
     9509                                                                                xhr.status,
     9510                                                                                xhr.statusText
     9511                                                                        );
     9512                                                                }
     9513                                                        } else {
     9514                                                                complete(
     9515                                                                        xhrSuccessStatus[ xhr.status ] || xhr.status,
     9516                                                                        xhr.statusText,
     9517
     9518                                                                        // Support: IE <=9 only
     9519                                                                        // IE9 has no XHR2 but throws on binary (trac-11426)
     9520                                                                        // For XHR2 non-text, let the caller handle it (gh-2498)
     9521                                                                        ( xhr.responseType || "text" ) !== "text"  ||
     9522                                                                        typeof xhr.responseText !== "string" ?
     9523                                                                                { binary: xhr.response } :
     9524                                                                                { text: xhr.responseText },
     9525                                                                        xhr.getAllResponseHeaders()
     9526                                                                );
     9527                                                        }
     9528                                                }
     9529                                        };
     9530                                };
     9531
     9532                                // Listen to events
     9533                                xhr.onload = callback();
     9534                                errorCallback = xhr.onerror = callback( "error" );
     9535
     9536                                // Support: IE 9 only
     9537                                // Use onreadystatechange to replace onabort
     9538                                // to handle uncaught aborts
     9539                                if ( xhr.onabort !== undefined ) {
     9540                                        xhr.onabort = errorCallback;
     9541                                } else {
     9542                                        xhr.onreadystatechange = function() {
     9543
     9544                                                // Check readyState before timeout as it changes
     9545                                                if ( xhr.readyState === 4 ) {
     9546
     9547                                                        // Allow onerror to be called first,
     9548                                                        // but that will not handle a native abort
     9549                                                        // Also, save errorCallback to a variable
     9550                                                        // as xhr.onerror cannot be accessed
     9551                                                        window.setTimeout( function() {
     9552                                                                if ( callback ) {
     9553                                                                        errorCallback();
     9554                                                                }
     9555                                                        } );
     9556                                                }
     9557                                        };
     9558                                }
     9559
     9560                                // Create the abort callback
     9561                                callback = callback( "abort" );
     9562
     9563                                try {
     9564
     9565                                        // Do send the request (this may raise an exception)
     9566                                        xhr.send( options.hasContent && options.data || null );
     9567                                } catch ( e ) {
     9568
     9569                                        // #14683: Only rethrow if this hasn't been notified as an error yet
     9570                                        if ( callback ) {
     9571                                                throw e;
     9572                                        }
     9573                                }
     9574                        },
     9575
     9576                        abort: function() {
     9577                                if ( callback ) {
     9578                                        callback();
     9579                                }
     9580                        }
     9581                };
     9582        }
     9583} );
     9584
     9585
     9586
     9587
     9588// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
     9589jQuery.ajaxPrefilter( function( s ) {
     9590        if ( s.crossDomain ) {
     9591                s.contents.script = false;
     9592        }
     9593} );
     9594
     9595// Install script dataType
     9596jQuery.ajaxSetup( {
     9597        accepts: {
     9598                script: "text/javascript, application/javascript, " +
     9599                        "application/ecmascript, application/x-ecmascript"
     9600        },
     9601        contents: {
     9602                script: /\b(?:java|ecma)script\b/
     9603        },
     9604        converters: {
     9605                "text script": function( text ) {
     9606                        jQuery.globalEval( text );
     9607                        return text;
     9608                }
     9609        }
     9610} );
     9611
     9612// Handle cache's special case and crossDomain
     9613jQuery.ajaxPrefilter( "script", function( s ) {
     9614        if ( s.cache === undefined ) {
     9615                s.cache = false;
     9616        }
     9617        if ( s.crossDomain ) {
     9618                s.type = "GET";
     9619        }
     9620} );
     9621
     9622// Bind script tag hack transport
     9623jQuery.ajaxTransport( "script", function( s ) {
     9624
     9625        // This transport only deals with cross domain requests
     9626        if ( s.crossDomain ) {
     9627                var script, callback;
     9628                return {
     9629                        send: function( _, complete ) {
     9630                                script = jQuery( "<script>" ).prop( {
     9631                                        charset: s.scriptCharset,
     9632                                        src: s.url
     9633                                } ).on(
     9634                                        "load error",
     9635                                        callback = function( evt ) {
     9636                                                script.remove();
     9637                                                callback = null;
     9638                                                if ( evt ) {
     9639                                                        complete( evt.type === "error" ? 404 : 200, evt.type );
     9640                                                }
     9641                                        }
     9642                                );
     9643
     9644                                // Use native DOM manipulation to avoid our domManip AJAX trickery
     9645                                document.head.appendChild( script[ 0 ] );
     9646                        },
     9647                        abort: function() {
     9648                                if ( callback ) {
     9649                                        callback();
     9650                                }
     9651                        }
     9652                };
     9653        }
     9654} );
     9655
     9656
     9657
     9658
     9659var oldCallbacks = [],
     9660        rjsonp = /(=)\?(?=&|$)|\?\?/;
     9661
     9662// Default jsonp settings
     9663jQuery.ajaxSetup( {
     9664        jsonp: "callback",
     9665        jsonpCallback: function() {
     9666                var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
     9667                this[ callback ] = true;
     9668                return callback;
     9669        }
     9670} );
     9671
     9672// Detect, normalize options and install callbacks for jsonp requests
     9673jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
     9674
     9675        var callbackName, overwritten, responseContainer,
     9676                jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
     9677                        "url" :
     9678                        typeof s.data === "string" &&
     9679                                ( s.contentType || "" )
     9680                                        .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
     9681                                rjsonp.test( s.data ) && "data"
     9682                );
     9683
     9684        // Handle iff the expected data type is "jsonp" or we have a parameter to set
     9685        if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
     9686
     9687                // Get callback name, remembering preexisting value associated with it
     9688                callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
     9689                        s.jsonpCallback() :
     9690                        s.jsonpCallback;
     9691
     9692                // Insert callback into url or form data
     9693                if ( jsonProp ) {
     9694                        s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
     9695                } else if ( s.jsonp !== false ) {
     9696                        s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
     9697                }
     9698
     9699                // Use data converter to retrieve json after script execution
     9700                s.converters[ "script json" ] = function() {
     9701                        if ( !responseContainer ) {
     9702                                jQuery.error( callbackName + " was not called" );
     9703                        }
     9704                        return responseContainer[ 0 ];
     9705                };
     9706
     9707                // Force json dataType
     9708                s.dataTypes[ 0 ] = "json";
     9709
     9710                // Install callback
     9711                overwritten = window[ callbackName ];
     9712                window[ callbackName ] = function() {
     9713                        responseContainer = arguments;
     9714                };
     9715
     9716                // Clean-up function (fires after converters)
     9717                jqXHR.always( function() {
     9718
     9719                        // If previous value didn't exist - remove it
     9720                        if ( overwritten === undefined ) {
     9721                                jQuery( window ).removeProp( callbackName );
     9722
     9723                        // Otherwise restore preexisting value
     9724                        } else {
     9725                                window[ callbackName ] = overwritten;
     9726                        }
     9727
     9728                        // Save back as free
     9729                        if ( s[ callbackName ] ) {
     9730
     9731                                // Make sure that re-using the options doesn't screw things around
     9732                                s.jsonpCallback = originalSettings.jsonpCallback;
     9733
     9734                                // Save the callback name for future use
     9735                                oldCallbacks.push( callbackName );
     9736                        }
     9737
     9738                        // Call if it was a function and we have a response
     9739                        if ( responseContainer && jQuery.isFunction( overwritten ) ) {
     9740                                overwritten( responseContainer[ 0 ] );
     9741                        }
     9742
     9743                        responseContainer = overwritten = undefined;
     9744                } );
     9745
     9746                // Delegate to script
     9747                return "script";
     9748        }
     9749} );
     9750
     9751
     9752
     9753
     9754// Support: Safari 8 only
     9755// In Safari 8 documents created via document.implementation.createHTMLDocument
     9756// collapse sibling forms: the second one becomes a child of the first one.
     9757// Because of that, this security measure has to be disabled in Safari 8.
     9758// https://bugs.webkit.org/show_bug.cgi?id=137337
     9759support.createHTMLDocument = ( function() {
     9760        var body = document.implementation.createHTMLDocument( "" ).body;
     9761        body.innerHTML = "<form></form><form></form>";
     9762        return body.childNodes.length === 2;
     9763} )();
     9764
     9765
     9766// Argument "data" should be string of html
     9767// context (optional): If specified, the fragment will be created in this context,
     9768// defaults to document
     9769// keepScripts (optional): If true, will include scripts passed in the html string
     9770jQuery.parseHTML = function( data, context, keepScripts ) {
     9771        if ( typeof data !== "string" ) {
     9772                return [];
     9773        }
     9774        if ( typeof context === "boolean" ) {
     9775                keepScripts = context;
     9776                context = false;
     9777        }
     9778
     9779        var base, parsed, scripts;
     9780
     9781        if ( !context ) {
     9782
     9783                // Stop scripts or inline event handlers from being executed immediately
     9784                // by using document.implementation
     9785                if ( support.createHTMLDocument ) {
     9786                        context = document.implementation.createHTMLDocument( "" );
     9787
     9788                        // Set the base href for the created document
     9789                        // so any parsed elements with URLs
     9790                        // are based on the document's URL (gh-2965)
     9791                        base = context.createElement( "base" );
     9792                        base.href = document.location.href;
     9793                        context.head.appendChild( base );
     9794                } else {
     9795                        context = document;
     9796                }
     9797        }
     9798
     9799        parsed = rsingleTag.exec( data );
     9800        scripts = !keepScripts && [];
     9801
     9802        // Single tag
     9803        if ( parsed ) {
     9804                return [ context.createElement( parsed[ 1 ] ) ];
     9805        }
     9806
     9807        parsed = buildFragment( [ data ], context, scripts );
     9808
     9809        if ( scripts && scripts.length ) {
     9810                jQuery( scripts ).remove();
     9811        }
     9812
     9813        return jQuery.merge( [], parsed.childNodes );
     9814};
     9815
     9816
     9817/**
     9818 * Load a url into a page
     9819 */
     9820jQuery.fn.load = function( url, params, callback ) {
     9821        var selector, type, response,
     9822                self = this,
     9823                off = url.indexOf( " " );
     9824
     9825        if ( off > -1 ) {
     9826                selector = stripAndCollapse( url.slice( off ) );
     9827                url = url.slice( 0, off );
     9828        }
     9829
     9830        // If it's a function
     9831        if ( jQuery.isFunction( params ) ) {
     9832
     9833                // We assume that it's the callback
     9834                callback = params;
     9835                params = undefined;
     9836
     9837        // Otherwise, build a param string
     9838        } else if ( params && typeof params === "object" ) {
     9839                type = "POST";
     9840        }
     9841
     9842        // If we have elements to modify, make the request
     9843        if ( self.length > 0 ) {
     9844                jQuery.ajax( {
     9845                        url: url,
     9846
     9847                        // If "type" variable is undefined, then "GET" method will be used.
     9848                        // Make value of this field explicit since
     9849                        // user can override it through ajaxSetup method
     9850                        type: type || "GET",
     9851                        dataType: "html",
     9852                        data: params
     9853                } ).done( function( responseText ) {
     9854
     9855                        // Save response for use in complete callback
     9856                        response = arguments;
     9857
     9858                        self.html( selector ?
     9859
     9860                                // If a selector was specified, locate the right elements in a dummy div
     9861                                // Exclude scripts to avoid IE 'Permission Denied' errors
     9862                                jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
     9863
     9864                                // Otherwise use the full result
     9865                                responseText );
     9866
     9867                // If the request succeeds, this function gets "data", "status", "jqXHR"
     9868                // but they are ignored because response was set above.
     9869                // If it fails, this function gets "jqXHR", "status", "error"
     9870                } ).always( callback && function( jqXHR, status ) {
     9871                        self.each( function() {
     9872                                callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
     9873                        } );
     9874                } );
     9875        }
     9876
     9877        return this;
     9878};
     9879
     9880
     9881
     9882
     9883// Attach a bunch of functions for handling common AJAX events
     9884jQuery.each( [
     9885        "ajaxStart",
     9886        "ajaxStop",
     9887        "ajaxComplete",
     9888        "ajaxError",
     9889        "ajaxSuccess",
     9890        "ajaxSend"
     9891], function( i, type ) {
     9892        jQuery.fn[ type ] = function( fn ) {
     9893                return this.on( type, fn );
     9894        };
     9895} );
     9896
     9897
     9898
     9899
     9900jQuery.expr.pseudos.animated = function( elem ) {
     9901        return jQuery.grep( jQuery.timers, function( fn ) {
     9902                return elem === fn.elem;
     9903        } ).length;
     9904};
     9905
     9906
     9907
     9908
     9909jQuery.offset = {
     9910        setOffset: function( elem, options, i ) {
     9911                var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
     9912                        position = jQuery.css( elem, "position" ),
     9913                        curElem = jQuery( elem ),
     9914                        props = {};
     9915
     9916                // Set position first, in-case top/left are set even on static elem
     9917                if ( position === "static" ) {
     9918                        elem.style.position = "relative";
     9919                }
     9920
     9921                curOffset = curElem.offset();
     9922                curCSSTop = jQuery.css( elem, "top" );
     9923                curCSSLeft = jQuery.css( elem, "left" );
     9924                calculatePosition = ( position === "absolute" || position === "fixed" ) &&
     9925                        ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
     9926
     9927                // Need to be able to calculate position if either
     9928                // top or left is auto and position is either absolute or fixed
     9929                if ( calculatePosition ) {
     9930                        curPosition = curElem.position();
     9931                        curTop = curPosition.top;
     9932                        curLeft = curPosition.left;
     9933
     9934                } else {
     9935                        curTop = parseFloat( curCSSTop ) || 0;
     9936                        curLeft = parseFloat( curCSSLeft ) || 0;
     9937                }
     9938
     9939                if ( jQuery.isFunction( options ) ) {
     9940
     9941                        // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
     9942                        options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
     9943                }
     9944
     9945                if ( options.top != null ) {
     9946                        props.top = ( options.top - curOffset.top ) + curTop;
     9947                }
     9948                if ( options.left != null ) {
     9949                        props.left = ( options.left - curOffset.left ) + curLeft;
     9950                }
     9951
     9952                if ( "using" in options ) {
     9953                        options.using.call( elem, props );
     9954
     9955                } else {
     9956                        curElem.css( props );
     9957                }
     9958        }
     9959};
     9960
     9961jQuery.fn.extend( {
     9962        offset: function( options ) {
     9963
     9964                // Preserve chaining for setter
     9965                if ( arguments.length ) {
     9966                        return options === undefined ?
     9967                                this :
     9968                                this.each( function( i ) {
     9969                                        jQuery.offset.setOffset( this, options, i );
     9970                                } );
     9971                }
     9972
     9973                var doc, docElem, rect, win,
     9974                        elem = this[ 0 ];
     9975
     9976                if ( !elem ) {
     9977                        return;
     9978                }
     9979
     9980                // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
     9981                // Support: IE <=11 only
     9982                // Running getBoundingClientRect on a
     9983                // disconnected node in IE throws an error
     9984                if ( !elem.getClientRects().length ) {
     9985                        return { top: 0, left: 0 };
     9986                }
     9987
     9988                rect = elem.getBoundingClientRect();
     9989
     9990                doc = elem.ownerDocument;
     9991                docElem = doc.documentElement;
     9992                win = doc.defaultView;
     9993
     9994                return {
     9995                        top: rect.top + win.pageYOffset - docElem.clientTop,
     9996                        left: rect.left + win.pageXOffset - docElem.clientLeft
     9997                };
     9998        },
     9999
     10000        position: function() {
     10001                if ( !this[ 0 ] ) {
     10002                        return;
     10003                }
     10004
     10005                var offsetParent, offset,
     10006                        elem = this[ 0 ],
     10007                        parentOffset = { top: 0, left: 0 };
     10008
     10009                // Fixed elements are offset from window (parentOffset = {top:0, left: 0},
     10010                // because it is its only offset parent
     10011                if ( jQuery.css( elem, "position" ) === "fixed" ) {
     10012
     10013                        // Assume getBoundingClientRect is there when computed position is fixed
     10014                        offset = elem.getBoundingClientRect();
     10015
     10016                } else {
     10017
     10018                        // Get *real* offsetParent
     10019                        offsetParent = this.offsetParent();
     10020
     10021                        // Get correct offsets
     10022                        offset = this.offset();
     10023                        if ( !nodeName( offsetParent[ 0 ], "html" ) ) {
     10024                                parentOffset = offsetParent.offset();
     10025                        }
     10026
     10027                        // Add offsetParent borders
     10028                        parentOffset = {
     10029                                top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ),
     10030                                left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true )
     10031                        };
     10032                }
     10033
     10034                // Subtract parent offsets and element margins
     10035                return {
     10036                        top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
     10037                        left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
     10038                };
     10039        },
     10040
     10041        // This method will return documentElement in the following cases:
     10042        // 1) For the element inside the iframe without offsetParent, this method will return
     10043        //    documentElement of the parent window
     10044        // 2) For the hidden or detached element
     10045        // 3) For body or html element, i.e. in case of the html node - it will return itself
     10046        //
     10047        // but those exceptions were never presented as a real life use-cases
     10048        // and might be considered as more preferable results.
     10049        //
     10050        // This logic, however, is not guaranteed and can change at any point in the future
     10051        offsetParent: function() {
     10052                return this.map( function() {
     10053                        var offsetParent = this.offsetParent;
     10054
     10055                        while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
     10056                                offsetParent = offsetParent.offsetParent;
     10057                        }
     10058
     10059                        return offsetParent || documentElement;
     10060                } );
     10061        }
     10062} );
     10063
     10064// Create scrollLeft and scrollTop methods
     10065jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
     10066        var top = "pageYOffset" === prop;
     10067
     10068        jQuery.fn[ method ] = function( val ) {
     10069                return access( this, function( elem, method, val ) {
     10070
     10071                        // Coalesce documents and windows
     10072                        var win;
     10073                        if ( jQuery.isWindow( elem ) ) {
     10074                                win = elem;
     10075                        } else if ( elem.nodeType === 9 ) {
     10076                                win = elem.defaultView;
     10077                        }
     10078
     10079                        if ( val === undefined ) {
     10080                                return win ? win[ prop ] : elem[ method ];
     10081                        }
     10082
     10083                        if ( win ) {
     10084                                win.scrollTo(
     10085                                        !top ? val : win.pageXOffset,
     10086                                        top ? val : win.pageYOffset
     10087                                );
     10088
     10089                        } else {
     10090                                elem[ method ] = val;
     10091                        }
     10092                }, method, val, arguments.length );
     10093        };
     10094} );
     10095
     10096// Support: Safari <=7 - 9.1, Chrome <=37 - 49
     10097// Add the top/left cssHooks using jQuery.fn.position
     10098// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
     10099// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
     10100// getComputedStyle returns percent when specified for top/left/bottom/right;
     10101// rather than make the css module depend on the offset module, just check for it here
     10102jQuery.each( [ "top", "left" ], function( i, prop ) {
     10103        jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
     10104                function( elem, computed ) {
     10105                        if ( computed ) {
     10106                                computed = curCSS( elem, prop );
     10107
     10108                                // If curCSS returns percentage, fallback to offset
     10109                                return rnumnonpx.test( computed ) ?
     10110                                        jQuery( elem ).position()[ prop ] + "px" :
     10111                                        computed;
     10112                        }
     10113                }
     10114        );
     10115} );
     10116
     10117
     10118// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
     10119jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
     10120        jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
     10121                function( defaultExtra, funcName ) {
     10122
     10123                // Margin is only for outerHeight, outerWidth
     10124                jQuery.fn[ funcName ] = function( margin, value ) {
     10125                        var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
     10126                                extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
     10127
     10128                        return access( this, function( elem, type, value ) {
     10129                                var doc;
     10130
     10131                                if ( jQuery.isWindow( elem ) ) {
     10132
     10133                                        // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
     10134                                        return funcName.indexOf( "outer" ) === 0 ?
     10135                                                elem[ "inner" + name ] :
     10136                                                elem.document.documentElement[ "client" + name ];
     10137                                }
     10138
     10139                                // Get document width or height
     10140                                if ( elem.nodeType === 9 ) {
     10141                                        doc = elem.documentElement;
     10142
     10143                                        // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
     10144                                        // whichever is greatest
     10145                                        return Math.max(
     10146                                                elem.body[ "scroll" + name ], doc[ "scroll" + name ],
     10147                                                elem.body[ "offset" + name ], doc[ "offset" + name ],
     10148                                                doc[ "client" + name ]
     10149                                        );
     10150                                }
     10151
     10152                                return value === undefined ?
     10153
     10154                                        // Get width or height on the element, requesting but not forcing parseFloat
     10155                                        jQuery.css( elem, type, extra ) :
     10156
     10157                                        // Set width or height on the element
     10158                                        jQuery.style( elem, type, value, extra );
     10159                        }, type, chainable ? margin : undefined, chainable );
     10160                };
     10161        } );
     10162} );
     10163
     10164
     10165jQuery.fn.extend( {
     10166
     10167        bind: function( types, data, fn ) {
     10168                return this.on( types, null, data, fn );
     10169        },
     10170        unbind: function( types, fn ) {
     10171                return this.off( types, null, fn );
     10172        },
     10173
     10174        delegate: function( selector, types, data, fn ) {
     10175                return this.on( types, selector, data, fn );
     10176        },
     10177        undelegate: function( selector, types, fn ) {
     10178
     10179                // ( namespace ) or ( selector, types [, fn] )
     10180                return arguments.length === 1 ?
     10181                        this.off( selector, "**" ) :
     10182                        this.off( types, selector || "**", fn );
     10183        }
     10184} );
     10185
     10186jQuery.holdReady = function( hold ) {
     10187        if ( hold ) {
     10188                jQuery.readyWait++;
     10189        } else {
     10190                jQuery.ready( true );
     10191        }
     10192};
     10193jQuery.isArray = Array.isArray;
     10194jQuery.parseJSON = JSON.parse;
     10195jQuery.nodeName = nodeName;
     10196
     10197
     10198
     10199
     10200// Register as a named AMD module, since jQuery can be concatenated with other
     10201// files that may use define, but not via a proper concatenation script that
     10202// understands anonymous AMD modules. A named AMD is safest and most robust
     10203// way to register. Lowercase jquery is used because AMD module names are
     10204// derived from file names, and jQuery is normally delivered in a lowercase
     10205// file name. Do this after creating the global so that if an AMD module wants
     10206// to call noConflict to hide this version of jQuery, it will work.
     10207
     10208// Note that for maximum portability, libraries that are not jQuery should
     10209// declare themselves as anonymous modules, and avoid setting a global if an
     10210// AMD loader is present. jQuery is a special case. For more information, see
     10211// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
     10212
     10213if ( typeof define === "function" && define.amd ) {
     10214        define( "jquery", [], function() {
     10215                return jQuery;
     10216        } );
     10217}
     10218
     10219
     10220
     10221
     10222var
     10223
     10224        // Map over jQuery in case of overwrite
     10225        _jQuery = window.jQuery,
     10226
     10227        // Map over the $ in case of overwrite
     10228        _$ = window.$;
     10229
     10230jQuery.noConflict = function( deep ) {
     10231        if ( window.$ === jQuery ) {
     10232                window.$ = _$;
     10233        }
     10234
     10235        if ( deep && window.jQuery === jQuery ) {
     10236                window.jQuery = _jQuery;
     10237        }
     10238
     10239        return jQuery;
     10240};
     10241
     10242// Expose jQuery and $ identifiers, even in AMD
     10243// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
     10244// and CommonJS for browser emulators (#13566)
     10245if ( !noGlobal ) {
     10246        window.jQuery = window.$ = jQuery;
     10247}
     10248
     10249
     10250
     10251
     10252return jQuery;
     10253} );
  • src/wp-includes/js/jquery/ui/core.js

    diff --git src/wp-includes/js/jquery/ui/core.js src/wp-includes/js/jquery/ui/core.js
    index 469712889c..149a3b94fa 100644
    function visible( element ) { 
    113113                }).length;
    114114}
    115115
    116 $.extend( $.expr[ ":" ], {
     116$.extend( $.expr.pseudos, {
    117117        data: $.expr.createPseudo ?
    118118                $.expr.createPseudo(function( dataName ) {
    119119                        return function( elem ) {
  • src/wp-includes/js/jquery/ui/mouse.js

    diff --git src/wp-includes/js/jquery/ui/mouse.js src/wp-includes/js/jquery/ui/mouse.js
    index 89018bfeb8..aa90c7ad1e 100644
     
     1// This file is deprecated
     2var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
     3
    14/*!
    2  * jQuery UI Mouse 1.11.4
     5 * jQuery UI Mouse 1.12.1
    36 * http://jqueryui.com
    47 *
    58 * Copyright jQuery Foundation and other contributors
    69 * Released under the MIT license.
    710 * http://jquery.org/license
    8  *
    9  * http://api.jqueryui.com/mouse/
    1011 */
    11 (function( factory ) {
    12         if ( typeof define === "function" && define.amd ) {
    1312
    14                 // AMD. Register as an anonymous module.
    15                 define([
    16                         "jquery",
    17                         "./widget"
    18                 ], factory );
    19         } else {
     13//>>label: Mouse
     14//>>group: Widgets
     15//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.
     16//>>docs: http://api.jqueryui.com/mouse/
     17
    2018
    21                 // Browser globals
    22                 factory( jQuery );
    23         }
    24 }(function( $ ) {
    2519
    2620var mouseHandled = false;
    27 $( document ).mouseup( function() {
     21$( document ).on( "mouseup", function() {
    2822        mouseHandled = false;
    29 });
     23} );
    3024
    31 return $.widget("ui.mouse", {
    32         version: "1.11.4",
     25var widgetsMouse = $.widget( "ui.mouse", {
     26        version: "1.12.1",
    3327        options: {
    34                 cancel: "input,textarea,button,select,option",
     28                cancel: "input, textarea, button, select, option",
    3529                distance: 1,
    3630                delay: 0
    3731        },
    return $.widget("ui.mouse", { 
    3933                var that = this;
    4034
    4135                this.element
    42                         .bind("mousedown." + this.widgetName, function(event) {
    43                                 return that._mouseDown(event);
    44                         })
    45                         .bind("click." + this.widgetName, function(event) {
    46                                 if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
    47                                         $.removeData(event.target, that.widgetName + ".preventClickEvent");
     36                        .on( "mousedown." + this.widgetName, function( event ) {
     37                                return that._mouseDown( event );
     38                        } )
     39                        .on( "click." + this.widgetName, function( event ) {
     40                                if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
     41                                        $.removeData( event.target, that.widgetName + ".preventClickEvent" );
    4842                                        event.stopImmediatePropagation();
    4943                                        return false;
    5044                                }
    51                         });
     45                        } );
    5246
    5347                this.started = false;
    5448        },
    return $.widget("ui.mouse", { 
    5650        // TODO: make sure destroying one instance of mouse doesn't mess with
    5751        // other instances of mouse
    5852        _mouseDestroy: function() {
    59                 this.element.unbind("." + this.widgetName);
     53                this.element.off( "." + this.widgetName );
    6054                if ( this._mouseMoveDelegate ) {
    6155                        this.document
    62                                 .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
    63                                 .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
     56                                .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
     57                                .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
    6458                }
    6559        },
    6660
    67         _mouseDown: function(event) {
     61        _mouseDown: function( event ) {
     62
    6863                // don't let more than one widget handle mouseStart
    6964                if ( mouseHandled ) {
    7065                        return;
    return $.widget("ui.mouse", { 
    7267
    7368                this._mouseMoved = false;
    7469
    75                 // we may have missed mouseup (out of window)
    76                 (this._mouseStarted && this._mouseUp(event));
     70                // We may have missed mouseup (out of window)
     71                ( this._mouseStarted && this._mouseUp( event ) );
    7772
    7873                this._mouseDownEvent = event;
    7974
    8075                var that = this,
    81                         btnIsLeft = (event.which === 1),
     76                        btnIsLeft = ( event.which === 1 ),
     77
    8278                        // event.target.nodeName works around a bug in IE 8 with
    8379                        // disabled inputs (#7620)
    84                         elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
    85                 if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
     80                        elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ?
     81                                $( event.target ).closest( this.options.cancel ).length : false );
     82                if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {
    8683                        return true;
    8784                }
    8885
    8986                this.mouseDelayMet = !this.options.delay;
    90                 if (!this.mouseDelayMet) {
    91                         this._mouseDelayTimer = setTimeout(function() {
     87                if ( !this.mouseDelayMet ) {
     88                        this._mouseDelayTimer = setTimeout( function() {
    9289                                that.mouseDelayMet = true;
    93                         }, this.options.delay);
     90                        }, this.options.delay );
    9491                }
    9592
    96                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
    97                         this._mouseStarted = (this._mouseStart(event) !== false);
    98                         if (!this._mouseStarted) {
     93                if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
     94                        this._mouseStarted = ( this._mouseStart( event ) !== false );
     95                        if ( !this._mouseStarted ) {
    9996                                event.preventDefault();
    10097                                return true;
    10198                        }
    10299                }
    103100
    104101                // Click event may never have fired (Gecko & Opera)
    105                 if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
    106                         $.removeData(event.target, this.widgetName + ".preventClickEvent");
     102                if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
     103                        $.removeData( event.target, this.widgetName + ".preventClickEvent" );
    107104                }
    108105
    109                 // these delegates are required to keep context
    110                 this._mouseMoveDelegate = function(event) {
    111                         return that._mouseMove(event);
     106                // These delegates are required to keep context
     107                this._mouseMoveDelegate = function( event ) {
     108                        return that._mouseMove( event );
    112109                };
    113                 this._mouseUpDelegate = function(event) {
    114                         return that._mouseUp(event);
     110                this._mouseUpDelegate = function( event ) {
     111                        return that._mouseUp( event );
    115112                };
    116113
    117114                this.document
    118                         .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
    119                         .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
     115                        .on( "mousemove." + this.widgetName, this._mouseMoveDelegate )
     116                        .on( "mouseup." + this.widgetName, this._mouseUpDelegate );
    120117
    121118                event.preventDefault();
    122119
    return $.widget("ui.mouse", { 
    124121                return true;
    125122        },
    126123
    127         _mouseMove: function(event) {
     124        _mouseMove: function( event ) {
     125
    128126                // Only check for mouseups outside the document if you've moved inside the document
    129127                // at least once. This prevents the firing of mouseup in the case of IE<9, which will
    130128                // fire a mousemove event if content is placed under the cursor. See #7778
    131129                // Support: IE <9
    132130                if ( this._mouseMoved ) {
     131
    133132                        // IE mouseup check - mouseup happened when mouse was out of window
    134                         if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
    135                                 return this._mouseUp(event);
     133                        if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
     134                                        !event.button ) {
     135                                return this._mouseUp( event );
    136136
    137137                        // Iframe mouseup check - mouseup occurred in another document
    138138                        } else if ( !event.which ) {
    139                                 return this._mouseUp( event );
     139
     140                                // Support: Safari <=8 - 9
     141                                // Safari sets which to 0 if you press any of the following keys
     142                                // during a drag (#14461)
     143                                if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
     144                                                event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
     145                                        this.ignoreMissingWhich = true;
     146                                } else if ( !this.ignoreMissingWhich ) {
     147                                        return this._mouseUp( event );
     148                                }
    140149                        }
    141150                }
    142151
    return $.widget("ui.mouse", { 
    144153                        this._mouseMoved = true;
    145154                }
    146155
    147                 if (this._mouseStarted) {
    148                         this._mouseDrag(event);
     156                if ( this._mouseStarted ) {
     157                        this._mouseDrag( event );
    149158                        return event.preventDefault();
    150159                }
    151160
    152                 if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
     161                if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {
    153162                        this._mouseStarted =
    154                                 (this._mouseStart(this._mouseDownEvent, event) !== false);
    155                         (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
     163                                ( this._mouseStart( this._mouseDownEvent, event ) !== false );
     164                        ( this._mouseStarted ? this._mouseDrag( event ) : this._mouseUp( event ) );
    156165                }
    157166
    158167                return !this._mouseStarted;
    159168        },
    160169
    161         _mouseUp: function(event) {
     170        _mouseUp: function( event ) {
    162171                this.document
    163                         .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
    164                         .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
     172                        .off( "mousemove." + this.widgetName, this._mouseMoveDelegate )
     173                        .off( "mouseup." + this.widgetName, this._mouseUpDelegate );
    165174
    166                 if (this._mouseStarted) {
     175                if ( this._mouseStarted ) {
    167176                        this._mouseStarted = false;
    168177
    169                         if (event.target === this._mouseDownEvent.target) {
    170                                 $.data(event.target, this.widgetName + ".preventClickEvent", true);
     178                        if ( event.target === this._mouseDownEvent.target ) {
     179                                $.data( event.target, this.widgetName + ".preventClickEvent", true );
    171180                        }
    172181
    173                         this._mouseStop(event);
     182                        this._mouseStop( event );
    174183                }
    175184
     185                if ( this._mouseDelayTimer ) {
     186                        clearTimeout( this._mouseDelayTimer );
     187                        delete this._mouseDelayTimer;
     188                }
     189
     190                this.ignoreMissingWhich = false;
    176191                mouseHandled = false;
    177                 return false;
     192                event.preventDefault();
    178193        },
    179194
    180         _mouseDistanceMet: function(event) {
    181                 return (Math.max(
    182                                 Math.abs(this._mouseDownEvent.pageX - event.pageX),
    183                                 Math.abs(this._mouseDownEvent.pageY - event.pageY)
     195        _mouseDistanceMet: function( event ) {
     196                return ( Math.max(
     197                                Math.abs( this._mouseDownEvent.pageX - event.pageX ),
     198                                Math.abs( this._mouseDownEvent.pageY - event.pageY )
    184199                        ) >= this.options.distance
    185200                );
    186201        },
    187202
    188         _mouseDelayMet: function(/* event */) {
     203        _mouseDelayMet: function( /* event */ ) {
    189204                return this.mouseDelayMet;
    190205        },
    191206
    192207        // These are placeholder methods, to be overriden by extending plugin
    193         _mouseStart: function(/* event */) {},
    194         _mouseDrag: function(/* event */) {},
    195         _mouseStop: function(/* event */) {},
    196         _mouseCapture: function(/* event */) { return true; }
    197 });
    198 
    199 }));
     208        _mouseStart: function( /* event */ ) {},
     209        _mouseDrag: function( /* event */ ) {},
     210        _mouseStop: function( /* event */ ) {},
     211        _mouseCapture: function( /* event */ ) { return true; }
     212} );
  • src/wp-includes/js/jquery/ui/widget.js

    diff --git src/wp-includes/js/jquery/ui/widget.js src/wp-includes/js/jquery/ui/widget.js
    index 1096ba6294..721be98890 100644
     
    11/*!
    2  * jQuery UI Widget 1.11.4
     2 * jQuery UI Widget 1.12.1
    33 * http://jqueryui.com
    44 *
    55 * Copyright jQuery Foundation and other contributors
    66 * Released under the MIT license.
    77 * http://jquery.org/license
    8  *
    9  * http://api.jqueryui.com/jQuery.widget/
    108 */
    11 (function( factory ) {
    12         if ( typeof define === "function" && define.amd ) {
    139
    14                 // AMD. Register as an anonymous module.
    15                 define( [ "jquery" ], factory );
    16         } else {
     10//>>label: Widget
     11//>>group: Core
     12//>>description: Provides a factory for creating stateful widgets with a common API.
     13//>>docs: http://api.jqueryui.com/jQuery.widget/
     14//>>demos: http://jqueryui.com/widget/
     15
    1716
    18                 // Browser globals
    19                 factory( jQuery );
    20         }
    21 }(function( $ ) {
    2217
    23 var widget_uuid = 0,
    24         widget_slice = Array.prototype.slice;
     18var widgetUuid = 0;
     19var widgetSlice = Array.prototype.slice;
    2520
    26 $.cleanData = (function( orig ) {
     21$.cleanData = ( function( orig ) {
    2722        return function( elems ) {
    2823                var events, elem, i;
    29                 for ( i = 0; (elem = elems[i]) != null; i++ ) {
     24                for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {
    3025                        try {
    3126
    3227                                // Only trigger remove when necessary to save time
    $.cleanData = (function( orig ) { 
    3530                                        $( elem ).triggerHandler( "remove" );
    3631                                }
    3732
    38                         // http://bugs.jquery.com/ticket/8235
     33                        // Http://bugs.jquery.com/ticket/8235
    3934                        } catch ( e ) {}
    4035                }
    4136                orig( elems );
    4237        };
    43 })( $.cleanData );
     38} )( $.cleanData );
    4439
    4540$.widget = function( name, base, prototype ) {
    46         var fullName, existingConstructor, constructor, basePrototype,
    47                 // proxiedPrototype allows the provided prototype to remain unmodified
    48                 // so that it can be used as a mixin for multiple widgets (#8876)
    49                 proxiedPrototype = {},
    50                 namespace = name.split( "." )[ 0 ];
     41        var existingConstructor, constructor, basePrototype;
    5142
     43        // ProxiedPrototype allows the provided prototype to remain unmodified
     44        // so that it can be used as a mixin for multiple widgets (#8876)
     45        var proxiedPrototype = {};
     46
     47        var namespace = name.split( "." )[ 0 ];
    5248        name = name.split( "." )[ 1 ];
    53         fullName = namespace + "-" + name;
     49        var fullName = namespace + "-" + name;
    5450
    5551        if ( !prototype ) {
    5652                prototype = base;
    5753                base = $.Widget;
    5854        }
    5955
    60         // create selector for plugin
    61         $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
     56        if ( $.isArray( prototype ) ) {
     57                prototype = $.extend.apply( null, [ {} ].concat( prototype ) );
     58        }
     59
     60        // Create selector for plugin
     61        $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {
    6262                return !!$.data( elem, fullName );
    6363        };
    6464
    6565        $[ namespace ] = $[ namespace ] || {};
    6666        existingConstructor = $[ namespace ][ name ];
    6767        constructor = $[ namespace ][ name ] = function( options, element ) {
    68                 // allow instantiation without "new" keyword
     68
     69                // Allow instantiation without "new" keyword
    6970                if ( !this._createWidget ) {
    7071                        return new constructor( options, element );
    7172                }
    7273
    73                 // allow instantiation without initializing for simple inheritance
     74                // Allow instantiation without initializing for simple inheritance
    7475                // must use "new" keyword (the code above always passes args)
    7576                if ( arguments.length ) {
    7677                        this._createWidget( options, element );
    7778                }
    7879        };
    79         // extend with the existing constructor to carry over any static properties
     80
     81        // Extend with the existing constructor to carry over any static properties
    8082        $.extend( constructor, existingConstructor, {
    8183                version: prototype.version,
    82                 // copy the object used to create the prototype in case we need to
     84
     85                // Copy the object used to create the prototype in case we need to
    8386                // redefine the widget later
    8487                _proto: $.extend( {}, prototype ),
    85                 // track widgets that inherit from this widget in case this widget is
     88
     89                // Track widgets that inherit from this widget in case this widget is
    8690                // redefined after a widget inherits from it
    8791                _childConstructors: []
    88         });
     92        } );
    8993
    9094        basePrototype = new base();
    91         // we need to make the options hash a property directly on the new instance
     95
     96        // We need to make the options hash a property directly on the new instance
    9297        // otherwise we'll modify the options hash on the prototype that we're
    9398        // inheriting from
    9499        basePrototype.options = $.widget.extend( {}, basePrototype.options );
    $.widget = function( name, base, prototype ) { 
    97102                        proxiedPrototype[ prop ] = value;
    98103                        return;
    99104                }
    100                 proxiedPrototype[ prop ] = (function() {
    101                         var _super = function() {
    102                                         return base.prototype[ prop ].apply( this, arguments );
    103                                 },
    104                                 _superApply = function( args ) {
    105                                         return base.prototype[ prop ].apply( this, args );
    106                                 };
     105                proxiedPrototype[ prop ] = ( function() {
     106                        function _super() {
     107                                return base.prototype[ prop ].apply( this, arguments );
     108                        }
     109
     110                        function _superApply( args ) {
     111                                return base.prototype[ prop ].apply( this, args );
     112                        }
     113
    107114                        return function() {
    108                                 var __super = this._super,
    109                                         __superApply = this._superApply,
    110                                         returnValue;
     115                                var __super = this._super;
     116                                var __superApply = this._superApply;
     117                                var returnValue;
    111118
    112119                                this._super = _super;
    113120                                this._superApply = _superApply;
    $.widget = function( name, base, prototype ) { 
    119126
    120127                                return returnValue;
    121128                        };
    122                 })();
    123         });
     129                } )();
     130        } );
    124131        constructor.prototype = $.widget.extend( basePrototype, {
     132
    125133                // TODO: remove support for widgetEventPrefix
    126134                // always use the name + a colon as the prefix, e.g., draggable:start
    127135                // don't prefix for widgets that aren't DOM-based
    128                 widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
     136                widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name
    129137        }, proxiedPrototype, {
    130138                constructor: constructor,
    131139                namespace: namespace,
    132140                widgetName: name,
    133141                widgetFullName: fullName
    134         });
     142        } );
    135143
    136144        // If this widget is being redefined then we need to find all widgets that
    137145        // are inheriting from it and redefine all of them so that they inherit from
    $.widget = function( name, base, prototype ) { 
    141149                $.each( existingConstructor._childConstructors, function( i, child ) {
    142150                        var childPrototype = child.prototype;
    143151
    144                         // redefine the child widget using the same prototype that was
     152                        // Redefine the child widget using the same prototype that was
    145153                        // originally used, but inherit from the new version of the base
    146                         $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
    147                 });
    148                 // remove the list of existing child constructors from the old constructor
     154                        $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor,
     155                                child._proto );
     156                } );
     157
     158                // Remove the list of existing child constructors from the old constructor
    149159                // so the old child constructors can be garbage collected
    150160                delete existingConstructor._childConstructors;
    151161        } else {
    $.widget = function( name, base, prototype ) { 
    158168};
    159169
    160170$.widget.extend = function( target ) {
    161         var input = widget_slice.call( arguments, 1 ),
    162                 inputIndex = 0,
    163                 inputLength = input.length,
    164                 key,
    165                 value;
     171        var input = widgetSlice.call( arguments, 1 );
     172        var inputIndex = 0;
     173        var inputLength = input.length;
     174        var key;
     175        var value;
     176
    166177        for ( ; inputIndex < inputLength; inputIndex++ ) {
    167178                for ( key in input[ inputIndex ] ) {
    168179                        value = input[ inputIndex ][ key ];
    169180                        if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
     181
    170182                                // Clone objects
    171183                                if ( $.isPlainObject( value ) ) {
    172184                                        target[ key ] = $.isPlainObject( target[ key ] ) ?
    173185                                                $.widget.extend( {}, target[ key ], value ) :
     186
    174187                                                // Don't extend strings, arrays, etc. with objects
    175188                                                $.widget.extend( {}, value );
     189
    176190                                // Copy everything else by reference
    177191                                } else {
    178192                                        target[ key ] = value;
    $.widget.extend = function( target ) { 
    186200$.widget.bridge = function( name, object ) {
    187201        var fullName = object.prototype.widgetFullName || name;
    188202        $.fn[ name ] = function( options ) {
    189                 var isMethodCall = typeof options === "string",
    190                         args = widget_slice.call( arguments, 1 ),
    191                         returnValue = this;
     203                var isMethodCall = typeof options === "string";
     204                var args = widgetSlice.call( arguments, 1 );
     205                var returnValue = this;
    192206
    193207                if ( isMethodCall ) {
    194                         this.each(function() {
    195                                 var methodValue,
    196                                         instance = $.data( this, fullName );
    197                                 if ( options === "instance" ) {
    198                                         returnValue = instance;
    199                                         return false;
    200                                 }
    201                                 if ( !instance ) {
    202                                         return $.error( "cannot call methods on " + name + " prior to initialization; " +
    203                                                 "attempted to call method '" + options + "'" );
    204                                 }
    205                                 if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
    206                                         return $.error( "no such method '" + options + "' for " + name + " widget instance" );
    207                                 }
    208                                 methodValue = instance[ options ].apply( instance, args );
    209                                 if ( methodValue !== instance && methodValue !== undefined ) {
    210                                         returnValue = methodValue && methodValue.jquery ?
    211                                                 returnValue.pushStack( methodValue.get() ) :
    212                                                 methodValue;
    213                                         return false;
    214                                 }
    215                         });
     208
     209                        // If this is an empty collection, we need to have the instance method
     210                        // return undefined instead of the jQuery instance
     211                        if ( !this.length && options === "instance" ) {
     212                                returnValue = undefined;
     213                        } else {
     214                                this.each( function() {
     215                                        var methodValue;
     216                                        var instance = $.data( this, fullName );
     217
     218                                        if ( options === "instance" ) {
     219                                                returnValue = instance;
     220                                                return false;
     221                                        }
     222
     223                                        if ( !instance ) {
     224                                                return $.error( "cannot call methods on " + name +
     225                                                        " prior to initialization; " +
     226                                                        "attempted to call method '" + options + "'" );
     227                                        }
     228
     229                                        if ( !$.isFunction( instance[ options ] ) || options.charAt( 0 ) === "_" ) {
     230                                                return $.error( "no such method '" + options + "' for " + name +
     231                                                        " widget instance" );
     232                                        }
     233
     234                                        methodValue = instance[ options ].apply( instance, args );
     235
     236                                        if ( methodValue !== instance && methodValue !== undefined ) {
     237                                                returnValue = methodValue && methodValue.jquery ?
     238                                                        returnValue.pushStack( methodValue.get() ) :
     239                                                        methodValue;
     240                                                return false;
     241                                        }
     242                                } );
     243                        }
    216244                } else {
    217245
    218246                        // Allow multiple hashes to be passed on init
    219247                        if ( args.length ) {
    220                                 options = $.widget.extend.apply( null, [ options ].concat(args) );
     248                                options = $.widget.extend.apply( null, [ options ].concat( args ) );
    221249                        }
    222250
    223                         this.each(function() {
     251                        this.each( function() {
    224252                                var instance = $.data( this, fullName );
    225253                                if ( instance ) {
    226254                                        instance.option( options || {} );
    $.widget.bridge = function( name, object ) { 
    230258                                } else {
    231259                                        $.data( this, fullName, new object( options, this ) );
    232260                                }
    233                         });
     261                        } );
    234262                }
    235263
    236264                return returnValue;
    $.Widget.prototype = { 
    244272        widgetName: "widget",
    245273        widgetEventPrefix: "",
    246274        defaultElement: "<div>",
     275
    247276        options: {
     277                classes: {},
    248278                disabled: false,
    249279
    250                 // callbacks
     280                // Callbacks
    251281                create: null
    252282        },
     283
    253284        _createWidget: function( options, element ) {
    254285                element = $( element || this.defaultElement || this )[ 0 ];
    255286                this.element = $( element );
    256                 this.uuid = widget_uuid++;
     287                this.uuid = widgetUuid++;
    257288                this.eventNamespace = "." + this.widgetName + this.uuid;
    258289
    259290                this.bindings = $();
    260291                this.hoverable = $();
    261292                this.focusable = $();
     293                this.classesElementLookup = {};
    262294
    263295                if ( element !== this ) {
    264296                        $.data( element, this.widgetFullName, this );
    $.Widget.prototype = { 
    268300                                                this.destroy();
    269301                                        }
    270302                                }
    271                         });
     303                        } );
    272304                        this.document = $( element.style ?
    273                                 // element within the document
     305
     306                                // Element within the document
    274307                                element.ownerDocument :
    275                                 // element is window or document
     308
     309                                // Element is window or document
    276310                                element.document || element );
    277                         this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
     311                        this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
    278312                }
    279313
    280314                this.options = $.widget.extend( {},
    $.Widget.prototype = { 
    283317                        options );
    284318
    285319                this._create();
     320
     321                if ( this.options.disabled ) {
     322                        this._setOptionDisabled( this.options.disabled );
     323                }
     324
    286325                this._trigger( "create", null, this._getCreateEventData() );
    287326                this._init();
    288327        },
    289         _getCreateOptions: $.noop,
     328
     329        _getCreateOptions: function() {
     330                return {};
     331        },
     332
    290333        _getCreateEventData: $.noop,
     334
    291335        _create: $.noop,
     336
    292337        _init: $.noop,
    293338
    294339        destroy: function() {
     340                var that = this;
     341
    295342                this._destroy();
    296                 // we can probably remove the unbind calls in 2.0
     343                $.each( this.classesElementLookup, function( key, value ) {
     344                        that._removeClass( value, key );
     345                } );
     346
     347                // We can probably remove the unbind calls in 2.0
    297348                // all event bindings should go through this._on()
    298349                this.element
    299                         .unbind( this.eventNamespace )
    300                         .removeData( this.widgetFullName )
    301                         // support: jquery <1.6.3
    302                         // http://bugs.jquery.com/ticket/9413
    303                         .removeData( $.camelCase( this.widgetFullName ) );
     350                        .off( this.eventNamespace )
     351                        .removeData( this.widgetFullName );
    304352                this.widget()
    305                         .unbind( this.eventNamespace )
    306                         .removeAttr( "aria-disabled" )
    307                         .removeClass(
    308                                 this.widgetFullName + "-disabled " +
    309                                 "ui-state-disabled" );
    310 
    311                 // clean up events and states
    312                 this.bindings.unbind( this.eventNamespace );
    313                 this.hoverable.removeClass( "ui-state-hover" );
    314                 this.focusable.removeClass( "ui-state-focus" );
     353                        .off( this.eventNamespace )
     354                        .removeAttr( "aria-disabled" );
     355
     356                // Clean up events and states
     357                this.bindings.off( this.eventNamespace );
    315358        },
     359
    316360        _destroy: $.noop,
    317361
    318362        widget: function() {
    $.Widget.prototype = { 
    320364        },
    321365
    322366        option: function( key, value ) {
    323                 var options = key,
    324                         parts,
    325                         curOption,
    326                         i;
     367                var options = key;
     368                var parts;
     369                var curOption;
     370                var i;
    327371
    328372                if ( arguments.length === 0 ) {
    329                         // don't return a reference to the internal hash
     373
     374                        // Don't return a reference to the internal hash
    330375                        return $.widget.extend( {}, this.options );
    331376                }
    332377
    333378                if ( typeof key === "string" ) {
    334                         // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
     379
     380                        // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
    335381                        options = {};
    336382                        parts = key.split( "." );
    337383                        key = parts.shift();
    $.Widget.prototype = { 
    358404
    359405                return this;
    360406        },
     407
    361408        _setOptions: function( options ) {
    362409                var key;
    363410
    $.Widget.prototype = { 
    367414
    368415                return this;
    369416        },
     417
    370418        _setOption: function( key, value ) {
     419                if ( key === "classes" ) {
     420                        this._setOptionClasses( value );
     421                }
     422
    371423                this.options[ key ] = value;
    372424
    373425                if ( key === "disabled" ) {
    374                         this.widget()
    375                                 .toggleClass( this.widgetFullName + "-disabled", !!value );
     426                        this._setOptionDisabled( value );
     427                }
     428
     429                return this;
     430        },
     431
     432        _setOptionClasses: function( value ) {
     433                var classKey, elements, currentElements;
    376434
    377                         // If the widget is becoming disabled, then nothing is interactive
    378                         if ( value ) {
    379                                 this.hoverable.removeClass( "ui-state-hover" );
    380                                 this.focusable.removeClass( "ui-state-focus" );
     435                for ( classKey in value ) {
     436                        currentElements = this.classesElementLookup[ classKey ];
     437                        if ( value[ classKey ] === this.options.classes[ classKey ] ||
     438                                        !currentElements ||
     439                                        !currentElements.length ) {
     440                                continue;
    381441                        }
     442
     443                        // We are doing this to create a new jQuery object because the _removeClass() call
     444                        // on the next line is going to destroy the reference to the current elements being
     445                        // tracked. We need to save a copy of this collection so that we can add the new classes
     446                        // below.
     447                        elements = $( currentElements.get() );
     448                        this._removeClass( currentElements, classKey );
     449
     450                        // We don't use _addClass() here, because that uses this.options.classes
     451                        // for generating the string of classes. We want to use the value passed in from
     452                        // _setOption(), this is the new value of the classes option which was passed to
     453                        // _setOption(). We pass this value directly to _classes().
     454                        elements.addClass( this._classes( {
     455                                element: elements,
     456                                keys: classKey,
     457                                classes: value,
     458                                add: true
     459                        } ) );
    382460                }
     461        },
    383462
    384                 return this;
     463        _setOptionDisabled: function( value ) {
     464                this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
     465
     466                // If the widget is becoming disabled, then nothing is interactive
     467                if ( value ) {
     468                        this._removeClass( this.hoverable, null, "ui-state-hover" );
     469                        this._removeClass( this.focusable, null, "ui-state-focus" );
     470                }
    385471        },
    386472
    387473        enable: function() {
    388                 return this._setOptions({ disabled: false });
     474                return this._setOptions( { disabled: false } );
    389475        },
     476
    390477        disable: function() {
    391                 return this._setOptions({ disabled: true });
     478                return this._setOptions( { disabled: true } );
     479        },
     480
     481        _classes: function( options ) {
     482                var full = [];
     483                var that = this;
     484
     485                options = $.extend( {
     486                        element: this.element,
     487                        classes: this.options.classes || {}
     488                }, options );
     489
     490                function processClassString( classes, checkOption ) {
     491                        var current, i;
     492                        for ( i = 0; i < classes.length; i++ ) {
     493                                current = that.classesElementLookup[ classes[ i ] ] || $();
     494                                if ( options.add ) {
     495                                        current = $( $.unique( current.get().concat( options.element.get() ) ) );
     496                                } else {
     497                                        current = $( current.not( options.element ).get() );
     498                                }
     499                                that.classesElementLookup[ classes[ i ] ] = current;
     500                                full.push( classes[ i ] );
     501                                if ( checkOption && options.classes[ classes[ i ] ] ) {
     502                                        full.push( options.classes[ classes[ i ] ] );
     503                                }
     504                        }
     505                }
     506
     507                this._on( options.element, {
     508                        "remove": "_untrackClassesElement"
     509                } );
     510
     511                if ( options.keys ) {
     512                        processClassString( options.keys.match( /\S+/g ) || [], true );
     513                }
     514                if ( options.extra ) {
     515                        processClassString( options.extra.match( /\S+/g ) || [] );
     516                }
     517
     518                return full.join( " " );
     519        },
     520
     521        _untrackClassesElement: function( event ) {
     522                var that = this;
     523                $.each( that.classesElementLookup, function( key, value ) {
     524                        if ( $.inArray( event.target, value ) !== -1 ) {
     525                                that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
     526                        }
     527                } );
     528        },
     529
     530        _removeClass: function( element, keys, extra ) {
     531                return this._toggleClass( element, keys, extra, false );
     532        },
     533
     534        _addClass: function( element, keys, extra ) {
     535                return this._toggleClass( element, keys, extra, true );
     536        },
     537
     538        _toggleClass: function( element, keys, extra, add ) {
     539                add = ( typeof add === "boolean" ) ? add : extra;
     540                var shift = ( typeof element === "string" || element === null ),
     541                        options = {
     542                                extra: shift ? keys : extra,
     543                                keys: shift ? element : keys,
     544                                element: shift ? this.element : element,
     545                                add: add
     546                        };
     547                options.element.toggleClass( this._classes( options ), add );
     548                return this;
    392549        },
    393550
    394551        _on: function( suppressDisabledCheck, element, handlers ) {
    395                 var delegateElement,
    396                         instance = this;
     552                var delegateElement;
     553                var instance = this;
    397554
    398                 // no suppressDisabledCheck flag, shuffle arguments
     555                // No suppressDisabledCheck flag, shuffle arguments
    399556                if ( typeof suppressDisabledCheck !== "boolean" ) {
    400557                        handlers = element;
    401558                        element = suppressDisabledCheck;
    402559                        suppressDisabledCheck = false;
    403560                }
    404561
    405                 // no element argument, shuffle and use this.element
     562                // No element argument, shuffle and use this.element
    406563                if ( !handlers ) {
    407564                        handlers = element;
    408565                        element = this.element;
    $.Widget.prototype = { 
    414571
    415572                $.each( handlers, function( event, handler ) {
    416573                        function handlerProxy() {
    417                                 // allow widgets to customize the disabled handling
     574
     575                                // Allow widgets to customize the disabled handling
    418576                                // - disabled as an array instead of boolean
    419577                                // - disabled class as method for disabling individual parts
    420578                                if ( !suppressDisabledCheck &&
    421579                                                ( instance.options.disabled === true ||
    422                                                         $( this ).hasClass( "ui-state-disabled" ) ) ) {
     580                                                $( this ).hasClass( "ui-state-disabled" ) ) ) {
    423581                                        return;
    424582                                }
    425583                                return ( typeof handler === "string" ? instance[ handler ] : handler )
    426584                                        .apply( instance, arguments );
    427585                        }
    428586
    429                         // copy the guid so direct unbinding works
     587                        // Copy the guid so direct unbinding works
    430588                        if ( typeof handler !== "string" ) {
    431589                                handlerProxy.guid = handler.guid =
    432590                                        handler.guid || handlerProxy.guid || $.guid++;
    433591                        }
    434592
    435                         var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
    436                                 eventName = match[1] + instance.eventNamespace,
    437                                 selector = match[2];
     593                        var match = event.match( /^([\w:-]*)\s*(.*)$/ );
     594                        var eventName = match[ 1 ] + instance.eventNamespace;
     595                        var selector = match[ 2 ];
     596
    438597                        if ( selector ) {
    439                                 delegateElement.delegate( selector, eventName, handlerProxy );
     598                                delegateElement.on( eventName, selector, handlerProxy );
    440599                        } else {
    441                                 element.bind( eventName, handlerProxy );
     600                                element.on( eventName, handlerProxy );
    442601                        }
    443                 });
     602                } );
    444603        },
    445604
    446605        _off: function( element, eventName ) {
    447                 eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
     606                eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
    448607                        this.eventNamespace;
    449                 element.unbind( eventName ).undelegate( eventName );
     608                element.off( eventName ).off( eventName );
    450609
    451610                // Clear the stack to avoid memory leaks (#10056)
    452611                this.bindings = $( this.bindings.not( element ).get() );
    $.Widget.prototype = { 
    467626                this.hoverable = this.hoverable.add( element );
    468627                this._on( element, {
    469628                        mouseenter: function( event ) {
    470                                 $( event.currentTarget ).addClass( "ui-state-hover" );
     629                                this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
    471630                        },
    472631                        mouseleave: function( event ) {
    473                                 $( event.currentTarget ).removeClass( "ui-state-hover" );
     632                                this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
    474633                        }
    475                 });
     634                } );
    476635        },
    477636
    478637        _focusable: function( element ) {
    479638                this.focusable = this.focusable.add( element );
    480639                this._on( element, {
    481640                        focusin: function( event ) {
    482                                 $( event.currentTarget ).addClass( "ui-state-focus" );
     641                                this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
    483642                        },
    484643                        focusout: function( event ) {
    485                                 $( event.currentTarget ).removeClass( "ui-state-focus" );
     644                                this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
    486645                        }
    487                 });
     646                } );
    488647        },
    489648
    490649        _trigger: function( type, event, data ) {
    491                 var prop, orig,
    492                         callback = this.options[ type ];
     650                var prop, orig;
     651                var callback = this.options[ type ];
    493652
    494653                data = data || {};
    495654                event = $.Event( event );
    496655                event.type = ( type === this.widgetEventPrefix ?
    497656                        type :
    498657                        this.widgetEventPrefix + type ).toLowerCase();
    499                 // the original event may come from any element
     658
     659                // The original event may come from any element
    500660                // so we need to reset the target on the new event
    501661                event.target = this.element[ 0 ];
    502662
    503                 // copy original event properties over to the new event
     663                // Copy original event properties over to the new event
    504664                orig = event.originalEvent;
    505665                if ( orig ) {
    506666                        for ( prop in orig ) {
    $.Widget.prototype = { 
    512672
    513673                this.element.trigger( event, data );
    514674                return !( $.isFunction( callback ) &&
    515                         callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
     675                        callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
    516676                        event.isDefaultPrevented() );
    517677        }
    518678};
    $.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { 
    522682                if ( typeof options === "string" ) {
    523683                        options = { effect: options };
    524684                }
    525                 var hasOptions,
    526                         effectName = !options ?
    527                                 method :
    528                                 options === true || typeof options === "number" ?
    529                                         defaultEffect :
    530                                         options.effect || defaultEffect;
     685
     686                var hasOptions;
     687                var effectName = !options ?
     688                        method :
     689                        options === true || typeof options === "number" ?
     690                                defaultEffect :
     691                                options.effect || defaultEffect;
     692
    531693                options = options || {};
    532694                if ( typeof options === "number" ) {
    533695                        options = { duration: options };
    534696                }
     697
    535698                hasOptions = !$.isEmptyObject( options );
    536699                options.complete = callback;
     700
    537701                if ( options.delay ) {
    538702                        element.delay( options.delay );
    539703                }
     704
    540705                if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
    541706                        element[ method ]( options );
    542707                } else if ( effectName !== method && element[ effectName ] ) {
    543708                        element[ effectName ]( options.duration, options.easing, callback );
    544709                } else {
    545                         element.queue(function( next ) {
     710                        element.queue( function( next ) {
    546711                                $( this )[ method ]();
    547712                                if ( callback ) {
    548713                                        callback.call( element[ 0 ] );
    549714                                }
    550715                                next();
    551                         });
     716                        } );
    552717                }
    553718        };
    554 });
    555 
    556 return $.widget;
     719} );
    557720
    558 }));
     721var widget = $.widget;
  • src/wp-includes/script-loader.php

    diff --git src/wp-includes/script-loader.php src/wp-includes/script-loader.php
    index 5761dfe3df..1e947c4224 100644
    function wp_default_scripts( &$scripts ) { 
    192192        $scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array('scriptaculous-dragdrop') );
    193193
    194194        // jQuery
    195         $scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '1.12.4' );
    196         $scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '1.12.4' );
     195        $scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '3.0.0' );
     196        $scripts->add( 'jquery-core', '/wp-includes/js/jquery/jquery.js', array(), '3.2.1' );
     197        $scripts->add( 'jquery-legacy', '/wp-includes/js/jquery/jquery-legacy.js', array(), '1.12.4' );
    197198        $scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '1.4.1' );
    198199
    199200        // full jQuery UI
  • tests/qunit/wp-admin/js/customize-controls.js

    diff --git tests/qunit/wp-admin/js/customize-controls.js tests/qunit/wp-admin/js/customize-controls.js
    index 72a68b21ac..629c490fc7 100644
    wp.customize.settingConstructor.abbreviation = wp.customize.Setting.extend({ 
    66        }
    77});
    88
    9 jQuery( window ).load( function (){
     9jQuery( window ).on( 'load', function (){
    1010        'use strict';
    1111
    1212        var controlId, controlLabel, controlType, controlContent, controlDescription, controlData, mockControl,
  • tests/qunit/wp-admin/js/customize-nav-menus.js

    diff --git tests/qunit/wp-admin/js/customize-nav-menus.js tests/qunit/wp-admin/js/customize-nav-menus.js
    index 057ec7aee1..8a887ee691 100644
     
    11/* global wp */
    2 jQuery( window ).load( function (){
     2jQuery( window ).on( 'load', function (){
    33
    44        var api = wp.customize,
    55                primaryMenuId = 3,
    jQuery( window ).load( function (){ 
    7676                control = section.controls()[0];
    7777                ok( control.extended( api.Menus.MenuNameControl ), 'control is a MenuNameControl' );
    7878                equal( control.setting().name, 'Primary menu' );
    79                 ok( ! control.setting._dirty );
     79                ok( ! control.setting.dirty, 'control not dirty' );
    8080                control.container.find( 'input[type=text]:first' ).val( 'Main menu' ).trigger( 'change' );
    8181                equal( control.setting().name, 'Main menu' );
    82                 ok( control.setting._dirty );
     82                ok( control.setting.dirty, 'control dirty' );
    8383        } );
    8484        // @todo Add more tests for api.Menus.MenuNameControl
    8585
  • tests/qunit/wp-admin/js/customize-widgets.js

    diff --git tests/qunit/wp-admin/js/customize-widgets.js tests/qunit/wp-admin/js/customize-widgets.js
    index 5f754a497a..38bd093652 100644
     
    11/* global wp */
    2 jQuery( window ).load( function() {
     2jQuery( window ).on( 'load', function() {
    33
    44        var api = wp.customize, $ = jQuery;
    55