diff --git a/zmscalldisplay/js/block/queueList.js b/zmscalldisplay/js/block/queueList.js index 806ab2a8d..cb9338195 100644 --- a/zmscalldisplay/js/block/queueList.js +++ b/zmscalldisplay/js/block/queueList.js @@ -28,6 +28,15 @@ class View extends BaseView { this.hideMessages(0); $('#queueImport').html(data); var audioCheck = new RingAudio(); + + // currently the logic to detect new queue ids is located in the RingAudio + // we should probably pull this functionality out of RingAudio and refactor it. + let newIds = audioCheck.getNewQueueIds(); + newIds.forEach((id) => { + var spansToBlink = $('span[data-appointment="' + id + '"]'); + this.blinkElements(spansToBlink, 3, 900); + }); + audioCheck.initSoundCheck(); this.getDestinationToNumber(); }) @@ -67,6 +76,32 @@ class View extends BaseView { }, delay) } } + + async blinkElements(elements, blinkCount, blinkTime) { + var blinkColor = 'rgb(27, 152, 213)'; + + const blinkAllOnce = async () => { + // Store the original colors for each element + const originalColors = elements.map(function() { + return $(this).css('color'); + }); + + // Set all elements to the blink color + elements.css('color', blinkColor); + await new Promise(resolve => setTimeout(resolve, blinkTime)); + + // Reset all elements to their original colors + elements.each(function(index) { + $(this).css('color', originalColors[index]); + }); + await new Promise(resolve => setTimeout(resolve, blinkTime)); + }; + + for (let i = 0; i < blinkCount; i++) { + await blinkAllOnce(); + } + } + } export default View; diff --git a/zmscalldisplay/js/block/ringAudio.js b/zmscalldisplay/js/block/ringAudio.js index 0e9d501a5..10b802f81 100644 --- a/zmscalldisplay/js/block/ringAudio.js +++ b/zmscalldisplay/js/block/ringAudio.js @@ -18,11 +18,15 @@ class View extends BaseView { this.writeCalledQueueIds(newQueueIds); } - hasNewQueueId() { + getNewQueueIds() { let newQueueIds = this.getCalledQueueIds(); let oldQueueIds = window.bo.zmscalldisplay.queue.calledIds; let diff = $(newQueueIds).not(oldQueueIds).get(); - return (0 < diff.length); + return diff; + } + + hasNewQueueId() { + return (0 < this.getNewQueueIds().length); } getCalledQueueIds() { diff --git a/zmscalldisplay/public/_js/index.js b/zmscalldisplay/public/_js/index.js index 10d1e1df9..b772d4299 100644 --- a/zmscalldisplay/public/_js/index.js +++ b/zmscalldisplay/public/_js/index.js @@ -1,1405 +1,2 @@ -(()=>{function e(e){return e&&e.__esModule?e.default:e}// -------------------------------------------------------- -// ZMS Admin behavior -// -------------------------------------------------------- -// Import base libs -var t,n,r,i={};t="undefined"!=typeof window?window:i,n=function(e,t){var n,r=[],i=Object.getPrototypeOf,o=r.slice,a=r.flat?function(e){return r.flat.call(e)}:function(e){return r.concat.apply([],e)},s=r.push,u=r.indexOf,l={},c=l.toString,f=l.hasOwnProperty,d=f.toString,p=d.call(Object),h={},g=function(e){// Support: Chrome <=57, Firefox <=52 -// In some browsers, typeof returns "function" for HTML elements -// (i.e., `typeof document.createElement( "object" ) === "function"`). -// We don't want to classify *any* DOM node as a function. -// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 -// Plus for old WebKit, typeof returns "function" for HTML collections -// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) -return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},v=function(e){return null!=e&&e===e.window},y=e.document,m={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,i,o=(n=n||y).createElement("script");if(o.text=e,t)for(r in m)// Support: Firefox 64+, Edge 18+ -// Some browsers don't support the "nonce" property on scripts. -// On the other hand, just using `getAttribute` is not enough as -// the `nonce` attribute is reset to an empty string whenever it -// becomes browsing-context connected. -// See https://github.com/whatwg/html/issues/2369 -// See https://html.spec.whatwg.org/#nonce-attributes -// The `node.getAttribute` check was added for the sake of -// `jQuery.globalEval` so that it can fake a nonce-containing node -// via an object. -(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function b(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}/* global Symbol */// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module -var w="3.7.1",T=/HTML$/i,C=function(e,t){// The jQuery object is actually just the init constructor 'enhanced' -// Need init if jQuery is called (just allow error to be thrown if not included) -return new C.fn.init(e,t)};function k(e){// Support: real iOS 8.2 only (not reproducible in simulator) -// `in` check used to prevent JIT error (gh-2145) -// hasOwn isn't used here due to false negatives -// regarding Nodelist length in IE -var t=!!e&&"length"in e&&e.length,n=b(e);return!(g(e)||v(e))&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}C.fn=C.prototype={// The current version of jQuery being used -jquery:w,constructor:C,// The default length of a jQuery object is 0 -length:0,toArray:function(){return o.call(this)},// Get the Nth element in the matched element set OR -// Get the whole matched element set as a clean array -get:function(e){return(// Return all the elements in a clean array -null==e?o.call(this):e<0?this[e+this.length]:this[e])},// Take an array of elements and push it onto the stack -// (returning the new matched element set) -pushStack:function(e){// Build a new jQuery matched element set -var t=C.merge(this.constructor(),e);// Return the newly-formed element set -return(// Add the old object onto the stack (as a reference) -t.prevObject=this,t)},// Execute a callback for every element in the matched set. -each:function(e){return C.each(this,e)},map:function(e){return this.pushStack(C.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(C.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(C.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n+~]|"+M+")"+M+"*"),F=RegExp(M+"|>"),W=new RegExp(I),$=RegExp("^"+O+"$"),z={ID:RegExp("^#("+O+")"),CLASS:RegExp("^\\.("+O+")"),TAG:RegExp("^("+O+"|[*])"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),// For use in libraries implementing .is() -// We use this for POS matching in `select` -needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},U=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Q=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Y=/[+~]/,// https://www.w3.org/TR/CSS21/syndata.html#escaped-characters -V=RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),J=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},// Support: IE 9 - 11+, Edge 12 - 18+ -// Removing the function wrapper causes a "Permission Denied" -// error in IE/Edge. -G=function(){ea()},K=ec(function(e){return!0===e.disabled&&A(e,"fieldset")},{dir:"parentNode",next:"legend"});// Optimize for push.apply( _, NodeList ) -try{m.apply(r=o.call(y.childNodes),y.childNodes),// Support: Android <=4.0 -// Detect silently failing push.apply -// eslint-disable-next-line no-unused-expressions -r[y.childNodes.length].nodeType}catch(e){m={apply:function(e,t){s.apply(e,o.call(t))},call:function(e){s.apply(e,o.call(arguments,1))}}}function Z(e,t,n,r){var i,o,a,s,u,l,f,d=t&&t.ownerDocument,v=t?t.nodeType:9;// Return early from calls with invalid selector or context -if(n=n||[],"string"!=typeof e||!e||1!==v&&9!==v&&11!==v)return n;// Try to shortcut find operations (as opposed to filters) in HTML documents -if(!r&&(ea(t),t=t||c,p)){// If the selector is sufficiently simple, try using a "get*By*" DOM method -// (excepting DocumentFragment context, where the methods don't exist) -if(11!==v&&(u=Q.exec(e))){// ID selector -if(i=u[1]){// Document context -if(9===v){if(!(a=t.getElementById(i)))return n;if(a.id===i)return m.call(n,a),n;// Element context -}else // getElementById can match elements by name instead of ID -if(d&&(a=d.getElementById(i))&&Z.contains(t,a)&&a.id===i)return m.call(n,a),n}else if(u[2])return m.apply(n,t.getElementsByTagName(e)),n;else if((i=u[3])&&t.getElementsByClassName)return m.apply(n,t.getElementsByClassName(i)),n}// Take advantage of querySelectorAll -if(!L[e+" "]&&(!g||!g.test(e))){// qSA considers elements outside a scoping root when evaluating child or -// descendant combinators, which is not what we want. -// In such cases, we work around the behavior by prefixing every selector in the -// list with an ID selector referencing the scope context. -// The technique has to be used as well when a leading combinator is used -// as such selectors are not recognized by querySelectorAll. -// Thanks to Andrew Dupont for this technique. -if(f=e,d=t,1===v&&(F.test(e)||_.test(e))){for(// Expand context for sibling selectors -(d=Y.test(e)&&eo(t.parentNode)||t)==t&&h.scope||((s=t.getAttribute("id"))?s=C.escapeSelector(s):t.setAttribute("id",s=x)),o=// Prefix every selector in the list -(l=eu(e)).length;o--;)l[o]=(s?"#"+s:":scope")+" "+el(l[o]);f=l.join(",")}try{return m.apply(n,d.querySelectorAll(f)),n}catch(t){L(e,!0)}finally{s===x&&t.removeAttribute("id")}}}// All others -return eh(e.replace(N,"$1"),t,n,r)}/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */function ee(){var e=[];return function t(r,i){return e.push(r+" ")>n.cacheLength&&delete t[e.shift()],t[r+" "]=i}}/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */function et(e){return e[x]=!0,e}/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */function en(e){var t=c.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),// release memory in IE -t=null}}/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */function er(e){// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable -return function(t){// Only certain elements can match :enabled or :disabled -// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled -// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled -if("form"in t)return(// Check for inherited disabledness on relevant non-disabled elements: -// * listed form-associated elements in a disabled fieldset -// https://html.spec.whatwg.org/multipage/forms.html#category-listed -// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled -// * option elements in a disabled optgroup -// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled -// All such elements have a "form" property. -t.parentNode&&!1===t.disabled?// Option elements defer to a parent optgroup if present -"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||// Where there is no isDisabled, check manually -!e!==t.isDisabled&&K(t)===e:t.disabled===e);return"label"in t&&t.disabled===e}}/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */function ei(e){return et(function(t){return t=+t,et(function(n,r){// Match elements found at the specified indexes -for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}/** - * Checks a node for validity as a jQuery selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */function eo(e){return e&&void 0!==e.getElementsByTagName&&e}/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - * @returns {Object} Returns the current document - */function ea(e){var t,r=e?e.ownerDocument||e:y;return r!=c&&9===r.nodeType&&r.documentElement&&(d=// Update global variables -(c=r).documentElement,p=!C.isXMLDoc(c),// Support: iOS 7 only, IE 9 - 11+ -// Older browsers didn't support unprefixed `matches`. -v=d.matches||d.webkitMatchesSelector||d.msMatchesSelector,d.msMatchesSelector&&// Support: IE 11+, Edge 17 - 18+ -// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -y!=c&&(t=c.defaultView)&&t.top!==t&&t.addEventListener("unload",G),// Support: IE <10 -// Check if getElementById returns elements by name -// The broken getElementById methods don't pick up programmatically-set names, -// so use a roundabout getElementsByName test -h.getById=en(function(e){return d.appendChild(e).id=C.expando,!c.getElementsByName||!c.getElementsByName(C.expando).length}),// Support: IE 9 only -// Check to see if it's possible to do matchesSelector -// on a disconnected node. -h.disconnectedMatch=en(function(e){return v.call(e,"*")}),// Support: IE 9 - 11+, Edge 12 - 18+ -// IE/Edge don't support the :scope pseudo-class. -h.scope=en(function(){return c.querySelectorAll(":scope")}),// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only -// Make sure the `:has()` argument is parsed unforgivingly. -// We include `*` in the test to detect buggy implementations that are -// _selectively_ forgiving (specifically when the list includes at least -// one valid selector). -// Note that we treat complete lack of support for `:has()` as if it were -// spec-compliant support, which is fine because use of `:has()` in such -// environments will fail in the qSA path and fall back to jQuery traversal -// anyway. -h.cssHas=en(function(){try{return c.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),h.getById?(n.filter.ID=function(e){var t=e.replace(V,J);return function(e){return e.getAttribute("id")===t}},n.find.ID=function(e,t){if(void 0!==t.getElementById&&p){var n=t.getElementById(e);return n?[n]:[]}}):(n.filter.ID=function(e){var t=e.replace(V,J);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},// Support: IE 6 - 7 only -// getElementById is not reliable as a find shortcut -n.find.ID=function(e,t){if(void 0!==t.getElementById&&p){var n,r,i,o=t.getElementById(e);if(o){if(// Verify the id attribute -(n=o.getAttributeNode("id"))&&n.value===e)return[o];for(// Fall back on getElementsByName -i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),// Tag -n.find.TAG=function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},// Class -n.find.CLASS=function(e,t){if(void 0!==t.getElementsByClassName&&p)return t.getElementsByClassName(e)},/* QSA/matchesSelector - ---------------------------------------------------------------------- */// QSA and matchesSelector support -g=[],// Build QSA regex -// Regex strategy adopted from Diego Perini -en(function(e){var t;d.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+M+"*(?:value|"+B+")"),e.querySelectorAll("[id~="+x+"-]").length||g.push("~="),e.querySelectorAll("a#"+x+"+*").length||g.push(".#.+[+~]"),e.querySelectorAll(":checked").length||g.push(":checked"),// Support: Windows 8 Native Apps -// The type and name attributes are restricted during .innerHTML assignment -(t=c.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),// Support: IE 9 - 11+ -// IE's :disabled selector does not pick up the children of disabled fieldsets -// Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ -// In some of the document kinds, these selectors wouldn't work natively. -// This is probably OK but for backwards compatibility we want to maintain -// handling them through jQuery traversal in jQuery 3.x. -d.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),// Support: IE 11+, Edge 15 - 18+ -// IE 11/Edge don't find elements on a `[name='']` query in some cases. -// Adding a temporary attribute to the document before the selection works -// around the issue. -// Interestingly, IE 10 & older don't seem to have the issue. -(t=c.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||g.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")")}),h.cssHas||// Our regular `try-catch` mechanism fails to detect natively-unsupported -// pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) -// in browsers that parse the `:has()` argument as a forgiving selector list. -// https://drafts.csswg.org/selectors/#relational now requires the argument -// to be parsed unforgivingly, but browsers have not yet fully adjusted. -g.push(":has"),g=g.length&&new RegExp(g.join("|")),/* Sorting - ---------------------------------------------------------------------- */// Document order sorting -q=function(e,t){// Flag for duplicate removal -if(e===t)return l=!0,0;// Sort on method existence if only one input has compareDocumentPosition -var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&// Calculate position if both inputs belong to the same document -// Support: IE 11+, Edge 17 - 18+ -// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!h.sortDetached&&t.compareDocumentPosition(e)===n?// Choose the first element that is related to our preferred document -// Support: IE 11+, Edge 17 - 18+ -// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -e===c||e.ownerDocument==y&&Z.contains(y,e)?-1:t===c||t.ownerDocument==y&&Z.contains(y,t)?1:a?u.call(a,e)-u.call(a,t):0:4&n?-1:1)}),c}// Add button/input type pseudos -for(t in Z.matches=function(e,t){return Z(e,null,null,t)},Z.matchesSelector=function(e,t){if(ea(e),p&&!L[t+" "]&&(!g||!g.test(t)))try{var n=v.call(e,t);// IE 9's matchesSelector returns false on disconnected nodes -if(n||h.disconnectedMatch||// As well, disconnected nodes are said to be in a document -// fragment in IE 9 -e.document&&11!==e.document.nodeType)return n}catch(e){L(t,!0)}return Z(t,c,null,[e]).length>0},Z.contains=function(e,t){return(e.ownerDocument||e)!=c&&ea(e),C.contains(e,t)},Z.attr=function(e,t){// Set document vars if needed -// Support: IE 11+, Edge 17 - 18+ -// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -(e.ownerDocument||e)!=c&&ea(e);var r=n.attrHandle[t.toLowerCase()],i=r&&f.call(n.attrHandle,t.toLowerCase())?r(e,t,!p):void 0;return void 0!==i?i:e.getAttribute(t)},Z.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */C.uniqueSort=function(e){var t,n=[],r=0,i=0;if(// Unless we *know* we can detect duplicates, assume their presence -// -// Support: Android <=4.0+ -// Testing for detecting duplicates is unpredictable so instead assume we can't -// depend on duplicate detection in all browsers without a stable sort. -l=!h.sortStable,a=!h.sortStable&&o.call(e,0),S.call(e,q),l){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)D.call(e,n[r],1)}return(// Clear input after sorting to release objects -// See https://github.com/jquery/sizzle/pull/225 -a=null,e)},C.fn.uniqueSort=function(){return this.pushStack(C.uniqueSort(o.apply(this)))},(n=C.expr={// Can be adjusted by the user -cacheLength:50,createPseudo:et,match:z,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(V,J),// Move the given value to match[3] whether quoted or unquoted -e[3]=(e[3]||e[4]||e[5]||"").replace(V,J),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return(/* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||Z.error(e[0]),// numeric x and y parameters for Expr.filter.CHILD -// remember that false/true cast respectively to 0/1 -e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&Z.error(e[0]),e)},PSEUDO:function(e){var t,n=!e[6]&&e[2];return z.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&W.test(n)&&// Get excess from tokenize (recursively) -(t=eu(n,!0))&&// advance to the next closing parenthesis -(t=n.indexOf(")",n.length-t)-n.length)&&(// excess is a negative index -e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(V,J).toLowerCase();return"*"===e?function(){return!0}:function(e){return A(e,t)}},CLASS:function(e){var t=T[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"),T(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,t,n){return function(r){var i=Z.attr(r,e);return null==i?"!="===t:!t||((i+="","="===t)?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(H," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,m=!1;if(g){// :(first|last|only)-(child|of-type) -if(o){for(;h;){for(f=t;f=f[h];)if(s?A(f,v):1===f.nodeType)return!1;// Reverse direction for :only-* (if we haven't yet done so) -p=h="only"===e&&!p&&"nextSibling"}return!0}// non-xml :nth-child(...) stores cache data on `parent` -if(p=[a?g.firstChild:g.lastChild],a&&y){for(m=(d=(l=// Seek `elem` from a previously-cached index -(c=g[x]||(g[x]={}))[e]||[])[0]===b&&l[1])&&l[2],f=d&&g.childNodes[d];f=++d&&f&&f[h]||// Fallback to seeking `elem` from the start -(m=d=0)||p.pop();)if(1===f.nodeType&&++m&&f===t){c[e]=[b,d,m];break}}else // xml :nth-child(...) -// or :nth-last-child(...) or :nth(-last)?-of-type(...) -if(y&&(m=d=(l=(c=t[x]||(t[x]={}))[e]||[])[0]===b&&l[1]),!1===m)// Use the same loop as above to seek `elem` from the start -for(;(f=++d&&f&&f[h]||(m=d=0)||p.pop())&&(!((s?A(f,v):1===f.nodeType)&&++m)||(y&&((c=f[x]||(f[x]={}))[e]=[b,m]),f!==t)););return(// Incorporate the offset, then check against cycle size -(m-=i)===r||m%r==0&&m/r>=0)}}},PSEUDO:function(e,t){// pseudo-class names are case-insensitive -// https://www.w3.org/TR/selectors/#pseudo-classes -// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters -// Remember that setFilters inherits from pseudos -var r,i=n.pseudos[e]||n.setFilters[e.toLowerCase()]||Z.error("unsupported pseudo: "+e);return(// The user may use createPseudo to indicate that -// arguments are needed to create the filter function -// just as jQuery does -i[x]?i(t):i.length>1?(r=[e,e,"",t],n.setFilters.hasOwnProperty(e.toLowerCase())?et(function(e,n){for(var r,o=i(e,t),a=o.length;a--;)r=u.call(e,o[a]),e[r]=!(n[r]=o[a])}):function(e){return i(e,0,r)}):i)}},pseudos:{// Potentially complex pseudos -not:et(function(e){// Trim the selector passed to compile -// to avoid treating leading and trailing -// spaces as combinators -var t=[],n=[],r=ep(e.replace(N,"$1"));return r[x]?et(function(e,t,n,i){// Match elements unmatched by `matcher` -for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),// Don't keep the element -// (see https://github.com/jquery/sizzle/issues/299) -t[0]=null,!n.pop()}}),has:et(function(e){return function(t){return Z(e,t).length>0}}),contains:et(function(e){return e=e.replace(V,J),function(t){return(t.textContent||C.text(t)).indexOf(e)>-1}}),// "Whether an element is represented by a :lang() selector -// is based solely on the element's language value -// being equal to the identifier C, -// or beginning with the identifier C immediately followed by "-". -// The matching of C against the element's language value is performed case-insensitively. -// The identifier C does not have to be a valid language name." -// https://www.w3.org/TR/selectors/#lang-pseudo -lang:et(function(e){return $.test(e||"")||Z.error("unsupported lang: "+e),e=e.replace(V,J).toLowerCase(),function(t){var n;do if(n=p?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType)return!1}}),// Miscellaneous -target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function(){try{return c.activeElement}catch(e){}}()&&c.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},// Boolean properties -enabled:er(!1),disabled:er(!0),checked:function(e){// In CSS3, :checked should return both checked and selected elements -// https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked -return A(e,"input")&&!!e.checked||A(e,"option")&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},// Contents -empty:function(e){// https://www.w3.org/TR/selectors/#empty-pseudo -// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), -// but not by others (comment: 8; processing instruction: 7; etc.) -// nodeType < 6 works because attributes (2) do not appear as children -for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!n.pseudos.empty(e)},// Element/input types -header:function(e){return X.test(e.nodeName)},input:function(e){return U.test(e.nodeName)},button:function(e){return A(e,"input")&&"button"===e.type||A(e,"button")},text:function(e){var t;return A(e,"input")&&"text"===e.type&&// Support: IE <10 only -// New HTML5 attribute values (e.g., "search") appear -// with elem.type === "text" -(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},// Position-in-collection -first:ei(function(){return[0]}),last:ei(function(e,t){return[t-1]}),eq:ei(function(e,t,n){return[n<0?n+t:n]}),even:ei(function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e}),gt:ei(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function ed(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s-1},c,!0),h=[function(e,t,n){// Support: IE 11+, Edge 17 - 18+ -// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -var o=!l&&(n||t!=i)||((r=t).nodeType?d(e,t,n):p(e,t,n));return(// Avoid hanging onto element -// (see https://github.com/jquery/sizzle/issues/299) -r=null,o)}];f-1&&(e[c]=!(a[c]=d))}}else p=ed(p===a?p.splice(v,p.length):p),o?o(null,a,p,l):m.apply(a,p)})}(f>1&&ef(h),f>1&&el(t.slice(0,f-1).concat({value:" "===t[f-2].type?"*":""})).replace(N,"$1"),o,f0,o=f.length>0,a=function(e,t,a,s,u){var d,h,g,v=0,y="0",x=e&&[],w=[],T=i,k=e||o&&n.find.TAG("*",u),A=b+=null==T?1:Math.random()||.1,S=k.length;// Add elements passing elementMatchers directly to results -// Support: iOS <=7 - 9 only -// Tolerate NodeList properties (IE: "length"; Safari: ) matching -// elements by id. (see trac-14142) -for(u&&// IE/Edge sometimes throw a "Permission denied" error when strict-comparing -// two documents; shallow comparisons work. -// eslint-disable-next-line eqeqeq -(i=t==c||t||u);y!==S&&null!=(d=k[y]);y++){if(o&&d){for(h=0,t||d.ownerDocument==c||(ea(d),a=!p);g=f[h++];)if(g(d,t||c,a)){m.call(s,d);break}u&&(b=A)}// Track unmatched elements for set filters -r&&((d=!g&&d)&&v--,e&&x.push(d))}// Apply set filters to unmatched elements -// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` -// equals `i`), unless we didn't visit _any_ elements in the above loop because we have -// no element matchers and no seed. -// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that -// case, which will result in a "00" `matchedCount` that differs from `i` but is also -// numerically zero. -if(// `i` is now the count of elements visited above, and adding it to `matchedCount` -// makes the latter nonnegative. -v+=y,r&&y!==v){for(h=0;g=l[h++];)g(x,w,t,a);if(e){// Reintegrate element matches to eliminate the need for sorting -if(v>0)for(;y--;)x[y]||w[y]||(w[y]=E.call(s));// Discard index placeholder values to get only actual matches -w=ed(w)}// Add matches to results -m.apply(s,w),u&&!e&&w.length>0&&v+l.length>1&&C.uniqueSort(s)}return u&&(b=A,i=T),x},r?et(a):a))).selector=e}return d}/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */function eh(e,t,r,i){var o,a,s,u,l,c="function"==typeof e&&e,f=!i&&eu(e=c.selector||e);// Try to minimize operations if there is only one selector in the list and no seed -// (the latter of which guarantees us context) -if(r=r||[],1===f.length){if(// Reduce context if the leading compound selector is an ID -(a=f[0]=f[0].slice(0)).length>2&&"ID"===(s=a[0]).type&&9===t.nodeType&&p&&n.relative[a[1].type]){if(!(t=(n.find.ID(s.matches[0].replace(V,J),t)||[])[0]))return r;c&&(t=t.parentNode),e=e.slice(a.shift().value.length)}for(// Fetch a seed set for right-to-left matching -o=z.needsContext.test(e)?0:a.length;// Abort if we hit a combinator -o--&&(s=a[o],!n.relative[u=s.type]);)if((l=n.find[u])&&(i=l(s.matches[0].replace(V,J),Y.test(a[0].type)&&eo(t.parentNode)||t))){if(// If seed is empty or no tokens remain, we can return early -a.splice(o,1),!(e=i.length&&el(a)))return m.apply(r,i),r;break}}return(// Compile and execute a filtering function if one is not provided -// Provide `match` to avoid retokenization if we modified the selector above -(c||ep(e,f))(i,t,!p,r,!t||Y.test(e)&&eo(t.parentNode)||t),r)}es.prototype=n.filters=n.pseudos,n.setFilters=new es,// One-time assignments -// Support: Android <=4.0 - 4.1+ -// Sort stability -h.sortStable=x.split("").sort(q).join("")===x,// Initialize against the default document -ea(),// Support: Android <=4.0 - 4.1+ -// Detached nodes confoundingly follow *each other* -h.sortDetached=en(function(e){// Should return 1, but returns 4 (following) -return 1&e.compareDocumentPosition(c.createElement("fieldset"))}),C.find=Z,// Deprecated -C.expr[":"]=C.expr.pseudos,C.unique=C.uniqueSort,// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -Z.compile=ep,Z.select=eh,Z.setDocument=ea,Z.tokenize=eu,Z.escape=C.escapeSelector,Z.getText=C.text,Z.isXML=C.isXMLDoc,Z.selectors=C.expr,Z.support=C.support,Z.uniqueSort=C.uniqueSort;/* eslint-enable */}();var q=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&C(e).is(n))break;r.push(e)}return r},B=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},O=C.expr.match.needsContext,P=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;// Implement the identical functionality for filter and not -function I(e,t,n){return g(t)?C.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?C.grep(e,function(e){return e===t!==n}):"string"!=typeof t?C.grep(e,function(e){return u.call(t,e)>-1!==n}):C.filter(t,e,n)}C.filter=function(e,t,n){var r=t[0];return(n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType)?C.find.matchesSelector(r,e)?[r]:[]:C.find.matches(e,C.grep(t,function(e){return 1===e.nodeType}))},C.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(C(e).filter(function(){for(t=0;t1?C.uniqueSort(n):n},filter:function(e){return this.pushStack(I(this,e||[],!1))},not:function(e){return this.pushStack(I(this,e||[],!0))},is:function(e){return!!I(this,// so $("p:first").is("p:last") won't return true for a doc with two "p". -"string"==typeof e&&O.test(e)?C(e):e||[],!1).length}});// Initialize a jQuery object -// A central reference to the root jQuery(document) -var H,// Prioritize #id over to avoid XSS via location.hash (trac-9521) -// Strict HTML recognition (trac-11290: must start with <) -// Shortcut simple #id case for speed -R=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;// Give the init function the jQuery prototype for later instantiation -(C.fn.init=function(e,t,n){var r,i;// HANDLE: $(""), $(null), $(undefined), $(false) -if(!e)return this;// Handle HTML strings -if(// Method init() accepts an alternate rootjQuery -// so migrate can support jQuery.sub (gh-2101) -n=n||H,"string"==typeof e){// Match html or make sure no context is specified for #id -if((r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:R.exec(e))&&(r[1]||!t)){// HANDLE: $(html) -> $(array) -if(!r[1])return(i=y.getElementById(r[2]))&&(// Inject the element directly into the jQuery object -this[0]=i,this.length=1),this;// HANDLE: $(html, props) -if(t=t instanceof C?t[0]:t,// Option to run scripts is true for back-compat -// Intentionally let the error be thrown if parseHTML is not present -C.merge(this,C.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:y,!0)),P.test(r[1])&&C.isPlainObject(t))for(r in t)g(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);// HANDLE: $(DOMElement) -}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(C):C.makeArray(e,this)}).prototype=C.fn,// Initialize central reference -H=C(y);var _=/^(?:parents|prev(?:Until|All))/,F={children:!0,contents:!0,next:!0,prev:!0};function W(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}C.fn.extend({has:function(e){var t=C(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&C.find.matchesSelector(n,e))){o.push(n);break}}return this.pushStack(o.length>1?C.uniqueSort(o):o)},// Determine the position of an element within the set -index:function(e){return(// No argument, return index in parent -e?"string"==typeof e?u.call(C(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1)},add:function(e,t){return this.pushStack(C.uniqueSort(C.merge(this.get(),C(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),C.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return q(e,"parentNode")},parentsUntil:function(e,t,n){return q(e,"parentNode",n)},next:function(e){return W(e,"nextSibling")},prev:function(e){return W(e,"previousSibling")},nextAll:function(e){return q(e,"nextSibling")},prevAll:function(e){return q(e,"previousSibling")},nextUntil:function(e,t,n){return q(e,"nextSibling",n)},prevUntil:function(e,t,n){return q(e,"previousSibling",n)},siblings:function(e){return B((e.parentNode||{}).firstChild,e)},children:function(e){return B(e.firstChild)},contents:function(e){return null!=e.contentDocument&&// Support: IE 11+ -// elements with no `data` attribute has an object -// `contentDocument` with a `null` prototype. -i(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),C.merge([],e.childNodes))}},function(e,t){C.fn[e]=function(n,r){var i=C.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=C.filter(r,i)),this.length>1&&(F[e]||C.uniqueSort(i),_.test(e)&&i.reverse()),this.pushStack(i)}});var $=/[^\x20\t\r\n\f]+/g;function z(e){return e}function U(e){throw e}function X(e,t,n,r){var i;try{// Check for promise aspect first to privilege synchronous behavior -e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):// * false: [ value ].slice( 0 ) => resolve( value ) -// * true: [ value ].slice( 1 ) => resolve() -t.apply(void 0,[e].slice(r));// For Promises/A+, convert exceptions into rejections -// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in -// Deferred#then to conditionally suppress rejection. -}catch(e){// Support: Android 4.0 only -// Strict mode functions invoked without .call/.apply get global-object context -n.apply(void 0,[e])}}/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */C.Callbacks=function(e){// Convert options from String-formatted to Object-formatted if needed -// (we check in cache first) -e="string"==typeof e?(t=e,n={},C.each(t.match($)||[],function(e,t){n[t]=!0}),n):C.extend({},e);var t,n,r,i,o,a,s=[],u=[],l=-1,c=function(){for(// Enforce single-firing -a=a||e.once,// Execute callbacks for all pending executions, -// respecting firingIndex overrides and runtime changes -o=r=!0;u.length;l=-1)for(i=u.shift();++l-1;)s.splice(n,1),n<=l&&l--}),this},// Check if a given callback is in the list. -// If no argument is given, return whether or not list has callbacks attached. -has:function(e){return e?C.inArray(e,s)>-1:s.length>0},// Remove all callbacks from the list -empty:function(){return s&&(s=[]),this},// Disable .fire and .add -// Abort any current/pending executions -// Clear all callbacks and values -disable:function(){return a=u=[],s=i="",this},disabled:function(){return!s},// Disable .fire -// Also disable .add unless we have memory (since it would have no effect) -// Abort any pending executions -lock:function(){return a=u=[],i||r||(s=i=""),this},locked:function(){return!!a},// Call all callbacks with the given context and arguments -fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),r||c()),this},// Call all the callbacks with the given arguments -fire:function(){return f.fireWith(this,arguments),this},// To know if the callbacks have already been called at least once -fired:function(){return!!o}};return f},C.extend({Deferred:function(t){var n=[// action, add listener, callbacks, -// ... .then handlers, argument index, [final state] -["notify","progress",C.Callbacks("memory"),C.Callbacks("memory"),2],["resolve","done",C.Callbacks("once memory"),C.Callbacks("once memory"),0,"resolved"],["reject","fail",C.Callbacks("once memory"),C.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},// Keep pipe for back-compat -pipe:function(){var e=arguments;return C.Deferred(function(t){C.each(n,function(n,r){// Map tuples (progress, done, fail) to arguments (done, fail, progress) -var i=g(e[r[4]])&&e[r[4]];// deferred.progress(function() { bind to newDefer or newDefer.notify }) -// deferred.done(function() { bind to newDefer or newDefer.resolve }) -// deferred.fail(function() { bind to newDefer or newDefer.reject }) -o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;// Support: Promises/A+ section 2.3.3.3.3 -// https://promisesaplus.com/#point-59 -// Ignore double-resolution attempts -if(!(t=o&&(r!==U&&(s=void 0,u=[e]),n.rejectWith(s,u))}};// Support: Promises/A+ section 2.3.3.3.1 -// https://promisesaplus.com/#point-57 -// Re-resolve promises immediately to dodge false rejection from -// subsequent errors -t?c():(C.Deferred.getErrorHook?c.error=C.Deferred.getErrorHook():C.Deferred.getStackHook&&(c.error=C.Deferred.getStackHook()),e.setTimeout(c))}}return C.Deferred(function(e){// progress_handlers.add( ... ) -n[0][3].add(a(0,e,g(i)?i:z,e.notifyWith)),// fulfilled_handlers.add( ... ) -n[1][3].add(a(0,e,g(t)?t:z)),// rejected_handlers.add( ... ) -n[2][3].add(a(0,e,g(r)?r:U))}).promise()},// Get a promise for this deferred -// If obj is provided, the promise aspect is added to the object -promise:function(e){return null!=e?C.extend(e,i):i}},o={};// All done! -return(// Add list-specific methods -C.each(n,function(e,t){var a=t[2],s=t[5];// promise.progress = list.add -// promise.done = list.add -// promise.fail = list.add -i[t[1]]=a.add,s&&a.add(function(){// state = "resolved" (i.e., fulfilled) -// state = "rejected" -r=s},// fulfilled_callbacks.disable -n[3-e][2].disable,// fulfilled_handlers.disable -n[3-e][3].disable,n[0][2].lock,n[0][3].lock),// progress_handlers.fire -// fulfilled_handlers.fire -// rejected_handlers.fire -a.add(t[3].fire),// deferred.notify = function() { deferred.notifyWith(...) } -// deferred.resolve = function() { deferred.resolveWith(...) } -// deferred.reject = function() { deferred.rejectWith(...) } -o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},// deferred.notifyWith = list.fireWith -// deferred.resolveWith = list.fireWith -// deferred.rejectWith = list.fireWith -o[t[0]+"With"]=a.fireWith}),// Make the deferred a promise -i.promise(o),t&&t.call(o,o),o)},// Deferred helper -when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=C.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};// Single- and empty arguments are adopted like Promise.resolve -if(t<=1&&(X(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();// Multiple arguments are aggregated like Promise.all array elements -for(;n--;)X(i[n],s(n),a.reject);return a.promise()}});// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error -// captured before the async barrier to get the original error cause -// which may otherwise be hidden. -C.Deferred.exceptionHook=function(t,n){// Support: IE 8 - 9 only -// Console exists when dev tools are open, which can happen at any time -e.console&&e.console.warn&&t&&Q.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},C.readyException=function(t){e.setTimeout(function(){throw t})};// The deferred used on DOM ready -var Y=C.Deferred();// The ready event handler and self cleanup method -function V(){y.removeEventListener("DOMContentLoaded",V),e.removeEventListener("load",V),C.ready()}C.fn.ready=function(e){return Y.then(e)// Wrap jQuery.readyException in a function so that the lookup -// happens at the time of error handling instead of callback -// registration. -.catch(function(e){C.readyException(e)}),this},C.extend({// Is the DOM ready to be used? Set to true once it occurs. -isReady:!1,// A counter to track how many items to wait for before -// the ready event fires. See trac-6781 -readyWait:1,// Handle when the DOM is ready -ready:function(e){// Abort if there are pending holds or we're already ready -!(!0===e?--C.readyWait:C.isReady)&&(// Remember that the DOM is ready -C.isReady=!0,!0!==e&&--C.readyWait>0||// If there are functions bound, to execute -Y.resolveWith(y,[C]))}}),C.ready.then=Y.then,"complete"!==y.readyState&&("loading"===y.readyState||y.documentElement.doScroll)?(// Use the handy event callback -y.addEventListener("DOMContentLoaded",V),// A fallback to window.onload, that will always work -e.addEventListener("load",V)):e.setTimeout(C.ready);// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var J=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;// Sets many values -if("object"===b(n))for(s in i=!0,n)J(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(C(e),n)})),t))for(;s1,null,!0))},removeData:function(e){return this.each(function(){ei.remove(this,e)})}}),C.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=er.get(e,t),n&&(!r||Array.isArray(n)?r=er.access(e,t,C.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=C.queue(e,t),r=n.length,i=n.shift(),o=C._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),// Clear up the last queue stop function -delete o.stop,i.call(e,function(){C.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},// Not public - generate a queueHooks object, or return the current one -_queueHooks:function(e,t){var n=t+"queueHooks";return er.get(e,n)||er.access(e,n,{empty:C.Callbacks("once memory").add(function(){er.remove(e,[t+"queue",n])})})}}),C.fn.extend({queue:function(e,t){var n=2;return("string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,eb=/^$|^module$|\/(?:java|ecma)script/i;e5=y.createDocumentFragment().appendChild(y.createElement("div")),// Support: Android 4.0 - 4.3 only -// Check state lost if the name is set (trac-11217) -// Support: Windows Web Apps (WWA) -// `name` and `type` must use .setAttribute for WWA (trac-14901) -(e6=y.createElement("input")).setAttribute("type","radio"),e6.setAttribute("checked","checked"),e6.setAttribute("name","t"),e5.appendChild(e6),// Support: Android <=4.1 only -// Older WebKit doesn't clone checked state correctly in fragments -h.checkClone=e5.cloneNode(!0).cloneNode(!0).lastChild.checked,// Support: IE <=11 only -// Make sure textarea (and checkbox) defaultValue is properly cloned -e5.innerHTML="",h.noCloneChecked=!!e5.cloneNode(!0).lastChild.defaultValue,// Support: IE <=9 only -// IE <=9 replaces ",h.option=!!e5.lastChild;// We have to close these tags to support XHTML (trac-13200) -var ew={// XHTML parsers do not magically insert elements in the -// same way that tag soup parsers do. So we cannot shorten -// this by omitting or other required elements. -thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function eT(e,t){// Support: IE <=9 - 11 only -// Use typeof to avoid zero-argument method invocation on host objects (trac-15151) -var n;return(n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t))?C.merge([e],n):n}// Mark scripts as having already been evaluated -function eC(e,t){for(var n=0,r=e.length;n",""]);var ek=/<|&#?\w+;/;function eA(e,t,n,r,i){for(var o,a,s,u,l,c=t.createDocumentFragment(),f=[],d=0,p=e.length;d-1){i&&i.push(o);continue}// Capture executables -if(u=ed(o),// Append to fragment -a=eT(c.appendChild(o),"script"),u&&eC(a),n)for(l=0;o=a[l++];)eb.test(o.type||"")&&n.push(o)}return c}var eE=/^([^.]*)(?:\.(.+)|)/;function eS(){return!0}function eD(){return!1}function eM(e,t,n,r,i,o){var a,s;// Types can be a map of types/handlers -if("object"==typeof t){for(s in"string"!=typeof n&&(// ( types-Object, data ) -r=r||n,n=void 0),t)eM(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(// ( types, fn ) -i=n,r=n=void 0):null==i&&("string"==typeof n?(// ( types, selector, fn ) -i=r,r=void 0):(// ( types, data, fn ) -i=r,r=n,n=void 0)),!1===i)i=eD;else if(!i)return e;return 1===o&&(a=i,// Use same guid so caller can remove using origFn -(i=function(e){return(// Can use an empty set, since event contains the info -C().off(e),a.apply(this,arguments))}).guid=a.guid||(a.guid=C.guid++)),e.each(function(){C.event.add(this,t,i,r,n)})}// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function eN(e,t,n){// Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add -if(!n){void 0===er.get(e,t)&&C.event.add(e,t,eS);return}// Register the controller as a special universal handler for all event namespaces -er.set(e,t,!1),C.event.add(e,t,{namespace:!1,handler:function(e){var n,r=er.get(this,t);if(1&e.isTrigger&&this[t]){// Interrupt processing of the outer synthetic .trigger()ed event -if(r)(C.event.special[t]||{}).delegateType&&e.stopPropagation();else if(// Store arguments for use when handling the inner native event -// There will always be at least one argument (an event object), so this array -// will not be confused with a leftover capture object. -r=o.call(arguments),er.set(this,t,r),// Trigger the native event and capture its result -this[t](),n=er.get(this,t),er.set(this,t,!1),r!==n)return(// Cancel the outer synthetic event -e.stopImmediatePropagation(),e.preventDefault(),n)}else r&&(// ...and capture the result -er.set(this,t,C.event.trigger(r[0],r.slice(1),this)),// Abort handling of the native event by all jQuery handlers while allowing -// native handlers on the same element to run. On target, this is achieved -// by stopping immediate propagation just on the jQuery event. However, -// the native event is re-wrapped by a jQuery one on each level of the -// propagation so the only way to stop it for jQuery is to stop it for -// everyone via native `stopPropagation()`. This is not a problem for -// focus/blur which don't bubble, but it does also stop click on checkboxes -// and radios. We accept this limitation. -e.stopPropagation(),e.isImmediatePropagationStopped=eS)}})}/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */C.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,v=er.get(e);// Only attach events to objects that accept data -if(et(e))for(n.handler&&(n=(o=n).handler,i=o.selector),i&&C.find.matchesSelector(ef,i),n.guid||(n.guid=C.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(t){// Discard the second event of a jQuery.event.trigger() and -// when an event is called after a page has unloaded -return C.event.triggered!==t.type?C.event.dispatch.apply(e,arguments):void 0}),l=// Handle multiple events separated by a space -(t=(t||"").match($)||[""]).length;l--;)// There *must* be a type, no attaching namespace-only handlers -p=g=(s=eE.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),p&&(// If event changes its type, use the special event handlers for the changed type -f=C.event.special[p]||{},// If selector defined, determine special event api type, otherwise given type -p=(i?f.delegateType:f.bindType)||p,// Update special based on newly reset type -f=C.event.special[p]||{},// handleObj is passed to all event handlers -c=C.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&C.expr.match.needsContext.test(i),namespace:h.join(".")},o),(d=u[p])||((d=u[p]=[]).delegateCount=0,(!f.setup||!1===f.setup.call(e,r,h,a))&&e.addEventListener&&e.addEventListener(p,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),// Keep track of which events have ever been used, for event optimization -C.event.global[p]=!0)},// Detach an event or set of events from an element -remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,d,p,h,g,v=er.hasData(e)&&er.get(e);if(v&&(u=v.events)){for(l=// Once for each type.namespace in types; type may be omitted -(t=(t||"").match($)||[""]).length;l--;){// Unbind all events (on this namespace, if provided) for the element -if(p=g=(s=eE.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),!p){for(p in u)C.event.remove(e,p+t[l],n,r,!0);continue}for(f=C.event.special[p]||{},d=u[p=(r?f.delegateType:f.bindType)||p]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),// Remove matching events -a=o=d.length;o--;)c=d[o],(i||g===c.origType)&&(!n||n.guid===c.guid)&&(!s||s.test(c.namespace))&&(!r||r===c.selector||"**"===r&&c.selector)&&(d.splice(o,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));a&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||C.removeEvent(e,p,v.handle),delete u[p])}C.isEmptyObject(u)&&er.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=Array(arguments.length),u=C.event.fix(e),l=(er.get(this,"events")||Object.create(null))[u.type]||[],c=C.event.special[u.type]||{};for(t=1,// Use the fix-ed jQuery.Event rather than the (read-only) native event -s[0]=u;t instance trees (trac-13180) -l.nodeType&&// Support: Firefox <=42 -// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) -// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click -// Support: IE 11 only -// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) -!("click"===e.type&&e.button>=1)){for(;l!==this;l=l.parentNode||this)// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) -if(1===l.nodeType&&!("click"===e.type&&!0===l.disabled)){for(n=0,o=[],a={};n-1:C.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}}return(// Add the remaining (directly-bound) handlers -l=this,u\s*$/g;// Prefer a tbody over its parent table for containing new rows -function eB(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&C(e).children("tbody")[0]||e}// Replace/restore the type attribute of script elements for safe DOM manipulation -function eO(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function eP(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function eI(e,t){var n,r,i,o,a,s;if(1===t.nodeType){// 1. Copy private data: events, handlers, etc. -if(er.hasData(e)&&(s=er.get(e).events))for(i in er.remove(t,"handle events"),s)for(n=0,r=s[i].length;n1&&"string"==typeof v&&!h.checkClone&&eL.test(v))return e.each(function(i){var o=e.eq(i);y&&(t[0]=v.call(this,i,o.html())),eH(o,t,n,r)});if(d&&(o=(i=eA(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){// Use the original fragment for the last item -// instead of the first because it can end up -// being emptied incorrectly in certain situations (trac-8070). -for(u=(s=C.map(eT(i,"script"),eO)).length;f0&&eC(a,!u&&eT(e,"script")),s)},cleanData:function(e){for(var t,n,r,i=C.event.special,o=0;void 0!==(n=e[o]);o++)if(et(n)){if(t=n[er.expando]){if(t.events)for(r in t.events)i[r]?C.event.remove(n,r):C.removeEvent(n,r,t.handle);// Support: Chrome <=35 - 45+ -// Assign undefined instead of using delete, see Data#remove -n[er.expando]=void 0}n[ei.expando]&&// Assign undefined instead of using delete, see Data#remove -(n[ei.expando]=void 0)}}}),C.fn.extend({detach:function(e){return eR(this,e,!0)},remove:function(e){return eR(this,e)},text:function(e){return J(this,function(e){return void 0===e?C.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=e)})},null,e,arguments.length)},append:function(){return eH(this,arguments,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&eB(this,e).appendChild(e)})},prepend:function(){return eH(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=eB(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return eH(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return eH(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(// Prevent memory leaks -C.cleanData(eT(e,!1)),// Remove any remaining nodes -e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return C.clone(this,e,t)})},html:function(e){return J(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;// See if we can take a shortcut and just use innerHTML -if("string"==typeof e&&!ej.test(e)&&!ew[(ex.exec(e)||["",""])[1].toLowerCase()]){e=C.htmlPrefilter(e);try{for(;nC.inArray(this,e)&&(C.cleanData(eT(this)),n&&n.replaceChild(t,this));// Force callback invocation -},e)}}),C.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){C.fn[e]=function(e){for(var n,r=[],i=C(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),C(i[a])[t](n),// Support: Android <=4.0 only, PhantomJS 1 only -// .get() because push.apply(_, arraylike) throws on ancient WebKit -s.apply(r,n.get());return this.pushStack(r)}});var e_=RegExp("^("+eu+")(?!px)[a-z%]+$","i"),eF=/^--/,eW=function(t){// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) -// IE throws on elements created in popups -// FF meanwhile throws on frame elements through "defaultView.getComputedStyle" -var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},e$=function(e,t,n){var r,i,o={};// Remember the old values, and insert the new ones -for(i in t)o[i]=e.style[i],e.style[i]=t[i];// Revert the old values -for(i in r=n.call(e),t)e.style[i]=o[i];return r},ez=RegExp(ec.join("|"),"i");function eU(e,t,n){var r,i,o,a,s=eF.test(t),// Retrieving style before computed somehow -// fixes an issue with getting wrong values -// on detached elements -u=e.style;return(n=n||eW(e))&&(// Support: IE <=9 - 11+ -// IE only supports `"float"` in `getPropertyValue`; in computed styles -// it's only available as `"cssFloat"`. We no longer modify properties -// sent to `.css()` apart from camelCasing, so we need to check both. -// Normally, this would create difference in behavior: if -// `getPropertyValue` returns an empty string, the value returned -// by `.css()` would be `undefined`. This is usually the case for -// disconnected elements. However, in IE even disconnected elements -// with no styles return `"none"` for `getPropertyValue( "float" )` -a=n.getPropertyValue(t)||n[t],s&&a&&// Spec requires trimming whitespace for custom properties (gh-4926). -// Firefox only trims leading whitespace. Chrome just collapses -// both leading & trailing whitespace to a single space. -// -// Fall back to `undefined` if empty string returned. -// This collapses a missing definition with property defined -// and set to an empty string but there's no standard API -// allowing us to differentiate them without a performance penalty -// and returning `undefined` aligns with older jQuery. -// -// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED -// as whitespace while CSS does not, but this is not a problem -// because CSS preprocessing replaces them with U+000A LINE FEED -// (which *is* CSS whitespace) -// https://www.w3.org/TR/css-syntax-3/#input-preprocessing -(a=a.replace(N,"$1")||void 0),""!==a||ed(e)||(a=C.style(e,t)),!h.pixelBoxStyles()&&e_.test(a)&&ez.test(t)&&(// Remember the original values -r=u.width,i=u.minWidth,o=u.maxWidth,// Put in the new values to get a computed value out -u.minWidth=u.maxWidth=u.width=a,a=n.width,// Revert the changed values -u.width=r,u.minWidth=i,u.maxWidth=o)),void 0!==a?// IE returns zIndex value as an integer. -a+"":a}function eX(e,t){// Define the hook, we'll check on the first run if it's really needed. -return{get:function(){if(e()){// Hook not needed (or it's not possible to use it due -// to missing dependency), remove it. -delete this.get;return}// Hook needed; redefine it so that the support test is not executed again. -return(this.get=t).apply(this,arguments)}}}!function(){// Executing both pixelPosition & boxSizingReliable tests require only one layout -// so they're executed at the same time to save the second computation. -function t(){// This is a singleton, we need to execute it only once -if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ef.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);r="1%"!==t.top,// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 -u=12===n(t.marginLeft),// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 -// Some styles come back with percentage values, even though they shouldn't -c.style.right="60%",a=36===n(t.right),// Support: IE 9 - 11 only -// Detect misreporting of content dimensions for box-sizing:border-box elements -i=36===n(t.width),// Support: IE 9 only -// Detect overflow:scroll screwiness (gh-3699) -// Support: Chrome <=64 -// Don't get tricked when zoom affects offsetWidth (gh-4029) -c.style.position="absolute",o=12===n(c.offsetWidth/3),ef.removeChild(l),// Nullify the div so it wouldn't be stored in the memory and -// it will also be a sign that checks already performed -c=null}}function n(e){return Math.round(parseFloat(e))}var r,i,o,a,s,u,l=y.createElement("div"),c=y.createElement("div");// Finish early in limited (non-browser) environments -c.style&&(// Support: IE <=9 - 11 only -// Style of cloned element affects source element cloned (trac-8908) -c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,C.extend(h,{boxSizingReliable:function(){return t(),i},pixelBoxStyles:function(){return t(),a},pixelPosition:function(){return t(),r},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),o},// Support: IE 9 - 11+, Edge 15 - 18+ -// IE/Edge misreport `getComputedStyle` of table rows with width/height -// set in CSS while `offset*` properties report correct values. -// Behavior in IE 9 is more subtle than in newer versions & it passes -// some versions of this test; make sure not to make it pass there! -// -// Support: Firefox 70+ -// Only Firefox includes border widths -// in computed dimensions. (gh-4529) -reliableTrDimensions:function(){var t,n,r,i;return null==s&&(t=y.createElement("table"),n=y.createElement("tr"),r=y.createElement("div"),t.style.cssText="position:absolute;left:-11111px;border-collapse:separate",n.style.cssText="box-sizing:content-box;border:1px solid",// Support: Chrome 86+ -// Height set through cssText does not get applied. -// Computed height then comes back as 0. -n.style.height="1px",r.style.height="9px",// Support: Android 8 Chrome 86+ -// In our bodyBackground.html iframe, -// display for all div elements is set to "inline", -// which causes a problem only in Android 8 Chrome 86. -// Ensuring the div is `display: block` -// gets around this issue. -r.style.display="block",ef.appendChild(t).appendChild(n).appendChild(r),s=parseInt((i=e.getComputedStyle(n)).height,10)+parseInt(i.borderTopWidth,10)+parseInt(i.borderBottomWidth,10)===n.offsetHeight,ef.removeChild(t)),s}}))}();var eQ=["Webkit","Moz","ms"],eY=y.createElement("div").style,eV={};// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function eJ(e){return C.cssProps[e]||eV[e]||(e in eY?e:eV[e]=// Return a vendor-prefixed property or undefined -function(e){for(// Check for vendor prefixed names -var t=e[0].toUpperCase()+e.slice(1),n=eQ.length;n--;)if((e=eQ[n]+t)in eY)return e}(e)||e)}var // except "table", "table-cell", or "table-caption" -// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display -eG=/^(none|table(?!-c[ea]).+)/,eK={position:"absolute",visibility:"hidden",display:"block"},eZ={letterSpacing:"0",fontWeight:"400"};function e1(e,t,n){// Any relative (+/-) values have already been -// normalized at this point -var r=el.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function e0(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0,l=0;// Adjustment may not be necessary -if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=C.css(e,n+ec[a],!0,i)),r?("content"===n&&(u-=C.css(e,"padding"+ec[a],!0,i)),"margin"!==n&&(u-=C.css(e,"border"+ec[a]+"Width",!0,i))):(// Add padding -u+=C.css(e,"padding"+ec[a],!0,i),"padding"!==n?u+=C.css(e,"border"+ec[a]+"Width",!0,i):s+=C.css(e,"border"+ec[a]+"Width",!0,i));return!r&&o>=0&&// Assuming integer scroll gutter, subtract the rest and round down -(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function e2(e,t,n){// Start with computed style -var r=eW(e),i=(!h.boxSizingReliable()||n)&&"border-box"===C.css(e,"boxSizing",!1,r),o=i,a=eU(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);// Support: Firefox <=54 -// Return a confounding non-pixel value or feign ignorance, as appropriate. -if(e_.test(a)){if(!n)return a;a="auto"}// Adjust for the element's box model -return(!h.boxSizingReliable()&&i||// Support: IE 10 - 11+, Edge 15 - 18+ -// IE/Edge misreport `getComputedStyle` of table rows with width/height -// set in CSS while `offset*` properties report correct values. -// Interestingly, in some cases IE 9 doesn't suffer from this issue. -!h.reliableTrDimensions()&&A(e,"tr")||// Fall back to offsetWidth/offsetHeight when value is "auto" -// This happens for inline elements with no explicit setting (gh-3571) -"auto"===a||// Support: Android <=4.1 - 4.3 only -// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) -!parseFloat(a)&&"inline"===C.css(e,"display",!1,r))&&// Make sure the element is visible & connected -e.getClientRects().length&&(i="border-box"===C.css(e,"boxSizing",!1,r),// Where available, offsetWidth/offsetHeight approximate border box dimensions. -// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the -// retrieved value as a content box dimension. -(o=s in e)&&(a=e[s])),// Normalize "" and auto -(a=parseFloat(a)||0)+e0(e,t,n||(i?"border":"content"),o,r,a)+"px"}function e4(e,t,n,r,i){return new e4.prototype.init(e,t,n,r,i)}C.extend({// Add in style property hooks for overriding the default -// behavior of getting and setting a style property -cssHooks:{opacity:{get:function(e,t){if(t){// We should always get a number back from opacity -var n=eU(e,"opacity");return""===n?"1":n}}}},// Don't automatically add "px" to these possibly-unitless properties -cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,// SVG-related -fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},// Add in properties whose names you wish to fix before -// setting or getting the value -cssProps:{},// Get and set the style property on a DOM Node -style:function(e,t,n,r){// Don't set styles on text and comment nodes -if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){// Make sure that we're working with the right name -var i,o,a,s=ee(t),u=eF.test(t),l=e.style;// Check if we're setting a value -if(u||(t=eJ(s)),// Gets hook for the prefixed version, then unprefixed version -a=C.cssHooks[t]||C.cssHooks[s],void 0===n)return(// If a hook was provided get the non-computed value from there -a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t]);// Make sure that null and NaN values aren't set (trac-7116) -"string"==(o=typeof n)&&(i=el.exec(n))&&i[1]&&(n=eg(e,t,i),// Fixes bug trac-9237 -o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(C.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=ee(t);return(// Make numeric if forced or a qualifier was provided and val looks numeric -(eF.test(t)||(t=eJ(s)),// Try prefixed name followed by the unprefixed name -(a=C.cssHooks[t]||C.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=eU(e,t,r)),"normal"===i&&t in eZ&&(i=eZ[t]),""===n||n)?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i)}}),C.each(["height","width"],function(e,t){C.cssHooks[t]={get:function(e,n,r){if(n)// but it must have a current display style that would benefit -return!eG.test(C.css(e,"display"))||// Support: Safari 8+ -// Table columns in Safari have non-zero offsetWidth & zero -// getBoundingClientRect().width unless display is changed. -// Support: IE <=11 only -// Running getBoundingClientRect on a disconnected node -// in IE throws an error. -e.getClientRects().length&&e.getBoundingClientRect().width?e2(e,t,r):e$(e,eK,function(){return e2(e,t,r)})},set:function(e,n,r){var i,o=eW(e),// to avoid forcing a reflow. -a=!h.scrollboxSize()&&"absolute"===o.position,s=(a||r)&&"border-box"===C.css(e,"boxSizing",!1,o),u=r?e0(e,t,r,s,o):0;return s&&a&&(u-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-e0(e,t,"border",!1,o)-.5)),u&&(i=el.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=C.css(e,t)),e1(e,n,u)}}}),C.cssHooks.marginLeft=eX(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(eU(e,"marginLeft"))||e.getBoundingClientRect().left-e$(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),// These hooks are used by animate to expand properties -C.each({margin:"",padding:"",border:"Width"},function(e,t){C.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+ec[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(C.cssHooks[e+t].set=e1)}),C.fn.extend({css:function(e,t){return J(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=eW(e),i=t.length;a1)}}),C.Tween=e4,e4.prototype={constructor:e4,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||C.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(C.cssNumber[n]?"":"px")},cur:function(){var e=e4.propHooks[this.prop];return e&&e.get?e.get(this):e4.propHooks._default.get(this)},run:function(e){var t,n=e4.propHooks[this.prop];return this.options.duration?this.pos=t=C.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):e4.propHooks._default.set(this),this}},e4.prototype.init.prototype=e4.prototype,e4.propHooks={_default:{get:function(e){var t;return(// Use a property on the element directly when it is not a DOM element, -// or when there is no matching style property that exists. -1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:// Passing an empty string as a 3rd parameter to .css will automatically -// attempt a parseFloat and fallback to a string if the parse fails. -// Simple values such as "10px" are parsed to Float; -// complex values such as "rotate(1rad)" are returned as-is. -(t=C.css(e.elem,e.prop,""))&&"auto"!==t?t:0)},set:function(e){// Use step hook for back compat. -// Use cssHook if its there. -// Use .style if available and use plain properties where available. -C.fx.step[e.prop]?C.fx.step[e.prop](e):1===e.elem.nodeType&&(C.cssHooks[e.prop]||null!=e.elem.style[eJ(e.prop)])?C.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -e4.propHooks.scrollTop=e4.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},C.easing={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},_default:"swing"},C.fx=e4.prototype.init,// Back compat <1.8 extension point -C.fx.step={};var e5,e6,e3,e8,e7=/^(?:toggle|show|hide)$/,e9=/queueHooks$/;// Animations created synchronously will run synchronously -function te(){return e.setTimeout(function(){e3=void 0}),e3=Date.now()}// Generate parameters to create a standard animation -function tt(e,t){var n,r=0,i={height:e};for(// If we include width, step value is 1 to do all cssExpand values, -// otherwise step value is 2 to skip over Left and Right -t=t?1:0;r<4;r+=2-t)i["margin"+(n=ec[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function tn(e,t,n){for(var r,i=(Animation.tweeners[t]||[]).concat(Animation.tweeners["*"]),o=0,a=i.length;o