=0))break;0===o?R(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?R(e,"repeat of an indentation width identifier"):(p=t+o-1,u=!0)}if(k(s)){do{s=e.input.charCodeAt(++e.position)}while(k(s));if(35===s)do{s=e.input.charCodeAt(++e.position)}while(!w(s)&&0!==s)}for(;0!==s;){for(F(e),e.lineIndent=0,s=e.input.charCodeAt(e.position);(!u||e.lineIndentp&&(p=e.lineIndent),w(s))m++;else{if(e.lineIndent
0){for(i=s,o=0;i>0;i--)(s=O(a=e.input.charCodeAt(++e.position)))>=0?o=(o<<4)+s:R(e,"expected hexadecimal character");e.result+=A(o),e.position++}else R(e,"unknown escape sequence");n=r=e.position}else w(a)?(L(e,n,r,!0),U(e,z(e,!1,t)),n=r=e.position):e.position===e.lineStart&&B(e)?R(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}R(e,"unexpected end of the stream within a double quoted scalar")}(e,_)?N=!0:function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!S(r)&&!E(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&R(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),a.call(e.anchorMap,n)||R(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],z(e,!0,-1),!0}(e)?(N=!0,null===e.tag&&null===e.anchor||R(e,"alias node should not have any properties")):function(e,t,n){var r,i,o,s,a,l,c,u,p=e.kind,d=e.result;if(S(u=e.input.charCodeAt(e.position))||E(u)||35===u||38===u||42===u||33===u||124===u||62===u||39===u||34===u||37===u||64===u||96===u)return!1;if((63===u||45===u)&&(S(r=e.input.charCodeAt(e.position+1))||n&&E(r)))return!1;for(e.kind="scalar",e.result="",i=o=e.position,s=!1;0!==u;){if(58===u){if(S(r=e.input.charCodeAt(e.position+1))||n&&E(r))break}else if(35===u){if(S(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&B(e)||n&&E(u))break;if(w(u)){if(a=e.line,l=e.lineStart,c=e.lineIndent,z(e,!1,-1),e.lineIndent>=t){s=!0,u=e.input.charCodeAt(e.position);continue}e.position=o,e.line=a,e.lineStart=l,e.lineIndent=c;break}}s&&(L(e,i,o,!1),U(e,e.line-a),i=o=e.position,s=!1),k(u)||(o=e.position+1),u=e.input.charCodeAt(++e.position)}return L(e,i,o,!1),!!e.result||(e.kind=p,e.result=d,!1)}(e,_,l===n)&&(N=!0,null===e.tag&&(e.tag="?")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===T&&(N=g&&q(e,P))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&R(e,'unacceptable node kind for !> tag; it should be "scalar", not "'+e.kind+'"'),y=0,b=e.implicitTypes.length;y"),null!==e.result&&x.kind!==e.kind&&R(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+x.kind+'", not "'+e.kind+'"'),x.resolve(e.result,e.tag)?(e.result=x.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):R(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||N}function Y(e){var t,n,r,i,o=e.position,s=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(i=e.input.charCodeAt(e.position))&&(z(e,!0,-1),i=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==i));){for(s=!0,i=e.input.charCodeAt(++e.position),t=e.position;0!==i&&!S(i);)i=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&R(e,"directive name must not be less than one character in length");0!==i;){for(;k(i);)i=e.input.charCodeAt(++e.position);if(35===i){do{i=e.input.charCodeAt(++e.position)}while(0!==i&&!w(i));break}if(w(i))break;for(t=e.position;0!==i&&!S(i);)i=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==i&&F(e),a.call($,n)?$[n](e,n,r):N(e,'unknown document directive "'+n+'"')}z(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,z(e,!0,-1)):s&&R(e,"directives end mark is expected"),H(e,e.lineIndent-1,p,!1,!0),z(e,!0,-1),e.checkLineBreaks&&g.test(e.input.slice(o,e.position))&&N(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&B(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,z(e,!0,-1)):e.positiona&&(t=r-a+(o=" ... ").length),n-r>a&&(n=r+a-(s=" ...").length),{str:o+e.slice(t,n).replace(/\t/g,"→")+s,pos:r-t+o.length}}function o(e,t){return r.repeat(" ",t-e.length)+e}e.exports=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,s=/\r?\n|\r|\0/g,a=[0],l=[],c=-1;n=s.exec(e.buffer);)l.push(n.index),a.push(n.index+n[0].length),e.position<=n.index&&c<0&&(c=a.length-2);c<0&&(c=a.length-1);var u,p,d="",f=Math.min(e.line+t.linesAfter,l.length).toString().length,h=t.maxLength-(t.indent+f+3);for(u=1;u<=t.linesBefore&&!(c-u<0);u++)p=i(e.buffer,a[c-u],l[c-u],e.position-(a[c]-a[c-u]),h),d=r.repeat(" ",t.indent)+o((e.line-u+1).toString(),f)+" | "+p.str+"\n"+d;for(p=i(e.buffer,a[c],l[c],e.position,h),d+=r.repeat(" ",t.indent)+o((e.line+1).toString(),f)+" | "+p.str+"\n",d+=r.repeat("-",t.indent+f+3+p.pos)+"^\n",u=1;u<=t.linesAfter&&!(c+u>=l.length);u++)p=i(e.buffer,a[c+u],l[c+u],e.position-(a[c]-a[c+u]),h),d+=r.repeat(" ",t.indent)+o((e.line+u+1).toString(),f)+" | "+p.str+"\n";return d.replace(/\n$/,"")}},5388:function(e,t,n){"use strict";var r=n(1231),i=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],o=["scalar","sequence","mapping"];e.exports=function(e,t){var n,s;if(t=t||{},Object.keys(t).forEach((function(t){if(-1===i.indexOf(t))throw new r('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=(n=t.styleAliases||null,s={},null!==n&&Object.keys(n).forEach((function(e){n[e].forEach((function(t){s[String(t)]=e}))})),s),-1===o.indexOf(this.kind))throw new r('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}},9342:function(e,t,n){"use strict";var r=n(5388),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";e.exports=new r("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,s=i;for(n=0;n64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\r\n=]/g,""),o=r.length,s=i,a=0,l=[];for(t=0;t>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|s.indexOf(r.charAt(t));return 0==(n=o%4*6)?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===n?(l.push(a>>10&255),l.push(a>>2&255)):12===n&&l.push(a>>4&255),new Uint8Array(l)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r="",o=0,s=e.length,a=i;for(t=0;t>18&63],r+=a[o>>12&63],r+=a[o>>6&63],r+=a[63&o]),o=(o<<8)+e[t];return 0==(n=s%3)?(r+=a[o>>18&63],r+=a[o>>12&63],r+=a[o>>6&63],r+=a[63&o]):2===n?(r+=a[o>>10&63],r+=a[o>>4&63],r+=a[o<<2&63],r+=a[64]):1===n&&(r+=a[o>>2&63],r+=a[o<<4&63],r+=a[64],r+=a[64]),r}})},6199:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:bool",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)},construct:function(e){return"true"===e||"True"===e||"TRUE"===e},predicate:function(e){return"[object Boolean]"===Object.prototype.toString.call(e)},represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},1461:function(e,t,n){"use strict";var r=n(8433),i=n(5388),o=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),s=/^[-+]?[0-9]+e/;e.exports=new i("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!o.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||r.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(r.isNegativeZero(e))return"-0.0";return n=e.toString(10),s.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"})},4466:function(e,t,n){"use strict";var r=n(8433),i=n(5388);function o(e){return 48<=e&&e<=55}function s(e){return 48<=e&&e<=57}e.exports=new i("tag:yaml.org,2002:int",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=e.length,i=0,a=!1;if(!r)return!1;if("-"!==(t=e[i])&&"+"!==t||(t=e[++i]),"0"===t){if(i+1===r)return!0;if("b"===(t=e[++i])){for(i++;i=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},2369:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},1851:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}})},9198:function(e,t,n){"use strict";var r=n(5388);e.exports=new r("tag:yaml.org,2002:null",{kind:"scalar",resolve:function(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)},construct:function(){return null},predicate:function(e){return null===e},represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"},empty:function(){return""}},defaultStyle:"lowercase"})},6946:function(e,t,n){"use strict";var r=n(5388),i=Object.prototype.hasOwnProperty,o=Object.prototype.toString;e.exports=new r("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,r,s,a,l=[],c=e;for(t=0,n=c.length;tc))return!1;var p=a.get(e);if(p&&a.get(t))return p==t;var d=-1,f=!0,h=n&o?new Ae:void 0;for(a.set(e,t),a.set(t,e);++d-1},Oe.prototype.set=function(e,t){var n=this.__data__,r=je(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this},_e.prototype.clear=function(){this.size=0,this.__data__={hash:new Ee,map:new(de||Oe),string:new Ee}},_e.prototype.delete=function(e){var t=$e(this,e).delete(e);return this.size-=t?1:0,t},_e.prototype.get=function(e){return $e(this,e).get(e)},_e.prototype.has=function(e){return $e(this,e).has(e)},_e.prototype.set=function(e,t){var n=$e(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this},Ae.prototype.add=Ae.prototype.push=function(e){return this.__data__.set(e,r),this},Ae.prototype.has=function(e){return this.__data__.has(e)},Ce.prototype.clear=function(){this.__data__=new Oe,this.size=0},Ce.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},Ce.prototype.get=function(e){return this.__data__.get(e)},Ce.prototype.has=function(e){return this.__data__.has(e)},Ce.prototype.set=function(e,t){var n=this.__data__;if(n instanceof Oe){var r=n.__data__;if(!de||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new _e(r)}return n.set(e,t),this.size=n.size,this};var De=le?function(e){return null==e?[]:(e=Object(e),function(t){for(var n=-1,r=null==t?0:t.length,i=0,o=[];++n-1&&e%1==0&&e-1&&e%1==0&&e<=s}function Ye(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function Ge(e){return null!=e&&"object"==typeof e}var Qe=F?function(e){return function(t){return e(t)}}(F):function(e){return Ge(e)&&He(e.length)&&!!P[Pe(e)]};function Xe(e){return null!=(t=e)&&He(t.length)&&!We(t)?function(e,t){var n=qe(e),r=!n&&Ue(e),i=!n&&!r&&Ve(e),o=!n&&!r&&!i&&Qe(e),s=n||r||i||o,a=s?function(e,t){for(var n=-1,r=Array(e);++n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,s=function s(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",s),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",s),o=setTimeout(s,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},s=t.querySelectorAll("iframe"),a=s.length,l=0;s=Array.prototype.slice.call(s);var c=function(){--a<=0&&o(l)};a||c(),s.forEach((function(t){e.matches(t,i.exclude)?c():i.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach((function(e,t){e.val===n&&(i=t,o=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach((function(e){e.handled||i.getIframeContents(e.val,(function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o=this,s=this.createIterator(t,e,r),a=[],l=[],c=void 0,u=void 0;p=void 0,p=o.getIteratorNode(s),u=p.prevNode,c=p.node;)this.iframes&&this.forEachIframe(t,(function(e){return o.checkIframeFilter(c,u,e,a)}),(function(t){o.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);var p;l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(a,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),s=o.length;s||i(),o.forEach((function(o){var a=function(){r.iterateThroughNodes(e,o,t,n,(function(){--s<=0&&i()}))};r.iframes?r.waitForIframes(o,a):a()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every((function(t){return!r.call(e,t)||(i=!0,!1)})),i}return!1}}]),e}(),o=function(){function o(e){t(this,o),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(o,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==s&&""!==a&&(e=e.replace(new RegExp("("+this.escapeStr(s)+"|"+this.escapeStr(a)+")","gm"+n),r+"("+this.processSynomyms(s)+"|"+this.processSynomyms(a)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":""}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":""}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach((function(i){n.every((function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="string"==typeof n?[]:n.limiters,o="";switch(i.forEach((function(e){o+="|"+t.escapeStr(e)})),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(o="\\s"+(o||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+o+"]*)";case"exactly":return"(^|\\s"+o+")("+e+")(?=$|\\s"+o+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,s=i.end;i.valid&&(e.start=o,e.length=s-o,n.push(e),r=s)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,s=t-o,a=parseInt(e.start,10)-s;return(r=(a=a>o?o:a)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),a<0||r-a<0||a>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(a,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:a,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),s=document.createElement(r);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=i.textContent,i.parentNode.replaceChild(s,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every((function(s,a){var l=e.nodes[a+1];if(void 0===l||l.start>t){if(!r(s.node))return!1;var c=t-s.start,u=(n>s.end?s.end:n)-s.start,p=e.value.substr(0,s.start),d=e.value.substr(u+s.start);if(s.node=o.wrapRangeInTextNode(s.node,c,u),e.value=p+d,e.nodes.forEach((function(t,n){n>=a&&(e.nodes[n].start>0&&n!==a&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,i(s.node.previousSibling,s.start),!(n>s.end))return!1;t=s.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,s=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[s];)if(n(i[s],t)){var a=i.index;if(0!==s)for(var l=1;l1&&console.warn("Replacing with",t),m++}}else{let i=u(l(t,e[n]));if(s.verbose>1&&console.warn((!1===i?f.colour.red:f.colour.green)+"Fragment resolution",e[n],f.colour.normal),!1===i){if(r.parent[r.pkey]={},s.fatal){let t=new Error("Fragment $ref resolution failed "+e[n]);if(!s.promise)throw t;s.promise.reject(t)}}else m++,r.parent[r.pkey]=i,h[e[n]]=r.path.replace("/%24ref","")}else if(p.protocol){let t=o.resolve(i,e[n]).toString();s.verbose>1&&console.warn(f.colour.yellow+"Rewriting external url ref",e[n],"as",t,f.colour.normal),e["x-miro"]=e[n],s.externalRefs[e[n]]&&(s.externalRefs[t]||(s.externalRefs[t]=s.externalRefs[e[n]]),s.externalRefs[t].failed=s.externalRefs[e[n]].failed),e[n]=t}else if(!e["x-miro"]){let t=o.resolve(i,e[n]).toString(),r=!1;s.externalRefs[e[n]]&&(r=s.externalRefs[e[n]].failed),r||(s.verbose>1&&console.warn(f.colour.yellow+"Rewriting external ref",e[n],"as",t,f.colour.normal),e["x-miro"]=e[n],e[n]=t)}}));return c(e,{},(function(e,t,n){d(e,t)&&void 0!==e.$fixed&&delete e.$fixed})),s.verbose>1&&console.warn("Finished fragment resolution"),e}function m(e,t){if(!t.filters||!t.filters.length)return e;for(let n of t.filters)e=n(e,t);return e}function g(e,t,n,s){var c=o.parse(n.source),p=n.source.split("\\").join("/").split("/");p.pop()||p.pop();let d="",f=t.split("#");f.length>1&&(d="#"+f[1],t=f[0]),p=p.join("/");let g=(y=o.parse(t).protocol,b=c.protocol,y&&y.length>2?y:b&&b.length>2?b:"file:");var y,b;let v;if(v="file:"===g?i.resolve(p?p+"/":"",t):o.resolve(p?p+"/":"",t),n.cache[v]){n.verbose&&console.warn("CACHED",v,d);let e=u(n.cache[v]),r=n.externalRef=e;if(d&&(r=l(r,d),!1===r&&(r={},n.fatal))){let e=new Error("Cached $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}return r=h(r,e,t,d,v,n),r=m(r,n),s(u(r),v,n),Promise.resolve(r)}if(n.verbose&&console.warn("GET",v,d),n.handlers&&n.handlers[g])return n.handlers[g](p,t,d,n).then((function(e){return n.externalRef=e,e=m(e,n),n.cache[v]=e,s(e,v,n),e})).catch((function(e){throw n.verbose&&console.warn(e),e}));if(g&&g.startsWith("http")){const e=Object.assign({},n.fetchOptions,{agent:n.agent});return n.fetch(v,e).then((function(e){if(200!==e.status){if(n.ignoreIOErrors)return n.verbose&&console.warn("FAILED",t),n.externalRefs[t].failed=!0,'{"$ref":"'+t+'"}';throw new Error(`Received status code ${e.status}: ${v}`)}return e.text()})).then((function(e){try{let r=a.parse(e,{schema:"core",prettyErrors:!0});if(e=n.externalRef=r,n.cache[v]=u(e),d&&!1===(e=l(e,d))&&(e={},n.fatal)){let e=new Error("Remote $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}e=m(e=h(e,r,t,d,v,n),n)}catch(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}return s(e,v,n),e})).catch((function(e){if(n.verbose&&console.warn(e),n.cache[v]={},!n.promise||!n.fatal)throw e;n.promise.reject(e)}))}{const e='{"$ref":"'+t+'"}';return function(e,t,n,i,o){return new Promise((function(s,a){r.readFile(e,t,(function(e,t){e?n.ignoreIOErrors&&o?(n.verbose&&console.warn("FAILED",i),n.externalRefs[i].failed=!0,s(o)):a(e):s(t)}))}))}(v,n.encoding||"utf8",n,t,e).then((function(e){try{let r=a.parse(e,{schema:"core",prettyErrors:!0});if(e=n.externalRef=r,n.cache[v]=u(e),d&&!1===(e=l(e,d))&&(e={},n.fatal)){let e=new Error("File $ref resolution failed "+v+d);if(!n.promise)throw e;n.promise.reject(e)}e=m(e=h(e,r,t,d,v,n),n)}catch(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}return s(e,v,n),e})).catch((function(e){if(n.verbose&&console.warn(e),!n.promise||!n.fatal)throw e;n.promise.reject(e)}))}}function y(e){return new Promise((function(t,n){(function(e){return new Promise((function(t,n){function r(t,n,r){if(t[n]&&d(t[n],"$ref")){let o=t[n].$ref;if(!o.startsWith("#")){let s="";if(!i[o]){let t=Object.keys(i).find((function(e,t,n){return o.startsWith(e+"/")}));t&&(e.verbose&&console.warn("Found potential subschema at",t),s="/"+(o.split("#")[1]||"").replace(t.split("#")[1]||""),s=s.split("/undefined").join(""),o=t)}if(i[o]||(i[o]={resolved:!1,paths:[],extras:{},description:t[n].description}),i[o].resolved)if(i[o].failed);else if(e.rewriteRefs){let r=i[o].resolvedAt;e.verbose>1&&console.warn("Rewriting ref",o,r),t[n]["x-miro"]=o,t[n].$ref=r+s}else t[n]=u(i[o].data);else i[o].paths.push(r.path),i[o].extras[r.path]=s}}}let i=e.externalRefs;if(e.resolver.depth>0&&e.source===e.resolver.base)return t(i);c(e.openapi.definitions,{identityDetection:!0,path:"#/definitions"},r),c(e.openapi.components,{identityDetection:!0,path:"#/components"},r),c(e.openapi,{identityDetection:!0},r),t(i)}))})(e).then((function(t){for(let n in t)if(!t[n].resolved){let r=e.resolver.depth;r>0&&r++,e.resolver.actions[r].push((function(){return g(e.openapi,n,e,(function(e,r,i){if(!t[n].resolved){let o={};o.context=t[n],o.$ref=n,o.original=u(e),o.updated=e,o.source=r,i.externals.push(o),t[n].resolved=!0}let o=Object.assign({},i,{source:"",resolver:{actions:i.resolver.actions,depth:i.resolver.actions.length-1,base:i.resolver.base}});i.patch&&t[n].description&&!e.description&&"object"==typeof e&&(e.description=t[n].description),t[n].data=e;let s=(a=t[n].paths,[...new Set(a)]);var a;s=s.sort((function(e,t){const n=e.startsWith("#/components/")||e.startsWith("#/definitions/"),r=t.startsWith("#/components/")||t.startsWith("#/definitions/");return n&&!r?-1:r&&!n?1:0}));for(let r of s)if(t[n].resolvedAt&&r!==t[n].resolvedAt&&r.indexOf("x-ms-examples/")<0)i.verbose>1&&console.warn("Creating pointer to data at",r),l(i.openapi,r,{$ref:t[n].resolvedAt+t[n].extras[r],"x-miro":n+t[n].extras[r]});else{t[n].resolvedAt?i.verbose>1&&console.warn("Avoiding circular reference"):(t[n].resolvedAt=r,i.verbose>1&&console.warn("Creating initial clone of data at",r));let o=u(e);l(i.openapi,r,o)}0===i.resolver.actions[o.resolver.depth].length&&i.resolver.actions[o.resolver.depth].push((function(){return y(o)}))}))}))}})).catch((function(t){e.verbose&&console.warn(t),n(t)}));let r={options:e};r.actions=e.resolver.actions[e.resolver.depth],t(r)}))}function b(e,t,n){e.resolver.actions.push([]),y(e).then((function(r){var i;(i=r.actions,i.reduce(((e,t)=>e.then((e=>t().then(Array.prototype.concat.bind(e))))),Promise.resolve([]))).then((function(){if(e.resolver.depth>=e.resolver.actions.length)return console.warn("Ran off the end of resolver actions"),t(!0);e.resolver.depth++,e.resolver.actions[e.resolver.depth].length?setTimeout((function(){b(r.options,t,n)}),0):(e.verbose>1&&console.warn(f.colour.yellow+"Finished external resolution!",f.colour.normal),e.resolveInternal&&(e.verbose>1&&console.warn(f.colour.yellow+"Starting internal resolution!",f.colour.normal),e.openapi=p(e.openapi,e.original,{verbose:e.verbose-1}),e.verbose>1&&console.warn(f.colour.yellow+"Finished internal resolution!",f.colour.normal)),c(e.openapi,{},(function(t,n,r){d(t,n)&&(e.preserveMiro||delete t["x-miro"])})),t(e))})).catch((function(t){e.verbose&&console.warn(t),n(t)}))})).catch((function(t){e.verbose&&console.warn(t),n(t)}))}function v(e){if(e.cache||(e.cache={}),e.fetch||(e.fetch=s),e.source){let t=o.parse(e.source);(!t.protocol||t.protocol.length<=2)&&(e.source=i.resolve(e.source))}e.externals=[],e.externalRefs={},e.rewriteRefs=!0,e.resolver={},e.resolver.depth=0,e.resolver.base=e.source,e.resolver.actions=[[]]}e.exports={optionalResolve:function(e){return v(e),new Promise((function(t,n){e.resolve?b(e,t,n):t(e)}))},resolve:function(e,t,n){return n||(n={}),n.openapi=e,n.source=t,n.resolve=!0,v(n),new Promise((function(e,t){b(n,e,t)}))}}},1319:function(e){"use strict";function t(){return{depth:0,seen:new WeakMap,top:!0,combine:!1,allowRefSiblings:!1}}e.exports={getDefaultState:t,walkSchema:function e(n,r,i,o){if(void 0===i.depth&&(i=t()),null==n)return n;if(void 0!==n.$ref){let e={$ref:n.$ref};return i.allowRefSiblings&&n.description&&(e.description=n.description),o(e,r,i),e}if(i.combine&&(n.allOf&&Array.isArray(n.allOf)&&1===n.allOf.length&&delete(n=Object.assign({},n.allOf[0],n)).allOf,n.anyOf&&Array.isArray(n.anyOf)&&1===n.anyOf.length&&delete(n=Object.assign({},n.anyOf[0],n)).anyOf,n.oneOf&&Array.isArray(n.oneOf)&&1===n.oneOf.length&&delete(n=Object.assign({},n.oneOf[0],n)).oneOf),o(n,r,i),i.seen.has(n))return n;if("object"==typeof n&&null!==n&&i.seen.set(n,!0),i.top=!1,i.depth++,void 0!==n.items&&(i.property="items",e(n.items,n,i,o)),n.additionalItems&&"object"==typeof n.additionalItems&&(i.property="additionalItems",e(n.additionalItems,n,i,o)),n.additionalProperties&&"object"==typeof n.additionalProperties&&(i.property="additionalProperties",e(n.additionalProperties,n,i,o)),n.properties)for(let t in n.properties){let r=n.properties[t];i.property="properties/"+t,e(r,n,i,o)}if(n.patternProperties)for(let t in n.patternProperties){let r=n.patternProperties[t];i.property="patternProperties/"+t,e(r,n,i,o)}if(n.allOf)for(let t in n.allOf){let r=n.allOf[t];i.property="allOf/"+t,e(r,n,i,o)}if(n.anyOf)for(let t in n.anyOf){let r=n.anyOf[t];i.property="anyOf/"+t,e(r,n,i,o)}if(n.oneOf)for(let t in n.oneOf){let r=n.oneOf[t];i.property="oneOf/"+t,e(r,n,i,o)}return n.not&&(i.property="not",e(n.not,n,i,o)),i.depth--,n}}},7975:function(e){"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,o=-1,s=0,a=0;a<=e.length;++a){if(a2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),o=a,s=0;continue}}else if(2===r.length||1===r.length){r="",i=0,o=a,s=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(o+1,a):r=e.slice(o+1,a),i=a-o-1;o=a,s=0}else 46===n&&-1!==s?++s:s=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var s;o>=0?s=arguments[o]:(void 0===e&&(e=process.cwd()),s=e),t(s),0!==s.length&&(r=s+"/"+r,i=47===s.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;ic){if(47===n.charCodeAt(a+p))return n.slice(a+p+1);if(0===p)return n.slice(a+p)}else s>c&&(47===e.charCodeAt(i+p)?u=p:0===p&&(u=0));break}var d=e.charCodeAt(i+p);if(d!==n.charCodeAt(a+p))break;47===d&&(u=p)}var f="";for(p=i+u+1;p<=o;++p)p!==o&&47!==e.charCodeAt(p)||(0===f.length?f+="..":f+="/..");return f.length>0?f+n.slice(a+u):(a+=u,47===n.charCodeAt(a)&&++a,n.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,o=!0,s=e.length-1;s>=1;--s)if(47===(n=e.charCodeAt(s))){if(!o){i=s;break}}else o=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,o=-1,s=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var a=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!s){i=r+1;break}}else-1===l&&(s=!1,l=r+1),a>=0&&(c===n.charCodeAt(a)?-1==--a&&(o=r):(a=-1,o=l))}return i===o?o=l:-1===o&&(o=e.length),e.slice(i,o)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!s){i=r+1;break}}else-1===o&&(s=!1,o=r+1);return-1===o?"":e.slice(i,o)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,o=!0,s=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===i&&(o=!1,i=a+1),46===l?-1===n?n=a:1!==s&&(s=1):-1!==n&&(s=-1);else if(!o){r=a+1;break}}return-1===n||-1===i||0===s||1===s&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),o=47===i;o?(n.root="/",r=1):r=0;for(var s=-1,a=0,l=-1,c=!0,u=e.length-1,p=0;u>=r;--u)if(47!==(i=e.charCodeAt(u)))-1===l&&(c=!1,l=u+1),46===i?-1===s?s=u:1!==p&&(p=1):-1!==s&&(p=-1);else if(!c){a=u+1;break}return-1===s||-1===l||0===p||1===p&&s===l-1&&s===a+1?-1!==l&&(n.base=n.name=0===a&&o?e.slice(1,l):e.slice(a,l)):(0===a&&o?(n.name=e.slice(1,s),n.base=e.slice(1,l)):(n.name=e.slice(a,s),n.base=e.slice(a,l)),n.ext=e.slice(s,l)),a>0?n.dir=e.slice(0,a-1):o&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r},5127:function(e){e.exports=function(){var e=[],t=[],n={},r={},i={};function o(e){return"string"==typeof e?new RegExp("^"+e+"$","i"):e}function s(e,t){return e===t?t:e===e.toLowerCase()?t.toLowerCase():e===e.toUpperCase()?t.toUpperCase():e[0]===e[0].toUpperCase()?t.charAt(0).toUpperCase()+t.substr(1).toLowerCase():t.toLowerCase()}function a(e,t){return e.replace(t[0],(function(n,r){var i,o,a=(i=t[1],o=arguments,i.replace(/\$(\d{1,2})/g,(function(e,t){return o[t]||""})));return s(""===n?e[r-1]:n,a)}))}function l(e,t,r){if(!e.length||n.hasOwnProperty(e))return t;for(var i=r.length;i--;){var o=r[i];if(o[0].test(t))return a(t,o)}return t}function c(e,t,n){return function(r){var i=r.toLowerCase();return t.hasOwnProperty(i)?s(r,i):e.hasOwnProperty(i)?s(r,e[i]):l(i,r,n)}}function u(e,t,n,r){return function(r){var i=r.toLowerCase();return!!t.hasOwnProperty(i)||!e.hasOwnProperty(i)&&l(i,i,n)===i}}function p(e,t,n){return(n?t+" ":"")+(1===t?p.singular(e):p.plural(e))}return p.plural=c(i,r,e),p.isPlural=u(i,r,e),p.singular=c(r,i,t),p.isSingular=u(r,i,t),p.addPluralRule=function(t,n){e.push([o(t),n])},p.addSingularRule=function(e,n){t.push([o(e),n])},p.addUncountableRule=function(e){"string"!=typeof e?(p.addPluralRule(e,"$0"),p.addSingularRule(e,"$0")):n[e.toLowerCase()]=!0},p.addIrregularRule=function(e,t){t=t.toLowerCase(),e=e.toLowerCase(),i[e]=t,r[t]=e},[["I","we"],["me","us"],["he","they"],["she","they"],["them","them"],["myself","ourselves"],["yourself","yourselves"],["itself","themselves"],["herself","themselves"],["himself","themselves"],["themself","themselves"],["is","are"],["was","were"],["has","have"],["this","these"],["that","those"],["echo","echoes"],["dingo","dingoes"],["volcano","volcanoes"],["tornado","tornadoes"],["torpedo","torpedoes"],["genus","genera"],["viscus","viscera"],["stigma","stigmata"],["stoma","stomata"],["dogma","dogmata"],["lemma","lemmata"],["schema","schemata"],["anathema","anathemata"],["ox","oxen"],["axe","axes"],["die","dice"],["yes","yeses"],["foot","feet"],["eave","eaves"],["goose","geese"],["tooth","teeth"],["quiz","quizzes"],["human","humans"],["proof","proofs"],["carve","carves"],["valve","valves"],["looey","looies"],["thief","thieves"],["groove","grooves"],["pickaxe","pickaxes"],["passerby","passersby"]].forEach((function(e){return p.addIrregularRule(e[0],e[1])})),[[/s?$/i,"s"],[/[^\u0000-\u007F]$/i,"$0"],[/([^aeiou]ese)$/i,"$1"],[/(ax|test)is$/i,"$1es"],[/(alias|[^aou]us|t[lm]as|gas|ris)$/i,"$1es"],[/(e[mn]u)s?$/i,"$1s"],[/([^l]ias|[aeiou]las|[ejzr]as|[iu]am)$/i,"$1"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1i"],[/(alumn|alg|vertebr)(?:a|ae)$/i,"$1ae"],[/(seraph|cherub)(?:im)?$/i,"$1im"],[/(her|at|gr)o$/i,"$1oes"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i,"$1a"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i,"$1a"],[/sis$/i,"ses"],[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i,"$1$2ves"],[/([^aeiouy]|qu)y$/i,"$1ies"],[/([^ch][ieo][ln])ey$/i,"$1ies"],[/(x|ch|ss|sh|zz)$/i,"$1es"],[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i,"$1ices"],[/\b((?:tit)?m|l)(?:ice|ouse)$/i,"$1ice"],[/(pe)(?:rson|ople)$/i,"$1ople"],[/(child)(?:ren)?$/i,"$1ren"],[/eaux$/i,"$0"],[/m[ae]n$/i,"men"],["thou","you"]].forEach((function(e){return p.addPluralRule(e[0],e[1])})),[[/s$/i,""],[/(ss)$/i,"$1"],[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i,"$1fe"],[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i,"$1f"],[/ies$/i,"y"],[/\b([pl]|zomb|(?:neck|cross)?t|coll|faer|food|gen|goon|group|lass|talk|goal|cut)ies$/i,"$1ie"],[/\b(mon|smil)ies$/i,"$1ey"],[/\b((?:tit)?m|l)ice$/i,"$1ouse"],[/(seraph|cherub)im$/i,"$1"],[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|t[lm]as|gas|(?:her|at|gr)o|[aeiou]ris)(?:es)?$/i,"$1"],[/(analy|diagno|parenthe|progno|synop|the|empha|cri|ne)(?:sis|ses)$/i,"$1sis"],[/(movie|twelve|abuse|e[mn]u)s$/i,"$1"],[/(test)(?:is|es)$/i,"$1is"],[/(alumn|syllab|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i,"$1us"],[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i,"$1um"],[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i,"$1on"],[/(alumn|alg|vertebr)ae$/i,"$1a"],[/(cod|mur|sil|vert|ind)ices$/i,"$1ex"],[/(matr|append)ices$/i,"$1ix"],[/(pe)(rson|ople)$/i,"$1rson"],[/(child)ren$/i,"$1"],[/(eau)x?$/i,"$1"],[/men$/i,"man"]].forEach((function(e){return p.addSingularRule(e[0],e[1])})),["adulthood","advice","agenda","aid","aircraft","alcohol","ammo","analytics","anime","athletics","audio","bison","blood","bream","buffalo","butter","carp","cash","chassis","chess","clothing","cod","commerce","cooperation","corps","debris","diabetes","digestion","elk","energy","equipment","excretion","expertise","firmware","flounder","fun","gallows","garbage","graffiti","hardware","headquarters","health","herpes","highjinks","homework","housework","information","jeans","justice","kudos","labour","literature","machinery","mackerel","mail","media","mews","moose","music","mud","manga","news","only","personnel","pike","plankton","pliers","police","pollution","premises","rain","research","rice","salmon","scissors","series","sewage","shambles","shrimp","software","species","staff","swine","tennis","traffic","transportation","trout","tuna","wealth","welfare","whiting","wildebeest","wildlife","you",/pok[eé]mon$/i,/[^aeiou]ese$/i,/deer$/i,/fish$/i,/measles$/i,/o[iu]s$/i,/pox$/i,/sheep$/i].forEach(p.addUncountableRule),p}()},7022:function(){!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var i=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,s=0;s>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),Prism.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},Prism.languages.c.string],char:Prism.languages.c.char,comment:Prism.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:Prism.languages.c}}}}),Prism.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete Prism.languages.c.boolean},5624:function(){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},4511:function(){!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(Prism)},2415:function(){!function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(Prism)},5651:function(){!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var i="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",s="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",a="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function l(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var c=l(o),u=RegExp(l(i+" "+o+" "+s+" "+a)),p=l(o+" "+s+" "+a),d=l(i+" "+o+" "+a),f=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),h=r(/\((?:[^()]|<>)*\)/.source,2),m=/@?\b[A-Za-z_]\w*\b/.source,g=t(/<<0>>(?:\s*<<1>>)?/.source,[m,f]),y=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[p,g]),b=/\[\s*(?:,\s*)*\]/.source,v=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[y,b]),x=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[f,h,b]),w=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[x]),k=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[w,y,b]),S={keyword:u,punctuation:/[<>()?,.:[\]]/},E=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,O=/"(?:\\.|[^\\"\r\n])*"/.source,_=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[O]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[m,k]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[m]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[c,g]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[m]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[v]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,d,m]),inside:S}],keyword:u,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[m]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[m]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[h]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,y]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[m,f]),inside:{function:n(/^<<0>>/.source,[m]),generic:{pattern:RegExp(f),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[c,g,m,k,u.source,h,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[g,h]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:u,"class-name":{pattern:RegExp(k),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var A=O+"|"+E,C=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[A]),j=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[C]),2),P=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,T=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[y,j]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[P,T]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[P]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[j]),inside:e.languages.csharp},"class-name":{pattern:RegExp(y),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var I=/:[^}\r\n]+/.source,R=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[C]),2),N=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[R,I]),$=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[A]),2),L=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[$,I]);function D(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,I]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[N]),lookbehind:!0,greedy:!0,inside:D(N,R)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[L]),lookbehind:!0,greedy:!0,inside:D(L,$)}],char:{pattern:RegExp(E),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},2630:function(){Prism.languages.csv={value:/[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,punctuation:/,/}},6378:function(){Prism.languages.go=Prism.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),Prism.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete Prism.languages.go["class-name"]},4784:function(){!function(e){function t(e){return RegExp("(^(?:"+e+"):[ \t]*(?![ \t]))[^]+","i")}e.languages.http={"request-line":{pattern:/^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,inside:{method:{pattern:/^[A-Z]+\b/,alias:"property"},"request-target":{pattern:/^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,lookbehind:!0,alias:"url",inside:e.languages.uri},"http-version":{pattern:/^(\s)HTTP\/[\d.]+/,lookbehind:!0,alias:"property"}}},"response-status":{pattern:/^HTTP\/[\d.]+ \d+ .+/m,inside:{"http-version":{pattern:/^HTTP\/[\d.]+/,alias:"property"},"status-code":{pattern:/^(\s)\d+(?=\s)/,lookbehind:!0,alias:"number"},"reason-phrase":{pattern:/^(\s).+/,lookbehind:!0,alias:"string"}}},header:{pattern:/^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,inside:{"header-value":[{pattern:t(/Content-Security-Policy/.source),lookbehind:!0,alias:["csp","languages-csp"],inside:e.languages.csp},{pattern:t(/Public-Key-Pins(?:-Report-Only)?/.source),lookbehind:!0,alias:["hpkp","languages-hpkp"],inside:e.languages.hpkp},{pattern:t(/Strict-Transport-Security/.source),lookbehind:!0,alias:["hsts","languages-hsts"],inside:e.languages.hsts},{pattern:t(/[^:]+/.source),lookbehind:!0}],"header-name":{pattern:/^[^:]+/,alias:"keyword"},punctuation:/^:/}}};var n,r=e.languages,i={"application/javascript":r.javascript,"application/json":r.json||r.javascript,"application/xml":r.xml,"text/xml":r.xml,"text/html":r.html,"text/css":r.css,"text/plain":r.plain},o={"application/json":!0,"application/xml":!0};function s(e){var t=e.replace(/^[a-z]+\//,"");return"(?:"+e+"|\\w+/(?:[\\w.-]+\\+)+"+t+"(?![+\\w.-]))"}for(var a in i)if(i[a]){n=n||{};var l=o[a]?s(a):a;n[a.replace(/\//g,"-")]={pattern:RegExp("("+/content-type:\s*/.source+l+/(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source+")"+/[^ \t\w-][\s\S]*/.source,"i"),lookbehind:!0,inside:i[a]}}n&&e.languages.insertBefore("http","header",n)}(Prism)},6976:function(){!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(//g,(function(){return t.source}))),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},64:function(){Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},9700:function(){!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,i,o){if(n.language===r){var s=n.tokenStack=[];n.code=n.code.replace(i,(function(e){if("function"==typeof o&&!o(e))return e;for(var i,a=s.length;-1!==n.code.indexOf(i=t(r,a));)++a;return s[a]=e,i})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var i=0,o=Object.keys(n.tokenStack);!function s(a){for(var l=0;l=o.length);l++){var c=a[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[i],p=n.tokenStack[u],d="string"==typeof c?c:c.content,f=t(r,u),h=d.indexOf(f);if(h>-1){++i;var m=d.substring(0,h),g=new e.Token(r,e.tokenize(p,n.grammar),"language-"+r,p),y=d.substring(h+f.length),b=[];m&&b.push.apply(b,s([m])),b.push(g),y&&b.push.apply(b,s([y])),"string"==typeof c?a.splice.apply(a,[l,1].concat(b)):c.content=b}}else c.content&&s(c.content)}return a}(n.tokens)}}}})}(Prism)},4312:function(){Prism.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.languages.markup.doctype.inside["internal-subset"].inside=Prism.languages.markup,Prism.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:Prism.languages[t]};var i={};i[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},Prism.languages.insertBefore("markup","cdata",i)}}),Object.defineProperty(Prism.languages.markup.tag,"addAttribute",{value:function(e,t){Prism.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:Prism.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup,Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.ssml=Prism.languages.xml,Prism.languages.atom=Prism.languages.xml,Prism.languages.rss=Prism.languages.xml},596:function(){Prism.languages.objectivec=Prism.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete Prism.languages.objectivec["class-name"],Prism.languages.objc=Prism.languages.objectivec},2821:function(){!function(e){var t=/(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;e.languages.perl={comment:[{pattern:/(^\s*)=\w[\s\S]*?=cut.*/m,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0,greedy:!0}],string:[{pattern:RegExp(/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,t].join("|")+")"),greedy:!0},{pattern:/("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0},{pattern:/'(?:[^'\\\r\n]|\\.)*'/,greedy:!0}],regex:[{pattern:RegExp(/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,t].join("|")+")"+/[msixpodualngc]*/.source),greedy:!0},{pattern:RegExp(/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source+"(?:"+[/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,t+/\s*/.source+t].join("|")+")"+/[msixpodualngcer]*/.source),lookbehind:!0,greedy:!0},{pattern:/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,greedy:!0}],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*?>|\b_\b/,alias:"symbol"},"v-string":{pattern:/v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,alias:"string"},function:{pattern:/(\bsub[ \t]+)\w+/,lookbehind:!0},keyword:/\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,punctuation:/[{}[\];(),:]/}}(Prism)},3554:function(){!function(e){var t=/\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/,n=[{pattern:/\b(?:false|true)\b/i,alias:"boolean"},{pattern:/(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,greedy:!0,lookbehind:!0},{pattern:/(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,greedy:!0,lookbehind:!0},/\b(?:null)\b/i,/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/],r=/\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i,i=/=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/,o=/[{}\[\](),:;]/;e.languages.php={delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"},comment:t,variable:/\$+(?:\w+\b|(?=\{))/,package:{pattern:/(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,lookbehind:!0,inside:{punctuation:/\\/}},"class-name-definition":{pattern:/(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,lookbehind:!0,alias:"class-name"},"function-definition":{pattern:/(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,lookbehind:!0,alias:"function"},keyword:[{pattern:/(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,alias:"type-casting",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,alias:"type-declaration",greedy:!0},{pattern:/(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,alias:"type-declaration",greedy:!0,lookbehind:!0},{pattern:/\b(?:parent|self|static)(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(\byield\s+)from\b/i,lookbehind:!0},/\bclass\b/i,{pattern:/((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,lookbehind:!0}],"argument-name":{pattern:/([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,lookbehind:!0},"class-name":[{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/(\|\s*)\b[a-z_]\w*(?!\\)\b/i,greedy:!0,lookbehind:!0},{pattern:/\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,greedy:!0},{pattern:/(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,alias:"class-name-fully-qualified",greedy:!0,inside:{punctuation:/\\/}},{pattern:/(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:"class-name-fully-qualified",greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*\$)/i,alias:"type-declaration",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-declaration"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/\b[a-z_]\w*(?=\s*::)/i,alias:"static-context",greedy:!0},{pattern:/(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,alias:["class-name-fully-qualified","static-context"],greedy:!0,inside:{punctuation:/\\/}},{pattern:/([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,alias:"type-hint",greedy:!0,lookbehind:!0},{pattern:/([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,alias:["class-name-fully-qualified","type-hint"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}},{pattern:/(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,alias:"return-type",greedy:!0,lookbehind:!0},{pattern:/(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,alias:["class-name-fully-qualified","return-type"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,function:{pattern:/(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,lookbehind:!0,inside:{punctuation:/\\/}},property:{pattern:/(->\s*)\w+/,lookbehind:!0},number:r,operator:i,punctuation:o};var s={pattern:/\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,lookbehind:!0,inside:e.languages.php},a=[{pattern:/<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,alias:"nowdoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},{pattern:/<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:s}},{pattern:/`(?:\\[\s\S]|[^\\`])*`/,alias:"backtick-quoted-string",greedy:!0},{pattern:/'(?:\\[\s\S]|[^\\'])*'/,alias:"single-quoted-string",greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,alias:"double-quoted-string",greedy:!0,inside:{interpolation:s}}];e.languages.insertBefore("php","variable",{string:a,attribute:{pattern:/#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,greedy:!0,inside:{"attribute-content":{pattern:/^(#\[)[\s\S]+(?=\]$)/,lookbehind:!0,inside:{comment:t,string:a,"attribute-class-name":[{pattern:/([^:]|^)\b[a-z_]\w*(?!\\)\b/i,alias:"class-name",greedy:!0,lookbehind:!0},{pattern:/([^:]|^)(?:\\?\b[a-z_]\w*)+/i,alias:["class-name","class-name-fully-qualified"],greedy:!0,lookbehind:!0,inside:{punctuation:/\\/}}],constant:n,number:r,operator:i,punctuation:o}},delimiter:{pattern:/^#\[|\]$/,alias:"punctuation"}}}}),e.hooks.add("before-tokenize",(function(t){/<\?/.test(t.code)&&e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(Prism)},2342:function(){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern://,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},4113:function(){Prism.languages.q={string:/"(?:\\.|[^"\\\r\n])*"/,comment:[{pattern:/([\t )\]}])\/.*/,lookbehind:!0,greedy:!0},{pattern:/(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,lookbehind:!0,greedy:!0},{pattern:/^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,greedy:!0},{pattern:/^#!.+/m,greedy:!0}],symbol:/`(?::\S+|[\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,alias:"number"},number:/\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,keyword:/\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,adverb:{pattern:/['\/\\]:?|\beach\b/,alias:"function"},verb:{pattern:/(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$@^]):?|\b_\b:?/,alias:"operator"},punctuation:/[(){}\[\];.]/}},1648:function(){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},4252:function(){Prism.languages.scala=Prism.languages.extend("java",{"triple-quoted-string":{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string"},string:{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,greedy:!0},keyword:/<-|=>|\b(?:abstract|case|catch|class|def|derives|do|else|enum|extends|extension|final|finally|for|forSome|given|if|implicit|import|infix|inline|lazy|match|new|null|object|opaque|open|override|package|private|protected|return|sealed|self|super|this|throw|trait|transparent|try|type|using|val|var|while|with|yield)\b/,number:/\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,builtin:/\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,symbol:/'[^\d\s\\]\w*/}),Prism.languages.insertBefore("scala","triple-quoted-string",{"string-interpolation":{pattern:/\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,greedy:!0,inside:{id:{pattern:/^\w+/,greedy:!0,alias:"function"},escape:{pattern:/\\\$"|\$[$"]/,greedy:!0,alias:"symbol"},interpolation:{pattern:/\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,greedy:!0,inside:{punctuation:/^\$\{?|\}$/,expression:{pattern:/[\s\S]+/,inside:Prism.languages.scala}}},string:/[\s\S]+/}}}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala.function,delete Prism.languages.scala.constant},6966:function(){Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}},4793:function(){Prism.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},Prism.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=Prism.languages.swift}))},83:function(){!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",i=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+i+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:s(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(o),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},8848:function(e,t,n){var r=function(e){var t=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,r={},i={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=p.reach);S+=k.value.length,k=k.next){var E=k.value;if(t.length>e.length)return;if(!(E instanceof o)){var O,_=1;if(b){if(!(O=s(w,S,e,y))||O.index>=e.length)break;var A=O.index,C=O.index+O[0].length,j=S;for(j+=k.value.length;A>=j;)j+=(k=k.next).value.length;if(S=j-=k.value.length,k.value instanceof o)continue;for(var P=k;P!==t.tail&&(jp.reach&&(p.reach=N);var $=k.prev;if(I&&($=c(t,$,I),S+=I.length),u(t,$,_),k=c(t,$,new o(d,g?i.tokenize(T,g):T,v,T)),R&&c(t,k,R),_>1){var L={cause:d+","+h,reach:N};a(e,t,n,k.prev,S,L),p&&L.reach>p.reach&&(p.reach=L.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,i={value:n,prev:t,next:r};return t.next=i,r.prev=i,e.length++,i}function u(e,t,n){for(var r=t.next,i=0;i"+o.content+""+o.tag+">"},!e.document)return e.addEventListener?(i.disableWorkerMessageHandler||e.addEventListener("message",(function(t){var n=JSON.parse(t.data),r=n.language,o=n.code,s=n.immediateClose;e.postMessage(i.highlight(o,i.languages[r],r)),s&&e.close()}),!1),i):i;var p=i.util.currentScript();function d(){i.manual||i.highlightAll()}if(p&&(i.filename=p.src,p.hasAttribute("data-manual")&&(i.manual=!0)),!i.manual){var f=document.readyState;"loading"===f||"interactive"===f&&p&&p.defer?document.addEventListener("DOMContentLoaded",d):window.requestAnimationFrame?window.requestAnimationFrame(d):window.setTimeout(d,16)}return i}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=r),void 0!==n.g&&(n.g.Prism=r),r.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},r.languages.markup.tag.inside["attr-value"].inside.entity=r.languages.markup.entity,r.languages.markup.doctype.inside["internal-subset"].inside=r.languages.markup,r.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(r.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:r.languages[t]},n.cdata=/^$/i;var i={"included-cdata":{pattern://i,inside:n}};i["language-"+t]={pattern:/[\s\S]+/,inside:r.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:i},r.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(r.languages.markup.tag,"addAttribute",{value:function(e,t){r.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:r.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),r.languages.html=r.languages.markup,r.languages.mathml=r.languages.markup,r.languages.svg=r.languages.markup,r.languages.xml=r.languages.extend("markup",{}),r.languages.ssml=r.languages.xml,r.languages.atom=r.languages.xml,r.languages.rss=r.languages.xml,function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(r),r.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},r.languages.javascript=r.languages.extend("clike",{"class-name":[r.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),r.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,r.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:r.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:r.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:r.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:r.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:r.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),r.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:r.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),r.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),r.languages.markup&&(r.languages.markup.tag.addInlined("script","javascript"),r.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),r.languages.js=r.languages.javascript,function(){if(void 0!==r&&"undefined"!=typeof document){Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector);var e={js:"javascript",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell",sh:"bash",bat:"batch",h:"c",tex:"latex"},t="data-src-status",n="loading",i="loaded",o="pre[data-src]:not(["+t+'="'+i+'"]):not(['+t+'="'+n+'"])';r.hooks.add("before-highlightall",(function(e){e.selector+=", "+o})),r.hooks.add("before-sanity-check",(function(s){var a=s.element;if(a.matches(o)){s.code="",a.setAttribute(t,n);var l=a.appendChild(document.createElement("CODE"));l.textContent="Loading…";var c=a.getAttribute("data-src"),u=s.language;if("none"===u){var p=(/\.(\w+)$/.exec(c)||[,"none"])[1];u=e[p]||p}r.util.setLanguage(l,u),r.util.setLanguage(a,u);var d=r.plugins.autoloader;d&&d.loadLanguages(u),function(e,n,o){var s=new XMLHttpRequest;s.open("GET",e,!0),s.onreadystatechange=function(){4==s.readyState&&(s.status<400&&s.responseText?function(e){a.setAttribute(t,i);var n=function(e){var t=/^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(e||"");if(t){var n=Number(t[1]),r=t[2],i=t[3];return r?i?[n,Number(i)]:[n,void 0]:[n,n]}}(a.getAttribute("data-range"));if(n){var o=e.split(/\r\n?|\n/g),s=n[0],c=null==n[1]?o.length:n[1];s<0&&(s+=o.length),s=Math.max(0,Math.min(s-1,o.length)),c<0&&(c+=o.length),c=Math.max(0,Math.min(c,o.length)),e=o.slice(s,c).join("\n"),a.hasAttribute("data-start")||a.setAttribute("data-start",String(s+1))}l.textContent=e,r.highlightElement(l)}(s.responseText):s.status>=400?o("✖ Error "+s.status+" while fetching file: "+s.statusText):o("✖ Error: File does not exist or is empty"))},s.send(null)}(c,0,(function(e){a.setAttribute(t,"failed"),l.textContent=e}))}})),r.plugins.fileHighlight={highlight:function(e){for(var t,n=(e||document).querySelectorAll(o),i=0;t=n[i++];)r.highlightElement(t)}};var s=!1;r.fileHighlight=function(){s||(console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead."),s=!0),r.plugins.fileHighlight.highlight.apply(this,arguments)}}}()},2694:function(e,t,n){"use strict";var r=n(6925);function i(){}function o(){}o.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,o,s){if(s!==r){var a=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw a.name="Invariant Violation",a}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},5556:function(e,t,n){e.exports=n(2694)()},6925:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:function(e,t,n){"use strict";var r=n(6540),i=n(194);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;nt}return!1}(t,n,i,r)&&(n=null),r||null===i?function(e){return!!p.call(h,e)||!p.call(f,e)&&(d.test(e)?h[e]=!0:(f[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):i.mustUseProperty?e[i.propertyName]=null===n?3!==i.type&&"":n:(t=i.attributeName,r=i.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(i=i.type)||4===i&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var x=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,w=Symbol.for("react.element"),k=Symbol.for("react.portal"),S=Symbol.for("react.fragment"),E=Symbol.for("react.strict_mode"),O=Symbol.for("react.profiler"),_=Symbol.for("react.provider"),A=Symbol.for("react.context"),C=Symbol.for("react.forward_ref"),j=Symbol.for("react.suspense"),P=Symbol.for("react.suspense_list"),T=Symbol.for("react.memo"),I=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var R=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var N=Symbol.iterator;function $(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=N&&e[N]||e["@@iterator"])?e:null}var L,D=Object.assign;function M(e){if(void 0===L)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);L=t&&t[1]||""}return"\n"+L+e}var F=!1;function z(e,t){if(!e||F)return"";F=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(e){var r=e}Reflect.construct(e,[],t)}else{try{t.call()}catch(e){r=e}e.call(t.prototype)}else{try{throw Error()}catch(e){r=e}e()}}catch(t){if(t&&r&&"string"==typeof t.stack){for(var i=t.stack.split("\n"),o=r.stack.split("\n"),s=i.length-1,a=o.length-1;1<=s&&0<=a&&i[s]!==o[a];)a--;for(;1<=s&&0<=a;s--,a--)if(i[s]!==o[a]){if(1!==s||1!==a)do{if(s--,0>--a||i[s]!==o[a]){var l="\n"+i[s].replace(" at new "," at ");return e.displayName&&l.includes("")&&(l=l.replace("",e.displayName)),l}}while(1<=s&&0<=a);break}}}finally{F=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?M(e):""}function B(e){switch(e.tag){case 5:return M(e.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return z(e.type,!1);case 11:return z(e.type.render,!1);case 1:return z(e.type,!0);default:return""}}function U(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case S:return"Fragment";case k:return"Portal";case O:return"Profiler";case E:return"StrictMode";case j:return"Suspense";case P:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case A:return(e.displayName||"Context")+".Consumer";case _:return(e._context.displayName||"Context")+".Provider";case C:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case T:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case I:t=e._payload,e=e._init;try{return U(e(t))}catch(e){}}return null}function q(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===E?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function V(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function W(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function H(e){e._valueTracker||(e._valueTracker=function(e){var t=W(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(e){r=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function Y(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=W(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function G(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function Q(e,t){var n=t.checked;return D({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function X(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=V(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function K(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function Z(e,t){K(e,t);var n=V(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,V(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&G(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function de(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var fe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},he=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||fe.hasOwnProperty(e)&&fe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),i=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}Object.keys(fe).forEach((function(e){he.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),fe[t]=fe[e]}))}));var ye=D({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function be(e,t){if(t){if(ye[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(o(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(o(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(o(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(o(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var xe=null;function we(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var ke=null,Se=null,Ee=null;function Oe(e){if(e=vi(e)){if("function"!=typeof ke)throw Error(o(280));var t=e.stateNode;t&&(t=wi(t),ke(e.stateNode,e.type,t))}}function _e(e){Se?Ee?Ee.push(e):Ee=[e]:Se=e}function Ae(){if(Se){var e=Se,t=Ee;if(Ee=Se=null,Oe(e),t)for(e=0;e>>=0)?32:31-(at(e)/lt|0)|0},at=Math.log,lt=Math.LN2,ct=64,ut=4194304;function pt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function dt(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,i=e.suspendedLanes,o=e.pingedLanes,s=268435455&n;if(0!==s){var a=s&~i;0!==a?r=pt(a):0!=(o&=s)&&(r=pt(o))}else 0!=(s=n&~i)?r=pt(s):0!==o&&(r=pt(o));if(0===r)return 0;if(0!==t&&t!==r&&!(t&i)&&((i=r&-r)>=(o=t&-t)||16===i&&4194240&o))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function yt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-st(t)]=n}function bt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-st(n),i=1<=$n),Mn=String.fromCharCode(32),Fn=!1;function zn(e,t){switch(e){case"keyup":return-1!==Rn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Bn(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1,qn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!qn[e.type]:"textarea"===t}function Wn(e,t,n,r){_e(r),0<(t=Hr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Hn=null,Yn=null;function Gn(e){Mr(e,0)}function Qn(e){if(Y(xi(e)))return e}function Xn(e,t){if("change"===e)return t}var Kn=!1;if(u){var Zn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Zn=Jn}else Zn=!1;Kn=Zn&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function pr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?pr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function dr(){for(var e=window,t=G();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=G((e=t.contentWindow).document)}return t}function fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function hr(e){var t=dr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&pr(n.ownerDocument.documentElement,n)){if(null!==r&&fr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var i=n.textContent.length,o=Math.min(r.start,i);r=void 0===r.end?o:Math.min(r.end,i),!e.extend&&o>r&&(i=r,r=o,o=i),i=ur(n,o);var s=ur(n,r);i&&s&&(1!==e.rangeCount||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&((t=t.createRange()).setStart(i.node,i.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n=document.documentMode,gr=null,yr=null,br=null,vr=!1;function xr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==gr||gr!==G(r)||(r="selectionStart"in(r=gr)&&fr(r)?{start:r.selectionStart,end:r.selectionEnd}:{anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},br&&lr(br,r)||(br=r,0<(r=Hr(yr,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function wr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var kr={animationend:wr("Animation","AnimationEnd"),animationiteration:wr("Animation","AnimationIteration"),animationstart:wr("Animation","AnimationStart"),transitionend:wr("Transition","TransitionEnd")},Sr={},Er={};function Or(e){if(Sr[e])return Sr[e];if(!kr[e])return e;var t,n=kr[e];for(t in n)if(n.hasOwnProperty(t)&&t in Er)return Sr[e]=n[t];return e}u&&(Er=document.createElement("div").style,"AnimationEvent"in window||(delete kr.animationend.animation,delete kr.animationiteration.animation,delete kr.animationstart.animation),"TransitionEvent"in window||delete kr.transitionend.transition);var _r=Or("animationend"),Ar=Or("animationiteration"),Cr=Or("animationstart"),jr=Or("transitionend"),Pr=new Map,Tr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ir(e,t){Pr.set(e,t),l(t,[e])}for(var Rr=0;RrSi||(e.current=ki[Si],ki[Si]=null,Si--)}function _i(e,t){Si++,ki[Si]=e.current,e.current=t}var Ai={},Ci=Ei(Ai),ji=Ei(!1),Pi=Ai;function Ti(e,t){var n=e.type.contextTypes;if(!n)return Ai;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i,o={};for(i in n)o[i]=t[i];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ii(e){return null!=e.childContextTypes}function Ri(){Oi(ji),Oi(Ci)}function Ni(e,t,n){if(Ci.current!==Ai)throw Error(o(168));_i(Ci,t),_i(ji,n)}function $i(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var i in r=r.getChildContext())if(!(i in t))throw Error(o(108,q(e)||"Unknown",i));return D({},n,r)}function Li(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ai,Pi=Ci.current,_i(Ci,e),_i(ji,ji.current),!0}function Di(e,t,n){var r=e.stateNode;if(!r)throw Error(o(169));n?(e=$i(e,t,Pi),r.__reactInternalMemoizedMergedChildContext=e,Oi(ji),Oi(Ci),_i(Ci,e)):Oi(ji),_i(ji,n)}var Mi=null,Fi=!1,zi=!1;function Bi(e){null===Mi?Mi=[e]:Mi.push(e)}function Ui(){if(!zi&&null!==Mi){zi=!0;var e=0,t=vt;try{var n=Mi;for(vt=1;e>=s,i-=s,Xi=1<<32-st(t)+i|n<m?(g=p,p=null):g=p.sibling;var y=f(i,p,a[m],l);if(null===y){null===p&&(p=g);break}e&&p&&null===y.alternate&&t(i,p),o=s(y,o,m),null===u?c=y:u.sibling=y,u=y,p=g}if(m===a.length)return n(i,p),io&&Zi(i,m),c;if(null===p){for(;mg?(y=m,m=null):y=m.sibling;var v=f(i,m,b.value,c);if(null===v){null===m&&(m=y);break}e&&m&&null===v.alternate&&t(i,m),a=s(v,a,g),null===p?u=v:p.sibling=v,p=v,m=y}if(b.done)return n(i,m),io&&Zi(i,g),u;if(null===m){for(;!b.done;g++,b=l.next())null!==(b=d(i,b.value,c))&&(a=s(b,a,g),null===p?u=b:p.sibling=b,p=b);return io&&Zi(i,g),u}for(m=r(i,m);!b.done;g++,b=l.next())null!==(b=h(m,i,g,b.value,c))&&(e&&null!==b.alternate&&m.delete(null===b.key?g:b.key),a=s(b,a,g),null===p?u=b:p.sibling=b,p=b);return e&&m.forEach((function(e){return t(i,e)})),io&&Zi(i,g),u}return function e(r,o,s,l){if("object"==typeof s&&null!==s&&s.type===S&&null===s.key&&(s=s.props.children),"object"==typeof s&&null!==s){switch(s.$$typeof){case w:e:{for(var c=s.key,u=o;null!==u;){if(u.key===c){if((c=s.type)===S){if(7===u.tag){n(r,u.sibling),(o=i(u,s.props.children)).return=r,r=o;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===I&&vo(c)===u.type){n(r,u.sibling),(o=i(u,s.props)).ref=yo(r,u,s),o.return=r,r=o;break e}n(r,u);break}t(r,u),u=u.sibling}s.type===S?((o=$c(s.props.children,r.mode,l,s.key)).return=r,r=o):((l=Nc(s.type,s.key,s.props,null,r.mode,l)).ref=yo(r,o,s),l.return=r,r=l)}return a(r);case k:e:{for(u=s.key;null!==o;){if(o.key===u){if(4===o.tag&&o.stateNode.containerInfo===s.containerInfo&&o.stateNode.implementation===s.implementation){n(r,o.sibling),(o=i(o,s.children||[])).return=r,r=o;break e}n(r,o);break}t(r,o),o=o.sibling}(o=Mc(s,r.mode,l)).return=r,r=o}return a(r);case I:return e(r,o,(u=s._init)(s._payload),l)}if(te(s))return m(r,o,s,l);if($(s))return g(r,o,s,l);bo(r,s)}return"string"==typeof s&&""!==s||"number"==typeof s?(s=""+s,null!==o&&6===o.tag?(n(r,o.sibling),(o=i(o,s)).return=r,r=o):(n(r,o),(o=Dc(s,r.mode,l)).return=r,r=o),a(r)):n(r,o)}}var wo=xo(!0),ko=xo(!1),So=Ei(null),Eo=null,Oo=null,_o=null;function Ao(){_o=Oo=Eo=null}function Co(e){var t=So.current;Oi(So),e._currentValue=t}function jo(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Po(e,t){Eo=e,_o=Oo=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(va=!0),e.firstContext=null)}function To(e){var t=e._currentValue;if(_o!==e)if(e={context:e,memoizedValue:t,next:null},null===Oo){if(null===Eo)throw Error(o(308));Oo=e,Eo.dependencies={lanes:0,firstContext:e}}else Oo=Oo.next=e;return t}var Io=null;function Ro(e){null===Io?Io=[e]:Io.push(e)}function No(e,t,n,r){var i=t.interleaved;return null===i?(n.next=n,Ro(t)):(n.next=i.next,i.next=n),t.interleaved=n,$o(e,r)}function $o(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Lo=!1;function Do(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Mo(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Fo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function zo(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Cl){var i=r.pending;return null===i?t.next=t:(t.next=i.next,i.next=t),r.pending=t,$o(e,n)}return null===(i=r.interleaved)?(t.next=t,Ro(r)):(t.next=i.next,i.next=t),r.interleaved=t,$o(e,n)}function Bo(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}function Uo(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var i=null,o=null;if(null!==(n=n.firstBaseUpdate)){do{var s={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===o?i=o=s:o=o.next=s,n=n.next}while(null!==n);null===o?i=o=t:o=o.next=t}else i=o=t;return n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:o,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function qo(e,t,n,r){var i=e.updateQueue;Lo=!1;var o=i.firstBaseUpdate,s=i.lastBaseUpdate,a=i.shared.pending;if(null!==a){i.shared.pending=null;var l=a,c=l.next;l.next=null,null===s?o=c:s.next=c,s=l;var u=e.alternate;null!==u&&(a=(u=u.updateQueue).lastBaseUpdate)!==s&&(null===a?u.firstBaseUpdate=c:a.next=c,u.lastBaseUpdate=l)}if(null!==o){var p=i.baseState;for(s=0,u=c=l=null,a=o;;){var d=a.lane,f=a.eventTime;if((r&d)===d){null!==u&&(u=u.next={eventTime:f,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var h=e,m=a;switch(d=t,f=n,m.tag){case 1:if("function"==typeof(h=m.payload)){p=h.call(f,p,d);break e}p=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(d="function"==typeof(h=m.payload)?h.call(f,p,d):h))break e;p=D({},p,d);break e;case 2:Lo=!0}}null!==a.callback&&0!==a.lane&&(e.flags|=64,null===(d=i.effects)?i.effects=[a]:d.push(a))}else f={eventTime:f,lane:d,tag:a.tag,payload:a.payload,callback:a.callback,next:null},null===u?(c=u=f,l=p):u=u.next=f,s|=d;if(null===(a=a.next)){if(null===(a=i.shared.pending))break;a=(d=a).next,d.next=null,i.lastBaseUpdate=d,i.shared.pending=null}}if(null===u&&(l=p),i.baseState=l,i.firstBaseUpdate=c,i.lastBaseUpdate=u,null!==(t=i.shared.interleaved)){i=t;do{s|=i.lane,i=i.next}while(i!==t)}else null===o&&(i.shared.lanes=0);Ll|=s,e.lanes=s,e.memoizedState=p}}function Vo(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;tn?n:4,e(!0);var r=os.transition;os.transition={};try{e(!1),t()}finally{vt=n,os.transition=r}}function Hs(){return vs().memoizedState}function Ys(e,t,n){var r=tc(e);n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Qs(e)?Xs(t,n):null!==(n=No(e,t,n,r))&&(nc(n,e,r,ec()),Ks(n,t,r))}function Gs(e,t,n){var r=tc(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Qs(e))Xs(t,i);else{var o=e.alternate;if(0===e.lanes&&(null===o||0===o.lanes)&&null!==(o=t.lastRenderedReducer))try{var s=t.lastRenderedState,a=o(s,n);if(i.hasEagerState=!0,i.eagerState=a,ar(a,s)){var l=t.interleaved;return null===l?(i.next=i,Ro(t)):(i.next=l.next,l.next=i),void(t.interleaved=i)}}catch(e){}null!==(n=No(e,t,i,r))&&(nc(n,e,r,i=ec()),Ks(n,t,r))}}function Qs(e){var t=e.alternate;return e===as||null!==t&&t===as}function Xs(e,t){ps=us=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Ks(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}var Zs={readContext:To,useCallback:hs,useContext:hs,useEffect:hs,useImperativeHandle:hs,useInsertionEffect:hs,useLayoutEffect:hs,useMemo:hs,useReducer:hs,useRef:hs,useState:hs,useDebugValue:hs,useDeferredValue:hs,useTransition:hs,useMutableSource:hs,useSyncExternalStore:hs,useId:hs,unstable_isNewReconciler:!1},Js={readContext:To,useCallback:function(e,t){return bs().memoizedState=[e,void 0===t?null:t],e},useContext:To,useEffect:$s,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Rs(4194308,4,Fs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Rs(4194308,4,e,t)},useInsertionEffect:function(e,t){return Rs(4,2,e,t)},useMemo:function(e,t){var n=bs();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=bs();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Ys.bind(null,as,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},bs().memoizedState=e},useState:Ps,useDebugValue:Bs,useDeferredValue:function(e){return bs().memoizedState=e},useTransition:function(){var e=Ps(!1),t=e[0];return e=Ws.bind(null,e[1]),bs().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=as,i=bs();if(io){if(void 0===n)throw Error(o(407));n=n()}else{if(n=t(),null===jl)throw Error(o(349));30&ss||Os(r,t,n)}i.memoizedState=n;var s={value:n,getSnapshot:t};return i.queue=s,$s(As.bind(null,r,s,e),[e]),r.flags|=2048,Ts(9,_s.bind(null,r,s,n,t),void 0,null),n},useId:function(){var e=bs(),t=jl.identifierPrefix;if(io){var n=Ki;t=":"+t+"R"+(n=(Xi&~(1<<32-st(Xi)-1)).toString(32)+n),0<(n=ds++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=fs++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ea={readContext:To,useCallback:Us,useContext:To,useEffect:Ls,useImperativeHandle:zs,useInsertionEffect:Ds,useLayoutEffect:Ms,useMemo:qs,useReducer:ws,useRef:Is,useState:function(){return ws(xs)},useDebugValue:Bs,useDeferredValue:function(e){return Vs(vs(),ls.memoizedState,e)},useTransition:function(){return[ws(xs)[0],vs().memoizedState]},useMutableSource:Ss,useSyncExternalStore:Es,useId:Hs,unstable_isNewReconciler:!1},ta={readContext:To,useCallback:Us,useContext:To,useEffect:Ls,useImperativeHandle:zs,useInsertionEffect:Ds,useLayoutEffect:Ms,useMemo:qs,useReducer:ks,useRef:Is,useState:function(){return ks(xs)},useDebugValue:Bs,useDeferredValue:function(e){var t=vs();return null===ls?t.memoizedState=e:Vs(t,ls.memoizedState,e)},useTransition:function(){return[ks(xs)[0],vs().memoizedState]},useMutableSource:Ss,useSyncExternalStore:Es,useId:Hs,unstable_isNewReconciler:!1};function na(e,t){if(e&&e.defaultProps){for(var n in t=D({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function ra(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:D({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var ia={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),i=tc(e),o=Fo(r,i);o.payload=t,null!=n&&(o.callback=n),null!==(t=zo(e,o,i))&&(nc(t,e,i,r),Bo(t,e,i))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),i=tc(e),o=Fo(r,i);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=zo(e,o,i))&&(nc(t,e,i,r),Bo(t,e,i))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),i=Fo(n,r);i.tag=2,null!=t&&(i.callback=t),null!==(t=zo(e,i,r))&&(nc(t,e,r,n),Bo(t,e,r))}};function oa(e,t,n,r,i,o,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,o,s):!(t.prototype&&t.prototype.isPureReactComponent&&lr(n,r)&&lr(i,o))}function sa(e,t,n){var r=!1,i=Ai,o=t.contextType;return"object"==typeof o&&null!==o?o=To(o):(i=Ii(t)?Pi:Ci.current,o=(r=null!=(r=t.contextTypes))?Ti(e,i):Ai),t=new t(n,o),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=ia,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=i,e.__reactInternalMemoizedMaskedChildContext=o),t}function aa(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&ia.enqueueReplaceState(t,t.state,null)}function la(e,t,n,r){var i=e.stateNode;i.props=n,i.state=e.memoizedState,i.refs={},Do(e);var o=t.contextType;"object"==typeof o&&null!==o?i.context=To(o):(o=Ii(t)?Pi:Ci.current,i.context=Ti(e,o)),i.state=e.memoizedState,"function"==typeof(o=t.getDerivedStateFromProps)&&(ra(e,t,o,n),i.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof i.getSnapshotBeforeUpdate||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||(t=i.state,"function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount(),t!==i.state&&ia.enqueueReplaceState(i,i.state,null),qo(e,n,i,r),i.state=e.memoizedState),"function"==typeof i.componentDidMount&&(e.flags|=4194308)}function ca(e,t){try{var n="",r=t;do{n+=B(r),r=r.return}while(r);var i=n}catch(e){i="\nError generating stack: "+e.message+"\n"+e.stack}return{value:e,source:t,stack:i,digest:null}}function ua(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function pa(e,t){try{console.error(t.value)}catch(e){setTimeout((function(){throw e}))}}var da="function"==typeof WeakMap?WeakMap:Map;function fa(e,t,n){(n=Fo(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vl||(Vl=!0,Wl=r),pa(0,t)},n}function ha(e,t,n){(n=Fo(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var i=t.value;n.payload=function(){return r(i)},n.callback=function(){pa(0,t)}}var o=e.stateNode;return null!==o&&"function"==typeof o.componentDidCatch&&(n.callback=function(){pa(0,t),"function"!=typeof r&&(null===Hl?Hl=new Set([this]):Hl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function ma(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new da;var i=new Set;r.set(t,i)}else void 0===(i=r.get(t))&&(i=new Set,r.set(t,i));i.has(n)||(i.add(n),e=Oc.bind(null,e,t,n),t.then(e,e))}function ga(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ya(e,t,n,r,i){return 1&e.mode?(e.flags|=65536,e.lanes=i,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Fo(-1,1)).tag=2,zo(n,t,1))),n.lanes|=1),e)}var ba=x.ReactCurrentOwner,va=!1;function xa(e,t,n,r){t.child=null===e?ko(t,null,n,r):wo(t,e.child,n,r)}function wa(e,t,n,r,i){n=n.render;var o=t.ref;return Po(t,i),r=gs(e,t,n,r,o,i),n=ys(),null===e||va?(io&&n&&eo(t),t.flags|=1,xa(e,t,r,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,Va(e,t,i))}function ka(e,t,n,r,i){if(null===e){var o=n.type;return"function"!=typeof o||Ic(o)||void 0!==o.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Nc(n.type,null,r,t,t.mode,i)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=o,Sa(e,t,o,r,i))}if(o=e.child,!(e.lanes&i)){var s=o.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(s,r)&&e.ref===t.ref)return Va(e,t,i)}return t.flags|=1,(e=Rc(o,r)).ref=t.ref,e.return=t,t.child=e}function Sa(e,t,n,r,i){if(null!==e){var o=e.memoizedProps;if(lr(o,r)&&e.ref===t.ref){if(va=!1,t.pendingProps=r=o,!(e.lanes&i))return t.lanes=e.lanes,Va(e,t,i);131072&e.flags&&(va=!0)}}return _a(e,t,n,r,i)}function Ea(e,t,n){var r=t.pendingProps,i=r.children,o=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==o?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,_i(Rl,Il),Il|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==o?o.baseLanes:n,_i(Rl,Il),Il|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},_i(Rl,Il),Il|=n;else null!==o?(r=o.baseLanes|n,t.memoizedState=null):r=n,_i(Rl,Il),Il|=r;return xa(e,t,i,n),t.child}function Oa(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function _a(e,t,n,r,i){var o=Ii(n)?Pi:Ci.current;return o=Ti(t,o),Po(t,i),n=gs(e,t,n,r,o,i),r=ys(),null===e||va?(io&&r&&eo(t),t.flags|=1,xa(e,t,n,i),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,Va(e,t,i))}function Aa(e,t,n,r,i){if(Ii(n)){var o=!0;Li(t)}else o=!1;if(Po(t,i),null===t.stateNode)qa(e,t),sa(t,n,r),la(t,n,r,i),r=!0;else if(null===e){var s=t.stateNode,a=t.memoizedProps;s.props=a;var l=s.context,c=n.contextType;c="object"==typeof c&&null!==c?To(c):Ti(t,c=Ii(n)?Pi:Ci.current);var u=n.getDerivedStateFromProps,p="function"==typeof u||"function"==typeof s.getSnapshotBeforeUpdate;p||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(a!==r||l!==c)&&aa(t,s,r,c),Lo=!1;var d=t.memoizedState;s.state=d,qo(t,r,s,i),l=t.memoizedState,a!==r||d!==l||ji.current||Lo?("function"==typeof u&&(ra(t,n,u,r),l=t.memoizedState),(a=Lo||oa(t,n,a,r,d,l,c))?(p||"function"!=typeof s.UNSAFE_componentWillMount&&"function"!=typeof s.componentWillMount||("function"==typeof s.componentWillMount&&s.componentWillMount(),"function"==typeof s.UNSAFE_componentWillMount&&s.UNSAFE_componentWillMount()),"function"==typeof s.componentDidMount&&(t.flags|=4194308)):("function"==typeof s.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),s.props=r,s.state=l,s.context=c,r=a):("function"==typeof s.componentDidMount&&(t.flags|=4194308),r=!1)}else{s=t.stateNode,Mo(e,t),a=t.memoizedProps,c=t.type===t.elementType?a:na(t.type,a),s.props=c,p=t.pendingProps,d=s.context,l="object"==typeof(l=n.contextType)&&null!==l?To(l):Ti(t,l=Ii(n)?Pi:Ci.current);var f=n.getDerivedStateFromProps;(u="function"==typeof f||"function"==typeof s.getSnapshotBeforeUpdate)||"function"!=typeof s.UNSAFE_componentWillReceiveProps&&"function"!=typeof s.componentWillReceiveProps||(a!==p||d!==l)&&aa(t,s,r,l),Lo=!1,d=t.memoizedState,s.state=d,qo(t,r,s,i);var h=t.memoizedState;a!==p||d!==h||ji.current||Lo?("function"==typeof f&&(ra(t,n,f,r),h=t.memoizedState),(c=Lo||oa(t,n,c,r,d,h,l)||!1)?(u||"function"!=typeof s.UNSAFE_componentWillUpdate&&"function"!=typeof s.componentWillUpdate||("function"==typeof s.componentWillUpdate&&s.componentWillUpdate(r,h,l),"function"==typeof s.UNSAFE_componentWillUpdate&&s.UNSAFE_componentWillUpdate(r,h,l)),"function"==typeof s.componentDidUpdate&&(t.flags|=4),"function"==typeof s.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof s.componentDidUpdate||a===e.memoizedProps&&d===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||a===e.memoizedProps&&d===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=h),s.props=r,s.state=h,s.context=l,r=c):("function"!=typeof s.componentDidUpdate||a===e.memoizedProps&&d===e.memoizedState||(t.flags|=4),"function"!=typeof s.getSnapshotBeforeUpdate||a===e.memoizedProps&&d===e.memoizedState||(t.flags|=1024),r=!1)}return Ca(e,t,n,r,o,i)}function Ca(e,t,n,r,i,o){Oa(e,t);var s=!!(128&t.flags);if(!r&&!s)return i&&Di(t,n,!1),Va(e,t,o);r=t.stateNode,ba.current=t;var a=s&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&s?(t.child=wo(t,e.child,null,o),t.child=wo(t,null,a,o)):xa(e,t,a,o),t.memoizedState=r.state,i&&Di(t,n,!0),t.child}function ja(e){var t=e.stateNode;t.pendingContext?Ni(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ni(0,t.context,!1),Xo(e,t.containerInfo)}function Pa(e,t,n,r,i){return ho(),mo(i),t.flags|=256,xa(e,t,n,r),t.child}var Ta,Ia,Ra,Na,$a={dehydrated:null,treeContext:null,retryLane:0};function La(e){return{baseLanes:e,cachePool:null,transitions:null}}function Da(e,t,n){var r,i=t.pendingProps,s=es.current,a=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&s)),r?(a=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(s|=1),_i(es,1&s),null===e)return co(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=i.children,e=i.fallback,a?(i=t.mode,a=t.child,l={mode:"hidden",children:l},1&i||null===a?a=Lc(l,i,0,null):(a.childLanes=0,a.pendingProps=l),e=$c(e,i,n,null),a.return=t,e.return=t,a.sibling=e,t.child=a,t.child.memoizedState=La(n),t.memoizedState=$a,e):Ma(t,l));if(null!==(s=e.memoizedState)&&null!==(r=s.dehydrated))return function(e,t,n,r,i,s,a){if(n)return 256&t.flags?(t.flags&=-257,Fa(e,t,a,r=ua(Error(o(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(s=r.fallback,i=t.mode,r=Lc({mode:"visible",children:r.children},i,0,null),(s=$c(s,i,a,null)).flags|=2,r.return=t,s.return=t,r.sibling=s,t.child=r,1&t.mode&&wo(t,e.child,null,a),t.child.memoizedState=La(a),t.memoizedState=$a,s);if(!(1&t.mode))return Fa(e,t,a,null);if("$!"===i.data){if(r=i.nextSibling&&i.nextSibling.dataset)var l=r.dgst;return r=l,Fa(e,t,a,r=ua(s=Error(o(419)),r,void 0))}if(l=!!(a&e.childLanes),va||l){if(null!==(r=jl)){switch(a&-a){case 4:i=2;break;case 16:i=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:i=32;break;case 536870912:i=268435456;break;default:i=0}0!==(i=i&(r.suspendedLanes|a)?0:i)&&i!==s.retryLane&&(s.retryLane=i,$o(e,i),nc(r,e,i,-1))}return mc(),Fa(e,t,a,r=ua(Error(o(421))))}return"$?"===i.data?(t.flags|=128,t.child=e.child,t=Ac.bind(null,e),i._reactRetry=t,null):(e=s.treeContext,ro=ci(i.nextSibling),no=t,io=!0,oo=null,null!==e&&(Yi[Gi++]=Xi,Yi[Gi++]=Ki,Yi[Gi++]=Qi,Xi=e.id,Ki=e.overflow,Qi=t),(t=Ma(t,r.children)).flags|=4096,t)}(e,t,l,i,r,s,n);if(a){a=i.fallback,l=t.mode,r=(s=e.child).sibling;var c={mode:"hidden",children:i.children};return 1&l||t.child===s?(i=Rc(s,c)).subtreeFlags=14680064&s.subtreeFlags:((i=t.child).childLanes=0,i.pendingProps=c,t.deletions=null),null!==r?a=Rc(r,a):(a=$c(a,l,n,null)).flags|=2,a.return=t,i.return=t,i.sibling=a,t.child=i,i=a,a=t.child,l=null===(l=e.child.memoizedState)?La(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},a.memoizedState=l,a.childLanes=e.childLanes&~n,t.memoizedState=$a,i}return e=(a=e.child).sibling,i=Rc(a,{mode:"visible",children:i.children}),!(1&t.mode)&&(i.lanes=n),i.return=t,i.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=i,t.memoizedState=null,i}function Ma(e,t){return(t=Lc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Fa(e,t,n,r){return null!==r&&mo(r),wo(t,e.child,null,n),(e=Ma(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function za(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),jo(e.return,t,n)}function Ba(e,t,n,r,i){var o=e.memoizedState;null===o?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:i}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=i)}function Ua(e,t,n){var r=t.pendingProps,i=r.revealOrder,o=r.tail;if(xa(e,t,r.children,n),2&(r=es.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&za(e,n,t);else if(19===e.tag)za(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(_i(es,r),1&t.mode)switch(i){case"forwards":for(n=t.child,i=null;null!==n;)null!==(e=n.alternate)&&null===ts(e)&&(i=n),n=n.sibling;null===(n=i)?(i=t.child,t.child=null):(i=n.sibling,n.sibling=null),Ba(t,!1,i,n,o);break;case"backwards":for(n=null,i=t.child,t.child=null;null!==i;){if(null!==(e=i.alternate)&&null===ts(e)){t.child=i;break}e=i.sibling,i.sibling=n,n=i,i=e}Ba(t,!0,n,null,o);break;case"together":Ba(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function qa(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Va(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Ll|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(o(153));if(null!==t.child){for(n=Rc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Rc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Wa(e,t){if(!io)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ha(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var i=e.child;null!==i;)n|=i.lanes|i.childLanes,r|=14680064&i.subtreeFlags,r|=14680064&i.flags,i.return=e,i=i.sibling;else for(i=e.child;null!==i;)n|=i.lanes|i.childLanes,r|=i.subtreeFlags,r|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function Ya(e,t,n){var r=t.pendingProps;switch(to(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ha(t),null;case 1:case 17:return Ii(t.type)&&Ri(),Ha(t),null;case 3:return r=t.stateNode,Ko(),Oi(ji),Oi(Ci),rs(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(po(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==oo&&(sc(oo),oo=null))),Ia(e,t),Ha(t),null;case 5:Jo(t);var i=Qo(Go.current);if(n=t.type,null!==e&&null!=t.stateNode)Ra(e,t,n,r,i),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(o(166));return Ha(t),null}if(e=Qo(Ho.current),po(t)){r=t.stateNode,n=t.type;var s=t.memoizedProps;switch(r[di]=t,r[fi]=s,e=!!(1&t.mode),n){case"dialog":Fr("cancel",r),Fr("close",r);break;case"iframe":case"object":case"embed":Fr("load",r);break;case"video":case"audio":for(i=0;i<$r.length;i++)Fr($r[i],r);break;case"source":Fr("error",r);break;case"img":case"image":case"link":Fr("error",r),Fr("load",r);break;case"details":Fr("toggle",r);break;case"input":X(r,s),Fr("invalid",r);break;case"select":r._wrapperState={wasMultiple:!!s.multiple},Fr("invalid",r);break;case"textarea":ie(r,s),Fr("invalid",r)}for(var l in be(n,s),i=null,s)if(s.hasOwnProperty(l)){var c=s[l];"children"===l?"string"==typeof c?r.textContent!==c&&(!0!==s.suppressHydrationWarning&&Zr(r.textContent,c,e),i=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(!0!==s.suppressHydrationWarning&&Zr(r.textContent,c,e),i=["children",""+c]):a.hasOwnProperty(l)&&null!=c&&"onScroll"===l&&Fr("scroll",r)}switch(n){case"input":H(r),J(r,s,!0);break;case"textarea":H(r),se(r);break;case"select":case"option":break;default:"function"==typeof s.onClick&&(r.onclick=Jr)}r=i,t.updateQueue=r,null!==r&&(t.flags|=4)}else{l=9===i.nodeType?i:i.ownerDocument,"http://www.w3.org/1999/xhtml"===e&&(e=ae(n)),"http://www.w3.org/1999/xhtml"===e?"script"===n?((e=l.createElement("div")).innerHTML="
diff --git a/frontend/src/views/user/Login.vue b/frontend/src/views/user/Login.vue
index 29ee5c90f..503dd46e5 100644
--- a/frontend/src/views/user/Login.vue
+++ b/frontend/src/views/user/Login.vue
@@ -15,8 +15,11 @@
>
{{ errorMessage }}
+
+
+
configStore.auth.openidConnect)
const hasOpenIdProviders = computed(() => openidConnect.value.enabled && openidConnect.value.providers?.length > 0)
const isLoading = computed(() => authStore.isLoading)
+const isDesktop = isDesktopApp()
const confirmedEmailSuccess = ref(false)
const errorMessage = ref('')
@@ -189,6 +195,7 @@ const validateUsernameField = useDebounceFn(() => {
usernameValid.value = usernameRef.value?.value !== ''
}, 100)
+
const needsTotpPasscode = computed(() => authStore.needsTotpPasscode)
const totpPasscode = ref(null)
From 495f34f60e208234bbec582467b58de3a4bc6af2 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 19:28:29 +0200
Subject: [PATCH 127/156] feat: show close-tab message after OAuth redirect
Show a "You can close this tab now" message after the OAuth
authorize page redirects to the desktop app, instead of leaving
a stale "Authenticating..." message in the browser tab.
---
frontend/src/i18n/lang/en.json | 3 ++-
frontend/src/views/user/OAuthAuthorize.vue | 10 ++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/frontend/src/i18n/lang/en.json b/frontend/src/i18n/lang/en.json
index 3dc16ad5d..4e7459760 100644
--- a/frontend/src/i18n/lang/en.json
+++ b/frontend/src/i18n/lang/en.json
@@ -162,7 +162,8 @@
"tokenCreated": "Here is your new token: {token}",
"wontSeeItAgain": "Write it down or save it securely — you will not be able to see it again.",
"mustUseToken": "You need to create a CalDAV token to use CalDAV with any third-party client. Enter the token in the password field of your client.",
- "usernameIs": "Your username for CalDAV is: {0}"
+ "usernameIs": "Your username for CalDAV is: {0}",
+ "apiTokenHint": "You can also use an API token with CalDAV permission. Create one in {link}."
},
"avatar": {
"title": "Avatar",
diff --git a/frontend/src/views/user/OAuthAuthorize.vue b/frontend/src/views/user/OAuthAuthorize.vue
index 49318d55f..e6973e642 100644
--- a/frontend/src/views/user/OAuthAuthorize.vue
+++ b/frontend/src/views/user/OAuthAuthorize.vue
@@ -6,7 +6,10 @@
>
{{ errorMessage }}
-
+
+ {{ $t('user.auth.oauthRedirectedToApp') }}
+
+
{{ $t('user.auth.authenticating') }}
@@ -28,6 +31,7 @@ const route = useRoute()
const loading = ref(true)
const errorMessage = ref('')
+const redirectedToApp = ref(false)
const requiredParams = [
'response_type',
@@ -65,10 +69,12 @@ async function authorize() {
redirectUrl.searchParams.set('state', state)
}
+ redirectedToApp.value = true
+ loading.value = false
+
window.location.href = redirectUrl.toString()
} catch (e) {
errorMessage.value = getErrorText(e)
- } finally {
loading.value = false
}
}
From 167380a01e1204b99704bad86c2f172267695f1e Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 30 Mar 2026 19:21:50 +0000
Subject: [PATCH 128/156] chore(deps): update dependency
@typescript-eslint/parser to v8.58.0
---
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 130 ++++++++--------------------------------
2 files changed, 26 insertions(+), 106 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index 9c308b87e..fbb71d17b 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -117,7 +117,7 @@
"@types/node": "24.12.0",
"@types/sortablejs": "1.15.9",
"@typescript-eslint/eslint-plugin": "8.58.0",
- "@typescript-eslint/parser": "8.57.2",
+ "@typescript-eslint/parser": "8.58.0",
"@vitejs/plugin-vue": "6.0.5",
"@vue/eslint-config-typescript": "14.7.0",
"@vue/test-utils": "2.4.6",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 2f8ceed91..580888ff4 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -207,16 +207,16 @@ importers:
version: 1.15.9
'@typescript-eslint/eslint-plugin':
specifier: 8.58.0
- version: 8.58.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
+ version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: 8.57.2
- version: 8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
+ specifier: 8.58.0
+ version: 8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
'@vitejs/plugin-vue':
specifier: 6.0.5
version: 6.0.5(vite@7.3.1(@types/node@24.12.0)(jiti@2.4.2)(lightningcss@1.32.0)(sass-embedded@1.98.0)(sass@1.98.0)(terser@5.31.6)(yaml@2.8.3))(vue@3.5.27(typescript@5.9.3))
'@vue/eslint-config-typescript':
specifier: 14.7.0
- version: 14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
+ version: 14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
'@vue/test-utils':
specifier: 2.4.6
version: 2.4.6
@@ -249,7 +249,7 @@ importers:
version: 1.5.0(eslint@9.39.4(jiti@2.4.2))
eslint-plugin-vue:
specifier: 10.8.0
- version: 10.8.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2)))
+ version: 10.8.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2)))
happy-dom:
specifier: 20.8.9
version: 20.8.9
@@ -2704,12 +2704,12 @@ packages:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.57.2':
- resolution: {integrity: sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA==}
+ '@typescript-eslint/parser@8.58.0':
+ resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.0.0'
+ typescript: '>=4.8.4 <6.1.0'
'@typescript-eslint/project-service@8.49.0':
resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==}
@@ -2723,12 +2723,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.57.2':
- resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
-
'@typescript-eslint/project-service@8.58.0':
resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2743,10 +2737,6 @@ packages:
resolution: {integrity: sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/scope-manager@8.57.2':
- resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/scope-manager@8.58.0':
resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2763,18 +2753,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/tsconfig-utils@8.57.1':
- resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
-
- '@typescript-eslint/tsconfig-utils@8.57.2':
- resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
-
'@typescript-eslint/tsconfig-utils@8.58.0':
resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2803,10 +2781,6 @@ packages:
resolution: {integrity: sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/types@8.57.2':
- resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/types@8.58.0':
resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2823,12 +2797,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/typescript-estree@8.57.2':
- resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.0.0'
-
'@typescript-eslint/typescript-estree@8.58.0':
resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2857,10 +2825,6 @@ packages:
resolution: {integrity: sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/visitor-keys@8.57.2':
- resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/visitor-keys@8.58.0':
resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -9303,10 +9267,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
'@typescript-eslint/scope-manager': 8.58.0
'@typescript-eslint/type-utils': 8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
'@typescript-eslint/utils': 8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
@@ -9331,12 +9295,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.57.2
- '@typescript-eslint/types': 8.57.2
- '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.57.2
+ '@typescript-eslint/scope-manager': 8.58.0
+ '@typescript-eslint/types': 8.58.0
+ '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.58.0
debug: 4.4.3
eslint: 9.39.4(jiti@2.4.2)
typescript: 5.9.3
@@ -9345,8 +9309,8 @@ snapshots:
'@typescript-eslint/project-service@8.49.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3)
- '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.58.0
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
@@ -9354,17 +9318,8 @@ snapshots:
'@typescript-eslint/project-service@8.56.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.57.2
- debug: 4.4.3
- typescript: 5.9.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)':
- dependencies:
- '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.57.2
+ '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.58.0
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
@@ -9389,11 +9344,6 @@ snapshots:
'@typescript-eslint/types': 8.56.0
'@typescript-eslint/visitor-keys': 8.56.0
- '@typescript-eslint/scope-manager@8.57.2':
- dependencies:
- '@typescript-eslint/types': 8.57.2
- '@typescript-eslint/visitor-keys': 8.57.2
-
'@typescript-eslint/scope-manager@8.58.0':
dependencies:
'@typescript-eslint/types': 8.58.0
@@ -9407,14 +9357,6 @@ snapshots:
dependencies:
typescript: 5.9.3
- '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)':
- dependencies:
- typescript: 5.9.3
-
- '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)':
- dependencies:
- typescript: 5.9.3
-
'@typescript-eslint/tsconfig-utils@8.58.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
@@ -9426,7 +9368,7 @@ snapshots:
'@typescript-eslint/utils': 8.56.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
debug: 4.4.3
eslint: 9.39.4(jiti@2.4.2)
- ts-api-utils: 2.4.0(typescript@5.9.3)
+ ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -9447,8 +9389,6 @@ snapshots:
'@typescript-eslint/types@8.56.0': {}
- '@typescript-eslint/types@8.57.2': {}
-
'@typescript-eslint/types@8.58.0': {}
'@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)':
@@ -9461,7 +9401,7 @@ snapshots:
minimatch: 10.2.4
semver: 7.7.3
tinyglobby: 0.2.15
- ts-api-utils: 2.4.0(typescript@5.9.3)
+ ts-api-utils: 2.5.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
@@ -9481,21 +9421,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)':
- dependencies:
- '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.57.2
- '@typescript-eslint/visitor-keys': 8.57.2
- debug: 4.4.3
- minimatch: 10.2.4
- semver: 7.7.3
- tinyglobby: 0.2.15
- ts-api-utils: 2.4.0(typescript@5.9.3)
- typescript: 5.9.3
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/typescript-estree@8.58.0(typescript@5.9.3)':
dependencies:
'@typescript-eslint/project-service': 8.58.0(typescript@5.9.3)
@@ -9543,11 +9468,6 @@ snapshots:
'@typescript-eslint/types': 8.56.0
eslint-visitor-keys: 5.0.0
- '@typescript-eslint/visitor-keys@8.57.2':
- dependencies:
- '@typescript-eslint/types': 8.57.2
- eslint-visitor-keys: 5.0.0
-
'@typescript-eslint/visitor-keys@8.58.0':
dependencies:
'@typescript-eslint/types': 8.58.0
@@ -9709,11 +9629,11 @@ snapshots:
'@vue/devtools-shared@8.1.1': {}
- '@vue/eslint-config-typescript@14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
+ '@vue/eslint-config-typescript@14.7.0(eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))))(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)':
dependencies:
'@typescript-eslint/utils': 8.56.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
eslint: 9.39.4(jiti@2.4.2)
- eslint-plugin-vue: 10.8.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2)))
+ eslint-plugin-vue: 10.8.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2)))
fast-glob: 3.3.3
typescript-eslint: 8.56.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
vue-eslint-parser: 10.4.0(eslint@9.39.4(jiti@2.4.2))
@@ -10640,7 +10560,7 @@ snapshots:
module-replacements: 2.11.0
semver: 7.7.3
- eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))):
+ eslint-plugin-vue@10.8.0(@typescript-eslint/parser@8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.4(jiti@2.4.2))(vue-eslint-parser@10.4.0(eslint@9.39.4(jiti@2.4.2))):
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.4.2))
eslint: 9.39.4(jiti@2.4.2)
@@ -10651,7 +10571,7 @@ snapshots:
vue-eslint-parser: 10.4.0(eslint@9.39.4(jiti@2.4.2))
xml-name-validator: 4.0.0
optionalDependencies:
- '@typescript-eslint/parser': 8.57.2(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.58.0(eslint@9.39.4(jiti@2.4.2))(typescript@5.9.3)
eslint-scope@8.4.0:
dependencies:
From 1d354512e6a9c9417276f76239c1210fd51f6d73 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:21:07 +0200
Subject: [PATCH 129/156] feat(plugins): add plugin system interfaces and
manager
Add the core plugin system with four interfaces:
- Plugin: base lifecycle (Name, Version, Init, Shutdown)
- MigrationPlugin: database migrations
- AuthenticatedRouterPlugin: routes behind auth
- UnauthenticatedRouterPlugin: public routes
The Manager handles loading, initialization, shutdown, and route
registration. Includes native .so loader (marked deprecated) and
yaegi loader integration point.
---
go.mod | 1 +
go.sum | 2 ++
pkg/plugins/manager.go | 72 +++++++++++++++++++++++++++++++++++++-----
3 files changed, 67 insertions(+), 8 deletions(-)
diff --git a/go.mod b/go.mod
index d73b11ea1..0508c72dd 100644
--- a/go.mod
+++ b/go.mod
@@ -71,6 +71,7 @@ require (
github.com/stretchr/testify v1.11.1
github.com/swaggo/swag v1.16.6
github.com/tkuchiki/go-timezone v0.2.3
+ github.com/traefik/yaegi v0.16.1
github.com/ulule/limiter/v3 v3.11.2
github.com/wneessen/go-mail v0.7.2
github.com/yuin/goldmark v1.7.16
diff --git a/go.sum b/go.sum
index ca5fe1488..22ac3e398 100644
--- a/go.sum
+++ b/go.sum
@@ -522,6 +522,8 @@ github.com/tj/assert v0.0.3 h1:Df/BlaZ20mq6kuai7f5z2TvPFiwC3xaWJSDQNiIS3Rk=
github.com/tj/assert v0.0.3/go.mod h1:Ne6X72Q+TB1AteidzQncjw9PabbMp4PBMZ1k+vd1Pvk=
github.com/tkuchiki/go-timezone v0.2.3 h1:D3TVdIPrFsu9lxGxqNX2wsZwn1MZtTqTW0mdevMozHc=
github.com/tkuchiki/go-timezone v0.2.3/go.mod h1:oFweWxYl35C/s7HMVZXiA19Jr9Y0qJHMaG/J2TES4LY=
+github.com/traefik/yaegi v0.16.1 h1:f1De3DVJqIDKmnasUF6MwmWv1dSEEat0wcpXhD2On3E=
+github.com/traefik/yaegi v0.16.1/go.mod h1:4eVhbPb3LnD2VigQjhYbEJ69vDRFdT2HQNrXx8eEwUY=
github.com/ulule/limiter/v3 v3.11.2 h1:P4yOrxoEMJbOTfRJR2OzjL90oflzYPPmWg+dvwN2tHA=
github.com/ulule/limiter/v3 v3.11.2/go.mod h1:QG5GnFOCV+k7lrL5Y8kgEeeflPH3+Cviqlqa8SVSQxI=
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
diff --git a/pkg/plugins/manager.go b/pkg/plugins/manager.go
index a704ccb7a..302478243 100644
--- a/pkg/plugins/manager.go
+++ b/pkg/plugins/manager.go
@@ -29,6 +29,18 @@ import (
"github.com/labstack/echo/v5"
)
+// YaegiPluginLoader is a function that loads a plugin from a directory of Go source files.
+// It is set by the yaegi package's init() to avoid an import cycle.
+var YaegiPluginLoader func(dir string) (*LoadedYaegiPlugin, error)
+
+// LoadedYaegiPlugin holds a plugin loaded via Yaegi along with its optional capabilities.
+type LoadedYaegiPlugin struct {
+ Plugin Plugin
+ AuthRouter AuthenticatedRouterPlugin
+ UnauthRouter UnauthenticatedRouterPlugin
+ Migration MigrationPlugin
+}
+
// Manager handles loading and managing plugins.
type Manager struct {
plugins []Plugin
@@ -90,6 +102,7 @@ func RegisterPluginRoutes(authenticated *echo.Group, unauthenticated *echo.Group
}
func (m *Manager) loadPlugins(paths []string) error {
+ loader := config.PluginsLoader.GetString()
for _, p := range paths {
entries, err := os.ReadDir(p)
if err != nil {
@@ -99,19 +112,31 @@ func (m *Manager) loadPlugins(paths []string) error {
return err
}
for _, e := range entries {
- if filepath.Ext(e.Name()) != ".so" {
- continue
- }
full := filepath.Join(p, e.Name())
- if err := m.loadPlugin(full); err != nil {
- log.Errorf("Failed to load plugin %s: %s", e.Name(), err)
+ switch loader {
+ case "native":
+ if filepath.Ext(e.Name()) != ".so" {
+ continue
+ }
+ if err := m.loadNativePlugin(full); err != nil {
+ log.Errorf("Failed to load native plugin %s: %s", e.Name(), err)
+ }
+ case "yaegi":
+ if !e.IsDir() {
+ continue
+ }
+ if err := m.loadYaegiPlugin(full); err != nil {
+ log.Errorf("Failed to load yaegi plugin %s: %s", e.Name(), err)
+ }
}
}
}
return nil
}
-func (m *Manager) loadPlugin(path string) error {
+// Deprecated: native Go plugins are fragile (require exact Go version and dependency
+// match with the host binary) and will be removed in a future version. Use yaegi instead.
+func (m *Manager) loadNativePlugin(path string) error {
pl, err := goplugin.Open(path)
if err != nil {
return err
@@ -125,7 +150,7 @@ func (m *Manager) loadPlugin(path string) error {
return errors.New("invalid plugin entry point")
}
p := newPlugin()
- m.plugins = append(m.plugins, p)
+ m.registerPlugin(p)
if mp, ok := p.(MigrationPlugin); ok {
m.migrationPlugs = append(m.migrationPlugs, mp)
@@ -140,7 +165,38 @@ func (m *Manager) loadPlugin(path string) error {
m.unauthenticatedRouterPlugs = append(m.unauthenticatedRouterPlugs, urp)
}
- log.Infof("Loaded plugin %s", p.Name())
+ return nil
+}
+
+func (m *Manager) loadYaegiPlugin(dir string) error {
+ if YaegiPluginLoader == nil {
+ return errors.New("yaegi plugin loader not registered")
+ }
+
+ loaded, err := YaegiPluginLoader(dir)
+ if err != nil {
+ return err
+ }
+
+ m.registerPlugin(loaded.Plugin)
+
+ if loaded.AuthRouter != nil {
+ m.authenticatedRouterPlugs = append(m.authenticatedRouterPlugs, loaded.AuthRouter)
+ }
+
+ if loaded.UnauthRouter != nil {
+ m.unauthenticatedRouterPlugs = append(m.unauthenticatedRouterPlugs, loaded.UnauthRouter)
+ }
+
+ if loaded.Migration != nil {
+ m.migrationPlugs = append(m.migrationPlugs, loaded.Migration)
+ migration.AddPluginMigrations(loaded.Migration.Migrations())
+ }
return nil
}
+
+func (m *Manager) registerPlugin(p Plugin) {
+ m.plugins = append(m.plugins, p)
+ log.Infof("Loaded plugin %s v%s", p.Name(), p.Version())
+}
From 3db410933efa72a2dda42c2f075ca59c8ff810af Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:21:35 +0200
Subject: [PATCH 130/156] feat(plugins): add plugin config options
Add configuration keys:
- plugins.enabled (default: false)
- plugins.dir (default: /plugins)
- plugins.loader (default: native, validated at startup)
Register yaegi loader via blank import in initialize package.
---
config-raw.json | 5 +++++
pkg/config/config.go | 6 ++++++
pkg/initialize/init.go | 1 +
3 files changed, 12 insertions(+)
diff --git a/config-raw.json b/config-raw.json
index b43345f7b..fabdadbfd 100644
--- a/config-raw.json
+++ b/config-raw.json
@@ -1049,6 +1049,11 @@
"key": "dir",
"default_value": "plugins",
"comment": "The directory where plugins are stored."
+ },
+ {
+ "key": "loader",
+ "default_value": "native",
+ "comment": "The plugin loader to use. \"yaegi\" loads plugins from Go source files (directories of .go files). \"native\" (deprecated) loads compiled Go plugin shared libraries (.so files)."
}
]
}
diff --git a/pkg/config/config.go b/pkg/config/config.go
index f57248242..af529b757 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -230,6 +230,7 @@ const (
PluginsEnabled Key = `plugins.enabled`
PluginsDir Key = `plugins.dir`
+ PluginsLoader Key = `plugins.loader`
)
var maxFileSizeInBytes uint64
@@ -484,6 +485,7 @@ func InitDefaultConfig() {
// Plugins
PluginsEnabled.setDefault(false)
PluginsDir.setDefault(ResolvePath("plugins"))
+ PluginsLoader.setDefault("native")
// Migrate deprecated webhook config keys to outgoingrequests.*
// This allows removing the old keys in a single place later.
@@ -657,6 +659,10 @@ func InitConfig() {
RateLimitStore.Set(KeyvalueType.GetString())
}
+ if loader := PluginsLoader.GetString(); loader != "yaegi" && loader != "native" {
+ log.Fatalf("Invalid value for plugins.loader: %q (must be \"yaegi\" or \"native\")", loader)
+ }
+
if CorsEnable.GetBool() && ServicePublicURL.GetString() == "" {
log.Fatalf("service.publicurl is required when cors.enable is true")
}
diff --git a/pkg/initialize/init.go b/pkg/initialize/init.go
index a614da182..7c70609ce 100644
--- a/pkg/initialize/init.go
+++ b/pkg/initialize/init.go
@@ -34,6 +34,7 @@ import (
"code.vikunja.io/api/pkg/modules/keyvalue"
migrationHandler "code.vikunja.io/api/pkg/modules/migration/handler"
"code.vikunja.io/api/pkg/plugins"
+ _ "code.vikunja.io/api/pkg/plugins/yaegi" // register yaegi plugin loader
"code.vikunja.io/api/pkg/red"
"code.vikunja.io/api/pkg/user"
)
From 8771059a7a9067a7d8e0a9216604120f506a3de3 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:21:42 +0200
Subject: [PATCH 131/156] feat(plugins): extract vikunja package symbols for
yaegi
Generated symbol tables exposing vikunja internals to the yaegi
interpreter: models, events, db, user, log, and plugins packages.
---
pkg/yaegi_symbols/symbols.go | 8 +
pkg/yaegi_symbols/vikunja_db.go | 37 ++
pkg/yaegi_symbols/vikunja_events.go | 49 +++
pkg/yaegi_symbols/vikunja_log.go | 40 +++
pkg/yaegi_symbols/vikunja_models.go | 516 +++++++++++++++++++++++++++
pkg/yaegi_symbols/vikunja_plugins.go | 118 ++++++
pkg/yaegi_symbols/vikunja_user.go | 178 +++++++++
7 files changed, 946 insertions(+)
create mode 100644 pkg/yaegi_symbols/symbols.go
create mode 100644 pkg/yaegi_symbols/vikunja_db.go
create mode 100644 pkg/yaegi_symbols/vikunja_events.go
create mode 100644 pkg/yaegi_symbols/vikunja_log.go
create mode 100644 pkg/yaegi_symbols/vikunja_models.go
create mode 100644 pkg/yaegi_symbols/vikunja_plugins.go
create mode 100644 pkg/yaegi_symbols/vikunja_user.go
diff --git a/pkg/yaegi_symbols/symbols.go b/pkg/yaegi_symbols/symbols.go
new file mode 100644
index 000000000..49d1e2a76
--- /dev/null
+++ b/pkg/yaegi_symbols/symbols.go
@@ -0,0 +1,8 @@
+// Code generated by yaegi extract. DO NOT EDIT.
+
+package yaegi_symbols
+
+import "reflect"
+
+// Symbols contains all Vikunja and third-party symbols for use with yaegi's Use() method.
+var Symbols = map[string]map[string]reflect.Value{}
diff --git a/pkg/yaegi_symbols/vikunja_db.go b/pkg/yaegi_symbols/vikunja_db.go
new file mode 100644
index 000000000..560508a11
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_db.go
@@ -0,0 +1,37 @@
+// Code generated by 'yaegi extract code.vikunja.io/api/pkg/db'. DO NOT EDIT.
+
+package yaegi_symbols
+
+import (
+ "reflect"
+
+ "code.vikunja.io/api/pkg/db"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/db/db"] = map[string]reflect.Value{
+ "AssertCount": reflect.ValueOf(db.AssertCount),
+ "AssertExists": reflect.ValueOf(db.AssertExists),
+ "AssertMissing": reflect.ValueOf(db.AssertMissing),
+ "CreateDBEngine": reflect.ValueOf(db.CreateDBEngine),
+ "CreateParadeDBIndexes": reflect.ValueOf(db.CreateParadeDBIndexes),
+ "CreateTestEngine": reflect.ValueOf(db.CreateTestEngine),
+ "Dump": reflect.ValueOf(db.Dump),
+ "GetDialect": reflect.ValueOf(db.GetDialect),
+ "ILIKE": reflect.ValueOf(db.ILIKE),
+ "InitFixtures": reflect.ValueOf(db.InitFixtures),
+ "InitTestFixtures": reflect.ValueOf(db.InitTestFixtures),
+ "IsMySQLDuplicateEntryError": reflect.ValueOf(db.IsMySQLDuplicateEntryError),
+ "IsUniqueConstraintError": reflect.ValueOf(db.IsUniqueConstraintError),
+ "LoadAndAssertFixtures": reflect.ValueOf(db.LoadAndAssertFixtures),
+ "LoadFixtures": reflect.ValueOf(db.LoadFixtures),
+ "MultiFieldSearch": reflect.ValueOf(db.MultiFieldSearch),
+ "MultiFieldSearchWithTableAlias": reflect.ValueOf(db.MultiFieldSearchWithTableAlias),
+ "NewSession": reflect.ValueOf(db.NewSession),
+ "ParadeDBAvailable": reflect.ValueOf(db.ParadeDBAvailable),
+ "Restore": reflect.ValueOf(db.Restore),
+ "RestoreAndTruncate": reflect.ValueOf(db.RestoreAndTruncate),
+ "Type": reflect.ValueOf(db.Type),
+ "WipeEverything": reflect.ValueOf(db.WipeEverything),
+ }
+}
diff --git a/pkg/yaegi_symbols/vikunja_events.go b/pkg/yaegi_symbols/vikunja_events.go
new file mode 100644
index 000000000..24ed6c845
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_events.go
@@ -0,0 +1,49 @@
+// Code generated by 'yaegi extract code.vikunja.io/api/pkg/events'. DO NOT EDIT.
+
+package yaegi_symbols
+
+import (
+ "reflect"
+
+ "code.vikunja.io/api/pkg/events"
+ "github.com/ThreeDotsLabs/watermill/message"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/events/events"] = map[string]reflect.Value{
+ "AssertDispatched": reflect.ValueOf(events.AssertDispatched),
+ "ClearDispatchedEvents": reflect.ValueOf(events.ClearDispatchedEvents),
+ "CountDispatchedEvents": reflect.ValueOf(events.CountDispatchedEvents),
+ "Dispatch": reflect.ValueOf(events.Dispatch),
+ "Fake": reflect.ValueOf(events.Fake),
+ "InitEvents": reflect.ValueOf(events.InitEvents),
+ "RegisterListener": reflect.ValueOf(events.RegisterListener),
+ "TestListener": reflect.ValueOf(events.TestListener),
+
+ // type definitions
+ "Event": reflect.ValueOf((*events.Event)(nil)),
+ "Listener": reflect.ValueOf((*events.Listener)(nil)),
+
+ // interface wrapper definitions
+ "_Event": reflect.ValueOf((*_code_vikunja_io_api_pkg_events_Event)(nil)),
+ "_Listener": reflect.ValueOf((*_code_vikunja_io_api_pkg_events_Listener)(nil)),
+ }
+}
+
+type _code_vikunja_io_api_pkg_events_Event struct {
+ IValue interface{}
+ WName func() string
+}
+
+func (W _code_vikunja_io_api_pkg_events_Event) Name() string { return W.WName() }
+
+type _code_vikunja_io_api_pkg_events_Listener struct {
+ IValue interface{}
+ WHandle func(msg *message.Message) error
+ WName func() string
+}
+
+func (W _code_vikunja_io_api_pkg_events_Listener) Handle(msg *message.Message) error {
+ return W.WHandle(msg)
+}
+func (W _code_vikunja_io_api_pkg_events_Listener) Name() string { return W.WName() }
diff --git a/pkg/yaegi_symbols/vikunja_log.go b/pkg/yaegi_symbols/vikunja_log.go
new file mode 100644
index 000000000..60f9fc192
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_log.go
@@ -0,0 +1,40 @@
+// Code generated by 'yaegi extract code.vikunja.io/api/pkg/log'. DO NOT EDIT.
+
+package yaegi_symbols
+
+import (
+ "reflect"
+
+ "code.vikunja.io/api/pkg/log"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/log/log"] = map[string]reflect.Value{
+ "ConfigureStandardLogger": reflect.ValueOf(log.ConfigureStandardLogger),
+ "Critical": reflect.ValueOf(log.Critical),
+ "Criticalf": reflect.ValueOf(log.Criticalf),
+ "Debug": reflect.ValueOf(log.Debug),
+ "Debugf": reflect.ValueOf(log.Debugf),
+ "Error": reflect.ValueOf(log.Error),
+ "Errorf": reflect.ValueOf(log.Errorf),
+ "Fatal": reflect.ValueOf(log.Fatal),
+ "Fatalf": reflect.ValueOf(log.Fatalf),
+ "GetLogger": reflect.ValueOf(log.GetLogger),
+ "Info": reflect.ValueOf(log.Info),
+ "Infof": reflect.ValueOf(log.Infof),
+ "InitLogger": reflect.ValueOf(log.InitLogger),
+ "NewEchoLogger": reflect.ValueOf(log.NewEchoLogger),
+ "NewHTTPLogger": reflect.ValueOf(log.NewHTTPLogger),
+ "NewMailLogger": reflect.ValueOf(log.NewMailLogger),
+ "NewWatermillLogger": reflect.ValueOf(log.NewWatermillLogger),
+ "NewXormLogger": reflect.ValueOf(log.NewXormLogger),
+ "Warning": reflect.ValueOf(log.Warning),
+ "Warningf": reflect.ValueOf(log.Warningf),
+
+ // type definitions
+ "MailLogger": reflect.ValueOf((*log.MailLogger)(nil)),
+ "NoopBackend": reflect.ValueOf((*log.NoopBackend)(nil)),
+ "WatermillLogger": reflect.ValueOf((*log.WatermillLogger)(nil)),
+ "XormLogger": reflect.ValueOf((*log.XormLogger)(nil)),
+ }
+}
diff --git a/pkg/yaegi_symbols/vikunja_models.go b/pkg/yaegi_symbols/vikunja_models.go
new file mode 100644
index 000000000..ab731b285
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_models.go
@@ -0,0 +1,516 @@
+package yaegi_symbols
+
+import (
+ "code.vikunja.io/api/pkg/models"
+ "go/constant"
+ "go/token"
+ "reflect"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/models/models"] = map[string]reflect.Value{
+ // function, constant and variable definitions
+ "APITokenPrefix": reflect.ValueOf(constant.MakeFromLiteral("\"tk_\"", token.STRING, 0)),
+ "BucketConfigurationModeFilter": reflect.ValueOf(models.BucketConfigurationModeFilter),
+ "BucketConfigurationModeManual": reflect.ValueOf(models.BucketConfigurationModeManual),
+ "BucketConfigurationModeNone": reflect.ValueOf(models.BucketConfigurationModeNone),
+ "CanDoAPIRoute": reflect.ValueOf(models.CanDoAPIRoute),
+ "CollectRoutesForAPITokenUsage": reflect.ValueOf(models.CollectRoutesForAPITokenUsage),
+ "CreateDefaultViewsForProject": reflect.ValueOf(models.CreateDefaultViewsForProject),
+ "CreateNewProjectForUser": reflect.ValueOf(models.CreateNewProjectForUser),
+ "CreateProject": reflect.ValueOf(models.CreateProject),
+ "CreateSession": reflect.ValueOf(models.CreateSession),
+ "DeleteAllUserSessions": reflect.ValueOf(models.DeleteAllUserSessions),
+ "DeleteOrphanedTaskPositions": reflect.ValueOf(models.DeleteOrphanedTaskPositions),
+ "DeleteUser": reflect.ValueOf(models.DeleteUser),
+ "ErrCodeAPITokenInvalid": reflect.ValueOf(constant.MakeFromLiteral("14001", token.INT, 0)),
+ "ErrCodeAttachmentDoesNotBelongToTask": reflect.ValueOf(constant.MakeFromLiteral("4020", token.INT, 0)),
+ "ErrCodeBucketDoesNotBelongToProject": reflect.ValueOf(constant.MakeFromLiteral("10002", token.INT, 0)),
+ "ErrCodeBucketDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("10001", token.INT, 0)),
+ "ErrCodeBucketLimitExceeded": reflect.ValueOf(constant.MakeFromLiteral("10004", token.INT, 0)),
+ "ErrCodeBulkTasksMustBeInSameProject": reflect.ValueOf(constant.MakeFromLiteral("4003", token.INT, 0)),
+ "ErrCodeBulkTasksNeedAtLeastOne": reflect.ValueOf(constant.MakeFromLiteral("4004", token.INT, 0)),
+ "ErrCodeCannotArchiveDefaultProject": reflect.ValueOf(constant.MakeFromLiteral("3013", token.INT, 0)),
+ "ErrCodeCannotDeleteDefaultProject": reflect.ValueOf(constant.MakeFromLiteral("3012", token.INT, 0)),
+ "ErrCodeCannotDeleteLastTeamMember": reflect.ValueOf(constant.MakeFromLiteral("6006", token.INT, 0)),
+ "ErrCodeCannotLeaveExternalTeam": reflect.ValueOf(constant.MakeFromLiteral("6010", token.INT, 0)),
+ "ErrCodeCannotRemoveLastBucket": reflect.ValueOf(constant.MakeFromLiteral("10003", token.INT, 0)),
+ "ErrCodeIDCannotBeZero": reflect.ValueOf(constant.MakeFromLiteral("2001", token.INT, 0)),
+ "ErrCodeInvalidAPITokenPermission": reflect.ValueOf(constant.MakeFromLiteral("14002", token.INT, 0)),
+ "ErrCodeInvalidData": reflect.ValueOf(constant.MakeFromLiteral("2002", token.INT, 0)),
+ "ErrCodeInvalidFilterExpression": reflect.ValueOf(constant.MakeFromLiteral("4024", token.INT, 0)),
+ "ErrCodeInvalidModel": reflect.ValueOf(constant.MakeFromLiteral("2004", token.INT, 0)),
+ "ErrCodeInvalidReactionEntityKind": reflect.ValueOf(constant.MakeFromLiteral("4025", token.INT, 0)),
+ "ErrCodeInvalidRelationKind": reflect.ValueOf(constant.MakeFromLiteral("4007", token.INT, 0)),
+ "ErrCodeInvalidRight": reflect.ValueOf(constant.MakeFromLiteral("9001", token.INT, 0)),
+ "ErrCodeInvalidSortOrder": reflect.ValueOf(constant.MakeFromLiteral("4014", token.INT, 0)),
+ "ErrCodeInvalidSortParam": reflect.ValueOf(constant.MakeFromLiteral("4013", token.INT, 0)),
+ "ErrCodeInvalidTaskColumn": reflect.ValueOf(constant.MakeFromLiteral("4027", token.INT, 0)),
+ "ErrCodeInvalidTaskField": reflect.ValueOf(constant.MakeFromLiteral("4016", token.INT, 0)),
+ "ErrCodeInvalidTaskFilterComparator": reflect.ValueOf(constant.MakeFromLiteral("4017", token.INT, 0)),
+ "ErrCodeInvalidTaskFilterConcatinator": reflect.ValueOf(constant.MakeFromLiteral("4018", token.INT, 0)),
+ "ErrCodeInvalidTaskFilterValue": reflect.ValueOf(constant.MakeFromLiteral("4019", token.INT, 0)),
+ "ErrCodeInvalidTimezone": reflect.ValueOf(constant.MakeFromLiteral("2003", token.INT, 0)),
+ "ErrCodeLabelDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("8002", token.INT, 0)),
+ "ErrCodeLabelIsAlreadyOnTask": reflect.ValueOf(constant.MakeFromLiteral("8001", token.INT, 0)),
+ "ErrCodeLinkSharePasswordInvalid": reflect.ValueOf(constant.MakeFromLiteral("13002", token.INT, 0)),
+ "ErrCodeLinkSharePasswordRequired": reflect.ValueOf(constant.MakeFromLiteral("13001", token.INT, 0)),
+ "ErrCodeLinkShareTokenInvalid": reflect.ValueOf(constant.MakeFromLiteral("13003", token.INT, 0)),
+ "ErrCodeMustHaveProjectViewToSortByPosition": reflect.ValueOf(constant.MakeFromLiteral("4026", token.INT, 0)),
+ "ErrCodeMustProvideUser": reflect.ValueOf(constant.MakeFromLiteral("12003", token.INT, 0)),
+ "ErrCodeNeedToHaveProjectReadAccess": reflect.ValueOf(constant.MakeFromLiteral("3004", token.INT, 0)),
+ "ErrCodeNeedsFullRecalculation": reflect.ValueOf(constant.MakeFromLiteral("4028", token.INT, 0)),
+ "ErrCodeNoRightToSeeTask": reflect.ValueOf(constant.MakeFromLiteral("4005", token.INT, 0)),
+ "ErrCodeOIDCTeamDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("6008", token.INT, 0)),
+ "ErrCodeOIDCTeamsDoNotExistForUser": reflect.ValueOf(constant.MakeFromLiteral("6009", token.INT, 0)),
+ "ErrCodeOnlyOneDoneBucketPerProject": reflect.ValueOf(constant.MakeFromLiteral("10005", token.INT, 0)),
+ "ErrCodeOpenIDError": reflect.ValueOf(constant.MakeFromLiteral("15001", token.INT, 0)),
+ "ErrCodeParentTaskCannotBeTheSame": reflect.ValueOf(constant.MakeFromLiteral("4006", token.INT, 0)),
+ "ErrCodeProjectCannotBeChildOfItself": reflect.ValueOf(constant.MakeFromLiteral("3010", token.INT, 0)),
+ "ErrCodeProjectCannotBelongToAPseudoParentProject": reflect.ValueOf(constant.MakeFromLiteral("3009", token.INT, 0)),
+ "ErrCodeProjectCannotHaveACyclicRelationship": reflect.ValueOf(constant.MakeFromLiteral("3011", token.INT, 0)),
+ "ErrCodeProjectDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("3001", token.INT, 0)),
+ "ErrCodeProjectIdentifierIsNotUnique": reflect.ValueOf(constant.MakeFromLiteral("3007", token.INT, 0)),
+ "ErrCodeProjectIsArchived": reflect.ValueOf(constant.MakeFromLiteral("3008", token.INT, 0)),
+ "ErrCodeProjectShareDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("3006", token.INT, 0)),
+ "ErrCodeProjectTitleCannotBeEmpty": reflect.ValueOf(constant.MakeFromLiteral("3005", token.INT, 0)),
+ "ErrCodeProjectViewDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("3014", token.INT, 0)),
+ "ErrCodeRelationAlreadyExists": reflect.ValueOf(constant.MakeFromLiteral("4008", token.INT, 0)),
+ "ErrCodeRelationDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("4009", token.INT, 0)),
+ "ErrCodeRelationTasksCannotBeTheSame": reflect.ValueOf(constant.MakeFromLiteral("4010", token.INT, 0)),
+ "ErrCodeReminderRelativeToMissing": reflect.ValueOf(constant.MakeFromLiteral("4022", token.INT, 0)),
+ "ErrCodeSavedFilterDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("11001", token.INT, 0)),
+ "ErrCodeSavedFilterNotAvailableForLinkShare": reflect.ValueOf(constant.MakeFromLiteral("11002", token.INT, 0)),
+ "ErrCodeSessionNotFound": reflect.ValueOf(constant.MakeFromLiteral("16001", token.INT, 0)),
+ "ErrCodeSubscriptionAlreadyExists": reflect.ValueOf(constant.MakeFromLiteral("12002", token.INT, 0)),
+ "ErrCodeTaskAlreadyExistsInBucket": reflect.ValueOf(constant.MakeFromLiteral("10006", token.INT, 0)),
+ "ErrCodeTaskAttachmentDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("4011", token.INT, 0)),
+ "ErrCodeTaskAttachmentIsTooLarge": reflect.ValueOf(constant.MakeFromLiteral("4012", token.INT, 0)),
+ "ErrCodeTaskCannotBeEmpty": reflect.ValueOf(constant.MakeFromLiteral("4001", token.INT, 0)),
+ "ErrCodeTaskCommentDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("4015", token.INT, 0)),
+ "ErrCodeTaskDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("4002", token.INT, 0)),
+ "ErrCodeTaskRelationCycle": reflect.ValueOf(constant.MakeFromLiteral("4023", token.INT, 0)),
+ "ErrCodeTeamAlreadyHasAccess": reflect.ValueOf(constant.MakeFromLiteral("6004", token.INT, 0)),
+ "ErrCodeTeamDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("6002", token.INT, 0)),
+ "ErrCodeTeamDoesNotHaveAccessToProject": reflect.ValueOf(constant.MakeFromLiteral("6007", token.INT, 0)),
+ "ErrCodeTeamNameCannotBeEmpty": reflect.ValueOf(constant.MakeFromLiteral("6001", token.INT, 0)),
+ "ErrCodeUnknownSubscriptionEntityType": reflect.ValueOf(constant.MakeFromLiteral("12001", token.INT, 0)),
+ "ErrCodeUserAlreadyAssigned": reflect.ValueOf(constant.MakeFromLiteral("4021", token.INT, 0)),
+ "ErrCodeUserAlreadyHasAccess": reflect.ValueOf(constant.MakeFromLiteral("7002", token.INT, 0)),
+ "ErrCodeUserDoesNotHaveAccessToProject": reflect.ValueOf(constant.MakeFromLiteral("7003", token.INT, 0)),
+ "ErrCodeUserHasNoAccessToLabel": reflect.ValueOf(constant.MakeFromLiteral("8003", token.INT, 0)),
+ "ErrCodeUserIsMemberOfTeam": reflect.ValueOf(constant.MakeFromLiteral("6005", token.INT, 0)),
+ "ErrorCodeGenericForbidden": reflect.ValueOf(constant.MakeFromLiteral("1", token.INT, 0)),
+ "ExportUserData": reflect.ValueOf(models.ExportUserData),
+ "FavoriteKindProject": reflect.ValueOf(models.FavoriteKindProject),
+ "FavoriteKindTask": reflect.ValueOf(models.FavoriteKindTask),
+ "FavoriteKindUnknown": reflect.ValueOf(models.FavoriteKindUnknown),
+ "FavoritesPseudoProject": reflect.ValueOf(&models.FavoritesPseudoProject).Elem(),
+ "FavoritesPseudoProjectID": reflect.ValueOf(constant.MakeFromLiteral("-1", token.INT, 0)),
+ "FindMentionedUsersInText": reflect.ValueOf(models.FindMentionedUsersInText),
+ "GetAPITokenByID": reflect.ValueOf(models.GetAPITokenByID),
+ "GetAllParentProjects": reflect.ValueOf(models.GetAllParentProjects),
+ "GetAvailableAPIRoutesForToken": reflect.ValueOf(models.GetAvailableAPIRoutesForToken),
+ "GetAvailableWebhookEvents": reflect.ValueOf(models.GetAvailableWebhookEvents),
+ "GetLabelSimple": reflect.ValueOf(models.GetLabelSimple),
+ "GetLabelsByTaskIDs": reflect.ValueOf(models.GetLabelsByTaskIDs),
+ "GetLinkShareByHash": reflect.ValueOf(models.GetLinkShareByHash),
+ "GetLinkShareByID": reflect.ValueOf(models.GetLinkShareByID),
+ "GetLinkShareFromClaims": reflect.ValueOf(models.GetLinkShareFromClaims),
+ "GetLinkSharesByIDs": reflect.ValueOf(models.GetLinkSharesByIDs),
+ "GetPreviewSizeFromString": reflect.ValueOf(models.GetPreviewSizeFromString),
+ "GetProjectByShareHash": reflect.ValueOf(models.GetProjectByShareHash),
+ "GetProjectSimpleByID": reflect.ValueOf(models.GetProjectSimpleByID),
+ "GetProjectSimpleByTaskID": reflect.ValueOf(models.GetProjectSimpleByTaskID),
+ "GetProjectViewByID": reflect.ValueOf(models.GetProjectViewByID),
+ "GetProjectViewByIDAndProject": reflect.ValueOf(models.GetProjectViewByIDAndProject),
+ "GetProjectsByIDs": reflect.ValueOf(models.GetProjectsByIDs),
+ "GetProjectsMapByIDs": reflect.ValueOf(models.GetProjectsMapByIDs),
+ "GetProjectsMapSimpleByTaskIDs": reflect.ValueOf(models.GetProjectsMapSimpleByTaskIDs),
+ "GetProjectsSimpleByTaskIDs": reflect.ValueOf(models.GetProjectsSimpleByTaskIDs),
+ "GetSavedFilterIDFromProjectID": reflect.ValueOf(models.GetSavedFilterIDFromProjectID),
+ "GetSavedFilterSimpleByID": reflect.ValueOf(models.GetSavedFilterSimpleByID),
+ "GetSessionByID": reflect.ValueOf(models.GetSessionByID),
+ "GetSessionByRefreshToken": reflect.ValueOf(models.GetSessionByRefreshToken),
+ "GetSubscriptionForUser": reflect.ValueOf(models.GetSubscriptionForUser),
+ "GetSubscriptionsForEntities": reflect.ValueOf(models.GetSubscriptionsForEntities),
+ "GetSubscriptionsForEntitiesAndUser": reflect.ValueOf(models.GetSubscriptionsForEntitiesAndUser),
+ "GetSubscriptionsForEntity": reflect.ValueOf(models.GetSubscriptionsForEntity),
+ "GetTables": reflect.ValueOf(models.GetTables),
+ "GetTaskByIDSimple": reflect.ValueOf(models.GetTaskByIDSimple),
+ "GetTaskSimple": reflect.ValueOf(models.GetTaskSimple),
+ "GetTaskSimpleByUUID": reflect.ValueOf(models.GetTaskSimpleByUUID),
+ "GetTasksByUIDs": reflect.ValueOf(models.GetTasksByUIDs),
+ "GetTasksInBucketsForView": reflect.ValueOf(models.GetTasksInBucketsForView),
+ "GetTasksSimpleByIDs": reflect.ValueOf(models.GetTasksSimpleByIDs),
+ "GetTeamByExternalIDAndIssuer": reflect.ValueOf(models.GetTeamByExternalIDAndIssuer),
+ "GetTeamByID": reflect.ValueOf(models.GetTeamByID),
+ "GetTokenFromTokenString": reflect.ValueOf(models.GetTokenFromTokenString),
+ "GetTotalCount": reflect.ValueOf(models.GetTotalCount),
+ "GetUnsplashPhotoByFileID": reflect.ValueOf(models.GetUnsplashPhotoByFileID),
+ "GetUserDirectedWebhookEvents": reflect.ValueOf(models.GetUserDirectedWebhookEvents),
+ "GetUserOrLinkShareUser": reflect.ValueOf(models.GetUserOrLinkShareUser),
+ "HashSessionToken": reflect.ValueOf(models.HashSessionToken),
+ "HashToken": reflect.ValueOf(models.HashToken),
+ "InvalidFieldError": reflect.ValueOf(models.InvalidFieldError),
+ "InvalidFieldErrorWithMessage": reflect.ValueOf(models.InvalidFieldErrorWithMessage),
+ "IsErrAPITokenInvalid": reflect.ValueOf(models.IsErrAPITokenInvalid),
+ "IsErrAttachmentAndCoverMustBelongToTheSameTask": reflect.ValueOf(models.IsErrAttachmentAndCoverMustBelongToTheSameTask),
+ "IsErrBucketDoesNotBelongToProject": reflect.ValueOf(models.IsErrBucketDoesNotBelongToProject),
+ "IsErrBucketDoesNotExist": reflect.ValueOf(models.IsErrBucketDoesNotExist),
+ "IsErrBucketLimitExceeded": reflect.ValueOf(models.IsErrBucketLimitExceeded),
+ "IsErrBulkTasksMustBeInSameProject": reflect.ValueOf(models.IsErrBulkTasksMustBeInSameProject),
+ "IsErrBulkTasksNeedAtLeastOne": reflect.ValueOf(models.IsErrBulkTasksNeedAtLeastOne),
+ "IsErrCannotArchiveDefaultProject": reflect.ValueOf(models.IsErrCannotArchiveDefaultProject),
+ "IsErrCannotDeleteDefaultProject": reflect.ValueOf(models.IsErrCannotDeleteDefaultProject),
+ "IsErrCannotDeleteLastTeamMember": reflect.ValueOf(models.IsErrCannotDeleteLastTeamMember),
+ "IsErrCannotRemoveLastBucket": reflect.ValueOf(models.IsErrCannotRemoveLastBucket),
+ "IsErrExternalTeamDoesNotExist": reflect.ValueOf(models.IsErrExternalTeamDoesNotExist),
+ "IsErrGenericForbidden": reflect.ValueOf(models.IsErrGenericForbidden),
+ "IsErrIDCannotBeZero": reflect.ValueOf(models.IsErrIDCannotBeZero),
+ "IsErrInvalidAPITokenPermission": reflect.ValueOf(models.IsErrInvalidAPITokenPermission),
+ "IsErrInvalidData": reflect.ValueOf(models.IsErrInvalidData),
+ "IsErrInvalidFilterExpression": reflect.ValueOf(models.IsErrInvalidFilterExpression),
+ "IsErrInvalidModel": reflect.ValueOf(models.IsErrInvalidModel),
+ "IsErrInvalidPermission": reflect.ValueOf(models.IsErrInvalidPermission),
+ "IsErrInvalidReactionEntityKind": reflect.ValueOf(models.IsErrInvalidReactionEntityKind),
+ "IsErrInvalidRelationKind": reflect.ValueOf(models.IsErrInvalidRelationKind),
+ "IsErrInvalidSortOrder": reflect.ValueOf(models.IsErrInvalidSortOrder),
+ "IsErrInvalidSortParam": reflect.ValueOf(models.IsErrInvalidSortParam),
+ "IsErrInvalidTaskColumn": reflect.ValueOf(models.IsErrInvalidTaskColumn),
+ "IsErrInvalidTaskField": reflect.ValueOf(models.IsErrInvalidTaskField),
+ "IsErrInvalidTaskFilterComparator": reflect.ValueOf(models.IsErrInvalidTaskFilterComparator),
+ "IsErrInvalidTaskFilterConcatinator": reflect.ValueOf(models.IsErrInvalidTaskFilterConcatinator),
+ "IsErrInvalidTaskFilterValue": reflect.ValueOf(models.IsErrInvalidTaskFilterValue),
+ "IsErrInvalidTimezone": reflect.ValueOf(models.IsErrInvalidTimezone),
+ "IsErrLabelDoesNotExist": reflect.ValueOf(models.IsErrLabelDoesNotExist),
+ "IsErrLabelIsAlreadyOnTask": reflect.ValueOf(models.IsErrLabelIsAlreadyOnTask),
+ "IsErrLinkSharePasswordInvalid": reflect.ValueOf(models.IsErrLinkSharePasswordInvalid),
+ "IsErrLinkSharePasswordRequired": reflect.ValueOf(models.IsErrLinkSharePasswordRequired),
+ "IsErrLinkShareTokenInvalid": reflect.ValueOf(models.IsErrLinkShareTokenInvalid),
+ "IsErrMustProvideUser": reflect.ValueOf(models.IsErrMustProvideUser),
+ "IsErrNeedToHaveProjectReadAccess": reflect.ValueOf(models.IsErrNeedToHaveProjectReadAccess),
+ "IsErrNeedsFullRecalculation": reflect.ValueOf(models.IsErrNeedsFullRecalculation),
+ "IsErrNoPermissionToSeeTask": reflect.ValueOf(models.IsErrNoPermissionToSeeTask),
+ "IsErrOIDCTeamsDoNotExistForUser": reflect.ValueOf(models.IsErrOIDCTeamsDoNotExistForUser),
+ "IsErrOnlyOneDoneBucketPerProject": reflect.ValueOf(models.IsErrOnlyOneDoneBucketPerProject),
+ "IsErrParentTaskCannotBeTheSame": reflect.ValueOf(models.IsErrParentTaskCannotBeTheSame),
+ "IsErrProjectCannotBeChildOfItsOwn": reflect.ValueOf(models.IsErrProjectCannotBeChildOfItsOwn),
+ "IsErrProjectCannotBelongToAPseudoParentProject": reflect.ValueOf(models.IsErrProjectCannotBelongToAPseudoParentProject),
+ "IsErrProjectCannotHaveACyclicRelationship": reflect.ValueOf(models.IsErrProjectCannotHaveACyclicRelationship),
+ "IsErrProjectDoesNotExist": reflect.ValueOf(models.IsErrProjectDoesNotExist),
+ "IsErrProjectIdentifierIsNotUnique": reflect.ValueOf(models.IsErrProjectIdentifierIsNotUnique),
+ "IsErrProjectIsArchived": reflect.ValueOf(models.IsErrProjectIsArchived),
+ "IsErrProjectShareDoesNotExist": reflect.ValueOf(models.IsErrProjectShareDoesNotExist),
+ "IsErrProjectTitleCannotBeEmpty": reflect.ValueOf(models.IsErrProjectTitleCannotBeEmpty),
+ "IsErrProjectViewDoesNotExist": reflect.ValueOf(models.IsErrProjectViewDoesNotExist),
+ "IsErrRelationAlreadyExists": reflect.ValueOf(models.IsErrRelationAlreadyExists),
+ "IsErrRelationDoesNotExist": reflect.ValueOf(models.IsErrRelationDoesNotExist),
+ "IsErrRelationTasksCannotBeTheSame": reflect.ValueOf(models.IsErrRelationTasksCannotBeTheSame),
+ "IsErrReminderRelativeToMissing": reflect.ValueOf(models.IsErrReminderRelativeToMissing),
+ "IsErrSavedFilterDoesNotExist": reflect.ValueOf(models.IsErrSavedFilterDoesNotExist),
+ "IsErrSavedFilterNotAvailableForLinkShare": reflect.ValueOf(models.IsErrSavedFilterNotAvailableForLinkShare),
+ "IsErrSessionNotFound": reflect.ValueOf(models.IsErrSessionNotFound),
+ "IsErrSubscriptionAlreadyExists": reflect.ValueOf(models.IsErrSubscriptionAlreadyExists),
+ "IsErrTaskAlreadyExistsInBucket": reflect.ValueOf(models.IsErrTaskAlreadyExistsInBucket),
+ "IsErrTaskAttachmentDoesNotExist": reflect.ValueOf(models.IsErrTaskAttachmentDoesNotExist),
+ "IsErrTaskAttachmentIsTooLarge": reflect.ValueOf(models.IsErrTaskAttachmentIsTooLarge),
+ "IsErrTaskCannotBeEmpty": reflect.ValueOf(models.IsErrTaskCannotBeEmpty),
+ "IsErrTaskCommentDoesNotExist": reflect.ValueOf(models.IsErrTaskCommentDoesNotExist),
+ "IsErrTaskDoesNotExist": reflect.ValueOf(models.IsErrTaskDoesNotExist),
+ "IsErrTaskRelationCycle": reflect.ValueOf(models.IsErrTaskRelationCycle),
+ "IsErrTeamAlreadyHasAccess": reflect.ValueOf(models.IsErrTeamAlreadyHasAccess),
+ "IsErrTeamDoesNotExist": reflect.ValueOf(models.IsErrTeamDoesNotExist),
+ "IsErrTeamDoesNotHaveAccessToProject": reflect.ValueOf(models.IsErrTeamDoesNotHaveAccessToProject),
+ "IsErrTeamNameCannotBeEmpty": reflect.ValueOf(models.IsErrTeamNameCannotBeEmpty),
+ "IsErrUnknownSubscriptionEntityType": reflect.ValueOf(models.IsErrUnknownSubscriptionEntityType),
+ "IsErrUserAlreadyAssigned": reflect.ValueOf(models.IsErrUserAlreadyAssigned),
+ "IsErrUserAlreadyHasAccess": reflect.ValueOf(models.IsErrUserAlreadyHasAccess),
+ "IsErrUserDoesNotHaveAccessToProject": reflect.ValueOf(models.IsErrUserDoesNotHaveAccessToProject),
+ "IsErrUserHasNoAccessToLabel": reflect.ValueOf(models.IsErrUserHasNoAccessToLabel),
+ "IsErrUserIsMemberOfTeam": reflect.ValueOf(models.IsErrUserIsMemberOfTeam),
+ "IsUserDirectedEvent": reflect.ValueOf(models.IsUserDirectedEvent),
+ "ListUsersFromProject": reflect.ValueOf(models.ListUsersFromProject),
+ "MinPositionSpacing": reflect.ValueOf(constant.MakeFromLiteral("0.009999999999999999999796712092658967918623602599836885929107666016", token.FLOAT, 0)),
+ "PermissionAdmin": reflect.ValueOf(models.PermissionAdmin),
+ "PermissionRead": reflect.ValueOf(models.PermissionRead),
+ "PermissionUnknown": reflect.ValueOf(constant.MakeFromLiteral("-1", token.INT, 0)),
+ "PermissionWrite": reflect.ValueOf(models.PermissionWrite),
+ "PermissionsAreValid": reflect.ValueOf(models.PermissionsAreValid),
+ "PreviewExtraLarge": reflect.ValueOf(models.PreviewExtraLarge),
+ "PreviewLarge": reflect.ValueOf(models.PreviewLarge),
+ "PreviewMedium": reflect.ValueOf(models.PreviewMedium),
+ "PreviewSizeUnknown": reflect.ValueOf(models.PreviewSizeUnknown),
+ "PreviewSmall": reflect.ValueOf(models.PreviewSmall),
+ "ProjectBackgroundUpload": reflect.ValueOf(models.ProjectBackgroundUpload),
+ "ProjectExpandableRights": reflect.ValueOf(constant.MakeFromLiteral("\"permissions\"", token.STRING, 0)),
+ "ProjectViewKindGantt": reflect.ValueOf(models.ProjectViewKindGantt),
+ "ProjectViewKindKanban": reflect.ValueOf(models.ProjectViewKindKanban),
+ "ProjectViewKindList": reflect.ValueOf(models.ProjectViewKindList),
+ "ProjectViewKindTable": reflect.ValueOf(models.ProjectViewKindTable),
+ "ReactionKindComment": reflect.ValueOf(constant.MakeFromLiteral("1", token.INT, 0)),
+ "ReactionKindTask": reflect.ValueOf(constant.MakeFromLiteral("0", token.INT, 0)),
+ "RecalculateTaskPositions": reflect.ValueOf(models.RecalculateTaskPositions),
+ "RegisterAddTaskToFilterViewCron": reflect.ValueOf(models.RegisterAddTaskToFilterViewCron),
+ "RegisterEventForWebhook": reflect.ValueOf(models.RegisterEventForWebhook),
+ "RegisterListeners": reflect.ValueOf(models.RegisterListeners),
+ "RegisterOldExportCleanupCron": reflect.ValueOf(models.RegisterOldExportCleanupCron),
+ "RegisterOverdueReminderCron": reflect.ValueOf(models.RegisterOverdueReminderCron),
+ "RegisterReminderCron": reflect.ValueOf(models.RegisterReminderCron),
+ "RegisterSessionCleanupCron": reflect.ValueOf(models.RegisterSessionCleanupCron),
+ "RegisterUserDeletionCron": reflect.ValueOf(models.RegisterUserDeletionCron),
+ "RegisterUserDirectedEventForWebhook": reflect.ValueOf(models.RegisterUserDirectedEventForWebhook),
+ "RelationKindBlocked": reflect.ValueOf(models.RelationKindBlocked),
+ "RelationKindBlocking": reflect.ValueOf(models.RelationKindBlocking),
+ "RelationKindCopiedFrom": reflect.ValueOf(models.RelationKindCopiedFrom),
+ "RelationKindCopiedTo": reflect.ValueOf(models.RelationKindCopiedTo),
+ "RelationKindDuplicateOf": reflect.ValueOf(models.RelationKindDuplicateOf),
+ "RelationKindDuplicates": reflect.ValueOf(models.RelationKindDuplicates),
+ "RelationKindFollows": reflect.ValueOf(models.RelationKindFollows),
+ "RelationKindParenttask": reflect.ValueOf(models.RelationKindParenttask),
+ "RelationKindPreceeds": reflect.ValueOf(models.RelationKindPreceeds),
+ "RelationKindRelated": reflect.ValueOf(models.RelationKindRelated),
+ "RelationKindSubtask": reflect.ValueOf(models.RelationKindSubtask),
+ "RelationKindUnknown": reflect.ValueOf(models.RelationKindUnknown),
+ "ReminderRelationDueDate": reflect.ValueOf(models.ReminderRelationDueDate),
+ "ReminderRelationEndDate": reflect.ValueOf(models.ReminderRelationEndDate),
+ "ReminderRelationStartDate": reflect.ValueOf(models.ReminderRelationStartDate),
+ "RemoveUnsplashPhoto": reflect.ValueOf(models.RemoveUnsplashPhoto),
+ "RepairOrphanedProjects": reflect.ValueOf(models.RepairOrphanedProjects),
+ "RepairTaskPositions": reflect.ValueOf(models.RepairTaskPositions),
+ "RotateRefreshToken": reflect.ValueOf(models.RotateRefreshToken),
+ "SetEngine": reflect.ValueOf(models.SetEngine),
+ "SetProjectBackground": reflect.ValueOf(models.SetProjectBackground),
+ "SetupTests": reflect.ValueOf(models.SetupTests),
+ "SharingTypeUnknown": reflect.ValueOf(models.SharingTypeUnknown),
+ "SharingTypeWithPassword": reflect.ValueOf(models.SharingTypeWithPassword),
+ "SharingTypeWithoutPassword": reflect.ValueOf(models.SharingTypeWithoutPassword),
+ "SubscriptionEntityNamespace": reflect.ValueOf(constant.MakeFromLiteral("1", token.INT, 0)),
+ "SubscriptionEntityProject": reflect.ValueOf(constant.MakeFromLiteral("2", token.INT, 0)),
+ "SubscriptionEntityTask": reflect.ValueOf(constant.MakeFromLiteral("3", token.INT, 0)),
+ "SubscriptionEntityUnknown": reflect.ValueOf(constant.MakeFromLiteral("0", token.INT, 0)),
+ "SyncExternalTeamsForUser": reflect.ValueOf(models.SyncExternalTeamsForUser),
+ "TaskCollectionExpandBuckets": reflect.ValueOf(models.TaskCollectionExpandBuckets),
+ "TaskCollectionExpandCommentCount": reflect.ValueOf(models.TaskCollectionExpandCommentCount),
+ "TaskCollectionExpandComments": reflect.ValueOf(models.TaskCollectionExpandComments),
+ "TaskCollectionExpandIsUnread": reflect.ValueOf(models.TaskCollectionExpandIsUnread),
+ "TaskCollectionExpandReactions": reflect.ValueOf(models.TaskCollectionExpandReactions),
+ "TaskCollectionExpandSubtasks": reflect.ValueOf(models.TaskCollectionExpandSubtasks),
+ "TaskRepeatModeDefault": reflect.ValueOf(models.TaskRepeatModeDefault),
+ "TaskRepeatModeFromCurrentDate": reflect.ValueOf(models.TaskRepeatModeFromCurrentDate),
+ "TaskRepeatModeMonth": reflect.ValueOf(models.TaskRepeatModeMonth),
+ "UpdateProject": reflect.ValueOf(models.UpdateProject),
+ "UpdateSessionLastActive": reflect.ValueOf(models.UpdateSessionLastActive),
+ "VerifyLinkSharePassword": reflect.ValueOf(models.VerifyLinkSharePassword),
+
+ // type definitions
+ "APIPermissions": reflect.ValueOf((*models.APIPermissions)(nil)),
+ "APIToken": reflect.ValueOf((*models.APIToken)(nil)),
+ "APITokenRoute": reflect.ValueOf((*models.APITokenRoute)(nil)),
+ "Bucket": reflect.ValueOf((*models.Bucket)(nil)),
+ "BucketConfigurationModeKind": reflect.ValueOf((*models.BucketConfigurationModeKind)(nil)),
+ "BulkAssignees": reflect.ValueOf((*models.BulkAssignees)(nil)),
+ "BulkTask": reflect.ValueOf((*models.BulkTask)(nil)),
+ "CleanupTaskAssignmentsAfterTeamRemoval": reflect.ValueOf((*models.CleanupTaskAssignmentsAfterTeamRemoval)(nil)),
+ "DataExportReadyNotification": reflect.ValueOf((*models.DataExportReadyNotification)(nil)),
+ "DatabaseNotifications": reflect.ValueOf((*models.DatabaseNotifications)(nil)),
+ "DecreaseAttachmentCounter": reflect.ValueOf((*models.DecreaseAttachmentCounter)(nil)),
+ "DecreaseProjectCounter": reflect.ValueOf((*models.DecreaseProjectCounter)(nil)),
+ "DecreaseTaskCounter": reflect.ValueOf((*models.DecreaseTaskCounter)(nil)),
+ "DecreaseTeamCounter": reflect.ValueOf((*models.DecreaseTeamCounter)(nil)),
+ "ErrAPITokenInvalid": reflect.ValueOf((*models.ErrAPITokenInvalid)(nil)),
+ "ErrAttachmentDoesNotBelongToTask": reflect.ValueOf((*models.ErrAttachmentDoesNotBelongToTask)(nil)),
+ "ErrBucketDoesNotBelongToProjectView": reflect.ValueOf((*models.ErrBucketDoesNotBelongToProjectView)(nil)),
+ "ErrBucketDoesNotExist": reflect.ValueOf((*models.ErrBucketDoesNotExist)(nil)),
+ "ErrBucketLimitExceeded": reflect.ValueOf((*models.ErrBucketLimitExceeded)(nil)),
+ "ErrBulkTasksMustBeInSameProject": reflect.ValueOf((*models.ErrBulkTasksMustBeInSameProject)(nil)),
+ "ErrBulkTasksNeedAtLeastOne": reflect.ValueOf((*models.ErrBulkTasksNeedAtLeastOne)(nil)),
+ "ErrCannotArchiveDefaultProject": reflect.ValueOf((*models.ErrCannotArchiveDefaultProject)(nil)),
+ "ErrCannotDeleteDefaultProject": reflect.ValueOf((*models.ErrCannotDeleteDefaultProject)(nil)),
+ "ErrCannotDeleteLastTeamMember": reflect.ValueOf((*models.ErrCannotDeleteLastTeamMember)(nil)),
+ "ErrCannotRemoveLastBucket": reflect.ValueOf((*models.ErrCannotRemoveLastBucket)(nil)),
+ "ErrCannotRemoveUserFromExternalTeam": reflect.ValueOf((*models.ErrCannotRemoveUserFromExternalTeam)(nil)),
+ "ErrExternalTeamDoesNotExist": reflect.ValueOf((*models.ErrExternalTeamDoesNotExist)(nil)),
+ "ErrGenericForbidden": reflect.ValueOf((*models.ErrGenericForbidden)(nil)),
+ "ErrIDCannotBeZero": reflect.ValueOf((*models.ErrIDCannotBeZero)(nil)),
+ "ErrInvalidAPITokenPermission": reflect.ValueOf((*models.ErrInvalidAPITokenPermission)(nil)),
+ "ErrInvalidData": reflect.ValueOf((*models.ErrInvalidData)(nil)),
+ "ErrInvalidFilterExpression": reflect.ValueOf((*models.ErrInvalidFilterExpression)(nil)),
+ "ErrInvalidModel": reflect.ValueOf((*models.ErrInvalidModel)(nil)),
+ "ErrInvalidPermission": reflect.ValueOf((*models.ErrInvalidPermission)(nil)),
+ "ErrInvalidReactionEntityKind": reflect.ValueOf((*models.ErrInvalidReactionEntityKind)(nil)),
+ "ErrInvalidRelationKind": reflect.ValueOf((*models.ErrInvalidRelationKind)(nil)),
+ "ErrInvalidSortOrder": reflect.ValueOf((*models.ErrInvalidSortOrder)(nil)),
+ "ErrInvalidSortParam": reflect.ValueOf((*models.ErrInvalidSortParam)(nil)),
+ "ErrInvalidTaskColumn": reflect.ValueOf((*models.ErrInvalidTaskColumn)(nil)),
+ "ErrInvalidTaskField": reflect.ValueOf((*models.ErrInvalidTaskField)(nil)),
+ "ErrInvalidTaskFilterComparator": reflect.ValueOf((*models.ErrInvalidTaskFilterComparator)(nil)),
+ "ErrInvalidTaskFilterConcatinator": reflect.ValueOf((*models.ErrInvalidTaskFilterConcatinator)(nil)),
+ "ErrInvalidTaskFilterValue": reflect.ValueOf((*models.ErrInvalidTaskFilterValue)(nil)),
+ "ErrInvalidTimezone": reflect.ValueOf((*models.ErrInvalidTimezone)(nil)),
+ "ErrLabelDoesNotExist": reflect.ValueOf((*models.ErrLabelDoesNotExist)(nil)),
+ "ErrLabelIsAlreadyOnTask": reflect.ValueOf((*models.ErrLabelIsAlreadyOnTask)(nil)),
+ "ErrLinkSharePasswordInvalid": reflect.ValueOf((*models.ErrLinkSharePasswordInvalid)(nil)),
+ "ErrLinkSharePasswordRequired": reflect.ValueOf((*models.ErrLinkSharePasswordRequired)(nil)),
+ "ErrLinkShareTokenInvalid": reflect.ValueOf((*models.ErrLinkShareTokenInvalid)(nil)),
+ "ErrMustHaveProjectViewToSortByPosition": reflect.ValueOf((*models.ErrMustHaveProjectViewToSortByPosition)(nil)),
+ "ErrMustProvideUser": reflect.ValueOf((*models.ErrMustProvideUser)(nil)),
+ "ErrNeedToHaveProjectReadAccess": reflect.ValueOf((*models.ErrNeedToHaveProjectReadAccess)(nil)),
+ "ErrNeedsFullRecalculation": reflect.ValueOf((*models.ErrNeedsFullRecalculation)(nil)),
+ "ErrNoPermissionToSeeTask": reflect.ValueOf((*models.ErrNoPermissionToSeeTask)(nil)),
+ "ErrOIDCTeamsDoNotExistForUser": reflect.ValueOf((*models.ErrOIDCTeamsDoNotExistForUser)(nil)),
+ "ErrOnlyOneDoneBucketPerProject": reflect.ValueOf((*models.ErrOnlyOneDoneBucketPerProject)(nil)),
+ "ErrOpenIDBadRequest": reflect.ValueOf((*models.ErrOpenIDBadRequest)(nil)),
+ "ErrOpenIDBadRequestWithDetails": reflect.ValueOf((*models.ErrOpenIDBadRequestWithDetails)(nil)),
+ "ErrParentTaskCannotBeTheSame": reflect.ValueOf((*models.ErrParentTaskCannotBeTheSame)(nil)),
+ "ErrProjectCannotBeChildOfItself": reflect.ValueOf((*models.ErrProjectCannotBeChildOfItself)(nil)),
+ "ErrProjectCannotBelongToAPseudoParentProject": reflect.ValueOf((*models.ErrProjectCannotBelongToAPseudoParentProject)(nil)),
+ "ErrProjectCannotHaveACyclicRelationship": reflect.ValueOf((*models.ErrProjectCannotHaveACyclicRelationship)(nil)),
+ "ErrProjectDoesNotExist": reflect.ValueOf((*models.ErrProjectDoesNotExist)(nil)),
+ "ErrProjectIdentifierIsNotUnique": reflect.ValueOf((*models.ErrProjectIdentifierIsNotUnique)(nil)),
+ "ErrProjectIsArchived": reflect.ValueOf((*models.ErrProjectIsArchived)(nil)),
+ "ErrProjectShareDoesNotExist": reflect.ValueOf((*models.ErrProjectShareDoesNotExist)(nil)),
+ "ErrProjectTitleCannotBeEmpty": reflect.ValueOf((*models.ErrProjectTitleCannotBeEmpty)(nil)),
+ "ErrProjectViewDoesNotExist": reflect.ValueOf((*models.ErrProjectViewDoesNotExist)(nil)),
+ "ErrRelationAlreadyExists": reflect.ValueOf((*models.ErrRelationAlreadyExists)(nil)),
+ "ErrRelationDoesNotExist": reflect.ValueOf((*models.ErrRelationDoesNotExist)(nil)),
+ "ErrRelationTasksCannotBeTheSame": reflect.ValueOf((*models.ErrRelationTasksCannotBeTheSame)(nil)),
+ "ErrReminderRelativeToMissing": reflect.ValueOf((*models.ErrReminderRelativeToMissing)(nil)),
+ "ErrSavedFilterDoesNotExist": reflect.ValueOf((*models.ErrSavedFilterDoesNotExist)(nil)),
+ "ErrSavedFilterNotAvailableForLinkShare": reflect.ValueOf((*models.ErrSavedFilterNotAvailableForLinkShare)(nil)),
+ "ErrSessionNotFound": reflect.ValueOf((*models.ErrSessionNotFound)(nil)),
+ "ErrSubscriptionAlreadyExists": reflect.ValueOf((*models.ErrSubscriptionAlreadyExists)(nil)),
+ "ErrTaskAlreadyExistsInBucket": reflect.ValueOf((*models.ErrTaskAlreadyExistsInBucket)(nil)),
+ "ErrTaskAttachmentDoesNotExist": reflect.ValueOf((*models.ErrTaskAttachmentDoesNotExist)(nil)),
+ "ErrTaskAttachmentIsTooLarge": reflect.ValueOf((*models.ErrTaskAttachmentIsTooLarge)(nil)),
+ "ErrTaskCannotBeEmpty": reflect.ValueOf((*models.ErrTaskCannotBeEmpty)(nil)),
+ "ErrTaskCommentDoesNotExist": reflect.ValueOf((*models.ErrTaskCommentDoesNotExist)(nil)),
+ "ErrTaskDoesNotExist": reflect.ValueOf((*models.ErrTaskDoesNotExist)(nil)),
+ "ErrTaskRelationCycle": reflect.ValueOf((*models.ErrTaskRelationCycle)(nil)),
+ "ErrTeamAlreadyHasAccess": reflect.ValueOf((*models.ErrTeamAlreadyHasAccess)(nil)),
+ "ErrTeamDoesNotExist": reflect.ValueOf((*models.ErrTeamDoesNotExist)(nil)),
+ "ErrTeamDoesNotHaveAccessToProject": reflect.ValueOf((*models.ErrTeamDoesNotHaveAccessToProject)(nil)),
+ "ErrTeamNameCannotBeEmpty": reflect.ValueOf((*models.ErrTeamNameCannotBeEmpty)(nil)),
+ "ErrUnknownSubscriptionEntityType": reflect.ValueOf((*models.ErrUnknownSubscriptionEntityType)(nil)),
+ "ErrUserAlreadyAssigned": reflect.ValueOf((*models.ErrUserAlreadyAssigned)(nil)),
+ "ErrUserAlreadyHasAccess": reflect.ValueOf((*models.ErrUserAlreadyHasAccess)(nil)),
+ "ErrUserDoesNotHaveAccessToProject": reflect.ValueOf((*models.ErrUserDoesNotHaveAccessToProject)(nil)),
+ "ErrUserHasNoAccessToLabel": reflect.ValueOf((*models.ErrUserHasNoAccessToLabel)(nil)),
+ "ErrUserIsMemberOfTeam": reflect.ValueOf((*models.ErrUserIsMemberOfTeam)(nil)),
+ "Favorite": reflect.ValueOf((*models.Favorite)(nil)),
+ "FavoriteKind": reflect.ValueOf((*models.FavoriteKind)(nil)),
+ "HandleTaskCommentEditMentions": reflect.ValueOf((*models.HandleTaskCommentEditMentions)(nil)),
+ "HandleTaskCreateMentions": reflect.ValueOf((*models.HandleTaskCreateMentions)(nil)),
+ "HandleTaskUpdateLastUpdated": reflect.ValueOf((*models.HandleTaskUpdateLastUpdated)(nil)),
+ "HandleTaskUpdatedMentions": reflect.ValueOf((*models.HandleTaskUpdatedMentions)(nil)),
+ "HandleUserDataExport": reflect.ValueOf((*models.HandleUserDataExport)(nil)),
+ "IncreaseAttachmentCounter": reflect.ValueOf((*models.IncreaseAttachmentCounter)(nil)),
+ "IncreaseProjectCounter": reflect.ValueOf((*models.IncreaseProjectCounter)(nil)),
+ "IncreaseTaskCounter": reflect.ValueOf((*models.IncreaseTaskCounter)(nil)),
+ "IncreaseTeamCounter": reflect.ValueOf((*models.IncreaseTeamCounter)(nil)),
+ "Label": reflect.ValueOf((*models.Label)(nil)),
+ "LabelByTaskIDsOptions": reflect.ValueOf((*models.LabelByTaskIDsOptions)(nil)),
+ "LabelTask": reflect.ValueOf((*models.LabelTask)(nil)),
+ "LabelTaskBulk": reflect.ValueOf((*models.LabelTaskBulk)(nil)),
+ "LabelWithTaskID": reflect.ValueOf((*models.LabelWithTaskID)(nil)),
+ "LinkSharing": reflect.ValueOf((*models.LinkSharing)(nil)),
+ "MarkTaskUnreadOnComment": reflect.ValueOf((*models.MarkTaskUnreadOnComment)(nil)),
+ "Message": reflect.ValueOf((*models.Message)(nil)),
+ "Permission": reflect.ValueOf((*models.Permission)(nil)),
+ "PreviewSize": reflect.ValueOf((*models.PreviewSize)(nil)),
+ "Project": reflect.ValueOf((*models.Project)(nil)),
+ "ProjectBackgroundType": reflect.ValueOf((*models.ProjectBackgroundType)(nil)),
+ "ProjectCreatedEvent": reflect.ValueOf((*models.ProjectCreatedEvent)(nil)),
+ "ProjectCreatedNotification": reflect.ValueOf((*models.ProjectCreatedNotification)(nil)),
+ "ProjectDeletedEvent": reflect.ValueOf((*models.ProjectDeletedEvent)(nil)),
+ "ProjectDuplicate": reflect.ValueOf((*models.ProjectDuplicate)(nil)),
+ "ProjectExpandable": reflect.ValueOf((*models.ProjectExpandable)(nil)),
+ "ProjectSharedWithTeamEvent": reflect.ValueOf((*models.ProjectSharedWithTeamEvent)(nil)),
+ "ProjectSharedWithUserEvent": reflect.ValueOf((*models.ProjectSharedWithUserEvent)(nil)),
+ "ProjectUIDs": reflect.ValueOf((*models.ProjectUIDs)(nil)),
+ "ProjectUpdatedEvent": reflect.ValueOf((*models.ProjectUpdatedEvent)(nil)),
+ "ProjectUser": reflect.ValueOf((*models.ProjectUser)(nil)),
+ "ProjectView": reflect.ValueOf((*models.ProjectView)(nil)),
+ "ProjectViewBucketConfiguration": reflect.ValueOf((*models.ProjectViewBucketConfiguration)(nil)),
+ "ProjectViewKind": reflect.ValueOf((*models.ProjectViewKind)(nil)),
+ "ProjectWithTasksAndBuckets": reflect.ValueOf((*models.ProjectWithTasksAndBuckets)(nil)),
+ "Reaction": reflect.ValueOf((*models.Reaction)(nil)),
+ "ReactionKind": reflect.ValueOf((*models.ReactionKind)(nil)),
+ "ReactionMap": reflect.ValueOf((*models.ReactionMap)(nil)),
+ "RelatedTaskMap": reflect.ValueOf((*models.RelatedTaskMap)(nil)),
+ "RelationKind": reflect.ValueOf((*models.RelationKind)(nil)),
+ "ReminderDueNotification": reflect.ValueOf((*models.ReminderDueNotification)(nil)),
+ "ReminderRelation": reflect.ValueOf((*models.ReminderRelation)(nil)),
+ "RepairOrphanedProjectsResult": reflect.ValueOf((*models.RepairOrphanedProjectsResult)(nil)),
+ "RepairResult": reflect.ValueOf((*models.RepairResult)(nil)),
+ "RouteDetail": reflect.ValueOf((*models.RouteDetail)(nil)),
+ "SavedFilter": reflect.ValueOf((*models.SavedFilter)(nil)),
+ "SendProjectCreatedNotification": reflect.ValueOf((*models.SendProjectCreatedNotification)(nil)),
+ "SendTaskAssignedNotification": reflect.ValueOf((*models.SendTaskAssignedNotification)(nil)),
+ "SendTaskCommentNotification": reflect.ValueOf((*models.SendTaskCommentNotification)(nil)),
+ "SendTaskDeletedNotification": reflect.ValueOf((*models.SendTaskDeletedNotification)(nil)),
+ "SendTeamMemberAddedNotification": reflect.ValueOf((*models.SendTeamMemberAddedNotification)(nil)),
+ "Session": reflect.ValueOf((*models.Session)(nil)),
+ "SharingType": reflect.ValueOf((*models.SharingType)(nil)),
+ "SubTableFilter": reflect.ValueOf((*models.SubTableFilter)(nil)),
+ "SubTableFilters": reflect.ValueOf((*models.SubTableFilters)(nil)),
+ "Subscription": reflect.ValueOf((*models.Subscription)(nil)),
+ "SubscriptionEntityType": reflect.ValueOf((*models.SubscriptionEntityType)(nil)),
+ "SubscriptionWithUser": reflect.ValueOf((*models.SubscriptionWithUser)(nil)),
+ "Task": reflect.ValueOf((*models.Task)(nil)),
+ "TaskAssginee": reflect.ValueOf((*models.TaskAssginee)(nil)),
+ "TaskAssignedNotification": reflect.ValueOf((*models.TaskAssignedNotification)(nil)),
+ "TaskAssigneeCreatedEvent": reflect.ValueOf((*models.TaskAssigneeCreatedEvent)(nil)),
+ "TaskAssigneeDeletedEvent": reflect.ValueOf((*models.TaskAssigneeDeletedEvent)(nil)),
+ "TaskAssigneeWithUser": reflect.ValueOf((*models.TaskAssigneeWithUser)(nil)),
+ "TaskAttachment": reflect.ValueOf((*models.TaskAttachment)(nil)),
+ "TaskAttachmentCreatedEvent": reflect.ValueOf((*models.TaskAttachmentCreatedEvent)(nil)),
+ "TaskAttachmentDeletedEvent": reflect.ValueOf((*models.TaskAttachmentDeletedEvent)(nil)),
+ "TaskBucket": reflect.ValueOf((*models.TaskBucket)(nil)),
+ "TaskCollection": reflect.ValueOf((*models.TaskCollection)(nil)),
+ "TaskCollectionExpandable": reflect.ValueOf((*models.TaskCollectionExpandable)(nil)),
+ "TaskComment": reflect.ValueOf((*models.TaskComment)(nil)),
+ "TaskCommentCreatedEvent": reflect.ValueOf((*models.TaskCommentCreatedEvent)(nil)),
+ "TaskCommentDeletedEvent": reflect.ValueOf((*models.TaskCommentDeletedEvent)(nil)),
+ "TaskCommentNotification": reflect.ValueOf((*models.TaskCommentNotification)(nil)),
+ "TaskCommentUpdatedEvent": reflect.ValueOf((*models.TaskCommentUpdatedEvent)(nil)),
+ "TaskCreatedEvent": reflect.ValueOf((*models.TaskCreatedEvent)(nil)),
+ "TaskDeletedEvent": reflect.ValueOf((*models.TaskDeletedEvent)(nil)),
+ "TaskDeletedNotification": reflect.ValueOf((*models.TaskDeletedNotification)(nil)),
+ "TaskDuplicate": reflect.ValueOf((*models.TaskDuplicate)(nil)),
+ "TaskOverdueEvent": reflect.ValueOf((*models.TaskOverdueEvent)(nil)),
+ "TaskPosition": reflect.ValueOf((*models.TaskPosition)(nil)),
+ "TaskPositionsRecalculatedEvent": reflect.ValueOf((*models.TaskPositionsRecalculatedEvent)(nil)),
+ "TaskRelation": reflect.ValueOf((*models.TaskRelation)(nil)),
+ "TaskRelationCreatedEvent": reflect.ValueOf((*models.TaskRelationCreatedEvent)(nil)),
+ "TaskRelationDeletedEvent": reflect.ValueOf((*models.TaskRelationDeletedEvent)(nil)),
+ "TaskReminder": reflect.ValueOf((*models.TaskReminder)(nil)),
+ "TaskReminderFiredEvent": reflect.ValueOf((*models.TaskReminderFiredEvent)(nil)),
+ "TaskRepeatMode": reflect.ValueOf((*models.TaskRepeatMode)(nil)),
+ "TaskUnreadStatus": reflect.ValueOf((*models.TaskUnreadStatus)(nil)),
+ "TaskUpdatedEvent": reflect.ValueOf((*models.TaskUpdatedEvent)(nil)),
+ "TaskWithComments": reflect.ValueOf((*models.TaskWithComments)(nil)),
+ "TasksOverdueEvent": reflect.ValueOf((*models.TasksOverdueEvent)(nil)),
+ "Team": reflect.ValueOf((*models.Team)(nil)),
+ "TeamCreatedEvent": reflect.ValueOf((*models.TeamCreatedEvent)(nil)),
+ "TeamDeletedEvent": reflect.ValueOf((*models.TeamDeletedEvent)(nil)),
+ "TeamMember": reflect.ValueOf((*models.TeamMember)(nil)),
+ "TeamMemberAddedEvent": reflect.ValueOf((*models.TeamMemberAddedEvent)(nil)),
+ "TeamMemberAddedNotification": reflect.ValueOf((*models.TeamMemberAddedNotification)(nil)),
+ "TeamMemberRemovedEvent": reflect.ValueOf((*models.TeamMemberRemovedEvent)(nil)),
+ "TeamProject": reflect.ValueOf((*models.TeamProject)(nil)),
+ "TeamUser": reflect.ValueOf((*models.TeamUser)(nil)),
+ "TeamWithPermission": reflect.ValueOf((*models.TeamWithPermission)(nil)),
+ "UndoneTaskOverdueNotification": reflect.ValueOf((*models.UndoneTaskOverdueNotification)(nil)),
+ "UndoneTasksOverdueNotification": reflect.ValueOf((*models.UndoneTasksOverdueNotification)(nil)),
+ "UnsplashPhoto": reflect.ValueOf((*models.UnsplashPhoto)(nil)),
+ "UpdateTaskInSavedFilterViews": reflect.ValueOf((*models.UpdateTaskInSavedFilterViews)(nil)),
+ "UserDataExportRequestedEvent": reflect.ValueOf((*models.UserDataExportRequestedEvent)(nil)),
+ "UserMentionedInTaskNotification": reflect.ValueOf((*models.UserMentionedInTaskNotification)(nil)),
+ "UserWithPermission": reflect.ValueOf((*models.UserWithPermission)(nil)),
+ "ValidationHTTPError": reflect.ValueOf((*models.ValidationHTTPError)(nil)),
+ "Webhook": reflect.ValueOf((*models.Webhook)(nil)),
+ "WebhookListener": reflect.ValueOf((*models.WebhookListener)(nil)),
+ "WebhookPayload": reflect.ValueOf((*models.WebhookPayload)(nil)),
+ }
+}
diff --git a/pkg/yaegi_symbols/vikunja_plugins.go b/pkg/yaegi_symbols/vikunja_plugins.go
new file mode 100644
index 000000000..458fca8cf
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_plugins.go
@@ -0,0 +1,118 @@
+// Code generated by 'yaegi extract code.vikunja.io/api/pkg/plugins'. DO NOT EDIT.
+
+package yaegi_symbols
+
+import (
+ "reflect"
+
+ "code.vikunja.io/api/pkg/plugins"
+ "github.com/labstack/echo/v5"
+ "src.techknowlogick.com/xormigrate"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/plugins/plugins"] = map[string]reflect.Value{
+ // function, constant and variable definitions
+ "Initialize": reflect.ValueOf(plugins.Initialize),
+ "ManagerInstance": reflect.ValueOf(plugins.ManagerInstance),
+ "NewRegistry": reflect.ValueOf(plugins.NewRegistry),
+ "RegisterPluginRoutes": reflect.ValueOf(plugins.RegisterPluginRoutes),
+ "Shutdown": reflect.ValueOf(plugins.Shutdown),
+
+ // type definitions
+ "AuthenticatedRouterPlugin": reflect.ValueOf((*plugins.AuthenticatedRouterPlugin)(nil)),
+ "Manager": reflect.ValueOf((*plugins.Manager)(nil)),
+ "MigrationPlugin": reflect.ValueOf((*plugins.MigrationPlugin)(nil)),
+ "Plugin": reflect.ValueOf((*plugins.Plugin)(nil)),
+ "Registry": reflect.ValueOf((*plugins.Registry)(nil)),
+ "UnauthenticatedRouterPlugin": reflect.ValueOf((*plugins.UnauthenticatedRouterPlugin)(nil)),
+
+ // interface wrapper definitions
+ "_AuthenticatedRouterPlugin": reflect.ValueOf((*_code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin)(nil)),
+ "_MigrationPlugin": reflect.ValueOf((*_code_vikunja_io_api_pkg_plugins_MigrationPlugin)(nil)),
+ "_Plugin": reflect.ValueOf((*_code_vikunja_io_api_pkg_plugins_Plugin)(nil)),
+ "_UnauthenticatedRouterPlugin": reflect.ValueOf((*_code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin)(nil)),
+ }
+}
+
+type _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin struct {
+ IValue interface{}
+ WInit func() error
+ WName func() string
+ WRegisterAuthenticatedRoutes func(g *echo.Group)
+ WShutdown func() error
+ WVersion func() string
+}
+
+func (W _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin) Init() error {
+ return W.WInit()
+}
+func (W _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin) Name() string {
+ return W.WName()
+}
+func (W _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin) RegisterAuthenticatedRoutes(g *echo.Group) {
+ W.WRegisterAuthenticatedRoutes(g)
+}
+func (W _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin) Shutdown() error {
+ return W.WShutdown()
+}
+func (W _code_vikunja_io_api_pkg_plugins_AuthenticatedRouterPlugin) Version() string {
+ return W.WVersion()
+}
+
+type _code_vikunja_io_api_pkg_plugins_MigrationPlugin struct {
+ IValue interface{}
+ WInit func() error
+ WMigrations func() []*xormigrate.Migration
+ WName func() string
+ WShutdown func() error
+ WVersion func() string
+}
+
+func (W _code_vikunja_io_api_pkg_plugins_MigrationPlugin) Init() error {
+ return W.WInit()
+}
+func (W _code_vikunja_io_api_pkg_plugins_MigrationPlugin) Migrations() []*xormigrate.Migration {
+ return W.WMigrations()
+}
+func (W _code_vikunja_io_api_pkg_plugins_MigrationPlugin) Name() string { return W.WName() }
+func (W _code_vikunja_io_api_pkg_plugins_MigrationPlugin) Shutdown() error { return W.WShutdown() }
+func (W _code_vikunja_io_api_pkg_plugins_MigrationPlugin) Version() string { return W.WVersion() }
+
+type _code_vikunja_io_api_pkg_plugins_Plugin struct {
+ IValue interface{}
+ WInit func() error
+ WName func() string
+ WShutdown func() error
+ WVersion func() string
+}
+
+func (W _code_vikunja_io_api_pkg_plugins_Plugin) Init() error { return W.WInit() }
+func (W _code_vikunja_io_api_pkg_plugins_Plugin) Name() string { return W.WName() }
+func (W _code_vikunja_io_api_pkg_plugins_Plugin) Shutdown() error { return W.WShutdown() }
+func (W _code_vikunja_io_api_pkg_plugins_Plugin) Version() string { return W.WVersion() }
+
+type _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin struct {
+ IValue interface{}
+ WInit func() error
+ WName func() string
+ WRegisterUnauthenticatedRoutes func(g *echo.Group)
+ WShutdown func() error
+ WVersion func() string
+}
+
+func (W _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin) Init() error {
+ return W.WInit()
+}
+func (W _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin) Name() string {
+ return W.WName()
+}
+func (W _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin) RegisterUnauthenticatedRoutes(g *echo.Group) {
+ W.WRegisterUnauthenticatedRoutes(g)
+}
+func (W _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin) Shutdown() error {
+ return W.WShutdown()
+}
+func (W _code_vikunja_io_api_pkg_plugins_UnauthenticatedRouterPlugin) Version() string {
+ return W.WVersion()
+}
diff --git a/pkg/yaegi_symbols/vikunja_user.go b/pkg/yaegi_symbols/vikunja_user.go
new file mode 100644
index 000000000..7ec6a5e3b
--- /dev/null
+++ b/pkg/yaegi_symbols/vikunja_user.go
@@ -0,0 +1,178 @@
+package yaegi_symbols
+
+import (
+ "code.vikunja.io/api/pkg/user"
+ "go/constant"
+ "go/token"
+ "reflect"
+)
+
+func init() {
+ Symbols["code.vikunja.io/api/pkg/user/user"] = map[string]reflect.Value{
+ // function, constant and variable definitions
+ "CancelDeletion": reflect.ValueOf(user.CancelDeletion),
+ "CheckUserCredentials": reflect.ValueOf(user.CheckUserCredentials),
+ "CheckUserPassword": reflect.ValueOf(user.CheckUserPassword),
+ "ConfirmDeletion": reflect.ValueOf(user.ConfirmDeletion),
+ "ConfirmEmail": reflect.ValueOf(user.ConfirmEmail),
+ "CreateUser": reflect.ValueOf(user.CreateUser),
+ "DeleteCaldavTokenByID": reflect.ValueOf(user.DeleteCaldavTokenByID),
+ "DisableTOTP": reflect.ValueOf(user.DisableTOTP),
+ "EnableTOTP": reflect.ValueOf(user.EnableTOTP),
+ "EnrollTOTP": reflect.ValueOf(user.EnrollTOTP),
+ "ErrCodeAccountDisabled": reflect.ValueOf(constant.MakeFromLiteral("1020", token.INT, 0)),
+ "ErrCodeAccountIsNotLocal": reflect.ValueOf(constant.MakeFromLiteral("1021", token.INT, 0)),
+ "ErrCodeCouldNotGetUserID": reflect.ValueOf(constant.MakeFromLiteral("1006", token.INT, 0)),
+ "ErrCodeEmailNotConfirmed": reflect.ValueOf(constant.MakeFromLiteral("1012", token.INT, 0)),
+ "ErrCodeEmptyNewPassword": reflect.ValueOf(constant.MakeFromLiteral("1013", token.INT, 0)),
+ "ErrCodeEmptyOldPassword": reflect.ValueOf(constant.MakeFromLiteral("1014", token.INT, 0)),
+ "ErrCodeInvalidAvatarProvider": reflect.ValueOf(constant.MakeFromLiteral("1018", token.INT, 0)),
+ "ErrCodeInvalidClaimData": reflect.ValueOf(constant.MakeFromLiteral("1024", token.INT, 0)),
+ "ErrCodeInvalidEmailConfirmToken": reflect.ValueOf(constant.MakeFromLiteral("1010", token.INT, 0)),
+ "ErrCodeInvalidPasswordResetToken": reflect.ValueOf(constant.MakeFromLiteral("1009", token.INT, 0)),
+ "ErrCodeInvalidTOTPPasscode": reflect.ValueOf(constant.MakeFromLiteral("1017", token.INT, 0)),
+ "ErrCodeMustNotBeLinkShare": reflect.ValueOf(constant.MakeFromLiteral("1023", token.INT, 0)),
+ "ErrCodeNoOpenIDEmailProvided": reflect.ValueOf(constant.MakeFromLiteral("1019", token.INT, 0)),
+ "ErrCodeNoPasswordResetToken": reflect.ValueOf(constant.MakeFromLiteral("1008", token.INT, 0)),
+ "ErrCodeNoUsernamePassword": reflect.ValueOf(constant.MakeFromLiteral("1004", token.INT, 0)),
+ "ErrCodeOpenIDCustomScopeMalformed": reflect.ValueOf(constant.MakeFromLiteral("1022", token.INT, 0)),
+ "ErrCodeTOTPAlreadyEnabled": reflect.ValueOf(constant.MakeFromLiteral("1015", token.INT, 0)),
+ "ErrCodeTOTPNotEnabled": reflect.ValueOf(constant.MakeFromLiteral("1016", token.INT, 0)),
+ "ErrCodeUserDoesNotExist": reflect.ValueOf(constant.MakeFromLiteral("1005", token.INT, 0)),
+ "ErrCodeUsernameMustNotContainSpaces": reflect.ValueOf(constant.MakeFromLiteral("1022", token.INT, 0)),
+ "ErrCodeWrongUsernameOrPassword": reflect.ValueOf(constant.MakeFromLiteral("1011", token.INT, 0)),
+ "ErrorCodeInvalidDeletionToken": reflect.ValueOf(constant.MakeFromLiteral("1028", token.INT, 0)),
+ "ErrorCodeInvalidTimezone": reflect.ValueOf(constant.MakeFromLiteral("1025", token.INT, 0)),
+ "ErrorCodeInvalidUserContext": reflect.ValueOf(constant.MakeFromLiteral("1027", token.INT, 0)),
+ "ErrorCodeTokenUserMismatch": reflect.ValueOf(constant.MakeFromLiteral("1029", token.INT, 0)),
+ "ErrorCodeUserEmailExists": reflect.ValueOf(constant.MakeFromLiteral("1002", token.INT, 0)),
+ "ErrorCodeUsernameExists": reflect.ValueOf(constant.MakeFromLiteral("1001", token.INT, 0)),
+ "ErrorCodeUsernameReserved": reflect.ValueOf(constant.MakeFromLiteral("1026", token.INT, 0)),
+ "GenerateNewCaldavToken": reflect.ValueOf(user.GenerateNewCaldavToken),
+ "GetCaldavTokens": reflect.ValueOf(user.GetCaldavTokens),
+ "GetCurrentUser": reflect.ValueOf(user.GetCurrentUser),
+ "GetCurrentUserFromDB": reflect.ValueOf(user.GetCurrentUserFromDB),
+ "GetFromAuth": reflect.ValueOf(user.GetFromAuth),
+ "GetTOTPForUser": reflect.ValueOf(user.GetTOTPForUser),
+ "GetTOTPQrCodeForUser": reflect.ValueOf(user.GetTOTPQrCodeForUser),
+ "GetTables": reflect.ValueOf(user.GetTables),
+ "GetUserByID": reflect.ValueOf(user.GetUserByID),
+ "GetUserByUsername": reflect.ValueOf(user.GetUserByUsername),
+ "GetUserFromClaims": reflect.ValueOf(user.GetUserFromClaims),
+ "GetUserWithEmail": reflect.ValueOf(user.GetUserWithEmail),
+ "GetUsersByCond": reflect.ValueOf(user.GetUsersByCond),
+ "GetUsersByIDs": reflect.ValueOf(user.GetUsersByIDs),
+ "GetUsersByUsername": reflect.ValueOf(user.GetUsersByUsername),
+ "HandleFailedTOTPAuth": reflect.ValueOf(user.HandleFailedTOTPAuth),
+ "HashPassword": reflect.ValueOf(user.HashPassword),
+ "InitTests": reflect.ValueOf(user.InitTests),
+ "IsErrAccountDisabled": reflect.ValueOf(user.IsErrAccountDisabled),
+ "IsErrAccountIsNotLocal": reflect.ValueOf(user.IsErrAccountIsNotLocal),
+ "IsErrCouldNotGetUserID": reflect.ValueOf(user.IsErrCouldNotGetUserID),
+ "IsErrEmailNotConfirmed": reflect.ValueOf(user.IsErrEmailNotConfirmed),
+ "IsErrEmptyNewPassword": reflect.ValueOf(user.IsErrEmptyNewPassword),
+ "IsErrEmptyOldPassword": reflect.ValueOf(user.IsErrEmptyOldPassword),
+ "IsErrInvalidAvatarProvider": reflect.ValueOf(user.IsErrInvalidAvatarProvider),
+ "IsErrInvalidClaimData": reflect.ValueOf(user.IsErrInvalidClaimData),
+ "IsErrInvalidDeletionToken": reflect.ValueOf(user.IsErrInvalidDeletionToken),
+ "IsErrInvalidEmailConfirmToken": reflect.ValueOf(user.IsErrInvalidEmailConfirmToken),
+ "IsErrInvalidPasswordResetToken": reflect.ValueOf(user.IsErrInvalidPasswordResetToken),
+ "IsErrInvalidTOTPPasscode": reflect.ValueOf(user.IsErrInvalidTOTPPasscode),
+ "IsErrInvalidTimezone": reflect.ValueOf(user.IsErrInvalidTimezone),
+ "IsErrInvalidUserContext": reflect.ValueOf(user.IsErrInvalidUserContext),
+ "IsErrMustNotBeLinkShare": reflect.ValueOf(user.IsErrMustNotBeLinkShare),
+ "IsErrNoEmailProvided": reflect.ValueOf(user.IsErrNoEmailProvided),
+ "IsErrNoPasswordResetToken": reflect.ValueOf(user.IsErrNoPasswordResetToken),
+ "IsErrNoUsernamePassword": reflect.ValueOf(user.IsErrNoUsernamePassword),
+ "IsErrOpenIDCustomScopeMalformed": reflect.ValueOf(user.IsErrOpenIDCustomScopeMalformed),
+ "IsErrTOTPAlreadyEnabled": reflect.ValueOf(user.IsErrTOTPAlreadyEnabled),
+ "IsErrTOTPNotEnabled": reflect.ValueOf(user.IsErrTOTPNotEnabled),
+ "IsErrTokenUserMismatch": reflect.ValueOf(user.IsErrTokenUserMismatch),
+ "IsErrUserDoesNotExist": reflect.ValueOf(user.IsErrUserDoesNotExist),
+ "IsErrUserEmailExists": reflect.ValueOf(user.IsErrUserEmailExists),
+ "IsErrUsernameExists": reflect.ValueOf(user.IsErrUsernameExists),
+ "IsErrUsernameMustNotContainSpaces": reflect.ValueOf(user.IsErrUsernameMustNotContainSpaces),
+ "IsErrUsernameReserved": reflect.ValueOf(user.IsErrUsernameReserved),
+ "IsErrWrongUsernameOrPassword": reflect.ValueOf(user.IsErrWrongUsernameOrPassword),
+ "IssuerLDAP": reflect.ValueOf(constant.MakeFromLiteral("\"ldap\"", token.STRING, 0)),
+ "IssuerLocal": reflect.ValueOf(constant.MakeFromLiteral("\"local\"", token.STRING, 0)),
+ "ListAllUsers": reflect.ValueOf(user.ListAllUsers),
+ "ListUsers": reflect.ValueOf(user.ListUsers),
+ "RegisterDeletionNotificationCron": reflect.ValueOf(user.RegisterDeletionNotificationCron),
+ "RegisterListeners": reflect.ValueOf(user.RegisterListeners),
+ "RegisterTokenCleanupCron": reflect.ValueOf(user.RegisterTokenCleanupCron),
+ "RequestDeletion": reflect.ValueOf(user.RequestDeletion),
+ "RequestUserPasswordResetToken": reflect.ValueOf(user.RequestUserPasswordResetToken),
+ "RequestUserPasswordResetTokenByEmail": reflect.ValueOf(user.RequestUserPasswordResetTokenByEmail),
+ "ResetPassword": reflect.ValueOf(user.ResetPassword),
+ "ScheduleDeletion": reflect.ValueOf(user.ScheduleDeletion),
+ "SetUserStatus": reflect.ValueOf(user.SetUserStatus),
+ "StatusActive": reflect.ValueOf(user.StatusActive),
+ "StatusDisabled": reflect.ValueOf(user.StatusDisabled),
+ "StatusEmailConfirmationRequired": reflect.ValueOf(user.StatusEmailConfirmationRequired),
+ "TOTPEnabledForUser": reflect.ValueOf(user.TOTPEnabledForUser),
+ "TokenAccountDeletion": reflect.ValueOf(user.TokenAccountDeletion),
+ "TokenCaldavAuth": reflect.ValueOf(user.TokenCaldavAuth),
+ "TokenEmailConfirm": reflect.ValueOf(user.TokenEmailConfirm),
+ "TokenPasswordReset": reflect.ValueOf(user.TokenPasswordReset),
+ "TokenUnknown": reflect.ValueOf(user.TokenUnknown),
+ "UpdateEmail": reflect.ValueOf(user.UpdateEmail),
+ "UpdateUser": reflect.ValueOf(user.UpdateUser),
+ "UpdateUserPassword": reflect.ValueOf(user.UpdateUserPassword),
+ "ValidateTOTPPasscode": reflect.ValueOf(user.ValidateTOTPPasscode),
+
+ // type definitions
+ "APIUserPassword": reflect.ValueOf((*user.APIUserPassword)(nil)),
+ "AccountDeletedNotification": reflect.ValueOf((*user.AccountDeletedNotification)(nil)),
+ "AccountDeletionConfirmNotification": reflect.ValueOf((*user.AccountDeletionConfirmNotification)(nil)),
+ "AccountDeletionNotification": reflect.ValueOf((*user.AccountDeletionNotification)(nil)),
+ "CreatedEvent": reflect.ValueOf((*user.CreatedEvent)(nil)),
+ "EmailConfirm": reflect.ValueOf((*user.EmailConfirm)(nil)),
+ "EmailConfirmNotification": reflect.ValueOf((*user.EmailConfirmNotification)(nil)),
+ "EmailUpdate": reflect.ValueOf((*user.EmailUpdate)(nil)),
+ "ErrAccountDisabled": reflect.ValueOf((*user.ErrAccountDisabled)(nil)),
+ "ErrAccountIsNotLocal": reflect.ValueOf((*user.ErrAccountIsNotLocal)(nil)),
+ "ErrCouldNotGetUserID": reflect.ValueOf((*user.ErrCouldNotGetUserID)(nil)),
+ "ErrEmailNotConfirmed": reflect.ValueOf((*user.ErrEmailNotConfirmed)(nil)),
+ "ErrEmptyNewPassword": reflect.ValueOf((*user.ErrEmptyNewPassword)(nil)),
+ "ErrEmptyOldPassword": reflect.ValueOf((*user.ErrEmptyOldPassword)(nil)),
+ "ErrInvalidAvatarProvider": reflect.ValueOf((*user.ErrInvalidAvatarProvider)(nil)),
+ "ErrInvalidClaimData": reflect.ValueOf((*user.ErrInvalidClaimData)(nil)),
+ "ErrInvalidDeletionToken": reflect.ValueOf((*user.ErrInvalidDeletionToken)(nil)),
+ "ErrInvalidEmailConfirmToken": reflect.ValueOf((*user.ErrInvalidEmailConfirmToken)(nil)),
+ "ErrInvalidPasswordResetToken": reflect.ValueOf((*user.ErrInvalidPasswordResetToken)(nil)),
+ "ErrInvalidTOTPPasscode": reflect.ValueOf((*user.ErrInvalidTOTPPasscode)(nil)),
+ "ErrInvalidTimezone": reflect.ValueOf((*user.ErrInvalidTimezone)(nil)),
+ "ErrInvalidUserContext": reflect.ValueOf((*user.ErrInvalidUserContext)(nil)),
+ "ErrMustNotBeLinkShare": reflect.ValueOf((*user.ErrMustNotBeLinkShare)(nil)),
+ "ErrNoOpenIDEmailProvided": reflect.ValueOf((*user.ErrNoOpenIDEmailProvided)(nil)),
+ "ErrNoPasswordResetToken": reflect.ValueOf((*user.ErrNoPasswordResetToken)(nil)),
+ "ErrNoUsernamePassword": reflect.ValueOf((*user.ErrNoUsernamePassword)(nil)),
+ "ErrOpenIDCustomScopeMalformed": reflect.ValueOf((*user.ErrOpenIDCustomScopeMalformed)(nil)),
+ "ErrTOTPAlreadyEnabled": reflect.ValueOf((*user.ErrTOTPAlreadyEnabled)(nil)),
+ "ErrTOTPNotEnabled": reflect.ValueOf((*user.ErrTOTPNotEnabled)(nil)),
+ "ErrTokenUserMismatch": reflect.ValueOf((*user.ErrTokenUserMismatch)(nil)),
+ "ErrUserDoesNotExist": reflect.ValueOf((*user.ErrUserDoesNotExist)(nil)),
+ "ErrUserEmailExists": reflect.ValueOf((*user.ErrUserEmailExists)(nil)),
+ "ErrUsernameExists": reflect.ValueOf((*user.ErrUsernameExists)(nil)),
+ "ErrUsernameMustNotContainSpaces": reflect.ValueOf((*user.ErrUsernameMustNotContainSpaces)(nil)),
+ "ErrUsernameReserved": reflect.ValueOf((*user.ErrUsernameReserved)(nil)),
+ "ErrWrongUsernameOrPassword": reflect.ValueOf((*user.ErrWrongUsernameOrPassword)(nil)),
+ "FailedLoginAttemptNotification": reflect.ValueOf((*user.FailedLoginAttemptNotification)(nil)),
+ "IncreaseUserCounter": reflect.ValueOf((*user.IncreaseUserCounter)(nil)),
+ "InvalidTOTPNotification": reflect.ValueOf((*user.InvalidTOTPNotification)(nil)),
+ "Login": reflect.ValueOf((*user.Login)(nil)),
+ "PasswordAccountLockedAfterInvalidTOTPNotification": reflect.ValueOf((*user.PasswordAccountLockedAfterInvalidTOTPNotification)(nil)),
+ "PasswordChangedNotification": reflect.ValueOf((*user.PasswordChangedNotification)(nil)),
+ "PasswordReset": reflect.ValueOf((*user.PasswordReset)(nil)),
+ "PasswordTokenRequest": reflect.ValueOf((*user.PasswordTokenRequest)(nil)),
+ "ProjectUserOpts": reflect.ValueOf((*user.ProjectUserOpts)(nil)),
+ "ResetPasswordNotification": reflect.ValueOf((*user.ResetPasswordNotification)(nil)),
+ "Status": reflect.ValueOf((*user.Status)(nil)),
+ "TOTP": reflect.ValueOf((*user.TOTP)(nil)),
+ "TOTPPasscode": reflect.ValueOf((*user.TOTPPasscode)(nil)),
+ "Token": reflect.ValueOf((*user.Token)(nil)),
+ "TokenKind": reflect.ValueOf((*user.TokenKind)(nil)),
+ "User": reflect.ValueOf((*user.User)(nil)),
+ }
+}
From 665f1b848cf12edcd8dba616d20544e74a84dff6 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:21:49 +0200
Subject: [PATCH 132/156] feat(plugins): extract third-party symbols for yaegi
Generated symbol tables for echo and watermill, enabling yaegi plugins
to use HTTP routing and the event/message system.
Exclude pkg/yaegi_symbols/ from golangci-lint (generated code).
---
.golangci.yml | 2 +
pkg/yaegi_symbols/echo.go | 285 +++++++++++++++++++++++++++++++++
pkg/yaegi_symbols/watermill.go | 88 ++++++++++
3 files changed, 375 insertions(+)
create mode 100644 pkg/yaegi_symbols/echo.go
create mode 100644 pkg/yaegi_symbols/watermill.go
diff --git a/.golangci.yml b/.golangci.yml
index 53021526b..6f1a759f2 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -171,6 +171,7 @@ linters:
- builtin$
- examples$
- pkg/routes/api/v1/docs.go
+ - pkg/yaegi_symbols/..*
- plugins-dev/..*
formatters:
enable:
@@ -182,3 +183,4 @@ formatters:
- third_party$
- builtin$
- examples$
+ - pkg/yaegi_symbols/..*
diff --git a/pkg/yaegi_symbols/echo.go b/pkg/yaegi_symbols/echo.go
new file mode 100644
index 000000000..96bff12ad
--- /dev/null
+++ b/pkg/yaegi_symbols/echo.go
@@ -0,0 +1,285 @@
+package yaegi_symbols
+
+import (
+ "github.com/labstack/echo/v5"
+ "go/constant"
+ "go/token"
+ "io"
+ "reflect"
+)
+
+func init() {
+ Symbols["github.com/labstack/echo/v5/echo"] = map[string]reflect.Value{
+ // function, constant and variable definitions
+ "BindBody": reflect.ValueOf(echo.BindBody),
+ "BindHeaders": reflect.ValueOf(echo.BindHeaders),
+ "BindPathValues": reflect.ValueOf(echo.BindPathValues),
+ "BindQueryParams": reflect.ValueOf(echo.BindQueryParams),
+ "ContextKeyHeaderAllow": reflect.ValueOf(constant.MakeFromLiteral("\"echo_header_allow\"", token.STRING, 0)),
+ "DefaultHTTPErrorHandler": reflect.ValueOf(echo.DefaultHTTPErrorHandler),
+ "ErrBadGateway": reflect.ValueOf(&echo.ErrBadGateway).Elem(),
+ "ErrBadRequest": reflect.ValueOf(&echo.ErrBadRequest).Elem(),
+ "ErrCookieNotFound": reflect.ValueOf(&echo.ErrCookieNotFound).Elem(),
+ "ErrForbidden": reflect.ValueOf(&echo.ErrForbidden).Elem(),
+ "ErrInternalServerError": reflect.ValueOf(&echo.ErrInternalServerError).Elem(),
+ "ErrInvalidCertOrKeyType": reflect.ValueOf(&echo.ErrInvalidCertOrKeyType).Elem(),
+ "ErrInvalidKeyType": reflect.ValueOf(&echo.ErrInvalidKeyType).Elem(),
+ "ErrInvalidListenerNetwork": reflect.ValueOf(&echo.ErrInvalidListenerNetwork).Elem(),
+ "ErrInvalidRedirectCode": reflect.ValueOf(&echo.ErrInvalidRedirectCode).Elem(),
+ "ErrMethodNotAllowed": reflect.ValueOf(&echo.ErrMethodNotAllowed).Elem(),
+ "ErrNonExistentKey": reflect.ValueOf(&echo.ErrNonExistentKey).Elem(),
+ "ErrNotFound": reflect.ValueOf(&echo.ErrNotFound).Elem(),
+ "ErrRendererNotRegistered": reflect.ValueOf(&echo.ErrRendererNotRegistered).Elem(),
+ "ErrRequestTimeout": reflect.ValueOf(&echo.ErrRequestTimeout).Elem(),
+ "ErrServiceUnavailable": reflect.ValueOf(&echo.ErrServiceUnavailable).Elem(),
+ "ErrStatusRequestEntityTooLarge": reflect.ValueOf(&echo.ErrStatusRequestEntityTooLarge).Elem(),
+ "ErrTooManyRequests": reflect.ValueOf(&echo.ErrTooManyRequests).Elem(),
+ "ErrUnauthorized": reflect.ValueOf(&echo.ErrUnauthorized).Elem(),
+ "ErrUnsupportedMediaType": reflect.ValueOf(&echo.ErrUnsupportedMediaType).Elem(),
+ "ErrValidatorNotRegistered": reflect.ValueOf(&echo.ErrValidatorNotRegistered).Elem(),
+ "ExtractIPDirect": reflect.ValueOf(echo.ExtractIPDirect),
+ "ExtractIPFromRealIPHeader": reflect.ValueOf(echo.ExtractIPFromRealIPHeader),
+ "ExtractIPFromXFFHeader": reflect.ValueOf(echo.ExtractIPFromXFFHeader),
+ "FormFieldBinder": reflect.ValueOf(echo.FormFieldBinder),
+ "HandlerName": reflect.ValueOf(echo.HandlerName),
+ "HeaderAccept": reflect.ValueOf(constant.MakeFromLiteral("\"Accept\"", token.STRING, 0)),
+ "HeaderAcceptEncoding": reflect.ValueOf(constant.MakeFromLiteral("\"Accept-Encoding\"", token.STRING, 0)),
+ "HeaderAccessControlAllowCredentials": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Allow-Credentials\"", token.STRING, 0)),
+ "HeaderAccessControlAllowHeaders": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Allow-Headers\"", token.STRING, 0)),
+ "HeaderAccessControlAllowMethods": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Allow-Methods\"", token.STRING, 0)),
+ "HeaderAccessControlAllowOrigin": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Allow-Origin\"", token.STRING, 0)),
+ "HeaderAccessControlExposeHeaders": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Expose-Headers\"", token.STRING, 0)),
+ "HeaderAccessControlMaxAge": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Max-Age\"", token.STRING, 0)),
+ "HeaderAccessControlRequestHeaders": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Request-Headers\"", token.STRING, 0)),
+ "HeaderAccessControlRequestMethod": reflect.ValueOf(constant.MakeFromLiteral("\"Access-Control-Request-Method\"", token.STRING, 0)),
+ "HeaderAllow": reflect.ValueOf(constant.MakeFromLiteral("\"Allow\"", token.STRING, 0)),
+ "HeaderAuthorization": reflect.ValueOf(constant.MakeFromLiteral("\"Authorization\"", token.STRING, 0)),
+ "HeaderCacheControl": reflect.ValueOf(constant.MakeFromLiteral("\"Cache-Control\"", token.STRING, 0)),
+ "HeaderConnection": reflect.ValueOf(constant.MakeFromLiteral("\"Connection\"", token.STRING, 0)),
+ "HeaderContentDisposition": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Disposition\"", token.STRING, 0)),
+ "HeaderContentEncoding": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Encoding\"", token.STRING, 0)),
+ "HeaderContentLength": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Length\"", token.STRING, 0)),
+ "HeaderContentSecurityPolicy": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Security-Policy\"", token.STRING, 0)),
+ "HeaderContentSecurityPolicyReportOnly": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Security-Policy-Report-Only\"", token.STRING, 0)),
+ "HeaderContentType": reflect.ValueOf(constant.MakeFromLiteral("\"Content-Type\"", token.STRING, 0)),
+ "HeaderCookie": reflect.ValueOf(constant.MakeFromLiteral("\"Cookie\"", token.STRING, 0)),
+ "HeaderIfModifiedSince": reflect.ValueOf(constant.MakeFromLiteral("\"If-Modified-Since\"", token.STRING, 0)),
+ "HeaderLastModified": reflect.ValueOf(constant.MakeFromLiteral("\"Last-Modified\"", token.STRING, 0)),
+ "HeaderLocation": reflect.ValueOf(constant.MakeFromLiteral("\"Location\"", token.STRING, 0)),
+ "HeaderOrigin": reflect.ValueOf(constant.MakeFromLiteral("\"Origin\"", token.STRING, 0)),
+ "HeaderReferrerPolicy": reflect.ValueOf(constant.MakeFromLiteral("\"Referrer-Policy\"", token.STRING, 0)),
+ "HeaderRetryAfter": reflect.ValueOf(constant.MakeFromLiteral("\"Retry-After\"", token.STRING, 0)),
+ "HeaderSecFetchSite": reflect.ValueOf(constant.MakeFromLiteral("\"Sec-Fetch-Site\"", token.STRING, 0)),
+ "HeaderServer": reflect.ValueOf(constant.MakeFromLiteral("\"Server\"", token.STRING, 0)),
+ "HeaderSetCookie": reflect.ValueOf(constant.MakeFromLiteral("\"Set-Cookie\"", token.STRING, 0)),
+ "HeaderStrictTransportSecurity": reflect.ValueOf(constant.MakeFromLiteral("\"Strict-Transport-Security\"", token.STRING, 0)),
+ "HeaderUpgrade": reflect.ValueOf(constant.MakeFromLiteral("\"Upgrade\"", token.STRING, 0)),
+ "HeaderVary": reflect.ValueOf(constant.MakeFromLiteral("\"Vary\"", token.STRING, 0)),
+ "HeaderWWWAuthenticate": reflect.ValueOf(constant.MakeFromLiteral("\"WWW-Authenticate\"", token.STRING, 0)),
+ "HeaderXCSRFToken": reflect.ValueOf(constant.MakeFromLiteral("\"X-CSRF-Token\"", token.STRING, 0)),
+ "HeaderXContentTypeOptions": reflect.ValueOf(constant.MakeFromLiteral("\"X-Content-Type-Options\"", token.STRING, 0)),
+ "HeaderXCorrelationID": reflect.ValueOf(constant.MakeFromLiteral("\"X-Correlation-Id\"", token.STRING, 0)),
+ "HeaderXForwardedFor": reflect.ValueOf(constant.MakeFromLiteral("\"X-Forwarded-For\"", token.STRING, 0)),
+ "HeaderXForwardedProto": reflect.ValueOf(constant.MakeFromLiteral("\"X-Forwarded-Proto\"", token.STRING, 0)),
+ "HeaderXForwardedProtocol": reflect.ValueOf(constant.MakeFromLiteral("\"X-Forwarded-Protocol\"", token.STRING, 0)),
+ "HeaderXForwardedSsl": reflect.ValueOf(constant.MakeFromLiteral("\"X-Forwarded-Ssl\"", token.STRING, 0)),
+ "HeaderXFrameOptions": reflect.ValueOf(constant.MakeFromLiteral("\"X-Frame-Options\"", token.STRING, 0)),
+ "HeaderXHTTPMethodOverride": reflect.ValueOf(constant.MakeFromLiteral("\"X-HTTP-Method-Override\"", token.STRING, 0)),
+ "HeaderXRealIP": reflect.ValueOf(constant.MakeFromLiteral("\"X-Real-Ip\"", token.STRING, 0)),
+ "HeaderXRequestID": reflect.ValueOf(constant.MakeFromLiteral("\"X-Request-Id\"", token.STRING, 0)),
+ "HeaderXRequestedWith": reflect.ValueOf(constant.MakeFromLiteral("\"X-Requested-With\"", token.STRING, 0)),
+ "HeaderXUrlScheme": reflect.ValueOf(constant.MakeFromLiteral("\"X-Url-Scheme\"", token.STRING, 0)),
+ "HeaderXXSSProtection": reflect.ValueOf(constant.MakeFromLiteral("\"X-XSS-Protection\"", token.STRING, 0)),
+ "MIMEApplicationForm": reflect.ValueOf(constant.MakeFromLiteral("\"application/x-www-form-urlencoded\"", token.STRING, 0)),
+ "MIMEApplicationJSON": reflect.ValueOf(constant.MakeFromLiteral("\"application/json\"", token.STRING, 0)),
+ "MIMEApplicationJSONCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"application/json; charset=UTF-8\"", token.STRING, 0)),
+ "MIMEApplicationJavaScript": reflect.ValueOf(constant.MakeFromLiteral("\"application/javascript\"", token.STRING, 0)),
+ "MIMEApplicationJavaScriptCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"application/javascript; charset=UTF-8\"", token.STRING, 0)),
+ "MIMEApplicationMsgpack": reflect.ValueOf(constant.MakeFromLiteral("\"application/msgpack\"", token.STRING, 0)),
+ "MIMEApplicationProtobuf": reflect.ValueOf(constant.MakeFromLiteral("\"application/protobuf\"", token.STRING, 0)),
+ "MIMEApplicationXML": reflect.ValueOf(constant.MakeFromLiteral("\"application/xml\"", token.STRING, 0)),
+ "MIMEApplicationXMLCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"application/xml; charset=UTF-8\"", token.STRING, 0)),
+ "MIMEMultipartForm": reflect.ValueOf(constant.MakeFromLiteral("\"multipart/form-data\"", token.STRING, 0)),
+ "MIMEOctetStream": reflect.ValueOf(constant.MakeFromLiteral("\"application/octet-stream\"", token.STRING, 0)),
+ "MIMETextHTML": reflect.ValueOf(constant.MakeFromLiteral("\"text/html\"", token.STRING, 0)),
+ "MIMETextHTMLCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"text/html; charset=UTF-8\"", token.STRING, 0)),
+ "MIMETextPlain": reflect.ValueOf(constant.MakeFromLiteral("\"text/plain\"", token.STRING, 0)),
+ "MIMETextPlainCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"text/plain; charset=UTF-8\"", token.STRING, 0)),
+ "MIMETextXML": reflect.ValueOf(constant.MakeFromLiteral("\"text/xml\"", token.STRING, 0)),
+ "MIMETextXMLCharsetUTF8": reflect.ValueOf(constant.MakeFromLiteral("\"text/xml; charset=UTF-8\"", token.STRING, 0)),
+ "MethodNotAllowedRouteName": reflect.ValueOf(constant.MakeFromLiteral("\"echo_route_method_not_allowed_name\"", token.STRING, 0)),
+ "MustSubFS": reflect.ValueOf(echo.MustSubFS),
+ "New": reflect.ValueOf(echo.New),
+ "NewBindingError": reflect.ValueOf(echo.NewBindingError),
+ "NewConcurrentRouter": reflect.ValueOf(echo.NewConcurrentRouter),
+ "NewContext": reflect.ValueOf(echo.NewContext),
+ "NewHTTPError": reflect.ValueOf(echo.NewHTTPError),
+ "NewResponse": reflect.ValueOf(echo.NewResponse),
+ "NewRouter": reflect.ValueOf(echo.NewRouter),
+ "NewVirtualHostHandler": reflect.ValueOf(echo.NewVirtualHostHandler),
+ "NewWithConfig": reflect.ValueOf(echo.NewWithConfig),
+ "NotFoundRouteName": reflect.ValueOf(constant.MakeFromLiteral("\"echo_route_not_found_name\"", token.STRING, 0)),
+ "PROPFIND": reflect.ValueOf(constant.MakeFromLiteral("\"PROPFIND\"", token.STRING, 0)),
+ "PathValuesBinder": reflect.ValueOf(echo.PathValuesBinder),
+ "QueryParamsBinder": reflect.ValueOf(echo.QueryParamsBinder),
+ "REPORT": reflect.ValueOf(constant.MakeFromLiteral("\"REPORT\"", token.STRING, 0)),
+ "RouteAny": reflect.ValueOf(constant.MakeFromLiteral("\"echo_route_any\"", token.STRING, 0)),
+ "RouteNotFound": reflect.ValueOf(constant.MakeFromLiteral("\"echo_route_not_found\"", token.STRING, 0)),
+ "StaticDirectoryHandler": reflect.ValueOf(echo.StaticDirectoryHandler),
+ "StaticFileHandler": reflect.ValueOf(echo.StaticFileHandler),
+ "TimeLayoutUnixTime": reflect.ValueOf(echo.TimeLayoutUnixTime),
+ "TimeLayoutUnixTimeMilli": reflect.ValueOf(echo.TimeLayoutUnixTimeMilli),
+ "TimeLayoutUnixTimeNano": reflect.ValueOf(echo.TimeLayoutUnixTimeNano),
+ "TrustIPRange": reflect.ValueOf(echo.TrustIPRange),
+ "TrustLinkLocal": reflect.ValueOf(echo.TrustLinkLocal),
+ "TrustLoopback": reflect.ValueOf(echo.TrustLoopback),
+ "TrustPrivateNet": reflect.ValueOf(echo.TrustPrivateNet),
+ "UnwrapResponse": reflect.ValueOf(echo.UnwrapResponse),
+ "Version": reflect.ValueOf(constant.MakeFromLiteral("\"5.0.0\"", token.STRING, 0)),
+ "WrapHandler": reflect.ValueOf(echo.WrapHandler),
+ "WrapMiddleware": reflect.ValueOf(echo.WrapMiddleware),
+
+ // type definitions
+ "AddRouteError": reflect.ValueOf((*echo.AddRouteError)(nil)),
+ "BindUnmarshaler": reflect.ValueOf((*echo.BindUnmarshaler)(nil)),
+ "Binder": reflect.ValueOf((*echo.Binder)(nil)),
+ "BindingError": reflect.ValueOf((*echo.BindingError)(nil)),
+ "Config": reflect.ValueOf((*echo.Config)(nil)),
+ "Context": reflect.ValueOf((*echo.Context)(nil)),
+ "DefaultBinder": reflect.ValueOf((*echo.DefaultBinder)(nil)),
+ "DefaultJSONSerializer": reflect.ValueOf((*echo.DefaultJSONSerializer)(nil)),
+ "DefaultRouter": reflect.ValueOf((*echo.DefaultRouter)(nil)),
+ "Echo": reflect.ValueOf((*echo.Echo)(nil)),
+ "Group": reflect.ValueOf((*echo.Group)(nil)),
+ "HTTPError": reflect.ValueOf((*echo.HTTPError)(nil)),
+ "HTTPErrorHandler": reflect.ValueOf((*echo.HTTPErrorHandler)(nil)),
+ "HTTPStatusCoder": reflect.ValueOf((*echo.HTTPStatusCoder)(nil)),
+ "HandlerFunc": reflect.ValueOf((*echo.HandlerFunc)(nil)),
+ "IPExtractor": reflect.ValueOf((*echo.IPExtractor)(nil)),
+ "JSONSerializer": reflect.ValueOf((*echo.JSONSerializer)(nil)),
+ "MiddlewareConfigurator": reflect.ValueOf((*echo.MiddlewareConfigurator)(nil)),
+ "MiddlewareFunc": reflect.ValueOf((*echo.MiddlewareFunc)(nil)),
+ "PathValue": reflect.ValueOf((*echo.PathValue)(nil)),
+ "PathValues": reflect.ValueOf((*echo.PathValues)(nil)),
+ "Renderer": reflect.ValueOf((*echo.Renderer)(nil)),
+ "Response": reflect.ValueOf((*echo.Response)(nil)),
+ "Route": reflect.ValueOf((*echo.Route)(nil)),
+ "RouteInfo": reflect.ValueOf((*echo.RouteInfo)(nil)),
+ "Router": reflect.ValueOf((*echo.Router)(nil)),
+ "RouterConfig": reflect.ValueOf((*echo.RouterConfig)(nil)),
+ "Routes": reflect.ValueOf((*echo.Routes)(nil)),
+ "StartConfig": reflect.ValueOf((*echo.StartConfig)(nil)),
+ "TemplateRenderer": reflect.ValueOf((*echo.TemplateRenderer)(nil)),
+ "TimeLayout": reflect.ValueOf((*echo.TimeLayout)(nil)),
+ "TimeOpts": reflect.ValueOf((*echo.TimeOpts)(nil)),
+ "TrustOption": reflect.ValueOf((*echo.TrustOption)(nil)),
+ "Validator": reflect.ValueOf((*echo.Validator)(nil)),
+ "ValueBinder": reflect.ValueOf((*echo.ValueBinder)(nil)),
+
+ // interface wrapper definitions
+ "_BindUnmarshaler": reflect.ValueOf((*_github_com_labstack_echo_v5_BindUnmarshaler)(nil)),
+ "_Binder": reflect.ValueOf((*_github_com_labstack_echo_v5_Binder)(nil)),
+ "_HTTPStatusCoder": reflect.ValueOf((*_github_com_labstack_echo_v5_HTTPStatusCoder)(nil)),
+ "_JSONSerializer": reflect.ValueOf((*_github_com_labstack_echo_v5_JSONSerializer)(nil)),
+ "_MiddlewareConfigurator": reflect.ValueOf((*_github_com_labstack_echo_v5_MiddlewareConfigurator)(nil)),
+ "_Renderer": reflect.ValueOf((*_github_com_labstack_echo_v5_Renderer)(nil)),
+ "_Router": reflect.ValueOf((*_github_com_labstack_echo_v5_Router)(nil)),
+ "_Validator": reflect.ValueOf((*_github_com_labstack_echo_v5_Validator)(nil)),
+ }
+}
+
+// _github_com_labstack_echo_v5_BindUnmarshaler is an interface wrapper for BindUnmarshaler type
+type _github_com_labstack_echo_v5_BindUnmarshaler struct {
+ IValue interface{}
+ WUnmarshalParam func(param string) error
+}
+
+func (W _github_com_labstack_echo_v5_BindUnmarshaler) UnmarshalParam(param string) error {
+ return W.WUnmarshalParam(param)
+}
+
+// _github_com_labstack_echo_v5_Binder is an interface wrapper for Binder type
+type _github_com_labstack_echo_v5_Binder struct {
+ IValue interface{}
+ WBind func(c *echo.Context, target any) error
+}
+
+func (W _github_com_labstack_echo_v5_Binder) Bind(c *echo.Context, target any) error {
+ return W.WBind(c, target)
+}
+
+// _github_com_labstack_echo_v5_HTTPStatusCoder is an interface wrapper for HTTPStatusCoder type
+type _github_com_labstack_echo_v5_HTTPStatusCoder struct {
+ IValue interface{}
+ WStatusCode func() int
+}
+
+func (W _github_com_labstack_echo_v5_HTTPStatusCoder) StatusCode() int {
+ return W.WStatusCode()
+}
+
+// _github_com_labstack_echo_v5_JSONSerializer is an interface wrapper for JSONSerializer type
+type _github_com_labstack_echo_v5_JSONSerializer struct {
+ IValue interface{}
+ WDeserialize func(c *echo.Context, target any) error
+ WSerialize func(c *echo.Context, target any, indent string) error
+}
+
+func (W _github_com_labstack_echo_v5_JSONSerializer) Deserialize(c *echo.Context, target any) error {
+ return W.WDeserialize(c, target)
+}
+func (W _github_com_labstack_echo_v5_JSONSerializer) Serialize(c *echo.Context, target any, indent string) error {
+ return W.WSerialize(c, target, indent)
+}
+
+// _github_com_labstack_echo_v5_MiddlewareConfigurator is an interface wrapper for MiddlewareConfigurator type
+type _github_com_labstack_echo_v5_MiddlewareConfigurator struct {
+ IValue interface{}
+ WToMiddleware func() (echo.MiddlewareFunc, error)
+}
+
+func (W _github_com_labstack_echo_v5_MiddlewareConfigurator) ToMiddleware() (echo.MiddlewareFunc, error) {
+ return W.WToMiddleware()
+}
+
+// _github_com_labstack_echo_v5_Renderer is an interface wrapper for Renderer type
+type _github_com_labstack_echo_v5_Renderer struct {
+ IValue interface{}
+ WRender func(c *echo.Context, w io.Writer, templateName string, data any) error
+}
+
+func (W _github_com_labstack_echo_v5_Renderer) Render(c *echo.Context, w io.Writer, templateName string, data any) error {
+ return W.WRender(c, w, templateName, data)
+}
+
+// _github_com_labstack_echo_v5_Router is an interface wrapper for Router type
+type _github_com_labstack_echo_v5_Router struct {
+ IValue interface{}
+ WAdd func(routable echo.Route) (echo.RouteInfo, error)
+ WRemove func(method string, path string) error
+ WRoute func(c *echo.Context) echo.HandlerFunc
+ WRoutes func() echo.Routes
+}
+
+func (W _github_com_labstack_echo_v5_Router) Add(routable echo.Route) (echo.RouteInfo, error) {
+ return W.WAdd(routable)
+}
+func (W _github_com_labstack_echo_v5_Router) Remove(method string, path string) error {
+ return W.WRemove(method, path)
+}
+func (W _github_com_labstack_echo_v5_Router) Route(c *echo.Context) echo.HandlerFunc {
+ return W.WRoute(c)
+}
+func (W _github_com_labstack_echo_v5_Router) Routes() echo.Routes {
+ return W.WRoutes()
+}
+
+// _github_com_labstack_echo_v5_Validator is an interface wrapper for Validator type
+type _github_com_labstack_echo_v5_Validator struct {
+ IValue interface{}
+ WValidate func(i any) error
+}
+
+func (W _github_com_labstack_echo_v5_Validator) Validate(i any) error {
+ return W.WValidate(i)
+}
diff --git a/pkg/yaegi_symbols/watermill.go b/pkg/yaegi_symbols/watermill.go
new file mode 100644
index 000000000..f96e51e19
--- /dev/null
+++ b/pkg/yaegi_symbols/watermill.go
@@ -0,0 +1,88 @@
+package yaegi_symbols
+
+import (
+ "context"
+ "github.com/ThreeDotsLabs/watermill/message"
+ "reflect"
+)
+
+func init() {
+ Symbols["github.com/ThreeDotsLabs/watermill/message/message"] = map[string]reflect.Value{
+ // function, constant and variable definitions
+ "ErrOutputInNoPublisherHandler": reflect.ValueOf(&message.ErrOutputInNoPublisherHandler).Elem(),
+ "HandlerNameFromCtx": reflect.ValueOf(message.HandlerNameFromCtx),
+ "MessageTransformPublisherDecorator": reflect.ValueOf(message.MessageTransformPublisherDecorator),
+ "MessageTransformSubscriberDecorator": reflect.ValueOf(message.MessageTransformSubscriberDecorator),
+ "NewDefaultRouter": reflect.ValueOf(message.NewDefaultRouter),
+ "NewMessage": reflect.ValueOf(message.NewMessage),
+ "NewMessageWithContext": reflect.ValueOf(message.NewMessageWithContext),
+ "NewRouter": reflect.ValueOf(message.NewRouter),
+ "PassthroughHandler": reflect.ValueOf(&message.PassthroughHandler).Elem(),
+ "PublishTopicFromCtx": reflect.ValueOf(message.PublishTopicFromCtx),
+ "PublisherNameFromCtx": reflect.ValueOf(message.PublisherNameFromCtx),
+ "SubscribeTopicFromCtx": reflect.ValueOf(message.SubscribeTopicFromCtx),
+ "SubscriberNameFromCtx": reflect.ValueOf(message.SubscriberNameFromCtx),
+
+ // type definitions
+ "DuplicateHandlerNameError": reflect.ValueOf((*message.DuplicateHandlerNameError)(nil)),
+ "Handler": reflect.ValueOf((*message.Handler)(nil)),
+ "HandlerFunc": reflect.ValueOf((*message.HandlerFunc)(nil)),
+ "HandlerMiddleware": reflect.ValueOf((*message.HandlerMiddleware)(nil)),
+ "Message": reflect.ValueOf((*message.Message)(nil)),
+ "Messages": reflect.ValueOf((*message.Messages)(nil)),
+ "Metadata": reflect.ValueOf((*message.Metadata)(nil)),
+ "NoPublishHandlerFunc": reflect.ValueOf((*message.NoPublishHandlerFunc)(nil)),
+ "Payload": reflect.ValueOf((*message.Payload)(nil)),
+ "Publisher": reflect.ValueOf((*message.Publisher)(nil)),
+ "PublisherDecorator": reflect.ValueOf((*message.PublisherDecorator)(nil)),
+ "Router": reflect.ValueOf((*message.Router)(nil)),
+ "RouterConfig": reflect.ValueOf((*message.RouterConfig)(nil)),
+ "RouterPlugin": reflect.ValueOf((*message.RouterPlugin)(nil)),
+ "SubscribeInitializer": reflect.ValueOf((*message.SubscribeInitializer)(nil)),
+ "Subscriber": reflect.ValueOf((*message.Subscriber)(nil)),
+ "SubscriberDecorator": reflect.ValueOf((*message.SubscriberDecorator)(nil)),
+
+ // interface wrapper definitions
+ "_Publisher": reflect.ValueOf((*_github_com_ThreeDotsLabs_watermill_message_Publisher)(nil)),
+ "_SubscribeInitializer": reflect.ValueOf((*_github_com_ThreeDotsLabs_watermill_message_SubscribeInitializer)(nil)),
+ "_Subscriber": reflect.ValueOf((*_github_com_ThreeDotsLabs_watermill_message_Subscriber)(nil)),
+ }
+}
+
+// _github_com_ThreeDotsLabs_watermill_message_Publisher is an interface wrapper for Publisher type
+type _github_com_ThreeDotsLabs_watermill_message_Publisher struct {
+ IValue interface{}
+ WClose func() error
+ WPublish func(topic string, messages ...*message.Message) error
+}
+
+func (W _github_com_ThreeDotsLabs_watermill_message_Publisher) Close() error {
+ return W.WClose()
+}
+func (W _github_com_ThreeDotsLabs_watermill_message_Publisher) Publish(topic string, messages ...*message.Message) error {
+ return W.WPublish(topic, messages...)
+}
+
+// _github_com_ThreeDotsLabs_watermill_message_SubscribeInitializer is an interface wrapper for SubscribeInitializer type
+type _github_com_ThreeDotsLabs_watermill_message_SubscribeInitializer struct {
+ IValue interface{}
+ WSubscribeInitialize func(topic string) error
+}
+
+func (W _github_com_ThreeDotsLabs_watermill_message_SubscribeInitializer) SubscribeInitialize(topic string) error {
+ return W.WSubscribeInitialize(topic)
+}
+
+// _github_com_ThreeDotsLabs_watermill_message_Subscriber is an interface wrapper for Subscriber type
+type _github_com_ThreeDotsLabs_watermill_message_Subscriber struct {
+ IValue interface{}
+ WClose func() error
+ WSubscribe func(ctx context.Context, topic string) (<-chan *message.Message, error)
+}
+
+func (W _github_com_ThreeDotsLabs_watermill_message_Subscriber) Close() error {
+ return W.WClose()
+}
+func (W _github_com_ThreeDotsLabs_watermill_message_Subscriber) Subscribe(ctx context.Context, topic string) (<-chan *message.Message, error) {
+ return W.WSubscribe(ctx, topic)
+}
From cc39aa7f08461bb4164b3e7135e1854a226cbe47 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:21:57 +0200
Subject: [PATCH 133/156] feat(plugins): add yaegi interpreter-based plugin
loader
EvalPath-based loading of Go source directories with typed factory
functions for interface bridging (required by yaegi's wrapping model).
Supports all plugin capabilities: routes, events, and migrations.
Registers itself into the Manager via init() to avoid import cycles.
---
pkg/plugins/yaegi/loader.go | 118 ++++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
create mode 100644 pkg/plugins/yaegi/loader.go
diff --git a/pkg/plugins/yaegi/loader.go b/pkg/plugins/yaegi/loader.go
new file mode 100644
index 000000000..9eb5aeaae
--- /dev/null
+++ b/pkg/plugins/yaegi/loader.go
@@ -0,0 +1,118 @@
+// Vikunja is a to-do list application to facilitate your life.
+// Copyright 2018-present Vikunja and contributors. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+package yaegi
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "code.vikunja.io/api/pkg/plugins"
+ "code.vikunja.io/api/pkg/yaegi_symbols"
+
+ "github.com/traefik/yaegi/interp"
+ "github.com/traefik/yaegi/stdlib"
+)
+
+func init() {
+ plugins.YaegiPluginLoader = LoadPluginFull
+}
+
+// LoadPlugin loads a plugin from a directory of Go source files using the Yaegi interpreter.
+func LoadPlugin(dir string) (plugins.Plugin, error) {
+ loaded, err := LoadPluginFull(dir)
+ if err != nil {
+ return nil, err
+ }
+ return loaded.Plugin, nil
+}
+
+// LoadPluginFull loads a plugin and all its optional capabilities via typed factory functions.
+//
+// Because Yaegi wraps interpreted values per return type, sub-interface type assertions
+// (e.g. Plugin -> AuthenticatedRouterPlugin) do not work. Instead, plugins must export
+// typed factory functions for each capability they implement:
+//
+// - NewPlugin() plugins.Plugin (required)
+// - NewAuthenticatedRouterPlugin() plugins.AuthenticatedRouterPlugin (optional)
+// - NewUnauthenticatedRouterPlugin() plugins.UnauthenticatedRouterPlugin (optional)
+// - NewMigrationPlugin() plugins.MigrationPlugin (optional)
+func LoadPluginFull(dir string) (*plugins.LoadedYaegiPlugin, error) {
+ i := interp.New(interp.Options{})
+ if err := i.Use(stdlib.Symbols); err != nil {
+ return nil, fmt.Errorf("loading stdlib symbols: %w", err)
+ }
+ if err := i.Use(yaegi_symbols.Symbols); err != nil {
+ return nil, fmt.Errorf("loading vikunja symbols: %w", err)
+ }
+
+ // Read and evaluate all .go files in the plugin directory.
+ entries, err := os.ReadDir(dir)
+ if err != nil {
+ return nil, fmt.Errorf("reading plugin dir %s: %w", dir, err)
+ }
+
+ for _, e := range entries {
+ if e.IsDir() || !strings.HasSuffix(e.Name(), ".go") {
+ continue
+ }
+ src, err := os.ReadFile(filepath.Join(dir, e.Name()))
+ if err != nil {
+ return nil, fmt.Errorf("reading %s: %w", e.Name(), err)
+ }
+ if _, err = i.Eval(string(src)); err != nil {
+ return nil, fmt.Errorf("evaluating %s: %w", e.Name(), err)
+ }
+ }
+
+ loaded := &plugins.LoadedYaegiPlugin{}
+
+ // Required: NewPlugin
+ v, err := i.Eval("main.NewPlugin")
+ if err != nil {
+ return nil, fmt.Errorf("looking up NewPlugin: %w", err)
+ }
+ newPlugin, ok := v.Interface().(func() plugins.Plugin)
+ if !ok {
+ return nil, fmt.Errorf("NewPlugin has wrong signature: %T", v.Interface())
+ }
+ loaded.Plugin = newPlugin()
+
+ // Optional: NewAuthenticatedRouterPlugin
+ if v, err := i.Eval("main.NewAuthenticatedRouterPlugin"); err == nil {
+ if fn, ok := v.Interface().(func() plugins.AuthenticatedRouterPlugin); ok {
+ loaded.AuthRouter = fn()
+ }
+ }
+
+ // Optional: NewUnauthenticatedRouterPlugin
+ if v, err := i.Eval("main.NewUnauthenticatedRouterPlugin"); err == nil {
+ if fn, ok := v.Interface().(func() plugins.UnauthenticatedRouterPlugin); ok {
+ loaded.UnauthRouter = fn()
+ }
+ }
+
+ // Optional: NewMigrationPlugin
+ if v, err := i.Eval("main.NewMigrationPlugin"); err == nil {
+ if fn, ok := v.Interface().(func() plugins.MigrationPlugin); ok {
+ loaded.Migration = fn()
+ }
+ }
+
+ return loaded, nil
+}
From 273da5b4db479d2b90f4bd9010e789e426dea146 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:22:02 +0200
Subject: [PATCH 134/156] feat(plugins): add example plugin
Demonstrates all plugin capabilities: authenticated and unauthenticated
routes, event listeners, and lifecycle hooks. Uses a shared singleton
for factory functions so Init() state is available to route handlers.
---
examples/plugins/example/main.go | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/examples/plugins/example/main.go b/examples/plugins/example/main.go
index f791f0b02..afb358b2f 100644
--- a/examples/plugins/example/main.go
+++ b/examples/plugins/example/main.go
@@ -92,7 +92,19 @@ func handleStatus(c *echo.Context) error {
})
}
-func NewPlugin() plugins.Plugin { return &ExamplePlugin{} }
+// singleton ensures all factory functions return the same instance so that state
+// initialized in Init() (e.g. event listeners, DB connections) is available to
+// route handlers and other capabilities.
+var singleton = &ExamplePlugin{}
+
+func NewPlugin() plugins.Plugin { return singleton }
+
+// Typed factory functions for Yaegi compatibility.
+// Yaegi wraps return values per the declared return type, so sub-interface type
+// assertions (Plugin -> AuthenticatedRouterPlugin) don't work. These typed
+// factories ensure Yaegi wraps the value with the correct interface wrapper.
+func NewAuthenticatedRouterPlugin() plugins.AuthenticatedRouterPlugin { return singleton }
+func NewUnauthenticatedRouterPlugin() plugins.UnauthenticatedRouterPlugin { return singleton }
type TestListener struct{}
From 59abe1bd84aab6072bca32ace5df0cbf479f1fae Mon Sep 17 00:00:00 2001
From: kolaente
Date: Mon, 30 Mar 2026 22:25:04 +0200
Subject: [PATCH 135/156] test(plugins): add yaegi plugin integration tests
- Smoke test: verify yaegi can load stdlib and vikunja symbols
- Loader test: load example plugin and verify Name/Version
- Routes test: verify plugin HTTP routes serve responses
- Events test: verify plugin event listener registration via Init()
---
pkg/plugins/yaegi/events_test.go | 48 ++++++++++++++++++
pkg/plugins/yaegi/loader_test.go | 70 ++++++++++++++++++++++++++
pkg/plugins/yaegi/routes_test.go | 63 +++++++++++++++++++++++
pkg/yaegi_symbols/stdlib_check_test.go | 26 ++++++++++
4 files changed, 207 insertions(+)
create mode 100644 pkg/plugins/yaegi/events_test.go
create mode 100644 pkg/plugins/yaegi/loader_test.go
create mode 100644 pkg/plugins/yaegi/routes_test.go
create mode 100644 pkg/yaegi_symbols/stdlib_check_test.go
diff --git a/pkg/plugins/yaegi/events_test.go b/pkg/plugins/yaegi/events_test.go
new file mode 100644
index 000000000..97ab4fff6
--- /dev/null
+++ b/pkg/plugins/yaegi/events_test.go
@@ -0,0 +1,48 @@
+// Vikunja is a to-do list application to facilitate your life.
+// Copyright 2018-present Vikunja and contributors. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+package yaegi
+
+import (
+ "testing"
+
+ "code.vikunja.io/api/pkg/log"
+)
+
+func TestPluginEventListener(t *testing.T) {
+ log.InitLogger()
+
+ loaded, err := LoadPluginFull(examplePluginDir)
+ if err != nil {
+ t.Fatalf("LoadPluginFull failed: %v", err)
+ }
+
+ // Call Init() — this registers the TestListener for TaskCreatedEvent.
+ // If the Listener interface boundary is broken, this will panic with a
+ // reflection error when calling events.RegisterListener.
+ err = loaded.Plugin.Init()
+ if err != nil {
+ t.Fatalf("plugin Init failed: %v", err)
+ }
+ t.Log("Init() succeeded — events.RegisterListener accepted the interpreted Listener")
+
+ // Verify Shutdown works too
+ err = loaded.Plugin.Shutdown()
+ if err != nil {
+ t.Fatalf("plugin Shutdown failed: %v", err)
+ }
+ t.Log("Shutdown() succeeded")
+}
diff --git a/pkg/plugins/yaegi/loader_test.go b/pkg/plugins/yaegi/loader_test.go
new file mode 100644
index 000000000..c2bbde1a8
--- /dev/null
+++ b/pkg/plugins/yaegi/loader_test.go
@@ -0,0 +1,70 @@
+// Vikunja is a to-do list application to facilitate your life.
+// Copyright 2018-present Vikunja and contributors. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+package yaegi
+
+import (
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+const examplePluginDir = "../../../examples/plugins/example"
+
+func TestLoadPlugin(t *testing.T) {
+ pluginDir := examplePluginDir
+
+ mainGo := filepath.Join(pluginDir, "main.go")
+ if _, err := os.Stat(mainGo); err != nil {
+ t.Fatalf("example plugin source not found at %s: %v", mainGo, err)
+ }
+
+ p, err := LoadPlugin(pluginDir)
+ if err != nil {
+ t.Fatalf("LoadPlugin failed: %v", err)
+ }
+
+ if p.Name() != "example" {
+ t.Errorf("expected plugin name 'example', got %q", p.Name())
+ }
+ if p.Version() != "1.0.0" {
+ t.Errorf("expected version '1.0.0', got %q", p.Version())
+ }
+}
+
+func TestLoadPluginFull(t *testing.T) {
+ loaded, err := LoadPluginFull(examplePluginDir)
+ if err != nil {
+ t.Fatalf("LoadPluginFull failed: %v", err)
+ }
+
+ if loaded.Plugin == nil {
+ t.Fatal("Plugin is nil")
+ }
+ if loaded.Plugin.Name() != "example" {
+ t.Errorf("expected plugin name 'example', got %q", loaded.Plugin.Name())
+ }
+
+ if loaded.AuthRouter == nil {
+ t.Fatal("AuthRouter is nil — typed factory NewAuthenticatedRouterPlugin not found")
+ }
+ t.Logf("AuthRouter type: %T, name: %s", loaded.AuthRouter, loaded.AuthRouter.Name())
+
+ if loaded.UnauthRouter == nil {
+ t.Fatal("UnauthRouter is nil — typed factory NewUnauthenticatedRouterPlugin not found")
+ }
+ t.Logf("UnauthRouter type: %T, name: %s", loaded.UnauthRouter, loaded.UnauthRouter.Name())
+}
diff --git a/pkg/plugins/yaegi/routes_test.go b/pkg/plugins/yaegi/routes_test.go
new file mode 100644
index 000000000..d765e95dc
--- /dev/null
+++ b/pkg/plugins/yaegi/routes_test.go
@@ -0,0 +1,63 @@
+// Vikunja is a to-do list application to facilitate your life.
+// Copyright 2018-present Vikunja and contributors. All rights reserved.
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+package yaegi
+
+import (
+ "net/http"
+ "net/http/httptest"
+ "strings"
+ "testing"
+
+ "code.vikunja.io/api/pkg/log"
+ "github.com/labstack/echo/v5"
+)
+
+func TestPluginRoutesServeHTTP(t *testing.T) {
+ log.InitLogger()
+ loaded, err := LoadPluginFull(examplePluginDir)
+ if err != nil {
+ t.Fatalf("LoadPluginFull failed: %v", err)
+ }
+
+ if loaded.UnauthRouter == nil {
+ t.Fatal("UnauthRouter is nil — cannot test route registration")
+ }
+
+ // Create a real Echo instance and register the plugin's unauthenticated routes
+ e := echo.New()
+ g := e.Group("/plugins")
+ loaded.UnauthRouter.RegisterUnauthenticatedRoutes(g)
+
+ // Make an HTTP request to the plugin's /status endpoint
+ req := httptest.NewRequest(http.MethodGet, "/plugins/status", nil)
+ rec := httptest.NewRecorder()
+ e.ServeHTTP(rec, req)
+
+ if rec.Code != http.StatusOK {
+ t.Fatalf("expected status 200, got %d, body: %s", rec.Code, rec.Body.String())
+ }
+
+ body := rec.Body.String()
+ if !strings.Contains(body, "example") {
+ t.Errorf("response body should contain plugin name 'example', got: %s", body)
+ }
+ if !strings.Contains(body, "ok") {
+ t.Errorf("response body should contain status 'ok', got: %s", body)
+ }
+
+ t.Logf("HTTP response: %s", body)
+}
diff --git a/pkg/yaegi_symbols/stdlib_check_test.go b/pkg/yaegi_symbols/stdlib_check_test.go
new file mode 100644
index 000000000..e6b1cfae5
--- /dev/null
+++ b/pkg/yaegi_symbols/stdlib_check_test.go
@@ -0,0 +1,26 @@
+package yaegi_symbols
+
+import (
+ "testing"
+
+ "github.com/traefik/yaegi/interp"
+ "github.com/traefik/yaegi/stdlib"
+)
+
+func TestYaegiSmoke(t *testing.T) {
+ i := interp.New(interp.Options{})
+ i.Use(stdlib.Symbols)
+
+ _, err := i.Eval(`import "fmt"`)
+ if err != nil {
+ t.Fatalf("import failed: %v", err)
+ }
+
+ v, err := i.Eval(`fmt.Sprintf("hello %s", "yaegi")`)
+ if err != nil {
+ t.Fatalf("eval failed: %v", err)
+ }
+ if v.String() != "hello yaegi" {
+ t.Fatalf("unexpected result: %s", v.String())
+ }
+}
From fc9c21915df25827cdc4e421ddc07a22c375526c Mon Sep 17 00:00:00 2001
From: Claude
Date: Tue, 24 Mar 2026 15:22:56 +0000
Subject: [PATCH 136/156] feat(auth): enforce OpenID Connect issuer uniqueness
across providers
Detect when two configured OIDC providers resolve to the same issuer URL
at startup and halt with a fatal error, preventing team sync data
corruption caused by ambiguous (external_id, issuer) matching.
Also adds duplicate issuer detection to the doctor service diagnostics
and comprehensive tests with mock OIDC discovery servers.
---
pkg/doctor/services.go | 42 ++++++--
pkg/initialize/init.go | 3 +
pkg/modules/auth/openid/providers.go | 54 ++++++++++
pkg/modules/auth/openid/providers_test.go | 122 ++++++++++++++++++++++
4 files changed, 214 insertions(+), 7 deletions(-)
diff --git a/pkg/doctor/services.go b/pkg/doctor/services.go
index 463cc4ab2..2689337b8 100644
--- a/pkg/doctor/services.go
+++ b/pkg/doctor/services.go
@@ -18,13 +18,16 @@ package doctor
import (
"context"
+ "encoding/json"
"fmt"
+ "io"
"net"
"net/http"
"time"
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/modules/auth/ldap"
+ "code.vikunja.io/api/pkg/modules/auth/openid"
"code.vikunja.io/api/pkg/red"
)
@@ -243,9 +246,22 @@ func checkOpenID() CheckGroup {
}
var results []CheckResult
+ providerIssuers := make(map[string]string)
for key, p := range providerMap {
- result := checkOpenIDProvider(key, p)
+ result, issuer := checkOpenIDProvider(key, p)
results = append(results, result)
+ if issuer != "" {
+ providerIssuers[key] = issuer
+ }
+ }
+
+ // Check for duplicate issuers among successful providers
+ for _, dup := range openid.FindDuplicateIssuers(providerIssuers) {
+ results = append(results, CheckResult{
+ Name: "Duplicate Issuer",
+ Passed: false,
+ Error: dup.Error(),
+ })
}
return CheckGroup{
@@ -254,7 +270,7 @@ func checkOpenID() CheckGroup {
}
}
-func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
+func checkOpenIDProvider(key string, rawProvider interface{}) (CheckResult, string) {
// Extract provider config
var pi map[string]interface{}
switch p := rawProvider.(type) {
@@ -272,7 +288,7 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", key),
Passed: false,
Error: "invalid configuration format",
- }
+ }, ""
}
// Get provider name
@@ -288,7 +304,7 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", name),
Passed: false,
Error: "authurl not configured",
- }
+ }, ""
}
// Check if the provider's discovery endpoint is reachable
@@ -308,7 +324,7 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", name),
Passed: false,
Error: err.Error(),
- }
+ }, ""
}
client := &http.Client{Timeout: 5 * time.Second}
@@ -318,7 +334,7 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", name),
Passed: false,
Error: err.Error(),
- }
+ }, ""
}
defer resp.Body.Close()
@@ -327,6 +343,18 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", name),
Passed: false,
Error: fmt.Sprintf("discovery endpoint returned status %d", resp.StatusCode),
+ }, ""
+ }
+
+ // Parse the issuer from the discovery response for duplicate detection
+ var issuer string
+ body, err := io.ReadAll(resp.Body)
+ if err == nil {
+ var discovery struct {
+ Issuer string `json:"issuer"`
+ }
+ if json.Unmarshal(body, &discovery) == nil {
+ issuer = discovery.Issuer
}
}
@@ -334,5 +362,5 @@ func checkOpenIDProvider(key string, rawProvider interface{}) CheckResult {
Name: fmt.Sprintf("Provider: %s", name),
Passed: true,
Value: "OK",
- }
+ }, issuer
}
diff --git a/pkg/initialize/init.go b/pkg/initialize/init.go
index 7c70609ce..7145b06d8 100644
--- a/pkg/initialize/init.go
+++ b/pkg/initialize/init.go
@@ -101,6 +101,9 @@ func FullInitWithoutAsync() {
// Check all OpenID Connect providers at startup
_, err = openid.GetAllProviders()
if err != nil {
+ if openid.IsErrDuplicateOIDCIssuer(err) {
+ log.Fatalf("OpenID Connect configuration error: %s", err)
+ }
log.Errorf("Error initializing OpenID Connect providers: %s", err)
}
diff --git a/pkg/modules/auth/openid/providers.go b/pkg/modules/auth/openid/providers.go
index 5638d0316..aaafab82f 100644
--- a/pkg/modules/auth/openid/providers.go
+++ b/pkg/modules/auth/openid/providers.go
@@ -17,6 +17,7 @@
package openid
import (
+ "errors"
"fmt"
"strconv"
@@ -28,6 +29,44 @@ import (
"golang.org/x/oauth2"
)
+// ErrDuplicateOIDCIssuer is returned when two configured providers resolve to the same issuer URL.
+type ErrDuplicateOIDCIssuer struct {
+ Issuer string
+ Provider1 string
+ Provider2 string
+}
+
+func (e *ErrDuplicateOIDCIssuer) Error() string {
+ return fmt.Sprintf(
+ "duplicate OpenID Connect issuer %q: providers %q and %q resolve to the same issuer, which will cause team sync conflicts",
+ e.Issuer, e.Provider1, e.Provider2,
+ )
+}
+
+// IsErrDuplicateOIDCIssuer checks if an error is a duplicate issuer error.
+func IsErrDuplicateOIDCIssuer(err error) bool {
+ var target *ErrDuplicateOIDCIssuer
+ return errors.As(err, &target)
+}
+
+// FindDuplicateIssuers checks a map of provider key → issuer URL for duplicates.
+// It returns a list of all duplicate pairs found.
+func FindDuplicateIssuers(providerIssuers map[string]string) []ErrDuplicateOIDCIssuer {
+ issuerToKey := make(map[string]string)
+ var duplicates []ErrDuplicateOIDCIssuer
+ for key, issuer := range providerIssuers {
+ if existingKey, exists := issuerToKey[issuer]; exists {
+ duplicates = append(duplicates, ErrDuplicateOIDCIssuer{
+ Issuer: issuer,
+ Provider1: existingKey,
+ Provider2: key,
+ })
+ }
+ issuerToKey[issuer] = key
+ }
+ return duplicates
+}
+
// GetAllProviders returns all configured providers
func GetAllProviders() (providers []*Provider, err error) {
if !config.AuthOpenIDEnabled.GetBool() {
@@ -97,6 +136,21 @@ func GetAllProviders() (providers []*Provider, err error) {
return nil, err
}
}
+
+ // Check for duplicate issuers across providers
+ providerIssuers := make(map[string]string)
+ for _, p := range providers {
+ issuer, issuerErr := p.Issuer()
+ if issuerErr != nil {
+ log.Errorf("Error getting issuer for openid provider %s: %s", p.Key, issuerErr)
+ continue
+ }
+ providerIssuers[p.Key] = issuer
+ }
+ if duplicates := FindDuplicateIssuers(providerIssuers); len(duplicates) > 0 {
+ return nil, &duplicates[0]
+ }
+
err = keyvalue.Put("openid_providers", providers)
}
diff --git a/pkg/modules/auth/openid/providers_test.go b/pkg/modules/auth/openid/providers_test.go
index 377ae548c..902f140c9 100644
--- a/pkg/modules/auth/openid/providers_test.go
+++ b/pkg/modules/auth/openid/providers_test.go
@@ -17,10 +17,16 @@
package openid
import (
+ "encoding/json"
+ "net/http"
+ "net/http/httptest"
"testing"
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/modules/keyvalue"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetAllProvidersTypeSafety(t *testing.T) {
@@ -84,3 +90,119 @@ func TestGetAllProvidersTypeSafety(t *testing.T) {
}
})
}
+
+// newMockOIDCServer creates a test HTTP server that serves a valid OIDC discovery document.
+// The issuer in the discovery document matches the server's URL.
+func newMockOIDCServer() *httptest.Server {
+ var server *httptest.Server
+ mux := http.NewServeMux()
+ mux.HandleFunc("/.well-known/openid-configuration", func(w http.ResponseWriter, _ *http.Request) {
+ discovery := map[string]interface{}{
+ "issuer": server.URL,
+ "authorization_endpoint": server.URL + "/auth",
+ "token_endpoint": server.URL + "/token",
+ "jwks_uri": server.URL + "/jwks",
+ }
+ w.Header().Set("Content-Type", "application/json")
+ _ = json.NewEncoder(w).Encode(discovery)
+ })
+ server = httptest.NewServer(mux)
+ return server
+}
+
+func TestDuplicateIssuersDetected(t *testing.T) {
+ defer CleanupSavedOpenIDProviders()
+
+ // Create a single mock server — both providers will use the same issuer
+ server := newMockOIDCServer()
+ defer server.Close()
+
+ config.AuthOpenIDEnabled.Set(true)
+ config.AuthOpenIDProviders.Set(map[string]interface{}{
+ "provider1": map[string]interface{}{
+ "name": "Provider One",
+ "authurl": server.URL,
+ "clientid": "client1",
+ "clientsecret": "secret1",
+ },
+ "provider2": map[string]interface{}{
+ "name": "Provider Two",
+ "authurl": server.URL,
+ "clientid": "client2",
+ "clientsecret": "secret2",
+ },
+ })
+ _ = keyvalue.Del("openid_providers")
+
+ providers, err := GetAllProviders()
+ require.Error(t, err)
+ assert.Nil(t, providers)
+ assert.True(t, IsErrDuplicateOIDCIssuer(err))
+
+ var dupErr *ErrDuplicateOIDCIssuer
+ require.ErrorAs(t, err, &dupErr)
+ assert.Equal(t, server.URL, dupErr.Issuer)
+}
+
+func TestUniqueIssuersAllowed(t *testing.T) {
+ defer CleanupSavedOpenIDProviders()
+
+ // Create two separate mock servers — different issuers
+ server1 := newMockOIDCServer()
+ defer server1.Close()
+ server2 := newMockOIDCServer()
+ defer server2.Close()
+
+ config.AuthOpenIDEnabled.Set(true)
+ config.AuthOpenIDProviders.Set(map[string]interface{}{
+ "provider1": map[string]interface{}{
+ "name": "Provider One",
+ "authurl": server1.URL,
+ "clientid": "client1",
+ "clientsecret": "secret1",
+ },
+ "provider2": map[string]interface{}{
+ "name": "Provider Two",
+ "authurl": server2.URL,
+ "clientid": "client2",
+ "clientsecret": "secret2",
+ },
+ })
+ _ = keyvalue.Del("openid_providers")
+
+ providers, err := GetAllProviders()
+ require.NoError(t, err)
+ assert.Len(t, providers, 2)
+}
+
+func TestFailedDiscoverySkippedInIssuerCheck(t *testing.T) {
+ defer CleanupSavedOpenIDProviders()
+
+ // One valid server, one unreachable
+ server := newMockOIDCServer()
+ defer server.Close()
+
+ config.AuthOpenIDEnabled.Set(true)
+ config.AuthOpenIDProviders.Set(map[string]interface{}{
+ "valid": map[string]interface{}{
+ "name": "Valid Provider",
+ "authurl": server.URL,
+ "clientid": "client1",
+ "clientsecret": "secret1",
+ },
+ "broken": map[string]interface{}{
+ "name": "Broken Provider",
+ "authurl": "http://127.0.0.1:1",
+ "clientid": "client2",
+ "clientsecret": "secret2",
+ },
+ })
+ _ = keyvalue.Del("openid_providers")
+
+ // The broken provider will fail discovery and be skipped.
+ // The valid provider should load successfully.
+ providers, err := GetAllProviders()
+ require.NoError(t, err)
+ assert.Len(t, providers, 1)
+ assert.Equal(t, "Valid Provider", providers[0].Name)
+}
From 020aa899f8bff66a653446825749f796290a88ca Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Tue, 31 Mar 2026 13:37:49 +0000
Subject: [PATCH 137/156] chore(deps): update dependency browserslist to
v4.28.2
---
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 53 +++++++++++++++++++++--------------------
2 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index fbb71d17b..9499e9f95 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -124,7 +124,7 @@
"@vue/tsconfig": "0.9.1",
"@vueuse/shared": "14.2.1",
"autoprefixer": "10.4.27",
- "browserslist": "4.28.1",
+ "browserslist": "4.28.2",
"caniuse-lite": "1.0.30001782",
"csstype": "3.2.3",
"esbuild": "0.27.4",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index 580888ff4..d22897ca4 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -230,8 +230,8 @@ importers:
specifier: 10.4.27
version: 10.4.27(postcss@8.5.8)
browserslist:
- specifier: 4.28.1
- version: 4.28.1
+ specifier: 4.28.2
+ version: 4.28.2
caniuse-lite:
specifier: 1.0.30001782
version: 1.0.30001782
@@ -3172,8 +3172,9 @@ packages:
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
- baseline-browser-mapping@2.9.4:
- resolution: {integrity: sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==}
+ baseline-browser-mapping@2.10.12:
+ resolution: {integrity: sha512-qyq26DxfY4awP2gIRXhhLWfwzwI+N5Nxk6iQi8EFizIaWIjqicQTE4sLnZZVdeKPRcVNoJOkkpfzoIYuvCKaIQ==}
+ engines: {node: '>=6.0.0'}
hasBin: true
basic-ftp@5.2.0:
@@ -3215,8 +3216,8 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.28.1:
- resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==}
+ browserslist@4.28.2:
+ resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -3668,8 +3669,8 @@ packages:
engines: {node: '>=0.10.0'}
hasBin: true
- electron-to-chromium@1.5.266:
- resolution: {integrity: sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==}
+ electron-to-chromium@1.5.329:
+ resolution: {integrity: sha512-/4t+AS1l4S3ZC0Ja7PHFIWeBIxGA3QGqV8/yKsP36v7NcyUCl+bIcmw6s5zVuMIECWwBrAK/6QLzTmbJChBboQ==}
emoji-picker-element@1.25.0:
resolution: {integrity: sha512-UcUMxqIuneLCsEJ5KpqTD1xaHZyUpg6Oa7uCVe5AMXXpsW3C2TNegbNLXj2/rlbyr6qVMf7lXTFyzvFEarOIUg==}
@@ -4934,8 +4935,8 @@ packages:
encoding:
optional: true
- node-releases@2.0.27:
- resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+ node-releases@2.0.36:
+ resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==}
nopt@7.2.1:
resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==}
@@ -6397,8 +6398,8 @@ packages:
resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
engines: {node: '>=4'}
- update-browserslist-db@1.2.2:
- resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==}
+ update-browserslist-db@1.2.3:
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -6953,7 +6954,7 @@ snapshots:
dependencies:
'@babel/compat-data': 7.26.0
'@babel/helper-validator-option': 7.25.9
- browserslist: 4.28.1
+ browserslist: 4.28.2
lru-cache: 5.1.1
semver: 6.3.1
@@ -9811,7 +9812,7 @@ snapshots:
autoprefixer@10.4.27(postcss@8.5.8):
dependencies:
- browserslist: 4.28.1
+ browserslist: 4.28.2
caniuse-lite: 1.0.30001782
fraction.js: 5.3.4
picocolors: 1.1.1
@@ -9885,7 +9886,7 @@ snapshots:
base64-js@1.5.1: {}
- baseline-browser-mapping@2.9.4: {}
+ baseline-browser-mapping@2.10.12: {}
basic-ftp@5.2.0: {}
@@ -9928,13 +9929,13 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.28.1:
+ browserslist@4.28.2:
dependencies:
- baseline-browser-mapping: 2.9.4
+ baseline-browser-mapping: 2.10.12
caniuse-lite: 1.0.30001782
- electron-to-chromium: 1.5.266
- node-releases: 2.0.27
- update-browserslist-db: 1.2.2(browserslist@4.28.1)
+ electron-to-chromium: 1.5.329
+ node-releases: 2.0.36
+ update-browserslist-db: 1.2.3(browserslist@4.28.2)
buffer-crc32@0.2.13: {}
@@ -10124,7 +10125,7 @@ snapshots:
core-js-compat@3.38.1:
dependencies:
- browserslist: 4.28.1
+ browserslist: 4.28.2
cosmiconfig@9.0.1(typescript@5.9.3):
dependencies:
@@ -10364,7 +10365,7 @@ snapshots:
dependencies:
jake: 10.9.2
- electron-to-chromium@1.5.266: {}
+ electron-to-chromium@1.5.329: {}
emoji-picker-element@1.25.0: {}
@@ -11726,7 +11727,7 @@ snapshots:
dependencies:
whatwg-url: 5.0.0
- node-releases@2.0.27: {}
+ node-releases@2.0.36: {}
nopt@7.2.1:
dependencies:
@@ -12128,7 +12129,7 @@ snapshots:
'@csstools/postcss-trigonometric-functions': 5.0.1(postcss@8.5.8)
'@csstools/postcss-unset-value': 5.0.0(postcss@8.5.8)
autoprefixer: 10.4.27(postcss@8.5.8)
- browserslist: 4.28.1
+ browserslist: 4.28.2
css-blank-pseudo: 8.0.1(postcss@8.5.8)
css-has-pseudo: 8.0.0(postcss@8.5.8)
css-prefers-color-scheme: 11.0.0(postcss@8.5.8)
@@ -13392,9 +13393,9 @@ snapshots:
upath@1.2.0: {}
- update-browserslist-db@1.2.2(browserslist@4.28.1):
+ update-browserslist-db@1.2.3(browserslist@4.28.2):
dependencies:
- browserslist: 4.28.1
+ browserslist: 4.28.2
escalade: 3.2.0
picocolors: 1.1.1
From cdd46c0d6c31fd53b161a7a722dd5b8c8f7e7a55 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Tue, 31 Mar 2026 23:48:42 +0200
Subject: [PATCH 138/156] fix: add proper autocomplete and name attributes to
email update form
Adds name="email" to the email field and fixes the password field's
autocomplete from the invalid "password" to "current-password", also
adding name="current-password". This helps password managers correctly
identify the form as a settings change rather than a login form,
preventing them from autofilling the username into the email field.
Closes go-vikunja/vikunja#2512
---
frontend/src/views/user/settings/EmailUpdate.vue | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/frontend/src/views/user/settings/EmailUpdate.vue b/frontend/src/views/user/settings/EmailUpdate.vue
index b7b313c7f..874923ce7 100644
--- a/frontend/src/views/user/settings/EmailUpdate.vue
+++ b/frontend/src/views/user/settings/EmailUpdate.vue
@@ -10,6 +10,7 @@
:label="$t('user.settings.updateEmailNew')"
:placeholder="$t('user.auth.emailPlaceholder')"
type="email"
+ name="email"
autocomplete="email"
@keyup.enter="updateEmail"
/>
@@ -19,7 +20,8 @@
:label="$t('user.settings.currentPassword')"
:placeholder="$t('user.settings.currentPasswordPlaceholder')"
type="password"
- autocomplete="password"
+ name="current-password"
+ autocomplete="current-password"
@keyup.enter="updateEmail"
/>
From 88c8d7a73dbfb77f7c0bc5584c8d7bc8ac44dee9 Mon Sep 17 00:00:00 2001
From: "Frederick [Bot]"
Date: Wed, 1 Apr 2026 01:44:10 +0000
Subject: [PATCH 139/156] chore(i18n): update translations via Crowdin
---
frontend/src/i18n/lang/de-DE.json | 9 ++++++++-
frontend/src/i18n/lang/de-swiss.json | 9 ++++++++-
pkg/i18n/lang/de-DE.json | 13 +++++++++++++
pkg/i18n/lang/de-swiss.json | 13 +++++++++++++
4 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/frontend/src/i18n/lang/de-DE.json b/frontend/src/i18n/lang/de-DE.json
index 376381d77..76bff25c0 100644
--- a/frontend/src/i18n/lang/de-DE.json
+++ b/frontend/src/i18n/lang/de-DE.json
@@ -55,6 +55,12 @@
"openIdStateError": "Zustand stimmt nicht überein, fahre nicht fort!",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentifizierung aufgetreten.",
"oauthMissingParams": "Erforderliche OAuth-Parameter fehlen: {params}",
+ "oauthRedirectedToApp": "Du wurdest zur App weitergeleitet. Du kannst diesen Tab jetzt schließen.",
+ "desktopTryDemo": "Demo ausprobieren",
+ "desktopCustomServer": "Eigene Server-URL",
+ "desktopCustomServerDescription": "Gib die URL deines Vikunja Servers ein, um loszulegen.",
+ "desktopWaitingForAuth": "Warte auf Authentifizierung…",
+ "desktopOAuthError": "Authentifizierung fehlgeschlagen: {error}",
"logout": "Abmelden",
"emailInvalid": "Bitte gib eine gültige E-Mail-Adresse ein.",
"usernameRequired": "Bitte gib einen Anmeldenamen ein.",
@@ -156,7 +162,8 @@
"tokenCreated": "Hier ist dein neues Token: {token}",
"wontSeeItAgain": "Schreib es auf oder speicher es sicher — du wirst es nicht nochmal sehen können.",
"mustUseToken": "Du musst einen CalDAV Token erstellen, um CalDAV mit einem Drittanbieter-Client zu nutzen. Verwende diesen Token anstelle deines Passworts.",
- "usernameIs": "Dein Anmeldename für CalDAV lautet: {0}"
+ "usernameIs": "Dein Anmeldename für CalDAV lautet: {0}",
+ "apiTokenHint": "Du kannst auch ein API-Token mit CalDAV-Berechtigung verwenden. Erstelle eins unter {link}."
},
"avatar": {
"title": "Avatar",
diff --git a/frontend/src/i18n/lang/de-swiss.json b/frontend/src/i18n/lang/de-swiss.json
index 215505bd2..8a90373e0 100644
--- a/frontend/src/i18n/lang/de-swiss.json
+++ b/frontend/src/i18n/lang/de-swiss.json
@@ -55,6 +55,12 @@
"openIdStateError": "Status stimmt nid überiih, ich verweigerä wiiter zmache!",
"openIdGeneralError": "Es ist ein Fehler bei der externen Authentifizierung aufgetreten.",
"oauthMissingParams": "Erforderliche OAuth-Parameter fehlen: {params}",
+ "oauthRedirectedToApp": "Du wurdest zur App weitergeleitet. Du kannst diesen Tab jetzt schließen.",
+ "desktopTryDemo": "Demo ausprobieren",
+ "desktopCustomServer": "Eigene Server-URL",
+ "desktopCustomServerDescription": "Gib die URL deines Vikunja Servers ein, um loszulegen.",
+ "desktopWaitingForAuth": "Warte auf Authentifizierung…",
+ "desktopOAuthError": "Authentifizierung fehlgeschlagen: {error}",
"logout": "Uuslogge",
"emailInvalid": "Bitte gib eine gültige E-Mail-Adresse ein.",
"usernameRequired": "Bitte gib einen Anmeldenamen ein.",
@@ -156,7 +162,8 @@
"tokenCreated": "Hier ist dein neues Token: {token}",
"wontSeeItAgain": "Schreib es auf oder speicher es sicher — du wirst es nicht nochmal sehen können.",
"mustUseToken": "Du musst einen CalDAV Token erstellen, um CalDAV mit einem Drittanbieter-Client zu nutzen. Verwende diesen Token anstelle deines Passworts.",
- "usernameIs": "Dein Anmeldename für CalDAV lautet: {0}"
+ "usernameIs": "Dein Anmeldename für CalDAV lautet: {0}",
+ "apiTokenHint": "Du kannst auch ein API-Token mit CalDAV-Berechtigung verwenden. Erstelle eins unter {link}."
},
"avatar": {
"title": "Herr Der Elemente",
diff --git a/pkg/i18n/lang/de-DE.json b/pkg/i18n/lang/de-DE.json
index d7f710d04..a91e8b6e1 100644
--- a/pkg/i18n/lang/de-DE.json
+++ b/pkg/i18n/lang/de-DE.json
@@ -133,6 +133,19 @@
"working_on_it": "Wir haben die Fehlermeldung auf dem Schirm und arbeiten daran, das Problem bald zu beheben."
}
},
+ "api_token": {
+ "expiring": {
+ "week": {
+ "subject": "Dein API-Token „%[1]s“ läuft bald ab",
+ "message": "Dein API-Token „%[1]s“ läuft am %[2]s ab. Wenn du es noch brauchst, erstelle bitte ein neues bevor es abläuft."
+ },
+ "day": {
+ "subject": "Dein API-Token „%[1]s“ läuft morgen ab",
+ "message": "Dein API-Token „%[1]s“ läuft am %[2]s ab. Wenn du es noch brauchst, erstelle bitte ein neues bevor es abläuft."
+ },
+ "action": "API-Token verwalten"
+ }
+ },
"common": {
"have_nice_day": "Hab einen schönen Tag!",
"copy_url": "Falls der Button oben nicht funktioniert, kopiere die untenstehende URL und füge sie in die Adressleiste deines Browsers ein:",
diff --git a/pkg/i18n/lang/de-swiss.json b/pkg/i18n/lang/de-swiss.json
index d7f710d04..a91e8b6e1 100644
--- a/pkg/i18n/lang/de-swiss.json
+++ b/pkg/i18n/lang/de-swiss.json
@@ -133,6 +133,19 @@
"working_on_it": "Wir haben die Fehlermeldung auf dem Schirm und arbeiten daran, das Problem bald zu beheben."
}
},
+ "api_token": {
+ "expiring": {
+ "week": {
+ "subject": "Dein API-Token „%[1]s“ läuft bald ab",
+ "message": "Dein API-Token „%[1]s“ läuft am %[2]s ab. Wenn du es noch brauchst, erstelle bitte ein neues bevor es abläuft."
+ },
+ "day": {
+ "subject": "Dein API-Token „%[1]s“ läuft morgen ab",
+ "message": "Dein API-Token „%[1]s“ läuft am %[2]s ab. Wenn du es noch brauchst, erstelle bitte ein neues bevor es abläuft."
+ },
+ "action": "API-Token verwalten"
+ }
+ },
"common": {
"have_nice_day": "Hab einen schönen Tag!",
"copy_url": "Falls der Button oben nicht funktioniert, kopiere die untenstehende URL und füge sie in die Adressleiste deines Browsers ein:",
From 59ebfa3b2c9a7cf08c21ce25ee5a99451aa6c4ea Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Wed, 1 Apr 2026 05:08:20 +0000
Subject: [PATCH 140/156] chore(deps): update dependency caniuse-lite to
v1.0.30001784
---
frontend/package.json | 2 +-
frontend/pnpm-lock.yaml | 14 +++++++-------
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index 9499e9f95..134e5f5ed 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -125,7 +125,7 @@
"@vueuse/shared": "14.2.1",
"autoprefixer": "10.4.27",
"browserslist": "4.28.2",
- "caniuse-lite": "1.0.30001782",
+ "caniuse-lite": "1.0.30001784",
"csstype": "3.2.3",
"esbuild": "0.27.4",
"eslint": "9.39.4",
diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml
index d22897ca4..45b9f24a5 100644
--- a/frontend/pnpm-lock.yaml
+++ b/frontend/pnpm-lock.yaml
@@ -233,8 +233,8 @@ importers:
specifier: 4.28.2
version: 4.28.2
caniuse-lite:
- specifier: 1.0.30001782
- version: 1.0.30001782
+ specifier: 1.0.30001784
+ version: 1.0.30001784
csstype:
specifier: 3.2.3
version: 3.2.3
@@ -3277,8 +3277,8 @@ packages:
resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
engines: {node: '>=16'}
- caniuse-lite@1.0.30001782:
- resolution: {integrity: sha512-dZcaJLJeDMh4rELYFw1tvSn1bhZWYFOt468FcbHHxx/Z/dFidd1I6ciyFdi3iwfQCyOjqo9upF6lGQYtMiJWxw==}
+ caniuse-lite@1.0.30001784:
+ resolution: {integrity: sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==}
capture-website@4.2.0:
resolution: {integrity: sha512-EmkSn36CXTC8tUsS6aNmvvsdpfVTYYkuRp7U5bV9gcJwcDbqqA5c0Op/iskYPKtDdOkuVp61mjn/LLywX0h7cw==}
@@ -9813,7 +9813,7 @@ snapshots:
autoprefixer@10.4.27(postcss@8.5.8):
dependencies:
browserslist: 4.28.2
- caniuse-lite: 1.0.30001782
+ caniuse-lite: 1.0.30001784
fraction.js: 5.3.4
picocolors: 1.1.1
postcss: 8.5.8
@@ -9932,7 +9932,7 @@ snapshots:
browserslist@4.28.2:
dependencies:
baseline-browser-mapping: 2.10.12
- caniuse-lite: 1.0.30001782
+ caniuse-lite: 1.0.30001784
electron-to-chromium: 1.5.329
node-releases: 2.0.36
update-browserslist-db: 1.2.3(browserslist@4.28.2)
@@ -9994,7 +9994,7 @@ snapshots:
camelcase@8.0.0: {}
- caniuse-lite@1.0.30001782: {}
+ caniuse-lite@1.0.30001784: {}
capture-website@4.2.0(typescript@5.9.3):
dependencies:
From 01bc76d1c6ba203ced5241e09156e6e3605a0cc0 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Wed, 1 Apr 2026 14:32:42 +0200
Subject: [PATCH 141/156] fix(deps): resolve dependabot security alerts
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Update vulnerable transitive dependencies:
- @xmldom/xmldom 0.8.10 → 0.8.12 (XML injection via CDATA serialization)
- path-to-regexp 8.3.0 → 8.4.1 (ReDoS and DoS via sequential optional groups)
- brace-expansion 5.0.2 → 5.0.5 (zero-step sequence hang/memory exhaustion)
---
desktop/pnpm-lock.yaml | 77 +++++++++++++++++++++++++++++++-----------
1 file changed, 58 insertions(+), 19 deletions(-)
diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml
index 8d32233f5..0c5c26bd7 100644
--- a/desktop/pnpm-lock.yaml
+++ b/desktop/pnpm-lock.yaml
@@ -135,6 +135,9 @@ packages:
'@types/debug@4.1.12':
resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ '@types/debug@4.1.13':
+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
+
'@types/fs-extra@9.0.13':
resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
@@ -147,6 +150,9 @@ packages:
'@types/ms@0.7.34':
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
'@types/node@24.10.9':
resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==}
@@ -162,8 +168,8 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- '@xmldom/xmldom@0.8.10':
- resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
+ '@xmldom/xmldom@0.8.12':
+ resolution: {integrity: sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==}
engines: {node: '>=10.0.0'}
abbrev@3.0.1:
@@ -287,8 +293,8 @@ packages:
resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==}
deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
- brace-expansion@5.0.3:
- resolution: {integrity: sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==}
+ brace-expansion@5.0.5:
+ resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==}
engines: {node: 18 || 20 || >=22}
buffer-crc32@0.2.13:
@@ -1010,6 +1016,10 @@ packages:
resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==}
engines: {node: 18 || 20 || >=22}
+ minimatch@10.2.5:
+ resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
+ engines: {node: 18 || 20 || >=22}
+
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
@@ -1141,8 +1151,8 @@ packages:
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
engines: {node: '>=16 || 14 >=14.18'}
- path-to-regexp@8.3.0:
- resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
+ path-to-regexp@8.4.1:
+ resolution: {integrity: sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==}
pe-library@0.4.1:
resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==}
@@ -1264,6 +1274,9 @@ packages:
sanitize-filename@1.6.3:
resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==}
+ sanitize-filename@1.6.4:
+ resolution: {integrity: sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==}
+
sax@1.4.4:
resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
engines: {node: '>=11.0.0'}
@@ -1414,6 +1427,10 @@ packages:
resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==}
engines: {node: '>=18'}
+ tar@7.5.13:
+ resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==}
+ engines: {node: '>=18'}
+
temp-file@3.4.0:
resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==}
@@ -1664,7 +1681,7 @@ snapshots:
debug: 4.4.3
dir-compare: 3.3.0
fs-extra: 9.1.0
- minimatch: 10.2.4
+ minimatch: 10.2.5
plist: 3.1.0
transitivePeerDependencies:
- supports-color
@@ -1747,6 +1764,10 @@ snapshots:
dependencies:
'@types/ms': 0.7.34
+ '@types/debug@4.1.13':
+ dependencies:
+ '@types/ms': 2.1.0
+
'@types/fs-extra@9.0.13':
dependencies:
'@types/node': 24.10.9
@@ -1759,6 +1780,8 @@ snapshots:
'@types/ms@0.7.34': {}
+ '@types/ms@2.1.0': {}
+
'@types/node@24.10.9':
dependencies:
undici-types: 7.16.0
@@ -1781,7 +1804,7 @@ snapshots:
'@types/node': 24.10.9
optional: true
- '@xmldom/xmldom@0.8.10': {}
+ '@xmldom/xmldom@0.8.12': {}
abbrev@3.0.1: {}
@@ -1848,11 +1871,11 @@ snapshots:
isbinaryfile: 5.0.7
js-yaml: 4.1.1
lazy-val: 1.0.5
- minimatch: 10.2.4
+ minimatch: 10.2.5
read-config-file: 6.3.2
- sanitize-filename: 1.6.3
+ sanitize-filename: 1.6.4
semver: 7.7.4
- tar: 7.5.11
+ tar: 7.5.13
temp-file: 3.4.0
transitivePeerDependencies:
- supports-color
@@ -1985,7 +2008,7 @@ snapshots:
boolean@3.2.0:
optional: true
- brace-expansion@5.0.3:
+ brace-expansion@5.0.5:
dependencies:
balanced-match: 4.0.4
@@ -2017,7 +2040,7 @@ snapshots:
builder-util@24.13.1:
dependencies:
7zip-bin: 5.2.0
- '@types/debug': 4.1.12
+ '@types/debug': 4.1.13
app-builder-bin: 4.0.0
bluebird-lst: 1.0.9
builder-util-runtime: 9.2.4
@@ -2229,7 +2252,7 @@ snapshots:
dir-compare@3.3.0:
dependencies:
buffer-equal: 1.0.1
- minimatch: 10.2.4
+ minimatch: 10.2.5
dir-compare@4.2.0:
dependencies:
@@ -2847,7 +2870,11 @@ snapshots:
minimatch@10.2.4:
dependencies:
- brace-expansion: 5.0.3
+ brace-expansion: 5.0.5
+
+ minimatch@10.2.5:
+ dependencies:
+ brace-expansion: 5.0.5
minimist@1.2.8: {}
@@ -2977,7 +3004,7 @@ snapshots:
lru-cache: 10.4.3
minipass: 7.1.2
- path-to-regexp@8.3.0: {}
+ path-to-regexp@8.4.1: {}
pe-library@0.4.1: {}
@@ -2987,7 +3014,7 @@ snapshots:
plist@3.1.0:
dependencies:
- '@xmldom/xmldom': 0.8.10
+ '@xmldom/xmldom': 0.8.12
base64-js: 1.5.1
xmlbuilder: 15.1.1
@@ -3068,7 +3095,7 @@ snapshots:
readdir-glob@1.1.3:
dependencies:
- minimatch: 10.2.4
+ minimatch: 10.2.5
require-directory@2.1.1: {}
@@ -3105,7 +3132,7 @@ snapshots:
depd: 2.0.0
is-promise: 4.0.0
parseurl: 1.3.3
- path-to-regexp: 8.3.0
+ path-to-regexp: 8.4.1
transitivePeerDependencies:
- supports-color
@@ -3119,6 +3146,10 @@ snapshots:
dependencies:
truncate-utf8-bytes: 1.0.2
+ sanitize-filename@1.6.4:
+ dependencies:
+ truncate-utf8-bytes: 1.0.2
+
sax@1.4.4: {}
sax@1.6.0: {}
@@ -3300,6 +3331,14 @@ snapshots:
minizlib: 3.1.0
yallist: 5.0.0
+ tar@7.5.13:
+ dependencies:
+ '@isaacs/fs-minipass': 4.0.1
+ chownr: 3.0.0
+ minipass: 7.1.3
+ minizlib: 3.1.0
+ yallist: 5.0.0
+
temp-file@3.4.0:
dependencies:
async-exit-hook: 2.0.1
From eeb9caf87b3e267f5ce92d877c1e525c640da9e8 Mon Sep 17 00:00:00 2001
From: kolaente
Date: Wed, 1 Apr 2026 20:47:12 +0200
Subject: [PATCH 142/156] chore(desktop): add dev command to build and copy
---
desktop/package.json | 1 +
1 file changed, 1 insertion(+)
diff --git a/desktop/package.json b/desktop/package.json
index c35d6572c..61929d170 100644
--- a/desktop/package.json
+++ b/desktop/package.json
@@ -12,6 +12,7 @@
},
"homepage": "https://vikunja.io",
"scripts": {
+ "build:frontend": "cd ../frontend && pnpm run build && cd ../desktop && rm -rf frontend && cp -r ../frontend/dist frontend",
"start": "electron .",
"pack": "electron-builder --dir",
"dist": "electron-builder --publish never"
From af7eaa9aeaf60da911971c3f2880ba2a76d5a50b Mon Sep 17 00:00:00 2001
From: kolaente
Date: Wed, 1 Apr 2026 20:53:29 +0200
Subject: [PATCH 143/156] fix(desktop): use stored URL instead of
window.API_URL in template
window is not accessible as a global in Vue templates, causing
"Cannot read properties of undefined (reading 'API_URL')" when
clicking sign in on the desktop app.
---
frontend/src/views/user/DesktopLogin.vue | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/frontend/src/views/user/DesktopLogin.vue b/frontend/src/views/user/DesktopLogin.vue
index de20efc1e..db5718455 100644
--- a/frontend/src/views/user/DesktopLogin.vue
+++ b/frontend/src/views/user/DesktopLogin.vue
@@ -18,7 +18,7 @@
{{ $t('user.auth.login') }}
@@ -87,7 +87,8 @@ const {redirectIfSaved} = useRedirectToLastVisited()
const waitingForAuth = ref(false)
const errorMessage = ref('')
-const hasStoredServer = localStorage.getItem('API_URL') !== null
+const storedServerUrl = localStorage.getItem('API_URL')
+const hasStoredServer = storedServerUrl !== null
const showCustomServerInput = ref(false)
listenForDesktopOAuthTokens(async (tokens) => {
From 831e4f29d1e388f4f4191f5c20b38b6d8435b78b Mon Sep 17 00:00:00 2001
From: kolaente
Date: Wed, 1 Apr 2026 23:38:02 +0200
Subject: [PATCH 144/156] feat: update application icons for desktop build
(#2516)
---
desktop/build/icon.icns | Bin 181688 -> 96266 bytes
desktop/build/icon.png | Bin 61822 -> 41035 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/desktop/build/icon.icns b/desktop/build/icon.icns
index 56317ef2bda4ba9a2813fa0f2a7288578452b940..3667e52f85ac3534b3b61cd157e3c3353b57f804 100644
GIT binary patch
literal 96266
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