From 5f61b7a39084d6357b15320c917953f648c9056a Mon Sep 17 00:00:00 2001
From: Tyler Vigario
Date: Mon, 1 Jun 2020 20:43:11 -0700
Subject: [PATCH] Add linting
---
static/js/main.js | 8 +-
templates/index.html | 2 +-
web/.editorconfig | 12 +
web/.eslintrc.json | 36 +
web/package-lock.json | 1136 +++++++++++++++++++++++
web/package.json | 8 +
web/src/js/app.mjs | 30 +-
web/src/js/index.mjs | 18 -
web/src/js/main.mjs | 1642 +++++++++++++++++-----------------
web/src/js/theme.mjs | 32 +-
web/src/js/util.js | 17 +
web/src/templates/index.html | 5 +-
12 files changed, 2077 insertions(+), 869 deletions(-)
create mode 100644 web/.editorconfig
create mode 100644 web/.eslintrc.json
delete mode 100644 web/src/js/index.mjs
create mode 100644 web/src/js/util.js
diff --git a/static/js/main.js b/static/js/main.js
index 6d930c7..0132396 100644
--- a/static/js/main.js
+++ b/static/js/main.js
@@ -1,4 +1,4 @@
-!function(e){var c={};function t(n){if(c[n])return c[n].exports;var a=c[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=c,t.d=function(e,c,n){t.o(e,c)||Object.defineProperty(e,c,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,c){if(1&c&&(e=t(e)),8&c)return e;if(4&c&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&c&&"string"!=typeof e)for(var a in e)t.d(n,a,function(c){return e[c]}.bind(null,a));return n},t.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(c,"a",c),c},t.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},t.p="",t(t.s=152)}([function(e,c,t){var n;
+!function(e){var c={};function t(n){if(c[n])return c[n].exports;var a=c[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=c,t.d=function(e,c,n){t.o(e,c)||Object.defineProperty(e,c,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,c){if(1&c&&(e=t(e)),8&c)return e;if(4&c&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&c&&"string"!=typeof e)for(var a in e)t.d(n,a,function(c){return e[c]}.bind(null,a));return n},t.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(c,"a",c),c},t.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},t.p="",t(t.s=156)}([function(e,c,t){var n;
/*!
* jQuery JavaScript Library v3.5.1
* https://jquery.com/
@@ -22,7 +22,7 @@
*
* Date: 2020-03-14
*/
-function(e){var c,t,n,a,i,r,o,l,s,f,h,u,m,v,p,d,z,g,M,y="sizzle"+1*new Date,x=e.document,C=0,b=0,H=le(),V=le(),L=le(),N=le(),w=function(e,c){return e===c&&(h=!0),0},S={}.hasOwnProperty,A=[],T=A.pop,k=A.push,_=A.push,E=A.slice,j=function(e,c){for(var t=0,n=e.length;t+~]|"+O+")"+O+"*"),Q=new RegExp(O+"|>"),W=new RegExp(I),$=new RegExp("^"+P+"$"),U={ID:new RegExp("^#("+P+")"),CLASS:new RegExp("^\\.("+P+")"),TAG:new RegExp("^("+P+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+I),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),bool:new RegExp("^(?:"+D+")$","i"),needsContext:new RegExp("^"+O+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,ce=new RegExp("\\\\[\\da-fA-F]{1,6}"+O+"?|\\\\([^\\r\\n\\f])","g"),te=function(e,c){var t="0x"+e.slice(1)-65536;return c||(t<0?String.fromCharCode(t+65536):String.fromCharCode(t>>10|55296,1023&t|56320))},ne=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ae=function(e,c){return c?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ie=function(){u()},re=ye((function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()}),{dir:"parentNode",next:"legend"});try{_.apply(A=E.call(x.childNodes),x.childNodes),A[x.childNodes.length].nodeType}catch(e){_={apply:A.length?function(e,c){k.apply(e,E.call(c))}:function(e,c){for(var t=e.length,n=0;e[t++]=c[n++];);e.length=t-1}}}function oe(e,c,n,a){var i,o,s,f,h,v,z,g=c&&c.ownerDocument,x=c?c.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==x&&9!==x&&11!==x)return n;if(!a&&(u(c),c=c||m,p)){if(11!==x&&(h=J.exec(e)))if(i=h[1]){if(9===x){if(!(s=c.getElementById(i)))return n;if(s.id===i)return n.push(s),n}else if(g&&(s=g.getElementById(i))&&M(c,s)&&s.id===i)return n.push(s),n}else{if(h[2])return _.apply(n,c.getElementsByTagName(e)),n;if((i=h[3])&&t.getElementsByClassName&&c.getElementsByClassName)return _.apply(n,c.getElementsByClassName(i)),n}if(t.qsa&&!N[e+" "]&&(!d||!d.test(e))&&(1!==x||"object"!==c.nodeName.toLowerCase())){if(z=e,g=c,1===x&&(Q.test(e)||Z.test(e))){for((g=ee.test(e)&&ze(c.parentNode)||c)===c&&t.scope||((f=c.getAttribute("id"))?f=f.replace(ne,ae):c.setAttribute("id",f=y)),o=(v=r(e)).length;o--;)v[o]=(f?"#"+f:":scope")+" "+Me(v[o]);z=v.join(",")}try{return _.apply(n,g.querySelectorAll(z)),n}catch(c){N(e,!0)}finally{f===y&&c.removeAttribute("id")}}}return l(e.replace(F,"$1"),c,n,a)}function le(){var e=[];return function c(t,a){return e.push(t+" ")>n.cacheLength&&delete c[e.shift()],c[t+" "]=a}}function se(e){return e[y]=!0,e}function fe(e){var c=m.createElement("fieldset");try{return!!e(c)}catch(e){return!1}finally{c.parentNode&&c.parentNode.removeChild(c),c=null}}function he(e,c){for(var t=e.split("|"),a=t.length;a--;)n.attrHandle[t[a]]=c}function ue(e,c){var t=c&&e,n=t&&1===e.nodeType&&1===c.nodeType&&e.sourceIndex-c.sourceIndex;if(n)return n;if(t)for(;t=t.nextSibling;)if(t===c)return-1;return e?1:-1}function me(e){return function(c){return"input"===c.nodeName.toLowerCase()&&c.type===e}}function ve(e){return function(c){var t=c.nodeName.toLowerCase();return("input"===t||"button"===t)&&c.type===e}}function pe(e){return function(c){return"form"in c?c.parentNode&&!1===c.disabled?"label"in c?"label"in c.parentNode?c.parentNode.disabled===e:c.disabled===e:c.isDisabled===e||c.isDisabled!==!e&&re(c)===e:c.disabled===e:"label"in c&&c.disabled===e}}function de(e){return se((function(c){return c=+c,se((function(t,n){for(var a,i=e([],t.length,c),r=i.length;r--;)t[a=i[r]]&&(t[a]=!(n[a]=t[a]))}))}))}function ze(e){return e&&void 0!==e.getElementsByTagName&&e}for(c in t=oe.support={},i=oe.isXML=function(e){var c=e.namespaceURI,t=(e.ownerDocument||e).documentElement;return!G.test(c||t&&t.nodeName||"HTML")},u=oe.setDocument=function(e){var c,a,r=e?e.ownerDocument||e:x;return r!=m&&9===r.nodeType&&r.documentElement?(v=(m=r).documentElement,p=!i(m),x!=m&&(a=m.defaultView)&&a.top!==a&&(a.addEventListener?a.addEventListener("unload",ie,!1):a.attachEvent&&a.attachEvent("onunload",ie)),t.scope=fe((function(e){return v.appendChild(e).appendChild(m.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length})),t.attributes=fe((function(e){return e.className="i",!e.getAttribute("className")})),t.getElementsByTagName=fe((function(e){return e.appendChild(m.createComment("")),!e.getElementsByTagName("*").length})),t.getElementsByClassName=K.test(m.getElementsByClassName),t.getById=fe((function(e){return v.appendChild(e).id=y,!m.getElementsByName||!m.getElementsByName(y).length})),t.getById?(n.filter.ID=function(e){var c=e.replace(ce,te);return function(e){return e.getAttribute("id")===c}},n.find.ID=function(e,c){if(void 0!==c.getElementById&&p){var t=c.getElementById(e);return t?[t]:[]}}):(n.filter.ID=function(e){var c=e.replace(ce,te);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===c}},n.find.ID=function(e,c){if(void 0!==c.getElementById&&p){var t,n,a,i=c.getElementById(e);if(i){if((t=i.getAttributeNode("id"))&&t.value===e)return[i];for(a=c.getElementsByName(e),n=0;i=a[n++];)if((t=i.getAttributeNode("id"))&&t.value===e)return[i]}return[]}}),n.find.TAG=t.getElementsByTagName?function(e,c){return void 0!==c.getElementsByTagName?c.getElementsByTagName(e):t.qsa?c.querySelectorAll(e):void 0}:function(e,c){var t,n=[],a=0,i=c.getElementsByTagName(e);if("*"===e){for(;t=i[a++];)1===t.nodeType&&n.push(t);return n}return i},n.find.CLASS=t.getElementsByClassName&&function(e,c){if(void 0!==c.getElementsByClassName&&p)return c.getElementsByClassName(e)},z=[],d=[],(t.qsa=K.test(m.querySelectorAll))&&(fe((function(e){var c;v.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&d.push("[*^$]="+O+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||d.push("\\["+O+"*(?:value|"+D+")"),e.querySelectorAll("[id~="+y+"-]").length||d.push("~="),(c=m.createElement("input")).setAttribute("name",""),e.appendChild(c),e.querySelectorAll("[name='']").length||d.push("\\["+O+"*name"+O+"*="+O+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||d.push(":checked"),e.querySelectorAll("a#"+y+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll("\\\f"),d.push("[\\r\\n\\f]")})),fe((function(e){e.innerHTML="";var c=m.createElement("input");c.setAttribute("type","hidden"),e.appendChild(c).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&d.push("name"+O+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&d.push(":enabled",":disabled"),v.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")}))),(t.matchesSelector=K.test(g=v.matches||v.webkitMatchesSelector||v.mozMatchesSelector||v.oMatchesSelector||v.msMatchesSelector))&&fe((function(e){t.disconnectedMatch=g.call(e,"*"),g.call(e,"[s!='']:x"),z.push("!=",I)})),d=d.length&&new RegExp(d.join("|")),z=z.length&&new RegExp(z.join("|")),c=K.test(v.compareDocumentPosition),M=c||K.test(v.contains)?function(e,c){var t=9===e.nodeType?e.documentElement:e,n=c&&c.parentNode;return e===n||!(!n||1!==n.nodeType||!(t.contains?t.contains(n):e.compareDocumentPosition&&16&e.compareDocumentPosition(n)))}:function(e,c){if(c)for(;c=c.parentNode;)if(c===e)return!0;return!1},w=c?function(e,c){if(e===c)return h=!0,0;var n=!e.compareDocumentPosition-!c.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(c.ownerDocument||c)?e.compareDocumentPosition(c):1)||!t.sortDetached&&c.compareDocumentPosition(e)===n?e==m||e.ownerDocument==x&&M(x,e)?-1:c==m||c.ownerDocument==x&&M(x,c)?1:f?j(f,e)-j(f,c):0:4&n?-1:1)}:function(e,c){if(e===c)return h=!0,0;var t,n=0,a=e.parentNode,i=c.parentNode,r=[e],o=[c];if(!a||!i)return e==m?-1:c==m?1:a?-1:i?1:f?j(f,e)-j(f,c):0;if(a===i)return ue(e,c);for(t=e;t=t.parentNode;)r.unshift(t);for(t=c;t=t.parentNode;)o.unshift(t);for(;r[n]===o[n];)n++;return n?ue(r[n],o[n]):r[n]==x?-1:o[n]==x?1:0},m):m},oe.matches=function(e,c){return oe(e,null,null,c)},oe.matchesSelector=function(e,c){if(u(e),t.matchesSelector&&p&&!N[c+" "]&&(!z||!z.test(c))&&(!d||!d.test(c)))try{var n=g.call(e,c);if(n||t.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(c,!0)}return oe(c,m,null,[e]).length>0},oe.contains=function(e,c){return(e.ownerDocument||e)!=m&&u(e),M(e,c)},oe.attr=function(e,c){(e.ownerDocument||e)!=m&&u(e);var a=n.attrHandle[c.toLowerCase()],i=a&&S.call(n.attrHandle,c.toLowerCase())?a(e,c,!p):void 0;return void 0!==i?i:t.attributes||!p?e.getAttribute(c):(i=e.getAttributeNode(c))&&i.specified?i.value:null},oe.escape=function(e){return(e+"").replace(ne,ae)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var c,n=[],a=0,i=0;if(h=!t.detectDuplicates,f=!t.sortStable&&e.slice(0),e.sort(w),h){for(;c=e[i++];)c===e[i]&&(a=n.push(i));for(;a--;)e.splice(n[a],1)}return f=null,e},a=oe.getText=function(e){var c,t="",n=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)t+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;c=e[n++];)t+=a(c);return t},(n=oe.selectors={cacheLength:50,createPseudo:se,match:U,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(ce,te),e[3]=(e[3]||e[4]||e[5]||"").replace(ce,te),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),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]&&oe.error(e[0]),e},PSEUDO:function(e){var c,t=!e[6]&&e[2];return U.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":t&&W.test(t)&&(c=r(t,!0))&&(c=t.indexOf(")",t.length-c)-t.length)&&(e[0]=e[0].slice(0,c),e[2]=t.slice(0,c)),e.slice(0,3))}},filter:{TAG:function(e){var c=e.replace(ce,te).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===c}},CLASS:function(e){var c=H[e+" "];return c||(c=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&H(e,(function(e){return c.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")}))},ATTR:function(e,c,t){return function(n){var a=oe.attr(n,e);return null==a?"!="===c:!c||(a+="","="===c?a===t:"!="===c?a!==t:"^="===c?t&&0===a.indexOf(t):"*="===c?t&&a.indexOf(t)>-1:"$="===c?t&&a.slice(-t.length)===t:"~="===c?(" "+a.replace(R," ")+" ").indexOf(t)>-1:"|="===c&&(a===t||a.slice(0,t.length+1)===t+"-"))}},CHILD:function(e,c,t,n,a){var i="nth"!==e.slice(0,3),r="last"!==e.slice(-4),o="of-type"===c;return 1===n&&0===a?function(e){return!!e.parentNode}:function(c,t,l){var s,f,h,u,m,v,p=i!==r?"nextSibling":"previousSibling",d=c.parentNode,z=o&&c.nodeName.toLowerCase(),g=!l&&!o,M=!1;if(d){if(i){for(;p;){for(u=c;u=u[p];)if(o?u.nodeName.toLowerCase()===z:1===u.nodeType)return!1;v=p="only"===e&&!v&&"nextSibling"}return!0}if(v=[r?d.firstChild:d.lastChild],r&&g){for(M=(m=(s=(f=(h=(u=d)[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]||[])[0]===C&&s[1])&&s[2],u=m&&d.childNodes[m];u=++m&&u&&u[p]||(M=m=0)||v.pop();)if(1===u.nodeType&&++M&&u===c){f[e]=[C,m,M];break}}else if(g&&(M=m=(s=(f=(h=(u=c)[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]||[])[0]===C&&s[1]),!1===M)for(;(u=++m&&u&&u[p]||(M=m=0)||v.pop())&&((o?u.nodeName.toLowerCase()!==z:1!==u.nodeType)||!++M||(g&&((f=(h=u[y]||(u[y]={}))[u.uniqueID]||(h[u.uniqueID]={}))[e]=[C,M]),u!==c)););return(M-=a)===n||M%n==0&&M/n>=0}}},PSEUDO:function(e,c){var t,a=n.pseudos[e]||n.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return a[y]?a(c):a.length>1?(t=[e,e,"",c],n.setFilters.hasOwnProperty(e.toLowerCase())?se((function(e,t){for(var n,i=a(e,c),r=i.length;r--;)e[n=j(e,i[r])]=!(t[n]=i[r])})):function(e){return a(e,0,t)}):a}},pseudos:{not:se((function(e){var c=[],t=[],n=o(e.replace(F,"$1"));return n[y]?se((function(e,c,t,a){for(var i,r=n(e,null,a,[]),o=e.length;o--;)(i=r[o])&&(e[o]=!(c[o]=i))})):function(e,a,i){return c[0]=e,n(c,null,i,t),c[0]=null,!t.pop()}})),has:se((function(e){return function(c){return oe(e,c).length>0}})),contains:se((function(e){return e=e.replace(ce,te),function(c){return(c.textContent||a(c)).indexOf(e)>-1}})),lang:se((function(e){return $.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(ce,te).toLowerCase(),function(c){var t;do{if(t=p?c.lang:c.getAttribute("xml:lang")||c.getAttribute("lang"))return(t=t.toLowerCase())===e||0===t.indexOf(e+"-")}while((c=c.parentNode)&&1===c.nodeType);return!1}})),target:function(c){var t=e.location&&e.location.hash;return t&&t.slice(1)===c.id},root:function(e){return e===v},focus:function(e){return e===m.activeElement&&(!m.hasFocus||m.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:pe(!1),disabled:pe(!0),checked:function(e){var c=e.nodeName.toLowerCase();return"input"===c&&!!e.checked||"option"===c&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!n.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return X.test(e.nodeName)},button:function(e){var c=e.nodeName.toLowerCase();return"input"===c&&"button"===e.type||"button"===c},text:function(e){var c;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(c=e.getAttribute("type"))||"text"===c.toLowerCase())},first:de((function(){return[0]})),last:de((function(e,c){return[c-1]})),eq:de((function(e,c,t){return[t<0?t+c:t]})),even:de((function(e,c){for(var t=0;tc?c:t;--n>=0;)e.push(n);return e})),gt:de((function(e,c,t){for(var n=t<0?t+c:t;++n1?function(c,t,n){for(var a=e.length;a--;)if(!e[a](c,t,n))return!1;return!0}:e[0]}function Ce(e,c,t,n,a){for(var i,r=[],o=0,l=e.length,s=null!=c;o-1&&(i[s]=!(r[s]=h))}}else z=Ce(z===r?z.splice(v,z.length):z),a?a(null,r,z,l):_.apply(r,z)}))}function He(e){for(var c,t,a,i=e.length,r=n.relative[e[0].type],o=r||n.relative[" "],l=r?1:0,f=ye((function(e){return e===c}),o,!0),h=ye((function(e){return j(c,e)>-1}),o,!0),u=[function(e,t,n){var a=!r&&(n||t!==s)||((c=t).nodeType?f(e,t,n):h(e,t,n));return c=null,a}];l1&&xe(u),l>1&&Me(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(F,"$1"),t,l0,a=e.length>0,i=function(i,r,o,l,f){var h,v,d,z=0,g="0",M=i&&[],y=[],x=s,b=i||a&&n.find.TAG("*",f),H=C+=null==x?1:Math.random()||.1,V=b.length;for(f&&(s=r==m||r||f);g!==V&&null!=(h=b[g]);g++){if(a&&h){for(v=0,r||h.ownerDocument==m||(u(h),o=!p);d=e[v++];)if(d(h,r||m,o)){l.push(h);break}f&&(C=H)}t&&((h=!d&&h)&&z--,i&&M.push(h))}if(z+=g,t&&g!==z){for(v=0;d=c[v++];)d(M,y,r,o);if(i){if(z>0)for(;g--;)M[g]||y[g]||(y[g]=T.call(l));y=Ce(y)}_.apply(l,y),f&&!i&&y.length>0&&z+c.length>1&&oe.uniqueSort(l)}return f&&(C=H,s=x),M};return t?se(i):i}(i,a))).selector=e}return o},l=oe.select=function(e,c,t,a){var i,l,s,f,h,u="function"==typeof e&&e,m=!a&&r(e=u.selector||e);if(t=t||[],1===m.length){if((l=m[0]=m[0].slice(0)).length>2&&"ID"===(s=l[0]).type&&9===c.nodeType&&p&&n.relative[l[1].type]){if(!(c=(n.find.ID(s.matches[0].replace(ce,te),c)||[])[0]))return t;u&&(c=c.parentNode),e=e.slice(l.shift().value.length)}for(i=U.needsContext.test(e)?0:l.length;i--&&(s=l[i],!n.relative[f=s.type]);)if((h=n.find[f])&&(a=h(s.matches[0].replace(ce,te),ee.test(l[0].type)&&ze(c.parentNode)||c))){if(l.splice(i,1),!(e=a.length&&Me(l)))return _.apply(t,a),t;break}}return(u||o(e,m))(a,c,!p,t,!c||ee.test(e)&&ze(c.parentNode)||c),t},t.sortStable=y.split("").sort(w).join("")===y,t.detectDuplicates=!!h,u(),t.sortDetached=fe((function(e){return 1&e.compareDocumentPosition(m.createElement("fieldset"))})),fe((function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")}))||he("type|href|height|width",(function(e,c,t){if(!t)return e.getAttribute(c,"type"===c.toLowerCase()?1:2)})),t.attributes&&fe((function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}))||he("value",(function(e,c,t){if(!t&&"input"===e.nodeName.toLowerCase())return e.defaultValue})),fe((function(e){return null==e.getAttribute("disabled")}))||he(D,(function(e,c,t){var n;if(!t)return!0===e[c]?c.toLowerCase():(n=e.getAttributeNode(c))&&n.specified?n.value:null})),oe}(t);b.find=V,b.expr=V.selectors,b.expr[":"]=b.expr.pseudos,b.uniqueSort=b.unique=V.uniqueSort,b.text=V.getText,b.isXMLDoc=V.isXML,b.contains=V.contains,b.escapeSelector=V.escape;var L=function(e,c,t){for(var n=[],a=void 0!==t;(e=e[c])&&9!==e.nodeType;)if(1===e.nodeType){if(a&&b(e).is(t))break;n.push(e)}return n},N=function(e,c){for(var t=[];e;e=e.nextSibling)1===e.nodeType&&e!==c&&t.push(e);return t},w=b.expr.match.needsContext;function S(e,c){return e.nodeName&&e.nodeName.toLowerCase()===c.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,c,t){return z(c)?b.grep(e,(function(e,n){return!!c.call(e,n,e)!==t})):c.nodeType?b.grep(e,(function(e){return e===c!==t})):"string"!=typeof c?b.grep(e,(function(e){return f.call(c,e)>-1!==t})):b.filter(c,e,t)}b.filter=function(e,c,t){var n=c[0];return t&&(e=":not("+e+")"),1===c.length&&1===n.nodeType?b.find.matchesSelector(n,e)?[n]:[]:b.find.matches(e,b.grep(c,(function(e){return 1===e.nodeType})))},b.fn.extend({find:function(e){var c,t,n=this.length,a=this;if("string"!=typeof e)return this.pushStack(b(e).filter((function(){for(c=0;c1?b.uniqueSort(t):t},filter:function(e){return this.pushStack(T(this,e||[],!1))},not:function(e){return this.pushStack(T(this,e||[],!0))},is:function(e){return!!T(this,"string"==typeof e&&w.test(e)?b(e):e||[],!1).length}});var k,_=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(b.fn.init=function(e,c,t){var n,a;if(!e)return this;if(t=t||k,"string"==typeof e){if(!(n="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:_.exec(e))||!n[1]&&c)return!c||c.jquery?(c||t).find(e):this.constructor(c).find(e);if(n[1]){if(c=c instanceof b?c[0]:c,b.merge(this,b.parseHTML(n[1],c&&c.nodeType?c.ownerDocument||c:M,!0)),A.test(n[1])&&b.isPlainObject(c))for(n in c)z(this[n])?this[n](c[n]):this.attr(n,c[n]);return this}return(a=M.getElementById(n[2]))&&(this[0]=a,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):z(e)?void 0!==t.ready?t.ready(e):e(b):b.makeArray(e,this)}).prototype=b.fn,k=b(M);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function D(e,c){for(;(e=e[c])&&1!==e.nodeType;);return e}b.fn.extend({has:function(e){var c=b(e,this),t=c.length;return this.filter((function(){for(var e=0;e-1:1===t.nodeType&&b.find.matchesSelector(t,e))){i.push(t);break}return this.pushStack(i.length>1?b.uniqueSort(i):i)},index:function(e){return e?"string"==typeof e?f.call(b(e),this[0]):f.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,c){return this.pushStack(b.uniqueSort(b.merge(this.get(),b(e,c))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.each({parent:function(e){var c=e.parentNode;return c&&11!==c.nodeType?c:null},parents:function(e){return L(e,"parentNode")},parentsUntil:function(e,c,t){return L(e,"parentNode",t)},next:function(e){return D(e,"nextSibling")},prev:function(e){return D(e,"previousSibling")},nextAll:function(e){return L(e,"nextSibling")},prevAll:function(e){return L(e,"previousSibling")},nextUntil:function(e,c,t){return L(e,"nextSibling",t)},prevUntil:function(e,c,t){return L(e,"previousSibling",t)},siblings:function(e){return N((e.parentNode||{}).firstChild,e)},children:function(e){return N(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(S(e,"template")&&(e=e.content||e),b.merge([],e.childNodes))}},(function(e,c){b.fn[e]=function(t,n){var a=b.map(this,c,t);return"Until"!==e.slice(-5)&&(n=t),n&&"string"==typeof n&&(a=b.filter(n,a)),this.length>1&&(j[e]||b.uniqueSort(a),E.test(e)&&a.reverse()),this.pushStack(a)}}));var O=/[^\x20\t\r\n\f]+/g;function P(e){return e}function q(e){throw e}function I(e,c,t,n){var a;try{e&&z(a=e.promise)?a.call(e).done(c).fail(t):e&&z(a=e.then)?a.call(e,c,t):c.apply(void 0,[e].slice(n))}catch(e){t.apply(void 0,[e])}}b.Callbacks=function(e){e="string"==typeof e?function(e){var c={};return b.each(e.match(O)||[],(function(e,t){c[t]=!0})),c}(e):b.extend({},e);var c,t,n,a,i=[],r=[],o=-1,l=function(){for(a=a||e.once,n=c=!0;r.length;o=-1)for(t=r.shift();++o-1;)i.splice(t,1),t<=o&&o--})),this},has:function(e){return e?b.inArray(e,i)>-1:i.length>0},empty:function(){return i&&(i=[]),this},disable:function(){return a=r=[],i=t="",this},disabled:function(){return!i},lock:function(){return a=r=[],t||c||(i=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],r.push(t),c||l()),this},fire:function(){return s.fireWith(this,arguments),this},fired:function(){return!!n}};return s},b.extend({Deferred:function(e){var c=[["notify","progress",b.Callbacks("memory"),b.Callbacks("memory"),2],["resolve","done",b.Callbacks("once memory"),b.Callbacks("once memory"),0,"resolved"],["reject","fail",b.Callbacks("once memory"),b.Callbacks("once memory"),1,"rejected"]],n="pending",a={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},catch:function(e){return a.then(null,e)},pipe:function(){var e=arguments;return b.Deferred((function(t){b.each(c,(function(c,n){var a=z(e[n[4]])&&e[n[4]];i[n[1]]((function(){var e=a&&a.apply(this,arguments);e&&z(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[n[0]+"With"](this,a?[e]:arguments)}))})),e=null})).promise()},then:function(e,n,a){var i=0;function r(e,c,n,a){return function(){var o=this,l=arguments,s=function(){var t,s;if(!(e=i&&(n!==q&&(o=void 0,l=[t]),c.rejectWith(o,l))}};e?f():(b.Deferred.getStackHook&&(f.stackTrace=b.Deferred.getStackHook()),t.setTimeout(f))}}return b.Deferred((function(t){c[0][3].add(r(0,t,z(a)?a:P,t.notifyWith)),c[1][3].add(r(0,t,z(e)?e:P)),c[2][3].add(r(0,t,z(n)?n:q))})).promise()},promise:function(e){return null!=e?b.extend(e,a):a}},i={};return b.each(c,(function(e,t){var r=t[2],o=t[5];a[t[1]]=r.add,o&&r.add((function(){n=o}),c[3-e][2].disable,c[3-e][3].disable,c[0][2].lock,c[0][3].lock),r.add(t[3].fire),i[t[0]]=function(){return i[t[0]+"With"](this===i?void 0:this,arguments),this},i[t[0]+"With"]=r.fireWith})),a.promise(i),e&&e.call(i,i),i},when:function(e){var c=arguments.length,t=c,n=Array(t),a=o.call(arguments),i=b.Deferred(),r=function(e){return function(t){n[e]=this,a[e]=arguments.length>1?o.call(arguments):t,--c||i.resolveWith(n,a)}};if(c<=1&&(I(e,i.done(r(t)).resolve,i.reject,!c),"pending"===i.state()||z(a[t]&&a[t].then)))return i.then();for(;t--;)I(a[t],r(t),i.reject);return i.promise()}});var R=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;b.Deferred.exceptionHook=function(e,c){t.console&&t.console.warn&&e&&R.test(e.name)&&t.console.warn("jQuery.Deferred exception: "+e.message,e.stack,c)},b.readyException=function(e){t.setTimeout((function(){throw e}))};var F=b.Deferred();function B(){M.removeEventListener("DOMContentLoaded",B),t.removeEventListener("load",B),b.ready()}b.fn.ready=function(e){return F.then(e).catch((function(e){b.readyException(e)})),this},b.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--b.readyWait:b.isReady)||(b.isReady=!0,!0!==e&&--b.readyWait>0||F.resolveWith(M,[b]))}}),b.ready.then=F.then,"complete"===M.readyState||"loading"!==M.readyState&&!M.documentElement.doScroll?t.setTimeout(b.ready):(M.addEventListener("DOMContentLoaded",B),t.addEventListener("load",B));var Z=function(e,c,t,n,a,i,r){var o=0,l=e.length,s=null==t;if("object"===C(t))for(o in a=!0,t)Z(e,c,o,t[o],!0,i,r);else if(void 0!==n&&(a=!0,z(n)||(r=!0),s&&(r?(c.call(e,n),c=null):(s=c,c=function(e,c,t){return s.call(b(e),t)})),c))for(;o1,null,!0)},removeData:function(e){return this.each((function(){K.remove(this,e)}))}}),b.extend({queue:function(e,c,t){var n;if(e)return c=(c||"fx")+"queue",n=Y.get(e,c),t&&(!n||Array.isArray(t)?n=Y.access(e,c,b.makeArray(t)):n.push(t)),n||[]},dequeue:function(e,c){c=c||"fx";var t=b.queue(e,c),n=t.length,a=t.shift(),i=b._queueHooks(e,c);"inprogress"===a&&(a=t.shift(),n--),a&&("fx"===c&&t.unshift("inprogress"),delete i.stop,a.call(e,(function(){b.dequeue(e,c)}),i)),!n&&i&&i.empty.fire()},_queueHooks:function(e,c){var t=c+"queueHooks";return Y.get(e,t)||Y.access(e,t,{empty:b.Callbacks("once memory").add((function(){Y.remove(e,[c+"queue",t])}))})}}),b.fn.extend({queue:function(e,c){var t=2;return"string"!=typeof e&&(c=e,e="fx",t--),arguments.length\x20\t\r\n\f]*)/i,ze=/^$|^module$|\/(?:java|ecma)script/i;me=M.createDocumentFragment().appendChild(M.createElement("div")),(ve=M.createElement("input")).setAttribute("type","radio"),ve.setAttribute("checked","checked"),ve.setAttribute("name","t"),me.appendChild(ve),d.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="",d.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue,me.innerHTML="",d.option=!!me.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function Me(e,c){var t;return t=void 0!==e.getElementsByTagName?e.getElementsByTagName(c||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(c||"*"):[],void 0===c||c&&S(e,c)?b.merge([e],t):t}function ye(e,c){for(var t=0,n=e.length;t",""]);var xe=/<|?\w+;/;function Ce(e,c,t,n,a){for(var i,r,o,l,s,f,h=c.createDocumentFragment(),u=[],m=0,v=e.length;m-1)a&&a.push(i);else if(s=re(i),r=Me(h.appendChild(i),"script"),s&&ye(r),t)for(f=0;i=r[f++];)ze.test(i.type||"")&&t.push(i);return h}var be=/^key/,He=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ve=/^([^.]*)(?:\.(.+)|)/;function Le(){return!0}function Ne(){return!1}function we(e,c){return e===function(){try{return M.activeElement}catch(e){}}()==("focus"===c)}function Se(e,c,t,n,a,i){var r,o;if("object"==typeof c){for(o in"string"!=typeof t&&(n=n||t,t=void 0),c)Se(e,o,t,n,c[o],i);return e}if(null==n&&null==a?(a=t,n=t=void 0):null==a&&("string"==typeof t?(a=n,n=void 0):(a=n,n=t,t=void 0)),!1===a)a=Ne;else if(!a)return e;return 1===i&&(r=a,(a=function(e){return b().off(e),r.apply(this,arguments)}).guid=r.guid||(r.guid=b.guid++)),e.each((function(){b.event.add(this,c,a,n,t)}))}function Ae(e,c,t){t?(Y.set(e,c,!1),b.event.add(e,c,{namespace:!1,handler:function(e){var n,a,i=Y.get(this,c);if(1&e.isTrigger&&this[c]){if(i.length)(b.event.special[c]||{}).delegateType&&e.stopPropagation();else if(i=o.call(arguments),Y.set(this,c,i),n=t(this,c),this[c](),i!==(a=Y.get(this,c))||n?Y.set(this,c,!1):a={},i!==a)return e.stopImmediatePropagation(),e.preventDefault(),a.value}else i.length&&(Y.set(this,c,{value:b.event.trigger(b.extend(i[0],b.Event.prototype),i.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,c)&&b.event.add(e,c,Le)}b.event={global:{},add:function(e,c,t,n,a){var i,r,o,l,s,f,h,u,m,v,p,d=Y.get(e);if(G(e))for(t.handler&&(t=(i=t).handler,a=i.selector),a&&b.find.matchesSelector(ie,a),t.guid||(t.guid=b.guid++),(l=d.events)||(l=d.events=Object.create(null)),(r=d.handle)||(r=d.handle=function(c){return void 0!==b&&b.event.triggered!==c.type?b.event.dispatch.apply(e,arguments):void 0}),s=(c=(c||"").match(O)||[""]).length;s--;)m=p=(o=Ve.exec(c[s])||[])[1],v=(o[2]||"").split(".").sort(),m&&(h=b.event.special[m]||{},m=(a?h.delegateType:h.bindType)||m,h=b.event.special[m]||{},f=b.extend({type:m,origType:p,data:n,handler:t,guid:t.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:v.join(".")},i),(u=l[m])||((u=l[m]=[]).delegateCount=0,h.setup&&!1!==h.setup.call(e,n,v,r)||e.addEventListener&&e.addEventListener(m,r)),h.add&&(h.add.call(e,f),f.handler.guid||(f.handler.guid=t.guid)),a?u.splice(u.delegateCount++,0,f):u.push(f),b.event.global[m]=!0)},remove:function(e,c,t,n,a){var i,r,o,l,s,f,h,u,m,v,p,d=Y.hasData(e)&&Y.get(e);if(d&&(l=d.events)){for(s=(c=(c||"").match(O)||[""]).length;s--;)if(m=p=(o=Ve.exec(c[s])||[])[1],v=(o[2]||"").split(".").sort(),m){for(h=b.event.special[m]||{},u=l[m=(n?h.delegateType:h.bindType)||m]||[],o=o[2]&&new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"),r=i=u.length;i--;)f=u[i],!a&&p!==f.origType||t&&t.guid!==f.guid||o&&!o.test(f.namespace)||n&&n!==f.selector&&("**"!==n||!f.selector)||(u.splice(i,1),f.selector&&u.delegateCount--,h.remove&&h.remove.call(e,f));r&&!u.length&&(h.teardown&&!1!==h.teardown.call(e,v,d.handle)||b.removeEvent(e,m,d.handle),delete l[m])}else for(m in l)b.event.remove(e,m+c[s],t,n,!0);b.isEmptyObject(l)&&Y.remove(e,"handle events")}},dispatch:function(e){var c,t,n,a,i,r,o=new Array(arguments.length),l=b.event.fix(e),s=(Y.get(this,"events")||Object.create(null))[l.type]||[],f=b.event.special[l.type]||{};for(o[0]=l,c=1;c=1))for(;s!==this;s=s.parentNode||this)if(1===s.nodeType&&("click"!==e.type||!0!==s.disabled)){for(i=[],r={},t=0;t-1:b.find(a,this,null,[s]).length),r[a]&&i.push(n);i.length&&o.push({elem:s,handlers:i})}return s=this,l\s*$/g;function Ee(e,c){return S(e,"table")&&S(11!==c.nodeType?c:c.firstChild,"tr")&&b(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function De(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,c){var t,n,a,i,r,o;if(1===c.nodeType){if(Y.hasData(e)&&(o=Y.get(e).events))for(a in Y.remove(c,"handle events"),o)for(t=0,n=o[a].length;t1&&"string"==typeof v&&!d.checkClone&&ke.test(v))return e.each((function(a){var i=e.eq(a);p&&(c[0]=v.call(this,a,i.html())),qe(i,c,t,n)}));if(u&&(i=(a=Ce(c,e[0].ownerDocument,!1,e,n)).firstChild,1===a.childNodes.length&&(a=i),i||n)){for(o=(r=b.map(Me(a,"script"),je)).length;h0&&ye(r,!l&&Me(e,"script")),o},cleanData:function(e){for(var c,t,n,a=b.event.special,i=0;void 0!==(t=e[i]);i++)if(G(t)){if(c=t[Y.expando]){if(c.events)for(n in c.events)a[n]?b.event.remove(t,n):b.removeEvent(t,n,c.handle);t[Y.expando]=void 0}t[K.expando]&&(t[K.expando]=void 0)}}}),b.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return Z(this,(function(e){return void 0===e?b.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 qe(this,arguments,(function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Ee(this,e).appendChild(e)}))},prepend:function(){return qe(this,arguments,(function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var c=Ee(this,e);c.insertBefore(e,c.firstChild)}}))},before:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this)}))},after:function(){return qe(this,arguments,(function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)}))},empty:function(){for(var e,c=0;null!=(e=this[c]);c++)1===e.nodeType&&(b.cleanData(Me(e,!1)),e.textContent="");return this},clone:function(e,c){return e=null!=e&&e,c=null==c?e:c,this.map((function(){return b.clone(this,e,c)}))},html:function(e){return Z(this,(function(e){var c=this[0]||{},t=0,n=this.length;if(void 0===e&&1===c.nodeType)return c.innerHTML;if("string"==typeof e&&!Te.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=b.htmlPrefilter(e);try{for(;t3,ie.removeChild(e)),o}}))}();var $e=["Webkit","Moz","ms"],Ue=M.createElement("div").style,Ge={};function Xe(e){var c=b.cssProps[e]||Ge[e];return c||(e in Ue?e:Ge[e]=function(e){for(var c=e[0].toUpperCase()+e.slice(1),t=$e.length;t--;)if((e=$e[t]+c)in Ue)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Ke=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},ec={letterSpacing:"0",fontWeight:"400"};function cc(e,c,t){var n=ne.exec(c);return n?Math.max(0,n[2]-(t||0))+(n[3]||"px"):c}function tc(e,c,t,n,a,i){var r="width"===c?1:0,o=0,l=0;if(t===(n?"border":"content"))return 0;for(;r<4;r+=2)"margin"===t&&(l+=b.css(e,t+ae[r],!0,a)),n?("content"===t&&(l-=b.css(e,"padding"+ae[r],!0,a)),"margin"!==t&&(l-=b.css(e,"border"+ae[r]+"Width",!0,a))):(l+=b.css(e,"padding"+ae[r],!0,a),"padding"!==t?l+=b.css(e,"border"+ae[r]+"Width",!0,a):o+=b.css(e,"border"+ae[r]+"Width",!0,a));return!n&&i>=0&&(l+=Math.max(0,Math.ceil(e["offset"+c[0].toUpperCase()+c.slice(1)]-i-l-o-.5))||0),l}function nc(e,c,t){var n=Fe(e),a=(!d.boxSizingReliable()||t)&&"border-box"===b.css(e,"boxSizing",!1,n),i=a,r=Qe(e,c,n),o="offset"+c[0].toUpperCase()+c.slice(1);if(Re.test(r)){if(!t)return r;r="auto"}return(!d.boxSizingReliable()&&a||!d.reliableTrDimensions()&&S(e,"tr")||"auto"===r||!parseFloat(r)&&"inline"===b.css(e,"display",!1,n))&&e.getClientRects().length&&(a="border-box"===b.css(e,"boxSizing",!1,n),(i=o in e)&&(r=e[o])),(r=parseFloat(r)||0)+tc(e,c,t||(a?"border":"content"),i,n,r)+"px"}function ac(e,c,t,n,a){return new ac.prototype.init(e,c,t,n,a)}b.extend({cssHooks:{opacity:{get:function(e,c){if(c){var t=Qe(e,"opacity");return""===t?"1":t}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!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,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,c,t,n){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var a,i,r,o=U(c),l=Ke.test(c),s=e.style;if(l||(c=Xe(o)),r=b.cssHooks[c]||b.cssHooks[o],void 0===t)return r&&"get"in r&&void 0!==(a=r.get(e,!1,n))?a:s[c];"string"===(i=typeof t)&&(a=ne.exec(t))&&a[1]&&(t=se(e,c,a),i="number"),null!=t&&t==t&&("number"!==i||l||(t+=a&&a[3]||(b.cssNumber[o]?"":"px")),d.clearCloneStyle||""!==t||0!==c.indexOf("background")||(s[c]="inherit"),r&&"set"in r&&void 0===(t=r.set(e,t,n))||(l?s.setProperty(c,t):s[c]=t))}},css:function(e,c,t,n){var a,i,r,o=U(c);return Ke.test(c)||(c=Xe(o)),(r=b.cssHooks[c]||b.cssHooks[o])&&"get"in r&&(a=r.get(e,!0,t)),void 0===a&&(a=Qe(e,c,n)),"normal"===a&&c in ec&&(a=ec[c]),""===t||t?(i=parseFloat(a),!0===t||isFinite(i)?i||0:a):a}}),b.each(["height","width"],(function(e,c){b.cssHooks[c]={get:function(e,t,n){if(t)return!Ye.test(b.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?nc(e,c,n):Be(e,Je,(function(){return nc(e,c,n)}))},set:function(e,t,n){var a,i=Fe(e),r=!d.scrollboxSize()&&"absolute"===i.position,o=(r||n)&&"border-box"===b.css(e,"boxSizing",!1,i),l=n?tc(e,c,n,o,i):0;return o&&r&&(l-=Math.ceil(e["offset"+c[0].toUpperCase()+c.slice(1)]-parseFloat(i[c])-tc(e,c,"border",!1,i)-.5)),l&&(a=ne.exec(t))&&"px"!==(a[3]||"px")&&(e.style[c]=t,t=b.css(e,c)),cc(0,t,l)}}})),b.cssHooks.marginLeft=We(d.reliableMarginLeft,(function(e,c){if(c)return(parseFloat(Qe(e,"marginLeft"))||e.getBoundingClientRect().left-Be(e,{marginLeft:0},(function(){return e.getBoundingClientRect().left})))+"px"})),b.each({margin:"",padding:"",border:"Width"},(function(e,c){b.cssHooks[e+c]={expand:function(t){for(var n=0,a={},i="string"==typeof t?t.split(" "):[t];n<4;n++)a[e+ae[n]+c]=i[n]||i[n-2]||i[0];return a}},"margin"!==e&&(b.cssHooks[e+c].set=cc)})),b.fn.extend({css:function(e,c){return Z(this,(function(e,c,t){var n,a,i={},r=0;if(Array.isArray(c)){for(n=Fe(e),a=c.length;r1)}}),b.Tween=ac,ac.prototype={constructor:ac,init:function(e,c,t,n,a,i){this.elem=e,this.prop=t,this.easing=a||b.easing._default,this.options=c,this.start=this.now=this.cur(),this.end=n,this.unit=i||(b.cssNumber[t]?"":"px")},cur:function(){var e=ac.propHooks[this.prop];return e&&e.get?e.get(this):ac.propHooks._default.get(this)},run:function(e){var c,t=ac.propHooks[this.prop];return this.options.duration?this.pos=c=b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=c=e,this.now=(this.end-this.start)*c+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),t&&t.set?t.set(this):ac.propHooks._default.set(this),this}},ac.prototype.init.prototype=ac.prototype,ac.propHooks={_default:{get:function(e){var c;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(c=b.css(e.elem,e.prop,""))&&"auto"!==c?c:0},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):1!==e.elem.nodeType||!b.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:b.style(e.elem,e.prop,e.now+e.unit)}}},ac.propHooks.scrollTop=ac.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},b.fx=ac.prototype.init,b.fx.step={};var ic,rc,oc=/^(?:toggle|show|hide)$/,lc=/queueHooks$/;function sc(){rc&&(!1===M.hidden&&t.requestAnimationFrame?t.requestAnimationFrame(sc):t.setTimeout(sc,b.fx.interval),b.fx.tick())}function fc(){return t.setTimeout((function(){ic=void 0})),ic=Date.now()}function hc(e,c){var t,n=0,a={height:e};for(c=c?1:0;n<4;n+=2-c)a["margin"+(t=ae[n])]=a["padding"+t]=e;return c&&(a.opacity=a.width=e),a}function uc(e,c,t){for(var n,a=(mc.tweeners[c]||[]).concat(mc.tweeners["*"]),i=0,r=a.length;i1)},removeAttr:function(e){return this.each((function(){b.removeAttr(this,e)}))}}),b.extend({attr:function(e,c,t){var n,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return void 0===e.getAttribute?b.prop(e,c,t):(1===i&&b.isXMLDoc(e)||(a=b.attrHooks[c.toLowerCase()]||(b.expr.match.bool.test(c)?vc:void 0)),void 0!==t?null===t?void b.removeAttr(e,c):a&&"set"in a&&void 0!==(n=a.set(e,t,c))?n:(e.setAttribute(c,t+""),t):a&&"get"in a&&null!==(n=a.get(e,c))?n:null==(n=b.find.attr(e,c))?void 0:n)},attrHooks:{type:{set:function(e,c){if(!d.radioValue&&"radio"===c&&S(e,"input")){var t=e.value;return e.setAttribute("type",c),t&&(e.value=t),c}}}},removeAttr:function(e,c){var t,n=0,a=c&&c.match(O);if(a&&1===e.nodeType)for(;t=a[n++];)e.removeAttribute(t)}}),vc={set:function(e,c,t){return!1===c?b.removeAttr(e,t):e.setAttribute(t,t),t}},b.each(b.expr.match.bool.source.match(/\w+/g),(function(e,c){var t=pc[c]||b.find.attr;pc[c]=function(e,c,n){var a,i,r=c.toLowerCase();return n||(i=pc[r],pc[r]=a,a=null!=t(e,c,n)?r:null,pc[r]=i),a}}));var dc=/^(?:input|select|textarea|button)$/i,zc=/^(?:a|area)$/i;function gc(e){return(e.match(O)||[]).join(" ")}function Mc(e){return e.getAttribute&&e.getAttribute("class")||""}function yc(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(O)||[]}b.fn.extend({prop:function(e,c){return Z(this,b.prop,e,c,arguments.length>1)},removeProp:function(e){return this.each((function(){delete this[b.propFix[e]||e]}))}}),b.extend({prop:function(e,c,t){var n,a,i=e.nodeType;if(3!==i&&8!==i&&2!==i)return 1===i&&b.isXMLDoc(e)||(c=b.propFix[c]||c,a=b.propHooks[c]),void 0!==t?a&&"set"in a&&void 0!==(n=a.set(e,t,c))?n:e[c]=t:a&&"get"in a&&null!==(n=a.get(e,c))?n:e[c]},propHooks:{tabIndex:{get:function(e){var c=b.find.attr(e,"tabindex");return c?parseInt(c,10):dc.test(e.nodeName)||zc.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),d.optSelected||(b.propHooks.selected={get:function(e){var c=e.parentNode;return c&&c.parentNode&&c.parentNode.selectedIndex,null},set:function(e){var c=e.parentNode;c&&(c.selectedIndex,c.parentNode&&c.parentNode.selectedIndex)}}),b.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){b.propFix[this.toLowerCase()]=this})),b.fn.extend({addClass:function(e){var c,t,n,a,i,r,o,l=0;if(z(e))return this.each((function(c){b(this).addClass(e.call(this,c,Mc(this)))}));if((c=yc(e)).length)for(;t=this[l++];)if(a=Mc(t),n=1===t.nodeType&&" "+gc(a)+" "){for(r=0;i=c[r++];)n.indexOf(" "+i+" ")<0&&(n+=i+" ");a!==(o=gc(n))&&t.setAttribute("class",o)}return this},removeClass:function(e){var c,t,n,a,i,r,o,l=0;if(z(e))return this.each((function(c){b(this).removeClass(e.call(this,c,Mc(this)))}));if(!arguments.length)return this.attr("class","");if((c=yc(e)).length)for(;t=this[l++];)if(a=Mc(t),n=1===t.nodeType&&" "+gc(a)+" "){for(r=0;i=c[r++];)for(;n.indexOf(" "+i+" ")>-1;)n=n.replace(" "+i+" "," ");a!==(o=gc(n))&&t.setAttribute("class",o)}return this},toggleClass:function(e,c){var t=typeof e,n="string"===t||Array.isArray(e);return"boolean"==typeof c&&n?c?this.addClass(e):this.removeClass(e):z(e)?this.each((function(t){b(this).toggleClass(e.call(this,t,Mc(this),c),c)})):this.each((function(){var c,a,i,r;if(n)for(a=0,i=b(this),r=yc(e);c=r[a++];)i.hasClass(c)?i.removeClass(c):i.addClass(c);else void 0!==e&&"boolean"!==t||((c=Mc(this))&&Y.set(this,"__className__",c),this.setAttribute&&this.setAttribute("class",c||!1===e?"":Y.get(this,"__className__")||""))}))},hasClass:function(e){var c,t,n=0;for(c=" "+e+" ";t=this[n++];)if(1===t.nodeType&&(" "+gc(Mc(t))+" ").indexOf(c)>-1)return!0;return!1}});var xc=/\r/g;b.fn.extend({val:function(e){var c,t,n,a=this[0];return arguments.length?(n=z(e),this.each((function(t){var a;1===this.nodeType&&(null==(a=n?e.call(this,t,b(this).val()):e)?a="":"number"==typeof a?a+="":Array.isArray(a)&&(a=b.map(a,(function(e){return null==e?"":e+""}))),(c=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()])&&"set"in c&&void 0!==c.set(this,a,"value")||(this.value=a))}))):a?(c=b.valHooks[a.type]||b.valHooks[a.nodeName.toLowerCase()])&&"get"in c&&void 0!==(t=c.get(a,"value"))?t:"string"==typeof(t=a.value)?t.replace(xc,""):null==t?"":t:void 0}}),b.extend({valHooks:{option:{get:function(e){var c=b.find.attr(e,"value");return null!=c?c:gc(b.text(e))}},select:{get:function(e){var c,t,n,a=e.options,i=e.selectedIndex,r="select-one"===e.type,o=r?null:[],l=r?i+1:a.length;for(n=i<0?l:r?i:0;n-1)&&(t=!0);return t||(e.selectedIndex=-1),i}}}}),b.each(["radio","checkbox"],(function(){b.valHooks[this]={set:function(e,c){if(Array.isArray(c))return e.checked=b.inArray(b(e).val(),c)>-1}},d.checkOn||(b.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})})),d.focusin="onfocusin"in t;var Cc=/^(?:focusinfocus|focusoutblur)$/,bc=function(e){e.stopPropagation()};b.extend(b.event,{trigger:function(e,c,n,a){var i,r,o,l,s,f,h,u,v=[n||M],p=m.call(e,"type")?e.type:e,d=m.call(e,"namespace")?e.namespace.split("."):[];if(r=u=o=n=n||M,3!==n.nodeType&&8!==n.nodeType&&!Cc.test(p+b.event.triggered)&&(p.indexOf(".")>-1&&(d=p.split("."),p=d.shift(),d.sort()),s=p.indexOf(":")<0&&"on"+p,(e=e[b.expando]?e:new b.Event(p,"object"==typeof e&&e)).isTrigger=a?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),c=null==c?[e]:b.makeArray(c,[e]),h=b.event.special[p]||{},a||!h.trigger||!1!==h.trigger.apply(n,c))){if(!a&&!h.noBubble&&!g(n)){for(l=h.delegateType||p,Cc.test(l+p)||(r=r.parentNode);r;r=r.parentNode)v.push(r),o=r;o===(n.ownerDocument||M)&&v.push(o.defaultView||o.parentWindow||t)}for(i=0;(r=v[i++])&&!e.isPropagationStopped();)u=r,e.type=i>1?l:h.bindType||p,(f=(Y.get(r,"events")||Object.create(null))[e.type]&&Y.get(r,"handle"))&&f.apply(r,c),(f=s&&r[s])&&f.apply&&G(r)&&(e.result=f.apply(r,c),!1===e.result&&e.preventDefault());return e.type=p,a||e.isDefaultPrevented()||h._default&&!1!==h._default.apply(v.pop(),c)||!G(n)||s&&z(n[p])&&!g(n)&&((o=n[s])&&(n[s]=null),b.event.triggered=p,e.isPropagationStopped()&&u.addEventListener(p,bc),n[p](),e.isPropagationStopped()&&u.removeEventListener(p,bc),b.event.triggered=void 0,o&&(n[s]=o)),e.result}},simulate:function(e,c,t){var n=b.extend(new b.Event,t,{type:e,isSimulated:!0});b.event.trigger(n,null,c)}}),b.fn.extend({trigger:function(e,c){return this.each((function(){b.event.trigger(e,c,this)}))},triggerHandler:function(e,c){var t=this[0];if(t)return b.event.trigger(e,c,t,!0)}}),d.focusin||b.each({focus:"focusin",blur:"focusout"},(function(e,c){var t=function(e){b.event.simulate(c,e.target,b.event.fix(e))};b.event.special[c]={setup:function(){var n=this.ownerDocument||this.document||this,a=Y.access(n,c);a||n.addEventListener(e,t,!0),Y.access(n,c,(a||0)+1)},teardown:function(){var n=this.ownerDocument||this.document||this,a=Y.access(n,c)-1;a?Y.access(n,c,a):(n.removeEventListener(e,t,!0),Y.remove(n,c))}}}));var Hc=t.location,Vc={guid:Date.now()},Lc=/\?/;b.parseXML=function(e){var c;if(!e||"string"!=typeof e)return null;try{c=(new t.DOMParser).parseFromString(e,"text/xml")}catch(e){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+e),c};var Nc=/\[\]$/,wc=/\r?\n/g,Sc=/^(?:submit|button|image|reset|file)$/i,Ac=/^(?:input|select|textarea|keygen)/i;function Tc(e,c,t,n){var a;if(Array.isArray(c))b.each(c,(function(c,a){t||Nc.test(e)?n(e,a):Tc(e+"["+("object"==typeof a&&null!=a?c:"")+"]",a,t,n)}));else if(t||"object"!==C(c))n(e,c);else for(a in c)Tc(e+"["+a+"]",c[a],t,n)}b.param=function(e,c){var t,n=[],a=function(e,c){var t=z(c)?c():c;n[n.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==t?"":t)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,(function(){a(this.name,this.value)}));else for(t in e)Tc(t,e[t],c,a);return n.join("&")},b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this})).filter((function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&Ac.test(this.nodeName)&&!Sc.test(e)&&(this.checked||!pe.test(e))})).map((function(e,c){var t=b(this).val();return null==t?null:Array.isArray(t)?b.map(t,(function(e){return{name:c.name,value:e.replace(wc,"\r\n")}})):{name:c.name,value:t.replace(wc,"\r\n")}})).get()}});var kc=/%20/g,_c=/#.*$/,Ec=/([?&])_=[^&]*/,jc=/^(.*?):[ \t]*([^\r\n]*)$/gm,Dc=/^(?:GET|HEAD)$/,Oc=/^\/\//,Pc={},qc={},Ic="*/".concat("*"),Rc=M.createElement("a");function Fc(e){return function(c,t){"string"!=typeof c&&(t=c,c="*");var n,a=0,i=c.toLowerCase().match(O)||[];if(z(t))for(;n=i[a++];)"+"===n[0]?(n=n.slice(1)||"*",(e[n]=e[n]||[]).unshift(t)):(e[n]=e[n]||[]).push(t)}}function Bc(e,c,t,n){var a={},i=e===qc;function r(o){var l;return a[o]=!0,b.each(e[o]||[],(function(e,o){var s=o(c,t,n);return"string"!=typeof s||i||a[s]?i?!(l=s):void 0:(c.dataTypes.unshift(s),r(s),!1)})),l}return r(c.dataTypes[0])||!a["*"]&&r("*")}function Zc(e,c){var t,n,a=b.ajaxSettings.flatOptions||{};for(t in c)void 0!==c[t]&&((a[t]?e:n||(n={}))[t]=c[t]);return n&&b.extend(!0,e,n),e}Rc.href=Hc.href,b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Hc.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Hc.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ic,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":JSON.parse,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,c){return c?Zc(Zc(e,b.ajaxSettings),c):Zc(b.ajaxSettings,e)},ajaxPrefilter:Fc(Pc),ajaxTransport:Fc(qc),ajax:function(e,c){"object"==typeof e&&(c=e,e=void 0),c=c||{};var n,a,i,r,o,l,s,f,h,u,m=b.ajaxSetup({},c),v=m.context||m,p=m.context&&(v.nodeType||v.jquery)?b(v):b.event,d=b.Deferred(),z=b.Callbacks("once memory"),g=m.statusCode||{},y={},x={},C="canceled",H={readyState:0,getResponseHeader:function(e){var c;if(s){if(!r)for(r={};c=jc.exec(i);)r[c[1].toLowerCase()+" "]=(r[c[1].toLowerCase()+" "]||[]).concat(c[2]);c=r[e.toLowerCase()+" "]}return null==c?null:c.join(", ")},getAllResponseHeaders:function(){return s?i:null},setRequestHeader:function(e,c){return null==s&&(e=x[e.toLowerCase()]=x[e.toLowerCase()]||e,y[e]=c),this},overrideMimeType:function(e){return null==s&&(m.mimeType=e),this},statusCode:function(e){var c;if(e)if(s)H.always(e[H.status]);else for(c in e)g[c]=[g[c],e[c]];return this},abort:function(e){var c=e||C;return n&&n.abort(c),V(0,c),this}};if(d.promise(H),m.url=((e||m.url||Hc.href)+"").replace(Oc,Hc.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=(m.dataType||"*").toLowerCase().match(O)||[""],null==m.crossDomain){l=M.createElement("a");try{l.href=m.url,l.href=l.href,m.crossDomain=Rc.protocol+"//"+Rc.host!=l.protocol+"//"+l.host}catch(e){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=b.param(m.data,m.traditional)),Bc(Pc,m,c,H),s)return H;for(h in(f=b.event&&m.global)&&0==b.active++&&b.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!Dc.test(m.type),a=m.url.replace(_c,""),m.hasContent?m.data&&m.processData&&0===(m.contentType||"").indexOf("application/x-www-form-urlencoded")&&(m.data=m.data.replace(kc,"+")):(u=m.url.slice(a.length),m.data&&(m.processData||"string"==typeof m.data)&&(a+=(Lc.test(a)?"&":"?")+m.data,delete m.data),!1===m.cache&&(a=a.replace(Ec,"$1"),u=(Lc.test(a)?"&":"?")+"_="+Vc.guid+++u),m.url=a+u),m.ifModified&&(b.lastModified[a]&&H.setRequestHeader("If-Modified-Since",b.lastModified[a]),b.etag[a]&&H.setRequestHeader("If-None-Match",b.etag[a])),(m.data&&m.hasContent&&!1!==m.contentType||c.contentType)&&H.setRequestHeader("Content-Type",m.contentType),H.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+Ic+"; q=0.01":""):m.accepts["*"]),m.headers)H.setRequestHeader(h,m.headers[h]);if(m.beforeSend&&(!1===m.beforeSend.call(v,H,m)||s))return H.abort();if(C="abort",z.add(m.complete),H.done(m.success),H.fail(m.error),n=Bc(qc,m,c,H)){if(H.readyState=1,f&&p.trigger("ajaxSend",[H,m]),s)return H;m.async&&m.timeout>0&&(o=t.setTimeout((function(){H.abort("timeout")}),m.timeout));try{s=!1,n.send(y,V)}catch(e){if(s)throw e;V(-1,e)}}else V(-1,"No Transport");function V(e,c,r,l){var h,u,M,y,x,C=c;s||(s=!0,o&&t.clearTimeout(o),n=void 0,i=l||"",H.readyState=e>0?4:0,h=e>=200&&e<300||304===e,r&&(y=function(e,c,t){for(var n,a,i,r,o=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===n&&(n=e.mimeType||c.getResponseHeader("Content-Type"));if(n)for(a in o)if(o[a]&&o[a].test(n)){l.unshift(a);break}if(l[0]in t)i=l[0];else{for(a in t){if(!l[0]||e.converters[a+" "+l[0]]){i=a;break}r||(r=a)}i=i||r}if(i)return i!==l[0]&&l.unshift(i),t[i]}(m,H,r)),!h&&b.inArray("script",m.dataTypes)>-1&&(m.converters["text script"]=function(){}),y=function(e,c,t,n){var a,i,r,o,l,s={},f=e.dataTypes.slice();if(f[1])for(r in e.converters)s[r.toLowerCase()]=e.converters[r];for(i=f.shift();i;)if(e.responseFields[i]&&(t[e.responseFields[i]]=c),!l&&n&&e.dataFilter&&(c=e.dataFilter(c,e.dataType)),l=i,i=f.shift())if("*"===i)i=l;else if("*"!==l&&l!==i){if(!(r=s[l+" "+i]||s["* "+i]))for(a in s)if((o=a.split(" "))[1]===i&&(r=s[l+" "+o[0]]||s["* "+o[0]])){!0===r?r=s[a]:!0!==s[a]&&(i=o[0],f.unshift(o[1]));break}if(!0!==r)if(r&&e.throws)c=r(c);else try{c=r(c)}catch(e){return{state:"parsererror",error:r?e:"No conversion from "+l+" to "+i}}}return{state:"success",data:c}}(m,y,H,h),h?(m.ifModified&&((x=H.getResponseHeader("Last-Modified"))&&(b.lastModified[a]=x),(x=H.getResponseHeader("etag"))&&(b.etag[a]=x)),204===e||"HEAD"===m.type?C="nocontent":304===e?C="notmodified":(C=y.state,u=y.data,h=!(M=y.error))):(M=C,!e&&C||(C="error",e<0&&(e=0))),H.status=e,H.statusText=(c||C)+"",h?d.resolveWith(v,[u,C,H]):d.rejectWith(v,[H,C,M]),H.statusCode(g),g=void 0,f&&p.trigger(h?"ajaxSuccess":"ajaxError",[H,m,h?u:M]),z.fireWith(v,[H,C]),f&&(p.trigger("ajaxComplete",[H,m]),--b.active||b.event.trigger("ajaxStop")))}return H},getJSON:function(e,c,t){return b.get(e,c,t,"json")},getScript:function(e,c){return b.get(e,void 0,c,"script")}}),b.each(["get","post"],(function(e,c){b[c]=function(e,t,n,a){return z(t)&&(a=a||n,n=t,t=void 0),b.ajax(b.extend({url:e,type:c,dataType:a,data:t,success:n},b.isPlainObject(e)&&e))}})),b.ajaxPrefilter((function(e){var c;for(c in e.headers)"content-type"===c.toLowerCase()&&(e.contentType=e.headers[c]||"")})),b._evalUrl=function(e,c,t){return b.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){b.globalEval(e,c,t)}})},b.fn.extend({wrapAll:function(e){var c;return this[0]&&(z(e)&&(e=e.call(this[0])),c=b(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&c.insertBefore(this[0]),c.map((function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e})).append(this)),this},wrapInner:function(e){return z(e)?this.each((function(c){b(this).wrapInner(e.call(this,c))})):this.each((function(){var c=b(this),t=c.contents();t.length?t.wrapAll(e):c.append(e)}))},wrap:function(e){var c=z(e);return this.each((function(t){b(this).wrapAll(c?e.call(this,t):e)}))},unwrap:function(e){return this.parent(e).not("body").each((function(){b(this).replaceWith(this.childNodes)})),this}}),b.expr.pseudos.hidden=function(e){return!b.expr.pseudos.visible(e)},b.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},b.ajaxSettings.xhr=function(){try{return new t.XMLHttpRequest}catch(e){}};var Qc={0:200,1223:204},Wc=b.ajaxSettings.xhr();d.cors=!!Wc&&"withCredentials"in Wc,d.ajax=Wc=!!Wc,b.ajaxTransport((function(e){var c,n;if(d.cors||Wc&&!e.crossDomain)return{send:function(a,i){var r,o=e.xhr();if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(r in e.xhrFields)o[r]=e.xhrFields[r];for(r in e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||a["X-Requested-With"]||(a["X-Requested-With"]="XMLHttpRequest"),a)o.setRequestHeader(r,a[r]);c=function(e){return function(){c&&(c=n=o.onload=o.onerror=o.onabort=o.ontimeout=o.onreadystatechange=null,"abort"===e?o.abort():"error"===e?"number"!=typeof o.status?i(0,"error"):i(o.status,o.statusText):i(Qc[o.status]||o.status,o.statusText,"text"!==(o.responseType||"text")||"string"!=typeof o.responseText?{binary:o.response}:{text:o.responseText},o.getAllResponseHeaders()))}},o.onload=c(),n=o.onerror=o.ontimeout=c("error"),void 0!==o.onabort?o.onabort=n:o.onreadystatechange=function(){4===o.readyState&&t.setTimeout((function(){c&&n()}))},c=c("abort");try{o.send(e.hasContent&&e.data||null)}catch(e){if(c)throw e}},abort:function(){c&&c()}}})),b.ajaxPrefilter((function(e){e.crossDomain&&(e.contents.script=!1)})),b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",(function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")})),b.ajaxTransport("script",(function(e){var c,t;if(e.crossDomain||e.scriptAttrs)return{send:function(n,a){c=b("
All files listed here, include files on other pages, will be deleted from your hard-drive. Is that what you want?
{% if upload_enabled %}
\ No newline at end of file
+
botamusique web interface
\ No newline at end of file
diff --git a/web/.editorconfig b/web/.editorconfig
new file mode 100644
index 0000000..29a9bb0
--- /dev/null
+++ b/web/.editorconfig
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+trim_trailing_whitespace = true
+quote_type = single
+
+[*.json]
+quote_type = double
diff --git a/web/.eslintrc.json b/web/.eslintrc.json
new file mode 100644
index 0000000..7836033
--- /dev/null
+++ b/web/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+ "env": {
+ "browser": true,
+ "es6": true,
+ "es2017": true,
+ "es2020": true,
+ "jquery": true
+ },
+ "plugins": [
+ "node",
+ "import",
+ "jsdoc"
+ ],
+ "extends": [
+ "eslint:recommended",
+ "google",
+ "plugin:node/recommended-module",
+ "plugin:import/errors",
+ "plugin:import/warnings",
+ "plugin:jsdoc/recommended"
+ ],
+ "globals": {
+ "Atomics": "readonly",
+ "SharedArrayBuffer": "readonly"
+ },
+ "parser": "babel-eslint",
+ "rules": {
+ "require-jsdoc": "off",
+ "valid-jsdoc": "off",
+ "jsdoc/require-jsdoc": "off",
+ "max-len": ["warn", { "code": 120 }],
+ "import/no-commonjs": "error",
+ "import/no-amd": "error",
+ "linebreak-style": "off"
+ }
+ }
diff --git a/web/package-lock.json b/web/package-lock.json
index 977eb92..c5cc088 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1105,6 +1105,12 @@
"integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
"dev": true
},
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
"@types/html-minifier-terser": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz",
@@ -1356,6 +1362,12 @@
"integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
"dev": true
},
+ "acorn-jsx": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
+ "dev": true
+ },
"ajv": {
"version": "6.12.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
@@ -1380,6 +1392,23 @@
"integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==",
"dev": true
},
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
+ }
+ }
+ },
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
@@ -1438,12 +1467,33 @@
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
"dev": true
},
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ }
+ },
"array-unique": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
"dev": true
},
+ "array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
"asn1.js": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
@@ -1496,6 +1546,12 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
"async-each": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
@@ -1524,6 +1580,20 @@
"postcss-value-parser": "^4.1.0"
}
},
+ "babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ }
+ },
"babel-loader": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
@@ -1938,6 +2008,12 @@
"supports-color": "^5.3.0"
}
},
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
"chokidar": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz",
@@ -2046,6 +2122,21 @@
"source-map": "~0.6.0"
}
},
+ "cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^3.1.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
+ "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
+ "dev": true
+ },
"cliui": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
@@ -2133,6 +2224,12 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
+ "comment-parser": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz",
+ "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==",
+ "dev": true
+ },
"commondir": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
@@ -2175,6 +2272,12 @@
"integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
"dev": true
},
+ "contains-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+ "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+ "dev": true
+ },
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
@@ -2291,6 +2394,49 @@
"sha.js": "^2.4.8"
}
},
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
"crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@@ -2396,6 +2542,12 @@
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
"dev": true
},
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -2481,6 +2633,15 @@
}
}
},
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -2715,6 +2876,318 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "eslint": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz",
+ "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^7.0.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^7.0.0",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.14",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
+ "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
+ "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "eslint-config-google": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz",
+ "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==",
+ "dev": true
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz",
+ "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "resolve": "^1.13.1"
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.9",
+ "pkg-dir": "^2.0.0"
+ },
+ "dependencies": {
+ "pkg-dir": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.1.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz",
+ "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.20.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz",
+ "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.0.3",
+ "array.prototype.flat": "^1.2.1",
+ "contains-path": "^0.1.0",
+ "debug": "^2.6.9",
+ "doctrine": "1.5.0",
+ "eslint-import-resolver-node": "^0.3.2",
+ "eslint-module-utils": "^2.4.1",
+ "has": "^1.0.3",
+ "minimatch": "^3.0.4",
+ "object.values": "^1.1.0",
+ "read-pkg-up": "^2.0.0",
+ "resolve": "^1.12.0"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "isarray": "^1.0.0"
+ }
+ }
+ }
+ },
+ "eslint-plugin-jsdoc": {
+ "version": "26.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-26.0.2.tgz",
+ "integrity": "sha512-KtZjqtM3Z8x84vQBFKGUyBbZRGXYHVWSJ2XyYSUTc8KhfFrvzQ/GXPp6f1M1/YCNzP3ImD5RuDNcr+OVvIZcBA==",
+ "dev": true,
+ "requires": {
+ "comment-parser": "^0.7.4",
+ "debug": "^4.1.1",
+ "jsdoctypeparser": "^6.1.0",
+ "lodash": "^4.17.15",
+ "regextras": "^0.7.1",
+ "semver": "^6.3.0",
+ "spdx-expression-parse": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-node": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz",
+ "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==",
+ "dev": true,
+ "requires": {
+ "eslint-plugin-es": "^3.0.0",
+ "eslint-utils": "^2.0.0",
+ "ignore": "^5.1.1",
+ "minimatch": "^3.0.4",
+ "resolve": "^1.10.1",
+ "semver": "^6.1.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
"eslint-scope": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
@@ -2725,12 +3198,63 @@
"estraverse": "^4.1.1"
}
},
+ "eslint-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz",
+ "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==",
+ "dev": true
+ },
+ "espree": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz",
+ "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz",
+ "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==",
+ "dev": true
+ }
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz",
+ "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==",
+ "dev": true
+ }
+ }
+ },
"esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
@@ -2863,6 +3387,17 @@
}
}
},
+ "external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
"extglob": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
@@ -2940,12 +3475,36 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
"figgy-pudding": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
"integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
"dev": true
},
+ "figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -3037,6 +3596,34 @@
"resolve-dir": "^1.0.1"
}
},
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
"flush-write-stream": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
@@ -3103,6 +3690,12 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
"gensync": {
"version": "1.0.0-beta.1",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
@@ -3319,6 +3912,12 @@
"parse-passwd": "^1.0.0"
}
},
+ "hosted-git-info": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "dev": true
+ },
"html-minifier-terser": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
@@ -3418,6 +4017,15 @@
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
"dev": true
},
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
"icss-utils": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
@@ -3439,6 +4047,12 @@
"integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
"dev": true
},
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
"import-cwd": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
@@ -3517,6 +4131,94 @@
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true
},
+ "inquirer": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
+ "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^3.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.15",
+ "mute-stream": "0.0.8",
+ "run-async": "^2.4.0",
+ "rxjs": "^6.5.3",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
"interpret": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
@@ -3648,6 +4350,12 @@
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
"is-glob": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
@@ -3707,6 +4415,12 @@
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
+ "is-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
"is-symbol": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
@@ -3772,6 +4486,12 @@
"esprima": "^4.0.0"
}
},
+ "jsdoctypeparser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
+ "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
+ "dev": true
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -3790,6 +4510,12 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@@ -3829,6 +4555,39 @@
"leven": "^3.1.0"
}
},
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ }
+ }
+ },
"loader-runner": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
@@ -4137,6 +4896,12 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
+ "mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -4156,6 +4921,12 @@
"to-regex": "^3.0.1"
}
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
"neo-async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
@@ -4213,6 +4984,18 @@
"integrity": "sha512-ZQmnWS7adi61A9JsllJ2gdj2PauElcjnOwTp2O011iGzoakTxUsDGSe+6vD7wXbKdqhSFymC0OSx35aAMhrSdw==",
"dev": true
},
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -4350,6 +5133,18 @@
"isobject": "^3.0.1"
}
},
+ "object.values": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -4359,6 +5154,29 @@
"wrappy": "1"
}
},
+ "onetime": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
"os-browserify": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
@@ -4376,6 +5194,12 @@
"mem": "^4.0.0"
}
},
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
@@ -4435,6 +5259,23 @@
"readable-stream": "^2.1.5"
}
},
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ }
+ }
+ },
"parse-asn1": {
"version": "5.1.5",
"resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
@@ -4539,6 +5380,15 @@
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "^2.0.0"
+ }
+ },
"pbkdf2": {
"version": "3.0.17",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
@@ -4558,6 +5408,12 @@
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true
},
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
"pkg-dir": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
@@ -4750,6 +5606,12 @@
"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
"dev": true
},
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
"prepend-http": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
@@ -4784,6 +5646,12 @@
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
"promise-inflight": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
@@ -4898,6 +5766,27 @@
"safe-buffer": "^5.1.0"
}
},
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^2.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "^2.0.0",
+ "read-pkg": "^2.0.0"
+ }
+ },
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
@@ -4963,6 +5852,12 @@
"safe-regex": "^1.1.0"
}
},
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
"regexpu-core": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
@@ -4977,6 +5872,12 @@
"unicode-match-property-value-ecmascript": "^1.2.0"
}
},
+ "regextras": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz",
+ "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==",
+ "dev": true
+ },
"regjsgen": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
@@ -5103,6 +6004,16 @@
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
"dev": true
},
+ "restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "requires": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
"ret": {
"version": "0.1.15",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
@@ -5128,6 +6039,12 @@
"inherits": "^2.0.1"
}
},
+ "run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true
+ },
"run-queue": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
@@ -5137,6 +6054,15 @@
"aproba": "^1.1.1"
}
},
+ "rxjs": {
+ "version": "6.5.5",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+ "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -5152,6 +6078,12 @@
"ret": "~0.1.10"
}
},
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
"sass": {
"version": "1.26.7",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.7.tgz",
@@ -5279,6 +6211,25 @@
"integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
"dev": true
},
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ }
+ }
+ },
"snapdragon": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -5450,6 +6401,38 @@
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
"dev": true
},
+ "spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
+ "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "dev": true
+ },
"split-string": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
@@ -5540,6 +6523,40 @@
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
"dev": true
},
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
"string.prototype.trimend": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
@@ -5600,12 +6617,24 @@
"ansi-regex": "^2.0.0"
}
},
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
"strip-eof": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
"dev": true
},
+ "strip-json-comments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
+ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
+ "dev": true
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -5615,6 +6644,52 @@
"has-flag": "^3.0.0"
}
},
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
"tapable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@@ -5670,6 +6745,18 @@
}
}
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
"through2": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
@@ -5689,6 +6776,15 @@
"setimmediate": "^1.0.4"
}
},
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
"to-arraybuffer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
@@ -5755,6 +6851,21 @@
"integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
"dev": true
},
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
@@ -5956,6 +7067,16 @@
"integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
"dev": true
},
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"vm-browserify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
@@ -6320,6 +7441,12 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"worker-farm": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
@@ -6389,6 +7516,15 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
diff --git a/web/package.json b/web/package.json
index a2e2973..9ea2105 100644
--- a/web/package.json
+++ b/web/package.json
@@ -5,6 +5,8 @@
"scripts": {
"dev": "npm run development",
"development": "webpack --mode=development --config webpack.config.cjs --progress",
+ "lint": "eslint --config .eslintrc.json src/js/ --ext .mjs",
+ "lint:fix": "npm run lint -- --fix",
"prod": "npm run production",
"production": "webpack --mode=production --config webpack.config.cjs --progress",
"test": "echo \"Error: no test specified\" && exit 1"
@@ -24,9 +26,15 @@
"@babel/plugin-proposal-class-properties": "^7.10.1",
"@babel/preset-env": "^7.10.2",
"autoprefixer": "^9.8.0",
+ "babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0",
"core-js": "^3.6.5",
"css-loader": "^3.5.3",
+ "eslint": "^7.1.0",
+ "eslint-config-google": "^0.14.0",
+ "eslint-plugin-import": "^2.20.2",
+ "eslint-plugin-jsdoc": "^26.0.2",
+ "eslint-plugin-node": "^11.1.0",
"html-webpack-plugin": "^4.3.0",
"mini-css-extract-plugin": "^0.9.0",
"postcss-loader": "^3.0.0",
diff --git a/web/src/js/app.mjs b/web/src/js/app.mjs
index b659deb..d948595 100644
--- a/web/src/js/app.mjs
+++ b/web/src/js/app.mjs
@@ -1,17 +1,29 @@
-// jQuery 3.x
+// eslint-disable-next-line no-unused-vars
import {$, jQuery} from 'jquery/src/jquery';
-
-// jQuery Migrate 3.x
import 'jquery-migrate/src/migrate';
-
-// Popper 1.x
import 'popper.js';
-
-// Boostrap 4.x
import 'bootstrap/js/src/index';
// Old application code
-import './main';
+import './main.mjs';
// New application code
-import './index';
\ No newline at end of file
+import Theme from './theme.mjs';
+
+import {library, dom} from '@fortawesome/fontawesome-svg-core/index.es';
+import {fas} from '@fortawesome/free-solid-svg-icons/index.es';
+import {far} from '@fortawesome/free-regular-svg-icons/index.es';
+import {fab} from '@fortawesome/free-brands-svg-icons/index.es';
+library.add(fas, far, fab);
+
+document.addEventListener('DOMContentLoaded', () => {
+ Theme.init();
+
+ // This is required to seach DOM and convert i tags to SVG
+ dom.i2svg();
+
+ document.getElementById('theme-switch-btn').addEventListener('click', () => {
+ Theme.swap();
+ });
+});
+
diff --git a/web/src/js/index.mjs b/web/src/js/index.mjs
deleted file mode 100644
index df95914..0000000
--- a/web/src/js/index.mjs
+++ /dev/null
@@ -1,18 +0,0 @@
-import Theme from './theme';
-
-import { library, dom } from '@fortawesome/fontawesome-svg-core/index.es';
-import { fas } from '@fortawesome/free-solid-svg-icons/index.es';
-import { far } from '@fortawesome/free-regular-svg-icons/index.es';
-import { fab } from '@fortawesome/free-brands-svg-icons/index.es';
-library.add(fas, far, fab);
-
-document.addEventListener('DOMContentLoaded', () => {
- Theme.init();
-
- // FontAwesome
- dom.i2svg();
-
- document.getElementById('theme-switch-btn').addEventListener('click', () => {
- Theme.swap();
- });
-});
\ No newline at end of file
diff --git a/web/src/js/main.mjs b/web/src/js/main.mjs
index d54b5d4..44af668 100644
--- a/web/src/js/main.mjs
+++ b/web/src/js/main.mjs
@@ -1,8 +1,10 @@
-$('#uploadSelectFile').on('change', function () {
- //get the file name
- let fileName = $(this).val().replace('C:\\fakepath\\', " ");
- //replace the "Choose a file" label
- $(this).next('.custom-file-label').html(fileName);
+import {isOverflown, setProgressBar, secondsToStr} from './util';
+
+$('#uploadSelectFile').on('change', function() {
+ // get the file name
+ const fileName = $(this).val().replace('C:\\fakepath\\', ' ');
+ // replace the "Choose a file" label
+ $(this).next('.custom-file-label').html(fileName);
});
@@ -10,26 +12,26 @@ $('#uploadSelectFile').on('change', function () {
// ------ Playlist ------
// ----------------------
-const pl_item_template = $(".playlist-item-template");
-const pl_id_element = $(".playlist-item-id");
-const pl_index_element = $(".playlist-item-index");
-const pl_title_element = $(".playlist-item-title");
-const pl_artist_element = $(".playlist-item-artist");
-const pl_thumb_element = $(".playlist-item-thumbnail");
-const pl_type_element = $(".playlist-item-type");
-const pl_path_element = $(".playlist-item-path");
+const pl_item_template = $('.playlist-item-template');
+const pl_id_element = $('.playlist-item-id');
+const pl_index_element = $('.playlist-item-index');
+const pl_title_element = $('.playlist-item-title');
+const pl_artist_element = $('.playlist-item-artist');
+const pl_thumb_element = $('.playlist-item-thumbnail');
+const pl_type_element = $('.playlist-item-type');
+const pl_path_element = $('.playlist-item-path');
-const pl_tag_edit_element = $(".playlist-item-edit");
+const pl_tag_edit_element = $('.playlist-item-edit');
-const notag_element = $(".library-item-notag"); // these elements are shared with library
-const tag_element = $(".library-item-tag");
+const notag_element = $('.library-item-notag'); // these elements are shared with library
+const tag_element = $('.library-item-tag');
-const add_tag_modal = $("#addTagModal");
+const add_tag_modal = $('#addTagModal');
-const playlist_loading = $("#playlist-loading");
-const playlist_table = $("#playlist-table");
-const playlist_empty = $("#playlist-empty");
-const playlist_expand = $(".playlist-expand");
+const playlist_loading = $('#playlist-loading');
+const playlist_table = $('#playlist-table');
+const playlist_empty = $('#playlist-empty');
+const playlist_expand = $('.playlist-expand');
let playlist_items = null;
@@ -47,279 +49,279 @@ const playPauseBtn = $('#play-pause-btn');
const fastForwardBtn = $('#fast-forward-btn');
const playModeBtns = {
- 'one-shot': $('#one-shot-mode-btn'),
- random: $('#random-mode-btn'),
- repeat: $('#repeat-mode-btn'),
- autoplay: $('#autoplay-mode-btn')
+ 'one-shot': $('#one-shot-mode-btn'),
+ 'random': $('#random-mode-btn'),
+ 'repeat': $('#repeat-mode-btn'),
+ 'autoplay': $('#autoplay-mode-btn'),
};
const playModeIcon = {
- 'one-shot': 'fa-tasks',
- random: 'fa-random',
- repeat: 'fa-redo',
- autoplay: 'fa-robot'
+ 'one-shot': 'fa-tasks',
+ 'random': 'fa-random',
+ 'repeat': 'fa-redo',
+ 'autoplay': 'fa-robot',
};
function request(_url, _data, refresh = false) {
- console.log(_data);
- $.ajax({
- type: 'POST',
- url: _url,
- data: _data,
- statusCode: {
- 200: function (data) {
- if (data.ver !== playlist_ver) {
- checkForPlaylistUpdate();
- }
- updateControls(data.empty, data.play, data.mode, data.volume);
- updatePlayerPlayhead(data.playhead);
- },
- 403: function (){
- location.reload(true);
- }
- },
- });
- if (refresh) {
- location.reload(true)
- }
+ console.log(_data);
+ $.ajax({
+ type: 'POST',
+ url: _url,
+ data: _data,
+ statusCode: {
+ 200: function(data) {
+ if (data.ver !== playlist_ver) {
+ checkForPlaylistUpdate();
+ }
+ updateControls(data.empty, data.play, data.mode, data.volume);
+ updatePlayerPlayhead(data.playhead);
+ },
+ 403: function() {
+ location.reload(true);
+ },
+ },
+ });
+ if (refresh) {
+ location.reload(true);
+ }
}
function addPlaylistItem(item) {
- pl_id_element.val(item.id);
- pl_index_element.html(item.index + 1);
- pl_title_element.html(item.title);
- pl_artist_element.html(item.artist);
- pl_thumb_element.attr("src", item.thumbnail);
- pl_type_element.html(item.type);
- pl_path_element.html(item.path);
+ pl_id_element.val(item.id);
+ pl_index_element.html(item.index + 1);
+ pl_title_element.html(item.title);
+ pl_artist_element.html(item.artist);
+ pl_thumb_element.attr('src', item.thumbnail);
+ pl_type_element.html(item.type);
+ pl_path_element.html(item.path);
- let item_copy = pl_item_template.clone();
- item_copy.attr("id", "playlist-item-" + item.index);
- item_copy.addClass("playlist-item").removeClass("d-none");
+ const item_copy = pl_item_template.clone();
+ item_copy.attr('id', 'playlist-item-' + item.index);
+ item_copy.addClass('playlist-item').removeClass('d-none');
- let tags = item_copy.find(".playlist-item-tags");
- tags.empty();
+ const tags = item_copy.find('.playlist-item-tags');
+ tags.empty();
- let tag_edit_copy = pl_tag_edit_element.clone();
- tag_edit_copy.click(function () {
- addTagModalShow(item.id, item.title, item.tags);
+ const tag_edit_copy = pl_tag_edit_element.clone();
+ tag_edit_copy.click(function() {
+ addTagModalShow(item.id, item.title, item.tags);
+ });
+ tag_edit_copy.appendTo(tags);
+
+ if (item.tags.length > 0) {
+ item.tags.forEach(function(tag_tuple) {
+ const tag_copy = tag_element.clone();
+ tag_copy.html(tag_tuple[0]);
+ tag_copy.addClass('badge-' + tag_tuple[1]);
+ tag_copy.appendTo(tags);
});
- tag_edit_copy.appendTo(tags);
+ } else {
+ const tag_copy = notag_element.clone();
+ tag_copy.appendTo(tags);
+ }
- if (item.tags.length > 0) {
- item.tags.forEach(function (tag_tuple) {
- let tag_copy = tag_element.clone();
- tag_copy.html(tag_tuple[0]);
- tag_copy.addClass("badge-" + tag_tuple[1]);
- tag_copy.appendTo(tags);
- });
- } else {
- let tag_copy = notag_element.clone();
- tag_copy.appendTo(tags);
- }
-
- item_copy.appendTo(playlist_table);
+ item_copy.appendTo(playlist_table);
}
function displayPlaylist(data) {
- playlist_table.animate({ opacity: 0 }, 200, function () {
- playlist_loading.hide();
- $(".playlist-item").remove();
- let items = data.items;
- playlist_items = {};
- for (let i in items){
- playlist_items[items[i].index] = items[i]
- }
- let length = data.length;
- let start_from = data.start_from;
- playlist_range_from = start_from;
- playlist_range_to = start_from + items.length - 1;
+ playlist_table.animate({opacity: 0}, 200, function() {
+ playlist_loading.hide();
+ $('.playlist-item').remove();
+ const items = data.items;
+ playlist_items = {};
+ for (const i in items) {
+ playlist_items[items[i].index] = items[i];
+ }
+ const length = data.length;
+ const start_from = data.start_from;
+ playlist_range_from = start_from;
+ playlist_range_to = start_from + items.length - 1;
- if (items.length < length && start_from > 0) {
- let _from = start_from - 5;
- _from = _from > 0 ? _from : 0;
- let _to = start_from - 1;
- if (_to > 0) {
- insertExpandPrompt(_from, start_from + length - 1, _from, _to, length);
- }
- }
+ if (items.length < length && start_from > 0) {
+ let _from = start_from - 5;
+ _from = _from > 0 ? _from : 0;
+ const _to = start_from - 1;
+ if (_to > 0) {
+ insertExpandPrompt(_from, start_from + length - 1, _from, _to, length);
+ }
+ }
- items.forEach(
- function (item) {
- addPlaylistItem(item);
- }
- );
+ items.forEach(
+ function(item) {
+ addPlaylistItem(item);
+ },
+ );
- if (items.length < length && start_from + items.length < length) {
- let _from = start_from + items.length;
- let _to = start_from + items.length - 1 + 10;
- _to = _to < length - 1 ? _to : length - 1;
- if (start_from + items.length < _to) {
- insertExpandPrompt(start_from, _to, _from, _to, length);
- }
- }
+ if (items.length < length && start_from + items.length < length) {
+ const _from = start_from + items.length;
+ let _to = start_from + items.length - 1 + 10;
+ _to = _to < length - 1 ? _to : length - 1;
+ if (start_from + items.length < _to) {
+ insertExpandPrompt(start_from, _to, _from, _to, length);
+ }
+ }
- displayActiveItem(data.current_index);
- updatePlayerInfo(playlist_items[data.current_index]);
- bindPlaylistEvent();
- playlist_table.animate({ opacity: 1 }, 200);
- });
+ displayActiveItem(data.current_index);
+ updatePlayerInfo(playlist_items[data.current_index]);
+ bindPlaylistEvent();
+ playlist_table.animate({opacity: 1}, 200);
+ });
}
function displayActiveItem(current_index) {
- $(".playlist-item").removeClass("table-active");
- $("#playlist-item-" + current_index).addClass("table-active");
+ $('.playlist-item').removeClass('table-active');
+ $('#playlist-item-' + current_index).addClass('table-active');
}
function insertExpandPrompt(real_from, real_to, display_from, display_to, total_length) {
- let expand_copy = playlist_expand.clone();
- expand_copy.addClass('playlist-item');
- expand_copy.removeClass('d-none');
- if (display_from !== display_to) {
- expand_copy.find(".playlist-expand-item-range").html((display_from + 1) + "~" + (display_to + 1)
- + " of " + (total_length) + " items");
- } else {
- expand_copy.find(".playlist-expand-item-range").html(display_from + " of " + (total_length) + " items");
- }
+ const expand_copy = playlist_expand.clone();
+ expand_copy.addClass('playlist-item');
+ expand_copy.removeClass('d-none');
+ if (display_from !== display_to) {
+ expand_copy.find('.playlist-expand-item-range').html((display_from + 1) + '~' + (display_to + 1) +
+ ' of ' + (total_length) + ' items');
+ } else {
+ expand_copy.find('.playlist-expand-item-range').html(display_from + ' of ' + (total_length) + ' items');
+ }
- expand_copy.addClass('playlist-item');
- expand_copy.appendTo(playlist_table);
- expand_copy.click(function () {
- playlist_range_from = real_from;
- playlist_range_to = real_to;
- updatePlaylist();
- });
+ expand_copy.addClass('playlist-item');
+ expand_copy.appendTo(playlist_table);
+ expand_copy.click(function() {
+ playlist_range_from = real_from;
+ playlist_range_to = real_to;
+ updatePlaylist();
+ });
}
function updatePlaylist() {
- playlist_table.animate({ opacity: 0 }, 200, function () {
- playlist_empty.addClass('d-none');
- playlist_loading.show();
- playlist_table.find(".playlist-item").css("opacity", 0);
- let data = {};
- if (!(playlist_range_from === 0 && playlist_range_to === 0)) {
- data = {
- range_from: playlist_range_from,
- range_to: playlist_range_to
- };
- }
- $.ajax({
- type: 'GET',
- url: 'playlist',
- data: data,
- statusCode: {
- 200: displayPlaylist,
- 204: function () {
- playlist_loading.hide();
- playlist_empty.removeClass('d-none');
- $(".playlist-item").remove();
- }
- }
- });
- playlist_table.animate({ opacity: 1 }, 200);
+ playlist_table.animate({opacity: 0}, 200, function() {
+ playlist_empty.addClass('d-none');
+ playlist_loading.show();
+ playlist_table.find('.playlist-item').css('opacity', 0);
+ let data = {};
+ if (!(playlist_range_from === 0 && playlist_range_to === 0)) {
+ data = {
+ range_from: playlist_range_from,
+ range_to: playlist_range_to,
+ };
+ }
+ $.ajax({
+ type: 'GET',
+ url: 'playlist',
+ data: data,
+ statusCode: {
+ 200: displayPlaylist,
+ 204: function() {
+ playlist_loading.hide();
+ playlist_empty.removeClass('d-none');
+ $('.playlist-item').remove();
+ },
+ },
});
+ playlist_table.animate({opacity: 1}, 200);
+ });
}
function checkForPlaylistUpdate() {
- $.ajax({
- type: 'POST',
- url: 'post',
- statusCode: {
- 200: function (data) {
- if (data.ver !== playlist_ver) {
- playlist_ver = data.ver;
- playlist_range_from = 0;
- playlist_range_to = 0;
- updatePlaylist();
- }
- if (data.current_index !== playlist_current_index) {
- if (data.current_index !== -1) {
- if ((data.current_index > playlist_range_to || data.current_index < playlist_range_from)) {
- playlist_range_from = 0;
- playlist_range_to = 0;
- updatePlaylist();
- } else {
- playlist_current_index = data.current_index;
- updatePlayerInfo(playlist_items[data.current_index]);
- displayActiveItem(data.current_index);
- }
- }
- }
- updateControls(data.empty, data.play, data.mode, data.volume);
- if (!data.empty){
- updatePlayerPlayhead(data.playhead);
- }
- }
+ $.ajax({
+ type: 'POST',
+ url: 'post',
+ statusCode: {
+ 200: function(data) {
+ if (data.ver !== playlist_ver) {
+ playlist_ver = data.ver;
+ playlist_range_from = 0;
+ playlist_range_to = 0;
+ updatePlaylist();
}
- });
+ if (data.current_index !== playlist_current_index) {
+ if (data.current_index !== -1) {
+ if ((data.current_index > playlist_range_to || data.current_index < playlist_range_from)) {
+ playlist_range_from = 0;
+ playlist_range_to = 0;
+ updatePlaylist();
+ } else {
+ playlist_current_index = data.current_index;
+ updatePlayerInfo(playlist_items[data.current_index]);
+ displayActiveItem(data.current_index);
+ }
+ }
+ }
+ updateControls(data.empty, data.play, data.mode, data.volume);
+ if (!data.empty) {
+ updatePlayerPlayhead(data.playhead);
+ }
+ },
+ },
+ });
}
function bindPlaylistEvent() {
- $(".playlist-item-play").unbind().click(
- function (e) {
- request('post', {
- 'play_music': ($(e.currentTarget).parent().parent().parent().find(".playlist-item-index").html() - 1)
- });
- }
- );
- $(".playlist-item-trash").unbind().click(
- function (e) {
- request('post', {
- 'delete_music': ($(e.currentTarget).parent().parent().parent().find(".playlist-item-index").html() - 1)
- });
- }
- );
+ $('.playlist-item-play').unbind().click(
+ function(e) {
+ request('post', {
+ 'play_music': ($(e.currentTarget).parent().parent().parent().find('.playlist-item-index').html() - 1),
+ });
+ },
+ );
+ $('.playlist-item-trash').unbind().click(
+ function(e) {
+ request('post', {
+ 'delete_music': ($(e.currentTarget).parent().parent().parent().find('.playlist-item-index').html() - 1),
+ });
+ },
+ );
}
function updateControls(empty, play, mode, volume) {
- updatePlayerControls(play, empty);
- if (empty) {
- playPauseBtn.prop('disabled', true);
- fastForwardBtn.prop('disabled', true);
+ updatePlayerControls(play, empty);
+ if (empty) {
+ playPauseBtn.prop('disabled', true);
+ fastForwardBtn.prop('disabled', true);
+ } else {
+ playPauseBtn.prop('disabled', false);
+ fastForwardBtn.prop('disabled', false);
+ if (play) {
+ playing = true;
+ playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause');
} else {
- playPauseBtn.prop('disabled', false);
- fastForwardBtn.prop('disabled', false);
- if (play) {
- playing = true;
- playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-play').addClass('fa-pause');
- } else {
- playing = false;
- playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play');
- }
+ playing = false;
+ playPauseBtn.find('[data-fa-i2svg]').removeClass('fa-pause').addClass('fa-play');
}
+ }
- for (const otherMode of Object.values(playModeBtns)) {
- otherMode.removeClass('active');
- }
- playModeBtns[mode].addClass('active');
+ for (const otherMode of Object.values(playModeBtns)) {
+ otherMode.removeClass('active');
+ }
+ playModeBtns[mode].addClass('active');
- let playModeIndicator = $('#modeIndicator');
- for (const icon_class of Object.values(playModeIcon)) {
- playModeIndicator.removeClass(icon_class);
- }
- playModeIndicator.addClass(playModeIcon[mode]);
+ const playModeIndicator = $('#modeIndicator');
+ for (const icon_class of Object.values(playModeIcon)) {
+ playModeIndicator.removeClass(icon_class);
+ }
+ playModeIndicator.addClass(playModeIcon[mode]);
- if (volume !== last_volume) {
- last_volume = volume;
- if (volume > 1) {
- document.getElementById("volume-slider").value = 1;
- } else if (volume < 0) {
- document.getElementById("volume-slider").value = 0;
- } else {
- document.getElementById("volume-slider").value = volume;
- }
+ if (volume !== last_volume) {
+ last_volume = volume;
+ if (volume > 1) {
+ document.getElementById('volume-slider').value = 1;
+ } else if (volume < 0) {
+ document.getElementById('volume-slider').value = 0;
+ } else {
+ document.getElementById('volume-slider').value = volume;
}
+ }
}
function togglePlayPause() {
- if (playing) {
- request('post', {action: 'pause'});
- } else {
- request('post', {action: 'resume'});
- }
+ if (playing) {
+ request('post', {action: 'pause'});
+ } else {
+ request('post', {action: 'resume'});
+ }
}
function changePlayMode(mode) {
- request('post', {action: mode});
+ request('post', {action: mode});
}
@@ -327,758 +329,762 @@ function changePlayMode(mode) {
// ------ Browser ------
// ---------------------
-let filters = {
- file: $('#filter-type-file'),
- url: $('#filter-type-url'),
- radio: $('#filter-type-radio'),
+const filters = {
+ file: $('#filter-type-file'),
+ url: $('#filter-type-url'),
+ radio: $('#filter-type-radio'),
};
-let filter_dir = $("#filter-dir");
-let filter_keywords = $("#filter-keywords");
+const filter_dir = $('#filter-dir');
+const filter_keywords = $('#filter-keywords');
function setFilterType(event, type) {
- event.preventDefault();
+ event.preventDefault();
- if (filters[type].hasClass('active')) {
- filters[type].removeClass('active btn-primary').addClass('btn-secondary');
- filters[type].find('input[type=radio]').removeAttr('checked');
- } else {
- filters[type].removeClass('btn-secondary').addClass('active btn-primary');
- filters[type].find('input[type=radio]').attr('checked', 'checked');
- }
+ if (filters[type].hasClass('active')) {
+ filters[type].removeClass('active btn-primary').addClass('btn-secondary');
+ filters[type].find('input[type=radio]').removeAttr('checked');
+ } else {
+ filters[type].removeClass('btn-secondary').addClass('active btn-primary');
+ filters[type].find('input[type=radio]').attr('checked', 'checked');
+ }
- if (type === 'file') {
- filter_dir.prop('disabled', !filters['file'].hasClass('active'));
- }
+ if (type === 'file') {
+ filter_dir.prop('disabled', !filters['file'].hasClass('active'));
+ }
- updateResults();
+ updateResults();
}
// Bind Event
-$(".filter-tag").click(function (e) {
- let tag = $(e.currentTarget);
- if (!tag.hasClass('tag-clicked')) {
- tag.addClass('tag-clicked');
- tag.removeClass('tag-unclicked');
- } else {
- tag.addClass('tag-unclicked');
- tag.removeClass('tag-clicked');
- }
- updateResults();
+$('.filter-tag').click(function(e) {
+ const tag = $(e.currentTarget);
+ if (!tag.hasClass('tag-clicked')) {
+ tag.addClass('tag-clicked');
+ tag.removeClass('tag-unclicked');
+ } else {
+ tag.addClass('tag-unclicked');
+ tag.removeClass('tag-clicked');
+ }
+ updateResults();
});
-filter_dir.change(function () { updateResults() });
-filter_keywords.change(function () { updateResults() });
+filter_dir.change(function() {
+ updateResults();
+});
+filter_keywords.change(function() {
+ updateResults();
+});
-let item_template = $("#library-item");
+const item_template = $('#library-item');
function bindLibraryResultEvent() {
- $(".library-thumb-col").unbind().hover(
- function (e) { $(e.currentTarget).find(".library-thumb-grp").addClass("library-thumb-grp-hover"); },
- function (e) { $(e.currentTarget).find(".library-thumb-grp").removeClass("library-thumb-grp-hover"); }
- );
+ $('.library-thumb-col').unbind().hover(
+ function(e) {
+ $(e.currentTarget).find('.library-thumb-grp').addClass('library-thumb-grp-hover');
+ },
+ function(e) {
+ $(e.currentTarget).find('.library-thumb-grp').removeClass('library-thumb-grp-hover');
+ },
+ );
- $(".library-info-title").unbind().hover(
- function (e) { $(e.currentTarget).parent().find(".library-thumb-grp").addClass("library-thumb-grp-hover"); },
- function (e) { $(e.currentTarget).parent().find(".library-thumb-grp").removeClass("library-thumb-grp-hover"); }
- );
+ $('.library-info-title').unbind().hover(
+ function(e) {
+ $(e.currentTarget).parent().find('.library-thumb-grp').addClass('library-thumb-grp-hover');
+ },
+ function(e) {
+ $(e.currentTarget).parent().find('.library-thumb-grp').removeClass('library-thumb-grp-hover');
+ },
+ );
- $(".library-item-play").unbind().click(
- function (e) {
- request('post', {
- 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find(".library-item-id").val()
- });
- }
- );
+ $('.library-item-play').unbind().click(
+ function(e) {
+ request('post', {
+ 'add_item_at_once': $(e.currentTarget).parent().parent().parent().find('.library-item-id').val(),
+ });
+ },
+ );
- $(".library-item-trash").unbind().click(
- function (e) {
- request('post', {
- 'delete_item_from_library': $(e.currentTarget).parent().parent().find(".library-item-id").val()
- });
- updateResults(active_page);
- }
- );
+ $('.library-item-trash').unbind().click(
+ function(e) {
+ request('post', {
+ 'delete_item_from_library': $(e.currentTarget).parent().parent().find('.library-item-id').val(),
+ });
+ updateResults(active_page);
+ },
+ );
- $(".library-item-download").unbind().click(
- function (e) {
- let id = $(e.currentTarget).parent().parent().find(".library-item-id").val();
- //window.open('/download?id=' + id);
- downloadId(id);
- }
- );
+ $('.library-item-download').unbind().click(
+ function(e) {
+ const id = $(e.currentTarget).parent().parent().find('.library-item-id').val();
+ // window.open('/download?id=' + id);
+ downloadId(id);
+ },
+ );
- $(".library-item-add-next").unbind().click(
- function (e) {
- let id = $(e.currentTarget).parent().parent().find(".library-item-id").val();
- request('post', {
- 'add_item_next': id
- });
- }
- );
+ $('.library-item-add-next').unbind().click(
+ function(e) {
+ const id = $(e.currentTarget).parent().parent().find('.library-item-id').val();
+ request('post', {
+ 'add_item_next': id,
+ });
+ },
+ );
- $(".library-item-add-bottom").unbind().click(
- function (e) {
- let id = $(e.currentTarget).parent().parent().find(".library-item-id").val();
- request('post', {
- 'add_item_bottom': id
- });
- }
- );
+ $('.library-item-add-bottom').unbind().click(
+ function(e) {
+ const id = $(e.currentTarget).parent().parent().find('.library-item-id').val();
+ request('post', {
+ 'add_item_bottom': id,
+ });
+ },
+ );
}
-const lib_group = $("#library-group");
-const id_element = $(".library-item-id");
-const title_element = $(".library-item-title");
-const artist_element = $(".library-item-artist");
-const thumb_element = $(".library-item-thumb");
-const type_element = $(".library-item-type");
-const path_element = $(".library-item-path");
+const lib_group = $('#library-group');
+const id_element = $('.library-item-id');
+const title_element = $('.library-item-title');
+const artist_element = $('.library-item-artist');
+const thumb_element = $('.library-item-thumb');
+const type_element = $('.library-item-type');
+const path_element = $('.library-item-path');
-const tag_edit_element = $(".library-item-edit");
-//var notag_element = $(".library-item-notag");
-//var tag_element = $(".library-item-tag");
+const tag_edit_element = $('.library-item-edit');
+// var notag_element = $(".library-item-notag");
+// var tag_element = $(".library-item-tag");
-//var add_tag_modal = $("#addTagModal");
+// var add_tag_modal = $("#addTagModal");
function addResultItem(item) {
- id_element.val(item.id);
- title_element.html(item.title);
- artist_element.html(item.artist ? ("- " + item.artist) : "");
- thumb_element.attr("src", item.thumb);
- type_element.html("[" + item.type + "]");
- path_element.html(item.path);
+ id_element.val(item.id);
+ title_element.html(item.title);
+ artist_element.html(item.artist ? ('- ' + item.artist) : '');
+ thumb_element.attr('src', item.thumb);
+ type_element.html('[' + item.type + ']');
+ path_element.html(item.path);
- let item_copy = item_template.clone();
- item_copy.addClass("library-item-active");
+ const item_copy = item_template.clone();
+ item_copy.addClass('library-item-active');
- let tags = item_copy.find(".library-item-tags");
- tags.empty();
+ const tags = item_copy.find('.library-item-tags');
+ tags.empty();
- let tag_edit_copy = tag_edit_element.clone();
- tag_edit_copy.click(function () {
- addTagModalShow(item.id, item.title, item.tags);
+ const tag_edit_copy = tag_edit_element.clone();
+ tag_edit_copy.click(function() {
+ addTagModalShow(item.id, item.title, item.tags);
+ });
+ tag_edit_copy.appendTo(tags);
+
+ if (item.tags.length > 0) {
+ item.tags.forEach(function(tag_tuple) {
+ const tag_copy = tag_element.clone();
+ tag_copy.html(tag_tuple[0]);
+ tag_copy.addClass('badge-' + tag_tuple[1]);
+ tag_copy.appendTo(tags);
});
- tag_edit_copy.appendTo(tags);
+ } else {
+ const tag_copy = notag_element.clone();
+ tag_copy.appendTo(tags);
+ }
- if (item.tags.length > 0) {
- item.tags.forEach(function (tag_tuple) {
- let tag_copy = tag_element.clone();
- tag_copy.html(tag_tuple[0]);
- tag_copy.addClass("badge-" + tag_tuple[1]);
- tag_copy.appendTo(tags);
- });
- } else {
- let tag_copy = notag_element.clone();
- tag_copy.appendTo(tags);
- }
-
- item_copy.appendTo(lib_group);
- item_copy.show();
+ item_copy.appendTo(lib_group);
+ item_copy.show();
}
function getFilters(dest_page = 1) {
- let tags = $(".tag-clicked");
- let tags_list = [];
- tags.each(function (index, tag) {
- tags_list.push(tag.innerHTML);
- });
+ const tags = $('.tag-clicked');
+ const tags_list = [];
+ tags.each(function(index, tag) {
+ tags_list.push(tag.innerHTML);
+ });
- let filter_types = [];
- for (const filter in filters) {
- if (filters[filter].hasClass('active')) {
- filter_types.push(filter);
- }
+ const filter_types = [];
+ for (const filter in filters) {
+ if (filters[filter].hasClass('active')) {
+ filter_types.push(filter);
}
+ }
- return {
- type: filter_types.join(','),
- dir: filter_dir.val(),
- tags: tags_list.join(","),
- keywords: filter_keywords.val(),
- page: dest_page
- };
+ return {
+ type: filter_types.join(','),
+ dir: filter_dir.val(),
+ tags: tags_list.join(','),
+ keywords: filter_keywords.val(),
+ page: dest_page,
+ };
}
-let lib_loading = $("#library-item-loading");
-let lib_empty = $("#library-item-empty");
+const lib_loading = $('#library-item-loading');
+const lib_empty = $('#library-item-empty');
let active_page = 1;
function updateResults(dest_page = 1) {
- active_page = dest_page;
- let data = getFilters(dest_page);
- data.action = "query";
+ active_page = dest_page;
+ const data = getFilters(dest_page);
+ data.action = 'query';
- lib_group.animate({ opacity: 0 }, 200, function () {
- $.ajax({
- type: 'POST',
- url: 'library',
- data: data,
- statusCode: {
- 200: processResults,
- 204: function () {
- lib_loading.hide();
- lib_empty.show();
- page_ul.empty();
- },
- 403: function () {
- location.reload(true);
- }
- }
- });
-
- $(".library-item-active").remove();
- lib_empty.hide();
- lib_loading.show();
- lib_group.animate({ opacity: 1 }, 200);
+ lib_group.animate({opacity: 0}, 200, function() {
+ $.ajax({
+ type: 'POST',
+ url: 'library',
+ data: data,
+ statusCode: {
+ 200: processResults,
+ 204: function() {
+ lib_loading.hide();
+ lib_empty.show();
+ page_ul.empty();
+ },
+ 403: function() {
+ location.reload(true);
+ },
+ },
});
+
+ $('.library-item-active').remove();
+ lib_empty.hide();
+ lib_loading.show();
+ lib_group.animate({opacity: 1}, 200);
+ });
}
-const download_form = $("#download-form");
-const download_id = download_form.find("input[name='id']");
-const download_type = download_form.find("input[name='type']");
-const download_dir = download_form.find("input[name='dir']");
-const download_tags = download_form.find("input[name='tags']");
-const download_keywords = download_form.find("input[name='keywords']");
+const download_form = $('#download-form');
+const download_id = download_form.find('input[name=\'id\']');
+const download_type = download_form.find('input[name=\'type\']');
+const download_dir = download_form.find('input[name=\'dir\']');
+const download_tags = download_form.find('input[name=\'tags\']');
+const download_keywords = download_form.find('input[name=\'keywords\']');
function addAllResults() {
- let data = getFilters();
- data.action = "add";
+ const data = getFilters();
+ data.action = 'add';
- console.log(data);
+ console.log(data);
- $.ajax({
- type: 'POST',
- url: 'library',
- data: data
- });
+ $.ajax({
+ type: 'POST',
+ url: 'library',
+ data: data,
+ });
- checkForPlaylistUpdate();
+ checkForPlaylistUpdate();
}
function deleteAllResults() {
- let data = getFilters();
- data.action = "delete";
+ const data = getFilters();
+ data.action = 'delete';
- console.log(data);
+ console.log(data);
- $.ajax({
- type: 'POST',
- url: 'library',
- data: data
- });
+ $.ajax({
+ type: 'POST',
+ url: 'library',
+ data: data,
+ });
- checkForPlaylistUpdate();
- updateResults();
+ checkForPlaylistUpdate();
+ updateResults();
}
function downloadAllResults() {
- let cond = getFilters();
- download_id.val();
- download_type.val(cond.type);
- download_dir.val(cond.dir);
- download_tags.val(cond.tags);
- download_keywords.val(cond.keywords);
- download_form.submit();
+ const cond = getFilters();
+ download_id.val();
+ download_type.val(cond.type);
+ download_dir.val(cond.dir);
+ download_tags.val(cond.tags);
+ download_keywords.val(cond.keywords);
+ download_form.submit();
}
function downloadId(id) {
- download_id.attr("value", id);
- download_type.attr("value", "");
- download_dir.attr("value", "");
- download_tags.attr("value", "");
- download_keywords.attr("value", "");
- download_form.submit();
+ download_id.attr('value', id);
+ download_type.attr('value', '');
+ download_dir.attr('value', '');
+ download_tags.attr('value', '');
+ download_keywords.attr('value', '');
+ download_form.submit();
}
-const page_ul = $("#library-page-ul");
-const page_li = $(".library-page-li");
-const page_no = $(".library-page-no");
+const page_ul = $('#library-page-ul');
+const page_li = $('.library-page-li');
+const page_no = $('.library-page-no');
function processResults(data) {
- lib_group.animate({ opacity: 0 }, 200, function () {
- lib_loading.hide();
- let total_pages = data.total_pages;
- let active_page = data.active_page;
- let items = data.items;
- items.forEach(
- function (item) {
- addResultItem(item);
- bindLibraryResultEvent();
- }
- );
+ lib_group.animate({opacity: 0}, 200, function() {
+ lib_loading.hide();
+ const total_pages = data.total_pages;
+ const active_page = data.active_page;
+ const items = data.items;
+ items.forEach(
+ function(item) {
+ addResultItem(item);
+ bindLibraryResultEvent();
+ },
+ );
- page_ul.empty();
- page_li.removeClass('active').empty();
+ page_ul.empty();
+ page_li.removeClass('active').empty();
- let i = 1;
- let page_li_copy;
- let page_no_copy;
+ let i = 1;
+ let page_li_copy;
+ let page_no_copy;
- if (total_pages > 25) {
- i = (active_page - 12 >= 1) ? active_page - 12 : 1;
- let _i = total_pages - 23;
- i = (i < _i) ? i : _i;
- page_li_copy = page_li.clone();
- page_no_copy = page_no.clone();
- page_no_copy.html("«");
+ if (total_pages > 25) {
+ i = (active_page - 12 >= 1) ? active_page - 12 : 1;
+ const _i = total_pages - 23;
+ i = (i < _i) ? i : _i;
+ page_li_copy = page_li.clone();
+ page_no_copy = page_no.clone();
+ page_no_copy.html('«');
- page_no_copy.click(function (e) {
- updateResults(1);
- });
+ page_no_copy.click(function(e) {
+ updateResults(1);
+ });
- page_no_copy.appendTo(page_li_copy);
- page_li_copy.appendTo(page_ul);
- }
+ page_no_copy.appendTo(page_li_copy);
+ page_li_copy.appendTo(page_ul);
+ }
- let limit = i + 24;
- for (; i <= total_pages && i <= limit; i++) {
- page_li_copy = page_li.clone();
- page_no_copy = page_no.clone();
- page_no_copy.html(i.toString());
- if (active_page === i) {
- page_li_copy.addClass("active");
- } else {
- page_no_copy.click(function (e) {
- let _page_no = $(e.currentTarget).html();
- updateResults(_page_no);
- });
- }
- page_no_copy.appendTo(page_li_copy);
- page_li_copy.appendTo(page_ul);
- }
+ const limit = i + 24;
+ for (; i <= total_pages && i <= limit; i++) {
+ page_li_copy = page_li.clone();
+ page_no_copy = page_no.clone();
+ page_no_copy.html(i.toString());
+ if (active_page === i) {
+ page_li_copy.addClass('active');
+ } else {
+ page_no_copy.click(function(e) {
+ const _page_no = $(e.currentTarget).html();
+ updateResults(_page_no);
+ });
+ }
+ page_no_copy.appendTo(page_li_copy);
+ page_li_copy.appendTo(page_ul);
+ }
- if (limit < total_pages) {
- page_li_copy = page_li.clone();
- page_no_copy = page_no.clone();
- page_no_copy.html("»");
+ if (limit < total_pages) {
+ page_li_copy = page_li.clone();
+ page_no_copy = page_no.clone();
+ page_no_copy.html('»');
- page_no_copy.click(function (e) {
- updateResults(total_pages);
- });
+ page_no_copy.click(function(e) {
+ updateResults(total_pages);
+ });
- page_no_copy.appendTo(page_li_copy);
- page_li_copy.appendTo(page_ul);
- }
+ page_no_copy.appendTo(page_li_copy);
+ page_li_copy.appendTo(page_ul);
+ }
- lib_group.animate({ opacity: 1 }, 200);
- });
+ lib_group.animate({opacity: 1}, 200);
+ });
}
// ---------------------
// ------ Tagging ------
// ---------------------
-const add_tag_modal_title = $("#addTagModalTitle");
-const add_tag_modal_item_id = $("#addTagModalItemId");
-const add_tag_modal_tags = $("#addTagModalTags");
-const add_tag_modal_input = $("#addTagModalInput");
-const modal_tag = $(".modal-tag");
-const modal_tag_text = $(".modal-tag-text");
+const add_tag_modal_title = $('#addTagModalTitle');
+const add_tag_modal_item_id = $('#addTagModalItemId');
+const add_tag_modal_tags = $('#addTagModalTags');
+const add_tag_modal_input = $('#addTagModalInput');
+const modal_tag = $('.modal-tag');
+const modal_tag_text = $('.modal-tag-text');
function addTagModalShow(_id, _title, _tag_tuples) {
- add_tag_modal_title.html("Edit tags for " + _title);
- add_tag_modal_item_id.val(_id);
- add_tag_modal_tags.empty();
- _tag_tuples.forEach(function (tag_tuple) {
- modal_tag_text.html(tag_tuple[0]);
- let tag_copy = modal_tag.clone();
- let modal_tag_remove = tag_copy.find(".modal-tag-remove");
- modal_tag_remove.click(function (e) {
- $(e.currentTarget).parent().remove();
- });
- tag_copy.show();
- tag_copy.appendTo(add_tag_modal_tags);
- modal_tag_text.html("");
+ add_tag_modal_title.html('Edit tags for ' + _title);
+ add_tag_modal_item_id.val(_id);
+ add_tag_modal_tags.empty();
+ _tag_tuples.forEach(function(tag_tuple) {
+ modal_tag_text.html(tag_tuple[0]);
+ const tag_copy = modal_tag.clone();
+ const modal_tag_remove = tag_copy.find('.modal-tag-remove');
+ modal_tag_remove.click(function(e) {
+ $(e.currentTarget).parent().remove();
});
- add_tag_modal.modal('show');
+ tag_copy.show();
+ tag_copy.appendTo(add_tag_modal_tags);
+ modal_tag_text.html('');
+ });
+ add_tag_modal.modal('show');
}
function addTagModalAdd() {
- let new_tags = add_tag_modal_input.val().split(",").map(function (str) { return str.trim() });
- new_tags.forEach(function (tag) {
- modal_tag_text.html(tag);
- let tag_copy = modal_tag.clone();
- let modal_tag_remove = tag_copy.find(".modal-tag-remove");
- modal_tag_remove.click(function (e) {
- $(e.currentTarget).parent().remove();
- });
- tag_copy.show();
- tag_copy.appendTo(add_tag_modal_tags);
- modal_tag_text.html("");
+ const new_tags = add_tag_modal_input.val().split(',').map(function(str) {
+ return str.trim();
+ });
+ new_tags.forEach(function(tag) {
+ modal_tag_text.html(tag);
+ const tag_copy = modal_tag.clone();
+ const modal_tag_remove = tag_copy.find('.modal-tag-remove');
+ modal_tag_remove.click(function(e) {
+ $(e.currentTarget).parent().remove();
});
- add_tag_modal_input.val("");
+ tag_copy.show();
+ tag_copy.appendTo(add_tag_modal_tags);
+ modal_tag_text.html('');
+ });
+ add_tag_modal_input.val('');
}
function addTagModalSubmit() {
- let all_tags = $(".modal-tag-text");
- let tags = [];
- all_tags.each(function (i, element) {
- if (element.innerHTML) {
- tags.push(element.innerHTML);
- }
- });
+ const all_tags = $('.modal-tag-text');
+ const tags = [];
+ all_tags.each(function(i, element) {
+ if (element.innerHTML) {
+ tags.push(element.innerHTML);
+ }
+ });
- $.ajax({
- type: 'POST',
- url: 'library',
- data: {
- action: 'edit_tags',
- id: add_tag_modal_item_id.val(),
- tags: tags.join(",")
- }
- });
- updateResults(active_page);
+ $.ajax({
+ type: 'POST',
+ url: 'library',
+ data: {
+ action: 'edit_tags',
+ id: add_tag_modal_item_id.val(),
+ tags: tags.join(','),
+ },
+ });
+ updateResults(active_page);
}
// ---------------------
// ------- Volume ------
// ---------------------
-const volume_popover_btn = document.querySelector("#volume-popover-btn");
-const volume_popover_div = document.querySelector("#volume-popover");
+const volume_popover_btn = document.querySelector('#volume-popover-btn');
+const volume_popover_div = document.querySelector('#volume-popover');
let volume_popover_instance = null;
let volume_popover_show = false;
-volume_popover_btn.addEventListener('click', function(e){ e.stopPropagation(); })
-volume_popover_div.addEventListener('click', function(e){ e.stopPropagation(); })
+volume_popover_btn.addEventListener('click', function(e) {
+ e.stopPropagation();
+});
-function toggleVolumePopover(){
- if (!volume_popover_show){
- volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, {
- placement: 'top',
- modifiers: {
- offset: { offset: '0, 8' }
- }
- } );
- volume_popover_div.setAttribute('data-show', '');
- } else {
- volume_popover_div.removeAttribute('data-show');
- if (volume_popover_instance){
- volume_popover_instance.destroy();
- volume_popover_instance = null;
- }
+volume_popover_div.addEventListener('click', function(e) {
+ e.stopPropagation();
+});
+
+function toggleVolumePopover() {
+ if (!volume_popover_show) {
+ volume_popover_instance = new Popper(volume_popover_btn, volume_popover_div, {
+ placement: 'top',
+ modifiers: {
+ offset: {offset: '0, 8'},
+ },
+ } );
+ volume_popover_div.setAttribute('data-show', '');
+ } else {
+ volume_popover_div.removeAttribute('data-show');
+ if (volume_popover_instance) {
+ volume_popover_instance.destroy();
+ volume_popover_instance = null;
}
- volume_popover_show = !volume_popover_show;
+ }
+ volume_popover_show = !volume_popover_show;
- document.addEventListener('click', function(){
- volume_popover_div.removeAttribute('data-show');
- if (volume_popover_instance){
- volume_popover_instance.destroy();
- volume_popover_instance = null;
- volume_popover_show = !volume_popover_show;
- }
- }, { once: true } );
+ document.addEventListener('click', function() {
+ volume_popover_div.removeAttribute('data-show');
+ if (volume_popover_instance) {
+ volume_popover_instance.destroy();
+ volume_popover_instance = null;
+ volume_popover_show = !volume_popover_show;
+ }
+ }, {once: true} );
}
let volume_update_timer;
function setVolumeDelayed(new_volume_value) {
- window.clearTimeout(volume_update_timer);
- volume_update_timer = window.setTimeout(function () {
- request('post', { action: 'volume_set_value', new_volume: new_volume_value });
- }, 500); // delay in milliseconds
+ window.clearTimeout(volume_update_timer);
+ volume_update_timer = window.setTimeout(function() {
+ request('post', {action: 'volume_set_value', new_volume: new_volume_value});
+ }, 500); // delay in milliseconds
}
// ---------------------
// ------- Upload ------
// ---------------------
-const uploadModal = $("#uploadModal");
+const uploadModal = $('#uploadModal');
-const uploadFileInput = document.getElementById("uploadSelectFile");
-const uploadModalItem = document.getElementsByClassName("uploadItem")[0];
-const uploadModalList = document.getElementById("uploadModalList");
-const uploadTargetDir = document.getElementById("uploadTargetDir");
-const uploadSuccessAlert = document.getElementById("uploadSuccessAlert");
-const uploadSubmitBtn = document.getElementById("uploadSubmit");
-const uploadCancelBtn = document.getElementById("uploadCancel");
-const uploadCloseBtn = document.getElementById("uploadClose");
+const uploadFileInput = document.getElementById('uploadSelectFile');
+const uploadModalItem = document.getElementsByClassName('uploadItem')[0];
+const uploadModalList = document.getElementById('uploadModalList');
+const uploadTargetDir = document.getElementById('uploadTargetDir');
+const uploadSuccessAlert = document.getElementById('uploadSuccessAlert');
+const uploadSubmitBtn = document.getElementById('uploadSubmit');
+const uploadCancelBtn = document.getElementById('uploadCancel');
+const uploadCloseBtn = document.getElementById('uploadClose');
-const maxFileSize = parseInt(document.getElementById("maxUploadFileSize").value);
+const maxFileSize = parseInt(document.getElementById('maxUploadFileSize').value);
let filesToProceed = [];
-let filesProgressItem = {};
+const filesProgressItem = {};
let runningXHR = null;
let areYouSureToCancelUploading = false;
-uploadSubmitBtn.addEventListener("click", uploadStart);
-uploadCancelBtn.addEventListener("click", uploadCancel)
+uploadSubmitBtn.addEventListener('click', uploadStart);
+uploadCancelBtn.addEventListener('click', uploadCancel);
-function uploadStart(){
- uploadModalList.textContent = '';
- uploadSuccessAlert.style.display = 'none';
- uploadCancelBtn.style.display = 'none';
- uploadCloseBtn.style.display = 'block';
- areYouSureToCancelUploading = false;
- $(uploadCancelBtn).tooltip('hide');
- const file_list = uploadFileInput.files;
+function uploadStart() {
+ uploadModalList.textContent = '';
+ uploadSuccessAlert.style.display = 'none';
+ uploadCancelBtn.style.display = 'none';
+ uploadCloseBtn.style.display = 'block';
+ areYouSureToCancelUploading = false;
+ $(uploadCancelBtn).tooltip('hide');
+ const file_list = uploadFileInput.files;
- if (file_list.length) {
- for (const file of file_list) {
- generateUploadProgressItem(file);
- if (file.size > maxFileSize) {
- setUploadError(file.name, 'File too large!')
- continue;
- } else if (!file.type.includes("audio")) {
- setUploadError(file.name, 'Unsupported media format!')
- continue;
- }
+ if (file_list.length) {
+ for (const file of file_list) {
+ generateUploadProgressItem(file);
+ if (file.size > maxFileSize) {
+ setUploadError(file.name, 'File too large!');
+ continue;
+ } else if (!file.type.includes('audio')) {
+ setUploadError(file.name, 'Unsupported media format!');
+ continue;
+ }
- filesToProceed.push(file);
- }
-
- uploadFileInput.value = '';
- uploadModal.modal("show");
- uploadNextFile();
+ filesToProceed.push(file);
}
+
+ uploadFileInput.value = '';
+ uploadModal.modal('show');
+ uploadNextFile();
+ }
}
-function setUploadError(filename, error){
- let file_progress_item = filesProgressItem[filename];
+function setUploadError(filename, error) {
+ const file_progress_item = filesProgressItem[filename];
- file_progress_item.title.classList.add("text-muted");
- file_progress_item.error.innerHTML += 'Error: ' + error;
- setProgressBar(file_progress_item.progress, 1);
- file_progress_item.progress.classList.add("bg-danger");
- file_progress_item.progress.classList.remove("progress-bar-animated");
+ file_progress_item.title.classList.add('text-muted');
+ file_progress_item.error.innerHTML += 'Error: ' + error;
+ setProgressBar(file_progress_item.progress, 1);
+ file_progress_item.progress.classList.add('bg-danger');
+ file_progress_item.progress.classList.remove('progress-bar-animated');
}
-function generateUploadProgressItem(file){
- let item_clone = uploadModalItem.cloneNode(true);
- let title = item_clone.querySelector(".uploadItemTitle");
- title.innerHTML = file.name;
- let error = item_clone.querySelector(".uploadItemError");
- let progress = item_clone.querySelector(".uploadProgress");
- item_clone.style.display = "block";
+function generateUploadProgressItem(file) {
+ const item_clone = uploadModalItem.cloneNode(true);
+ const title = item_clone.querySelector('.uploadItemTitle');
+ title.innerHTML = file.name;
+ const error = item_clone.querySelector('.uploadItemError');
+ const progress = item_clone.querySelector('.uploadProgress');
+ item_clone.style.display = 'block';
- let item = { title: title, error: error, progress: progress };
- filesProgressItem[file.name] = item;
- uploadModalList.appendChild(item_clone);
+ const item = {title: title, error: error, progress: progress};
+ filesProgressItem[file.name] = item;
+ uploadModalList.appendChild(item_clone);
- return item;
+ return item;
}
-function uploadNextFile(){
- uploadCancelBtn.style.display = 'block';
- uploadCloseBtn.style.display = 'none';
+function uploadNextFile() {
+ uploadCancelBtn.style.display = 'block';
+ uploadCloseBtn.style.display = 'none';
- let req = new XMLHttpRequest();
- let file = filesToProceed.shift();
- let file_progress_item = filesProgressItem[file.name];
+ const req = new XMLHttpRequest();
+ const file = filesToProceed.shift();
+ const file_progress_item = filesProgressItem[file.name];
- req.addEventListener("load", function(){
- if (this.status === 200) {
- setProgressBar(file_progress_item.progress, 1);
- file_progress_item.progress.classList.add("bg-success");
- file_progress_item.progress.classList.remove("progress-bar-animated");
- } else if (this.status === 400 || this.status === 403) {
- setUploadError(file.name, 'Illegal request!')
- } else if (this.status === 500) {
- setUploadError(file.name, 'Server internal error!')
- } else {
- if (this.responseText) {
- setUploadError(file.name, this.responseText)
- } else {
- setUploadError(file.name, 'Unknown error!')
- }
- }
-
- if (filesToProceed.length) {
- uploadNextFile();
- } else {
- uploadSuccessAlert.style.display = "block";
- runningXHR = null;
-
- uploadCancelBtn.style.display = 'none';
- uploadCloseBtn.style.display = 'block';
-
- request('post', {action : 'rescan'});
- updateResults();
- }
- });
-
- req.upload.addEventListener("progress", function(e){
- if (e.lengthComputable) {
- let percent = e.loaded / e.total;
- setProgressBar(file_progress_item.progress, percent, Math.floor(percent*100) + "%");
- }
- });
-
- let form = new FormData();
- form.append('file', file);
- form.append('targetdir', uploadTargetDir.value);
-
- req.open('POST', 'upload');
- req.withCredentials = true;
- req.send(form);
-
- file_progress_item.progress.classList.add("progress-bar-striped");
- file_progress_item.progress.classList.add("progress-bar-animated");
-
- runningXHR = req;
-}
-
-function uploadCancel(){
- if (!areYouSureToCancelUploading){
- $(uploadCancelBtn).tooltip('show');
+ req.addEventListener('load', function() {
+ if (this.status === 200) {
+ setProgressBar(file_progress_item.progress, 1);
+ file_progress_item.progress.classList.add('bg-success');
+ file_progress_item.progress.classList.remove('progress-bar-animated');
+ } else if (this.status === 400 || this.status === 403) {
+ setUploadError(file.name, 'Illegal request!');
+ } else if (this.status === 500) {
+ setUploadError(file.name, 'Server internal error!');
} else {
- $(uploadCancelBtn).tooltip('hide');
- uploadModal.modal('hide');
- runningXHR.abort()
- filesToProceed = [];
- uploadFileInput.value = '';
- request('post', {action : 'rescan'});
- updateResults();
+ if (this.responseText) {
+ setUploadError(file.name, this.responseText);
+ } else {
+ setUploadError(file.name, 'Unknown error!');
+ }
}
- areYouSureToCancelUploading = !areYouSureToCancelUploading;
+ if (filesToProceed.length) {
+ uploadNextFile();
+ } else {
+ uploadSuccessAlert.style.display = 'block';
+ runningXHR = null;
+
+ uploadCancelBtn.style.display = 'none';
+ uploadCloseBtn.style.display = 'block';
+
+ request('post', {action: 'rescan'});
+ updateResults();
+ }
+ });
+
+ req.upload.addEventListener('progress', function(e) {
+ if (e.lengthComputable) {
+ const percent = e.loaded / e.total;
+ setProgressBar(file_progress_item.progress, percent, Math.floor(percent*100) + '%');
+ }
+ });
+
+ const form = new FormData();
+ form.append('file', file);
+ form.append('targetdir', uploadTargetDir.value);
+
+ req.open('POST', 'upload');
+ req.withCredentials = true;
+ req.send(form);
+
+ file_progress_item.progress.classList.add('progress-bar-striped');
+ file_progress_item.progress.classList.add('progress-bar-animated');
+
+ runningXHR = req;
+}
+
+function uploadCancel() {
+ if (!areYouSureToCancelUploading) {
+ $(uploadCancelBtn).tooltip('show');
+ } else {
+ $(uploadCancelBtn).tooltip('hide');
+ uploadModal.modal('hide');
+ runningXHR.abort();
+ filesToProceed = [];
+ uploadFileInput.value = '';
+ request('post', {action: 'rescan'});
+ updateResults();
+ }
+
+ areYouSureToCancelUploading = !areYouSureToCancelUploading;
}
// ---------------------
// ------ Player ------
// ---------------------
-const player = document.getElementById("playerToast");
-const playerArtwork = document.getElementById("playerArtwork");
-const playerArtworkIdle = document.getElementById("playerArtworkIdle");
-const playerTitle = document.getElementById("playerTitle");
-const playerArtist = document.getElementById("playerArtist");
-const playerBar = document.getElementById("playerBar");
-const playerBarBox = document.getElementById("playerBarBox");
-const playerPlayBtn = document.getElementById("playerPlayBtn");
-const playerPauseBtn = document.getElementById("playerPauseBtn");
-const playerSkipBtn = document.getElementById("playerSkipBtn");
+const player = document.getElementById('playerToast');
+const playerArtwork = document.getElementById('playerArtwork');
+const playerArtworkIdle = document.getElementById('playerArtworkIdle');
+const playerTitle = document.getElementById('playerTitle');
+const playerArtist = document.getElementById('playerArtist');
+const playerBar = document.getElementById('playerBar');
+const playerBarBox = document.getElementById('playerBarBox');
+const playerPlayBtn = document.getElementById('playerPlayBtn');
+const playerPauseBtn = document.getElementById('playerPauseBtn');
+const playerSkipBtn = document.getElementById('playerSkipBtn');
let currentPlayingItem = null;
function togglePlayer() {
- $(player).toast("show");
+ $(player).toast('show');
}
-function playerSetIdle(){
- playerArtwork.style.display ='none';
- playerArtworkIdle.style.display ='block';
- playerTitle.textContent = '-- IDLE --';
- playerArtist.textContent = '';
- setProgressBar(playerBar, 0);
+function playerSetIdle() {
+ playerArtwork.style.display ='none';
+ playerArtworkIdle.style.display ='block';
+ playerTitle.textContent = '-- IDLE --';
+ playerArtist.textContent = '';
+ setProgressBar(playerBar, 0);
}
-function updatePlayerInfo(item){
- if (!item){
- playerSetIdle();
- }
- playerArtwork.style.display ='block';
- playerArtworkIdle.style.display ='none';
- currentPlayingItem = item;
- playerTitle.textContent = item.title;
- playerArtist.textContent = item.artist;
- playerArtwork.setAttribute("src", item.thumbnail);
+function updatePlayerInfo(item) {
+ if (!item) {
+ playerSetIdle();
+ }
+ playerArtwork.style.display ='block';
+ playerArtworkIdle.style.display ='none';
+ currentPlayingItem = item;
+ playerTitle.textContent = item.title;
+ playerArtist.textContent = item.artist;
+ playerArtwork.setAttribute('src', item.thumbnail);
- if (isOverflown(playerTitle)) {
- playerTitle.classList.add("scrolling")
- } else {
- playerTitle.classList.remove("scrolling")
- }
+ if (isOverflown(playerTitle)) {
+ playerTitle.classList.add('scrolling');
+ } else {
+ playerTitle.classList.remove('scrolling');
+ }
- if (isOverflown(playerArtist)) {
- playerArtist.classList.add("scrolling")
- } else {
- playerArtist.classList.remove("scrolling")
- }
+ if (isOverflown(playerArtist)) {
+ playerArtist.classList.add('scrolling');
+ } else {
+ playerArtist.classList.remove('scrolling');
+ }
}
function updatePlayerControls(play, empty) {
- if (empty) {
- playerSetIdle();
- playerPlayBtn.setAttribute("disabled", "");
- playerPauseBtn.setAttribute("disabled", "");
- playerSkipBtn.setAttribute("disabled", "");
- } else {
- playerPlayBtn.removeAttribute("disabled");
- playerPauseBtn.removeAttribute("disabled");
- playerSkipBtn.removeAttribute("disabled");
- }
- if (play) {
- playerPlayBtn.style.display ='none';
- playerPauseBtn.style.display = 'block';
- } else {
- playerPlayBtn.style.display = 'block';
- playerPauseBtn.style.display = 'none';
- }
+ if (empty) {
+ playerSetIdle();
+ playerPlayBtn.setAttribute('disabled', '');
+ playerPauseBtn.setAttribute('disabled', '');
+ playerSkipBtn.setAttribute('disabled', '');
+ } else {
+ playerPlayBtn.removeAttribute('disabled');
+ playerPauseBtn.removeAttribute('disabled');
+ playerSkipBtn.removeAttribute('disabled');
+ }
+ if (play) {
+ playerPlayBtn.style.display ='none';
+ playerPauseBtn.style.display = 'block';
+ } else {
+ playerPlayBtn.style.display = 'block';
+ playerPauseBtn.style.display = 'none';
+ }
}
let playhead_timer;
let player_playhead_position;
let playhead_dragging = false;
-function updatePlayerPlayhead(playhead){
- if (!currentPlayingItem || playhead_dragging){
- return;
- }
- if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead){
- playerBar.classList.remove("progress-bar-animated");
- clearInterval(playhead_timer);
- player_playhead_position = playhead;
+function updatePlayerPlayhead(playhead) {
+ if (!currentPlayingItem || playhead_dragging) {
+ return;
+ }
+ if (currentPlayingItem.duration !== 0 || currentPlayingItem.duration < playhead) {
+ playerBar.classList.remove('progress-bar-animated');
+ clearInterval(playhead_timer);
+ player_playhead_position = playhead;
+ setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));
+ if (playing) {
+ playhead_timer = setInterval(function() {
+ player_playhead_position += 0.1;
setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));
- if (playing) {
- playhead_timer = setInterval(function () {
- player_playhead_position += 0.1;
- setProgressBar(playerBar, player_playhead_position / currentPlayingItem.duration, secondsToStr(player_playhead_position));
- }, 100); // delay in milliseconds
- }
+ }, 100); // delay in milliseconds
+ }
+ } else {
+ if (playing) {
+ playerBar.classList.add('progress-bar-animated');
} else {
- if (playing) {
- playerBar.classList.add("progress-bar-animated");
- } else {
- playerBar.classList.remove("progress-bar-animated");
- }
- setProgressBar(playerBar, 1);
+ playerBar.classList.remove('progress-bar-animated');
}
+ setProgressBar(playerBar, 1);
+ }
}
-playerBarBox.addEventListener('mousedown', function () {
- if (currentPlayingItem && currentPlayingItem.duration > 0){
- playerBarBox.addEventListener('mousemove', playheadDragged);
- clearInterval(playhead_timer);
- playhead_dragging = true;
- }
-});
-playerBarBox.addEventListener('mouseup', function (event) {
- playerBarBox.removeEventListener('mousemove', playheadDragged);
- let percent = event.offsetX / playerBarBox.clientWidth;
- request('post', {move_playhead: percent * currentPlayingItem.duration});
- playhead_dragging = false;
+playerBarBox.addEventListener('mousedown', function() {
+ if (currentPlayingItem && currentPlayingItem.duration > 0) {
+ playerBarBox.addEventListener('mousemove', playheadDragged);
+ clearInterval(playhead_timer);
+ playhead_dragging = true;
+ }
});
-function playheadDragged(event){
- let percent = event.offsetX / playerBarBox.clientWidth;
- setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration));
+playerBarBox.addEventListener('mouseup', function(event) {
+ playerBarBox.removeEventListener('mousemove', playheadDragged);
+ const percent = event.offsetX / playerBarBox.clientWidth;
+ request('post', {move_playhead: percent * currentPlayingItem.duration});
+ playhead_dragging = false;
+});
+
+function playheadDragged(event) {
+ const percent = event.offsetX / playerBarBox.clientWidth;
+ setProgressBar(playerBar, percent, secondsToStr(percent * currentPlayingItem.duration));
}
-
-// ---------------------
-// ------- Util -------
-// ---------------------
-
-function isOverflown(element) {
- return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
-}
-
-function setProgressBar(bar, progress, text="") {
- let prog_str = (progress*100).toString();
- bar.setAttribute("aria-valuenow", prog_str);
- bar.style.width = prog_str + "%";
- bar.textContent = text;
-}
-
-function secondsToStr(seconds) {
- seconds = Math.floor(seconds);
- let mins = Math.floor(seconds / 60);
- let secs = seconds % 60;
- return ("00" + mins).slice(-2) + ":" + ("00" + secs).slice(-2);
-}
+// -----------------------
+// ----- Application -----
+// -----------------------
updateResults();
-$(document).ready(updatePlaylist);
-// Check the version of playlist to see if update is needed.
-setInterval(checkForPlaylistUpdate, 3000);
+document.addEventListener('DOMContentLoaded', () => {
+ updatePlaylist();
+
+ // Check the version of playlist to see if update is needed.
+ setInterval(checkForPlaylistUpdate, 3000);
+});
diff --git a/web/src/js/theme.mjs b/web/src/js/theme.mjs
index 29943d7..f83f921 100644
--- a/web/src/js/theme.mjs
+++ b/web/src/js/theme.mjs
@@ -1,7 +1,6 @@
export default class {
/**
- * Internal state for dark theme activation.
- * @property {boolean}
+ * @property {boolean} #dark Interal state for dark theme activation.
* @private
*/
static #dark = false;
@@ -10,33 +9,34 @@ export default class {
* Inialize the theme class.
*/
static init() {
- // Check LocalStorage for dark theme selection
- if (localStorage.getItem('darkTheme') === 'true') {
- // Update page theme
- this.set(true);
- }
+ // Check LocalStorage for dark theme selection
+ if (localStorage.getItem('darkTheme') === 'true') {
+ // Update page theme
+ this.set(true);
+ }
}
/**
* Set page theme and update local storage variable.
+ *
* @param {boolean} dark Whether to activate dark theme.
*/
static set(dark = false) {
- // Swap CSS to selected theme
- document.getElementById('pagestyle')
- .setAttribute('href', 'static/css/' + (dark ? 'dark' : 'main') + '.css');
+ // Swap CSS to selected theme
+ document.getElementById('pagestyle')
+ .setAttribute('href', 'static/css/' + (dark ? 'dark' : 'main') + '.css');
- // Update local storage
- localStorage.setItem('darkTheme', dark);
+ // Update local storage
+ localStorage.setItem('darkTheme', dark);
- // Update internal state
- this.#dark = dark;
+ // Update internal state
+ this.#dark = dark;
}
/**
* Swap page theme.
*/
static swap() {
- this.set(!this.#dark);
+ this.set(!this.#dark);
}
-}
\ No newline at end of file
+}
diff --git a/web/src/js/util.js b/web/src/js/util.js
new file mode 100644
index 0000000..86290ea
--- /dev/null
+++ b/web/src/js/util.js
@@ -0,0 +1,17 @@
+export function isOverflown(element) {
+ return element.scrollHeight > element.clientHeight || element.scrollWidth > element.clientWidth;
+}
+
+export function setProgressBar(bar, progress, text='') {
+ const progStr = (progress*100).toString();
+ bar.setAttribute('aria-valuenow', progStr);
+ bar.style.width = progStr + '%';
+ bar.textContent = text;
+}
+
+export function secondsToStr(seconds) {
+ seconds = Math.floor(seconds);
+ const mins = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+ return ('00' + mins).slice(-2) + ':' + ('00' + secs).slice(-2);
+}
diff --git a/web/src/templates/index.html b/web/src/templates/index.html
index 3a92afe..7461188 100644
--- a/web/src/templates/index.html
+++ b/web/src/templates/index.html
@@ -94,8 +94,7 @@
- See item on the playlist.
-
+ See item on the playlist.
|
@@ -394,7 +393,7 @@
-