+`}tablecell(n){let e=this.parser.parseInline(n.tokens),t=n.header?"th":"td";return(n.align?`<${t} align="${n.align}">`:`<${t}>`)+e+`${t}>
+`}strong({tokens:n}){return`${this.parser.parseInline(n)}`}em({tokens:n}){return`${this.parser.parseInline(n)}`}codespan({text:n}){return`${Sn(n,!0)}`}br(n){return" "}del({tokens:n}){return`${this.parser.parseInline(n)}`}link({href:n,title:e,tokens:t}){let l=this.parser.parseInline(t),s=rc(n);if(s===null)return l;n=s;let o='"+l+"",o}image({href:n,title:e,text:t,tokens:l}){l&&(t=this.parser.parseInline(l,this.parser.textRenderer));let s=rc(n);if(s===null)return Sn(t);n=s;let o=`",o}text(n){return"tokens"in n&&n.tokens?this.parser.parseInline(n.tokens):"escaped"in n&&n.escaped?n.text:Sn(n.text)}},ro=class{strong({text:n}){return n}em({text:n}){return n}codespan({text:n}){return n}del({text:n}){return n}html({text:n}){return n}text({text:n}){return n}link({text:n}){return""+n}image({text:n}){return""+n}br(){return""}checkbox({raw:n}){return n}},_n=class Zi{constructor(e){et(this,"options");et(this,"renderer");et(this,"textRenderer");this.options=e||wl,this.options.renderer=this.options.renderer||new qs,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new ro}static parse(e,t){return new Zi(t).parse(e)}static parseInline(e,t){return new Zi(t).parseInline(e)}parse(e){var l,s;this.renderer.parser=this;let t="";for(let o=0;o{let u=i[c].flat(1/0);t=t.concat(this.walkTokens(u,e))}):i.tokens&&(t=t.concat(this.walkTokens(i.tokens,e)))}}return t}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(t=>{let l={...t};if(l.async=this.defaults.async||l.async||!1,t.extensions&&(t.extensions.forEach(s=>{if(!s.name)throw new Error("extension name required");if("renderer"in s){let o=e.renderers[s.name];o?e.renderers[s.name]=function(...i){let c=s.renderer.apply(this,i);return c===!1&&(c=o.apply(this,i)),c}:e.renderers[s.name]=s.renderer}if("tokenizer"in s){if(!s.level||s.level!=="block"&&s.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[s.level];o?o.unshift(s.tokenizer):e[s.level]=[s.tokenizer],s.start&&(s.level==="block"?e.startBlock?e.startBlock.push(s.start):e.startBlock=[s.start]:s.level==="inline"&&(e.startInline?e.startInline.push(s.start):e.startInline=[s.start]))}"childTokens"in s&&s.childTokens&&(e.childTokens[s.name]=s.childTokens)}),l.extensions=e),t.renderer){let s=this.defaults.renderer||new qs(this.defaults);for(let o in t.renderer){if(!(o in s))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let i=o,c=t.renderer[i],u=s[i];s[i]=(...d)=>{let m=c.apply(s,d);return m===!1&&(m=u.apply(s,d)),m||""}}l.renderer=s}if(t.tokenizer){let s=this.defaults.tokenizer||new Vs(this.defaults);for(let o in t.tokenizer){if(!(o in s))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let i=o,c=t.tokenizer[i],u=s[i];s[i]=(...d)=>{let m=c.apply(s,d);return m===!1&&(m=u.apply(s,d)),m}}l.tokenizer=s}if(t.hooks){let s=this.defaults.hooks||new ts;for(let o in t.hooks){if(!(o in s))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let i=o,c=t.hooks[i],u=s[i];ts.passThroughHooks.has(o)?s[i]=d=>{if(this.defaults.async&&ts.passThroughHooksRespectAsync.has(o))return(async()=>{let g=await c.call(s,d);return u.call(s,g)})();let m=c.call(s,d);return u.call(s,m)}:s[i]=(...d)=>{if(this.defaults.async)return(async()=>{let g=await c.apply(s,d);return g===!1&&(g=await u.apply(s,d)),g})();let m=c.apply(s,d);return m===!1&&(m=u.apply(s,d)),m}}l.hooks=s}if(t.walkTokens){let s=this.defaults.walkTokens,o=t.walkTokens;l.walkTokens=function(i){let c=[];return c.push(o.call(this,i)),s&&(c=c.concat(s.call(this,i))),c}}this.defaults={...this.defaults,...l}}),this}setOptions(n){return this.defaults={...this.defaults,...n},this}lexer(n,e){return hn.lex(n,e??this.defaults)}parser(n,e){return _n.parse(n,e??this.defaults)}parseMarkdown(n){return(e,t)=>{let l={...t},s={...this.defaults,...l},o=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&l.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=n),s.async)return(async()=>{let i=s.hooks?await s.hooks.preprocess(e):e,c=await(s.hooks?await s.hooks.provideLexer(n):n?hn.lex:hn.lexInline)(i,s),u=s.hooks?await s.hooks.processAllTokens(c):c;s.walkTokens&&await Promise.all(this.walkTokens(u,s.walkTokens));let d=await(s.hooks?await s.hooks.provideParser(n):n?_n.parse:_n.parseInline)(u,s);return s.hooks?await s.hooks.postprocess(d):d})().catch(o);try{s.hooks&&(e=s.hooks.preprocess(e));let i=(s.hooks?s.hooks.provideLexer(n):n?hn.lex:hn.lexInline)(e,s);s.hooks&&(i=s.hooks.processAllTokens(i)),s.walkTokens&&this.walkTokens(i,s.walkTokens);let c=(s.hooks?s.hooks.provideParser(n):n?_n.parse:_n.parseInline)(i,s);return s.hooks&&(c=s.hooks.postprocess(c)),c}catch(i){return o(i)}}}onError(n,e){return t=>{if(t.message+=`
+Please report this to https://github.com/markedjs/marked.`,n){let l="
An error occurred:
"+Sn(t.message+"",!0)+"
";return e?Promise.resolve(l):l}if(e)return Promise.reject(t);throw t}}},vl=new mk;function at(n,e){return vl.parse(n,e)}at.options=at.setOptions=function(n){return vl.setOptions(n),at.defaults=vl.defaults,Ed(at.defaults),at};at.getDefaults=$i;at.defaults=wl;at.use=function(...n){return vl.use(...n),at.defaults=vl.defaults,Ed(at.defaults),at};at.walkTokens=function(n,e){return vl.walkTokens(n,e)};at.parseInline=vl.parseInline;at.Parser=_n;at.parser=_n.parse;at.Renderer=qs;at.TextRenderer=ro;at.Lexer=hn;at.lexer=hn.lex;at.Tokenizer=Vs;at.Hooks=ts;at.parse=at;at.options;at.setOptions;at.use;at.walkTokens;at.parseInline;_n.parse;hn.lex;/*! @license DOMPurify 3.4.10 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.10/LICENSE */function fc(n,e){(e==null||e>n.length)&&(e=n.length);for(var t=0,l=Array(e);t2?l-2:0),o=2;o1?t-1:0),s=1;s"u"?null:Rt(BigInt.prototype.toString),_c=typeof Symbol>"u"?null:Rt(Symbol.prototype.toString),Vt=Rt(Object.prototype.hasOwnProperty),$l=Rt(Object.prototype.toString),Bt=Rt(RegExp.prototype.test),pl=Nk(TypeError);function Rt(n){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var t=arguments.length,l=new Array(t>1?t-1:0),s=1;s2&&arguments[2]!==void 0?arguments[2]:ns;if(dc&&dc(n,null),!qn(e))return n;let l=e.length;for(;l--;){let s=e[l];if(typeof s=="string"){const o=t(s);o!==s&&(kk(e)||(e[l]=o),s=o)}n[s]=!0}return n}function Rk(n){for(let e=0;e/g),zk=jt(/\${[\w\W]*/g),Bk=jt(/^data-[\-\w.\u00B7-\uFFFF]+$/),Fk=jt(/^aria-[\-\w]+$/),yc=jt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),jk=jt(/^(?:\w+script|data):/i),Uk=jt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Hk=jt(/^html$/i),Wk=jt(/^[a-z][.\w]*(-[.\w]+)+$/i),Ec=jt(/<[/\w!]/g),Gk=jt(/<[/\w]/g),Kk=jt(/<\/no(script|embed|frames)/i),Vk=jt(/\/>/i),Tn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},qk=function(){return typeof window>"u"?null:window},Zk=function(e,t){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let l=null;const s="data-tt-policy-suffix";t&&t.hasAttribute(s)&&(l=t.getAttribute(s));const o="dompurify"+(l?"#"+l:"");try{return e.createPolicy(o,{createHTML(i){return i},createScriptURL(i){return i}})}catch{return console.warn("TrustedTypes policy "+o+" could not be created."),null}},Tc=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Kn=function(e,t,l,s){return Vt(e,t)&&qn(e[t])?tt(s.base?Kt(s.base):{},e[t],s.transform):l};function Pd(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:qk();const e=ke=>Pd(ke);if(e.version="3.4.10",e.removed=[],!n||!n.document||n.document.nodeType!==Tn.document||!n.Element)return e.isSupported=!1,e;let t=n.document;const l=t,s=l.currentScript;n.DocumentFragment;const o=n.HTMLTemplateElement,i=n.Node,c=n.Element,u=n.NodeFilter,d=n.NamedNodeMap;d===void 0&&(n.NamedNodeMap||n.MozNamedAttrMap),n.HTMLFormElement;const m=n.DOMParser,g=n.trustedTypes,h=c.prototype,_=Cn(h,"cloneNode"),v=Cn(h,"remove"),k=Cn(h,"nextSibling"),y=Cn(h,"childNodes"),E=Cn(h,"parentNode"),C=Cn(h,"shadowRoot"),A=Cn(h,"attributes"),N=i&&i.prototype?Cn(i.prototype,"nodeType"):null,I=i&&i.prototype?Cn(i.prototype,"nodeName"):null;if(typeof o=="function"){const ke=t.createElement("template");ke.content&&ke.content.ownerDocument&&(t=ke.content.ownerDocument)}let M,R="",O,L=!1,H=0;const W=function(){if(H>0)throw pl('A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.')},U=function(V){W(),H++;try{return M.createHTML(V)}finally{H--}},K=function(V){W(),H++;try{return M.createScriptURL(V)}finally{H--}},Z=function(){return L||(O=Zk(g,s),L=!0),O},X=t,G=X.implementation,P=X.createNodeIterator,j=X.createDocumentFragment,B=X.getElementsByTagName,J=l.importNode;let q=Tc();e.isSupported=typeof Od=="function"&&typeof E=="function"&&G&&G.createHTMLDocument!==void 0;const Y=Dk,$=Pk,ne=zk,te=Bk,pe=Fk,Te=jk,Fe=Uk,qe=Wk;let Ne=yc,ee=null;const oe=tt({},[...bc,...Di,...Pi,...zi,...vc]);let Ce=null;const je=tt({},[...kc,...Bi,...wc,...Ls]);let _e=Object.seal(Bl(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ue=null,pt=null;const be=Object.seal(Bl(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let lt=!0,Me=!0,Re=!1,Pe=!0,He=!1,De=!0,ze=!1,ue=!1,ye=!1,x=!1,ge=!1,de=!1,Ae=!0,it=!1;const ot="user-content-";let Ye=!0,vt=!1,Ke={},Ge=null;const st=tt({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","selectedcontent","style","svg","template","thead","title","video","xmp"]);let fe=null;const Le=tt({},["audio","video","img","source","image","track"]);let At=null;const en=tt({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Mt="http://www.w3.org/1998/Math/MathML",Ht="http://www.w3.org/2000/svg",ct="http://www.w3.org/1999/xhtml";let Dt=ct,bn=!1,vn=null;const qt=tt({},[Mt,Ht,ct],Oi),Xn=Ft(["mi","mo","mn","ms","mtext"]);let It=tt({},Xn);const Wt=Ft(["annotation-xml"]);let gt=tt({},Wt);const ps=tt({},["title","style","font","a","script"]);let Mn=null;const ms=["application/xhtml+xml","text/html"],un="text/html";let ht=null,Gt=null;const fn=t.createElement("form"),kn=function(V){return V instanceof RegExp||V instanceof Function},Zt=function(){let V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Gt&&Gt===V)return;(!V||typeof V!="object")&&(V={}),V=Kt(V),Mn=ms.indexOf(V.PARSER_MEDIA_TYPE)===-1?un:V.PARSER_MEDIA_TYPE,ht=Mn==="application/xhtml+xml"?Oi:ns,ee=Kn(V,"ALLOWED_TAGS",oe,{transform:ht}),Ce=Kn(V,"ALLOWED_ATTR",je,{transform:ht}),vn=Kn(V,"ALLOWED_NAMESPACES",qt,{transform:Oi}),At=Kn(V,"ADD_URI_SAFE_ATTR",en,{transform:ht,base:en}),fe=Kn(V,"ADD_DATA_URI_TAGS",Le,{transform:ht,base:Le}),Ge=Kn(V,"FORBID_CONTENTS",st,{transform:ht}),Ue=Kn(V,"FORBID_TAGS",Kt({}),{transform:ht}),pt=Kn(V,"FORBID_ATTR",Kt({}),{transform:ht}),Ke=Vt(V,"USE_PROFILES")?V.USE_PROFILES&&typeof V.USE_PROFILES=="object"?Kt(V.USE_PROFILES):V.USE_PROFILES:!1,lt=V.ALLOW_ARIA_ATTR!==!1,Me=V.ALLOW_DATA_ATTR!==!1,Re=V.ALLOW_UNKNOWN_PROTOCOLS||!1,Pe=V.ALLOW_SELF_CLOSE_IN_ATTR!==!1,He=V.SAFE_FOR_TEMPLATES||!1,De=V.SAFE_FOR_XML!==!1,ze=V.WHOLE_DOCUMENT||!1,x=V.RETURN_DOM||!1,ge=V.RETURN_DOM_FRAGMENT||!1,de=V.RETURN_TRUSTED_TYPE||!1,ye=V.FORCE_BODY||!1,Ae=V.SANITIZE_DOM!==!1,it=V.SANITIZE_NAMED_PROPS||!1,Ye=V.KEEP_CONTENT!==!1,vt=V.IN_PLACE||!1,Ne=Mk(V.ALLOWED_URI_REGEXP)?V.ALLOWED_URI_REGEXP:yc,Dt=typeof V.NAMESPACE=="string"?V.NAMESPACE:ct,It=Vt(V,"MATHML_TEXT_INTEGRATION_POINTS")&&V.MATHML_TEXT_INTEGRATION_POINTS&&typeof V.MATHML_TEXT_INTEGRATION_POINTS=="object"?Kt(V.MATHML_TEXT_INTEGRATION_POINTS):tt({},Xn),gt=Vt(V,"HTML_INTEGRATION_POINTS")&&V.HTML_INTEGRATION_POINTS&&typeof V.HTML_INTEGRATION_POINTS=="object"?Kt(V.HTML_INTEGRATION_POINTS):tt({},Wt);const le=Vt(V,"CUSTOM_ELEMENT_HANDLING")&&V.CUSTOM_ELEMENT_HANDLING&&typeof V.CUSTOM_ELEMENT_HANDLING=="object"?Kt(V.CUSTOM_ELEMENT_HANDLING):Bl(null);if(_e=Bl(null),Vt(le,"tagNameCheck")&&kn(le.tagNameCheck)&&(_e.tagNameCheck=le.tagNameCheck),Vt(le,"attributeNameCheck")&&kn(le.attributeNameCheck)&&(_e.attributeNameCheck=le.attributeNameCheck),Vt(le,"allowCustomizedBuiltInElements")&&typeof le.allowCustomizedBuiltInElements=="boolean"&&(_e.allowCustomizedBuiltInElements=le.allowCustomizedBuiltInElements),jt(_e),He&&(Me=!1),ge&&(x=!0),Ke&&(ee=tt({},vc),Ce=Bl(null),Ke.html===!0&&(tt(ee,bc),tt(Ce,kc)),Ke.svg===!0&&(tt(ee,Di),tt(Ce,Bi),tt(Ce,Ls)),Ke.svgFilters===!0&&(tt(ee,Pi),tt(Ce,Bi),tt(Ce,Ls)),Ke.mathMl===!0&&(tt(ee,zi),tt(Ce,wc),tt(Ce,Ls))),be.tagCheck=null,be.attributeCheck=null,Vt(V,"ADD_TAGS")&&(typeof V.ADD_TAGS=="function"?be.tagCheck=V.ADD_TAGS:qn(V.ADD_TAGS)&&(ee===oe&&(ee=Kt(ee)),tt(ee,V.ADD_TAGS,ht))),Vt(V,"ADD_ATTR")&&(typeof V.ADD_ATTR=="function"?be.attributeCheck=V.ADD_ATTR:qn(V.ADD_ATTR)&&(Ce===je&&(Ce=Kt(Ce)),tt(Ce,V.ADD_ATTR,ht))),Vt(V,"ADD_URI_SAFE_ATTR")&&qn(V.ADD_URI_SAFE_ATTR)&&tt(At,V.ADD_URI_SAFE_ATTR,ht),Vt(V,"FORBID_CONTENTS")&&qn(V.FORBID_CONTENTS)&&(Ge===st&&(Ge=Kt(Ge)),tt(Ge,V.FORBID_CONTENTS,ht)),Vt(V,"ADD_FORBID_CONTENTS")&&qn(V.ADD_FORBID_CONTENTS)&&(Ge===st&&(Ge=Kt(Ge)),tt(Ge,V.ADD_FORBID_CONTENTS,ht)),Ye&&(ee["#text"]=!0),ze&&tt(ee,["html","head","body"]),ee.table&&(tt(ee,["tbody"]),delete Ue.tbody),V.TRUSTED_TYPES_POLICY){if(typeof V.TRUSTED_TYPES_POLICY.createHTML!="function")throw pl('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof V.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw pl('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const ve=M;M=V.TRUSTED_TYPES_POLICY;try{R=U("")}catch(Oe){throw M=ve,Oe}}else V.TRUSTED_TYPES_POLICY===null?(M=void 0,R=""):(M===void 0&&(M=Z()),M&&typeof R=="string"&&(R=U("")));(q.uponSanitizeElement.length>0||q.uponSanitizeAttribute.length>0)&&ee===oe&&(ee=Kt(ee)),q.uponSanitizeAttribute.length>0&&Ce===je&&(Ce=Kt(Ce)),Ft&&Ft(V),Gt=V},rn=tt({},[...Di,...Pi,...Lk]),wn=tt({},[...zi,...Ok]),tn=function(V,le,ve){return le.namespaceURI===ct?V==="svg":le.namespaceURI===Mt?V==="svg"&&(ve==="annotation-xml"||It[ve]):!!rn[V]},Jn=function(V,le,ve){return le.namespaceURI===ct?V==="math":le.namespaceURI===Ht?V==="math"&>[ve]:!!wn[V]},yn=function(V,le,ve){return le.namespaceURI===Ht&&!gt[ve]||le.namespaceURI===Mt&&!It[ve]?!1:!wn[V]&&(ps[V]||!rn[V])},Qn=function(V){let le=E(V);(!le||!le.tagName)&&(le={namespaceURI:Dt,tagName:"template"});const ve=ns(V.tagName),Oe=ns(le.tagName);return vn[V.namespaceURI]?V.namespaceURI===Ht?tn(ve,le,Oe):V.namespaceURI===Mt?Jn(ve,le,Oe):V.namespaceURI===ct?yn(ve,le,Oe):!!(Mn==="application/xhtml+xml"&&vn[V.namespaceURI]):!1},Pt=function(V){Dl(e.removed,{element:V});try{E(V).removeChild(V)}catch{if(v(V),!E(V))throw pl("a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place")}},El=function(V){const le=y(V);if(le){const Oe=[];Ql(le,Ve=>{Dl(Oe,Ve)}),Ql(Oe,Ve=>{try{v(Ve)}catch{}})}const ve=A(V);if(ve)for(let Oe=ve.length-1;Oe>=0;--Oe){const Ve=ve[Oe],$e=Ve&&Ve.name;if(typeof $e=="string")try{V.removeAttribute($e)}catch{}}},Yt=function(V,le){try{Dl(e.removed,{attribute:le.getAttributeNode(V),from:le})}catch{Dl(e.removed,{attribute:null,from:le})}if(le.removeAttribute(V),V==="is")if(x||ge)try{Pt(le)}catch{}else try{le.setAttribute(V,"")}catch{}},Kl=function(V){const le=A(V);if(le)for(let ve=le.length-1;ve>=0;--ve){const Oe=le[ve],Ve=Oe&&Oe.name;if(!(typeof Ve!="string"||Ce[ht(Ve)]))try{V.removeAttribute(Ve)}catch{}}},Tl=function(V){const le=[V];for(;le.length>0;){const ve=le.pop();(N?N(ve):ve.nodeType)===Tn.element&&Kl(ve);const Ve=y(ve);if(Ve)for(let $e=Ve.length-1;$e>=0;--$e)le.push(Ve[$e])}},Ln=function(V){let le=null,ve=null;if(ye)V=""+V;else{const $e=mc(V,/^[\r\n\t ]+/);ve=$e&&$e[0]}Mn==="application/xhtml+xml"&&Dt===ct&&(V=''+V+"");const Oe=M?U(V):V;if(Dt===ct)try{le=new m().parseFromString(Oe,Mn)}catch{}if(!le||!le.documentElement){le=G.createDocument(Dt,"template",null);try{le.documentElement.innerHTML=bn?R:Oe}catch{}}const Ve=le.body||le.documentElement;return V&&ve&&Ve.insertBefore(t.createTextNode(ve),Ve.childNodes[0]||null),Dt===ct?B.call(le,ze?"html":"body")[0]:ze?le.documentElement:Ve},Sl=function(V){return P.call(V.ownerDocument||V,V,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},xn=function(V){return V=xl(V,Y," "),V=xl(V,$," "),V=xl(V,ne," "),V},Xt=function(V){var le;V.normalize();const ve=P.call(V.ownerDocument||V,V,u.SHOW_TEXT|u.SHOW_COMMENT|u.SHOW_CDATA_SECTION|u.SHOW_PROCESSING_INSTRUCTION,null);let Oe=ve.nextNode();for(;Oe;)Oe.data=xn(Oe.data),Oe=ve.nextNode();const Ve=(le=V.querySelectorAll)===null||le===void 0?void 0:le.call(V,"template");Ve&&Ql(Ve,$e=>{mt($e.content)&&Xt($e.content)})},On=function(V){const le=I?I(V):null;return typeof le!="string"||ht(le)!=="form"?!1:typeof V.nodeName!="string"||typeof V.textContent!="string"||typeof V.removeChild!="function"||V.attributes!==A(V)||typeof V.removeAttribute!="function"||typeof V.setAttribute!="function"||typeof V.namespaceURI!="string"||typeof V.insertBefore!="function"||typeof V.hasChildNodes!="function"||V.nodeType!==N(V)||V.childNodes!==y(V)},mt=function(V){if(!N||typeof V!="object"||V===null)return!1;try{return N(V)===Tn.documentFragment}catch{return!1}},kt=function(V){if(!N||typeof V!="object"||V===null)return!1;try{return typeof N(V)=="number"}catch{return!1}};function rt(ke,V,le){ke.length!==0&&Ql(ke,ve=>{ve.call(e,V,le,Gt)})}const dn=function(V,le){return!!(De&&V.hasChildNodes()&&!kt(V.firstElementChild)&&Bt(Ec,V.textContent)&&Bt(Ec,V.innerHTML)||De&&V.namespaceURI===ct&&le==="style"&&kt(V.firstElementChild)||V.nodeType===Tn.processingInstruction||De&&V.nodeType===Tn.comment&&Bt(Gk,V.data))},nn=function(V,le){if(!Ue[le]&&xe(le)&&(_e.tagNameCheck instanceof RegExp&&Bt(_e.tagNameCheck,le)||_e.tagNameCheck instanceof Function&&_e.tagNameCheck(le)))return!1;if(Ye&&!Ge[le]){const ve=E(V),Oe=y(V);if(Oe&&ve){const Ve=Oe.length;for(let $e=Ve-1;$e>=0;--$e){const Nt=vt?Oe[$e]:_(Oe[$e],!0);ve.insertBefore(Nt,k(V))}}}return Pt(V),!0},Dn=function(V){if(rt(q.beforeSanitizeElements,V,null),On(V))return Pt(V),!0;const le=ht(I?I(V):V.nodeName);if(rt(q.uponSanitizeElement,V,{tagName:le,allowedTags:ee}),dn(V,le))return Pt(V),!0;if(Ue[le]||!(be.tagCheck instanceof Function&&be.tagCheck(le))&&!ee[le])return nn(V,le);if((N?N(V):V.nodeType)===Tn.element&&!Qn(V)||(le==="noscript"||le==="noembed"||le==="noframes")&&Bt(Kk,V.innerHTML))return Pt(V),!0;if(He&&V.nodeType===Tn.text){const Oe=xn(V.textContent);V.textContent!==Oe&&(Dl(e.removed,{element:V.cloneNode()}),V.textContent=Oe)}return rt(q.afterSanitizeElements,V,null),!1},An=function(V,le,ve){if(pt[le]||Ae&&(le==="id"||le==="name")&&(ve in t||ve in fn))return!1;const Oe=Ce[le]||be.attributeCheck instanceof Function&&be.attributeCheck(le,V);if(!(Me&&Bt(te,le))){if(!(lt&&Bt(pe,le))){if(Oe){if(!At[le]){if(!Bt(Ne,xl(ve,Fe,""))){if(!((le==="src"||le==="xlink:href"||le==="href")&&V!=="script"&&gc(ve,"data:")===0&&fe[V])){if(!(Re&&!Bt(Te,xl(ve,Fe,"")))){if(ve)return!1}}}}}else if(!(xe(V)&&(_e.tagNameCheck instanceof RegExp&&Bt(_e.tagNameCheck,V)||_e.tagNameCheck instanceof Function&&_e.tagNameCheck(V))&&(_e.attributeNameCheck instanceof RegExp&&Bt(_e.attributeNameCheck,le)||_e.attributeNameCheck instanceof Function&&_e.attributeNameCheck(le,V))||le==="is"&&_e.allowCustomizedBuiltInElements&&(_e.tagNameCheck instanceof RegExp&&Bt(_e.tagNameCheck,ve)||_e.tagNameCheck instanceof Function&&_e.tagNameCheck(ve))))return!1}}return!0},an=tt({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),xe=function(V){return!an[ns(V)]&&Bt(qe,V)},Pn=function(V,le,ve,Oe){if(M&&typeof g=="object"&&typeof g.getAttributeType=="function"&&!ve)switch(g.getAttributeType(V,le)){case"TrustedHTML":return U(Oe);case"TrustedScriptURL":return K(Oe)}return Oe},Vl=function(V,le,ve,Oe){try{ve?V.setAttributeNS(ve,le,Oe):V.setAttribute(le,Oe),On(V)?Pt(V):pc(e.removed)}catch{Yt(le,V)}},zn=function(V){rt(q.beforeSanitizeAttributes,V,null);const le=V.attributes;if(!le||On(V))return;const ve={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ce,forceKeepAttr:void 0};let Oe=le.length;const Ve=ht(V.nodeName);for(;Oe--;){const $e=le[Oe],Nt=$e.name,_t=$e.namespaceURI,zt=$e.value,Lt=ht(Nt),Bn=zt;let Tt=Nt==="value"?Bn:Sk(Bn);if(ve.attrName=Lt,ve.attrValue=Tt,ve.keepAttr=!0,ve.forceKeepAttr=void 0,rt(q.uponSanitizeAttribute,V,ve),Tt=ve.attrValue,it&&(Lt==="id"||Lt==="name")&&gc(Tt,ot)!==0&&(Yt(Nt,V),Tt=ot+Tt),De&&Bt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,Tt)){Yt(Nt,V);continue}if(Lt==="attributename"&&mc(Tt,"href")){Yt(Nt,V);continue}if(!ve.forceKeepAttr){if(!ve.keepAttr){Yt(Nt,V);continue}if(!Pe&&Bt(Vk,Tt)){Yt(Nt,V);continue}if(He&&(Tt=xn(Tt)),!An(Ve,Lt,Tt)){Yt(Nt,V);continue}Tt=Pn(Ve,Lt,_t,Tt),Tt!==Bn&&Vl(V,Nt,_t,Tt)}}rt(q.afterSanitizeAttributes,V,null)},pn=function(V){let le=null;const ve=Sl(V);for(rt(q.beforeSanitizeShadowDOM,V,null);le=ve.nextNode();)if(rt(q.uponSanitizeShadowNode,le,null),Dn(le),zn(le),mt(le.content)&&pn(le.content),(N?N(le):le.nodeType)===Tn.element){const Ve=C(le);mt(Ve)&&($n(Ve),pn(Ve))}rt(q.afterSanitizeShadowDOM,V,null)},$n=function(V){const le=[{node:V,shadow:null}];for(;le.length>0;){const ve=le.pop();if(ve.shadow){pn(ve.shadow);continue}const Oe=ve.node,$e=(N?N(Oe):Oe.nodeType)===Tn.element,Nt=y(Oe);if(Nt)for(let _t=Nt.length-1;_t>=0;--_t)le.push({node:Nt[_t],shadow:null});if($e){const _t=I?I(Oe):null;if(typeof _t=="string"&&ht(_t)==="template"){const zt=Oe.content;mt(zt)&&le.push({node:zt,shadow:null})}}if($e){const _t=C(Oe);mt(_t)&&le.push({node:null,shadow:_t},{node:_t,shadow:null})}}};return e.sanitize=function(ke){let V=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},le=null,ve=null,Oe=null,Ve=null;if(bn=!ke,bn&&(ke=""),typeof ke!="string"&&!kt(ke)&&(ke=Ik(ke),typeof ke!="string"))throw pl("dirty is not a string, aborting");if(!e.isSupported)return ke;ue||Zt(V),e.removed=[];const $e=vt&&typeof ke!="string"&&kt(ke);if($e){const zt=I?I(ke):ke.nodeName;if(typeof zt=="string"){const Lt=ht(zt);if(!ee[Lt]||Ue[Lt])throw pl("root node is forbidden and cannot be sanitized in-place")}if(On(ke))throw pl("root node is clobbered and cannot be sanitized in-place");try{$n(ke)}catch(Lt){throw El(ke),Lt}}else if(kt(ke))le=Ln(""),ve=le.ownerDocument.importNode(ke,!0),ve.nodeType===Tn.element&&ve.nodeName==="BODY"||ve.nodeName==="HTML"?le=ve:le.appendChild(ve),$n(ve);else{if(!x&&!He&&!ze&&ke.indexOf("<")===-1)return M&&de?U(ke):ke;if(le=Ln(ke),!le)return x?null:de?R:""}le&&ye&&Pt(le.firstChild);const Nt=Sl($e?ke:le);try{for(;Oe=Nt.nextNode();)Dn(Oe),zn(Oe),mt(Oe.content)&&pn(Oe.content)}catch(zt){throw $e&&El(ke),zt}if($e)return Ql(e.removed,zt=>{zt.element&&Tl(zt.element)}),He&&Xt(ke),ke;if(x){if(He&&Xt(le),ge)for(Ve=j.call(le.ownerDocument);le.firstChild;)Ve.appendChild(le.firstChild);else Ve=le;return(Ce.shadowroot||Ce.shadowrootmode)&&(Ve=J.call(l,Ve,!0)),Ve}let _t=ze?le.outerHTML:le.innerHTML;return ze&&ee["!doctype"]&&le.ownerDocument&&le.ownerDocument.doctype&&le.ownerDocument.doctype.name&&Bt(Hk,le.ownerDocument.doctype.name)&&(_t="
+`+_t),He&&(_t=xn(_t)),M&&de?U(_t):_t},e.setConfig=function(){let ke=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Zt(ke),ue=!0},e.clearConfig=function(){Gt=null,ue=!1,M=O,R=""},e.isValidAttribute=function(ke,V,le){Gt||Zt({});const ve=ht(ke),Oe=ht(V);return An(ve,Oe,le)},e.addHook=function(ke,V){typeof V=="function"&&Dl(q[ke],V)},e.removeHook=function(ke,V){if(V!==void 0){const le=Ek(q[ke],V);return le===-1?void 0:Tk(q[ke],le,1)[0]}return pc(q[ke])},e.removeHooks=function(ke){q[ke]=[]},e.removeAllHooks=function(){q=Tc()},e}var zd=Pd();function Yk(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}function Bd(n){return n instanceof Map?n.clear=n.delete=n.set=function(){throw new Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=function(){throw new Error("set is read-only")}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach(e=>{const t=n[e],l=typeof t;(l==="object"||l==="function")&&!Object.isFrozen(t)&&Bd(t)}),n}class Sc{constructor(e){e.data===void 0&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function Fd(n){return n.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Yn(n,...e){const t=Object.create(null);for(const l in n)t[l]=n[l];return e.forEach(function(l){for(const s in l)t[s]=l[s]}),t}const Xk="",Cc=n=>!!n.scope,Jk=(n,{prefix:e})=>{if(n.startsWith("language:"))return n.replace("language:","language-");if(n.includes(".")){const t=n.split(".");return[`${e}${t.shift()}`,...t.map((l,s)=>`${l}${"_".repeat(s+1)}`)].join(" ")}return`${e}${n}`};class Qk{constructor(e,t){this.buffer="",this.classPrefix=t.classPrefix,e.walk(this)}addText(e){this.buffer+=Fd(e)}openNode(e){if(!Cc(e))return;const t=Jk(e.scope,{prefix:this.classPrefix});this.span(t)}closeNode(e){Cc(e)&&(this.buffer+=Xk)}value(){return this.buffer}span(e){this.buffer+=``}}const Ac=(n={})=>{const e={children:[]};return Object.assign(e,n),e};class ao{constructor(){this.rootNode=Ac(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const t=Ac({scope:e});this.add(t),this.stack.push(t)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,t){return typeof t=="string"?e.addText(t):t.children&&(e.openNode(t),t.children.forEach(l=>this._walk(e,l)),e.closeNode(t)),e}static _collapse(e){typeof e!="string"&&e.children&&(e.children.every(t=>typeof t=="string")?e.children=[e.children.join("")]:e.children.forEach(t=>{ao._collapse(t)}))}}class xk extends ao{constructor(e){super(),this.options=e}addText(e){e!==""&&this.add(e)}startScope(e){this.openNode(e)}endScope(){this.closeNode()}__addSublanguage(e,t){const l=e.root;t&&(l.scope=`language:${t}`),this.add(l)}toHTML(){return new Qk(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function rs(n){return n?typeof n=="string"?n:n.source:null}function jd(n){return yl("(?=",n,")")}function $k(n){return yl("(?:",n,")*")}function e2(n){return yl("(?:",n,")?")}function yl(...n){return n.map(t=>rs(t)).join("")}function t2(n){const e=n[n.length-1];return typeof e=="object"&&e.constructor===Object?(n.splice(n.length-1,1),e):{}}function co(...n){return"("+(t2(n).capture?"":"?:")+n.map(l=>rs(l)).join("|")+")"}function Ud(n){return new RegExp(n.toString()+"|").exec("").length-1}function n2(n,e){const t=n&&n.exec(e);return t&&t.index===0}const l2=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function uo(n,{joinWith:e}){let t=0;return n.map(l=>{t+=1;const s=t;let o=rs(l),i="";for(;o.length>0;){const c=l2.exec(o);if(!c){i+=o;break}i+=o.substring(0,c.index),o=o.substring(c.index+c[0].length),c[0][0]==="\\"&&c[1]?i+="\\"+String(Number(c[1])+s):(i+=c[0],c[0]==="("&&t++)}return i}).map(l=>`(${l})`).join(e)}const s2=/\b\B/,Hd="[a-zA-Z]\\w*",fo="[a-zA-Z_]\\w*",Wd="\\b\\d+(\\.\\d+)?",Gd="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",Kd="\\b(0b[01]+)",i2="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",o2=(n={})=>{const e=/^#![ ]*\//;return n.binary&&(n.begin=yl(e,/.*\b/,n.binary,/\b.*/)),Yn({scope:"meta",begin:e,end:/$/,relevance:0,"on:begin":(t,l)=>{t.index!==0&&l.ignoreMatch()}},n)},as={begin:"\\\\[\\s\\S]",relevance:0},r2={scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[as]},a2={scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[as]},c2={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},$s=function(n,e,t={}){const l=Yn({scope:"comment",begin:n,end:e,contains:[]},t);l.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});const s=co("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return l.contains.push({begin:yl(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),l},u2=$s("//","$"),f2=$s("/\\*","\\*/"),d2=$s("#","$"),p2={scope:"number",begin:Wd,relevance:0},m2={scope:"number",begin:Gd,relevance:0},g2={scope:"number",begin:Kd,relevance:0},h2={scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[as,{begin:/\[/,end:/\]/,relevance:0,contains:[as]}]},_2={scope:"title",begin:Hd,relevance:0},b2={scope:"title",begin:fo,relevance:0},v2={begin:"\\.\\s*"+fo,relevance:0},k2=function(n){return Object.assign(n,{"on:begin":(e,t)=>{t.data._beginMatch=e[1]},"on:end":(e,t)=>{t.data._beginMatch!==e[1]&&t.ignoreMatch()}})};var Os=Object.freeze({__proto__:null,APOS_STRING_MODE:r2,BACKSLASH_ESCAPE:as,BINARY_NUMBER_MODE:g2,BINARY_NUMBER_RE:Kd,COMMENT:$s,C_BLOCK_COMMENT_MODE:f2,C_LINE_COMMENT_MODE:u2,C_NUMBER_MODE:m2,C_NUMBER_RE:Gd,END_SAME_AS_BEGIN:k2,HASH_COMMENT_MODE:d2,IDENT_RE:Hd,MATCH_NOTHING_RE:s2,METHOD_GUARD:v2,NUMBER_MODE:p2,NUMBER_RE:Wd,PHRASAL_WORDS_MODE:c2,QUOTE_STRING_MODE:a2,REGEXP_MODE:h2,RE_STARTERS_RE:i2,SHEBANG:o2,TITLE_MODE:_2,UNDERSCORE_IDENT_RE:fo,UNDERSCORE_TITLE_MODE:b2});function w2(n,e){n.input[n.index-1]==="."&&e.ignoreMatch()}function y2(n,e){n.className!==void 0&&(n.scope=n.className,delete n.className)}function E2(n,e){e&&n.beginKeywords&&(n.begin="\\b("+n.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",n.__beforeBegin=w2,n.keywords=n.keywords||n.beginKeywords,delete n.beginKeywords,n.relevance===void 0&&(n.relevance=0))}function T2(n,e){Array.isArray(n.illegal)&&(n.illegal=co(...n.illegal))}function S2(n,e){if(n.match){if(n.begin||n.end)throw new Error("begin & end are not supported with match");n.begin=n.match,delete n.match}}function C2(n,e){n.relevance===void 0&&(n.relevance=1)}const A2=(n,e)=>{if(!n.beforeMatch)return;if(n.starts)throw new Error("beforeMatch cannot be used with starts");const t=Object.assign({},n);Object.keys(n).forEach(l=>{delete n[l]}),n.keywords=t.keywords,n.begin=yl(t.beforeMatch,jd(t.begin)),n.starts={relevance:0,contains:[Object.assign(t,{endsParent:!0})]},n.relevance=0,delete t.beforeMatch},N2=["of","and","for","in","not","or","if","then","parent","list","value"],R2="keyword";function Vd(n,e,t=R2){const l=Object.create(null);return typeof n=="string"?s(t,n.split(" ")):Array.isArray(n)?s(t,n):Object.keys(n).forEach(function(o){Object.assign(l,Vd(n[o],e,o))}),l;function s(o,i){e&&(i=i.map(c=>c.toLowerCase())),i.forEach(function(c){const u=c.split("|");l[u[0]]=[o,I2(u[0],u[1])]})}}function I2(n,e){return e?Number(e):M2(n)?0:1}function M2(n){return N2.includes(n.toLowerCase())}const Nc={},_l=n=>{console.error(n)},Rc=(n,...e)=>{console.log(`WARN: ${n}`,...e)},Pl=(n,e)=>{Nc[`${n}/${e}`]||(console.log(`Deprecated as of ${n}. ${e}`),Nc[`${n}/${e}`]=!0)},Zs=new Error;function qd(n,e,{key:t}){let l=0;const s=n[t],o={},i={};for(let c=1;c<=e.length;c++)i[c+l]=s[c],o[c+l]=!0,l+=Ud(e[c-1]);n[t]=i,n[t]._emit=o,n[t]._multi=!0}function L2(n){if(Array.isArray(n.begin)){if(n.skip||n.excludeBegin||n.returnBegin)throw _l("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),Zs;if(typeof n.beginScope!="object"||n.beginScope===null)throw _l("beginScope must be object"),Zs;qd(n,n.begin,{key:"beginScope"}),n.begin=uo(n.begin,{joinWith:""})}}function O2(n){if(Array.isArray(n.end)){if(n.skip||n.excludeEnd||n.returnEnd)throw _l("skip, excludeEnd, returnEnd not compatible with endScope: {}"),Zs;if(typeof n.endScope!="object"||n.endScope===null)throw _l("endScope must be object"),Zs;qd(n,n.end,{key:"endScope"}),n.end=uo(n.end,{joinWith:""})}}function D2(n){n.scope&&typeof n.scope=="object"&&n.scope!==null&&(n.beginScope=n.scope,delete n.scope)}function P2(n){D2(n),typeof n.beginScope=="string"&&(n.beginScope={_wrap:n.beginScope}),typeof n.endScope=="string"&&(n.endScope={_wrap:n.endScope}),L2(n),O2(n)}function z2(n){function e(i,c){return new RegExp(rs(i),"m"+(n.case_insensitive?"i":"")+(n.unicodeRegex?"u":"")+(c?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(c,u){u.position=this.position++,this.matchIndexes[this.matchAt]=u,this.regexes.push([u,c]),this.matchAt+=Ud(c)+1}compile(){this.regexes.length===0&&(this.exec=()=>null);const c=this.regexes.map(u=>u[1]);this.matcherRe=e(uo(c,{joinWith:"|"}),!0),this.lastIndex=0}exec(c){this.matcherRe.lastIndex=this.lastIndex;const u=this.matcherRe.exec(c);if(!u)return null;const d=u.findIndex((g,h)=>h>0&&g!==void 0),m=this.matchIndexes[d];return u.splice(0,d),Object.assign(u,m)}}class l{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(c){if(this.multiRegexes[c])return this.multiRegexes[c];const u=new t;return this.rules.slice(c).forEach(([d,m])=>u.addRule(d,m)),u.compile(),this.multiRegexes[c]=u,u}resumingScanAtSamePosition(){return this.regexIndex!==0}considerAll(){this.regexIndex=0}addRule(c,u){this.rules.push([c,u]),u.type==="begin"&&this.count++}exec(c){const u=this.getMatcher(this.regexIndex);u.lastIndex=this.lastIndex;let d=u.exec(c);if(this.resumingScanAtSamePosition()&&!(d&&d.index===this.lastIndex)){const m=this.getMatcher(0);m.lastIndex=this.lastIndex+1,d=m.exec(c)}return d&&(this.regexIndex+=d.position+1,this.regexIndex===this.count&&this.considerAll()),d}}function s(i){const c=new l;return i.contains.forEach(u=>c.addRule(u.begin,{rule:u,type:"begin"})),i.terminatorEnd&&c.addRule(i.terminatorEnd,{type:"end"}),i.illegal&&c.addRule(i.illegal,{type:"illegal"}),c}function o(i,c){const u=i;if(i.isCompiled)return u;[y2,S2,P2,A2].forEach(m=>m(i,c)),n.compilerExtensions.forEach(m=>m(i,c)),i.__beforeBegin=null,[E2,T2,C2].forEach(m=>m(i,c)),i.isCompiled=!0;let d=null;return typeof i.keywords=="object"&&i.keywords.$pattern&&(i.keywords=Object.assign({},i.keywords),d=i.keywords.$pattern,delete i.keywords.$pattern),d=d||/\w+/,i.keywords&&(i.keywords=Vd(i.keywords,n.case_insensitive)),u.keywordPatternRe=e(d,!0),c&&(i.begin||(i.begin=/\B|\b/),u.beginRe=e(u.begin),!i.end&&!i.endsWithParent&&(i.end=/\B|\b/),i.end&&(u.endRe=e(u.end)),u.terminatorEnd=rs(u.end)||"",i.endsWithParent&&c.terminatorEnd&&(u.terminatorEnd+=(i.end?"|":"")+c.terminatorEnd)),i.illegal&&(u.illegalRe=e(i.illegal)),i.contains||(i.contains=[]),i.contains=[].concat(...i.contains.map(function(m){return B2(m==="self"?i:m)})),i.contains.forEach(function(m){o(m,u)}),i.starts&&o(i.starts,c),u.matcher=s(u),u}if(n.compilerExtensions||(n.compilerExtensions=[]),n.contains&&n.contains.includes("self"))throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return n.classNameAliases=Yn(n.classNameAliases||{}),o(n)}function Zd(n){return n?n.endsWithParent||Zd(n.starts):!1}function B2(n){return n.variants&&!n.cachedVariants&&(n.cachedVariants=n.variants.map(function(e){return Yn(n,{variants:null},e)})),n.cachedVariants?n.cachedVariants:Zd(n)?Yn(n,{starts:n.starts?Yn(n.starts):null}):Object.isFrozen(n)?Yn(n):n}var F2="11.11.1";class j2 extends Error{constructor(e,t){super(e),this.name="HTMLInjectionError",this.html=t}}const Fi=Fd,Ic=Yn,Mc=Symbol("nomatch"),U2=7,Yd=function(n){const e=Object.create(null),t=Object.create(null),l=[];let s=!0;const o="Could not find the language '{}', did you forget to load/include a language module?",i={disableAutodetect:!0,name:"Plain text",contains:[]};let c={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:xk};function u(G){return c.noHighlightRe.test(G)}function d(G){let P=G.className+" ";P+=G.parentNode?G.parentNode.className:"";const j=c.languageDetectRe.exec(P);if(j){const B=O(j[1]);return B||(Rc(o.replace("{}",j[1])),Rc("Falling back to no-highlight mode for this block.",G)),B?j[1]:"no-highlight"}return P.split(/\s+/).find(B=>u(B)||O(B))}function m(G,P,j){let B="",J="";typeof P=="object"?(B=G,j=P.ignoreIllegals,J=P.language):(Pl("10.7.0","highlight(lang, code, ...args) has been deprecated."),Pl("10.7.0",`Please use highlight(code, options) instead.
+https://github.com/highlightjs/highlight.js/issues/2277`),J=G,B=P),j===void 0&&(j=!0);const q={code:B,language:J};Z("before:highlight",q);const Y=q.result?q.result:g(q.language,q.code,j);return Y.code=q.code,Z("after:highlight",Y),Y}function g(G,P,j,B){const J=Object.create(null);function q(ue,ye){return ue.keywords[ye]}function Y(){if(!be.keywords){Me.addText(Re);return}let ue=0;be.keywordPatternRe.lastIndex=0;let ye=be.keywordPatternRe.exec(Re),x="";for(;ye;){x+=Re.substring(ue,ye.index);const ge=_e.case_insensitive?ye[0].toLowerCase():ye[0],de=q(be,ge);if(de){const[Ae,it]=de;if(Me.addText(x),x="",J[ge]=(J[ge]||0)+1,J[ge]<=U2&&(Pe+=it),Ae.startsWith("_"))x+=ye[0];else{const ot=_e.classNameAliases[Ae]||Ae;te(ye[0],ot)}}else x+=ye[0];ue=be.keywordPatternRe.lastIndex,ye=be.keywordPatternRe.exec(Re)}x+=Re.substring(ue),Me.addText(x)}function $(){if(Re==="")return;let ue=null;if(typeof be.subLanguage=="string"){if(!e[be.subLanguage]){Me.addText(Re);return}ue=g(be.subLanguage,Re,!0,lt[be.subLanguage]),lt[be.subLanguage]=ue._top}else ue=_(Re,be.subLanguage.length?be.subLanguage:null);be.relevance>0&&(Pe+=ue.relevance),Me.__addSublanguage(ue._emitter,ue.language)}function ne(){be.subLanguage!=null?$():Y(),Re=""}function te(ue,ye){ue!==""&&(Me.startScope(ye),Me.addText(ue),Me.endScope())}function pe(ue,ye){let x=1;const ge=ye.length-1;for(;x<=ge;){if(!ue._emit[x]){x++;continue}const de=_e.classNameAliases[ue[x]]||ue[x],Ae=ye[x];de?te(Ae,de):(Re=Ae,Y(),Re=""),x++}}function Te(ue,ye){return ue.scope&&typeof ue.scope=="string"&&Me.openNode(_e.classNameAliases[ue.scope]||ue.scope),ue.beginScope&&(ue.beginScope._wrap?(te(Re,_e.classNameAliases[ue.beginScope._wrap]||ue.beginScope._wrap),Re=""):ue.beginScope._multi&&(pe(ue.beginScope,ye),Re="")),be=Object.create(ue,{parent:{value:be}}),be}function Fe(ue,ye,x){let ge=n2(ue.endRe,x);if(ge){if(ue["on:end"]){const de=new Sc(ue);ue["on:end"](ye,de),de.isMatchIgnored&&(ge=!1)}if(ge){for(;ue.endsParent&&ue.parent;)ue=ue.parent;return ue}}if(ue.endsWithParent)return Fe(ue.parent,ye,x)}function qe(ue){return be.matcher.regexIndex===0?(Re+=ue[0],1):(ze=!0,0)}function Ne(ue){const ye=ue[0],x=ue.rule,ge=new Sc(x),de=[x.__beforeBegin,x["on:begin"]];for(const Ae of de)if(Ae&&(Ae(ue,ge),ge.isMatchIgnored))return qe(ye);return x.skip?Re+=ye:(x.excludeBegin&&(Re+=ye),ne(),!x.returnBegin&&!x.excludeBegin&&(Re=ye)),Te(x,ue),x.returnBegin?0:ye.length}function ee(ue){const ye=ue[0],x=P.substring(ue.index),ge=Fe(be,ue,x);if(!ge)return Mc;const de=be;be.endScope&&be.endScope._wrap?(ne(),te(ye,be.endScope._wrap)):be.endScope&&be.endScope._multi?(ne(),pe(be.endScope,ue)):de.skip?Re+=ye:(de.returnEnd||de.excludeEnd||(Re+=ye),ne(),de.excludeEnd&&(Re=ye));do be.scope&&Me.closeNode(),!be.skip&&!be.subLanguage&&(Pe+=be.relevance),be=be.parent;while(be!==ge.parent);return ge.starts&&Te(ge.starts,ue),de.returnEnd?0:ye.length}function oe(){const ue=[];for(let ye=be;ye!==_e;ye=ye.parent)ye.scope&&ue.unshift(ye.scope);ue.forEach(ye=>Me.openNode(ye))}let Ce={};function je(ue,ye){const x=ye&&ye[0];if(Re+=ue,x==null)return ne(),0;if(Ce.type==="begin"&&ye.type==="end"&&Ce.index===ye.index&&x===""){if(Re+=P.slice(ye.index,ye.index+1),!s){const ge=new Error(`0 width match regex (${G})`);throw ge.languageName=G,ge.badRule=Ce.rule,ge}return 1}if(Ce=ye,ye.type==="begin")return Ne(ye);if(ye.type==="illegal"&&!j){const ge=new Error('Illegal lexeme "'+x+'" for mode "'+(be.scope||"")+'"');throw ge.mode=be,ge}else if(ye.type==="end"){const ge=ee(ye);if(ge!==Mc)return ge}if(ye.type==="illegal"&&x==="")return Re+=`
+`,1;if(De>1e5&&De>ye.index*3)throw new Error("potential infinite loop, way more iterations than matches");return Re+=x,x.length}const _e=O(G);if(!_e)throw _l(o.replace("{}",G)),new Error('Unknown language: "'+G+'"');const Ue=z2(_e);let pt="",be=B||Ue;const lt={},Me=new c.__emitter(c);oe();let Re="",Pe=0,He=0,De=0,ze=!1;try{if(_e.__emitTokens)_e.__emitTokens(P,Me);else{for(be.matcher.considerAll();;){De++,ze?ze=!1:be.matcher.considerAll(),be.matcher.lastIndex=He;const ue=be.matcher.exec(P);if(!ue)break;const ye=P.substring(He,ue.index),x=je(ye,ue);He=ue.index+x}je(P.substring(He))}return Me.finalize(),pt=Me.toHTML(),{language:G,value:pt,relevance:Pe,illegal:!1,_emitter:Me,_top:be}}catch(ue){if(ue.message&&ue.message.includes("Illegal"))return{language:G,value:Fi(P),illegal:!0,relevance:0,_illegalBy:{message:ue.message,index:He,context:P.slice(He-100,He+100),mode:ue.mode,resultSoFar:pt},_emitter:Me};if(s)return{language:G,value:Fi(P),illegal:!1,relevance:0,errorRaised:ue,_emitter:Me,_top:be};throw ue}}function h(G){const P={value:Fi(G),illegal:!1,relevance:0,_top:i,_emitter:new c.__emitter(c)};return P._emitter.addText(G),P}function _(G,P){P=P||c.languages||Object.keys(e);const j=h(G),B=P.filter(O).filter(H).map(ne=>g(ne,G,!1));B.unshift(j);const J=B.sort((ne,te)=>{if(ne.relevance!==te.relevance)return te.relevance-ne.relevance;if(ne.language&&te.language){if(O(ne.language).supersetOf===te.language)return 1;if(O(te.language).supersetOf===ne.language)return-1}return 0}),[q,Y]=J,$=q;return $.secondBest=Y,$}function v(G,P,j){const B=P&&t[P]||j;G.classList.add("hljs"),G.classList.add(`language-${B}`)}function k(G){let P=null;const j=d(G);if(u(j))return;if(Z("before:highlightElement",{el:G,language:j}),G.dataset.highlighted){console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",G);return}if(G.children.length>0&&(c.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(G)),c.throwUnescapedHTML))throw new j2("One of your code blocks includes unescaped HTML.",G.innerHTML);P=G;const B=P.textContent,J=j?m(B,{language:j,ignoreIllegals:!0}):_(B);G.innerHTML=J.value,G.dataset.highlighted="yes",v(G,j,J.language),G.result={language:J.language,re:J.relevance,relevance:J.relevance},J.secondBest&&(G.secondBest={language:J.secondBest.language,relevance:J.secondBest.relevance}),Z("after:highlightElement",{el:G,result:J,text:B})}function y(G){c=Ic(c,G)}const E=()=>{N(),Pl("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")};function C(){N(),Pl("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")}let A=!1;function N(){function G(){N()}if(document.readyState==="loading"){A||window.addEventListener("DOMContentLoaded",G,!1),A=!0;return}document.querySelectorAll(c.cssSelector).forEach(k)}function I(G,P){let j=null;try{j=P(n)}catch(B){if(_l("Language definition for '{}' could not be registered.".replace("{}",G)),s)_l(B);else throw B;j=i}j.name||(j.name=G),e[G]=j,j.rawDefinition=P.bind(null,n),j.aliases&&L(j.aliases,{languageName:G})}function M(G){delete e[G];for(const P of Object.keys(t))t[P]===G&&delete t[P]}function R(){return Object.keys(e)}function O(G){return G=(G||"").toLowerCase(),e[G]||e[t[G]]}function L(G,{languageName:P}){typeof G=="string"&&(G=[G]),G.forEach(j=>{t[j.toLowerCase()]=P})}function H(G){const P=O(G);return P&&!P.disableAutodetect}function W(G){G["before:highlightBlock"]&&!G["before:highlightElement"]&&(G["before:highlightElement"]=P=>{G["before:highlightBlock"](Object.assign({block:P.el},P))}),G["after:highlightBlock"]&&!G["after:highlightElement"]&&(G["after:highlightElement"]=P=>{G["after:highlightBlock"](Object.assign({block:P.el},P))})}function U(G){W(G),l.push(G)}function K(G){const P=l.indexOf(G);P!==-1&&l.splice(P,1)}function Z(G,P){const j=G;l.forEach(function(B){B[j]&&B[j](P)})}function X(G){return Pl("10.7.0","highlightBlock will be removed entirely in v12.0"),Pl("10.7.0","Please use highlightElement now."),k(G)}Object.assign(n,{highlight:m,highlightAuto:_,highlightAll:N,highlightElement:k,highlightBlock:X,configure:y,initHighlighting:E,initHighlightingOnLoad:C,registerLanguage:I,unregisterLanguage:M,listLanguages:R,getLanguage:O,registerAliases:L,autoDetection:H,inherit:Ic,addPlugin:U,removePlugin:K}),n.debugMode=function(){s=!1},n.safeMode=function(){s=!0},n.versionString=F2,n.regex={concat:yl,lookahead:jd,either:co,optional:e2,anyNumberOfTimes:$k};for(const G in Os)typeof Os[G]=="object"&&Bd(Os[G]);return Object.assign(n,Os),n},Ul=Yd({});Ul.newInstance=()=>Yd({});var H2=Ul;Ul.HighlightJS=Ul;Ul.default=Ul;const ln=Yk(H2),Lc="[A-Za-z$_][0-9A-Za-z$_]*",W2=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],G2=["true","false","null","undefined","NaN","Infinity"],Xd=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],Jd=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Qd=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],K2=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],V2=[].concat(Qd,Xd,Jd);function q2(n){const e=n.regex,t=(j,{after:B})=>{const J=""+j[0].slice(1);return j.input.indexOf(J,B)!==-1},l=Lc,s={begin:"<>",end:">"},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(j,B)=>{const J=j[0].length+j.index,q=j.input[J];if(q==="<"||q===","){B.ignoreMatch();return}q===">"&&(t(j,{after:J})||B.ignoreMatch());let Y;const $=j.input.substring(J);if(Y=$.match(/^\s*=/)){B.ignoreMatch();return}if((Y=$.match(/^\s+extends\s+/))&&Y.index===0){B.ignoreMatch();return}}},c={$pattern:Lc,keyword:W2,literal:G2,built_in:V2,"variable.language":K2},u="[0-9](_?[0-9])*",d=`\\.(${u})`,m="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",g={className:"number",variants:[{begin:`(\\b(${m})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${m})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},h={className:"subst",begin:"\\$\\{",end:"\\}",keywords:c,contains:[]},_={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"xml"}},v={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"css"}},k={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[n.BACKSLASH_ESCAPE,h]},C={className:"comment",variants:[n.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:l+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),n.C_BLOCK_COMMENT_MODE,n.C_LINE_COMMENT_MODE]},A=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,_,v,k,y,{match:/\$\d+/},g];h.contains=A.concat({begin:/\{/,end:/\}/,keywords:c,contains:["self"].concat(A)});const N=[].concat(C,h.contains),I=N.concat([{begin:/(\s*)\(/,end:/\)/,keywords:c,contains:["self"].concat(N)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:I},R={variants:[{match:[/class/,/\s+/,l,/\s+/,/extends/,/\s+/,e.concat(l,"(",e.concat(/\./,l),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,l],scope:{1:"keyword",3:"title.class"}}]},O={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...Xd,...Jd]}},L={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},H={variants:[{match:[/function/,/\s+/,l,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},W={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function U(j){return e.concat("(?!",j.join("|"),")")}const K={match:e.concat(/\b/,U([...Qd,"super","import"].map(j=>`${j}\\s*\\(`)),l,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},Z={begin:e.concat(/\./,e.lookahead(e.concat(l,/(?![0-9A-Za-z$_(])/))),end:l,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},X={match:[/get|set/,/\s+/,l,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},G="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+n.UNDERSCORE_IDENT_RE+")\\s*=>",P={match:[/const|var|let/,/\s+/,l,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(G)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:c,exports:{PARAMS_CONTAINS:I,CLASS_REFERENCE:O},illegal:/#(?![$_A-z])/,contains:[n.SHEBANG({label:"shebang",binary:"node",relevance:5}),L,n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,_,v,k,y,C,{match:/\$\d+/},g,O,{scope:"attr",match:l+e.lookahead(":"),relevance:0},P,{begin:"("+n.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[C,n.REGEXP_MODE,{className:"function",begin:G,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:I}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:s.begin,end:s.end},{match:o},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},H,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+n.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,n.inherit(n.TITLE_MODE,{begin:l,className:"title.function"})]},{match:/\.\.\./,relevance:0},Z,{match:"\\$"+l,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},K,W,R,X,{match:/\$[(.]/}]}}const Ys="[A-Za-z$_][0-9A-Za-z$_]*",xd=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends","using"],$d=["true","false","null","undefined","NaN","Infinity"],ep=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],tp=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],np=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],lp=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],sp=[].concat(np,ep,tp);function Z2(n){const e=n.regex,t=(j,{after:B})=>{const J=""+j[0].slice(1);return j.input.indexOf(J,B)!==-1},l=Ys,s={begin:"<>",end:">"},o=/<[A-Za-z0-9\\._:-]+\s*\/>/,i={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(j,B)=>{const J=j[0].length+j.index,q=j.input[J];if(q==="<"||q===","){B.ignoreMatch();return}q===">"&&(t(j,{after:J})||B.ignoreMatch());let Y;const $=j.input.substring(J);if(Y=$.match(/^\s*=/)){B.ignoreMatch();return}if((Y=$.match(/^\s+extends\s+/))&&Y.index===0){B.ignoreMatch();return}}},c={$pattern:Ys,keyword:xd,literal:$d,built_in:sp,"variable.language":lp},u="[0-9](_?[0-9])*",d=`\\.(${u})`,m="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",g={className:"number",variants:[{begin:`(\\b(${m})((${d})|\\.)?|(${d}))[eE][+-]?(${u})\\b`},{begin:`\\b(${m})\\b((${d})\\b|\\.)?|(${d})\\b`},{begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{begin:"\\b0[0-7]+n?\\b"}],relevance:0},h={className:"subst",begin:"\\$\\{",end:"\\}",keywords:c,contains:[]},_={begin:".?html`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"xml"}},v={begin:".?css`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"css"}},k={begin:".?gql`",end:"",starts:{end:"`",returnEnd:!1,contains:[n.BACKSLASH_ESCAPE,h],subLanguage:"graphql"}},y={className:"string",begin:"`",end:"`",contains:[n.BACKSLASH_ESCAPE,h]},C={className:"comment",variants:[n.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0,excludeBegin:!0,relevance:0},{className:"variable",begin:l+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),n.C_BLOCK_COMMENT_MODE,n.C_LINE_COMMENT_MODE]},A=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,_,v,k,y,{match:/\$\d+/},g];h.contains=A.concat({begin:/\{/,end:/\}/,keywords:c,contains:["self"].concat(A)});const N=[].concat(C,h.contains),I=N.concat([{begin:/(\s*)\(/,end:/\)/,keywords:c,contains:["self"].concat(N)}]),M={className:"params",begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:I},R={variants:[{match:[/class/,/\s+/,l,/\s+/,/extends/,/\s+/,e.concat(l,"(",e.concat(/\./,l),")*")],scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{match:[/class/,/\s+/,l],scope:{1:"keyword",3:"title.class"}}]},O={relevance:0,match:e.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/),className:"title.class",keywords:{_:[...ep,...tp]}},L={label:"use_strict",className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},H={variants:[{match:[/function/,/\s+/,l,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}],className:{1:"keyword",3:"title.function"},label:"func.def",contains:[M],illegal:/%/},W={relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/,className:"variable.constant"};function U(j){return e.concat("(?!",j.join("|"),")")}const K={match:e.concat(/\b/,U([...np,"super","import"].map(j=>`${j}\\s*\\(`)),l,e.lookahead(/\s*\(/)),className:"title.function",relevance:0},Z={begin:e.concat(/\./,e.lookahead(e.concat(l,/(?![0-9A-Za-z$_(])/))),end:l,excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},X={match:[/get|set/,/\s+/,l,/(?=\()/],className:{1:"keyword",3:"title.function"},contains:[{begin:/\(\)/},M]},G="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+n.UNDERSCORE_IDENT_RE+")\\s*=>",P={match:[/const|var|let/,/\s+/,l,/\s*/,/=\s*/,/(async\s*)?/,e.lookahead(G)],keywords:"async",className:{1:"keyword",3:"title.function"},contains:[M]};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:c,exports:{PARAMS_CONTAINS:I,CLASS_REFERENCE:O},illegal:/#(?![$_A-z])/,contains:[n.SHEBANG({label:"shebang",binary:"node",relevance:5}),L,n.APOS_STRING_MODE,n.QUOTE_STRING_MODE,_,v,k,y,C,{match:/\$\d+/},g,O,{scope:"attr",match:l+e.lookahead(":"),relevance:0},P,{begin:"("+n.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",relevance:0,contains:[C,n.REGEXP_MODE,{className:"function",begin:G,returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:n.UNDERSCORE_IDENT_RE,relevance:0},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/(\s*)\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:I}]}]},{begin:/,/,relevance:0},{match:/\s+/,relevance:0},{variants:[{begin:s.begin,end:s.end},{match:o},{begin:i.begin,"on:begin":i.isTrulyOpeningTag,end:i.end}],subLanguage:"xml",contains:[{begin:i.begin,end:i.end,skip:!0,contains:["self"]}]}]},H,{beginKeywords:"while if switch catch for"},{begin:"\\b(?!function)"+n.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{",returnBegin:!0,label:"func.def",contains:[M,n.inherit(n.TITLE_MODE,{begin:l,className:"title.function"})]},{match:/\.\.\./,relevance:0},Z,{match:"\\$"+l,relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"},contains:[M]},K,W,R,X,{match:/\$[(.]/}]}}function Y2(n){const e=n.regex,t=Z2(n),l=Ys,s=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],o={begin:[/namespace/,/\s+/,n.IDENT_RE],beginScope:{1:"keyword",3:"title.class"}},i={beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:{keyword:"interface extends",built_in:s},contains:[t.exports.CLASS_REFERENCE]},c={className:"meta",relevance:10,begin:/^\s*['"]use strict['"]/},u=["type","interface","public","private","protected","implements","declare","abstract","readonly","enum","override","satisfies"],d={$pattern:Ys,keyword:xd.concat(u),literal:$d,built_in:sp.concat(s),"variable.language":lp},m={className:"meta",begin:"@"+l},g=(k,y,E)=>{const C=k.contains.findIndex(A=>A.label===y);if(C===-1)throw new Error("can not find mode to replace");k.contains.splice(C,1,E)};Object.assign(t.keywords,d),t.exports.PARAMS_CONTAINS.push(m);const h=t.contains.find(k=>k.scope==="attr"),_=Object.assign({},h,{match:e.concat(l,e.lookahead(/\s*\?:/))});t.exports.PARAMS_CONTAINS.push([t.exports.CLASS_REFERENCE,h,_]),t.contains=t.contains.concat([m,o,i,_]),g(t,"shebang",n.SHEBANG()),g(t,"use_strict",c);const v=t.contains.find(k=>k.label==="func.def");return v.relevance=0,Object.assign(t,{name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),t}function X2(n){const e=n.regex,t=new RegExp("[\\p{XID_Start}_]\\p{XID_Continue}*","u"),l=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],c={$pattern:/[A-Za-z]\w+|__\w+__/,keyword:l,built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"],literal:["__debug__","Ellipsis","False","None","NotImplemented","True"],type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"]},u={className:"meta",begin:/^(>>>|\.\.\.) /},d={className:"subst",begin:/\{/,end:/\}/,keywords:c,illegal:/#/},m={begin:/\{\{/,relevance:0},g={className:"string",contains:[n.BACKSLASH_ESCAPE],variants:[{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/,contains:[n.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/,contains:[n.BACKSLASH_ESCAPE,u],relevance:10},{begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/,contains:[n.BACKSLASH_ESCAPE,u,m,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/,end:/"""/,contains:[n.BACKSLASH_ESCAPE,u,m,d]},{begin:/([uU]|[rR])'/,end:/'/,relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/,end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/,contains:[n.BACKSLASH_ESCAPE,m,d]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/,contains:[n.BACKSLASH_ESCAPE,m,d]},n.APOS_STRING_MODE,n.QUOTE_STRING_MODE]},h="[0-9](_?[0-9])*",_=`(\\b(${h}))?\\.(${h})|\\b(${h})\\.`,v=`\\b|${l.join("|")}`,k={className:"number",relevance:0,variants:[{begin:`(\\b(${h})|(${_}))[eE][+-]?(${h})[jJ]?(?=${v})`},{begin:`(${_})[jJ]?`},{begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${v})`},{begin:`\\b0[bB](_?[01])+[lL]?(?=${v})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${v})`},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${v})`},{begin:`\\b(${h})[jJ](?=${v})`}]},y={className:"comment",begin:e.lookahead(/# type:/),end:/$/,keywords:c,contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},E={className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:c,contains:["self",u,k,g,n.HASH_COMMENT_MODE]}]};return d.contains=[g,k,u],{name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:c,illegal:/(<\/|\?)|=>/,contains:[u,k,{scope:"variable.language",match:/\bself\b/},{beginKeywords:"if",relevance:0},{match:/\bor\b/,scope:"keyword"},g,y,n.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[E]},{variants:[{match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}],scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[k,E,g]}]}}function J2(n){const o={keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"],type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"],literal:["true","false","iota","nil"],built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"]};return{name:"Go",aliases:["golang"],keywords:o,illegal:"",contains:[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE,{className:"string",variants:[n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:"`",end:"`"}]},{className:"number",variants:[{match:/-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/,relevance:0},{match:/-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b0[oO](_?[0-7])*i?/,relevance:0},{match:/-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/,relevance:0},{match:/-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/,relevance:0}]},{begin:/:=/},{className:"function",beginKeywords:"func",end:"\\s*(\\{|$)",excludeEnd:!0,contains:[n.TITLE_MODE,{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:o,illegal:/["']/}]}]}}function Q2(n){const e=n.regex,t={},l={begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]};Object.assign(t,{className:"variable",variants:[{begin:e.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},l]});const s={className:"subst",begin:/\$\(/,end:/\)/,contains:[n.BACKSLASH_ESCAPE]},o=n.inherit(n.COMMENT(),{match:[/(^|\s)/,/#.*$/],scope:{2:"comment"}}),i={begin:/<<-?\s*(?=\w+)/,starts:{contains:[n.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,className:"string"})]}},c={className:"string",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE,t,s]};s.contains.push(c);const u={match:/\\"/},d={className:"string",begin:/'/,end:/'/},m={match:/\\'/},g={begin:/\$?\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},n.NUMBER_MODE,t]},h=["fish","bash","zsh","sh","csh","ksh","tcsh","dash","scsh"],_=n.SHEBANG({binary:`(${h.join("|")})`,relevance:10}),v={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[n.inherit(n.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},k=["if","then","else","elif","fi","time","for","while","until","in","do","done","case","esac","coproc","function","select"],y=["true","false"],E={match:/(\/[a-z._-]+)+/},C=["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset"],A=["alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","sudo","type","typeset","ulimit","unalias"],N=["autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp"],I=["chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"];return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/,keyword:k,literal:y,built_in:[...C,...A,"set","shopt",...N,...I]},contains:[_,n.SHEBANG(),v,g,o,i,E,c,u,d,m,t]}}function x2(n){const e={className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},t={match:/[{}[\],:]/,className:"punctuation",relevance:0},l=["true","false","null"],s={scope:"literal",beginKeywords:l.join(" ")};return{name:"JSON",aliases:["jsonc"],keywords:{literal:l},contains:[e,t,n.QUOTE_STRING_MODE,s,n.C_NUMBER_MODE,n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],illegal:"\\S"}}function $2(n){const e="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",l={className:"attr",variants:[{begin:/[\w*@][\w*@ :()\./-]*:(?=[ \t]|$)/},{begin:/"[\w*@][\w*@ :()\./-]*":(?=[ \t]|$)/},{begin:/'[\w*@][\w*@ :()\./-]*':(?=[ \t]|$)/}]},s={className:"template-variable",variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]},o={className:"string",relevance:0,begin:/'/,end:/'/,contains:[{match:/''/,scope:"char.escape",relevance:0}]},i={className:"string",relevance:0,variants:[{begin:/"/,end:/"/},{begin:/\S+/}],contains:[n.BACKSLASH_ESCAPE,s]},c=n.inherit(i,{variants:[{begin:/'/,end:/'/,contains:[{begin:/''/,relevance:0}]},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),h={className:"number",begin:"\\b"+"[0-9]{4}(-[0-9][0-9]){0,2}"+"([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?"+"(\\.[0-9]*)?"+"([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?"+"\\b"},_={end:",",endsWithParent:!0,excludeEnd:!0,keywords:e,relevance:0},v={begin:/\{/,end:/\}/,contains:[_],illegal:"\\n",relevance:0},k={begin:"\\[",end:"\\]",contains:[_],illegal:"\\n",relevance:0},y=[l,{className:"meta",begin:"^---\\s*$",relevance:10},{className:"string",begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type",begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t},{className:"meta",begin:"&"+n.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+n.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)",relevance:0},n.HASH_COMMENT_MODE,{beginKeywords:e,keywords:{literal:e}},h,{className:"number",begin:n.C_NUMBER_RE+"\\b",relevance:0},v,k,o,i],E=[...y];return E.pop(),E.push(c),_.contains=E,{name:"YAML",case_insensitive:!0,aliases:["yml"],contains:y}}function ew(n){const e=n.regex,t={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},l={begin:"^[-\\*]{3,}",end:"$"},s={className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},o={className:"bullet",begin:"^[ ]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i={begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]},c=/[A-Za-z][A-Za-z0-9+.-]*/,u={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/,relevance:2},{begin:e.concat(/\[.+?\]\(/,c,/:\/\/.*?\)/),relevance:2},{begin:/\[.+?\]\([./?].*?\)/,relevance:1},{begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}]},d={className:"strong",contains:[],variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}]},m={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{begin:/_(?![_\s])/,end:/_/,relevance:0}]},g=n.inherit(d,{contains:[]}),h=n.inherit(m,{contains:[]});d.contains.push(h),m.contains.push(g);let _=[t,u];return[d,m,g,h].forEach(E=>{E.contains=E.contains.concat(_)}),_=_.concat(d,m),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:_},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:_}]}]},t,o,d,m,{className:"quote",begin:"^>\\s+",contains:_,end:"$"},s,l,u,i,{scope:"literal",match:/&([a-zA-Z0-9]+|#[0-9]{1,7}|#[Xx][0-9a-fA-F]{1,6});/}]}}const tw=n=>({IMPORTANT:{scope:"meta",begin:"!important"},BLOCK_COMMENT:n.C_BLOCK_COMMENT_MODE,HEXCOLOR:{scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/},FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/},ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{scope:"number",begin:n.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/}}),nw=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","optgroup","option","p","picture","q","quote","samp","section","select","source","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],lw=["defs","g","marker","mask","pattern","svg","switch","symbol","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feGaussianBlur","feImage","feMerge","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","linearGradient","radialGradient","stop","circle","ellipse","image","line","path","polygon","polyline","rect","text","use","textPath","tspan","foreignObject","clipPath"],sw=[...nw,...lw],iw=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"].sort().reverse(),ow=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"].sort().reverse(),rw=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"].sort().reverse(),aw=["accent-color","align-content","align-items","align-self","alignment-baseline","all","anchor-name","animation","animation-composition","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-range","animation-range-end","animation-range-start","animation-timeline","animation-timing-function","appearance","aspect-ratio","backdrop-filter","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-position-x","background-position-y","background-repeat","background-size","baseline-shift","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-end-end-radius","border-end-start-radius","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-start-end-radius","border-start-start-radius","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-align","box-decoration-break","box-direction","box-flex","box-flex-group","box-lines","box-ordinal-group","box-orient","box-pack","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","color-scheme","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","contain-intrinsic-block-size","contain-intrinsic-height","contain-intrinsic-inline-size","contain-intrinsic-size","contain-intrinsic-width","container","container-name","container-type","content","content-visibility","counter-increment","counter-reset","counter-set","cue","cue-after","cue-before","cursor","cx","cy","direction","display","dominant-baseline","empty-cells","enable-background","field-sizing","fill","fill-opacity","fill-rule","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flood-color","flood-opacity","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-optical-sizing","font-palette","font-size","font-size-adjust","font-smooth","font-smoothing","font-stretch","font-style","font-synthesis","font-synthesis-position","font-synthesis-small-caps","font-synthesis-style","font-synthesis-weight","font-variant","font-variant-alternates","font-variant-caps","font-variant-east-asian","font-variant-emoji","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","forced-color-adjust","gap","glyph-orientation-horizontal","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphenate-character","hyphenate-limit-chars","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","initial-letter","initial-letter-align","inline-size","inset","inset-area","inset-block","inset-block-end","inset-block-start","inset-inline","inset-inline-end","inset-inline-start","isolation","justify-content","justify-items","justify-self","kerning","left","letter-spacing","lighting-color","line-break","line-height","line-height-step","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","margin-trim","marker","marker-end","marker-mid","marker-start","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","masonry-auto-flow","math-depth","math-shift","math-style","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","offset","offset-anchor","offset-distance","offset-path","offset-position","offset-rotate","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-anchor","overflow-block","overflow-clip-margin","overflow-inline","overflow-wrap","overflow-x","overflow-y","overlay","overscroll-behavior","overscroll-behavior-block","overscroll-behavior-inline","overscroll-behavior-x","overscroll-behavior-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page","page-break-after","page-break-before","page-break-inside","paint-order","pause","pause-after","pause-before","perspective","perspective-origin","place-content","place-items","place-self","pointer-events","position","position-anchor","position-visibility","print-color-adjust","quotes","r","resize","rest","rest-after","rest-before","right","rotate","row-gap","ruby-align","ruby-position","scale","scroll-behavior","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scroll-timeline","scroll-timeline-axis","scroll-timeline-name","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","shape-rendering","speak","speak-as","src","stop-color","stop-opacity","stroke","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","tab-size","table-layout","text-align","text-align-all","text-align-last","text-anchor","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-skip","text-decoration-skip-ink","text-decoration-style","text-decoration-thickness","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-size-adjust","text-transform","text-underline-offset","text-underline-position","text-wrap","text-wrap-mode","text-wrap-style","timeline-scope","top","touch-action","transform","transform-box","transform-origin","transform-style","transition","transition-behavior","transition-delay","transition-duration","transition-property","transition-timing-function","translate","unicode-bidi","user-modify","user-select","vector-effect","vertical-align","view-timeline","view-timeline-axis","view-timeline-inset","view-timeline-name","view-transition-name","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","white-space-collapse","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","x","y","z-index","zoom"].sort().reverse();function cw(n){const e=n.regex,t=tw(n),l={begin:/-(webkit|moz|ms|o)-(?=[a-z])/},s="and or not only",o=/@-?\w[\w]*(-\w+)*/,i="[a-zA-Z-][a-zA-Z0-9_-]*",c=[n.APOS_STRING_MODE,n.QUOTE_STRING_MODE];return{name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"},contains:[t.BLOCK_COMMENT,l,t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{className:"selector-class",begin:"\\."+i,relevance:0},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{begin:":("+ow.join("|")+")"},{begin:":(:)?("+rw.join("|")+")"}]},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+aw.join("|")+")\\b"},{begin:/:/,end:/[;}{]/,contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...c,{begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri"},contains:[...c,{className:"string",begin:/[^)]/,endsWithParent:!0,excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:e.lookahead(/@/),end:"[{;]",relevance:0,illegal:/:/,contains:[{className:"keyword",begin:o},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{$pattern:/[a-z-]+/,keyword:s,attribute:iw.join(" ")},contains:[{begin:/[a-z-]+(?=:)/,className:"attribute"},...c,t.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"\\b("+sw.join("|")+")\\b"}]}}function uw(n){const e=n.regex,t=n.COMMENT("--","$"),l={scope:"string",variants:[{begin:/'/,end:/'/,contains:[{match:/''/}]}]},s={begin:/"/,end:/"/,contains:[{match:/""/}]},o=["true","false","unknown"],i=["double precision","large object","with timezone","without timezone"],c=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],u=["add","asc","collation","desc","final","first","last","view"],d=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year"],m=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],g=["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"],h=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],_=m,v=[...d,...u].filter(I=>!m.includes(I)),k={scope:"variable",match:/@[a-z0-9][a-z0-9_]*/},y={scope:"operator",match:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0},E={match:e.concat(/\b/,e.either(..._),/\s*\(/),relevance:0,keywords:{built_in:_}};function C(I){return e.concat(/\b/,e.either(...I.map(M=>M.replace(/\s+/,"\\s+"))),/\b/)}const A={scope:"keyword",match:C(h),relevance:0};function N(I,{exceptions:M,when:R}={}){const O=R;return M=M||[],I.map(L=>L.match(/\|\d+$/)||M.includes(L)?L:O(L)?`${L}|0`:L)}return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{$pattern:/\b[\w\.]+/,keyword:N(v,{when:I=>I.length<3}),literal:o,type:c,built_in:g},contains:[{scope:"type",match:C(i)},A,E,k,l,s,n.C_NUMBER_MODE,n.C_BLOCK_COMMENT_MODE,t,y]}}function fw(n){const e=n.regex,t=e.concat(/[\p{L}_]/u,e.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),l=/[\p{L}0-9._:-]+/u,s={className:"symbol",begin:/&[a-z]+;|[0-9]+;|[a-f0-9]+;/},o={begin:/\s/,contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}]},i=n.inherit(o,{begin:/\(/,end:/\)/}),c=n.inherit(n.APOS_STRING_MODE,{className:"string"}),u=n.inherit(n.QUOTE_STRING_MODE,{className:"string"}),d={endsWithParent:!0,illegal:/,relevance:0,contains:[{className:"attr",begin:l,relevance:0},{begin:/=\s*/,relevance:0,contains:[{className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[s]},{begin:/'/,end:/'/,contains:[s]},{begin:/[^\s"'=<>`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[o,u,c,i,{begin:/\[/,end:/\]/,contains:[{className:"meta",begin://,contains:[o,i,u,c]}]}]},n.COMMENT(//,{relevance:10}),{begin://,relevance:10},s,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/,relevance:10,contains:[u]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag",begin:/
-
-
+
+
diff --git a/cmd/verstak-gui/vault_layout_test.go b/cmd/verstak-gui/vault_layout_test.go
index 87cdaa8..838068c 100644
--- a/cmd/verstak-gui/vault_layout_test.go
+++ b/cmd/verstak-gui/vault_layout_test.go
@@ -126,12 +126,17 @@ func TestVaultLayout_CreateProjectTree(t *testing.T) {
t.Error("expected project folder on disk")
}
- // 4. Verify template created Overview.md
- overviewPath := filepath.Join(serverFolder, "Overview.md")
+ // 4. Verify template created Overview.md inside Notes/ subfolder
+ overviewPath := filepath.Join(serverFolder, "Notes", "Overview.md")
if _, err := os.Stat(overviewPath); os.IsNotExist(err) {
- t.Log("note: Overview.md from template not created (may not be implemented)")
+ t.Errorf("expected Overview.md at %s", overviewPath)
}
+ // Verify no Overview.md in project root
+ overviewRootPath := filepath.Join(serverFolder, "Overview.md")
+ if _, err := os.Stat(overviewRootPath); err == nil {
+ t.Error("Overview.md should not be in project root, only in Notes/")
}
+ }
func TestVaultLayout_CreateNoteInsideProject(t *testing.T) {
app, vault := setupTestApp(t)
@@ -150,16 +155,14 @@ func TestVaultLayout_CreateNoteInsideProject(t *testing.T) {
t.Fatal("expected non-nil node and file record")
}
- // Verify the note .md file is inside the project folder
- expectedPath := filepath.Join(vault, proj.FsPath, "Моя заметка.md")
+ // Verify the note .md file is inside the project's notes/ subfolder
+ // SafeDisplayNameToPathSegment preserves spaces: "Моя заметка" stays as-is
+ expectedPath := filepath.Join(vault, proj.FsPath, "Notes", "Моя заметка.md")
if _, err := os.Stat(expectedPath); os.IsNotExist(err) {
- // Try the safe-display-name variant
- expectedPath2 := filepath.Join(vault, proj.FsPath, "Моя_заметка.md")
- if _, err2 := os.Stat(expectedPath2); os.IsNotExist(err2) {
- // Show what actually exists
- entries, _ := os.ReadDir(filepath.Join(vault, proj.FsPath))
- t.Errorf("expected note file in project folder, found: %v", listNames(entries))
- }
+ // Show what actually exists in notes subfolder
+ notesDir := filepath.Join(vault, proj.FsPath, "Notes")
+ entries, _ := os.ReadDir(notesDir)
+ t.Errorf("expected note file at %s, found in notes/: %v", expectedPath, listNames(entries))
}
}
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 8e09b0f..03d8f83 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -7,6 +7,15 @@
"": {
"name": "frontend",
"version": "0.0.0",
+ "dependencies": {
+ "@types/dompurify": "^3.2.0",
+ "@types/markdown-it": "^14.1.2",
+ "dompurify": "^3.4.10",
+ "highlight.js": "^11.11.1",
+ "markdown-it": "^14.2.0",
+ "markdown-it-task-lists": "^2.1.1",
+ "marked": "^18.0.5"
+ },
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.1.2",
"svelte": "^4.2.19",
@@ -878,6 +887,15 @@
"vite": "^5.0.0"
}
},
+ "node_modules/@types/dompurify": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.2.0.tgz",
+ "integrity": "sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==",
+ "deprecated": "This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed.",
+ "dependencies": {
+ "dompurify": "*"
+ }
+ },
"node_modules/@types/estree": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
@@ -885,6 +903,31 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "optional": true
+ },
"node_modules/@vscode/emmet-helper": {
"version": "2.8.4",
"resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.8.4.tgz",
@@ -927,6 +970,11 @@
"node": ">=0.4.0"
}
},
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
"node_modules/aria-query": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
@@ -1026,6 +1074,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/dompurify": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.10.tgz",
+ "integrity": "sha512-0xzNv0e7oYC6yyuOGZIABPM4qtg3QxLFniDNPP4ZP90wR8Yq3zgwpRbrNiT4N3IKqDbbYFEJLV+JWEs19aZ//w==",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
+ },
"node_modules/emmet": {
"version": "2.4.11",
"resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz",
@@ -1043,6 +1099,17 @@
"@emmetio/css-abbreviation": "^2.1.8"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/esbuild": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
@@ -1132,6 +1199,14 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/highlight.js": {
+ "version": "11.11.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz",
+ "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/is-reference": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
@@ -1159,6 +1234,24 @@
"node": ">=6"
}
},
+ "node_modules/linkify-it": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz",
+ "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
"node_modules/locate-character": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
@@ -1183,6 +1276,48 @@
"@jridgewell/sourcemap-codec": "^1.5.5"
}
},
+ "node_modules/markdown-it": {
+ "version": "14.2.0",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz",
+ "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/puzrin"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/markdown-it"
+ }
+ ],
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.1",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it-task-lists": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz",
+ "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA=="
+ },
+ "node_modules/marked": {
+ "version": "18.0.5",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-18.0.5.tgz",
+ "integrity": "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.30",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
@@ -1190,6 +1325,11 @@
"dev": true,
"license": "CC0-1.0"
},
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="
+ },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1291,6 +1431,14 @@
"svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
}
},
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -1521,6 +1669,11 @@
"node": ">=20"
}
},
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="
+ },
"node_modules/vite": {
"version": "5.4.21",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index cba09d7..de708a4 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,5 +16,14 @@
"typescript": "^6.0.3",
"typescript-language-server": "^5.3.0",
"vite": "^5.4.21"
+ },
+ "dependencies": {
+ "@types/dompurify": "^3.2.0",
+ "@types/markdown-it": "^14.1.2",
+ "dompurify": "^3.4.10",
+ "highlight.js": "^11.11.1",
+ "markdown-it": "^14.2.0",
+ "markdown-it-task-lists": "^2.1.1",
+ "marked": "^18.0.5"
}
}
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index d8ea29c..c3e31a3 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -16,6 +16,7 @@
import { actionIcon } from './lib/actionIcons.js'
import { canPreviewFile, needsBase64Preview, needsTextPreview } from './lib/fileUtils.js'
import { t } from './lib/i18n'
+ import NoteEditorPanel from './lib/components/notes/NoteEditorPanel.svelte'
// ===== Wails v2 API call helper =====
function wailsCall(method, ...args) {
@@ -76,6 +77,20 @@
let activeTab = 'overview'
let notes = []
let noteEditor = null
+ let noteViewMode = 'edit'
+ let showLinkModal = false
+ let linkModalLabel = ''
+ let linkModalUrl = ''
+ // Simple internal link modal state (replaces broken ObjectPickerModal)
+ let showInternalLinkModal = false
+ let internalLinkLabel = ''
+ let internalLinkUrl = 'verstak://secret/sec_example'
+ let showVerstakToast = false
+ let verstakToastMessage = ''
+ // Note rename state
+ let renamingNoteId = null
+ let renamingNoteTitle = ''
+ let renamingNoteOriginalTitle = ''
let files = []
let actions = []
let worklog = []
@@ -1271,6 +1286,28 @@
}
}
+ function deleteNote(note) {
+ openConfirm({
+ title: t('common.delete'),
+ message: t('note.deleteConfirm', { title: note.title }) || `Удалить заметку «${note.title}»?`,
+ confirmText: t('common.delete'),
+ danger: true,
+ onConfirm: async () => {
+ try {
+ await wailsCall('DeleteNote', note.id)
+ notes = notes.filter(n => n.id !== note.id)
+ if (noteEditor && noteEditor.id === note.id) {
+ noteEditor = null
+ }
+ // Refresh trash count
+ try { await refreshTrashCount() } catch {}
+ } catch (e) {
+ error = String(e)
+ }
+ }
+ })
+ }
+
function closeNoteEditor() {
if (noteEditor && noteEditor.dirty) {
openConfirm({
@@ -1278,11 +1315,12 @@
message: t('note.unsavedMessage'),
confirmText: t('note.unsavedClose'),
danger: false,
- onConfirm: () => { noteEditor = null }
+ onConfirm: () => { noteEditor = null; noteViewMode = 'edit' }
})
return
}
noteEditor = null
+ noteViewMode = 'edit'
}
function updateNoteContent(e) {
@@ -1300,6 +1338,158 @@
}
}
+ // ===== Link modal =====
+ function openLinkModal() {
+ linkModalLabel = ''
+ linkModalUrl = ''
+ showLinkModal = true
+ }
+
+ function submitLinkModal() {
+ if (!noteEditor) { showLinkModal = false; return }
+ const label = linkModalLabel.trim() || linkModalUrl.trim() || 'link'
+ const url = linkModalUrl.trim() || '#'
+ const md = `[${label}](${url})`
+ noteEditor.content = noteEditor.content + (noteEditor.content.endsWith('\n') ? '' : '\n') + md + '\n'
+ noteEditor.dirty = true
+ showLinkModal = false
+ }
+
+ // ===== Simple internal link modal =====
+ function openInternalLinkModal() {
+ internalLinkLabel = ''
+ internalLinkUrl = 'verstak://secret/sec_example'
+ showInternalLinkModal = true
+ }
+
+ function submitInternalLink() {
+ insertInternalLinkMarkdown()
+ }
+
+ function cancelInternalLink() {
+ showInternalLinkModal = false
+ internalLinkLabel = ''
+ internalLinkUrl = 'verstak://secret/sec_example'
+ }
+
+ // ===== Note rename =====
+ function startRenameNote(noteId, currentTitle) {
+ renamingNoteId = noteId
+ renamingNoteTitle = currentTitle
+ renamingNoteOriginalTitle = currentTitle
+ }
+
+ function cancelRenameNote() {
+ renamingNoteId = null
+ renamingNoteTitle = ''
+ renamingNoteOriginalTitle = ''
+ }
+
+ async function submitRenameNote() {
+ if (!renamingNoteId || !renamingNoteTitle.trim()) {
+ cancelRenameNote()
+ return
+ }
+ if (renamingNoteTitle.trim() === renamingNoteOriginalTitle) {
+ cancelRenameNote()
+ return
+ }
+ try {
+ await wailsCall('RenameNote', renamingNoteId, renamingNoteTitle.trim())
+ // Update note list
+ notes = notes.map(n => n.id === renamingNoteId ? { ...n, title: renamingNoteTitle.trim() } : n)
+ // Update editor header if this note is open
+ if (noteEditor && noteEditor.id === renamingNoteId) {
+ noteEditor.title = renamingNoteTitle.trim()
+ }
+ cancelRenameNote()
+ } catch (e) {
+ // Show error
+ error = String(e)
+ cancelRenameNote()
+ }
+ }
+
+ // ===== Internal link modal (ObjectPicker) — legacy, kept for compat =====
+ // Replaced by simple openInternalLinkModal above.
+
+ // ===== Verstak link handler =====
+ function handleVerstakLink(e) {
+ const { type, id } = e.detail
+ let msg = ''
+ switch (type) {
+ case 'secret':
+ msg = t('note.internal.secretNotImplemented')
+ break
+ case 'case':
+ msg = t('note.internal.caseNotImplemented')
+ break
+ case 'note':
+ msg = t('note.internal.noteNotImplemented')
+ break
+ case 'file':
+ msg = t('note.internal.fileNotImplemented')
+ break
+ default:
+ msg = `verstak://${type}/${id}`
+ }
+ showVerstakToastMessage(msg)
+ }
+
+ function showVerstakToastMessage(msg) {
+ verstakToastMessage = msg
+ showVerstakToast = true
+ setTimeout(() => { showVerstakToast = false }, 3000)
+ }
+
+ // ===== Note editor panel events =====
+ function handleNoteContentChange(e) {
+ if (noteEditor) {
+ noteEditor.content = e.detail.content
+ noteEditor.dirty = true
+ }
+ }
+
+ function handleNoteModeChange(e) {
+ noteViewMode = e.detail.mode
+ }
+
+ function handleNoteInsertLink() {
+ openLinkModal()
+ }
+
+ function handleNoteInsertInternalLink() {
+ openInternalLinkModal()
+ }
+
+ // Insert markdown link at cursor position in the editor textarea.
+ function insertInternalLinkMarkdown() {
+ if (!noteEditor) { showInternalLinkModal = false; return }
+ const label = internalLinkLabel.trim() || internalLinkUrl
+ const href = internalLinkUrl.trim() || 'verstak://secret/sec_example'
+ const md = `[${label}](${href})`
+ // Try to insert at cursor via the hidden textarea used by MarkdownEditor.
+ // If textarea not available, append to content.
+ const ta = document.querySelector('.md-textarea')
+ if (ta) {
+ const start = ta.selectionStart
+ const end = ta.selectionEnd
+ const before = noteEditor.content.substring(0, start)
+ const after = noteEditor.content.substring(end)
+ noteEditor.content = before + md + after
+ noteEditor.dirty = true
+ // Restore cursor after inserted text
+ requestAnimationFrame(() => {
+ ta.focus()
+ ta.selectionStart = ta.selectionEnd = start + md.length
+ })
+ } else {
+ noteEditor.content = noteEditor.content + (noteEditor.content.endsWith('\n') ? '' : '\n') + md + '\n'
+ noteEditor.dirty = true
+ }
+ showInternalLinkModal = false
+ }
+
// ===== Worklog =====
function openWorklogModal(entry = null) {
editingWorklogEntry = entry
@@ -2702,18 +2892,43 @@
{/if}
{#if noteEditor}
-
-