folderview 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,57 +1,57 @@
1
- import{a as Gt}from"./chunks/chunk-FTY6WLQF.js";import"./chunks/chunk-7FMWBHZO.js";var w=t=>document.getElementById(t),h=t=>String(t).replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),oe=t=>{let e=lt(t),n=e.lastIndexOf(".");return n>0?e.slice(n+1).toLowerCase():""},lt=t=>t.slice(t.lastIndexOf("/")+1),ie=t=>t.includes("/")?t.slice(0,t.lastIndexOf("/")):"",z=(...t)=>t.filter(Boolean).join("/"),as=t=>t.split("/").map(encodeURIComponent).join("/"),V=t=>"raw/"+as(t);function ct(t){let e=[];for(let n of t.split("/"))n===".."?e.pop():n&&n!=="."&&e.push(n);return e.join("/")}var Me=t=>t<1024?t+" B":t<1048576?(t/1024).toFixed(t<10240?1:0)+" KB":t<1073741824?(t/1048576).toFixed(1)+" MB":(t/1073741824).toFixed(2)+" GB",J=t=>{let e=(Date.now()-t)/1e3;return e<60?"just now":e<3600?Math.floor(e/60)+" min ago":e<86400?Math.floor(e/3600)+" h ago":e<86400*30?Math.floor(e/86400)+" d ago":new Date(t).toLocaleDateString()},Xt=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function I(t,e){try{if(e===void 0)return localStorage.getItem("folderview:"+t);e===null?localStorage.removeItem("folderview:"+t):localStorage.setItem("folderview:"+t,e)}catch{return null}}async function R(t,e={}){let n={...e,headers:{...e.headers||{}}};e.json!==void 0&&(n.body=JSON.stringify(e.json),n.headers["content-type"]="application/json",delete n.json);let s=await fetch(t,n),a=(s.headers.get("content-type")||"").includes("json")?await s.json():await s.text();if(!s.ok)throw new Error(a&&a.error||typeof a=="string"&&a||s.statusText);return a}async function D(t,e="Copied"){try{await navigator.clipboard.writeText(t)}catch{let n=document.createElement("textarea");n.value=t,document.body.append(n),n.select(),document.execCommand("copy"),n.remove()}ke(e)}var Qt;function ke(t){let e=w("toast");e||(e=document.createElement("div"),e.id="toast",e.className="toast",e.setAttribute("role","status"),document.body.append(e)),e.textContent=t,e.classList.add("show"),clearTimeout(Qt),Qt=setTimeout(()=>e.classList.remove("show"),1800)}function Jt(t,e){let n;return(...s)=>{clearTimeout(n),n=setTimeout(()=>t(...s),e)}}var it=new Map,pt=(t,e)=>(it.get(t)||it.set(t,new Set).get(t)).add(e),K=(t,e)=>it.get(t)?.forEach(n=>n(e));var x={info:{name:"",git:!1,author:"",readOnly:!1,review:{json:"",md:""}},cache:new Map,git:null,changes:new Map,folderStates:new Map,ignored:[],comments:[],settings:{theme:I("theme")||"auto",ignored:I("ignored")||"dim",wrap:I("wrap")==="1",review:I("review")==="1",resolved:I("resolved")!=="0",author:I("author")||""}};function be(t,e){x.settings[t]=e,I(t,typeof e=="boolean"?e?"1":"0":e)}var De=()=>x.settings.author||x.info.author||"reviewer",en=["open","view","m","q","scope","line","tab","opts","inc"];function M(){let t=location.hash.slice(1)||"/",e=t.indexOf("?"),n=decodeURIComponent(e<0?t:t.slice(0,e)),s=new URLSearchParams(e<0?"":t.slice(e+1)),r={folder:n.replace(/^\/+|\/+$/g,"")};for(let a of en)r[a]=s.get(a)||"";return r}function le(t){let e=new URLSearchParams;for(let s of en)t[s]&&e.set(s,t[s]);let n=e.toString();return"#/"+(t.folder||"").split("/").map(encodeURIComponent).join("/")+(n?"?"+n:"")}function H(t){location.hash=le({view:M().view,...t})}function q(t,e=!1){let n=le({...M(),...t});e?history.replaceState(null,"",n):location.hash=n}var P=(t,e={})=>le({folder:ie(t),open:t.slice(t.lastIndexOf("/")+1),...e}),os=t=>[...t].sort((e,n)=>(n.type==="folder")-(e.type==="folder")||Xt.compare(e.name,n.name));async function Fe(t){if(x.cache.has(t))return x.cache.get(t);let e=await R("api/list?p="+encodeURIComponent(t)),n=os(e.entries);return x.cache.set(t,n),n}var Yt={conflict:6,deleted:5,modified:4,renamed:3,added:2,new:1};async function dt(){if(x.info.git)try{let t=await R("api/git/status");x.git=t,x.changes=new Map(t.changes.map(n=>[n.path,n])),x.ignored=t.ignored;let e=new Map;for(let n of t.changes){let s=ie(n.path);for(;;){let r=e.get(s);if((!r||Yt[n.state]>Yt[r])&&e.set(s,n.state),!s)break;s=ie(s)}}x.folderStates=e}catch{x.git=null}}function Y(t){for(let e of x.ignored)if(e.endsWith("/")?t===e.slice(0,-1)||t.startsWith(e):t===e)return!0;return!1}var We={new:"U",added:"A",modified:"M",deleted:"D",renamed:"R",conflict:"!"},G={new:"New (untracked)",added:"Added",modified:"Changed",deleted:"Deleted",renamed:"Renamed",conflict:"Conflict",ignored:"Ignored"};async function Ae(){try{x.comments=(await R("api/comments")).comments}catch{x.comments=[]}}var ce=t=>x.comments.filter(e=>e.path===t);function Ue(t){let e=t?t+"/":"";return x.comments.filter(n=>n.status==="open"&&(n.path===t||n.path.startsWith(e))).length}function mt(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ue=mt();function hn(t){ue=t}var de={exec:()=>null};function pe(t){let e=[];return n=>{let s=Math.max(0,Math.min(3,n-1)),r=e[s];return r||(r=t(s),e[s]=r),r}}function S(t,e=""){let n=typeof t=="string"?t:t.source,s={replace:(r,a)=>{let o=typeof a=="string"?a:a.source;return o=o.replace(j.caret,"$1"),n=n.replace(r,o),s},getRegex:()=>new RegExp(n,e)};return s}var un=((t="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+t)}catch{return!1}})(),j={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,listInterruptsParagraph:/^ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+)[ \t]*)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,blockquoteMarkerWhitespace:/^( {0,3}>)([ \t]+)/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\][ \t]+\S/,listReplaceTask:/^\[[ xX]\][ \t]+/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,numericCharacterReferenceOrAmpersand:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:pe(t=>new RegExp(`^ {0,${t}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:pe(t=>new RegExp(`^ {0,${t}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:pe(t=>new RegExp(`^ {0,${t}}(?:\`\`\`|~~~)`)),headingBeginRegex:pe(t=>new RegExp(`^ {0,${t}}#{1,6}(?:\\s|$)`)),pedanticHeadingBeginRegex:pe(t=>new RegExp(`^ {0,${t}}#`)),htmlBeginRegex:pe(t=>new RegExp(`^ {0,${t}}(?:</?(?:${qe})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)`,"i")),blockquoteBeginRegex:pe(t=>new RegExp(`^ {0,${t}}>`)),nestedContainerMarkers:/^(?: {0,3}(?:(?:[*+-]|\d{1,9}[.)])[ \t]+|>[ \t]?))+/},is=/^(?:[ \t]*(?:\n|$))+/,ls=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,cs=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}(?:(?=`)\1`*|(?=~)\1~*) *(?=\n|$)|$)/,Ce=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,ps=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,gt=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,fn=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+)[ \t]*(?:\n+|$)/,mn=S(fn).replace(/bull/g,gt).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),ds=S(fn).replace(/bull/g,gt).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),kt=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,hs=/^[^\n]+/,bt=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\\n]|\n(?![ \t]*\n))+/,us=S(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",bt).replace("title",/(?:"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\\n]|\n(?!\n))*'|\((?:\\[\s\S]|[^()\\])*\))/).getRegex(),fs=S(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,gt).getRegex(),qe="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",wt=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,ms=S("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?:[ \\t]+|\\n|/?>|$)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",wt).replace("tag",qe).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),gn=t=>S(kt).replace("hr",Ce).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list",t).replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qe).getRegex(),gs=gn(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),ks=gn(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),bs=S(/^( {0,3}> ?(?:(?![ \t]*(?:\n|$))(paragraph)|[^\n]*)(?:\n|$))+/).replace("paragraph",ks).getRegex(),xt={blockquote:bs,code:ls,def:us,fences:cs,heading:ps,hr:Ce,html:ms,lheading:mn,list:fs,newline:is,paragraph:gs,table:de,text:hs},tn=S("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Ce).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qe).getRegex(),ws={...xt,lheading:ds,table:tn,paragraph:S(kt).replace("hr",Ce).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",tn).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qe).getRegex()},xs={...xt,html:S(`^ *(?:comment(?: *\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1>(?: *\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?>(?: *\\n{2,}|\\s*$))`).replace("comment",wt).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:de,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:S(kt).replace("hr",Ce).replace("heading",` *#{1,6} *[^
2
- ]`).replace("lheading",mn).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},$s=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ys=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,kn=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,vs=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,U=/[\p{P}\p{S}]/u,$e=/[\s\p{P}\p{S}]/u,je=/[^\s\p{P}\p{S}]/u,Ss=S(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,$e).getRegex(),Ls=/[\p{Pi}\p{Ps}"']/u,bn=/(?!~)[\p{P}\p{S}]/u,Ts=/(?!~)[\s\p{P}\p{S}]/u,Ms=/(?:[^\s\p{P}\p{S}]|~)/u,As=S(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",un?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),wn=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Rs=S(wn,"u").replace(/punct/g,U).getRegex(),Es=S(wn,"u").replace(/punct/g,bn).getRegex(),Cs=/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,qs=S(Cs,"u").replace(/openQuote/g,Ls).replace(/punct/g,U).getRegex(),xn="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",js=S(xn,"gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,$e).replace(/punct/g,U).getRegex(),Is=S(xn,"gu").replace(/notPunctSpace/g,Ms).replace(/punctSpace/g,Ts).replace(/punct/g,bn).getRegex(),zs="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)",_s=S(zs,"gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,$e).replace(/punct/g,U).getRegex(),Hs=S("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,$e).replace(/punct/g,U).getRegex(),Ps="^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)",Os=S(Ps,"gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,$e).replace(/punct/g,U).getRegex(),Ns=S(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,U).getRegex(),Bs="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Ds=S(Bs,"gu").replace(/notPunctSpace/g,je).replace(/punctSpace/g,$e).replace(/punct/g,U).getRegex(),Fs=S(/\\(punct)/,"gu").replace(/punct/g,U).getRegex(),Ws=S(/(`+)(?:[^`]|[^`][\s\S]*?[^`])\1(?!`)|`+|\\(punct)/,"gu").replace(/punct/g,U).getRegex(),Us=S(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Zs=S(wt).replace("(?:-->|$)","-->").getRegex(),Vs=S("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Zs).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),$n=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,Ke=S(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets",$n).getRegex(),Ks=S(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace("label",Ke).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|\((?:\\[\s\S]|[^)\\])*\)/).getRegex(),Gs=S(/^!?\[(label)\]\[(ref)\]/).replace("label",Ke).replace("ref",bt).getRegex(),Qs=S(/^!?\[(ref)\](?:\[\])?/).replace("ref",bt).getRegex(),nn=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,Xs=S(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace("brackets",$n).getRegex(),Js=S("reflink|nolink(?!\\()","g").replace("reflink",S(/^!?\[(label)\]\[(ref)\]/).replace("label",Xs).replace("ref",nn).getRegex()).replace("nolink",S(/^!?\[(ref)\](?:\[\])?/).replace("ref",nn).getRegex()).getRegex(),sn=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Ys=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/,er=S(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,Ys).getRegex(),$t={_backpedal:de,anyPunctuation:Fs,anyPunctuationOutsideCode:Ws,autolink:Us,blockSkip:As,br:kn,code:ys,del:de,delLDelim:de,delRDelim:de,emStrongLDelim:Rs,emStrongRDelimAst:js,emStrongRDelimUnd:Hs,escape:$s,link:Ks,nolink:Qs,punctuation:Ss,reflink:Gs,reflinkSearch:Js,tag:Vs,text:vs,url:de},tr={...$t,emStrongLDelim:qs,emStrongRDelimAst:_s,emStrongRDelimUnd:Os,link:S(/^!?\[(label)\]\((.*?)\)/).replace("label",Ke).getRegex(),reflink:S(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ke).getRegex()},ht={...$t,emStrongRDelimAst:Is,emStrongLDelim:Es,delLDelim:Ns,delRDelim:Ds,url:S(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("emailProtocol",er).replace("protocol",sn).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:S(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|wwwStart|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace("protocol",sn).replace(/emailProtocol/g,/(?:mailto|xmpp):/).replace("wwwStart",un?"(?<![^\\s*_~(])www\\.":"www\\.").getRegex()},nr={...ht,br:S(kn).replace("{2,}","*").getRegex(),text:S(ht.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},Ze={normal:xt,gfm:ws,pedantic:xs},Re={normal:$t,gfm:ht,breaks:nr,pedantic:tr},sr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},rn=t=>sr[t];function N(t,e){if(e){if(j.escapeTest.test(t))return t.replace(j.escapeReplace,rn)}else if(j.escapeTestNoEncode.test(t))return t.replace(j.escapeReplaceNoEncode,rn);return t}function rr(t){return j.numericCharacterReference.test(t)?t.replace(j.numericCharacterReferenceOrAmpersand,(e,n,s)=>{if(n===void 0&&s===void 0)return"&amp;";let r=n===void 0?Number.parseInt(s,16):Number.parseInt(n,10);return r===0||r>1114111||r>=55296&&r<=57343?"\uFFFD":r===38?"&amp;":String.fromCodePoint(r)}):t}function an(t){try{t=encodeURI(t).replace(j.percentDecode,"%")}catch{return null}return t}function on(t,e){let n=t.replace(j.findPipe,(a,o,i)=>{let l=!1,p=o;for(;--p>=0&&i[p]==="\\";)l=!l;return l?"|":" |"}),s=n.split(j.splitPipe),r=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;r<s.length;r++)s[r]=s[r].trim().replace(j.slashPipe,"|");return s}function Q(t,e,n){let s=t.length;if(s===0)return"";let r=0;for(;r<s;){let a=t.charAt(s-r-1);if(a===e&&!n)r++;else if(a!==e&&n)r++;else break}return t.slice(0,s-r)}function ln(t){let e=t.split(`
3
- `),n=e.length-1;for(;n>=0&&j.blankLine.test(e[n]);)n--;return e.length-n<=2?t:e.slice(0,n+1).join(`
4
- `)}function Ge(t){return t.trim().replace(j.multipleSpaceGlobal," ").toLowerCase().toUpperCase().toLowerCase()}function cn(t,e){if(t.indexOf(e[0])===-1&&t.indexOf(e[1])===-1)return-1;let n=0;for(let s=0;s<t.length;s++)if(t[s]==="\\")s++;else if(t[s]===e[0])n++;else if(t[s]===e[1]&&(n--,n<0))return s;return n>0?-2:-1}var xe=new WeakMap;function yt(t){let e={"*":-1,_:-1},n=-1,s=t.length;for(let r=0;r<s;r++){let a=t[r];if(a!=="*"&&a!=="_"&&a!=="~")continue;let o=r===0?`
1
+ import{a as fn}from"./chunks/chunk-FTY6WLQF.js";import"./chunks/chunk-7FMWBHZO.js";var $=t=>document.getElementById(t),h=t=>String(t).replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[e]),Q=t=>{let e=wt(t),n=e.lastIndexOf(".");return n>0?e.slice(n+1).toLowerCase():""},wt=t=>t.slice(t.lastIndexOf("/")+1),ue=t=>t.includes("/")?t.slice(0,t.lastIndexOf("/")):"",z=(...t)=>t.filter(Boolean).join("/"),_s=t=>t.split("/").map(encodeURIComponent).join("/"),W=t=>"raw/"+_s(t);function $t(t){let e=[];for(let n of t.split("/"))n===".."?e.pop():n&&n!=="."&&e.push(n);return e.join("/")}var je=t=>t<1024?t+" B":t<1048576?(t/1024).toFixed(t<10240?1:0)+" KB":t<1073741824?(t/1048576).toFixed(1)+" MB":(t/1073741824).toFixed(2)+" GB",Z=t=>{let e=(Date.now()-t)/1e3;return e<60?"just now":e<3600?Math.floor(e/60)+" min ago":e<86400?Math.floor(e/3600)+" h ago":e<86400*30?Math.floor(e/86400)+" d ago":new Date(t).toLocaleDateString()},gn=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function H(t,e){try{if(e===void 0)return localStorage.getItem("folderview:"+t);e===null?localStorage.removeItem("folderview:"+t):localStorage.setItem("folderview:"+t,e)}catch{return null}}async function M(t,e={}){let n={...e,headers:{...e.headers||{}}};e.json!==void 0&&(n.body=JSON.stringify(e.json),n.headers["content-type"]="application/json",delete n.json);let s=await fetch(t,n),a=(s.headers.get("content-type")||"").includes("json")?await s.json():await s.text();if(!s.ok)throw new Error(a&&a.error||typeof a=="string"&&a||s.statusText);return a}async function K(t,e="Copied"){try{await navigator.clipboard.writeText(t)}catch{let n=document.createElement("textarea");n.value=t,document.body.append(n),n.select(),document.execCommand("copy"),n.remove()}le(e)}var mn;function le(t){let e=$("toast");e||(e=document.createElement("div"),e.id="toast",e.className="toast",e.setAttribute("role","status"),document.body.append(e)),e.textContent=t,e.classList.add("show"),clearTimeout(mn),mn=setTimeout(()=>e.classList.remove("show"),1800)}function kn(t,e){let n;return(...s)=>{clearTimeout(n),n=setTimeout(()=>t(...s),e)}}var bt=new Map,Ie=(t,e)=>(bt.get(t)||bt.set(t,new Set).get(t)).add(e),ee=(t,e)=>bt.get(t)?.forEach(n=>n(e));var b={info:{name:"",git:!1,author:"",readOnly:!1,review:{json:"",md:""}},cache:new Map,git:null,changes:new Map,folderStates:new Map,ignored:[],comments:[],settings:{theme:H("theme")||"auto",ignored:H("ignored")||"dim",wrap:H("wrap")==="1",review:H("review")==="1",resolved:H("resolved")!=="0",author:H("author")||""}};function xe(t,e){b.settings[t]=e,H(t,typeof e=="boolean"?e?"1":"0":e)}var et=()=>b.settings.author||b.info.author||"reviewer",wn=["open","view","m","q","show","scope","line","tab","opts","inc"];function L(){let t=location.hash.slice(1)||"/",e=t.indexOf("?"),n=decodeURIComponent(e<0?t:t.slice(0,e)),s=new URLSearchParams(e<0?"":t.slice(e+1)),r={folder:n.replace(/^\/+|\/+$/g,"")};for(let a of wn)r[a]=s.get(a)||"";return r}function V(t){let e=new URLSearchParams;for(let s of wn)t[s]&&e.set(s,t[s]);let n=e.toString();return"#/"+(t.folder||"").split("/").map(encodeURIComponent).join("/")+(n?"?"+n:"")}function _(t){location.hash=V({view:L().view,...t})}function R(t,e=!1){let n=V({...L(),...t});e?history.replaceState(null,"",n):location.hash=n}var O=(t,e={})=>V({folder:ue(t),open:t.slice(t.lastIndexOf("/")+1),...e}),Os=t=>[...t].sort((e,n)=>(n.type==="folder")-(e.type==="folder")||gn.compare(e.name,n.name));async function ye(t){if(b.cache.has(t))return b.cache.get(t);let e=await M("api/list?p="+encodeURIComponent(t)),n=Os(e.entries);return b.cache.set(t,n),n}var bn={conflict:6,deleted:5,modified:4,renamed:3,added:2,new:1};async function xt(){if(b.info.git)try{let t=await M("api/git/status");b.git=t,b.changes=new Map(t.changes.map(n=>[n.path,n])),b.ignored=t.ignored;let e=new Map;for(let n of t.changes){let s=ue(n.path);for(;;){let r=e.get(s);if((!r||bn[n.state]>bn[r])&&e.set(s,n.state),!s)break;s=ue(s)}}b.folderStates=e}catch{b.git=null}}function te(t){for(let e of b.ignored)if(e.endsWith("/")?t===e.slice(0,-1)||t.startsWith(e):t===e)return!0;return!1}var tt={new:"U",added:"A",modified:"M",deleted:"D",renamed:"R",conflict:"!"},ne={new:"New (untracked)",added:"Added",modified:"Changed",deleted:"Deleted",renamed:"Renamed",conflict:"Conflict",ignored:"Ignored"};async function ze(){try{b.comments=(await M("api/comments")).comments}catch{b.comments=[]}}var F=t=>b.comments.filter(e=>e.path===t);function nt(t){let e=t?t+"/":"";return b.comments.filter(n=>n.status==="open"&&(n.path===t||n.path.startsWith(e))).length}function Tt(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ke=Tt();function qn(t){ke=t}var me={exec:()=>null};function fe(t){let e=[];return n=>{let s=Math.max(0,Math.min(3,n-1)),r=e[s];return r||(r=t(s),e[s]=r),r}}function T(t,e=""){let n=typeof t=="string"?t:t.source,s={replace:(r,a)=>{let o=typeof a=="string"?a:a.source;return o=o.replace(I.caret,"$1"),n=n.replace(r,o),s},getRegex:()=>new RegExp(n,e)};return s}var Rn=((t="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+t)}catch{return!1}})(),I={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,listInterruptsParagraph:/^ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+)[ \t]*)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,blockquoteMarkerWhitespace:/^( {0,3}>)([ \t]+)/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\][ \t]+\S/,listReplaceTask:/^\[[ xX]\][ \t]+/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,numericCharacterReferenceOrAmpersand:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:fe(t=>new RegExp(`^ {0,${t}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:fe(t=>new RegExp(`^ {0,${t}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:fe(t=>new RegExp(`^ {0,${t}}(?:\`\`\`|~~~)`)),headingBeginRegex:fe(t=>new RegExp(`^ {0,${t}}#{1,6}(?:\\s|$)`)),pedanticHeadingBeginRegex:fe(t=>new RegExp(`^ {0,${t}}#`)),htmlBeginRegex:fe(t=>new RegExp(`^ {0,${t}}(?:</?(?:${Pe})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)`,"i")),blockquoteBeginRegex:fe(t=>new RegExp(`^ {0,${t}}>`)),nestedContainerMarkers:/^(?: {0,3}(?:(?:[*+-]|\d{1,9}[.)])[ \t]+|>[ \t]?))+/},Ps=/^(?:[ \t]*(?:\n|$))+/,Ns=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Bs=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}(?:(?=`)\1`*|(?=~)\1~*) *(?=\n|$)|$)/,Oe=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Ds=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Lt=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,En=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+)[ \t]*(?:\n+|$)/,jn=T(En).replace(/bull/g,Lt).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Fs=T(En).replace(/bull/g,Lt).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Mt=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,Us=/^[^\n]+/,At=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\\n]|\n(?![ \t]*\n))+/,Ws=T(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",At).replace("title",/(?:"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\\n]|\n(?!\n))*'|\((?:\\[\s\S]|[^()\\])*\))/).getRegex(),Zs=T(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Lt).getRegex(),Pe="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ct=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Ks=T("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?:[ \\t]+|\\n|/?>|$)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",Ct).replace("tag",Pe).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),In=t=>T(Mt).replace("hr",Oe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list",t).replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",Pe).getRegex(),Vs=In(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),Gs=In(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),Xs=T(/^( {0,3}> ?(?:(?![ \t]*(?:\n|$))(paragraph)|[^\n]*)(?:\n|$))+/).replace("paragraph",Gs).getRegex(),qt={blockquote:Xs,code:Ns,def:Ws,fences:Bs,heading:Ds,hr:Oe,html:Ks,lheading:jn,list:Zs,newline:Ps,paragraph:Vs,table:me,text:Us},$n=T("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Oe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",Pe).getRegex(),Qs={...qt,lheading:Fs,table:$n,paragraph:T(Mt).replace("hr",Oe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",$n).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",Pe).getRegex()},Js={...qt,html:T(`^ *(?:comment(?: *\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1>(?: *\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?>(?: *\\n{2,}|\\s*$))`).replace("comment",Ct).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:me,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:T(Mt).replace("hr",Oe).replace("heading",` *#{1,6} *[^
2
+ ]`).replace("lheading",jn).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Ys=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,er=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,zn=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,tr=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,J=/[\p{P}\p{S}]/u,Te=/[\s\p{P}\p{S}]/u,Ne=/[^\s\p{P}\p{S}]/u,nr=T(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Te).getRegex(),sr=/[\p{Pi}\p{Ps}"']/u,Hn=/(?!~)[\p{P}\p{S}]/u,rr=/(?!~)[\s\p{P}\p{S}]/u,ar=/(?:[^\s\p{P}\p{S}]|~)/u,or=T(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Rn?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),_n=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,ir=T(_n,"u").replace(/punct/g,J).getRegex(),lr=T(_n,"u").replace(/punct/g,Hn).getRegex(),cr=/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,dr=T(cr,"u").replace(/openQuote/g,sr).replace(/punct/g,J).getRegex(),On="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",pr=T(On,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Te).replace(/punct/g,J).getRegex(),hr=T(On,"gu").replace(/notPunctSpace/g,ar).replace(/punctSpace/g,rr).replace(/punct/g,Hn).getRegex(),ur="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)",fr=T(ur,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Te).replace(/punct/g,J).getRegex(),mr=T("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Te).replace(/punct/g,J).getRegex(),gr="^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)",kr=T(gr,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Te).replace(/punct/g,J).getRegex(),br=T(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,J).getRegex(),wr="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",$r=T(wr,"gu").replace(/notPunctSpace/g,Ne).replace(/punctSpace/g,Te).replace(/punct/g,J).getRegex(),xr=T(/\\(punct)/,"gu").replace(/punct/g,J).getRegex(),yr=T(/(`+)(?:[^`]|[^`][\s\S]*?[^`])\1(?!`)|`+|\\(punct)/,"gu").replace(/punct/g,J).getRegex(),vr=T(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Sr=T(Ct).replace("(?:-->|$)","-->").getRegex(),Tr=T("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Sr).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Pn=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,at=T(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets",Pn).getRegex(),Lr=T(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace("label",at).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|\((?:\\[\s\S]|[^)\\])*\)/).getRegex(),Mr=T(/^!?\[(label)\]\[(ref)\]/).replace("label",at).replace("ref",At).getRegex(),Ar=T(/^!?\[(ref)\](?:\[\])?/).replace("ref",At).getRegex(),xn=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,Cr=T(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace("brackets",Pn).getRegex(),qr=T("reflink|nolink(?!\\()","g").replace("reflink",T(/^!?\[(label)\]\[(ref)\]/).replace("label",Cr).replace("ref",xn).getRegex()).replace("nolink",T(/^!?\[(ref)\](?:\[\])?/).replace("ref",xn).getRegex()).getRegex(),yn=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Rr=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/,Er=T(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,Rr).getRegex(),Rt={_backpedal:me,anyPunctuation:xr,anyPunctuationOutsideCode:yr,autolink:vr,blockSkip:or,br:zn,code:er,del:me,delLDelim:me,delRDelim:me,emStrongLDelim:ir,emStrongRDelimAst:pr,emStrongRDelimUnd:mr,escape:Ys,link:Lr,nolink:Ar,punctuation:nr,reflink:Mr,reflinkSearch:qr,tag:Tr,text:tr,url:me},jr={...Rt,emStrongLDelim:dr,emStrongRDelimAst:fr,emStrongRDelimUnd:kr,link:T(/^!?\[(label)\]\((.*?)\)/).replace("label",at).getRegex(),reflink:T(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",at).getRegex()},yt={...Rt,emStrongRDelimAst:hr,emStrongLDelim:lr,delLDelim:br,delRDelim:$r,url:T(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("emailProtocol",Er).replace("protocol",yn).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:T(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|wwwStart|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace("protocol",yn).replace(/emailProtocol/g,/(?:mailto|xmpp):/).replace("wwwStart",Rn?"(?<![^\\s*_~(])www\\.":"www\\.").getRegex()},Ir={...yt,br:T(zn).replace("{2,}","*").getRegex(),text:T(yt.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},st={normal:qt,gfm:Qs,pedantic:Js},He={normal:Rt,gfm:yt,breaks:Ir,pedantic:jr},zr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},vn=t=>zr[t];function B(t,e){if(e){if(I.escapeTest.test(t))return t.replace(I.escapeReplace,vn)}else if(I.escapeTestNoEncode.test(t))return t.replace(I.escapeReplaceNoEncode,vn);return t}function Hr(t){return I.numericCharacterReference.test(t)?t.replace(I.numericCharacterReferenceOrAmpersand,(e,n,s)=>{if(n===void 0&&s===void 0)return"&amp;";let r=n===void 0?Number.parseInt(s,16):Number.parseInt(n,10);return r===0||r>1114111||r>=55296&&r<=57343?"\uFFFD":r===38?"&amp;":String.fromCodePoint(r)}):t}function Sn(t){try{t=encodeURI(t).replace(I.percentDecode,"%")}catch{return null}return t}function Tn(t,e){let n=t.replace(I.findPipe,(a,o,i)=>{let l=!1,c=o;for(;--c>=0&&i[c]==="\\";)l=!l;return l?"|":" |"}),s=n.split(I.splitPipe),r=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),e)if(s.length>e)s.splice(e);else for(;s.length<e;)s.push("");for(;r<s.length;r++)s[r]=s[r].trim().replace(I.slashPipe,"|");return s}function se(t,e,n){let s=t.length;if(s===0)return"";let r=0;for(;r<s;){let a=t.charAt(s-r-1);if(a===e&&!n)r++;else if(a!==e&&n)r++;else break}return t.slice(0,s-r)}function Ln(t){let e=t.split(`
3
+ `),n=e.length-1;for(;n>=0&&I.blankLine.test(e[n]);)n--;return e.length-n<=2?t:e.slice(0,n+1).join(`
4
+ `)}function ot(t){return t.trim().replace(I.multipleSpaceGlobal," ").toLowerCase().toUpperCase().toLowerCase()}function Mn(t,e){if(t.indexOf(e[0])===-1&&t.indexOf(e[1])===-1)return-1;let n=0;for(let s=0;s<t.length;s++)if(t[s]==="\\")s++;else if(t[s]===e[0])n++;else if(t[s]===e[1]&&(n--,n<0))return s;return n>0?-2:-1}var Se=new WeakMap;function Et(t){let e={"*":-1,_:-1},n=-1,s=t.length;for(let r=0;r<s;r++){let a=t[r];if(a!=="*"&&a!=="_"&&a!=="~")continue;let o=r===0?`
5
5
  `:t[r-1],i=r+1;for(;i<s&&t[i]===a;)i++;o!==" "&&o!==" "&&o!==`
6
- `&&o!=="\r"&&o!=="\f"&&(a==="~"?n=r:e[a]=r),r=i-1}return{maskedSrc:t,lastPossibleEmStrongCloserIndex:e,lastPossibleDelCloserIndex:n}}function ar(t,e){let n=yt(e),s=xe.get(t);s?s.push(n):xe.set(t,[n])}function or(t){let e=xe.get(t);e&&(e.pop(),e.length===0&&xe.delete(t))}function ir(t,e,n){let s=xe.get(t)?.at(-1);return s&&s.maskedSrc===e?s.lastPossibleEmStrongCloserIndex[n]:yt(e).lastPossibleEmStrongCloserIndex[n]}function lr(t,e){let n=xe.get(t)?.at(-1);return n&&n.maskedSrc===e?n.lastPossibleDelCloserIndex:yt(e).lastPossibleDelCloserIndex}function Ve(t,e=0){let n=e,s="";for(let r of t)if(r===" "){let a=4-n%4;s+=" ".repeat(a),n+=a}else s+=r,n++;return s}function pn(t,e,n,s,r){let a=e.href,o=e.title||null,i=t[1].replace(r.other.outputLinkReplace,"$1"),l=t[0].charAt(0)==="!",p=s.state.inLink,c=s.state.linkEmitted,d=s.state.inRawBlock;s.state.inLink=!0,s.state.linkEmitted=!1;let u=s.inlineTokens(i),k=s.state.linkEmitted;if(s.state.linkEmitted=c,s.state.inLink=p,!l){if(k){s.state.inRawBlock=d;return}s.state.linkEmitted=!0}return{type:l?"image":"link",raw:n,href:a,title:o,text:i,tokens:u}}function cr(t,e,n){let s=t.match(n.other.indentCodeCompensation);if(s===null)return e;let r=s[1];return e.split(`
6
+ `&&o!=="\r"&&o!=="\f"&&(a==="~"?n=r:e[a]=r),r=i-1}return{maskedSrc:t,lastPossibleEmStrongCloserIndex:e,lastPossibleDelCloserIndex:n}}function _r(t,e){let n=Et(e),s=Se.get(t);s?s.push(n):Se.set(t,[n])}function Or(t){let e=Se.get(t);e&&(e.pop(),e.length===0&&Se.delete(t))}function Pr(t,e,n){let s=Se.get(t)?.at(-1);return s&&s.maskedSrc===e?s.lastPossibleEmStrongCloserIndex[n]:Et(e).lastPossibleEmStrongCloserIndex[n]}function Nr(t,e){let n=Se.get(t)?.at(-1);return n&&n.maskedSrc===e?n.lastPossibleDelCloserIndex:Et(e).lastPossibleDelCloserIndex}function rt(t,e=0){let n=e,s="";for(let r of t)if(r===" "){let a=4-n%4;s+=" ".repeat(a),n+=a}else s+=r,n++;return s}function An(t,e,n,s,r){let a=e.href,o=e.title||null,i=t[1].replace(r.other.outputLinkReplace,"$1"),l=t[0].charAt(0)==="!",c=s.state.inLink,d=s.state.linkEmitted,p=s.state.inRawBlock;s.state.inLink=!0,s.state.linkEmitted=!1;let u=s.inlineTokens(i),f=s.state.linkEmitted;if(s.state.linkEmitted=d,s.state.inLink=c,!l){if(f){s.state.inRawBlock=p;return}s.state.linkEmitted=!0}return{type:l?"image":"link",raw:n,href:a,title:o,text:i,tokens:u}}function Br(t,e,n){let s=t.match(n.other.indentCodeCompensation);if(s===null)return e;let r=s[1];return e.split(`
7
7
  `).map(a=>{let o=a.match(n.other.beginningSpace);if(o===null)return a;let[i]=o;return a.slice(Math.min(i.length,r.length))}).join(`
8
- `)}function dn(t,e,n,s){if(!e.includes("<"))return!1;for(let r=0;r<e.length;r++){if(e[r]==="\\"){r++;continue}if(e[r]==="`"){let i=s.inline.code.exec(e.slice(r));if(i){r+=i[0].length-1;continue}}if(e[r]!=="<")continue;let a=t.slice(n+r),o=s.inline.tag.exec(a)||s.inline.autolink.exec(a);if(o){if(o[0].length>e.length-r)return!0;r+=o[0].length-1}}return!1}var we=class{options;rules;lexer;constructor(t){this.options=t||ue}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let n=this.options.pedantic?e[0]:ln(e[0]),s=n.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:n,codeBlockStyle:"indented",text:s}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let n=e[0],s=cr(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let s=Q(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:"heading",raw:Q(e[0],`
9
- `),depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:Q(e[0],`
10
- `)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let n=Q(e[0],`
8
+ `)}function Cn(t,e,n,s){if(!e.includes("<"))return!1;for(let r=0;r<e.length;r++){if(e[r]==="\\"){r++;continue}if(e[r]==="`"){let i=s.inline.code.exec(e.slice(r));if(i){r+=i[0].length-1;continue}}if(e[r]!=="<")continue;let a=t.slice(n+r),o=s.inline.tag.exec(a)||s.inline.autolink.exec(a);if(o){if(o[0].length>e.length-r)return!0;r+=o[0].length-1}}return!1}var ve=class{options;rules;lexer;constructor(t){this.options=t||ke}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let n=this.options.pedantic?e[0]:Ln(e[0]),s=n.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:n,codeBlockStyle:"indented",text:s}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let n=e[0],s=Br(n,e[3]||"",this.rules);return{type:"code",raw:n,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:s}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let n=e[2].trim();if(this.rules.other.endingHash.test(n)){let s=se(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:"heading",raw:se(e[0],`
9
+ `),depth:e[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:se(e[0],`
10
+ `)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let n=se(e[0],`
11
11
  `).split(`
12
- `),s="",r="",a=[];for(;n.length>0;){let o=!1,i=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))i.push(n[l]),o=!0;else if(!o)i.push(n[l]);else break;n=n.slice(l);let p=i.join(`
13
- `),c=p.replace(this.rules.other.blockquoteMarkerWhitespace,(k,g,f)=>g+Ve(f,g.length)).replace(this.rules.other.blockquoteSetextReplace,`
12
+ `),s="",r="",a=[];for(;n.length>0;){let o=!1,i=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))i.push(n[l]),o=!0;else if(!o)i.push(n[l]);else break;n=n.slice(l);let c=i.join(`
13
+ `),d=c.replace(this.rules.other.blockquoteMarkerWhitespace,(f,g,m)=>g+rt(m,g.length)).replace(this.rules.other.blockquoteSetextReplace,`
14
14
  $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
15
- ${p}`:p,r=r?`${r}
16
- ${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,a,!0),this.lexer.state.top=d,n.length===0)break;let u=a.at(-1);if(u?.type==="code"||u?.type==="heading"||u?.type==="hr"||u?.type==="html"||u?.type==="table")break;if(u?.type==="blockquote"){let k=u,g=n.join(`
17
- `),f=k.raw+`
18
- `+g.replace(this.rules.other.blockquoteSetextReplace2,""),b=this.blockquote(f);a[a.length-1]=b;let v=f.substring(b.raw.length).replace(/^\n/,""),y=v?v.split(`
19
- `).length:0,m=y?n.slice(0,-y):n;if(m.length>0&&(s=`${s}
20
- ${m.join(`
21
- `)}`),r=r.substring(0,r.length-k.text.length)+b.text,n=n.slice(m.length),n.length>0&&this.rules.other.blockquoteStart.test(n[0]))continue;break}else if(u?.type==="list"){let k=u,g=k.raw+`
15
+ ${c}`:c,r=r?`${r}
16
+ ${d}`:d;let p=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(d,a,!0),this.lexer.state.top=p,n.length===0)break;let u=a.at(-1);if(u?.type==="code"||u?.type==="heading"||u?.type==="hr"||u?.type==="html"||u?.type==="table")break;if(u?.type==="blockquote"){let f=u,g=n.join(`
17
+ `),m=f.raw+`
18
+ `+g.replace(this.rules.other.blockquoteSetextReplace2,""),w=this.blockquote(m);a[a.length-1]=w;let v=m.substring(w.raw.length).replace(/^\n/,""),y=v?v.split(`
19
+ `).length:0,k=y?n.slice(0,-y):n;if(k.length>0&&(s=`${s}
20
+ ${k.join(`
21
+ `)}`),r=r.substring(0,r.length-f.text.length)+w.text,n=n.slice(k.length),n.length>0&&this.rules.other.blockquoteStart.test(n[0]))continue;break}else if(u?.type==="list"){let f=u,g=f.raw+`
22
22
  `+n.join(`
23
- `),f=this.list(g);a[a.length-1]=f;let b=f.raw.length>k.raw.length?g.slice(k.raw.length+1,f.raw.length).split(`
24
- `).length:0;if(b>0){let v=n.slice(0,b).join(`
23
+ `),m=this.list(g);a[a.length-1]=m;let w=m.raw.length>f.raw.length?g.slice(f.raw.length+1,m.raw.length).split(`
24
+ `).length:0;if(w>0){let v=n.slice(0,w).join(`
25
25
  `);s=`${s}
26
26
  ${v}`,r=`${r}
27
- ${v}`}n=n.slice(b);continue}}return{type:"blockquote",raw:s,tokens:a,text:r}}}list(t){let e=this.rules.block.list.exec(t);if(e){if(!this.options.pedantic&&this.lexer.state.lastToken?.type==="text"&&!this.rules.other.listInterruptsParagraph.test(t))return;let n=t,s=()=>n.length-t.length,r=e[1].trim(),a=r.length>1,o={type:"list",raw:"",ordered:a,start:a?+r.slice(0,-1):"",loose:!1,items:[]};r=a?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=a?r:"[*+-]");let i=this.rules.other.listItemRegex(r),l=!1;for(;t;){let c=!1,d="";if(!(e=i.exec(t))||this.rules.block.hr.test(t))break;let u=s();t=t.substring(e[0].length);let k=e[2].split(`
28
- `,1)[0],g=e[1].length,f=this.options.pedantic?Ve(k,g):k.replace(this.rules.other.leadingSpaceTab,L=>Ve(L,g)),b=t.split(`
29
- `,1)[0],v=!f.trim(),y=0;if(this.options.pedantic?(y=2,d=f.trimStart()):v?y=g+1:(y=f.search(this.rules.other.nonSpaceChar),y=y>4?1:y,d=f.slice(y),y+=g),v&&this.rules.other.blankLine.test(b)&&(t=t.substring(b.length+1),c=!0),!c){let L=this.rules.other.nextBulletRegex(y),E=this.rules.other.hrRegex(y),C=this.rules.other.fencesBeginRegex(y),T=this.options.pedantic?this.rules.other.pedanticHeadingBeginRegex(y):this.rules.other.headingBeginRegex(y),O=this.rules.other.htmlBeginRegex(y),ae=this.rules.other.blockquoteBeginRegex(y),me=!1;for(;t;){let Kt=t.split(`
30
- `,1)[0],ge;if(b=Kt,this.options.pedantic?(b=b.replace(this.rules.other.listReplaceNesting," "),ge=b):ge=b.replace(this.rules.other.leadingSpaceTab,at=>Ve(at)),C.test(b)||T.test(b)||O.test(b)||ae.test(b)||L.test(b)||E.test(b))break;if(ge.search(this.rules.other.nonSpaceChar)>=y||!b.trim())d+=`
31
- `+ge.slice(y),me=!1;else{if(v||f.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||C.test(f)||T.test(f)||O.test(f)||E.test(f))break;if(!this.options.pedantic&&!me){let ot=f.replace(this.rules.other.nestedContainerMarkers,"");if(this.rules.block.fences.test(ot)||this.rules.block.heading.test(ot)||this.rules.block.hr.test(ot))break}let at=!this.options.pedantic&&/^ {0,3}(?:=+|-+) *$/.test(b)&&this.rules.block.lheading.test(`${f}
32
- ${b}`)?` ${ge.replace(/^ {0,3}/,"")}`:b;d+=`
33
- `+at,me=!0}v=!b.trim(),t=t.substring(Kt.length+1),f=ge.slice(y)}}let m=n.slice(u,s());o.loose||(l?o.loose=!0:this.rules.other.doubleBlankLine.test(m)&&(l=!0)),o.items.push({type:"list_item",raw:m,task:!!this.options.gfm&&this.rules.other.listIsTask.test(d),loose:!1,text:d,tokens:[]})}let p=o.items.at(-1);if(p)p.raw=p.raw.trimEnd(),p.text=p.text.trimEnd();else return;o.raw=n.slice(0,s()).trimEnd();for(let c of o.items)if(this.lexer.state.top=!1,c.tokens=this.lexer.blockTokens(c.text,[]),!o.loose){let d=c.tokens.filter(k=>k.type==="space"),u=d.length>0&&d.some(k=>this.rules.other.anyLine.test(k.raw));o.loose=u}for(let c of o.items){let d=c.tokens[0];if(c.task&&(d?.type==="text"||d?.type==="paragraph")){c.text=c.text.replace(this.rules.other.listReplaceTask,""),d.raw=d.raw.replace(this.rules.other.listReplaceTask,""),d.text=d.text.replace(this.rules.other.listReplaceTask,"");for(let k=this.lexer.inlineQueue.length-1;k>=0;k--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[k].src)){this.lexer.inlineQueue[k].src=this.lexer.inlineQueue[k].src.replace(this.rules.other.listReplaceTask,"");break}let u=this.rules.other.listTaskCheckbox.exec(c.raw);if(u){let k={type:"checkbox",raw:u[0]+" ",checked:u[0]!=="[ ]"};c.checked=k.checked,o.loose?c.tokens[0]&&["paragraph","text"].includes(c.tokens[0].type)&&"tokens"in c.tokens[0]&&c.tokens[0].tokens?(c.tokens[0].raw=k.raw+c.tokens[0].raw,c.tokens[0].text=k.raw+c.tokens[0].text,c.tokens[0].tokens.unshift(k)):c.tokens.unshift({type:"paragraph",raw:k.raw,text:k.raw,tokens:[k]}):c.tokens.unshift(k)}}else c.task&&(c.task=!1)}if(o.loose)for(let c of o.items){c.loose=!0;for(let d of c.tokens)d.type==="text"&&(d.type="paragraph")}return o}}html(t){let e=this.rules.block.html.exec(t);if(e){let n=ln(e[0]);return{type:"html",block:!0,raw:n,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:n}}}def(t){let e=this.rules.block.def.exec(t);if(e){if(!this.rules.other.startAngleBracket.test(e[2])&&cn(e[2],"()")!==-1)return;let n=Ge(e[1]),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:Q(e[0],`
34
- `),href:s,title:r}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=on(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),r=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`
35
- `):[],a={type:"table",raw:Q(e[0],`
36
- `),header:[],align:[],rows:[]};if(n.length===s.length){for(let o of s)this.rules.other.tableAlignRight.test(o)?a.align.push("right"):this.rules.other.tableAlignCenter.test(o)?a.align.push("center"):this.rules.other.tableAlignLeft.test(o)?a.align.push("left"):a.align.push(null);for(let o=0;o<n.length;o++)a.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:a.align[o]});for(let o of r)a.rows.push(on(o,a.header.length).map((i,l)=>({text:i,tokens:this.lexer.inline(i),header:!1,align:a.align[l]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e){let n=e[1].trim();return{type:"heading",raw:Q(e[0],`
27
+ ${v}`}n=n.slice(w);continue}}return{type:"blockquote",raw:s,tokens:a,text:r}}}list(t){let e=this.rules.block.list.exec(t);if(e){if(!this.options.pedantic&&this.lexer.state.lastToken?.type==="text"&&!this.rules.other.listInterruptsParagraph.test(t))return;let n=t,s=()=>n.length-t.length,r=e[1].trim(),a=r.length>1,o={type:"list",raw:"",ordered:a,start:a?+r.slice(0,-1):"",loose:!1,items:[]};r=a?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=a?r:"[*+-]");let i=this.rules.other.listItemRegex(r),l=!1;for(;t;){let d=!1,p="";if(!(e=i.exec(t))||this.rules.block.hr.test(t))break;let u=s();t=t.substring(e[0].length);let f=e[2].split(`
28
+ `,1)[0],g=e[1].length,m=this.options.pedantic?rt(f,g):f.replace(this.rules.other.leadingSpaceTab,S=>rt(S,g)),w=t.split(`
29
+ `,1)[0],v=!m.trim(),y=0;if(this.options.pedantic?(y=2,p=m.trimStart()):v?y=g+1:(y=m.search(this.rules.other.nonSpaceChar),y=y>4?1:y,p=m.slice(y),y+=g),v&&this.rules.other.blankLine.test(w)&&(t=t.substring(w.length+1),d=!0),!d){let S=this.rules.other.nextBulletRegex(y),C=this.rules.other.hrRegex(y),q=this.rules.other.fencesBeginRegex(y),j=this.options.pedantic?this.rules.other.pedanticHeadingBeginRegex(y):this.rules.other.headingBeginRegex(y),N=this.rules.other.htmlBeginRegex(y),E=this.rules.other.blockquoteBeginRegex(y),ie=!1;for(;t;){let un=t.split(`
30
+ `,1)[0],$e;if(w=un,this.options.pedantic?(w=w.replace(this.rules.other.listReplaceNesting," "),$e=w):$e=w.replace(this.rules.other.leadingSpaceTab,gt=>rt(gt)),q.test(w)||j.test(w)||N.test(w)||E.test(w)||S.test(w)||C.test(w))break;if($e.search(this.rules.other.nonSpaceChar)>=y||!w.trim())p+=`
31
+ `+$e.slice(y),ie=!1;else{if(v||m.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||q.test(m)||j.test(m)||N.test(m)||C.test(m))break;if(!this.options.pedantic&&!ie){let kt=m.replace(this.rules.other.nestedContainerMarkers,"");if(this.rules.block.fences.test(kt)||this.rules.block.heading.test(kt)||this.rules.block.hr.test(kt))break}let gt=!this.options.pedantic&&/^ {0,3}(?:=+|-+) *$/.test(w)&&this.rules.block.lheading.test(`${m}
32
+ ${w}`)?` ${$e.replace(/^ {0,3}/,"")}`:w;p+=`
33
+ `+gt,ie=!0}v=!w.trim(),t=t.substring(un.length+1),m=$e.slice(y)}}let k=n.slice(u,s());o.loose||(l?o.loose=!0:this.rules.other.doubleBlankLine.test(k)&&(l=!0)),o.items.push({type:"list_item",raw:k,task:!!this.options.gfm&&this.rules.other.listIsTask.test(p),loose:!1,text:p,tokens:[]})}let c=o.items.at(-1);if(c)c.raw=c.raw.trimEnd(),c.text=c.text.trimEnd();else return;o.raw=n.slice(0,s()).trimEnd();for(let d of o.items)if(this.lexer.state.top=!1,d.tokens=this.lexer.blockTokens(d.text,[]),!o.loose){let p=d.tokens.filter(f=>f.type==="space"),u=p.length>0&&p.some(f=>this.rules.other.anyLine.test(f.raw));o.loose=u}for(let d of o.items){let p=d.tokens[0];if(d.task&&(p?.type==="text"||p?.type==="paragraph")){d.text=d.text.replace(this.rules.other.listReplaceTask,""),p.raw=p.raw.replace(this.rules.other.listReplaceTask,""),p.text=p.text.replace(this.rules.other.listReplaceTask,"");for(let f=this.lexer.inlineQueue.length-1;f>=0;f--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[f].src)){this.lexer.inlineQueue[f].src=this.lexer.inlineQueue[f].src.replace(this.rules.other.listReplaceTask,"");break}let u=this.rules.other.listTaskCheckbox.exec(d.raw);if(u){let f={type:"checkbox",raw:u[0]+" ",checked:u[0]!=="[ ]"};d.checked=f.checked,o.loose?d.tokens[0]&&["paragraph","text"].includes(d.tokens[0].type)&&"tokens"in d.tokens[0]&&d.tokens[0].tokens?(d.tokens[0].raw=f.raw+d.tokens[0].raw,d.tokens[0].text=f.raw+d.tokens[0].text,d.tokens[0].tokens.unshift(f)):d.tokens.unshift({type:"paragraph",raw:f.raw,text:f.raw,tokens:[f]}):d.tokens.unshift(f)}}else d.task&&(d.task=!1)}if(o.loose)for(let d of o.items){d.loose=!0;for(let p of d.tokens)p.type==="text"&&(p.type="paragraph")}return o}}html(t){let e=this.rules.block.html.exec(t);if(e){let n=Ln(e[0]);return{type:"html",block:!0,raw:n,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:n}}}def(t){let e=this.rules.block.def.exec(t);if(e){if(!this.rules.other.startAngleBracket.test(e[2])&&Mn(e[2],"()")!==-1)return;let n=ot(e[1]),s=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:n,raw:se(e[0],`
34
+ `),href:s,title:r}}}table(t){let e=this.rules.block.table.exec(t);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let n=Tn(e[1]),s=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),r=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`
35
+ `):[],a={type:"table",raw:se(e[0],`
36
+ `),header:[],align:[],rows:[]};if(n.length===s.length){for(let o of s)this.rules.other.tableAlignRight.test(o)?a.align.push("right"):this.rules.other.tableAlignCenter.test(o)?a.align.push("center"):this.rules.other.tableAlignLeft.test(o)?a.align.push("left"):a.align.push(null);for(let o=0;o<n.length;o++)a.header.push({text:n[o],tokens:this.lexer.inline(n[o]),header:!0,align:a.align[o]});for(let o of r)a.rows.push(Tn(o,a.header.length).map((i,l)=>({text:i,tokens:this.lexer.inline(i),header:!1,align:a.align[l]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e){let n=e[1].trim();return{type:"heading",raw:se(e[0],`
37
37
  `),depth:e[2].charAt(0)==="="?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let n=e[1].charAt(e[1].length-1)===`
38
- `?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){if(this.lexer.state.linkParenPossible===!1)return;let e=this.rules.inline.link.exec(t);if(e){let n=e[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&dn(t,e[1],n,this.rules))return;let s=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=Q(s.slice(0,-1),"\\");if((s.length-i.length)%2===0)return}else{let i=cn(e[2],"()");if(i===-2)return;if(i>-1){let l=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,l).trim(),e[3]=""}}let r=Q(e[0].slice(0,-1),"\\");if((e[0].length-r.length)%2===0)return;let a=e[2],o="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(a);i&&(a=i[1],o=i[3])}else o=e[3]?e[3].slice(1,-1):"";return a=a.trim(),this.rules.other.startAngleBracket.test(a)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?a=a.slice(1):a=a.slice(1,-1)),pn(e,{href:a&&a.replace(this.rules.inline.anyPunctuation,"$1"),title:o&&o.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let n;if((n=this.rules.inline.reflink.exec(t))||(n=this.rules.inline.nolink.exec(t))){let s=n[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&dn(t,n[1],s,this.rules))return;let r=e[Ge(n[2]||n[1])];if(!r){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return pn(n,r,n[0],this.lexer,this.rules)}}emStrong(t,e,n=""){let s=this.rules.inline.emStrongLDelim.exec(t);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4])return;let r=s[0][0],a=n===r,o=e.length-t.length,i=o;for(;!this.options.pedantic&&i>0&&e[i-1]===r;)i--;let l=[...e.slice(Math.max(0,i-2),i)].at(-1)??"",p=l==="*"||l==="_"||!!this.rules.inline.punctuation.exec(l);i<o&&(n=l);let c=i<o?p:n==="*"||n==="_"||!!this.rules.inline.punctuation.exec(n);if(s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;let d=s[1]||s[3]||"";if(!d||!n||c){let u=[...s[0]].length-1,k,g,f=u,b=0,v=o-i+u,y=!this.options.pedantic&&!!l.trim()&&(!!d||r==="*"&&!p);if(r!=="*"&&r!=="_")return;let m=r==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd,L=ir(this,e,r),E=e.length-t.length+u;if(L<E)return;e=e.slice(-1*t.length+u);let C=L-E;for(m.lastIndex=0;(s=m.exec(e))!==null&&!(s.index>C);){if(k=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!k)continue;if(g=[...k].length,s[3]||s[4]){f+=g;continue}else if(s[5]||s[6]||y){if(a&&(s[5]||s[6]))break;if(v%3&&!((v+g)%3)){b+=g;continue}}if(f-=g,f>0)continue;g=Math.min(g,g+f+b);let T=[...s[0]][0].length,O=t.slice(0,u+s.index+T+g);if(Math.min(u,g)%2){let me=O.slice(1,-1);return{type:"em",raw:O,text:me,tokens:this.lexer.inlineTokens(me)}}let ae=O.slice(2,-2);return{type:"strong",raw:O,text:ae,tokens:this.lexer.inlineTokens(ae)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,n=""){let s=this.rules.inline.delLDelim.exec(t);if(s&&(!s[1]||!n||this.rules.inline.punctuation.exec(n))){let r=[...s[0]].length-1,a,o,i=r,l=this.rules.inline.delRDelim,p=lr(this,e),c=e.length-t.length+r;if(p<c)return;e=e.slice(-1*t.length+r);let d=p-c;for(l.lastIndex=0;(s=l.exec(e))!==null&&!(s.index>d);){if(a=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!a||(o=[...a].length,o!==r))continue;if(s[3]||s[4]){i+=o;continue}if(i-=o,i>0)continue;o=Math.min(o,o+i);let u=[...s[0]][0].length,k=t.slice(0,r+s.index+u+o),g=k.slice(r,-r);return{type:"del",raw:k,text:g,tokens:this.lexer.inlineTokens(g)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let n,s;return e[2]==="@"?(n=e[1],s="mailto:"+n):(n=e[1],s=n),{type:"link",raw:e[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let n,s;if(e[2]==="@")n=e[0],s="mailto:"+n;else{let r;do r=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(r!==e[0]);n=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:n?e[0]:rr(e[0]),escaped:n}}}},F=class ut{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ue,this.options.tokenizer=this.options.tokenizer||new we,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let n={other:j,block:Ze.normal,inline:Re.normal};this.options.pedantic?(n.block=Ze.pedantic,n.inline=Re.pedantic):this.options.gfm&&(n.block=Ze.gfm,this.options.breaks?n.inline=Re.breaks:n.inline=Re.gfm),this.tokenizer.rules=n}static get rules(){return{block:Ze,inline:Re}}static lex(e,n){return new ut(n).lex(e)}static lexInline(e,n){return new ut(n).inlineTokens(e)}lex(e){e=e.replace(j.carriageReturn,`
39
- `),this.blockTokens(e,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.state.inRawBlock=!1,this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,n=[],s=!1){this.tokenizer.lexer=this;let r=this.state.lastToken;this.options.pedantic&&(e=e.replace(j.tabCharGlobal," ").replace(j.spaceLine,""));let a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}this.state.lastToken=n.at(-1);let o;if(this.options.extensions?.block?.some(l=>(o=l.call({lexer:this},e,n))?(e=e.substring(o.raw.length),n.push(o),!0):!1))continue;if(o=this.tokenizer.space(e)){e=e.substring(o.raw.length);let l=n.at(-1);o.raw.length===1&&l!==void 0?l.raw+=`
38
+ `?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:n,tokens:this.lexer.inline(n)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){if(this.lexer.state.linkParenPossible===!1)return;let e=this.rules.inline.link.exec(t);if(e){let n=e[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&Cn(t,e[1],n,this.rules))return;let s=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=se(s.slice(0,-1),"\\");if((s.length-i.length)%2===0)return}else{let i=Mn(e[2],"()");if(i===-2)return;if(i>-1){let l=(e[0].indexOf("!")===0?5:4)+e[1].length+i;e[2]=e[2].substring(0,i),e[0]=e[0].substring(0,l).trim(),e[3]=""}}let r=se(e[0].slice(0,-1),"\\");if((e[0].length-r.length)%2===0)return;let a=e[2],o="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(a);i&&(a=i[1],o=i[3])}else o=e[3]?e[3].slice(1,-1):"";return a=a.trim(),this.rules.other.startAngleBracket.test(a)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?a=a.slice(1):a=a.slice(1,-1)),An(e,{href:a&&a.replace(this.rules.inline.anyPunctuation,"$1"),title:o&&o.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let n;if((n=this.rules.inline.reflink.exec(t))||(n=this.rules.inline.nolink.exec(t))){let s=n[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&Cn(t,n[1],s,this.rules))return;let r=e[ot(n[2]||n[1])];if(!r){let a=n[0].charAt(0);return{type:"text",raw:a,text:a}}return An(n,r,n[0],this.lexer,this.rules)}}emStrong(t,e,n=""){let s=this.rules.inline.emStrongLDelim.exec(t);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4])return;let r=s[0][0],a=n===r,o=e.length-t.length,i=o;for(;!this.options.pedantic&&i>0&&e[i-1]===r;)i--;let l=[...e.slice(Math.max(0,i-2),i)].at(-1)??"",c=l==="*"||l==="_"||!!this.rules.inline.punctuation.exec(l);i<o&&(n=l);let d=i<o?c:n==="*"||n==="_"||!!this.rules.inline.punctuation.exec(n);if(s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;let p=s[1]||s[3]||"";if(!p||!n||d){let u=[...s[0]].length-1,f,g,m=u,w=0,v=o-i+u,y=!this.options.pedantic&&!!l.trim()&&(!!p||r==="*"&&!c);if(r!=="*"&&r!=="_")return;let k=r==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd,S=Pr(this,e,r),C=e.length-t.length+u;if(S<C)return;e=e.slice(-1*t.length+u);let q=S-C;for(k.lastIndex=0;(s=k.exec(e))!==null&&!(s.index>q);){if(f=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!f)continue;if(g=[...f].length,s[3]||s[4]){m+=g;continue}else if(s[5]||s[6]||y){if(a&&(s[5]||s[6]))break;if(v%3&&!((v+g)%3)){w+=g;continue}}if(m-=g,m>0)continue;g=Math.min(g,g+m+w);let j=[...s[0]][0].length,N=t.slice(0,u+s.index+j+g);if(Math.min(u,g)%2){let ie=N.slice(1,-1);return{type:"em",raw:N,text:ie,tokens:this.lexer.inlineTokens(ie)}}let E=N.slice(2,-2);return{type:"strong",raw:N,text:E,tokens:this.lexer.inlineTokens(E)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let n=e[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:e[0],text:n}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t,e,n=""){let s=this.rules.inline.delLDelim.exec(t);if(s&&(!s[1]||!n||this.rules.inline.punctuation.exec(n))){let r=[...s[0]].length-1,a,o,i=r,l=this.rules.inline.delRDelim,c=Nr(this,e),d=e.length-t.length+r;if(c<d)return;e=e.slice(-1*t.length+r);let p=c-d;for(l.lastIndex=0;(s=l.exec(e))!==null&&!(s.index>p);){if(a=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!a||(o=[...a].length,o!==r))continue;if(s[3]||s[4]){i+=o;continue}if(i-=o,i>0)continue;o=Math.min(o,o+i);let u=[...s[0]][0].length,f=t.slice(0,r+s.index+u+o),g=f.slice(r,-r);return{type:"del",raw:f,text:g,tokens:this.lexer.inlineTokens(g)}}}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let n,s;return e[2]==="@"?(n=e[1],s="mailto:"+n):(n=e[1],s=n),{type:"link",raw:e[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let n,s;if(e[2]==="@")n=e[0],s="mailto:"+n;else{let r;do r=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(r!==e[0]);n=e[0],e[1]==="www."?s="http://"+e[0]:s=e[0]}return{type:"link",raw:e[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let n=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:n?e[0]:Hr(e[0]),escaped:n}}}},G=class vt{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ke,this.options.tokenizer=this.options.tokenizer||new ve,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let n={other:I,block:st.normal,inline:He.normal};this.options.pedantic?(n.block=st.pedantic,n.inline=He.pedantic):this.options.gfm&&(n.block=st.gfm,this.options.breaks?n.inline=He.breaks:n.inline=He.gfm),this.tokenizer.rules=n}static get rules(){return{block:st,inline:He}}static lex(e,n){return new vt(n).lex(e)}static lexInline(e,n){return new vt(n).inlineTokens(e)}lex(e){e=e.replace(I.carriageReturn,`
39
+ `),this.blockTokens(e,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.state.inRawBlock=!1,this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,n=[],s=!1){this.tokenizer.lexer=this;let r=this.state.lastToken;this.options.pedantic&&(e=e.replace(I.tabCharGlobal," ").replace(I.spaceLine,""));let a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}this.state.lastToken=n.at(-1);let o;if(this.options.extensions?.block?.some(l=>(o=l.call({lexer:this},e,n))?(e=e.substring(o.raw.length),n.push(o),!0):!1))continue;if(o=this.tokenizer.space(e)){e=e.substring(o.raw.length);let l=n.at(-1);o.raw.length===1&&l!==void 0?l.raw+=`
40
40
  `:n.push(o);continue}if(o=this.tokenizer.code(e)){e=e.substring(o.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
41
41
  `)?"":`
42
42
  `)+o.raw,l.text+=`
43
43
  `+o.text,this.inlineQueue.at(-1).src=l.text):n.push(o);continue}if(o=this.tokenizer.fences(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.heading(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.hr(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.blockquote(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.list(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.html(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.def(e)){e=e.substring(o.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
44
44
  `)?"":`
45
45
  `)+o.raw,l.text+=`
46
- `+o.raw,this.inlineQueue.at(-1).src=l.text):(this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title}),n.push(o));continue}if(o=this.tokenizer.table(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.lheading(e)){e=e.substring(o.raw.length),n.push(o);continue}let i=e;if(this.options.extensions?.startBlock){let l=1/0,p=e.slice(1),c;this.options.extensions.startBlock.forEach(d=>{c=d.call({lexer:this},p),typeof c=="number"&&c>=0&&(l=Math.min(l,c))}),l<1/0&&l>=0&&(i=e.substring(0,l+1))}if(this.state.top&&(o=this.tokenizer.paragraph(i))){let l=n.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`
46
+ `+o.raw,this.inlineQueue.at(-1).src=l.text):(this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title}),n.push(o));continue}if(o=this.tokenizer.table(e)){e=e.substring(o.raw.length),n.push(o);continue}if(o=this.tokenizer.lheading(e)){e=e.substring(o.raw.length),n.push(o);continue}let i=e;if(this.options.extensions?.startBlock){let l=1/0,c=e.slice(1),d;this.options.extensions.startBlock.forEach(p=>{d=p.call({lexer:this},c),typeof d=="number"&&d>=0&&(l=Math.min(l,d))}),l<1/0&&l>=0&&(i=e.substring(0,l+1))}if(this.state.top&&(o=this.tokenizer.paragraph(i))){let l=n.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`
47
47
  `)?"":`
48
48
  `)+o.raw,l.text+=`
49
49
  `+o.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(o),s=i.length!==e.length,e=e.substring(o.raw.length);continue}if(o=this.tokenizer.text(e)){e=e.substring(o.raw.length);let l=n.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`
50
50
  `)?"":`
51
51
  `)+o.raw,l.text+=`
52
- `+o.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,this.state.lastToken=r,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}linkInText(e){if(!e.includes("["))return!1;let n=this.tokenizer.rules.inline.link;for(let s of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(n.test(s[0])&&e.charAt(s.index-1)!=="!")return!0;for(let s of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let r=s[0],a=r.lastIndexOf("[");if(!(r.charAt(0)==="!"||!Object.hasOwn(this.tokens.links,Ge(r.slice(a+1,-1))))&&!(a>1&&this.linkInText(r.slice(1,a-1))))return!0}return!1}inlineTokens(e,n=[]){this.tokenizer.lexer=this;let s=this.state.linkParenPossible;this.state.linkParenPossible=s&&e.includes(")");try{return this.#e(e,n)}finally{this.state.linkParenPossible=s}}#e(e,n){let s=e.includes("*")||e.includes("_")||e.includes("~")||this.options.hooks?.emStrongMask||this.tokenizer.emStrong!==we.prototype.emStrong||this.tokenizer.del!==we.prototype.del?this.#s(e):e;ar(this.tokenizer,s);try{return this.#t(e,s,n)}finally{or(this.tokenizer)}}#t(e,n,s){let r=!1,a="",o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}r||(a=""),r=!1;let i;if(this.options.extensions?.inline?.some(p=>(i=p.call({lexer:this},e,s))?(e=e.substring(i.raw.length),s.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let p=s.at(-1);i.type==="text"&&p?.type==="text"?(p.raw+=i.raw,p.text+=i.text):s.push(i);continue}if(i=this.tokenizer.emStrong(e,n,a)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.del(e,n,a)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),s.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),s.push(i);continue}let l=e;if(this.options.extensions?.startInline){let p=1/0,c=e.slice(1),d;this.options.extensions.startInline.forEach(u=>{d=u.call({lexer:this},c),typeof d=="number"&&d>=0&&(p=Math.min(p,d))}),p<1/0&&p>=0&&(l=e.substring(0,p+1))}if(i=this.tokenizer.inlineText(l)){e=e.substring(i.raw.length),i.raw.slice(-1)!=="_"&&(a=i.raw.slice(-1)),r=!0;let p=s.at(-1);p?.type==="text"?(p.raw+=i.raw,p.text+=i.text):s.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return s}#n(e){let{blockSkip:n,tag:s,autolink:r}=this.tokenizer.rules.inline,a="",o=0,i;for(n.lastIndex=0;i=n.exec(e);){let l=i.index+(i[2]?i[2].length:0),p=i.index+i[0].length;if(e.charAt(l)==="<"){let c=e.slice(l),d=s.exec(c)||r.exec(c);if(!d){n.lastIndex=l+1;continue}p=l+d[0].length,n.lastIndex=p}a+=e.slice(o,l)+"["+"a".repeat(p-l-2)+"]",o=p}return a+e.slice(o)}#s(e){let n=e;if(this.tokens.links&&e.includes("[")){let s=this.tokenizer.rules.inline.reflinkSearch,r=a=>{let o=a.lastIndexOf("[");if(!Object.hasOwn(this.tokens.links,Ge(a.slice(o+1,-1))))return a;if(o>1&&a.charAt(0)!=="!"){let i=a.slice(1,o-1);if(this.linkInText(i))return"["+i.replace(s,r)+"]["+"a".repeat(a.length-o-2)+"]"}return"["+"a".repeat(a.length-2)+"]"};n=n.replace(s,r)}return n=n.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode,(s,r,a)=>a?"+".repeat(s.length):r?r+s.slice(r.length,-r.length).replace(/`/g,"+")+r:s),n=this.#n(n),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n,n}infiniteLoopError(e){let n="Infinite loop on byte: "+e;if(this.options.silent)console.error(n);else throw new Error(n)}},Qe=class{options;parser;constructor(t){this.options=t||ue}space(t){return""}code({text:t,lang:e,escaped:n}){let s=(e||"").match(j.notSpaceStart)?.[0],r=t?t.replace(j.endingNewline,"")+`
53
- `:"";return s?'<pre><code class="language-'+N(s)+'">'+(n?r:N(r,!0))+`</code></pre>
54
- `:"<pre><code>"+(n?r:N(r,!0))+`</code></pre>
52
+ `+o.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,this.state.lastToken=r,n}inline(e,n=[]){return this.inlineQueue.push({src:e,tokens:n}),n}linkInText(e){if(!e.includes("["))return!1;let n=this.tokenizer.rules.inline.link;for(let s of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(n.test(s[0])&&e.charAt(s.index-1)!=="!")return!0;for(let s of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let r=s[0],a=r.lastIndexOf("[");if(!(r.charAt(0)==="!"||!Object.hasOwn(this.tokens.links,ot(r.slice(a+1,-1))))&&!(a>1&&this.linkInText(r.slice(1,a-1))))return!0}return!1}inlineTokens(e,n=[]){this.tokenizer.lexer=this;let s=this.state.linkParenPossible;this.state.linkParenPossible=s&&e.includes(")");try{return this.#e(e,n)}finally{this.state.linkParenPossible=s}}#e(e,n){let s=e.includes("*")||e.includes("_")||e.includes("~")||this.options.hooks?.emStrongMask||this.tokenizer.emStrong!==ve.prototype.emStrong||this.tokenizer.del!==ve.prototype.del?this.#s(e):e;_r(this.tokenizer,s);try{return this.#t(e,s,n)}finally{Or(this.tokenizer)}}#t(e,n,s){let r=!1,a="",o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}r||(a=""),r=!1;let i;if(this.options.extensions?.inline?.some(c=>(i=c.call({lexer:this},e,s))?(e=e.substring(i.raw.length),s.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let c=s.at(-1);i.type==="text"&&c?.type==="text"?(c.raw+=i.raw,c.text+=i.text):s.push(i);continue}if(i=this.tokenizer.emStrong(e,n,a)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.del(e,n,a)){e=e.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),s.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),s.push(i);continue}let l=e;if(this.options.extensions?.startInline){let c=1/0,d=e.slice(1),p;this.options.extensions.startInline.forEach(u=>{p=u.call({lexer:this},d),typeof p=="number"&&p>=0&&(c=Math.min(c,p))}),c<1/0&&c>=0&&(l=e.substring(0,c+1))}if(i=this.tokenizer.inlineText(l)){e=e.substring(i.raw.length),i.raw.slice(-1)!=="_"&&(a=i.raw.slice(-1)),r=!0;let c=s.at(-1);c?.type==="text"?(c.raw+=i.raw,c.text+=i.text):s.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return s}#n(e){let{blockSkip:n,tag:s,autolink:r}=this.tokenizer.rules.inline,a="",o=0,i;for(n.lastIndex=0;i=n.exec(e);){let l=i.index+(i[2]?i[2].length:0),c=i.index+i[0].length;if(e.charAt(l)==="<"){let d=e.slice(l),p=s.exec(d)||r.exec(d);if(!p){n.lastIndex=l+1;continue}c=l+p[0].length,n.lastIndex=c}a+=e.slice(o,l)+"["+"a".repeat(c-l-2)+"]",o=c}return a+e.slice(o)}#s(e){let n=e;if(this.tokens.links&&e.includes("[")){let s=this.tokenizer.rules.inline.reflinkSearch,r=a=>{let o=a.lastIndexOf("[");if(!Object.hasOwn(this.tokens.links,ot(a.slice(o+1,-1))))return a;if(o>1&&a.charAt(0)!=="!"){let i=a.slice(1,o-1);if(this.linkInText(i))return"["+i.replace(s,r)+"]["+"a".repeat(a.length-o-2)+"]"}return"["+"a".repeat(a.length-2)+"]"};n=n.replace(s,r)}return n=n.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode,(s,r,a)=>a?"+".repeat(s.length):r?r+s.slice(r.length,-r.length).replace(/`/g,"+")+r:s),n=this.#n(n),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n,n}infiniteLoopError(e){let n="Infinite loop on byte: "+e;if(this.options.silent)console.error(n);else throw new Error(n)}},it=class{options;parser;constructor(t){this.options=t||ke}space(t){return""}code({text:t,lang:e,escaped:n}){let s=(e||"").match(I.notSpaceStart)?.[0],r=t?t.replace(I.endingNewline,"")+`
53
+ `:"";return s?'<pre><code class="language-'+B(s)+'">'+(n?r:B(r,!0))+`</code></pre>
54
+ `:"<pre><code>"+(n?r:B(r,!0))+`</code></pre>
55
55
  `}blockquote({tokens:t}){return`<blockquote>
56
56
  ${this.parser.parse(t)}</blockquote>
57
57
  `}html({text:t}){return t}def(t){return""}heading({tokens:t,depth:e}){return`<h${e}>${this.parser.parseInline(t)}</h${e}>
@@ -67,103 +67,120 @@ ${this.parser.parse(t)}</blockquote>
67
67
  `}tablerow({text:t}){return`<tr>
68
68
  ${t}</tr>
69
69
  `}tablecell(t){let e=this.parser.parseInline(t.tokens),n=t.header?"th":"td";return(t.align?`<${n} align="${t.align}">`:`<${n}>`)+e+`</${n}>
70
- `}strong({tokens:t}){return`<strong>${this.parser.parseInline(t)}</strong>`}em({tokens:t}){return`<em>${this.parser.parseInline(t)}</em>`}codespan({text:t}){return`<code>${N(t,!0)}</code>`}br(t){return"<br>"}del({tokens:t}){return`<del>${this.parser.parseInline(t)}</del>`}link({href:t,title:e,text:n,tokens:s,autolink:r}){let a=r?N(n,!0):this.parser.parseInline(s),o=an(t);if(o===null)return a;t=N(o,r);let i='<a href="'+t+'"';return e&&(i+=' title="'+N(e)+'"'),i+=">"+a+"</a>",i}image({href:t,title:e,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=an(t);if(r===null)return N(n);t=r;let a=`<img src="${N(t)}" alt="${N(n)}"`;return e&&(a+=` title="${N(e)}"`),a+=">",a}text(t){return"tokens"in t&&t.tokens?this.parser.parseInline(t.tokens):"escaped"in t&&t.escaped?t.text:N(t.text)}},vt=class{parser;strong({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}em({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}codespan({text:t}){return t}del({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}html({text:t}){return t}text({text:t}){return t}link({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}image({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}br(){return`
71
- `}checkbox({raw:t}){return t}},W=class ft{options;renderer;textRenderer;constructor(e){this.options=e||ue,this.options.renderer=this.options.renderer||new Qe,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new vt,this.textRenderer.parser=this}static parse(e,n){return new ft(n).parse(e)}static parseInline(e,n){return new ft(n).parseInline(e)}parse(e){this.renderer.parser=this;let n="";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let o=r,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||!["space","hr","heading","code","table","blockquote","list","checkbox","html","def","paragraph","text"].includes(o.type)){n+=i===!1?"":i??"";continue}}let a=r;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let o='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return n}parseInline(e,n=this.renderer){this.renderer.parser=this;let s="";for(let r=0;r<e.length;r++){let a=e[r];if(this.options.extensions?.renderers?.[a.type]){let i=this.options.extensions.renderers[a.type].call({parser:this},a);if(i!==!1||!["escape","html","link","image","checkbox","strong","em","codespan","br","del","text"].includes(a.type)){s+=i===!1?"":i??"";continue}}let o=a;switch(o.type){case"escape":{s+=n.text(o);break}case"html":{s+=n.html(o);break}case"link":{s+=n.link(o);break}case"image":{s+=n.image(o);break}case"checkbox":{s+=n.checkbox(o);break}case"strong":{s+=n.strong(o);break}case"em":{s+=n.em(o);break}case"codespan":{s+=n.codespan(o);break}case"br":{s+=n.br(o);break}case"del":{s+=n.del(o);break}case"text":{s+=n.text(o);break}default:{let i='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return s}},Ee=class{options;block;constructor(t){this.options=t||ue}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(t){return t}postprocess(t){return t}processAllTokens(t){return t}emStrongMask(t){return t}provideLexer(t=this.block){return t?F.lex:F.lexInline}provideParser(t=this.block){return t?W.parse:W.parseInline}};function ee(t,e){if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(e[n]);else t.push(e)}var St=class{defaults=mt();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=W;Renderer=Qe;TextRenderer=vt;Lexer=F;Tokenizer=we;Hooks=Ee;constructor(...t){this.use(...t)}walkTokens(t,e){let n=[];for(let s of t)switch(ee(n,e.call(this,s)),s.type){case"table":{let r=s;for(let a of r.header)ee(n,this.walkTokens(a.tokens,e));for(let a of r.rows)for(let o of a)ee(n,this.walkTokens(o.tokens,e));break}case"list":{let r=s;ee(n,this.walkTokens(r.items,e));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(a=>{let o=r[a].flat(1/0);ee(n,this.walkTokens(o,e))}):r.tokens&&ee(n,this.walkTokens(r.tokens,e))}}return n}use(...t){let e=this.defaults.extensions||{renderers:Object.create(null),childTokens:Object.create(null)};return t.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let a=e.renderers[r.name];a?e.renderers[r.name]=function(...o){let i=r.renderer.apply(this,o);return i===!1&&(i=a.apply(this,o)),i}:e.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[r.level];a?a.unshift(r.tokenizer):e[r.level]=[r.tokenizer],r.start&&(r.level==="block"?e.startBlock?e.startBlock.push(r.start):e.startBlock=[r.start]:r.level==="inline"&&(e.startInline?e.startInline.push(r.start):e.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(e.childTokens[r.name]=r.childTokens)}),s.extensions=e),n.renderer){let r=this.defaults.renderer||new Qe(this.defaults);for(let a in n.renderer){if(!(a in r))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let o=a,i=n.renderer[o],l=r[o];r[o]=(...p)=>{let c=i.apply(r,p);return c===!1&&(c=l.apply(r,p)),c===!1?"":c??""}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new we(this.defaults);for(let a in n.tokenizer){if(!(a in r))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let o=a,i=n.tokenizer[o],l=r[o];r[o]=(...p)=>{let c=i.apply(r,p);return c===!1&&(c=l.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new Ee;for(let a in n.hooks){if(!(a in r))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let o=a,i=n.hooks[o],l=r[o];Ee.passThroughHooks.has(a)?r[o]=p=>{if(r.options.async&&Ee.passThroughHooksRespectAsync.has(a))return(async()=>{let d=await i.call(r,p);return l.call(r,d)})();let c=i.call(r,p);return l.call(r,c)}:r[o]=(...p)=>{if(r.options.async)return(async()=>{let d=await i.apply(r,p);return d===!1&&(d=await l.apply(r,p)),d})();let c=i.apply(r,p);return c===!1&&(c=l.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,a=n.walkTokens;s.walkTokens=function(o){let i=[];return ee(i,a.call(this,o)),r&&ee(i,r.call(this,o)),i}}this.defaults={...this.defaults,...s}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return F.lex(t,e??this.defaults)}parser(t,e){return W.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let s={...n},r={...this.defaults,...s},a=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return a(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 a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=t),r.async)return(async()=>{let o=r.hooks?await r.hooks.preprocess(e):e,i=await(r.hooks?await r.hooks.provideLexer(t):t?F.lex:F.lexInline)(o,r),l=r.hooks?await r.hooks.processAllTokens(i):i;r.walkTokens&&await Promise.all(this.walkTokens(l,r.walkTokens));let p=await(r.hooks?await r.hooks.provideParser(t):t?W.parse:W.parseInline)(l,r);return r.hooks?await r.hooks.postprocess(p):p})().catch(a);try{r.hooks&&(e=r.hooks.preprocess(e));let o=(r.hooks?r.hooks.provideLexer(t):t?F.lex:F.lexInline)(e,r);r.hooks&&(o=r.hooks.processAllTokens(o)),r.walkTokens&&this.walkTokens(o,r.walkTokens);let i=(r.hooks?r.hooks.provideParser(t):t?W.parse:W.parseInline)(o,r);return r.hooks&&(i=r.hooks.postprocess(i)),i}catch(o){return a(o)}}}onError(t,e){return n=>{if(n.message+=`
72
- Please report this to https://github.com/markedjs/marked.`,t){let s="<p>An error occurred:</p><pre>"+N(n.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(n);throw n}}},he=new St;function A(t,e){return he.parse(t,e)}A.options=A.setOptions=function(t){return he.setOptions(t),A.defaults=he.defaults,hn(A.defaults),A};A.getDefaults=mt;A.defaults=ue;function pr(...t){return he.use(...t),A.defaults=he.defaults,hn(A.defaults),A}A.use=pr;A.walkTokens=function(t,e){return he.walkTokens(t,e)};A.parseInline=he.parseInline;A.Parser=W;A.parser=W.parse;A.Renderer=Qe;A.TextRenderer=vt;A.Lexer=F;A.lexer=F.lex;A.Tokenizer=we;A.Hooks=Ee;A.parse=A;var Oa=A.options,Na=A.setOptions,Ba=A.walkTokens,Da=A.parseInline;var Fa=W.parse,Wa=F.lex;function dr(t,e){let n={type:"footnotes",raw:e,rawItems:[],items:[]};return{name:"footnote",level:"block",childTokens:["content"],tokenizer(s){t.hasFootnotes||(this.lexer.tokens.push(n),t.tokens=this.lexer.tokens,t.hasFootnotes=!0,n.rawItems=[],n.items=[]);let r=/^\[\^([^\]\n]+)\]:(?:[ \t]+|[\n]*?|$)([^\n]*?(?:\n|$)(?:\n*?[ ]{4,}[^\n]*)*)/.exec(s);if(r){let[a,o,i=""]=r,l=i.split(`
73
- `).reduce((d,u)=>d+`
74
- `+u.replace(/^(?:[ ]{4}|[\t])/,""),""),p=l.trimEnd().split(`
75
- `).pop();l+=p&&/^[ \t]*?[>\-*][ ]|[`]{3,}$|^[ \t]*?[|].+[|]$/.test(p)?`
70
+ `}strong({tokens:t}){return`<strong>${this.parser.parseInline(t)}</strong>`}em({tokens:t}){return`<em>${this.parser.parseInline(t)}</em>`}codespan({text:t}){return`<code>${B(t,!0)}</code>`}br(t){return"<br>"}del({tokens:t}){return`<del>${this.parser.parseInline(t)}</del>`}link({href:t,title:e,text:n,tokens:s,autolink:r}){let a=r?B(n,!0):this.parser.parseInline(s),o=Sn(t);if(o===null)return a;t=B(o,r);let i='<a href="'+t+'"';return e&&(i+=' title="'+B(e)+'"'),i+=">"+a+"</a>",i}image({href:t,title:e,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=Sn(t);if(r===null)return B(n);t=r;let a=`<img src="${B(t)}" alt="${B(n)}"`;return e&&(a+=` title="${B(e)}"`),a+=">",a}text(t){return"tokens"in t&&t.tokens?this.parser.parseInline(t.tokens):"escaped"in t&&t.escaped?t.text:B(t.text)}},jt=class{parser;strong({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}em({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}codespan({text:t}){return t}del({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}html({text:t}){return t}text({text:t}){return t}link({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}image({text:t,tokens:e}){return e?this.parser.parseInline(e,this):t}br(){return`
71
+ `}checkbox({raw:t}){return t}},X=class St{options;renderer;textRenderer;constructor(e){this.options=e||ke,this.options.renderer=this.options.renderer||new it,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new jt,this.textRenderer.parser=this}static parse(e,n){return new St(n).parse(e)}static parseInline(e,n){return new St(n).parseInline(e)}parse(e){this.renderer.parser=this;let n="";for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let o=r,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||!["space","hr","heading","code","table","blockquote","list","checkbox","html","def","paragraph","text"].includes(o.type)){n+=i===!1?"":i??"";continue}}let a=r;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let o='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return n}parseInline(e,n=this.renderer){this.renderer.parser=this;let s="";for(let r=0;r<e.length;r++){let a=e[r];if(this.options.extensions?.renderers?.[a.type]){let i=this.options.extensions.renderers[a.type].call({parser:this},a);if(i!==!1||!["escape","html","link","image","checkbox","strong","em","codespan","br","del","text"].includes(a.type)){s+=i===!1?"":i??"";continue}}let o=a;switch(o.type){case"escape":{s+=n.text(o);break}case"html":{s+=n.html(o);break}case"link":{s+=n.link(o);break}case"image":{s+=n.image(o);break}case"checkbox":{s+=n.checkbox(o);break}case"strong":{s+=n.strong(o);break}case"em":{s+=n.em(o);break}case"codespan":{s+=n.codespan(o);break}case"br":{s+=n.br(o);break}case"del":{s+=n.del(o);break}case"text":{s+=n.text(o);break}default:{let i='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return s}},_e=class{options;block;constructor(t){this.options=t||ke}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(t){return t}postprocess(t){return t}processAllTokens(t){return t}emStrongMask(t){return t}provideLexer(t=this.block){return t?G.lex:G.lexInline}provideParser(t=this.block){return t?X.parse:X.parseInline}};function ce(t,e){if(Array.isArray(e))for(let n=0;n<e.length;n++)t.push(e[n]);else t.push(e)}var It=class{defaults=Tt();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=X;Renderer=it;TextRenderer=jt;Lexer=G;Tokenizer=ve;Hooks=_e;constructor(...t){this.use(...t)}walkTokens(t,e){let n=[];for(let s of t)switch(ce(n,e.call(this,s)),s.type){case"table":{let r=s;for(let a of r.header)ce(n,this.walkTokens(a.tokens,e));for(let a of r.rows)for(let o of a)ce(n,this.walkTokens(o.tokens,e));break}case"list":{let r=s;ce(n,this.walkTokens(r.items,e));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(a=>{let o=r[a].flat(1/0);ce(n,this.walkTokens(o,e))}):r.tokens&&ce(n,this.walkTokens(r.tokens,e))}}return n}use(...t){let e=this.defaults.extensions||{renderers:Object.create(null),childTokens:Object.create(null)};return t.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let a=e.renderers[r.name];a?e.renderers[r.name]=function(...o){let i=r.renderer.apply(this,o);return i===!1&&(i=a.apply(this,o)),i}:e.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[r.level];a?a.unshift(r.tokenizer):e[r.level]=[r.tokenizer],r.start&&(r.level==="block"?e.startBlock?e.startBlock.push(r.start):e.startBlock=[r.start]:r.level==="inline"&&(e.startInline?e.startInline.push(r.start):e.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(e.childTokens[r.name]=r.childTokens)}),s.extensions=e),n.renderer){let r=this.defaults.renderer||new it(this.defaults);for(let a in n.renderer){if(!(a in r))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let o=a,i=n.renderer[o],l=r[o];r[o]=(...c)=>{let d=i.apply(r,c);return d===!1&&(d=l.apply(r,c)),d===!1?"":d??""}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new ve(this.defaults);for(let a in n.tokenizer){if(!(a in r))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let o=a,i=n.tokenizer[o],l=r[o];r[o]=(...c)=>{let d=i.apply(r,c);return d===!1&&(d=l.apply(r,c)),d}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new _e;for(let a in n.hooks){if(!(a in r))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let o=a,i=n.hooks[o],l=r[o];_e.passThroughHooks.has(a)?r[o]=c=>{if(r.options.async&&_e.passThroughHooksRespectAsync.has(a))return(async()=>{let p=await i.call(r,c);return l.call(r,p)})();let d=i.call(r,c);return l.call(r,d)}:r[o]=(...c)=>{if(r.options.async)return(async()=>{let p=await i.apply(r,c);return p===!1&&(p=await l.apply(r,c)),p})();let d=i.apply(r,c);return d===!1&&(d=l.apply(r,c)),d}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,a=n.walkTokens;s.walkTokens=function(o){let i=[];return ce(i,a.call(this,o)),r&&ce(i,r.call(this,o)),i}}this.defaults={...this.defaults,...s}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return G.lex(t,e??this.defaults)}parser(t,e){return X.parse(t,e??this.defaults)}parseMarkdown(t){return(e,n)=>{let s={...n},r={...this.defaults,...s},a=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&s.async===!1)return a(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 a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=t),r.async)return(async()=>{let o=r.hooks?await r.hooks.preprocess(e):e,i=await(r.hooks?await r.hooks.provideLexer(t):t?G.lex:G.lexInline)(o,r),l=r.hooks?await r.hooks.processAllTokens(i):i;r.walkTokens&&await Promise.all(this.walkTokens(l,r.walkTokens));let c=await(r.hooks?await r.hooks.provideParser(t):t?X.parse:X.parseInline)(l,r);return r.hooks?await r.hooks.postprocess(c):c})().catch(a);try{r.hooks&&(e=r.hooks.preprocess(e));let o=(r.hooks?r.hooks.provideLexer(t):t?G.lex:G.lexInline)(e,r);r.hooks&&(o=r.hooks.processAllTokens(o)),r.walkTokens&&this.walkTokens(o,r.walkTokens);let i=(r.hooks?r.hooks.provideParser(t):t?X.parse:X.parseInline)(o,r);return r.hooks&&(i=r.hooks.postprocess(i)),i}catch(o){return a(o)}}}onError(t,e){return n=>{if(n.message+=`
72
+ Please report this to https://github.com/markedjs/marked.`,t){let s="<p>An error occurred:</p><pre>"+B(n.message+"",!0)+"</pre>";return e?Promise.resolve(s):s}if(e)return Promise.reject(n);throw n}}},ge=new It;function A(t,e){return ge.parse(t,e)}A.options=A.setOptions=function(t){return ge.setOptions(t),A.defaults=ge.defaults,qn(A.defaults),A};A.getDefaults=Tt;A.defaults=ke;function Dr(...t){return ge.use(...t),A.defaults=ge.defaults,qn(A.defaults),A}A.use=Dr;A.walkTokens=function(t,e){return ge.walkTokens(t,e)};A.parseInline=ge.parseInline;A.Parser=X;A.parser=X.parse;A.Renderer=it;A.TextRenderer=jt;A.Lexer=G;A.lexer=G.lex;A.Tokenizer=ve;A.Hooks=_e;A.parse=A;var So=A.options,To=A.setOptions,Lo=A.walkTokens,Mo=A.parseInline;var Ao=X.parse,Co=G.lex;function Fr(t,e){let n={type:"footnotes",raw:e,rawItems:[],items:[]};return{name:"footnote",level:"block",childTokens:["content"],tokenizer(s){t.hasFootnotes||(this.lexer.tokens.push(n),t.tokens=this.lexer.tokens,t.hasFootnotes=!0,n.rawItems=[],n.items=[]);let r=/^\[\^([^\]\n]+)\]:(?:[ \t]+|[\n]*?|$)([^\n]*?(?:\n|$)(?:\n*?[ ]{4,}[^\n]*)*)/.exec(s);if(r){let[a,o,i=""]=r,l=i.split(`
73
+ `).reduce((p,u)=>p+`
74
+ `+u.replace(/^(?:[ ]{4}|[\t])/,""),""),c=l.trimEnd().split(`
75
+ `).pop();l+=c&&/^[ \t]*?[>\-*][ ]|[`]{3,}$|^[ \t]*?[|].+[|]$/.test(c)?`
76
76
 
77
- `:"";let c={type:"footnote",raw:a,label:o,refs:[],content:this.lexer.blockTokens(l)};return n.rawItems.push(c),c}},renderer(){return""}}}function hr(t){return t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function ur(t,e=!1,n=!1){let s=0;return{name:"footnoteRef",level:"inline",tokenizer(r){let a=/^\[\^([^\]\n]+)\]/.exec(r);if(a){let[o,i]=a,l=this.lexer.tokens[0],p=l.rawItems.filter(k=>k.label===i);if(!p.length)return;let c=p[0],d=l.items.filter(k=>k.label===i)[0],u={type:"footnoteRef",raw:o,index:c.refs.length,id:"",label:i};return d?(u.id=d.refs[0].id,d.refs.push(u)):(s++,u.id=String(s),c.refs.push(u),l.items.push(c)),u}},renderer({index:r,id:a,label:o}){s=0;let i=encodeURIComponent(o),l=n?hr(o):a,p=r>0?`-${r+1}`:"";return`<sup><a id="${t}ref-${i}${p}" href="#${t+i}" data-${t}ref aria-describedby="${t}label">${e?`[${l}]`:l}</a></sup>`}}}function fr(t,e,n,s,r,a){return{name:"footnotes",renderer({raw:o,items:i=[]}){if(i.length===0)return"";let l=i.reduce((u,{label:k,content:g,refs:f})=>{let b=encodeURIComponent(k),v=this.parser.parse(g).trimEnd(),y=v.endsWith("</p>"),m=`<li id="${t+b}">
78
- `;return m+=y?v.replace(/<\/p>$/,""):v,f.forEach((L,E)=>{let C=a.replace("{0}",k),T,O;if(E>0){let ae=E+1;T=`\u21A9<sup>${ae}</sup>`,O=`-${ae}`}else T="\u21A9",O="";m+=` <a href="#${t}ref-${b}${O}" data-${t}backref aria-label="${C}">${T}</a>`}),m+=y?`</p>
77
+ `:"";let d={type:"footnote",raw:a,label:o,refs:[],content:this.lexer.blockTokens(l)};return n.rawItems.push(d),d}},renderer(){return""}}}function Ur(t){return t.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Wr(t,e=!1,n=!1){let s=0;return{name:"footnoteRef",level:"inline",tokenizer(r){let a=/^\[\^([^\]\n]+)\]/.exec(r);if(a){let[o,i]=a,l=this.lexer.tokens[0],c=l.rawItems.filter(f=>f.label===i);if(!c.length)return;let d=c[0],p=l.items.filter(f=>f.label===i)[0],u={type:"footnoteRef",raw:o,index:d.refs.length,id:"",label:i};return p?(u.id=p.refs[0].id,p.refs.push(u)):(s++,u.id=String(s),d.refs.push(u),l.items.push(d)),u}},renderer({index:r,id:a,label:o}){s=0;let i=encodeURIComponent(o),l=n?Ur(o):a,c=r>0?`-${r+1}`:"";return`<sup><a id="${t}ref-${i}${c}" href="#${t+i}" data-${t}ref aria-describedby="${t}label">${e?`[${l}]`:l}</a></sup>`}}}function Zr(t,e,n,s,r,a){return{name:"footnotes",renderer({raw:o,items:i=[]}){if(i.length===0)return"";let l=i.reduce((u,{label:f,content:g,refs:m})=>{let w=encodeURIComponent(f),v=this.parser.parse(g).trimEnd(),y=v.endsWith("</p>"),k=`<li id="${t+w}">
78
+ `;return k+=y?v.replace(/<\/p>$/,""):v,m.forEach((S,C)=>{let q=a.replace("{0}",f),j,N;if(C>0){let E=C+1;j=`\u21A9<sup>${E}</sup>`,N=`-${E}`}else j="\u21A9",N="";k+=` <a href="#${t}ref-${w}${N}" data-${t}backref aria-label="${q}">${j}</a>`}),k+=y?`</p>
79
79
  `:`
80
- `,m+=`</li>
81
- `,u+m},""),p="";n&&(p+=`<hr data-${e}footnotes>
82
- `);let c="";s&&(c=` class="${s}"`);let d="";return r&&(d=` class="${r}"`),p+=`<section${c} data-${e}footnotes>
83
- `,p+=`<h2 id="${t}label"${d}>${o.trimEnd()}</h2>
84
- `,p+=`<ol>
80
+ `,k+=`</li>
81
+ `,u+k},""),c="";n&&(c+=`<hr data-${e}footnotes>
82
+ `);let d="";s&&(d=` class="${s}"`);let p="";return r&&(p=` class="${r}"`),c+=`<section${d} data-${e}footnotes>
83
+ `,c+=`<h2 id="${t}label"${p}>${o.trimEnd()}</h2>
84
+ `,c+=`<ol>
85
85
  ${l}</ol>
86
- `,p+=`</section>
87
- `,p}}}function yn(t={}){let{prefixId:e="footnote-",prefixData:n="",description:s="Footnotes",refMarkers:r=!1,footnoteDivider:a=!1,keepLabels:o=!1,sectionClass:i="footnotes",headingClass:l="sr-only",backRefLabel:p="Back to reference {0}"}=t,c={hasFootnotes:!1,tokens:[]};return{extensions:[dr(c,s),ur(e,r,o),fr(e,n,a,i,l,p)],walkTokens(d){d.type==="footnotes"&&c.tokens.indexOf(d)===0&&d.items.length&&(c.tokens[0]={type:"space",raw:""},c.tokens.push(d)),c.hasFootnotes&&(c.hasFootnotes=!1)}}}var mr="abstract any as async await boolean break case catch class const constructor continue debugger declare default delete do else enum export extends false finally for from function get if implements import in infer instanceof interface is keyof let module namespace never new null number object of package private protected public readonly require return satisfies set static string super switch symbol this throw true try type typeof undefined unique unknown var void while with yield",gr="auto bool break case char class const constexpr continue default delete do double else enum explicit extern false float for friend goto if inline int long namespace new nullptr operator private protected public register return short signed sizeof static struct switch template this throw true try typedef typename union unsigned using virtual void volatile while include define ifdef ifndef endif pragma",kr="abstract as base bool boolean break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extends extern false final finally fixed float for foreach goto if implicit implements import in int interface internal is lock long namespace new null object operator out override package params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct super switch synchronized this throw throws true try typeof uint ulong unchecked unsafe ushort using var virtual void volatile while async await get set record yield",br="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 nil true false iota string int bool error byte rune float64 int64 uint",wr="as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while i32 i64 u8 u32 u64 usize f32 f64 bool str String Vec Option Some None Result Ok Err",xr="and as assert async await break class continue def del elif else except False finally for from global if import in is lambda None nonlocal not or pass raise return True try while with yield self print match case",$r="if then else elif fi for while until do done case esac in function return local export source alias echo exit set unset readonly shift trap cd test true false",yr="alias and begin break case class def defined do else elsif end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield require attr_accessor",vr="select from where and or not insert into values update set delete create table index view drop alter add primary key foreign references join left right inner outer on group by order asc desc limit offset having as distinct union all null is in like between case when then else end exists default unique check constraint begin commit rollback with returning integer text varchar boolean",Sr="and break do else elseif end false for function goto if in local nil not or repeat return then true until while",Lr="begin break catch class continue data do dynamicparam else elseif end exit filter finally for foreach from function if in param process return switch throw trap try until using while",Tr="important media import supports keyframes font-face from to and not only screen print",_=t=>new Set(t.split(" ")),vn={js:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:_(mr),regex:!0},c:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:_(gr),pre:!0},cs:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:_(kr),at:!0},go:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:_(br)},rs:{line:"//",block:["/*","*/"],quotes:['"'],kw:_(wr)},py:{line:"#",quotes:['"""',"'''",'"',"'"],kw:_(xr),at:!0},sh:{line:"#",quotes:['"',"'"],kw:_($r),vars:!0},rb:{line:"#",quotes:['"',"'"],kw:_(yr)},yaml:{line:"#",quotes:['"',"'"],kw:_("true false null yes no on off"),keys:!0},toml:{line:"#",quotes:['"""','"',"'"],kw:_("true false"),keys:!0},ini:{line:";",alt:"#",quotes:['"'],kw:_("true false"),keys:!0},sql:{line:"--",block:["/*","*/"],quotes:["'",'"'],kw:_(vr),nocase:!0},lua:{line:"--",quotes:['"',"'"],kw:_(Sr)},ps:{line:"#",block:["<#","#>"],quotes:['"',"'"],kw:_(Lr),vars:!0,nocase:!0},css:{block:["/*","*/"],quotes:['"',"'"],kw:_(Tr),css:!0},json:{line:"//",block:["/*","*/"],quotes:['"'],kw:_("true false null")},md:{md:!0},html:{html:!0}},Mr={js:"js",mjs:"js",cjs:"js",jsx:"js",ts:"js",mts:"js",cts:"js",tsx:"js",vue:"html",svelte:"html",astro:"html",c:"c",h:"c",cpp:"c",cc:"c",hpp:"c",cxx:"c",m:"c",glsl:"c",frag:"c",vert:"c",wgsl:"rs",hlsl:"c",shader:"c",cs:"cs",java:"cs",kt:"cs",kts:"cs",scala:"cs",swift:"cs",dart:"cs",groovy:"cs",gradle:"cs",php:"cs",go:"go",rs:"rs",zig:"rs",py:"py",pyi:"py",ipy:"py",r:"py",jl:"py",nim:"py",sh:"sh",bash:"sh",zsh:"sh",fish:"sh",env:"sh",dockerfile:"sh",makefile:"sh",mk:"sh",cmake:"sh",gitignore:"sh",npmrc:"ini",editorconfig:"ini",rb:"rb",rake:"rb",gemspec:"rb",pl:"rb",ex:"rb",exs:"rb",cr:"rb",yml:"yaml",yaml:"yaml",toml:"toml",ini:"ini",cfg:"ini",conf:"ini",properties:"ini",sql:"sql",lua:"lua",ps1:"ps",psm1:"ps",psd1:"ps",css:"css",scss:"css",sass:"css",less:"css",styl:"css",json:"json",jsonc:"json",json5:"json",webmanifest:"json",map:"json",lock:"json",har:"json",ipynb:"json",geojson:"json",gltf:"json",md:"md",markdown:"md",mdx:"md",html:"html",htm:"html",xml:"html",svg:"html",xhtml:"html",plist:"html",csproj:"html",xaml:"html"};function Ar(t){let e=t.toLowerCase();if(e==="dockerfile"||e==="makefile"||e.startsWith(".env")||e===".gitignore"||e===".gitattributes"||e===".dockerignore")return"sh";let n=e.includes(".")?e.slice(e.lastIndexOf(".")+1):"";return Mr[n]||""}var X=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Lt=new Map;function Rr(t){if(Lt.has(t))return Lt.get(t);let e=vn[t],n=[];e.block&&n.push(`${X(e.block[0])}[\\s\\S]*?(?:${X(e.block[1])}|$)`),e.line&&n.push(`${X(e.line)}[^\\n]*`),e.alt&&n.push(`${X(e.alt)}[^\\n]*`);let s=(e.quotes||[]).map(o=>o.length===3?`${X(o)}[\\s\\S]*?(?:${X(o)}|$)`:o==="`"?"`(?:\\\\[\\s\\S]|[^`\\\\])*`?":`${X(o)}(?:\\\\.|[^${X(o)}\\\\\\n])*${X(o)}?`),r=[];n.length&&r.push(`(?<com>${n.join("|")})`),s.length&&r.push(`(?<str>${s.join("|")})`),e.vars&&r.push("(?<var>\\$\\{?[\\w@#?*!-]+\\}?)"),(e.at||t==="js")&&r.push("(?<at>@[\\w.]+)"),e.css?r.push("(?<at>@[\\w-]+)|(?<num>#[\\da-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:px|em|rem|vh|vw|%|s|ms|deg|fr|ch)?\\b)|(?<key>[\\w-]+(?=\\s*:[^:]))|(?<word>[\\w-]+)"):(r.push("(?<num>\\b(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?)[nlLfFuU]*\\b)"),e.pre&&r.push("(?<pre>^\\s*#\\s*\\w+)"),r.push("(?<word>[A-Za-z_$][\\w$]*)"));let a=new RegExp(r.join("|"),"gm");return Lt.set(t,a),a}function Sn(t,e){let n=Ar(e);if(!n)return jr(t);if(n==="md")return Ir(t);if(n==="html")return zr(t);let s=vn[n],r=Rr(n),a=[],o=0;r.lastIndex=0;let i;for(;i=r.exec(t);){if(i[0]===""){r.lastIndex++;continue}i.index>o&&a.push(["",t.slice(o,i.index)]);let l=i.groups,p="";if(l.com)p="com";else if(l.str)p=/^\s*:/.test(t.slice(r.lastIndex,r.lastIndex+3))&&!s.css?"key":"str";else if(l.num)p="num";else if(l.at)p="at";else if(l.var)p="var";else if(l.pre)p="kw";else if(l.key)p="key";else if(l.word){let c=l.word,d=t.slice(r.lastIndex,r.lastIndex+2);qr.has(c)?p="lit":s.kw.has(s.nocase?c.toLowerCase():c)?p="kw":s.keys&&/^\s*[:=]/.test(d)&&Er(t,i.index)?p="key":s.css?p="":d[0]==="("?p="fn":/^[A-Z][a-z0-9]/.test(c)&&n!=="sql"?p="type":/^[A-Z][A-Z0-9_]+$/.test(c)&&c.length>1&&(p="const")}a.push([p,i[0]]),o=r.lastIndex}return o<t.length&&a.push(["",t.slice(o)]),Ln(a)}function Er(t,e){let n=t.lastIndexOf(`
88
- `,e-1)+1;return/^[\s-]*$/.test(t.slice(n,e))}var Cr={com:"comment",str:"string",num:"number",const:"number",kw:"keyword",lit:"literal",pre:"keyword"},qr=new Set(["true","false","null","undefined","None","True","False","nil","NaN","Infinity"]);function Ln(t){let e=[""];for(let[n,s]of t){let r=Cr[n]||"";s.split(`
89
- `).forEach((o,i)=>{i>0&&e.push(""),o&&(e[e.length-1]+=r?`<span class="tok-${r}">${h(o)}</span>`:h(o))})}return e.map(n=>n.replace(/\r/g,""))}var jr=t=>t.replace(/\r/g,"").split(`
90
- `).map(h);function Ir(t){let e=!1;return t.replace(/\r/g,"").split(`
91
- `).map(n=>/^\s*(```|~~~)/.test(n)?(e=!e,`<span class="tok-comment">${h(n)}</span>`):e?`<span class="tok-string">${h(n)}</span>`:/^#{1,6} /.test(n)?`<span class="tok-keyword">${h(n)}</span>`:/^\s*>/.test(n)?`<span class="tok-comment">${h(n)}</span>`:h(n).replace(/^(\s*)([-*+]|\d+\.)(\s)/,'$1<span class="tok-number">$2</span>$3').replace(/`[^`]+`/g,s=>`<span class="tok-string">${s}</span>`).replace(/\[[^\]]*\]\([^)]*\)/g,s=>`<span class="tok-keyword">${s}</span>`))}function zr(t){let e=/(?<com><!--[\s\S]*?(?:-->|$))|(?<tag><\/?[A-Za-z][\w:.-]*|\/?>)|(?<attr>[\w:@.#-]+(?=\s*=))|(?<str>"[^"]*"?|'[^']*'?)|(?<ent>&[#\w]+;)/g,n=[],s=0,r=!1,a;for(;a=e.exec(t);){a.index>s&&n.push(["",t.slice(s,a.index)]);let o=a.groups,i="";o.com?i="com":o.tag?(i="kw",r=!o.tag.endsWith(">")):o.attr?i=r?"key":"":o.str?i=r?"str":"":o.ent&&(i="num"),n.push([i,a[0]]),s=e.lastIndex}return s<t.length&&n.push(["",t.slice(s)]),Ln(n)}var En={name:"folderview-scopes",type:"light",fg:"#000000",bg:"#ffffff",settings:[]},_r=[["comment","comment"],["punctuation.definition.comment","comment"],["string","string"],["punctuation.definition.string","string"],["constant.numeric","number"],["constant.language","literal"],["support.constant","literal"],["constant.character","literal"],["keyword.operator","plain"],["keyword","keyword"],["storage","keyword"],["markup.heading","keyword"],["markup.inline.raw","string"],["markup.fenced_code","string"],["entity.name.tag","keyword"]];function Hr(t){for(let e=t.length-1;e>=0;e--){let n=t[e],s=_r.find(([r])=>n===r||n.startsWith(r+"."));if(s)return s[1]}return"plain"}var Tn={dockerfile:"docker",makefile:"make","cmakelists.txt":"cmake",".gitignore":"shellscript",".dockerignore":"shellscript",".npmrc":"ini",".editorconfig":"ini",".prettierrc":"json",".eslintrc":"json","tsconfig.json":"jsonc","jsconfig.json":"jsonc",".babelrc":"json",gemfile:"ruby",rakefile:"ruby",jenkinsfile:"groovy",caddyfile:"shellscript"},Mn={h:"c",hpp:"cpp",cc:"cpp",cxx:"cpp",cs:"csharp",kt:"kotlin",kts:"kotlin",rs:"rust",py:"python",pyi:"python",rb:"ruby",sh:"shellscript",bash:"shellscript",zsh:"shellscript",env:"dotenv",ps1:"powershell",psm1:"powershell",psd1:"powershell",yml:"yaml",md:"markdown",mdx:"mdx",htm:"html",xhtml:"html",svg:"xml",plist:"xml",csproj:"xml",xaml:"xml",ipynb:"json",gltf:"json",webmanifest:"json",geojson:"json",map:"json",har:"json",jl:"julia",ex:"elixir",exs:"elixir",erl:"erlang",hs:"haskell",ml:"ocaml",fs:"fsharp",clj:"clojure",tf:"terraform",hcl:"hcl",vert:"glsl",frag:"glsl",wgsl:"wgsl",mjs:"javascript",cjs:"javascript",mts:"typescript",cts:"typescript",conf:"ini",cfg:"ini",properties:"properties",mmd:"mermaid",mermaid:"mermaid",gradle:"groovy",txt:"",log:"log",lock:""};function ye(t){let e=t.toLowerCase().slice(t.lastIndexOf("/")+1);if(Tn[e])return Tn[e];if(e.startsWith(".env"))return"dotenv";if(e.startsWith("dockerfile"))return"docker";let n=e.includes(".")?e.slice(e.lastIndexOf(".")+1):"";return n in Mn?Mn[n]:n}var An,Pr,Mt,At=new Set,Tt=new Map,Or=()=>Pr??=import("./chunks/langs-GO3UQR4H.js").then(({bundledLanguages:t,bundledLanguagesAlias:e})=>new Map([...Object.entries(e),...Object.entries(t)]));async function Nr(t){let e=(await Or()).get(t);if(!e)return!1;An??=Promise.all([import("./chunks/core-BRBMZSD2.js"),import("./chunks/engine-javascript-DNHSF67B.js")]).then(([{createHighlighterCore:s},{createJavaScriptRegexEngine:r}])=>s({themes:[En],langs:[],engine:r({forgiving:!0})}));let n=await An;return await n.loadLanguage(e),Mt=n,At.add(t),!0}function Ie(t){let e=ye(t);return e?At.has(e)?Promise.resolve(!0):(Tt.has(e)||Tt.set(e,Nr(e).catch(()=>!1)),Tt.get(e)):Promise.resolve(!1)}var Br=4e5,Rn=8e3;function ve(t,e){let n=ye(e);if(n&&At.has(n)&&t.length<Br){let s=Dr(t,n);if(s)return s}return Sn(t,e)}function Dr(t,e){if(Mt&&!(t.split(`
92
- `,Rn+1).length>Rn))try{return Mt.codeToTokensBase(t.replace(/\r\n?/g,`
93
- `),{lang:e,theme:En.name,includeExplanation:"scopeName"}).map(s=>{let r="",a="plain",o="",i=()=>{o&&(r+=a==="plain"?h(o):`<span class="tok-${a}">${h(o)}</span>`,o="")};for(let l of s){let p=l.explanation??[{content:l.content,scopes:[]}];for(let c of p){let d=Hr(c.scopes.map(u=>u.scopeName));d!==a&&(i(),a=d),o+=c.content}}return i(),r})}catch{return}}var Fr=/<svg\b[^>]*>/,Wr=/viewBox="\s*[-\d.]+[\s,]+[-\d.]+[\s,]+([\d.]+)[\s,]+([\d.]+)\s*"/,Ur=/\s(?:width|height)="[^"]*"/g;function Zr(t){let e=Fr.exec(t)?.[0],n=e&&Wr.exec(e);return!e||!n?t:t.replace(e,e.replace(Ur,"").replace(/^<svg/,`<svg width="${n[1]}" height="${n[2]}"`))}function Vr(t,e,n){e.style.color=`var(${n})`,t.clearRect(0,0,1,1),t.fillStyle=getComputedStyle(e).color,t.fillRect(0,0,1,1);let[s,r,a,o]=t.getImageData(0,0,1,1).data;return o===0?void 0:"#"+[s,r,a].map(i=>i.toString(16).padStart(2,"0")).join("")}function Kr(){let t=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});if(!t)return;let e=document.createElement("span");document.body.append(e);try{let[n,s,r,a,o,i]=["--bg","--surface-2","--border-strong","--text","--text-dim","--accent"].map(p=>Vr(t,e,p)),l=getComputedStyle(document.documentElement).getPropertyValue("--font").trim();return!n||!s||!r||!a||!o||!i?void 0:{font:l,background:n,surface:s,border:r,text:a,muted:o,accent:i}}finally{e.remove()}}function Gr(t,e){return{theme:"base",fontFamily:t.font,themeVariables:{darkMode:e,fontFamily:t.font,fontSize:"14px",background:t.background,primaryColor:t.surface,primaryBorderColor:t.border,primaryTextColor:t.text,secondaryColor:t.surface,secondaryBorderColor:t.border,secondaryTextColor:t.text,tertiaryColor:t.background,tertiaryBorderColor:t.border,tertiaryTextColor:t.text,mainBkg:t.surface,nodeBorder:t.border,nodeTextColor:t.text,lineColor:t.muted,textColor:t.text,clusterBkg:t.background,clusterBorder:t.border,edgeLabelBackground:t.background,titleColor:t.text,noteBkgColor:t.surface,noteBorderColor:t.accent,noteTextColor:t.text,actorBorder:t.border,actorBkg:t.surface}}}var Cn,qn=Promise.resolve(),jn=0,Qr=()=>matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.dataset.theme!=="light":document.documentElement.dataset.theme==="dark";function Xr(t){let e=qn.then(async()=>{Cn??=import("./chunks/mermaid.core-SQMPMUDN.js").then(a=>a.default);let n=await Cn,s=Kr(),r=Qr();n.initialize({startOnLoad:!1,securityLevel:"strict",...s?Gr(s,r):{theme:r?"dark":"default"}});try{let{svg:a}=await n.render(`folderview-diagram-${++jn}`,t);return{ok:!0,svg:Zr(a)}}catch(a){return document.getElementById(`dfolderview-diagram-${jn}`)?.remove(),{ok:!1,problem:a instanceof Error?a.message:String(a)}}});return qn=e.catch(()=>{}),e}async function Xe(t,e){t.innerHTML='<div class="skeleton" style="width:60%;height:120px"></div>';let n=await Xr(e);if(!n.ok){t.innerHTML=`<p class="problem">This diagram couldn't be drawn: ${Jr(n.problem)}</p>`;return}let s=URL.createObjectURL(new Blob([n.svg],{type:"image/svg+xml"})),r=document.createElement("img");r.src=s,r.alt="Diagram",r.onclick=()=>window.open(s,"_blank","noopener"),r.onload=()=>{let a=t.clientWidth-26,o=r.naturalWidth;o>a&&(r.style.width=(o<=a*1.8?a:Math.round(o*.6))+"px")},t.replaceChildren(r)}var Jr=t=>String(t).replace(/[&<>]/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;"})[e]);var In={menu:'<path d="M4 6h16M4 12h16M4 18h16"/>',x:'<path d="M18 6 6 18M6 6l12 12"/>',"chevron-left":'<path d="m15 18-6-6 6-6"/>',"chevron-right":'<path d="m9 18 6-6-6-6"/>',"chevron-down":'<path d="m6 9 6 6 6-6"/>',check:'<path d="M20 6 9 17l-5-5"/>',plus:'<path d="M12 5v14M5 12h14"/>',search:'<circle cx="11" cy="11" r="7"/><path d="m20 20-3.6-3.6"/>',settings:'<path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/>',chat:'<path d="M21 12a8 8 0 0 1-11.6 7.14L4 20.5l1.36-4.9A8 8 0 1 1 21 12z"/>',sun:'<circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>',moon:'<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"/>',monitor:'<rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/>',copy:'<rect x="8" y="8" width="14" height="14" rx="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',external:'<path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',wrap:'<path d="M3 6h18M3 12h15a3 3 0 1 1 0 6h-4"/><path d="m16 16-2 2 2 2M3 18h7"/>',refresh:'<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/>',clock:'<circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/>',trash:'<path d="M3 6h18M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/>',edit:'<path d="M12 20h9"/><path d="M16.38 3.62a1 1 0 0 1 3 3L7.37 18.64a2 2 0 0 1-.86.5l-2.87.84a.5.5 0 0 1-.62-.62l.84-2.87a2 2 0 0 1 .5-.86z"/>',link:'<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/>',file:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21"/>',grid:'<rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/>',list:'<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>',folder:'<path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2z"/>',table:'<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M3 15h18M9 3v18"/>',code:'<path d="m16 18 6-6-6-6M8 6l-6 6 6 6"/>',download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/>',eye:'<path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z"/><circle cx="12" cy="12" r="3"/>',filter:'<path d="M22 3H2l8 9.46V19l4 2v-8.54z"/>',sort:'<path d="m3 16 4 4 4-4M7 20V4M21 8l-4-4-4 4M17 4v16"/>',book:'<path d="M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>',hash:'<path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/>',braces:'<path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',reply:'<path d="m9 17-5-5 5-5"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/>',music:'<path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/>',video:'<rect x="2" y="6" width="14" height="12" rx="2"/><path d="m22 8-6 4 6 4z"/>',warning:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4M12 17h.01"/>',info:'<circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/>',more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',layers:'<path d="m12 2 10 5-10 5L2 7z"/><path d="m2 17 10 5 10-5M2 12l10 5 10-5"/>',tree:'<path d="M6 3v12"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/>',"git-branch":'<circle cx="6" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="8" r="3"/><path d="M6 9v6M18 11a6 6 0 0 1-6 6H9"/>',diff:'<path d="M12 3v14M5 10h14M5 21h14"/>',"folder-open":'<path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"/>'},$=(t,e=18)=>`<svg class="i" width="${e}" height="${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${In[t]||In.file}</svg>`;function Rt(t,e,n=e||"text"){let s="x."+(e||"txt"),r=ve(t.replace(/\n$/,""),s);return`<figure class="ui-code" data-lang="${h(e)}"><figcaption class="cbar"><span class="caption">${h(n)}</span><span class="ctools"><button class="icon-btn" data-cb="wrap" title="Wrap long lines" aria-label="Wrap long lines">${$("wrap",16)}</button><button class="icon-btn" data-cb="copy" title="Copy code" aria-label="Copy code">${$("copy",16)}</button></span></figcaption><pre class="code" tabindex="0"><code>${r.join(`
94
- `)}</code></pre><textarea hidden>${h(t)}</textarea></figure>`}var zn={name:"mathBlock",level:"block",start:t=>t.match(/^\$\$/m)?.index,tokenizer(t){let e=/^\$\$[ \t]*\n?([\s\S]+?)\n?[ \t]*\$\$[ \t]*(?:\n+|$)/.exec(t);if(e)return{type:"mathBlock",raw:e[0],text:e[1].trim()}},renderer:t=>`<div class="md-math-wrap"><div class="md-math md-math-block" data-tex="${encodeURIComponent(t.text)}">${h(t.text)}</div></div>
95
- `},Yr={name:"mathInline",level:"inline",start:t=>t.indexOf("$"),tokenizer(t){let e=new RegExp("^\\$(?![\\s$])((?:\\\\.|[^\\\\$\\n])+?)(?<![\\s\\\\])\\$(?![\\d$])").exec(t);if(e)return{type:"mathInline",raw:e[0],text:e[1]}},renderer:t=>`<span class="md-math" data-tex="${encodeURIComponent(t.text)}">${h(t.text)}</span>`},_n=()=>{let t=new Map;return e=>{let n=e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-")||"section",s=t.get(n)||0;return t.set(n,s+1),s?`${n}-${s}`:n}};function ea(){let t=_n(),e=new St({gfm:!0});return e.use(yn({description:"Footnotes"})),e.use({extensions:[zn,Yr],hooks:{preprocess(n){return t=_n(),n}},renderer:{code({text:n,lang:s}){let r=(s||"").trim().split(/\s+/)[0].toLowerCase();return r==="mermaid"?`<div class="md-diagram" data-diagram="${encodeURIComponent(n)}"></div>`:r==="math"||r==="latex"||r==="tex"?zn.renderer({text:n}):Rt(n,r)},heading({tokens:n,depth:s}){let r=this.parser.parseInline(n),a=t(r);return`<h${s} id="${a}">${r}<a class="anchor" href="#" data-anchor="${a}" aria-label="Link to this section">#</a></h${s}>
96
- `}}}),e}var ta=ea();function na(t){let e=/^---\r?\n([\s\S]*?)\r?\n---\r?\n/.exec(t);if(!e)return{body:t,front:""};let n=e[1].split(/\r?\n/).map(s=>/^([\w.-]+):\s*(.*)$/.exec(s)).filter(Boolean).map(([,s,r])=>`<tr><td>${h(s)}</td><td>${h(r)}</td></tr>`).join("");return{body:t.slice(e[0].length),front:n?`<div class="md-table front"><table>${n}</table></div>`:""}}var sa={NOTE:["note","info"],TIP:["tip","sparkles"],IMPORTANT:["important","warning"],WARNING:["warning","warning"],CAUTION:["caution","warning"]};function Se(t,e,n){let{body:s,front:r}=na(e),a=Gt.sanitize(r+ta.parse(s),{ADD_ATTR:["target","data-anchor","data-diagram","data-tex","data-lang","data-cb"],FORBID_TAGS:["style","form"],FORBID_ATTR:["style"]});t.innerHTML=a,ra(t,n)}function ra(t,e){for(let s of t.querySelectorAll("table")){if(s.parentElement?.classList.contains("md-table"))continue;let r=document.createElement("div");r.className="md-table",s.replaceWith(r),r.append(s)}for(let s of t.querySelectorAll("a[href]")){if(s.dataset.anchor)continue;let r=s.getAttribute("href")||"";if(/^(https?:|mailto:|tel:)/i.test(r))s.target="_blank",s.rel="noopener noreferrer";else if(r.startsWith("#"))s.dataset.anchor=decodeURIComponent(r.slice(1)),s.setAttribute("href","#");else if(/^[a-z][a-z0-9+.-]*:/i.test(r))s.removeAttribute("href");else{let[a,o=""]=r.split("#"),i=ct(a.startsWith("/")?a:z(e,decodeURIComponent(a))),l=/^L(\d+)(?:-L?(\d+))?/.exec(o);a.endsWith("/")||!a?s.setAttribute("href",le({folder:i})):s.setAttribute("href",P(i,l?{line:l[2]?`${l[1]}-${l[2]}`:l[1]}:{}))}}for(let s of t.querySelectorAll("img[src]")){let r=s.getAttribute("src")||"";/^(https?:|data:image\/|blob:)/i.test(r)||(s.src=V(ct(r.startsWith("/")?r:z(e,decodeURIComponent(r))))),s.loading="lazy"}for(let s of t.querySelectorAll("blockquote")){let r=s.querySelector("p"),a=r&&/^\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*/i.exec(r.innerHTML);if(!a)continue;let[o,i]=sa[a[1].toUpperCase()];r.innerHTML=r.innerHTML.slice(a[0].length).replace(/^<br>\s*/,""),!r.textContent.trim()&&!r.querySelector("img")&&r.remove(),s.classList.add("alert",o),s.insertAdjacentHTML("afterbegin",`<div class="alert-title">${$(i,16)}${a[1][0].toUpperCase()+a[1].slice(1).toLowerCase()}</div>`)}for(let s of t.querySelectorAll("[data-diagram]"))Xe(s,decodeURIComponent(s.dataset.diagram));let n=t.querySelectorAll("[data-tex]");n.length&&import("./chunks/temml-ISNSX3VV.js").then(({default:s})=>{for(let r of n)try{r.innerHTML=s.renderToString(decodeURIComponent(r.dataset.tex),{displayMode:r.classList.contains("md-math-block"),throwOnError:!1})}catch{}}),aa(t)}function aa(t){for(let e of t.querySelectorAll("figure.ui-code[data-lang]")){let n=e.dataset.lang;n&&Ie("x."+n).then(s=>{if(!s||!e.isConnected)return;let r=e.querySelector("textarea")?.value??"";e.querySelector("code").innerHTML=ve(r.replace(/\n$/,""),"x."+n).join(`
97
- `)})}}document.addEventListener("click",t=>{let e=t.target.closest("[data-cb]");if(e){let s=e.closest(".ui-code");if(e.dataset.cb==="wrap")s.classList.toggle("wrapped"),e.classList.toggle("on",s.classList.contains("wrapped"));else if(e.dataset.cb==="copy"){let r=s.querySelector("textarea")?.value??s.querySelector("code")?.textContent??"";D(r,"Code copied").then(()=>{e.innerHTML=$("check",16),e.classList.add("copied"),setTimeout(()=>{e.innerHTML=$("copy",16),e.classList.remove("copied")},1600)})}return}let n=t.target.closest("a[data-anchor]");if(n){t.preventDefault();let s=n.closest(".md")||document,r=n.dataset.anchor;(s.querySelector("#"+CSS.escape(r))||s.querySelector(`[id="user-content-${CSS.escape(r)}"]`)||document.getElementById(r))?.scrollIntoView({behavior:"smooth",block:"start"})}});function Et(t,e){let n=document.createElement("div");return Se(n,t,e),n.innerHTML}var oa=t=>t.line?t.endLine?`L${t.line}\u2013${t.endLine}`:`L${t.line}`:"File";async function Je(){await Ae(),K("comments")}function ze(t,e){let n=(t.replies||[]).map(a=>`<div class="reply"><div class="cmt-head"><b>${h(a.author)}</b><span class="faint">${J(Date.parse(a.at))}</span></div><div class="cmt-body md">${Et(a.body,e)}</div></div>`).join(""),s=t.status==="resolved",r=x.info.readOnly;return`<div class="cmt${s?" resolved":""}" data-cid="${h(t.id)}">
98
- <div class="cmt-head"><b>${h(t.author||"reviewer")}</b><span class="faint">${J(Date.parse(t.createdAt))}</span>${s?'<span class="pill ok">Resolved</span>':""}
99
- ${r?"":`<span class="cmt-acts"><button class="mini" data-cact="${s?"reopen":"resolve"}" title="${s?"Reopen":"Resolve"}">${s?$("undo",14)+" Reopen":$("check",14)+" Resolve"}</button><button class="mini" data-cact="edit" title="Edit" aria-label="Edit">${$("edit",14)}</button><button class="mini" data-cact="delete" title="Delete" aria-label="Delete">${$("trash",14)}</button></span>`}</div>
100
- <div class="cmt-body md">${Et(t.body,e)}</div>
86
+ `,c+=`</section>
87
+ `,c}}}function Nn(t={}){let{prefixId:e="footnote-",prefixData:n="",description:s="Footnotes",refMarkers:r=!1,footnoteDivider:a=!1,keepLabels:o=!1,sectionClass:i="footnotes",headingClass:l="sr-only",backRefLabel:c="Back to reference {0}"}=t,d={hasFootnotes:!1,tokens:[]};return{extensions:[Fr(d,s),Wr(e,r,o),Zr(e,n,a,i,l,c)],walkTokens(p){p.type==="footnotes"&&d.tokens.indexOf(p)===0&&p.items.length&&(d.tokens[0]={type:"space",raw:""},d.tokens.push(p)),d.hasFootnotes&&(d.hasFootnotes=!1)}}}var Kr="abstract any as async await boolean break case catch class const constructor continue debugger declare default delete do else enum export extends false finally for from function get if implements import in infer instanceof interface is keyof let module namespace never new null number object of package private protected public readonly require return satisfies set static string super switch symbol this throw true try type typeof undefined unique unknown var void while with yield",Vr="auto bool break case char class const constexpr continue default delete do double else enum explicit extern false float for friend goto if inline int long namespace new nullptr operator private protected public register return short signed sizeof static struct switch template this throw true try typedef typename union unsigned using virtual void volatile while include define ifdef ifndef endif pragma",Gr="abstract as base bool boolean break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extends extern false final finally fixed float for foreach goto if implicit implements import in int interface internal is lock long namespace new null object operator out override package params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct super switch synchronized this throw throws true try typeof uint ulong unchecked unsafe ushort using var virtual void volatile while async await get set record yield",Xr="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 nil true false iota string int bool error byte rune float64 int64 uint",Qr="as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while i32 i64 u8 u32 u64 usize f32 f64 bool str String Vec Option Some None Result Ok Err",Jr="and as assert async await break class continue def del elif else except False finally for from global if import in is lambda None nonlocal not or pass raise return True try while with yield self print match case",Yr="if then else elif fi for while until do done case esac in function return local export source alias echo exit set unset readonly shift trap cd test true false",ea="alias and begin break case class def defined do else elsif end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield require attr_accessor",ta="select from where and or not insert into values update set delete create table index view drop alter add primary key foreign references join left right inner outer on group by order asc desc limit offset having as distinct union all null is in like between case when then else end exists default unique check constraint begin commit rollback with returning integer text varchar boolean",na="and break do else elseif end false for function goto if in local nil not or repeat return then true until while",sa="begin break catch class continue data do dynamicparam else elseif end exit filter finally for foreach from function if in param process return switch throw trap try until using while",ra="important media import supports keyframes font-face from to and not only screen print",P=t=>new Set(t.split(" ")),Bn={js:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:P(Kr),regex:!0},c:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:P(Vr),pre:!0},cs:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:P(Gr),at:!0},go:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:P(Xr)},rs:{line:"//",block:["/*","*/"],quotes:['"'],kw:P(Qr)},py:{line:"#",quotes:['"""',"'''",'"',"'"],kw:P(Jr),at:!0},sh:{line:"#",quotes:['"',"'"],kw:P(Yr),vars:!0},rb:{line:"#",quotes:['"',"'"],kw:P(ea)},yaml:{line:"#",quotes:['"',"'"],kw:P("true false null yes no on off"),keys:!0},toml:{line:"#",quotes:['"""','"',"'"],kw:P("true false"),keys:!0},ini:{line:";",alt:"#",quotes:['"'],kw:P("true false"),keys:!0},sql:{line:"--",block:["/*","*/"],quotes:["'",'"'],kw:P(ta),nocase:!0},lua:{line:"--",quotes:['"',"'"],kw:P(na)},ps:{line:"#",block:["<#","#>"],quotes:['"',"'"],kw:P(sa),vars:!0,nocase:!0},css:{block:["/*","*/"],quotes:['"',"'"],kw:P(ra),css:!0},json:{line:"//",block:["/*","*/"],quotes:['"'],kw:P("true false null")},md:{md:!0},html:{html:!0}},aa={js:"js",mjs:"js",cjs:"js",jsx:"js",ts:"js",mts:"js",cts:"js",tsx:"js",vue:"html",svelte:"html",astro:"html",c:"c",h:"c",cpp:"c",cc:"c",hpp:"c",cxx:"c",m:"c",glsl:"c",frag:"c",vert:"c",wgsl:"rs",hlsl:"c",shader:"c",cs:"cs",java:"cs",kt:"cs",kts:"cs",scala:"cs",swift:"cs",dart:"cs",groovy:"cs",gradle:"cs",php:"cs",go:"go",rs:"rs",zig:"rs",py:"py",pyi:"py",ipy:"py",r:"py",jl:"py",nim:"py",sh:"sh",bash:"sh",zsh:"sh",fish:"sh",env:"sh",dockerfile:"sh",makefile:"sh",mk:"sh",cmake:"sh",gitignore:"sh",npmrc:"ini",editorconfig:"ini",rb:"rb",rake:"rb",gemspec:"rb",pl:"rb",ex:"rb",exs:"rb",cr:"rb",yml:"yaml",yaml:"yaml",toml:"toml",ini:"ini",cfg:"ini",conf:"ini",properties:"ini",sql:"sql",lua:"lua",ps1:"ps",psm1:"ps",psd1:"ps",css:"css",scss:"css",sass:"css",less:"css",styl:"css",json:"json",jsonc:"json",json5:"json",webmanifest:"json",map:"json",lock:"json",har:"json",ipynb:"json",geojson:"json",gltf:"json",md:"md",markdown:"md",mdx:"md",html:"html",htm:"html",xml:"html",svg:"html",xhtml:"html",plist:"html",csproj:"html",xaml:"html"};function oa(t){let e=t.toLowerCase();if(e==="dockerfile"||e==="makefile"||e.startsWith(".env")||e===".gitignore"||e===".gitattributes"||e===".dockerignore")return"sh";let n=e.includes(".")?e.slice(e.lastIndexOf(".")+1):"";return aa[n]||""}var re=t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),zt=new Map;function ia(t){if(zt.has(t))return zt.get(t);let e=Bn[t],n=[];e.block&&n.push(`${re(e.block[0])}[\\s\\S]*?(?:${re(e.block[1])}|$)`),e.line&&n.push(`${re(e.line)}[^\\n]*`),e.alt&&n.push(`${re(e.alt)}[^\\n]*`);let s=(e.quotes||[]).map(o=>o.length===3?`${re(o)}[\\s\\S]*?(?:${re(o)}|$)`:o==="`"?"`(?:\\\\[\\s\\S]|[^`\\\\])*`?":`${re(o)}(?:\\\\.|[^${re(o)}\\\\\\n])*${re(o)}?`),r=[];n.length&&r.push(`(?<com>${n.join("|")})`),s.length&&r.push(`(?<str>${s.join("|")})`),e.vars&&r.push("(?<var>\\$\\{?[\\w@#?*!-]+\\}?)"),(e.at||t==="js")&&r.push("(?<at>@[\\w.]+)"),e.css?r.push("(?<at>@[\\w-]+)|(?<num>#[\\da-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:px|em|rem|vh|vw|%|s|ms|deg|fr|ch)?\\b)|(?<key>[\\w-]+(?=\\s*:[^:]))|(?<word>[\\w-]+)"):(r.push("(?<num>\\b(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?)[nlLfFuU]*\\b)"),e.pre&&r.push("(?<pre>^\\s*#\\s*\\w+)"),r.push("(?<word>[A-Za-z_$][\\w$]*)"));let a=new RegExp(r.join("|"),"gm");return zt.set(t,a),a}function Dn(t,e){let n=oa(e);if(!n)return pa(t);if(n==="md")return ha(t);if(n==="html")return ua(t);let s=Bn[n],r=ia(n),a=[],o=0;r.lastIndex=0;let i;for(;i=r.exec(t);){if(i[0]===""){r.lastIndex++;continue}i.index>o&&a.push(["",t.slice(o,i.index)]);let l=i.groups,c="";if(l.com)c="com";else if(l.str)c=/^\s*:/.test(t.slice(r.lastIndex,r.lastIndex+3))&&!s.css?"key":"str";else if(l.num)c="num";else if(l.at)c="at";else if(l.var)c="var";else if(l.pre)c="kw";else if(l.key)c="key";else if(l.word){let d=l.word,p=t.slice(r.lastIndex,r.lastIndex+2);da.has(d)?c="lit":s.kw.has(s.nocase?d.toLowerCase():d)?c="kw":s.keys&&/^\s*[:=]/.test(p)&&la(t,i.index)?c="key":s.css?c="":p[0]==="("?c="fn":/^[A-Z][a-z0-9]/.test(d)&&n!=="sql"?c="type":/^[A-Z][A-Z0-9_]+$/.test(d)&&d.length>1&&(c="const")}a.push([c,i[0]]),o=r.lastIndex}return o<t.length&&a.push(["",t.slice(o)]),Fn(a)}function la(t,e){let n=t.lastIndexOf(`
88
+ `,e-1)+1;return/^[\s-]*$/.test(t.slice(n,e))}var ca={com:"comment",str:"string",num:"number",const:"number",kw:"keyword",lit:"literal",pre:"keyword"},da=new Set(["true","false","null","undefined","None","True","False","nil","NaN","Infinity"]);function Fn(t){let e=[""];for(let[n,s]of t){let r=ca[n]||"";s.split(`
89
+ `).forEach((o,i)=>{i>0&&e.push(""),o&&(e[e.length-1]+=r?`<span class="tok-${r}">${h(o)}</span>`:h(o))})}return e.map(n=>n.replace(/\r/g,""))}var pa=t=>t.replace(/\r/g,"").split(`
90
+ `).map(h);function ha(t){let e=!1;return t.replace(/\r/g,"").split(`
91
+ `).map(n=>/^\s*(```|~~~)/.test(n)?(e=!e,`<span class="tok-comment">${h(n)}</span>`):e?`<span class="tok-string">${h(n)}</span>`:/^#{1,6} /.test(n)?`<span class="tok-keyword">${h(n)}</span>`:/^\s*>/.test(n)?`<span class="tok-comment">${h(n)}</span>`:h(n).replace(/^(\s*)([-*+]|\d+\.)(\s)/,'$1<span class="tok-number">$2</span>$3').replace(/`[^`]+`/g,s=>`<span class="tok-string">${s}</span>`).replace(/\[[^\]]*\]\([^)]*\)/g,s=>`<span class="tok-keyword">${s}</span>`))}function ua(t){let e=/(?<com><!--[\s\S]*?(?:-->|$))|(?<tag><\/?[A-Za-z][\w:.-]*|\/?>)|(?<attr>[\w:@.#-]+(?=\s*=))|(?<str>"[^"]*"?|'[^']*'?)|(?<ent>&[#\w]+;)/g,n=[],s=0,r=!1,a;for(;a=e.exec(t);){a.index>s&&n.push(["",t.slice(s,a.index)]);let o=a.groups,i="";o.com?i="com":o.tag?(i="kw",r=!o.tag.endsWith(">")):o.attr?i=r?"key":"":o.str?i=r?"str":"":o.ent&&(i="num"),n.push([i,a[0]]),s=e.lastIndex}return s<t.length&&n.push(["",t.slice(s)]),Fn(n)}var Vn={name:"folderview-scopes",type:"light",fg:"#000000",bg:"#ffffff",settings:[]},fa=[["comment","comment"],["punctuation.definition.comment","comment"],["string","string"],["punctuation.definition.string","string"],["constant.numeric","number"],["constant.language","literal"],["support.constant","literal"],["constant.character","literal"],["keyword.operator","plain"],["keyword","keyword"],["storage","keyword"],["markup.heading","keyword"],["markup.inline.raw","string"],["markup.fenced_code","string"],["entity.name.tag","keyword"]];function ma(t){for(let e=t.length-1;e>=0;e--){let n=t[e],s=fa.find(([r])=>n===r||n.startsWith(r+"."));if(s)return s[1]}return"plain"}var Un={dockerfile:"docker",makefile:"make","cmakelists.txt":"cmake",".gitignore":"shellscript",".dockerignore":"shellscript",".npmrc":"ini",".editorconfig":"ini",".prettierrc":"json",".eslintrc":"json","tsconfig.json":"jsonc","jsconfig.json":"jsonc",".babelrc":"json",gemfile:"ruby",rakefile:"ruby",jenkinsfile:"groovy",caddyfile:"shellscript"},Wn={h:"c",hpp:"cpp",cc:"cpp",cxx:"cpp",cs:"csharp",kt:"kotlin",kts:"kotlin",rs:"rust",py:"python",pyi:"python",rb:"ruby",sh:"shellscript",bash:"shellscript",zsh:"shellscript",env:"dotenv",ps1:"powershell",psm1:"powershell",psd1:"powershell",yml:"yaml",md:"markdown",mdx:"mdx",htm:"html",xhtml:"html",svg:"xml",plist:"xml",csproj:"xml",xaml:"xml",ipynb:"json",gltf:"json",webmanifest:"json",geojson:"json",map:"json",har:"json",jl:"julia",ex:"elixir",exs:"elixir",erl:"erlang",hs:"haskell",ml:"ocaml",fs:"fsharp",clj:"clojure",tf:"terraform",hcl:"hcl",vert:"glsl",frag:"glsl",wgsl:"wgsl",mjs:"javascript",cjs:"javascript",mts:"typescript",cts:"typescript",conf:"ini",cfg:"ini",properties:"properties",mmd:"mermaid",mermaid:"mermaid",gradle:"groovy",txt:"",log:"log",lock:""};function Le(t){let e=t.toLowerCase().slice(t.lastIndexOf("/")+1);if(Un[e])return Un[e];if(e.startsWith(".env"))return"dotenv";if(e.startsWith("dockerfile"))return"docker";let n=e.includes(".")?e.slice(e.lastIndexOf(".")+1):"";return n in Wn?Wn[n]:n}var Zn,ga,_t,Ot=new Set,Ht=new Map,ka=()=>ga??=import("./chunks/langs-GO3UQR4H.js").then(({bundledLanguages:t,bundledLanguagesAlias:e})=>new Map([...Object.entries(e),...Object.entries(t)]));async function ba(t){let e=(await ka()).get(t);if(!e)return!1;Zn??=Promise.all([import("./chunks/core-BRBMZSD2.js"),import("./chunks/engine-javascript-DNHSF67B.js")]).then(([{createHighlighterCore:s},{createJavaScriptRegexEngine:r}])=>s({themes:[Vn],langs:[],engine:r({forgiving:!0})}));let n=await Zn;return await n.loadLanguage(e),_t=n,Ot.add(t),!0}function Be(t){let e=Le(t);return e?Ot.has(e)?Promise.resolve(!0):(Ht.has(e)||Ht.set(e,ba(e).catch(()=>!1)),Ht.get(e)):Promise.resolve(!1)}var wa=4e5,Kn=8e3;function Me(t,e){let n=Le(e);if(n&&Ot.has(n)&&t.length<wa){let s=$a(t,n);if(s)return s}return Dn(t,e)}function $a(t,e){if(_t&&!(t.split(`
92
+ `,Kn+1).length>Kn))try{return _t.codeToTokensBase(t.replace(/\r\n?/g,`
93
+ `),{lang:e,theme:Vn.name,includeExplanation:"scopeName"}).map(s=>{let r="",a="plain",o="",i=()=>{o&&(r+=a==="plain"?h(o):`<span class="tok-${a}">${h(o)}</span>`,o="")};for(let l of s){let c=l.explanation??[{content:l.content,scopes:[]}];for(let d of c){let p=ma(d.scopes.map(u=>u.scopeName));p!==a&&(i(),a=p),o+=d.content}}return i(),r})}catch{return}}var xa=/<svg\b[^>]*>/,ya=/viewBox="\s*[-\d.]+[\s,]+[-\d.]+[\s,]+([\d.]+)[\s,]+([\d.]+)\s*"/,va=/\s(?:width|height)="[^"]*"/g;function Sa(t){let e=xa.exec(t)?.[0],n=e&&ya.exec(e);return!e||!n?t:t.replace(e,e.replace(va,"").replace(/^<svg/,`<svg width="${n[1]}" height="${n[2]}"`))}function Ta(t,e,n){e.style.color=`var(${n})`,t.clearRect(0,0,1,1),t.fillStyle=getComputedStyle(e).color,t.fillRect(0,0,1,1);let[s,r,a,o]=t.getImageData(0,0,1,1).data;return o===0?void 0:"#"+[s,r,a].map(i=>i.toString(16).padStart(2,"0")).join("")}function La(){let t=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});if(!t)return;let e=document.createElement("span");document.body.append(e);try{let[n,s,r,a,o,i]=["--bg","--surface-2","--border-strong","--text","--text-dim","--accent"].map(c=>Ta(t,e,c)),l=getComputedStyle(document.documentElement).getPropertyValue("--font").trim();return!n||!s||!r||!a||!o||!i?void 0:{font:l,background:n,surface:s,border:r,text:a,muted:o,accent:i}}finally{e.remove()}}function Ma(t,e){return{theme:"base",fontFamily:t.font,themeVariables:{darkMode:e,fontFamily:t.font,fontSize:"14px",background:t.background,primaryColor:t.surface,primaryBorderColor:t.border,primaryTextColor:t.text,secondaryColor:t.surface,secondaryBorderColor:t.border,secondaryTextColor:t.text,tertiaryColor:t.background,tertiaryBorderColor:t.border,tertiaryTextColor:t.text,mainBkg:t.surface,nodeBorder:t.border,nodeTextColor:t.text,lineColor:t.muted,textColor:t.text,clusterBkg:t.background,clusterBorder:t.border,edgeLabelBackground:t.background,titleColor:t.text,noteBkgColor:t.surface,noteBorderColor:t.accent,noteTextColor:t.text,actorBorder:t.border,actorBkg:t.surface}}}var Gn,Xn=Promise.resolve(),Qn=0,Aa=()=>matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.dataset.theme!=="light":document.documentElement.dataset.theme==="dark";function Ca(t){let e=Xn.then(async()=>{Gn??=import("./chunks/mermaid.core-SQMPMUDN.js").then(a=>a.default);let n=await Gn,s=La(),r=Aa();n.initialize({startOnLoad:!1,securityLevel:"strict",...s?Ma(s,r):{theme:r?"dark":"default"}});try{let{svg:a}=await n.render(`folderview-diagram-${++Qn}`,t);return{ok:!0,svg:Sa(a)}}catch(a){return document.getElementById(`dfolderview-diagram-${Qn}`)?.remove(),{ok:!1,problem:a instanceof Error?a.message:String(a)}}});return Xn=e.catch(()=>{}),e}async function lt(t,e){t.innerHTML='<div class="skeleton" style="width:60%;height:120px"></div>';let n=await Ca(e);if(!n.ok){t.innerHTML=`<p class="problem">This diagram couldn't be drawn: ${qa(n.problem)}</p>`;return}let s=URL.createObjectURL(new Blob([n.svg],{type:"image/svg+xml"})),r=document.createElement("img");r.src=s,r.alt="Diagram",r.onclick=()=>window.open(s,"_blank","noopener"),r.onload=()=>{let a=t.clientWidth-26,o=r.naturalWidth;o>a&&(r.style.width=(o<=a*1.8?a:Math.round(o*.6))+"px")},t.replaceChildren(r)}var qa=t=>String(t).replace(/[&<>]/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;"})[e]);var Jn={pen:'<path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/><path d="m15 5 3 3"/>',"arrow-left":'<path d="M19 12H5M12 19l-7-7 7-7"/>',"arrow-right":'<path d="M5 12h14M12 5l7 7-7 7"/>',"arrow-up":'<path d="M12 19V5M5 12l7-7 7 7"/>',"arrow-down":'<path d="M12 5v14M19 12l-7 7-7-7"/>',menu:'<path d="M4 6h16M4 12h16M4 18h16"/>',x:'<path d="M18 6 6 18M6 6l12 12"/>',"chevron-left":'<path d="m15 18-6-6 6-6"/>',"chevron-right":'<path d="m9 18 6-6-6-6"/>',"chevron-down":'<path d="m6 9 6 6 6-6"/>',check:'<path d="M20 6 9 17l-5-5"/>',plus:'<path d="M12 5v14M5 12h14"/>',search:'<circle cx="11" cy="11" r="7"/><path d="m20 20-3.6-3.6"/>',settings:'<path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/>',chat:'<path d="M21 12a8 8 0 0 1-11.6 7.14L4 20.5l1.36-4.9A8 8 0 1 1 21 12z"/>',sun:'<circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>',moon:'<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"/>',monitor:'<rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/>',copy:'<rect x="8" y="8" width="14" height="14" rx="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',external:'<path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',wrap:'<path d="M3 6h18M3 12h15a3 3 0 1 1 0 6h-4"/><path d="m16 16-2 2 2 2M3 18h7"/>',refresh:'<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/>',clock:'<circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/>',trash:'<path d="M3 6h18M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/>',edit:'<path d="M12 20h9"/><path d="M16.38 3.62a1 1 0 0 1 3 3L7.37 18.64a2 2 0 0 1-.86.5l-2.87.84a.5.5 0 0 1-.62-.62l.84-2.87a2 2 0 0 1 .5-.86z"/>',link:'<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/>',file:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21"/>',grid:'<rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/>',list:'<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>',folder:'<path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2z"/>',table:'<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M3 15h18M9 3v18"/>',code:'<path d="m16 18 6-6-6-6M8 6l-6 6 6 6"/>',download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/>',eye:'<path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z"/><circle cx="12" cy="12" r="3"/>',filter:'<path d="M22 3H2l8 9.46V19l4 2v-8.54z"/>',sort:'<path d="m3 16 4 4 4-4M7 20V4M21 8l-4-4-4 4M17 4v16"/>',book:'<path d="M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>',hash:'<path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/>',braces:'<path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',reply:'<path d="m9 17-5-5 5-5"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/>',music:'<path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/>',video:'<rect x="2" y="6" width="14" height="12" rx="2"/><path d="m22 8-6 4 6 4z"/>',warning:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4M12 17h.01"/>',info:'<circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/>',more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',layers:'<path d="m12 2 10 5-10 5L2 7z"/><path d="m2 17 10 5 10-5M2 12l10 5 10-5"/>',tree:'<path d="M6 3v12"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/>',"git-branch":'<circle cx="6" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="8" r="3"/><path d="M6 9v6M18 11a6 6 0 0 1-6 6H9"/>',diff:'<path d="M12 3v14M5 10h14M5 21h14"/>',"folder-open":'<path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"/>'},x=(t,e=18)=>`<svg class="i" width="${e}" height="${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${Jn[t]||Jn.file}</svg>`;function Pt(t,e,n=e||"text"){let s="x."+(e||"txt"),r=Me(t.replace(/\n$/,""),s);return`<figure class="ui-code${b.settings.wrap?" wrapped":""}" data-lang="${h(e)}"><figcaption class="cbar"><span class="caption">${h(n)}</span><span class="ctools"><button class="icon-btn${b.settings.wrap?" on":""}" data-cb="wrap" title="Wrap long lines" aria-label="Wrap long lines">${x("wrap",16)}</button><button class="icon-btn" data-cb="copy" title="Copy code" aria-label="Copy code">${x("copy",16)}</button></span></figcaption><pre class="code" tabindex="0"><code>${r.join(`
94
+ `)}</code></pre><textarea hidden>${h(t)}</textarea></figure>`}var Yn={name:"mathBlock",level:"block",start:t=>t.match(/^\$\$/m)?.index,tokenizer(t){let e=/^\$\$[ \t]*\n?([\s\S]+?)\n?[ \t]*\$\$[ \t]*(?:\n+|$)/.exec(t);if(e)return{type:"mathBlock",raw:e[0],text:e[1].trim()}},renderer:t=>`<div class="md-math-wrap"><div class="md-math md-math-block" data-tex="${encodeURIComponent(t.text)}">${h(t.text)}</div></div>
95
+ `},Ra={name:"mathInline",level:"inline",start:t=>t.indexOf("$"),tokenizer(t){let e=new RegExp("^\\$(?![\\s$])((?:\\\\.|[^\\\\$\\n])+?)(?<![\\s\\\\])\\$(?![\\d$])").exec(t);if(e)return{type:"mathInline",raw:e[0],text:e[1]}},renderer:t=>`<span class="md-math" data-tex="${encodeURIComponent(t.text)}">${h(t.text)}</span>`},es=()=>{let t=new Map;return e=>{let n=e.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-")||"section",s=t.get(n)||0;return t.set(n,s+1),s?`${n}-${s}`:n}};function Ea(){let t=es(),e=new It({gfm:!0});return e.use(Nn({description:"Footnotes"})),e.use({extensions:[Yn,Ra],hooks:{preprocess(n){return t=es(),n}},renderer:{code({text:n,lang:s}){let r=(s||"").trim().split(/\s+/)[0].toLowerCase();return r==="mermaid"?`<div class="md-diagram" data-diagram="${encodeURIComponent(n)}"></div>`:r==="math"||r==="latex"||r==="tex"?Yn.renderer({text:n}):Pt(n,r)},heading({tokens:n,depth:s}){let r=this.parser.parseInline(n),a=t(r);return`<h${s} id="${a}">${r}<a class="anchor" href="#" data-anchor="${a}" aria-label="Link to this section">#</a></h${s}>
96
+ `}}}),e}var ja=Ea();function Ia(t){let e=/^---\r?\n([\s\S]*?)\r?\n---\r?\n/.exec(t);if(!e)return{body:t,front:""};let n=e[1].split(/\r?\n/).map(s=>/^([\w.-]+):\s*(.*)$/.exec(s)).filter(Boolean).map(([,s,r])=>`<tr><td>${h(s)}</td><td>${h(r)}</td></tr>`).join("");return{body:t.slice(e[0].length),front:n?`<div class="md-table front"><table>${n}</table></div>`:""}}var za={NOTE:["note","info"],TIP:["tip","sparkles"],IMPORTANT:["important","warning"],WARNING:["warning","warning"],CAUTION:["caution","warning"]};function Ae(t,e,n){let{body:s,front:r}=Ia(e),a=fn.sanitize(r+ja.parse(s),{ADD_ATTR:["target","data-anchor","data-diagram","data-tex","data-lang","data-cb"],FORBID_TAGS:["style","form"],FORBID_ATTR:["style"]});t.innerHTML=a,Ha(t,n)}function Ha(t,e){for(let s of t.querySelectorAll("table")){if(s.parentElement?.classList.contains("md-table"))continue;let r=document.createElement("div");r.className="md-table",s.replaceWith(r),r.append(s)}for(let s of t.querySelectorAll("a[href]")){if(s.dataset.anchor)continue;let r=s.getAttribute("href")||"";if(/^(https?:|mailto:|tel:)/i.test(r))s.target="_blank",s.rel="noopener noreferrer";else if(r.startsWith("#"))s.dataset.anchor=decodeURIComponent(r.slice(1)),s.setAttribute("href","#");else if(/^[a-z][a-z0-9+.-]*:/i.test(r))s.removeAttribute("href");else{let[a,o=""]=r.split("#"),i=$t(a.startsWith("/")?a:z(e,decodeURIComponent(a))),l=/^L(\d+)(?:-L?(\d+))?/.exec(o);a.endsWith("/")||!a?s.setAttribute("href",V({folder:i})):s.setAttribute("href",O(i,l?{line:l[2]?`${l[1]}-${l[2]}`:l[1]}:{}))}}for(let s of t.querySelectorAll("img[src]")){let r=s.getAttribute("src")||"";/^(https?:|data:image\/|blob:)/i.test(r)||(s.src=W($t(r.startsWith("/")?r:z(e,decodeURIComponent(r))))),s.loading="lazy"}for(let s of t.querySelectorAll("blockquote")){let r=s.querySelector("p"),a=r&&/^\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*/i.exec(r.innerHTML);if(!a)continue;let[o,i]=za[a[1].toUpperCase()];r.innerHTML=r.innerHTML.slice(a[0].length).replace(/^<br>\s*/,""),!r.textContent.trim()&&!r.querySelector("img")&&r.remove(),s.classList.add("alert",o),s.insertAdjacentHTML("afterbegin",`<div class="alert-title">${x(i,16)}${a[1][0].toUpperCase()+a[1].slice(1).toLowerCase()}</div>`)}for(let s of t.querySelectorAll("[data-diagram]"))lt(s,decodeURIComponent(s.dataset.diagram));let n=t.querySelectorAll("[data-tex]");n.length&&import("./chunks/temml-ISNSX3VV.js").then(({default:s})=>{for(let r of n)try{r.innerHTML=s.renderToString(decodeURIComponent(r.dataset.tex),{displayMode:r.classList.contains("md-math-block"),throwOnError:!1})}catch{}}),_a(t)}function _a(t){for(let e of t.querySelectorAll("figure.ui-code[data-lang]")){let n=e.dataset.lang;n&&Be("x."+n).then(s=>{if(!s||!e.isConnected)return;let r=e.querySelector("textarea")?.value??"";e.querySelector("code").innerHTML=Me(r.replace(/\n$/,""),"x."+n).join(`
97
+ `)})}}document.addEventListener("click",t=>{let e=t.target.closest("[data-cb]");if(e){let s=e.closest(".ui-code");if(e.dataset.cb==="wrap")s.classList.toggle("wrapped"),e.classList.toggle("on",s.classList.contains("wrapped"));else if(e.dataset.cb==="copy"){let r=s.querySelector("textarea")?.value??s.querySelector("code")?.textContent??"";K(r,"Code copied").then(()=>{e.innerHTML=x("check",16),e.classList.add("copied"),setTimeout(()=>{e.innerHTML=x("copy",16),e.classList.remove("copied")},1600)})}return}let n=t.target.closest("a[data-anchor]");if(n){t.preventDefault();let s=n.closest(".md")||document,r=n.dataset.anchor;(s.querySelector("#"+CSS.escape(r))||s.querySelector(`[id="user-content-${CSS.escape(r)}"]`)||document.getElementById(r))?.scrollIntoView({behavior:"smooth",block:"start"})}});function Nt(t,e){let n=document.createElement("div");return Ae(n,t,e),n.innerHTML}var Oa=t=>t.line?t.endLine?`L${t.line}\u2013${t.endLine}`:`L${t.line}`:t.strokes?.length?`Area ${Ce(t)}`:"File",Ce=t=>F(t.path).filter(e=>e.strokes?.length).findIndex(e=>e.id===t.id)+1;async function ct(){await ze(),ee("comments")}function De(t,e){let n=(t.replies||[]).map(a=>`<div class="reply"><div class="cmt-head"><b>${h(a.author)}</b><span class="faint">${Z(Date.parse(a.at))}</span></div><div class="cmt-body md">${Nt(a.body,e)}</div></div>`).join(""),s=t.status==="resolved",r=b.info.readOnly;return`<div class="cmt${s?" resolved":""}" data-cid="${h(t.id)}">
98
+ <div class="cmt-head"><b>${h(t.author||"reviewer")}</b><span class="faint">${Z(Date.parse(t.createdAt))}</span>${s?'<span class="pill ok">Resolved</span>':""}
99
+ ${r?"":`<span class="cmt-acts"><button class="mini" data-cact="${s?"reopen":"resolve"}" title="${s?"Reopen":"Resolve"}">${s?x("undo",14)+" Reopen":x("check",14)+" Resolve"}</button><button class="mini" data-cact="edit" title="Edit" aria-label="Edit">${x("edit",14)}</button><button class="mini" data-cact="delete" title="Delete" aria-label="Delete">${x("trash",14)}</button></span>`}</div>
100
+ <div class="cmt-body md">${Nt(t.body,e)}</div>
101
101
  ${n}
102
102
  ${r?"":`<form class="reply-form" data-cid="${h(t.id)}"><textarea rows="1" placeholder="Reply\u2026"></textarea><button class="btn small" type="submit">Reply</button></form>`}
103
- </div>`}function _e(t,e,n){let s=e?n&&n!==e?`lines ${e}\u2013${n}`:`line ${e}`:"this file";return`<form class="composer" data-path="${h(t)}" data-line="${e||""}" data-end="${n||""}">
104
- <div class="composer-head">Comment on ${s} <span class="faint">as ${h(De())}</span></div>
103
+ </div>`}function ae(t,e,n){let s=e?n&&n!==e?`lines ${e}\u2013${n}`:`line ${e}`:"this file";return`<form class="composer" data-path="${h(t)}" data-line="${e||""}" data-end="${n||""}">
104
+ <div class="composer-head">Comment on ${s} <span class="faint">as ${h(et())}</span></div>
105
105
  <textarea rows="3" placeholder="What should change? Markdown works. Ctrl+Enter to save."></textarea>
106
106
  <div class="composer-acts"><button class="btn primary" type="submit">Comment</button><button class="btn" type="button" data-cancel>Cancel</button></div>
107
- </form>`}function Ct(t,e){return ce(t).filter(s=>!s.line&&(x.settings.resolved||s.status==="open")).map(s=>`<div class="thread">${ze(s,e)}</div>`).join("")}document.addEventListener("click",async t=>{let e=t.target.closest("[data-cact]");if(!e)return;let n=e.closest("[data-cid]"),s=n?.dataset.cid;if(!s)return;let r=e.dataset.cact;try{if(r==="resolve"||r==="reopen")await R("api/comments/"+s,{method:"PATCH",json:{status:r==="resolve"?"resolved":"open"}});else if(r==="delete"){if(!confirm("Delete this comment?"))return;await R("api/comments/"+s,{method:"DELETE"})}else if(r==="edit"){let a=x.comments.find(i=>i.id===s),o=n.querySelector(":scope > .cmt-body");o.outerHTML=`<form class="edit-form" data-cid="${h(s)}"><textarea rows="3">${h(a?.body||"")}</textarea><div class="composer-acts"><button class="btn primary" type="submit">Save</button><button class="btn" type="button" data-cancel-edit>Cancel</button></div></form>`,n.querySelector(".edit-form textarea").focus();return}await Je()}catch(a){ke(a.message)}});document.addEventListener("click",t=>{t.target.closest("[data-cancel-edit]")&&Je();let e=t.target.closest("[data-cancel]");e&&(e.closest(".composer")?.remove(),K("composer-closed"))});document.addEventListener("keydown",t=>{t.key==="Enter"&&(t.ctrlKey||t.metaKey)&&t.target.matches("form textarea")&&(t.preventDefault(),t.target.form.requestSubmit()),t.key==="Escape"&&t.target.matches(".composer textarea")&&(t.stopPropagation(),t.target.closest(".composer").remove(),K("composer-closed"))});document.addEventListener("submit",async t=>{let e=t.target;if(!e.matches(".composer, .reply-form, .edit-form"))return;t.preventDefault();let n=e.querySelector("textarea").value.trim();if(!n)return;let s=e.querySelector("[type=submit]");s.disabled=!0;try{if(e.matches(".composer")){let r={path:e.dataset.path,body:n,author:De()};e.dataset.line&&(r.line=Number(e.dataset.line)),e.dataset.end&&(r.endLine=Number(e.dataset.end)),await R("api/comments",{method:"POST",json:r}),e.remove(),K("composer-closed")}else e.matches(".reply-form")?await R(`api/comments/${e.dataset.cid}/replies`,{method:"POST",json:{body:n,author:De()}}):await R("api/comments/"+e.dataset.cid,{method:"PATCH",json:{body:n}});await Je()}catch(r){s.disabled=!1,ke(r.message)}});document.addEventListener("input",t=>{t.target.matches(".reply-form textarea, .composer textarea, .edit-form textarea")&&(t.target.style.height="auto",t.target.style.height=Math.min(t.target.scrollHeight+2,320)+"px")});var ia=(t,e)=>`Read ${t}. It lists review comments on files in this folder (path:line, the quoted code, and the comment). Work through each open comment: make the change it asks for, then set that comment's "status" to "resolved" in ${e} and add a reply saying what you did. If you can't or shouldn't act on one, leave it open and reply with why.`;function Hn(t,e){let n=x.comments,s=n.filter(u=>u.status==="open"),r=e==="resolved"?n.filter(u=>u.status==="resolved"):e==="all"?n:s,a=new Map;for(let u of[...r].sort((k,g)=>k.path.localeCompare(g.path)||(k.line||0)-(g.line||0)))a.has(u.path)||a.set(u.path,[]),a.get(u.path).push(u);let{md:o,json:i}=x.info.review,l=o&&!o.startsWith("..")?P(o):"",p=[["open",`Open (${s.length})`],["resolved",`Resolved (${n.length-s.length})`],["all",`All (${n.length})`]].map(([u,k])=>`<button class="btn${(e||"open")===u?" on":""}" data-rf="${u}">${k}</button>`).join(""),c=[...a].map(([u,k])=>`<section class="rgroup"><h3 class="group-title"><a href="${P(u)}">${h(u||".")}</a><span class="faint">${k.length}</span></h3>${k.map(g=>`<div class="rcard"><div class="rwhere"><a class="pill" href="${P(u,g.line?{line:String(g.line)}:{})}">${oa(g)}</a>${g.commit?`<span class="faint">@ ${h(g.commit)}</span>`:""}</div>${g.quote?`<pre class="quote">${h(g.quote)}</pre>`:""}${ze(g,u.includes("/")?u.slice(0,u.lastIndexOf("/")):"")}</div>`).join("")}</section>`).join("");t.innerHTML=`<header class="head"><h2 class="page-title">${$("chat")} Review</h2>
108
- <label class="switch" title="Click any line of a file to comment on it"><input type="checkbox" id="rmode" ${x.settings.review?"checked":""}> Review mode</label></header>
109
- <p class="lede">Leave comments on files or lines (tap a line number). They're saved in <code>${h(x.info.review.dir)}/</code> as <code>comments.json</code>, and written out as <code>REVIEW.md</code> for an agent to work through. Its replies and resolutions show up here live.</p>
110
- <div class="head"><div class="tabs">${p}</div><span class="grow"></span>
111
- ${l?`<a class="btn" href="${l}">${$("file",16)} REVIEW.md</a>`:""}
112
- <button class="btn" id="copy-prompt" title="Copy instructions to paste into your agent">${$("copy",16)} Copy prompt for an agent</button>
113
- ${n.length-s.length&&!x.info.readOnly?'<button class="btn" id="clear-resolved">Clear resolved</button>':""}</div>
114
- ${c||`<p class="empty">${e==="resolved"?"Nothing resolved yet.":e==="all"?"No comments yet. Open a file and click a line number to leave one.":"No open comments. Open a file and click a line number to leave one."}</p>`}`,t.querySelectorAll("[data-rf]").forEach(u=>u.onclick=()=>q({q:u.dataset.rf==="open"?"":u.dataset.rf})),t.querySelector("#rmode").onchange=u=>{be("review",u.target.checked),K("settings")},t.querySelector("#copy-prompt").onclick=()=>D(x.info.review.prompt||ia(o,i),"Prompt copied");let d=t.querySelector("#clear-resolved");d&&(d.onclick=async()=>{confirm("Remove every resolved comment?")&&(await R("api/comments?resolved=1",{method:"DELETE"}),await Je())})}function qt(){let t=x.comments.filter(n=>n.status==="open").length,e=w("review-count");e&&(e.textContent=String(t),e.hidden=!t)}var jt=6e4;function la(t){let e=/^(\d+)(?:-(\d+))?$/.exec(t||"");if(!e)return null;let n=Number(e[1]),s=Number(e[2]||e[1]);return[Math.min(n,s),Math.max(n,s)]}function _t(t){let e=[],n=[],s=null,r=0,a=0;for(let o of t.replace(/\r/g,"").split(`
115
- `)){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@(.*)$/.exec(o);if(i){s={header:o,ctx:i[3].trim(),lines:[]},e.push(s),r=Number(i[1]),a=Number(i[2]);continue}if(!s){n.push(o);continue}o.startsWith("+")?s.lines.push({t:"+",text:o.slice(1),n:a++}):o.startsWith("-")?s.lines.push({t:"-",text:o.slice(1),o:r++}):o.startsWith(" ")?s.lines.push({t:" ",text:o.slice(1),o:r++,n:a++}):o.startsWith("\\")&&s.lines.push({t:"\\",text:o})}return{head:n,hunks:e}}function On(t){let e=new Map;for(let n of t.hunks){let s=0;for(let r=0;r<n.lines.length;r++){let a=n.lines[r];a.t==="-"?s++:a.t==="+"?(e.set(a.n,s>0?"mod":"add"),s>0&&s--):(s>0&&a.n&&e.set(a.n,e.get(a.n)||"del"),s=0)}}return e}function Nn(t,{download:e}={}){return`<figcaption class="cbar"><span class="caption">${h(t)}</span><span class="ctools"><button class="icon-btn${x.settings.wrap?" on":""}" data-cv="wrap" title="Wrap long lines" aria-label="Wrap long lines">${$("wrap",16)}</button><button class="icon-btn" data-cv="copy" title="Copy" aria-label="Copy">${$("copy",16)}</button>${e?`<a class="icon-btn" href="${e}" download title="Download" aria-label="Download">${$("download",16)}</a>`:""}</span></figcaption>`}function Ht(t,{path:e,text:n,folder:s,marks:r,caption:a,download:o}){let i=n.length>4e6?n.slice(0,4e6):n,l=()=>{let b=ve(i,e);return b.length>1&&b[b.length-1]===""&&i.endsWith(`
116
- `)&&b.pop(),b},p=l(),c=p.slice(0,jt),d=c.map((b,v)=>{let y=v+1,m=r?.get(y);return`<div class="ln" data-n="${y}"><a class="gut" href="${le({...M(),line:String(y)})}" data-n="${y}">${y}</a><span class="mk${m?" "+m:""}"></span><span class="src">${b||" "}</span></div>`}),u=ye(e),k=a??`${u||"text"} \xB7 ${c.length.toLocaleString()} ${c.length===1?"line":"lines"}`;t.innerHTML=`<figure class="ui-code">${Nn(k,{download:o})}<div class="code${x.settings.wrap?" wrap":""}${x.settings.review?" review":""}" tabindex="0" data-path="${h(e)}" data-folder="${h(s)}">${d.join("")}</div></figure>${p.length>jt?`<p class="note">Showing the first ${jt.toLocaleString()} of ${p.length.toLocaleString()} lines.</p>`:""}`;let g=t.querySelector(".code");g.lines=c.length,g.text=n,ca(g,e),Pt(g);let f=la(M().line);return f&&zt(g,f[0],f[1],!0),Ie(e).then(b=>{if(!b||!g.isConnected)return;let v=l();g.querySelectorAll(".ln > .src").forEach((m,L)=>{v[L]!==void 0&&(m.innerHTML=v[L]||" ")})}),g}document.addEventListener("click",t=>{let e=t.target.closest("[data-cv]");if(!e)return;let s=e.closest(".ui-code")?.querySelector(".code");if(s){if(e.dataset.cv==="wrap")be("wrap",!x.settings.wrap),document.querySelectorAll(".ui-code > .code").forEach(r=>r.classList.toggle("wrap",x.settings.wrap)),document.querySelectorAll('[data-cv="wrap"]').forEach(r=>r.classList.toggle("on",x.settings.wrap));else if(e.dataset.cv==="copy"){let r=s.text??[...s.querySelectorAll(".src, .dsrc")].map(a=>a.textContent).join(`
117
- `);D(r,"Copied").then(()=>{e.innerHTML=$("check",16),e.classList.add("copied"),setTimeout(()=>{e.innerHTML=$("copy",16),e.classList.remove("copied")},1600)})}}});function Pt(t){if(!t)return;let e=t.dataset.path,n=t.dataset.folder;t.querySelectorAll(":scope > .threads").forEach(a=>a.remove()),t.querySelectorAll(".ln.has-c").forEach(a=>a.classList.remove("has-c","has-open"));let s=ce(e).filter(a=>a.line&&(x.settings.resolved||a.status==="open")),r=new Map;for(let a of s){let o=Math.min(a.endLine||a.line,t.lines||1);r.has(o)||r.set(o,[]),r.get(o).push(a);for(let i=a.line;i<=(a.endLine||a.line);i++){let l=t.querySelector(`.ln[data-n="${i}"]`);l?.classList.add("has-c"),a.status==="open"&&l?.classList.add("has-open")}}for(let[a,o]of r){let i=t.querySelector(`.ln[data-n="${a}"]`);if(!i)continue;let l=document.createElement("div");l.className="threads",l.innerHTML=o.map(p=>`<div class="thread"><div class="thread-where">${p.endLine?`Lines ${p.line}\u2013${p.endLine}`:`Line ${p.line}`}${p.line>t.lines?" (past the end of the file now)":""}</div>${ze(p,n)}</div>`).join(""),i.after(l)}}function zt(t,e,n,s){t.sel=[e,n],t.querySelectorAll(".ln.sel").forEach(i=>i.classList.remove("sel"));for(let i=e;i<=n;i++)t.querySelector(`.ln[data-n="${i}"]`)?.classList.add("sel");t.querySelector(":scope > .selbar")?.remove();let r=t.querySelector(`.ln[data-n="${n}"]`);if(!r)return;let a=document.createElement("div");a.className="selbar";let o=e===n?`Line ${e}`:`Lines ${e}\u2013${n}`;a.innerHTML=`<span class="faint">${o}</span>${x.info.readOnly?"":`<button class="btn small primary" data-sb="comment">${$("chat",14)} Comment</button>`}<button class="btn small" data-sb="link">${$("link",14)} Link</button><button class="btn small" data-sb="ref">path:line</button><button class="btn small" data-sb="text">${$("copy",14)} Lines</button><button class="mini" data-sb="clear" title="Clear the selection" aria-label="Clear the selection">${$("x",14)}</button>`,r.after(a),s&&requestAnimationFrame(()=>t.querySelector(`.ln[data-n="${e}"]`)?.scrollIntoView({block:"center"}))}function Pn(t){t.sel=null,t.querySelectorAll(".ln.sel").forEach(e=>e.classList.remove("sel")),t.querySelector(":scope > .selbar")?.remove(),q({line:""},!0)}function It(t,e,n,s){t.querySelectorAll(":scope > .composer").forEach(i=>i.remove());let r=t.querySelector(`.ln[data-n="${s}"]`);if(!r)return;(r.nextElementSibling?.classList.contains("threads")?r.nextElementSibling:r).insertAdjacentHTML("afterend",_e(e,n,s)),t.querySelector(":scope > .selbar")?.remove();let o=t.querySelector(".composer textarea");o.focus(),o.scrollIntoView({block:"nearest"})}function ca(t,e){t.addEventListener("click",n=>{let s=n.target.closest(".gut"),r=n.target.closest("[data-sb]");if(s){n.preventDefault();let o=Number(s.dataset.n),[i,l]=n.shiftKey&&t.sel?[Math.min(t.sel[0],o),Math.max(t.sel[1],o)]:[o,o];if(!n.shiftKey&&t.sel&&t.sel[0]===o&&t.sel[1]===o)return Pn(t);zt(t,i,l,!1),q({line:i===l?String(i):`${i}-${l}`},!0),x.settings.review&&!x.info.readOnly&&!n.shiftKey&&It(t,e,i,l);return}if(r&&t.sel){let[o,i]=t.sel,l=r.dataset.sb;if(l==="comment")It(t,e,o,i);else if(l==="link")D(location.href,"Link copied");else if(l==="ref")D(`${e}:${o}${o!==i?"-"+i:""}`,"Copied");else if(l==="text"){let p=[];for(let c=o;c<=i;c++)p.push(t.querySelector(`.ln[data-n="${c}"] .src`)?.textContent??"");D(p.join(`
118
- `),"Lines copied")}else l==="clear"&&Pn(t);return}let a=n.target.closest(".ln");if(a&&x.settings.review&&!x.info.readOnly&&!String(getSelection()).trim()){let o=Number(a.dataset.n),[i,l]=n.shiftKey&&t.sel?[Math.min(t.sel[0],o),Math.max(t.sel[1],o)]:[o,o];zt(t,i,l,!1),q({line:i===l?String(i):`${i}-${l}`},!0),It(t,e,i,l)}})}function He(t,e,n,{comments:s=!0,caption:r=""}={}){if(!e.trim()){t.innerHTML='<p class="note">No changes against the last commit.</p>';return}let a=_t(e),o=a.head.filter(f=>f&&!/^(diff --git|index |--- |\+\+\+ |(new|deleted) file mode|similarity index|rename (from|to) )/.test(f)),i=a.hunks.flatMap(f=>f.lines.filter(b=>b.t!=="\\")),l=()=>{let f=new Map;for(let b of a.hunks)for(let v of["o","n"]){let y=b.lines.filter(L=>L.t!=="\\"&&(v==="o"?L.t!=="+":L.t!=="-")),m=ve(y.map(L=>L.text).join(`
119
- `),n);y.forEach((L,E)=>{(v==="n"||L.t==="-")&&f.set(L,m[E]||" ")})}return f},p=l(),c=[];for(let f of a.hunks){c.push(`<div class="dh"><span>${h(f.header.replace(/@@(.*)$/,"@@"))}</span>${f.ctx?`<span class="faint">${h(f.ctx)}</span>`:""}</div>`);for(let b of f.lines){if(b.t==="\\"){c.push(`<div class="dl meta"><span class="on"></span><span class="nn"></span><span class="dsrc faint">${h(b.text)}</span></div>`);continue}let v=b.t==="+"?"add":b.t==="-"?"del":"";c.push(`<div class="dl ${v}"${b.n?` data-n="${b.n}"`:""}><span class="on">${b.o??""}</span><span class="nn">${b.n?`<a class="gut" data-n="${b.n}">${b.n}</a>`:""}</span><span class="dsrc"><i>${b.t===" "?" ":b.t}</i><span class="dt">${p.get(b)}</span></span></div>`)}}let d=!a.hunks.length&&/Binary files/.test(e),u=i.filter(f=>f.t==="+").length,k=i.filter(f=>f.t==="-").length;t.innerHTML=`${o.length?`<pre class="commit-head">${h(o.join(`
120
- `))}</pre>`:""}${d?'<p class="note">A binary file changed; no line diff.</p>':`<figure class="ui-code">${Nn(`${r||n} \xB7 +${u} \u2212${k}`)}<div class="diff code${x.settings.wrap?" wrap":""}" tabindex="0" data-path="${h(n)}">${c.join("")}</div></figure>`}`;let g=t.querySelector(".diff");g&&(g.text=e,Ie(n).then(f=>{if(!f||!g.isConnected)return;let b=l();g.querySelectorAll(".dt").forEach((v,y)=>{let m=b.get(i[y]);m!==void 0&&(v.innerHTML=m)})})),!(!g||!s)&&(Ot(g),g.addEventListener("click",f=>{let b=f.target.closest(".gut");if(!b||x.info.readOnly)return;let v=Number(b.dataset.n);g.querySelectorAll(":scope > .composer").forEach(L=>L.remove());let y=g.querySelector(`.dl[data-n="${v}"]`);(y.nextElementSibling?.classList.contains("threads")?y.nextElementSibling:y).insertAdjacentHTML("afterend",_e(n,v,v)),g.querySelector(".composer textarea").focus()}))}function Ot(t){if(!t)return;t.querySelectorAll(":scope > .threads").forEach(s=>s.remove());let e=t.dataset.path,n=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"";for(let s of ce(e).filter(r=>r.line&&(x.settings.resolved||r.status==="open"))){let r=t.querySelector(`.dl[data-n="${s.endLine||s.line}"]`);if(!r)continue;let a=r.nextElementSibling?.classList.contains("threads")?r.nextElementSibling:null;a||(a=document.createElement("div"),a.className="threads",r.after(a)),a.insertAdjacentHTML("beforeend",`<div class="thread"><div class="thread-where">${s.endLine?`Lines ${s.line}\u2013${s.endLine}`:`Line ${s.line}`}</div>${ze(s,n)}</div>`)}}var Pe=new Set(["png","jpg","jpeg","gif","webp","avif","svg","ico","bmp"]),pa=new Set(["mp3","ogg","oga","wav","flac","m4a","aac","opus"]),da=new Set(["mp4","m4v","webm","ogv","mov"]),ha=new Set(["woff","woff2","ttf","otf"]),ua=new Set(["zip","gz","tgz","bz2","xz","7z","rar","tar","exe","dll","so","dylib","bin","dat","glb","fbx","blend","vox","wasm","class","jar","o","a","pyc","db","sqlite","psd","ai","sketch","fig","xlsx","docx","pptx","ktx2","basis","dds","hdr","exr","mid","midi"]),Fn={csv:",",tsv:" "},fa=()=>x.info.maxFile||5*1048576,Wn=t=>V(t)+"?download=1",ma=t=>matchMedia("(max-width: 759px)").matches?document.scrollingElement:t;function ga(t){let e=oe(t);return e==="svg"?"svg":Pe.has(e)?"image":pa.has(e)?"audio":da.has(e)?"video":ha.has(e)?"font":e==="pdf"?"pdf":ua.has(e)?"binary":e==="md"||e==="markdown"||e==="mdx"?"markdown":e==="html"||e==="htm"?"html":e==="ipynb"?"notebook":e==="mmd"||e==="mermaid"?"diagram":e in Fn?"table":e==="json"||e==="geojson"||e==="webmanifest"||e==="gltf"?"json":"text"}var Bn={image:"Image",svg:"Image",audio:"Player",video:"Player",font:"Font",pdf:"PDF",markdown:"Rendered",html:"Preview",notebook:"Notebook",table:"Table",json:"Tree",binary:"Hex",diagram:"Diagram"},ka=new Set(["svg","markdown","html","notebook","table","json","text","diagram"]),te={path:"",token:0};function Un(){te={path:"",token:te.token+1}}async function Ye(t,e=!1){let{folder:n,open:s,tab:r}=M(),a=z(n,s);if(!e&&te.path===a&&te.tab===(r||""))return;let o=ma(t),i=e&&te.path===a?o.scrollTop:0,l=++te.token;te={path:a,tab:r||"",token:l};let c=(x.cache.get(n)||[]).find(T=>T.name===s),d=x.changes.get(a),u=!c&&d?.state==="deleted",k=ga(s),g=[];u?g.push(["deleted","Last committed"]):(Bn[k]&&g.push(["preview",Bn[k]]),ka.has(k)&&g.push(["source","Source"])),d&&d.state!=="ignored"&&g.push(["diff","Changes"]),d&&(k==="image"||k==="svg")&&d.state!=="new"&&d.state!=="added"&&g.push(["compare","Compare"]),x.git&&d?.state!=="new"&&!Y(a)&&g.push(["history","History"]);let f=g.some(([T])=>T===r)?r:g[0]?.[0]||"source",b=V(a),v=d&&d.state!=="ignored"?d.state:"",y=ce(a).filter(T=>T.status==="open").length,m=`<header class="file-head">
121
- <button class="icon-btn back" id="back" aria-label="Back to the folder" title="Back to the folder">${$("chevron-left")}</button>
107
+ </form>`}function Fe(t,e){return F(t).filter(s=>!s.line&&(b.settings.resolved||s.status==="open")).map(s=>`<div class="thread">${s.strokes?.length?`<div class="thread-where"><span class="pin static ${s.status}">${Ce(s)}</span> Marked area</div>`:""}${De(s,e)}</div>`).join("")}document.addEventListener("click",async t=>{let e=t.target.closest("[data-cact]");if(!e)return;let n=e.closest("[data-cid]"),s=n?.dataset.cid;if(!s)return;let r=e.dataset.cact;try{if(r==="resolve"||r==="reopen")await M("api/comments/"+s,{method:"PATCH",json:{status:r==="resolve"?"resolved":"open"}});else if(r==="delete"){if(!confirm("Delete this comment?"))return;await M("api/comments/"+s,{method:"DELETE"})}else if(r==="edit"){let a=b.comments.find(i=>i.id===s),o=n.querySelector(":scope > .cmt-body");o.outerHTML=`<form class="edit-form" data-cid="${h(s)}"><textarea rows="3">${h(a?.body||"")}</textarea><div class="composer-acts"><button class="btn primary" type="submit">Save</button><button class="btn" type="button" data-cancel-edit>Cancel</button></div></form>`,n.querySelector(".edit-form textarea").focus();return}await ct()}catch(a){le(a.message)}});document.addEventListener("click",t=>{t.target.closest("[data-cancel-edit]")&&ct();let e=t.target.closest("[data-cancel]");e&&(e.closest(".composer")?.remove(),ee("composer-closed"))});document.addEventListener("keydown",t=>{t.key==="Enter"&&(t.ctrlKey||t.metaKey)&&t.target.matches("form textarea")&&(t.preventDefault(),t.target.form.requestSubmit()),t.key==="Escape"&&t.target.matches(".composer textarea")&&(t.stopPropagation(),t.target.closest(".composer").remove(),ee("composer-closed"))});document.addEventListener("submit",async t=>{let e=t.target;if(!e.matches(".composer, .reply-form, .edit-form"))return;t.preventDefault();let n=e.querySelector("textarea").value.trim();if(!n)return;let s=e.querySelector("[type=submit]");s.disabled=!0;try{if(e.matches(".composer")){let r={path:e.dataset.path,body:n,author:et()};if(e.dataset.line&&(r.line=Number(e.dataset.line)),e.dataset.end&&(r.endLine=Number(e.dataset.end)),e.getMarks){let a=await e.getMarks();if(!a){s.disabled=!1;return}Object.assign(r,a)}await M("api/comments",{method:"POST",json:r}),e.remove(),ee("composer-closed")}else e.matches(".reply-form")?await M(`api/comments/${e.dataset.cid}/replies`,{method:"POST",json:{body:n,author:et()}}):await M("api/comments/"+e.dataset.cid,{method:"PATCH",json:{body:n}});await ct()}catch(r){s.disabled=!1,le(r.message)}});document.addEventListener("input",t=>{t.target.matches(".reply-form textarea, .composer textarea, .edit-form textarea")&&(t.target.style.height="auto",t.target.style.height=Math.min(t.target.scrollHeight+2,320)+"px")});var Pa=(t,e)=>`Read ${t}. It lists review comments on files in this folder (path:line, the quoted code, and the comment). Work through each open comment: make the change it asks for, then set that comment's "status" to "resolved" in ${e} and add a reply saying what you did. If you can't or shouldn't act on one, leave it open and reply with why.`;function ts(t,e){let n=b.comments,s=n.filter(u=>u.status==="open"),r=e==="resolved"?n.filter(u=>u.status==="resolved"):e==="all"?n:s,a=new Map;for(let u of[...r].sort((f,g)=>f.path.localeCompare(g.path)||(f.line||0)-(g.line||0)))a.has(u.path)||a.set(u.path,[]),a.get(u.path).push(u);let{md:o,json:i}=b.info.review,l=o&&!o.startsWith("..")?O(o):"",c=[["open",`Open (${s.length})`],["resolved",`Resolved (${n.length-s.length})`],["all",`All (${n.length})`]].map(([u,f])=>`<button class="btn${(e||"open")===u?" on":""}" data-rf="${u}">${f}</button>`).join(""),d=[...a].map(([u,f])=>`<section class="rgroup"><h3 class="group-title"><a href="${O(u)}">${h(u||".")}</a><span class="faint">${f.length}</span></h3>${f.map(g=>`<div class="rcard"><div class="rwhere"><a class="pill" href="${O(u,g.line?{line:String(g.line)}:{})}">${Oa(g)}</a>${g.commit?`<span class="faint">@ ${h(g.commit)}</span>`:""}</div>${g.quote?`<pre class="quote">${h(g.quote)}</pre>`:""}${g.image?`<a href="${O(u)}"><img class="rimg" src="api/comments/${h(g.id)}/image.png" alt="The marked area" loading="lazy"></a>`:""}${De(g,u.includes("/")?u.slice(0,u.lastIndexOf("/")):"")}</div>`).join("")}</section>`).join("");t.innerHTML=`<header class="head"><h2 class="page-title">${x("chat")} Review</h2>
108
+ <label class="switch" title="Click any line of a file to comment on it"><input type="checkbox" id="rmode" ${b.settings.review?"checked":""}> Review mode</label></header>
109
+ <p class="lede">Leave comments on files or lines (tap a line number). They're saved in <code>${h(b.info.review.dir)}/</code> as <code>comments.json</code>, and written out as <code>REVIEW.md</code> for an agent to work through. Its replies and resolutions show up here live.</p>
110
+ <div class="head"><div class="tabs">${c}</div><span class="grow"></span>
111
+ ${l?`<a class="btn" href="${l}">${x("file",16)} REVIEW.md</a>`:""}
112
+ <button class="btn" id="copy-prompt" title="Copy instructions to paste into your agent">${x("copy",16)} Copy prompt for an agent</button>
113
+ ${n.length-s.length&&!b.info.readOnly?'<button class="btn" id="clear-resolved">Clear resolved</button>':""}</div>
114
+ ${d||`<p class="empty">${e==="resolved"?"Nothing resolved yet.":e==="all"?"No comments yet. Open a file and click a line number to leave one.":"No open comments. Open a file and click a line number to leave one."}</p>`}`,t.querySelectorAll("[data-rf]").forEach(u=>u.onclick=()=>R({q:u.dataset.rf==="open"?"":u.dataset.rf})),t.querySelector("#rmode").onchange=u=>{xe("review",u.target.checked),ee("settings")},t.querySelector("#copy-prompt").onclick=()=>K(b.info.review.prompt||Pa(o,i),"Prompt copied");let p=t.querySelector("#clear-resolved");p&&(p.onclick=async()=>{confirm("Remove every resolved comment?")&&(await M("api/comments?resolved=1",{method:"DELETE"}),await ct())})}function Bt(){let t=b.comments.filter(n=>n.status==="open").length,e=$("review-count");e&&(e.textContent=String(t),e.hidden=!t)}var Ue=null,Na="#ff2d55";function ns({path:t,stage:e,pic:n,tools:s,step:r}){let a={path:t,stage:e,pic:n,tools:s,wrap:e.querySelector(".picwrap"),strokes:[],drawing:!1,canvas:null};Ue=a,Dt(a),n.onclick=()=>{a.drawing||e.classList.toggle("actual")};let o=null;e.addEventListener("touchstart",i=>{o=i.touches.length===1?{x:i.touches[0].clientX,y:i.touches[0].clientY,t:Date.now()}:null},{passive:!0}),e.addEventListener("touchend",i=>{let l=o;if(o=null,!l||a.drawing||e.classList.contains("actual")||!i.changedTouches.length)return;let c=i.changedTouches[0].clientX-l.x,d=i.changedTouches[0].clientY-l.y;Math.abs(c)>60&&Math.abs(c)>1.5*Math.abs(d)&&Date.now()-l.t<800&&r(c<0?1:-1)}),s.onclick=i=>{let l=i.target.closest("[data-ink]");if(!l)return;let c=l.dataset.ink;c==="start"?Ba(a):c==="undo"?(a.strokes.pop(),qe(a)):c==="clear"?(a.strokes=[],qe(a)):c==="cancel"&&ss(a)},Ft()}function Dt(t){let e=b.info.readOnly,n=matchMedia("(pointer: coarse)").matches;t.tools.innerHTML=t.drawing?`<span class="ink-hint">${x("pen",14)} Draw on the picture around what you mean, then say what should change.</span><span class="grow"></span><button class="btn small" data-ink="undo">${x("undo",14)} Undo</button><button class="btn small" data-ink="clear">Clear</button><button class="btn small" data-ink="cancel">Cancel</button>`:`${e?"":`<button class="btn small" data-ink="start">${x("pen",14)} Mark an area</button>`}<span class="faint hint">${n?"Tap to zoom \xB7 swipe for the next file":"Click to see it at full size"}</span>`}function Ba(t){if(t.drawing)return;t.drawing=!0,t.strokes=[],t.stage.classList.remove("actual"),t.wrap.classList.add("drawing");let e=document.createElement("canvas");e.className="ink",t.wrap.append(e),t.canvas=e;let n=null,s=a=>{let o=e.getBoundingClientRect();return[Math.min(1,Math.max(0,(a.clientX-o.left)/o.width)),Math.min(1,Math.max(0,(a.clientY-o.top)/o.height))]};e.onpointerdown=a=>{a.preventDefault(),e.setPointerCapture(a.pointerId),n=[...s(a)],t.strokes.push(n),qe(t)},e.onpointermove=a=>{if(!n)return;let[o,i]=s(a),l=n[n.length-2],c=n[n.length-1];Math.hypot(o-l,i-c)<.002||(n.push(o,i),qe(t))},e.onpointerup=e.onpointercancel=()=>n=null,Dt(t),t.tools.insertAdjacentHTML("afterend",ae(t.path,0,0));let r=t.tools.nextElementSibling;r.classList.add("ink-composer"),r.querySelector(".composer-head").firstChild.textContent="Comment on the marked area ",r.getMarks=()=>Da(t),new ResizeObserver(()=>qe(t)).observe(e),qe(t)}function ss(t){t.drawing&&(t.drawing=!1,t.canvas?.remove(),t.canvas=null,t.strokes=[],t.wrap.classList.remove("drawing"),t.tools.parentElement?.querySelector(".ink-composer")?.remove(),Dt(t))}Ie("composer-closed",()=>{Ue?.drawing&&!Ue.tools.parentElement?.querySelector(".ink-composer")&&ss(Ue)});function qe(t){let e=t.canvas;if(!e)return;let n=e.getBoundingClientRect(),s=devicePixelRatio||1;e.width=Math.max(1,Math.round(n.width*s)),e.height=Math.max(1,Math.round(n.height*s));let r=e.getContext("2d");rs(r,t.strokes,e.width,e.height,3*s)}function rs(t,e,n,s,r){t.lineCap="round",t.lineJoin="round";for(let[a,o]of[["rgba(255,255,255,.85)",r*2],[Na,r]]){t.strokeStyle=a,t.lineWidth=o;for(let i of e){t.beginPath(),t.moveTo(i[0]*n,i[1]*s),i.length===2&&t.lineTo(i[0]*n+.1,i[1]*s);for(let l=2;l<i.length;l+=2)t.lineTo(i[l]*n,i[l+1]*s);t.stroke()}}}async function Da(t){if(!t.strokes.length)return le("Draw on the picture first"),null;let e=t.pic,n=e.naturalWidth||e.clientWidth*2,s=e.naturalHeight||e.clientHeight*2,r=1,a=1,o=0,i=0;for(let d of t.strokes)for(let p=0;p<d.length;p+=2)r=Math.min(r,d[p]),o=Math.max(o,d[p]),a=Math.min(a,d[p+1]),i=Math.max(i,d[p+1]);let l=.01;r=Math.max(0,r-l),a=Math.max(0,a-l),o=Math.min(1,o+l),i=Math.min(1,i+l);let c={strokes:t.strokes.map(d=>d.map(p=>Math.round(p*1e4)/1e4)),area:{x:Math.round(r*n),y:Math.round(a*s),w:Math.max(1,Math.round((o-r)*n)),h:Math.max(1,Math.round((i-a)*s))}};try{let d=Math.min(1,2048/Math.max(n,s)),p=document.createElement("canvas");p.width=Math.max(1,Math.round(n*d)),p.height=Math.max(1,Math.round(s*d));let u=p.getContext("2d");u.drawImage(e,0,0,p.width,p.height),rs(u,c.strokes,p.width,p.height,Math.max(3,p.width/250)),c.snapshot=p.toDataURL("image/png")}catch{}return c}function Ft(){let t=Ue;if(!t||!t.wrap.isConnected)return;let e=t.wrap.querySelector(".marks"),n=t.wrap.querySelector(".pins"),s=F(t.path).filter(r=>r.strokes?.length&&(b.settings.resolved||r.status==="open"));e.innerHTML=s.map(r=>r.strokes.map(a=>`<polyline class="${r.status}" points="${Fa(a)}"/>`).join("")).join(""),n.innerHTML=s.map(r=>`<button class="pin ${r.status}" data-pin="${r.id}" style="left:${r.strokes[0][0]*100}%;top:${r.strokes[0][1]*100}%" title="Marked area ${Ce(r)}" aria-label="Marked area ${Ce(r)}">${Ce(r)}</button>`).join(""),n.onclick=r=>{let a=r.target.closest("[data-pin]"),o=a&&document.querySelector(`#file-threads [data-cid="${a.dataset.pin}"]`);o&&(o.scrollIntoView({block:"center",behavior:"smooth"}),o.classList.remove("flash"),o.offsetWidth,o.classList.add("flash"))}}var Fa=t=>{let e=[];for(let n=0;n<t.length;n+=2)e.push(`${t[n]},${t[n+1]}`);return e.length===1&&e.push(e[0]),e.join(" ")};var Ut=6e4;function Ua(t){let e=/^(\d+)(?:-(\d+))?$/.exec(t||"");if(!e)return null;let n=Number(e[1]),s=Number(e[2]||e[1]);return[Math.min(n,s),Math.max(n,s)]}function Kt(t){let e=[],n=[],s=null,r=0,a=0;for(let o of t.replace(/\r/g,"").split(`
115
+ `)){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@(.*)$/.exec(o);if(i){s={header:o,ctx:i[3].trim(),lines:[]},e.push(s),r=Number(i[1]),a=Number(i[2]);continue}if(!s){n.push(o);continue}o.startsWith("+")?s.lines.push({t:"+",text:o.slice(1),n:a++}):o.startsWith("-")?s.lines.push({t:"-",text:o.slice(1),o:r++}):o.startsWith(" ")?s.lines.push({t:" ",text:o.slice(1),o:r++,n:a++}):o.startsWith("\\")&&s.lines.push({t:"\\",text:o})}return{head:n,hunks:e}}function os(t){let e=new Map;for(let n of t.hunks){let s=0;for(let r=0;r<n.lines.length;r++){let a=n.lines[r];a.t==="-"?s++:a.t==="+"?(e.set(a.n,s>0?"mod":"add"),s>0&&s--):(s>0&&a.n&&e.set(a.n,e.get(a.n)||"del"),s=0)}}return e}function is(t,{download:e}={}){return`<figcaption class="cbar"><span class="caption">${h(t)}</span><span class="ctools"><button class="icon-btn${b.settings.wrap?" on":""}" data-cv="wrap" title="Wrap long lines" aria-label="Wrap long lines">${x("wrap",16)}</button><button class="icon-btn" data-cv="copy" title="Copy" aria-label="Copy">${x("copy",16)}</button>${e?`<a class="icon-btn" href="${e}" download title="Download" aria-label="Download">${x("download",16)}</a>`:""}</span></figcaption>`}function Vt(t,{path:e,text:n,folder:s,marks:r,caption:a,download:o}){let i=n.length>4e6?n.slice(0,4e6):n,l=()=>{let w=Me(i,e);return w.length>1&&w[w.length-1]===""&&i.endsWith(`
116
+ `)&&w.pop(),w},c=l(),d=c.slice(0,Ut),p=d.map((w,v)=>{let y=v+1,k=r?.get(y);return`<div class="ln" data-n="${y}"><a class="gut" href="${V({...L(),line:String(y)})}" data-n="${y}">${y}</a><span class="mk${k?" "+k:""}"></span><span class="src">${w||" "}</span></div>`}),u=Le(e),f=a??`${u||"text"} \xB7 ${d.length.toLocaleString()} ${d.length===1?"line":"lines"}`;t.innerHTML=`<figure class="ui-code">${is(f,{download:o})}<div class="code${b.settings.wrap?" wrap":""}${b.settings.review?" review":""}" tabindex="0" data-path="${h(e)}" data-folder="${h(s)}">${p.join("")}</div></figure>${c.length>Ut?`<p class="note">Showing the first ${Ut.toLocaleString()} of ${c.length.toLocaleString()} lines.</p>`:""}`;let g=t.querySelector(".code");g.lines=d.length,g.text=n,Wa(g,e),Gt(g);let m=Ua(L().line);return m&&Zt(g,m[0],m[1],!0),Be(e).then(w=>{if(!w||!g.isConnected)return;let v=l();g.querySelectorAll(".ln > .src").forEach((k,S)=>{v[S]!==void 0&&(k.innerHTML=v[S]||" ")})}),g}document.addEventListener("click",t=>{let e=t.target.closest("[data-cv]");if(!e)return;let s=e.closest(".ui-code")?.querySelector(".code");if(s){if(e.dataset.cv==="wrap")xe("wrap",!b.settings.wrap),document.querySelectorAll(".ui-code > .code").forEach(r=>r.classList.toggle("wrap",b.settings.wrap)),document.querySelectorAll('[data-cv="wrap"]').forEach(r=>r.classList.toggle("on",b.settings.wrap));else if(e.dataset.cv==="copy"){let r=s.text??[...s.querySelectorAll(".src, .dsrc")].map(a=>a.textContent).join(`
117
+ `);K(r,"Copied").then(()=>{e.innerHTML=x("check",16),e.classList.add("copied"),setTimeout(()=>{e.innerHTML=x("copy",16),e.classList.remove("copied")},1600)})}}});function Gt(t){if(!t)return;let e=t.dataset.path,n=t.dataset.folder;t.querySelectorAll(":scope > .threads").forEach(a=>a.remove()),t.querySelectorAll(".ln.has-c").forEach(a=>a.classList.remove("has-c","has-open"));let s=F(e).filter(a=>a.line&&(b.settings.resolved||a.status==="open")),r=new Map;for(let a of s){let o=Math.min(a.endLine||a.line,t.lines||1);r.has(o)||r.set(o,[]),r.get(o).push(a);for(let i=a.line;i<=(a.endLine||a.line);i++){let l=t.querySelector(`.ln[data-n="${i}"]`);l?.classList.add("has-c"),a.status==="open"&&l?.classList.add("has-open")}}for(let[a,o]of r){let i=t.querySelector(`.ln[data-n="${a}"]`);if(!i)continue;let l=document.createElement("div");l.className="threads",l.innerHTML=o.map(c=>`<div class="thread"><div class="thread-where">${c.endLine?`Lines ${c.line}\u2013${c.endLine}`:`Line ${c.line}`}${c.line>t.lines?" (past the end of the file now)":""}</div>${De(c,n)}</div>`).join(""),i.after(l)}}function Zt(t,e,n,s){t.sel=[e,n],t.querySelectorAll(".ln.sel").forEach(i=>i.classList.remove("sel"));for(let i=e;i<=n;i++)t.querySelector(`.ln[data-n="${i}"]`)?.classList.add("sel");t.querySelector(":scope > .selbar")?.remove();let r=t.querySelector(`.ln[data-n="${n}"]`);if(!r)return;let a=document.createElement("div");a.className="selbar";let o=e===n?`Line ${e}`:`Lines ${e}\u2013${n}`;a.innerHTML=`<span class="faint">${o}</span>${b.info.readOnly?"":`<button class="btn small primary" data-sb="comment">${x("chat",14)} Comment</button>`}<button class="btn small" data-sb="link">${x("link",14)} Link</button><button class="btn small" data-sb="ref">path:line</button><button class="btn small" data-sb="text">${x("copy",14)} Lines</button><button class="mini" data-sb="clear" title="Clear the selection" aria-label="Clear the selection">${x("x",14)}</button>`,r.after(a),s&&requestAnimationFrame(()=>t.querySelector(`.ln[data-n="${e}"]`)?.scrollIntoView({block:"center"}))}function as(t){t.sel=null,t.querySelectorAll(".ln.sel").forEach(e=>e.classList.remove("sel")),t.querySelector(":scope > .selbar")?.remove(),R({line:""},!0)}function Wt(t,e,n,s){t.querySelectorAll(":scope > .composer").forEach(i=>i.remove());let r=t.querySelector(`.ln[data-n="${s}"]`);if(!r)return;(r.nextElementSibling?.classList.contains("threads")?r.nextElementSibling:r).insertAdjacentHTML("afterend",ae(e,n,s)),t.querySelector(":scope > .selbar")?.remove();let o=t.querySelector(".composer textarea");o.focus(),o.scrollIntoView({block:"nearest"})}function Wa(t,e){t.addEventListener("click",n=>{let s=n.target.closest(".gut"),r=n.target.closest("[data-sb]");if(s){n.preventDefault();let o=Number(s.dataset.n),[i,l]=n.shiftKey&&t.sel?[Math.min(t.sel[0],o),Math.max(t.sel[1],o)]:[o,o];if(!n.shiftKey&&t.sel&&t.sel[0]===o&&t.sel[1]===o)return as(t);Zt(t,i,l,!1),R({line:i===l?String(i):`${i}-${l}`},!0),b.settings.review&&!b.info.readOnly&&!n.shiftKey&&Wt(t,e,i,l);return}if(r&&t.sel){let[o,i]=t.sel,l=r.dataset.sb;if(l==="comment")Wt(t,e,o,i);else if(l==="link")K(location.href,"Link copied");else if(l==="ref")K(`${e}:${o}${o!==i?"-"+i:""}`,"Copied");else if(l==="text"){let c=[];for(let d=o;d<=i;d++)c.push(t.querySelector(`.ln[data-n="${d}"] .src`)?.textContent??"");K(c.join(`
118
+ `),"Lines copied")}else l==="clear"&&as(t);return}let a=n.target.closest(".ln");if(a&&b.settings.review&&!b.info.readOnly&&!String(getSelection()).trim()){let o=Number(a.dataset.n),[i,l]=n.shiftKey&&t.sel?[Math.min(t.sel[0],o),Math.max(t.sel[1],o)]:[o,o];Zt(t,i,l,!1),R({line:i===l?String(i):`${i}-${l}`},!0),Wt(t,e,i,l)}})}function We(t,e,n,{comments:s=!0,caption:r=""}={}){if(!e.trim()){t.innerHTML='<p class="note">No changes against the last commit.</p>';return}let a=Kt(e),o=a.head.filter(m=>m&&!/^(diff --git|index |--- |\+\+\+ |(new|deleted) file mode|similarity index|rename (from|to) )/.test(m)),i=a.hunks.flatMap(m=>m.lines.filter(w=>w.t!=="\\")),l=()=>{let m=new Map;for(let w of a.hunks)for(let v of["o","n"]){let y=w.lines.filter(S=>S.t!=="\\"&&(v==="o"?S.t!=="+":S.t!=="-")),k=Me(y.map(S=>S.text).join(`
119
+ `),n);y.forEach((S,C)=>{(v==="n"||S.t==="-")&&m.set(S,k[C]||" ")})}return m},c=l(),d=[];for(let m of a.hunks){d.push(`<div class="dh"><span>${h(m.header.replace(/@@(.*)$/,"@@"))}</span>${m.ctx?`<span class="faint">${h(m.ctx)}</span>`:""}</div>`);for(let w of m.lines){if(w.t==="\\"){d.push(`<div class="dl meta"><span class="on"></span><span class="nn"></span><span class="dsrc faint">${h(w.text)}</span></div>`);continue}let v=w.t==="+"?"add":w.t==="-"?"del":"";d.push(`<div class="dl ${v}"${w.n?` data-n="${w.n}"`:""}><span class="on">${w.o??""}</span><span class="nn">${w.n?`<a class="gut" data-n="${w.n}">${w.n}</a>`:""}</span><span class="dsrc"><i>${w.t===" "?" ":w.t}</i><span class="dt">${c.get(w)}</span></span></div>`)}}let p=!a.hunks.length&&/Binary files/.test(e),u=i.filter(m=>m.t==="+").length,f=i.filter(m=>m.t==="-").length;t.innerHTML=`${o.length?`<pre class="commit-head">${h(o.join(`
120
+ `))}</pre>`:""}${p?'<p class="note">A binary file changed; no line diff.</p>':a.hunks.length?`<figure class="ui-code">${is(`${r||n} \xB7 +${u} \u2212${f}`)}<div class="diff code${b.settings.wrap?" wrap":""}${b.settings.review&&s?" review":""}" tabindex="0" data-path="${h(n)}">${d.join("")}</div></figure>`:'<p class="note">No lines changed (only its name or mode).</p>'}`;let g=t.querySelector(".diff");g&&(g.text=e,Be(n).then(m=>{if(!m||!g.isConnected)return;let w=l();g.querySelectorAll(".dt").forEach((v,y)=>{let k=w.get(i[y]);k!==void 0&&(v.innerHTML=k)})})),!(!g||!s)&&(Ze(g),g.addEventListener("click",m=>{if(b.info.readOnly||m.target.closest(".threads, .composer"))return;let w=m.target.closest(".gut")||(b.settings.review&&!String(getSelection()).trim()?m.target.closest(".dl[data-n]"):null);if(!w)return;let v=Number(w.dataset.n);g.querySelectorAll(":scope > .composer").forEach(S=>S.remove());let y=g.querySelector(`.dl[data-n="${v}"]`);(y.nextElementSibling?.classList.contains("threads")?y.nextElementSibling:y).insertAdjacentHTML("afterend",ae(n,v,v)),g.querySelector(".composer textarea").focus()}))}function Ze(t){if(!t)return;t.querySelectorAll(":scope > .threads").forEach(s=>s.remove());let e=t.dataset.path,n=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"";for(let s of F(e).filter(r=>r.line&&(b.settings.resolved||r.status==="open"))){let r=t.querySelector(`.dl[data-n="${s.endLine||s.line}"]`);if(!r)continue;let a=r.nextElementSibling?.classList.contains("threads")?r.nextElementSibling:null;a||(a=document.createElement("div"),a.className="threads",r.after(a)),a.insertAdjacentHTML("beforeend",`<div class="thread"><div class="thread-where">${s.endLine?`Lines ${s.line}\u2013${s.endLine}`:`Line ${s.line}`}</div>${De(s,n)}</div>`)}}var be=new Set(["png","jpg","jpeg","gif","webp","avif","svg","ico","bmp"]),Za=new Set(["mp3","ogg","oga","wav","flac","m4a","aac","opus"]),Ka=new Set(["mp4","m4v","webm","ogv","mov"]),Va=new Set(["woff","woff2","ttf","otf"]),Ga=new Set(["zip","gz","tgz","bz2","xz","7z","rar","tar","exe","dll","so","dylib","bin","dat","glb","fbx","blend","vox","wasm","class","jar","o","a","pyc","db","sqlite","psd","ai","sketch","fig","xlsx","docx","pptx","ktx2","basis","dds","hdr","exr","mid","midi"]),ds={csv:",",tsv:" "},Xa=()=>b.info.maxFile||5*1048576,ps=t=>W(t)+"?download=1",Qa=t=>matchMedia("(max-width: 759px)").matches?document.scrollingElement:t;function Ja(t){let e=Q(t);return e==="svg"?"svg":be.has(e)?"image":Za.has(e)?"audio":Ka.has(e)?"video":Va.has(e)?"font":e==="pdf"?"pdf":Ga.has(e)?"binary":e==="md"||e==="markdown"||e==="mdx"?"markdown":e==="html"||e==="htm"?"html":e==="ipynb"?"notebook":e==="mmd"||e==="mermaid"?"diagram":e in ds?"table":e==="json"||e==="geojson"||e==="webmanifest"||e==="gltf"?"json":"text"}var ls={image:"Image",svg:"Image",audio:"Player",video:"Player",font:"Font",pdf:"PDF",markdown:"Rendered",html:"Preview",notebook:"Notebook",table:"Table",json:"Tree",binary:"Hex",diagram:"Diagram"},Ya=new Set(["svg","markdown","html","notebook","table","json","text","diagram"]),oe={path:"",token:0};function hs(){oe={path:"",token:oe.token+1}}async function dt(t,e=!1){let{folder:n,open:s,tab:r}=L(),a=z(n,s);if(!e&&oe.path===a&&oe.tab===(r||""))return;let o=Qa(t),i=e&&oe.path===a?o.scrollTop:0,l=++oe.token;oe={path:a,tab:r||"",token:l};let d=(b.cache.get(n)||[]).find(E=>E.name===s),p=b.changes.get(a),u=!d&&p?.state==="deleted",f=Ja(s),g=[];u?g.push(["deleted","Last committed"]):(ls[f]&&g.push(["preview",ls[f]]),Ya.has(f)&&g.push(["source","Source"])),p&&p.state!=="ignored"&&g.push(["diff","Changes"]),p&&(f==="image"||f==="svg")&&p.state!=="new"&&p.state!=="added"&&g.push(["compare","Compare"]),b.git&&p?.state!=="new"&&!te(a)&&g.push(["history","History"]);let m=g.some(([E])=>E===r)?r:g[0]?.[0]||"source",w=W(a),v=p&&p.state!=="ignored"?p.state:"",y=F(a).filter(E=>E.status==="open").length;if(!b.cache.has(n)&&(await ye(n).catch(()=>[]),l!==oe.token))return;let[k,S]=us(n,s),C=`<header class="file-head">
121
+ <button class="icon-btn back" id="back" aria-label="Back to the folder" title="Back to the folder">${x("chevron-left")}</button>
122
122
  <span class="file-name" title="${h(a)}">${h(s)}</span>
123
- ${v?`<span class="badge s-${v}" title="${G[v]}">${We[v]||"\xB7"}</span>`:""}
124
- ${y?`<span class="pill warn" title="Open comments">${$("chat",12)} ${y}</span>`:""}
123
+ ${v?`<span class="badge s-${v}" title="${ne[v]}">${tt[v]||"\xB7"}</span>`:""}
124
+ ${y?`<span class="pill warn" title="Open comments">${x("chat",12)} ${y}</span>`:""}
125
125
  <span class="grow"></span>
126
- <button class="icon-btn hide-sm" id="copy-path" title="Copy the path" aria-label="Copy the path">${$("link")}</button>
127
- ${x.info.readOnly?"":`<button class="icon-btn" id="comment-file" title="Comment on the whole file" aria-label="Comment on the whole file">${$("chat")}</button>`}
128
- ${u?"":`<a class="icon-btn" href="${Wn(a)}" download="${h(s)}" title="Download" aria-label="Download">${$("download")}</a><a class="icon-btn hide-sm" href="${b}" target="_blank" rel="noopener" title="Open the raw file" aria-label="Open the raw file">${$("external")}</a>`}
129
- <button class="icon-btn" id="close" aria-label="Close the file" title="Close (Esc)">${$("x")}</button>
126
+ <button class="icon-btn" id="prev-file" ${k?`title="Previous: ${h(k)} ( [ )" aria-label="Previous file: ${h(k)}"`:'disabled title="No previous file" aria-label="No previous file"'}>${x("arrow-left")}</button>
127
+ <button class="icon-btn" id="next-file" ${S?`title="Next: ${h(S)} ( ] )" aria-label="Next file: ${h(S)}"`:'disabled title="No next file" aria-label="No next file"'}>${x("arrow-right")}</button>
128
+ <button class="icon-btn hide-sm" id="copy-path" title="Copy the path" aria-label="Copy the path">${x("link")}</button>
129
+ ${b.info.readOnly?"":`<button class="icon-btn" id="comment-file" title="Comment on the whole file" aria-label="Comment on the whole file">${x("chat")}</button>`}
130
+ ${u?"":`<a class="icon-btn" href="${ps(a)}" download="${h(s)}" title="Download" aria-label="Download">${x("download")}</a><a class="icon-btn hide-sm" href="${w}" target="_blank" rel="noopener" title="Open the raw file" aria-label="Open the raw file">${x("external")}</a>`}
131
+ <button class="icon-btn" id="close" aria-label="Close the file" title="Close (Esc)">${x("x")}</button>
130
132
  </header>
131
- <div class="meta" id="fmeta">${h(a)}${c?" \xB7 "+Me(c.size)+" \xB7 "+J(c.mtime):u?" \xB7 deleted":""}${d?.add!==void 0?` \xB7 <span class="plus">+${d.add}</span> <span class="minus">\u2212${d.del||0}</span>`:""}</div>
132
- <div id="file-threads">${Ct(a,n)}</div>
133
- ${g.length>1?`<div class="tabs">${g.map(([T,O])=>`<button class="btn${T===f?" on":""}" data-tab="${T}">${O}</button>`).join("")}</div>`:""}
134
- <div id="fbody"><div class="skeleton" style="width:70%"></div></div>`;t.innerHTML=m,o.scrollTop=0,w("close").onclick=()=>q({open:"",tab:"",line:""}),w("back").onclick=()=>q({open:"",tab:"",line:""}),w("copy-path").onclick=()=>D(a,"Path copied");let L=w("comment-file");L&&(L.onclick=()=>{w("file-threads").querySelector(".composer")||(w("file-threads").insertAdjacentHTML("beforeend",_e(a,0,0)),w("file-threads").querySelector(".composer textarea").focus())}),t.querySelectorAll("[data-tab]").forEach(T=>T.onclick=()=>q({tab:T.dataset.tab===g[0][0]?"":T.dataset.tab,line:""}));let E=w("fbody"),C=()=>l!==te.token;try{await ba(f,{body:E,path:a,folder:n,kind:k,url:b,e:c,change:d,stale:C})}catch(T){C()||(E.innerHTML=`<p class="note">${h(T.message)}</p>`)}i&&!C()&&(o.scrollTop=i)}function Zn(t){let{folder:e,open:n}=M(),s=t.querySelector("#file-threads");if(!s||!n)return;let r=s.querySelector(".composer");s.innerHTML=Ct(z(e,n),e),r&&s.append(r),Pt(t.querySelector("#fbody > .code, #fbody .code:not(.diff)")),Ot(t.querySelector(".diff"))}async function ba(t,e){let{body:n,path:s,folder:r,kind:a,url:o,e:i,stale:l}=e,p=async()=>{if(i&&i.size>fa())throw new Error(`Too large to show here (${Me(i.size)}). Download it instead.`);return(await fetch(o)).text()};if(t==="diff"){let c=await R("api/git/diff?p="+encodeURIComponent(s));if(l())return;He(n,c,s,{caption:"Changes since the last commit"});return}if(t==="deleted"){let c=await R("api/git/show?p="+encodeURIComponent(s));if(l())return;n.innerHTML='<p class="note">This file was deleted. It looked like this at the last commit:</p><div id="code-host"></div>',Ht(w("code-host"),{path:s,text:c,folder:r});return}if(t==="history")return wa(n,s,l);if(t==="compare"){n.innerHTML=`<div class="compare"><figure><figcaption>Last commit</figcaption><div class="stage"><img src="api/git/raw?p=${encodeURIComponent(s)}" alt="Before"></div></figure><figure><figcaption>Now</figcaption><div class="stage"><img src="${o}?t=${Date.now()}" alt="After"></div></figure></div>`;return}if(t==="source"||a==="text"){let c=await p();if(l())return;if(c.includes("\0"))return Dn(n,o,l);let d=e.change?.state==="new"||e.change?.state==="added";n.innerHTML='<div id="code-host"></div>';let u=Ht(w("code-host"),{path:s,text:c,folder:r,marks:d?new Map(c.split(`
135
- `).map((k,g)=>[g+1,"add"])):void 0,download:Wn(s)});if(e.change&&!d&&e.change.state!=="ignored"){let k=await R("api/git/diff?p="+encodeURIComponent(s)).catch(()=>"");if(l()||!u.isConnected)return;for(let[g,f]of On(_t(k)))u.querySelector(`.ln[data-n="${g}"] .mk`)?.classList.add(f)}return}switch(a){case"image":case"svg":{n.innerHTML=`<div class="stage" id="stage"><img id="pic" src="${o}?t=${i?i.mtime:0}" alt="${h(s)}"></div><p class="faint hint">Click to see it at full size.</p>`;let c=w("pic");c.onload=()=>{let d=w("fmeta");d&&!d.dataset.dim&&(d.dataset.dim="1",d.insertAdjacentHTML("beforeend",` \xB7 ${c.naturalWidth} \xD7 ${c.naturalHeight}`))},c.onclick=()=>w("stage").classList.toggle("actual");return}case"audio":n.innerHTML=`<div class="stage"><audio controls preload="metadata" src="${o}"></audio></div>`;return;case"video":n.innerHTML=`<div class="stage"><video controls preload="metadata" src="${o}"></video></div>`;return;case"pdf":n.innerHTML=`<div class="stage"><iframe src="${o}" title="${h(s)}"></iframe></div>`;return;case"font":return xa(n,o);case"binary":return Dn(n,o,l);case"markdown":{let c=await p();if(l())return;n.innerHTML='<article class="md card"></article>',Se(n.firstElementChild,c,r);return}case"diagram":{let c=await p();if(l())return;n.innerHTML='<div class="stage diagram"></div>',await Xe(n.firstElementChild,c);return}case"html":n.innerHTML=`<p class="faint hint">Shown sandboxed: scripts don't run.</p><div class="stage page"><iframe sandbox="" src="${o}?as=page" title="${h(s)}"></iframe></div>`;return;case"table":{let c=await p();return l()?void 0:ya(n,c,Fn[oe(s)])}case"json":{let c=await p();if(l())return;let d;try{d=JSON.parse(c)}catch(u){n.innerHTML=`<p class="note">Not valid JSON: ${h(u.message)}</p>`;return}n.innerHTML=`<div class="code-foot"><button class="btn small" data-jt="open">Expand all</button><button class="btn small" data-jt="close">Collapse all</button></div><div class="jtree">${Vn(d,0)}</div>`,n.querySelectorAll("[data-jt]").forEach(u=>u.onclick=()=>n.querySelectorAll(".jtree details").forEach(k=>k.open=u.dataset.jt==="open"));return}case"notebook":{let c=await p();return l()?void 0:va(n,c,r)}}}async function wa(t,e,n){let{commits:s}=await R("api/git/log?p="+encodeURIComponent(e));if(!n()){if(!s.length){t.innerHTML='<p class="note">No commits touch this file yet.</p>';return}t.innerHTML=`<div class="commits">${s.map(r=>`<button class="commit" data-h="${h(r.hash)}"><code>${h(r.hash)}</code><span class="subj">${h(r.subject)}</span><span class="faint">${h(r.author)} \xB7 ${J(r.time)}</span></button>`).join("")}</div><div id="commit-diff"></div>`,t.querySelectorAll("[data-h]").forEach(r=>r.onclick=async()=>{t.querySelectorAll(".commit").forEach(o=>o.classList.toggle("on",o===r));let a=await R(`api/git/commit?p=${encodeURIComponent(e)}&h=${r.dataset.h}`);He(w("commit-diff"),a,e,{comments:!1,caption:r.dataset.h}),w("commit-diff").scrollIntoView({block:"nearest"})})}}async function Dn(t,e,n){let s=await fetch(e,{headers:{range:"bytes=0-8191"}}),r=new Uint8Array(await s.arrayBuffer());if(n())return;let a=[];for(let o=0;o<r.length;o+=16){let i=[...r.slice(o,o+16)],l=i.map(c=>c.toString(16).padStart(2,"0")).join(" "),p=i.map(c=>c>=32&&c<127?String.fromCharCode(c):".").join("");a.push(`<span class="faint">${o.toString(16).padStart(8,"0")}</span> ${l.padEnd(47)} ${h(p)}`)}t.innerHTML=`<p class="faint hint">No preview for this kind of file. The first ${r.length.toLocaleString()} bytes:</p><pre class="hex">${a.join(`
136
- `)}</pre>`}async function xa(t,e){let n="fs-font-"+Math.random().toString(36).slice(2),s=new FontFace(n,`url("${e}")`);try{await s.load(),document.fonts.add(s)}catch{t.innerHTML='<p class="note">This font could not be loaded.</p>';return}let r="The quick brown fox jumps over the lazy dog";t.innerHTML=`<div class="font" style="font-family:'${n}'">
133
+ <div class="meta" id="fmeta">${h(a)}${d?" \xB7 "+je(d.size)+" \xB7 "+Z(d.mtime):u?" \xB7 deleted":""}${p?.add!==void 0?` \xB7 <span class="plus">+${p.add}</span> <span class="minus">\u2212${p.del||0}</span>`:""}</div>
134
+ <div id="file-threads">${Fe(a,n)}</div>
135
+ ${g.length>1?`<div class="tabs">${g.map(([E,ie])=>`<button class="btn${E===m?" on":""}" data-tab="${E}">${ie}</button>`).join("")}</div>`:""}
136
+ <div id="fbody"><div class="skeleton" style="width:70%"></div></div>`;t.innerHTML=C,o.scrollTop=0,$("close").onclick=()=>R({open:"",tab:"",line:""}),$("back").onclick=()=>R({open:"",tab:"",line:""}),$("copy-path").onclick=()=>K(a,"Path copied"),$("prev-file").onclick=()=>Ke(-1),$("next-file").onclick=()=>Ke(1);let q=$("comment-file");q&&(q.onclick=()=>{$("file-threads").querySelector(".composer")||($("file-threads").insertAdjacentHTML("beforeend",ae(a,0,0)),$("file-threads").querySelector(".composer textarea").focus())}),t.querySelectorAll("[data-tab]").forEach(E=>E.onclick=()=>R({tab:E.dataset.tab===g[0][0]?"":E.dataset.tab,line:""}));let j=$("fbody"),N=()=>l!==oe.token;try{await eo(m,{body:j,path:a,folder:n,kind:f,url:w,e:d,change:p,stale:N})}catch(E){N()||(j.innerHTML=`<p class="note">${h(E.message)}</p>`)}i&&!N()&&(o.scrollTop=i)}function us(t,e){let n=(b.cache.get(t)||[]).filter(r=>r.type!=="folder");b.settings.ignored==="hide"&&(n=n.filter(r=>!te(z(t,r.name))));let s=n.findIndex(r=>r.name===e);return s<0?["",""]:[n[s-1]?.name||"",n[s+1]?.name||""]}function Ke(t){let{folder:e,open:n}=L();if(!n)return;let s=us(e,n)[t<0?0:1];s&&R({open:s,tab:"",line:""})}function fs(t){let{folder:e,open:n}=L(),s=t.querySelector("#file-threads");if(!s||!n)return;let r=s.querySelector(".composer");s.innerHTML=Fe(z(e,n),e),r&&s.append(r),Gt(t.querySelector("#fbody > .code, #fbody .code:not(.diff)")),Ze(t.querySelector(".diff")),Ft()}async function eo(t,e){let{body:n,path:s,folder:r,kind:a,url:o,e:i,stale:l}=e,c=async()=>{if(i&&i.size>Xa())throw new Error(`Too large to show here (${je(i.size)}). Download it instead.`);return(await fetch(o)).text()};if(t==="diff"){let d=await M("api/git/diff?p="+encodeURIComponent(s));if(l())return;We(n,d,s,{caption:"Changes since the last commit"});return}if(t==="deleted"){let d=await M("api/git/show?p="+encodeURIComponent(s));if(l())return;n.innerHTML='<p class="note">This file was deleted. It looked like this at the last commit:</p><div id="code-host"></div>',Vt($("code-host"),{path:s,text:d,folder:r});return}if(t==="history")return to(n,s,l);if(t==="compare"){n.innerHTML=`<div class="compare"><figure><figcaption>Last commit</figcaption><div class="stage"><img src="api/git/raw?p=${encodeURIComponent(s)}" alt="Before"></div></figure><figure><figcaption>Now</figcaption><div class="stage"><img src="${o}?t=${Date.now()}" alt="After"></div></figure></div>`;return}if(t==="source"||a==="text"){let d=await c();if(l())return;if(d.includes("\0"))return cs(n,o,l);let p=e.change?.state==="new"||e.change?.state==="added";n.innerHTML='<div id="code-host"></div>';let u=Vt($("code-host"),{path:s,text:d,folder:r,marks:p?new Map(d.split(`
137
+ `).map((f,g)=>[g+1,"add"])):void 0,download:ps(s)});if(e.change&&!p&&e.change.state!=="ignored"){let f=await M("api/git/diff?p="+encodeURIComponent(s)).catch(()=>"");if(l()||!u.isConnected)return;for(let[g,m]of os(Kt(f)))u.querySelector(`.ln[data-n="${g}"] .mk`)?.classList.add(m)}return}switch(a){case"image":case"svg":{n.innerHTML=`<div class="stage" id="stage"><div class="picwrap" id="picwrap"><img id="pic" src="${o}?t=${i?i.mtime:0}" alt="${h(s)}" draggable="false"><svg class="marks" id="marks" viewBox="0 0 1 1" preserveAspectRatio="none" aria-hidden="true"></svg><div class="pins" id="pins"></div></div></div><div class="img-tools" id="img-tools"></div>`;let d=$("pic");ns({path:s,stage:$("stage"),pic:d,tools:$("img-tools"),step:Ke}),d.onload=()=>{let p=$("fmeta");p&&!p.dataset.dim&&(p.dataset.dim="1",p.insertAdjacentHTML("beforeend",` \xB7 ${d.naturalWidth} \xD7 ${d.naturalHeight}`))};return}case"audio":n.innerHTML=`<div class="stage"><audio controls preload="metadata" src="${o}"></audio></div>`;return;case"video":n.innerHTML=`<div class="stage"><video controls preload="metadata" src="${o}"></video></div>`;return;case"pdf":n.innerHTML=`<div class="stage"><iframe src="${o}" title="${h(s)}"></iframe></div>`;return;case"font":return no(n,o);case"binary":return cs(n,o,l);case"markdown":{let d=await c();if(l())return;n.innerHTML='<article class="md card"></article>',Ae(n.firstElementChild,d,r);return}case"diagram":{let d=await c();if(l())return;n.innerHTML='<div class="stage diagram"></div>',await lt(n.firstElementChild,d);return}case"html":n.innerHTML=`<p class="faint hint">Shown sandboxed: scripts don't run.</p><div class="stage page"><iframe sandbox="" src="${o}?as=page" title="${h(s)}"></iframe></div>`;return;case"table":{let d=await c();return l()?void 0:ro(n,d,ds[Q(s)])}case"json":{let d=await c();if(l())return;let p;try{p=JSON.parse(d)}catch(u){n.innerHTML=`<p class="note">Not valid JSON: ${h(u.message)}</p>`;return}n.innerHTML=`<div class="code-foot"><button class="btn small" data-jt="open">Expand all</button><button class="btn small" data-jt="close">Collapse all</button></div><div class="jtree">${ms(p,0)}</div>`,n.querySelectorAll("[data-jt]").forEach(u=>u.onclick=()=>n.querySelectorAll(".jtree details").forEach(f=>f.open=u.dataset.jt==="open"));return}case"notebook":{let d=await c();return l()?void 0:ao(n,d,r)}}}async function to(t,e,n){let{commits:s,more:r}=await M("api/git/log?p="+encodeURIComponent(e));if(n())return;if(!s.length){t.innerHTML='<p class="note">No commits touch this file yet.</p>';return}let a=c=>`<button class="commit" data-h="${h(c.hash)}"><code>${h(c.hash)}</code><span class="subj">${h(c.subject)}</span><span class="faint">${h(c.author)} \xB7 ${Z(c.time)}</span></button>`;t.innerHTML=`<div class="commits">${s.map(a).join("")}</div>${r?'<button class="btn small" id="log-more">Show older commits</button>':""}<div id="commit-diff"></div>`;let o=s.length,i=$("log-more");i&&(i.onclick=async()=>{i.disabled=!0;let c=await M(`api/git/log?p=${encodeURIComponent(e)}&skip=${o}`).catch(()=>null);if(n()||!c)return void(i.disabled=!1);o+=c.commits.length,t.querySelector(".commits").insertAdjacentHTML("beforeend",c.commits.map(a).join("")),c.more?i.disabled=!1:i.remove()}),t.querySelector(".commits").onclick=c=>{let d=c.target.closest("[data-h]");d&&l(d).catch(()=>{})};async function l(c){t.querySelectorAll(".commit").forEach(p=>p.classList.toggle("on",p===c));let d=await M(`api/git/commit?p=${encodeURIComponent(e)}&h=${c.dataset.h}`);n()||(We($("commit-diff"),d,e,{comments:!1,caption:c.dataset.h}),$("commit-diff").insertAdjacentHTML("afterbegin",`<a class="btn small" href="${V({folder:L().folder,m:"history",q:c.dataset.h})}">${x("diff",14)} The whole commit</a>`),$("commit-diff").scrollIntoView({block:"nearest"}))}}async function cs(t,e,n){let s=await fetch(e,{headers:{range:"bytes=0-8191"}}),r=new Uint8Array(await s.arrayBuffer());if(n())return;let a=[];for(let o=0;o<r.length;o+=16){let i=[...r.slice(o,o+16)],l=i.map(d=>d.toString(16).padStart(2,"0")).join(" "),c=i.map(d=>d>=32&&d<127?String.fromCharCode(d):".").join("");a.push(`<span class="faint">${o.toString(16).padStart(8,"0")}</span> ${l.padEnd(47)} ${h(c)}`)}t.innerHTML=`<p class="faint hint">No preview for this kind of file. The first ${r.length.toLocaleString()} bytes:</p><pre class="hex">${a.join(`
138
+ `)}</pre>`}async function no(t,e){let n="fs-font-"+Math.random().toString(36).slice(2),s=new FontFace(n,`url("${e}")`);try{await s.load(),document.fonts.add(s)}catch{t.innerHTML='<p class="note">This font could not be loaded.</p>';return}let r="The quick brown fox jumps over the lazy dog";t.innerHTML=`<div class="font" style="font-family:'${n}'">
137
139
  <input class="font-sample" value="${r}" aria-label="Sample text">
138
140
  ${[64,40,28,20,14].map(a=>`<p style="font-size:${a}px" data-s>${r}</p>`).join("")}
139
- <p style="font-size:22px">ABCDEFGHIJKLMNOPQRSTUVWXYZ<br>abcdefghijklmnopqrstuvwxyz<br>0123456789 !@#$%^&amp;*()[]{}?</p></div>`,t.querySelector(".font-sample").oninput=a=>t.querySelectorAll("[data-s]").forEach(o=>o.textContent=a.target.value||r)}function $a(t,e){let n=[],s=[],r="",a=!1;for(let o=0;o<t.length;o++){let i=t[o];if(a)i==='"'&&t[o+1]==='"'?(r+='"',o++):i==='"'?a=!1:r+=i;else if(i==='"'&&r==="")a=!0;else if(i===e)s.push(r),r="";else if(i===`
141
+ <p style="font-size:22px">ABCDEFGHIJKLMNOPQRSTUVWXYZ<br>abcdefghijklmnopqrstuvwxyz<br>0123456789 !@#$%^&amp;*()[]{}?</p></div>`,t.querySelector(".font-sample").oninput=a=>t.querySelectorAll("[data-s]").forEach(o=>o.textContent=a.target.value||r)}function so(t,e){let n=[],s=[],r="",a=!1;for(let o=0;o<t.length;o++){let i=t[o];if(a)i==='"'&&t[o+1]==='"'?(r+='"',o++):i==='"'?a=!1:r+=i;else if(i==='"'&&r==="")a=!0;else if(i===e)s.push(r),r="";else if(i===`
140
142
  `||i==="\r"){if(i==="\r"&&t[o+1]===`
141
- `&&o++,s.push(r),n.push(s),s=[],r="",n.length>5e3)break}else r+=i}return(r||s.length)&&(s.push(r),n.push(s)),n}function ya(t,e,n){let s=$a(e,n);if(!s.length){t.innerHTML='<p class="note">Empty.</p>';return}let[r,...a]=s,o=a.slice(0,2e3),i=r.map((d,u)=>o.length>0&&o.every(k=>k[u]===void 0||k[u]===""||!isNaN(Number(k[u]))));t.innerHTML=`<div class="code-foot"><input class="filter" id="tfilter" placeholder="Filter rows"><span class="faint">${a.length.toLocaleString()} rows \xB7 ${r.length} columns${a.length>o.length?` \xB7 showing ${o.length}`:""}</span></div>
142
- <div class="tablewrap"><table class="grid-table"><thead><tr><th>#</th>${r.map((d,u)=>`<th data-col="${u}">${h(d)}</th>`).join("")}</tr></thead><tbody>${o.map((d,u)=>`<tr><td class="faint">${u+1}</td>${r.map((k,g)=>`<td${i[g]?' class="num"':""}>${h(d[g]??"")}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`;let l=t.querySelector("tbody");w("tfilter").oninput=d=>{let u=d.target.value.toLowerCase();for(let k of l.rows)k.hidden=!!u&&!k.textContent.toLowerCase().includes(u)};let p=-1,c=!0;t.querySelectorAll("th[data-col]").forEach(d=>d.onclick=()=>{let u=Number(d.dataset.col);c=p===u?!c:!0,p=u;let k=[...l.rows];k.sort((g,f)=>{let b=g.cells[u+1].textContent,v=f.cells[u+1].textContent,y=i[u]?Number(b)-Number(v):b.localeCompare(v,void 0,{numeric:!0});return c?y:-y}),l.append(...k),t.querySelectorAll("th").forEach(g=>g.dataset.sort=""),d.dataset.sort=c?"\u25B2":"\u25BC"})}function Vn(t,e){if(t===null)return'<span class="tok-literal">null</span>';if(typeof t=="string")return`<span class="tok-string">"${h(t.length>2e3?t.slice(0,2e3)+"\u2026":t)}"</span>`;if(typeof t=="number")return`<span class="tok-number">${t}</span>`;if(typeof t=="boolean")return`<span class="tok-literal">${t}</span>`;let n=Array.isArray(t),s=n?t.map((i,l)=>[l,i]):Object.entries(t);if(!s.length)return n?"[]":"{}";let r=s.slice(0,1e3),a=r.map(([i,l])=>`<div class="jrow">${n?`<span class="faint">${i}</span>`:`<span class="jkey">${h(i)}</span>`}: ${Vn(l,e+1)}</div>`).join(""),o=s.length>r.length?`<div class="faint">\u2026 ${s.length-r.length} more</div>`:"";return`<details${e<2?" open":""}><summary>${n?`[ ${s.length} ]`:`{ ${s.length} }`}</summary><div class="jkids">${a}${o}</div></details>`}function va(t,e,n){let s;try{s=JSON.parse(e)}catch(i){t.innerHTML=`<p class="note">Not a valid notebook: ${h(i.message)}</p>`;return}let r=i=>Array.isArray(i)?i.join(""):i||"",a=s.metadata?.language_info?.file_extension||".py",o=(s.cells||[]).map(i=>{if(i.cell_type==="markdown")return`<div class="nb-md md" data-md="${h(r(i.source))}"></div>`;let l=Rt(r(i.source),ye("x"+a),`In [${i.execution_count??" "}]`),p=(i.outputs||[]).map(c=>{let d=c.data||{};if(d["image/png"])return`<img class="nb-img" src="data:image/png;base64,${r(d["image/png"]).replace(/\s/g,"")}" alt="">`;if(d["image/jpeg"])return`<img class="nb-img" src="data:image/jpeg;base64,${r(d["image/jpeg"]).replace(/\s/g,"")}" alt="">`;let u=d["text/plain"]?r(d["text/plain"]):c.text?r(c.text):c.ename?`${c.ename}: ${c.evalue}`:"";return u?`<pre class="nb-out${c.output_type==="error"?" err":""}">${h(u.replace(/\x1b\[[\d;]*m/g,""))}</pre>`:""}).join("");return`<div class="nb-cell"><span class="nb-n faint"></span><div>${l}${p}</div></div>`});t.innerHTML=`<div class="nb">${o.join("")||'<p class="note">An empty notebook.</p>'}</div>`;for(let i of t.querySelectorAll("[data-md]"))Se(i,i.dataset.md,n)}var Z=!1;function et(){let t=w("scope"),e=M().folder;t.textContent=Z&&e?`in ${lt(e)}`:"everywhere",t.title=Z&&e?`Searching ${e}/ (click to search everywhere)`:"Searching every folder (click to search only the open folder)",t.classList.toggle("on",Z&&!!e)}function tt(t){Z=t==="here",et(),w("q").focus(),w("q").select()}function Kn(){w("search-form").onsubmit=e=>{e.preventDefault();let n=w("q").value.trim();if(!n)return;let s=M();H({folder:s.folder,m:"search",q:n,scope:Z&&s.folder?"here":"",opts:s.m==="search"?s.opts:"",inc:s.m==="search"?s.inc:""})},w("scope").onclick=()=>{Z=!Z,et(),M().m==="search"&&q({scope:Z?"here":""}),w("q").focus()},addEventListener("hashchange",()=>{let e=M();e.m==="search"&&(w("q").value=e.q,Z=e.scope==="here"),et()});let t=M();t.m==="search"&&(w("q").value=t.q,Z=t.scope==="here"),et()}var Sa=(t,e)=>{let n="",s=0;for(let[r,a]of e)n+=h(t.slice(s,r))+"<mark>"+h(t.slice(r,a))+"</mark>",s=a;return n+h(t.slice(s))},Nt=0;async function Gn(t){let e=M(),n=e.opts||"",s=e.scope==="here"&&e.folder,r=(f,b,v)=>`<button class="btn small${n.includes(f)?" on":""}" data-o="${f}" title="${v}">${b}</button>`;t.innerHTML=`<header class="head"><h2 class="page-title">${$("search")} \u201C${h(e.q)}\u201D</h2></header>
143
+ `&&o++,s.push(r),n.push(s),s=[],r="",n.length>5e3)break}else r+=i}return(r||s.length)&&(s.push(r),n.push(s)),n}function ro(t,e,n){let s=so(e,n);if(!s.length){t.innerHTML='<p class="note">Empty.</p>';return}let[r,...a]=s,o=a.slice(0,2e3),i=r.map((p,u)=>o.length>0&&o.every(f=>f[u]===void 0||f[u]===""||!isNaN(Number(f[u]))));t.innerHTML=`<div class="code-foot"><input class="filter" id="tfilter" placeholder="Filter rows"><span class="faint">${a.length.toLocaleString()} rows \xB7 ${r.length} columns${a.length>o.length?` \xB7 showing ${o.length}`:""}</span></div>
144
+ <div class="tablewrap"><table class="grid-table"><thead><tr><th>#</th>${r.map((p,u)=>`<th data-col="${u}">${h(p)}</th>`).join("")}</tr></thead><tbody>${o.map((p,u)=>`<tr><td class="faint">${u+1}</td>${r.map((f,g)=>`<td${i[g]?' class="num"':""}>${h(p[g]??"")}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`;let l=t.querySelector("tbody");$("tfilter").oninput=p=>{let u=p.target.value.toLowerCase();for(let f of l.rows)f.hidden=!!u&&!f.textContent.toLowerCase().includes(u)};let c=-1,d=!0;t.querySelectorAll("th[data-col]").forEach(p=>p.onclick=()=>{let u=Number(p.dataset.col);d=c===u?!d:!0,c=u;let f=[...l.rows];f.sort((g,m)=>{let w=g.cells[u+1].textContent,v=m.cells[u+1].textContent,y=i[u]?Number(w)-Number(v):w.localeCompare(v,void 0,{numeric:!0});return d?y:-y}),l.append(...f),t.querySelectorAll("th").forEach(g=>g.dataset.sort=""),p.dataset.sort=d?"\u25B2":"\u25BC"})}function ms(t,e){if(t===null)return'<span class="tok-literal">null</span>';if(typeof t=="string")return`<span class="tok-string">"${h(t.length>2e3?t.slice(0,2e3)+"\u2026":t)}"</span>`;if(typeof t=="number")return`<span class="tok-number">${t}</span>`;if(typeof t=="boolean")return`<span class="tok-literal">${t}</span>`;let n=Array.isArray(t),s=n?t.map((i,l)=>[l,i]):Object.entries(t);if(!s.length)return n?"[]":"{}";let r=s.slice(0,1e3),a=r.map(([i,l])=>`<div class="jrow">${n?`<span class="faint">${i}</span>`:`<span class="jkey">${h(i)}</span>`}: ${ms(l,e+1)}</div>`).join(""),o=s.length>r.length?`<div class="faint">\u2026 ${s.length-r.length} more</div>`:"";return`<details${e<2?" open":""}><summary>${n?`[ ${s.length} ]`:`{ ${s.length} }`}</summary><div class="jkids">${a}${o}</div></details>`}function ao(t,e,n){let s;try{s=JSON.parse(e)}catch(i){t.innerHTML=`<p class="note">Not a valid notebook: ${h(i.message)}</p>`;return}let r=i=>Array.isArray(i)?i.join(""):i||"",a=s.metadata?.language_info?.file_extension||".py",o=(s.cells||[]).map(i=>{if(i.cell_type==="markdown")return`<div class="nb-md md" data-md="${h(r(i.source))}"></div>`;let l=Pt(r(i.source),Le("x"+a),`In [${i.execution_count??" "}]`),c=(i.outputs||[]).map(d=>{let p=d.data||{};if(p["image/png"])return`<img class="nb-img" src="data:image/png;base64,${r(p["image/png"]).replace(/\s/g,"")}" alt="">`;if(p["image/jpeg"])return`<img class="nb-img" src="data:image/jpeg;base64,${r(p["image/jpeg"]).replace(/\s/g,"")}" alt="">`;let u=p["text/plain"]?r(p["text/plain"]):d.text?r(d.text):d.ename?`${d.ename}: ${d.evalue}`:"";return u?`<pre class="nb-out${d.output_type==="error"?" err":""}">${h(u.replace(/\x1b\[[\d;]*m/g,""))}</pre>`:""}).join("");return`<div class="nb-cell"><span class="nb-n faint"></span><div>${l}${c}</div></div>`});t.innerHTML=`<div class="nb">${o.join("")||'<p class="note">An empty notebook.</p>'}</div>`;for(let i of t.querySelectorAll("[data-md]"))Ae(i,i.dataset.md,n)}var Y=!1;function pt(){let t=$("scope"),e=L().folder;t.textContent=Y&&e?`in ${wt(e)}`:"everywhere",t.title=Y&&e?`Searching ${e}/ (click to search everywhere)`:"Searching every folder (click to search only the open folder)",t.classList.toggle("on",Y&&!!e)}function ht(t){Y=t==="here",pt(),$("q").focus(),$("q").select()}function gs(){$("search-form").onsubmit=e=>{e.preventDefault();let n=$("q").value.trim();if(!n)return;let s=L();_({folder:s.folder,m:"search",q:n,scope:Y&&s.folder?"here":"",opts:s.m==="search"?s.opts:"",inc:s.m==="search"?s.inc:""})},$("scope").onclick=()=>{Y=!Y,pt(),L().m==="search"&&R({scope:Y?"here":""}),$("q").focus()},addEventListener("hashchange",()=>{let e=L();e.m==="search"&&($("q").value=e.q,Y=e.scope==="here"),pt()});let t=L();t.m==="search"&&($("q").value=t.q,Y=t.scope==="here"),pt()}var oo=(t,e)=>{let n="",s=0;for(let[r,a]of e)n+=h(t.slice(s,r))+"<mark>"+h(t.slice(r,a))+"</mark>",s=a;return n+h(t.slice(s))},Xt=0;async function ks(t){let e=L(),n=e.opts||"",s=e.scope==="here"&&e.folder,r=(m,w,v)=>`<button class="btn small${n.includes(m)?" on":""}" data-o="${m}" title="${v}">${w}</button>`;t.innerHTML=`<header class="head"><h2 class="page-title">${x("search")} \u201C${h(e.q)}\u201D</h2></header>
143
145
  <div class="head search-opts">
144
146
  ${r("c","Aa","Match case")}${r("w","<u>ab</u>","Whole word")}${r("r",".*","Regular expression")}
145
147
  <input class="filter" id="inc" placeholder="Files to include: *.ts, src/**, !*.test.ts" value="${h(e.inc)}" aria-label="Files to include">
146
148
  <span class="scope-chips"><button class="btn small${s?"":" on"}" data-sc="">Everywhere</button>${e.folder?`<button class="btn small${s?" on":""}" data-sc="here">In ${h(e.folder)}/</button>`:""}</span>
147
149
  </div>
148
- <div id="results"><p class="note">Searching\u2026</p></div>`,t.querySelectorAll("[data-o]").forEach(f=>f.onclick=()=>q({opts:n.includes(f.dataset.o)?n.replace(f.dataset.o,""):n+f.dataset.o})),t.querySelectorAll("[data-sc]").forEach(f=>f.onclick=()=>q({scope:f.dataset.sc}));let a=w("inc");a.onchange=()=>q({inc:a.value.trim()}),a.onkeydown=f=>f.key==="Enter"&&a.blur();let o=++Nt,i=new URLSearchParams({q:e.q,scope:s?e.folder:"",include:e.inc||""});n.includes("c")&&i.set("case","1"),n.includes("w")&&i.set("word","1"),n.includes("r")&&i.set("regex","1");let l;try{l=await R("api/search?"+i)}catch(f){o===Nt&&(w("results").innerHTML=`<p class="note">${h(f.message)}</p>`);return}if(o!==Nt)return;if(l.error){w("results").innerHTML=`<p class="note">${h(l.error)}</p>`;return}let p=l.files.filter(f=>f.name),c=l.files.filter(f=>f.matches.length),u=`${c.reduce((f,b)=>f+b.matches.length,0).toLocaleString()} matching lines in ${c.length.toLocaleString()} files${p.length?` \xB7 ${p.length} file names`:""} \xB7 searched ${l.searched.toLocaleString()} files in ${l.ms} ms${l.truncated?" \xB7 stopped early, narrow the search":""}`,k=p.length?`<section class="sgroup"><h3 class="group-title">Files named like this</h3><div class="rows">${p.slice(0,100).map(f=>`<a class="row" href="${P(f.path)}"><span class="ico">${$("file",18)}</span><span class="nm">${h(f.path)}</span><span class="marks">${B(ne(f.path,"file"))}</span></a>`).join("")}</div></section>`:"",g=c.map(f=>{let b=ne(f.path,"file");return`<section class="sfile"><h3 class="group-title"><a href="${P(f.path)}">${h(f.path)}</a>${B(b)}<span class="faint">${f.matches.length}</span></h3><div class="slines">${f.matches.map(v=>`<a class="sline" href="${P(f.path,{line:String(v.line)})}"><span class="sn">${v.line}</span><code>${Sa(v.text,v.hits)}</code></a>`).join("")}</div></section>`}).join("");w("results").innerHTML=`<p class="meta">${u}</p>${k}${g||(p.length?"":'<p class="empty">Nothing found.</p>')}`}var Oe=null,Qn=()=>Oe=null;function La(t,e){let n=t.toLowerCase(),s=e.toLowerCase(),r=s.lastIndexOf("/")+1,a=0,o=0,i=0,l=[];for(let p of n){if(p===" ")continue;let c=s.indexOf(p,a);if(c<0)return null;i=c===a?i+1:0,o+=1+i*2+(c===0||"/._-".includes(s[c-1])?3:0)+(c>=r?2:0),l.push(c),a=c+1}return s.slice(r).startsWith(n)&&(o+=10),{total:o-e.length*.02,hits:l}}async function Bt(){if(w("qo"))return;let t=document.createElement("div");t.id="qo",t.className="modal-back",t.innerHTML=`<div class="modal qo" role="dialog" aria-label="Go to a file"><label class="qo-in">${$("search")}<input id="qo-in" placeholder="Go to a file or folder\u2026" autocomplete="off" spellcheck="false" enterkeyhint="go"></label><div id="qo-list" class="qo-list"><p class="note">Loading\u2026</p></div><div class="qo-foot faint">\u2191\u2193 to move \xB7 Enter to open \xB7 Esc to close \xB7 type <b>?</b> then words to search inside files</div></div>`,document.body.append(t);let e=w("qo-in"),n=w("qo-list");e.focus();let s=()=>t.remove();if(t.onclick=l=>l.target===t&&s(),!Oe){let l=(await R("api/files")).files,p=new Set;for(let c of l)for(let d=ie(c);d&&!p.has(d);d=ie(d))p.add(d);Oe=[...l,...[...p].map(c=>c+"/")]}let r=[],a=0,o=()=>{let l=e.value.trim();if(l.startsWith("?")){r=l.length>1?[{search:l.slice(1).trim()}]:[],n.innerHTML=r.length?`<button class="qo-item on" data-i="0">${$("search",16)} Search everywhere for \u201C${h(r[0].search)}\u201D</button>`:'<p class="note">Type what to search for.</p>',a=0;return}l?r=Oe.map(p=>({p,s:La(l,p)})).filter(p=>p.s).sort((p,c)=>c.s.total-p.s.total).slice(0,60).map(p=>({p:p.p,hits:p.s.hits})):r=Oe.filter(p=>!p.endsWith("/")).slice(0,60).map(p=>({p,hits:[]})),a=Math.min(a,Math.max(0,r.length-1)),n.innerHTML=r.length?r.map((p,c)=>{let d=new Set(p.hits),u=[...p.p].map((f,b)=>d.has(b)?`<b>${h(f)}</b>`:h(f)).join(""),k=p.p.endsWith("/"),g=ne(k?p.p.slice(0,-1):p.p,k?"folder":"file");return`<button class="qo-item${c===a?" on":""}${g?" s-"+g:""}" data-i="${c}">${$(k?"folder":"file",16)}<span class="nm">${u}</span>${B(g,k)}</button>`}).join(""):'<p class="note">No file matches. Start with ? to search inside files.</p>',n.querySelector(".on")?.scrollIntoView({block:"nearest"})},i=l=>{let p=r[l];p&&(s(),p.search?H({m:"search",q:p.search}):p.p.endsWith("/")?H({folder:p.p.slice(0,-1)}):location.hash=P(p.p))};e.oninput=Jt(()=>{a=0,o()},30),e.onkeydown=l=>{l.key==="ArrowDown"||l.key==="ArrowUp"?(l.preventDefault(),a=Math.max(0,Math.min(r.length-1,a+(l.key==="ArrowDown"?1:-1))),n.querySelectorAll(".qo-item").forEach((p,c)=>p.classList.toggle("on",c===a)),n.querySelector(".on")?.scrollIntoView({block:"nearest"})):l.key==="Enter"?(l.preventDefault(),i(a)):l.key==="Escape"&&(l.preventDefault(),s())},n.onclick=l=>{let p=l.target.closest("[data-i]");p&&i(Number(p.dataset.i))},o()}var se="",st=()=>se="",fe=I("sort")||"name",Ta=new Set(["ts","tsx","js","mjs","cjs","jsx","md","mdx","json","css","scss","html","vue","py","rs","go"]),Ma={png:"image",jpg:"image",jpeg:"image",gif:"image",webp:"image",svg:"image",mp3:"music",wav:"music",ogg:"music",mp4:"video",webm:"video",mov:"video",csv:"table",tsv:"table",pdf:"book",zip:"layers",gz:"layers"};function Aa(t,e){if(t.type==="folder")return`<span class="ico folder">${$("folder",18)}</span>`;let n=oe(t.name);return Pe.has(n)&&t.size<4*1048576&&!t.ghost?`<span class="ico"><img loading="lazy" src="${V(z(e,t.name))}" alt=""></span>`:Ta.has(n)?`<span class="ico lang-${n}"><span class="ext">${h(n.slice(0,4))}</span></span>`:`<span class="ico">${$(Ma[n]||"file",18)}</span>`}function ne(t,e){return e==="folder"?x.folderStates.get(t)||(Y(t)?"ignored":""):x.changes.get(t)?.state||(Y(t)?"ignored":"")}function B(t,e){return!t||t==="ignored"&&!e?"":e?t==="ignored"?"":`<span class="dot s-${t}" title="Something inside is ${G[t].toLowerCase()}"></span>`:`<span class="badge s-${t}" title="${G[t]}">${We[t]||"\xB7"}</span>`}function Ra(t){let e=(n,s)=>(s.type==="folder")-(n.type==="folder");return fe==="size"?[...t].sort((n,s)=>e(n,s)||s.size-n.size):fe==="mtime"?[...t].sort((n,s)=>e(n,s)||s.mtime-n.mtime):t}var Dt=new Map;async function nt(t){let{folder:e,open:n,view:s}=M(),r;try{r=await Fe(e)}catch(m){t.innerHTML=`<p class="empty">${h(m.message)}</p>`;return}let a=[...x.changes.values()].filter(m=>m.state==="deleted"&&(m.path.includes("/")?m.path.slice(0,m.path.lastIndexOf("/")):"")===e).map(m=>({name:m.path.slice(m.path.lastIndexOf("/")+1),type:"file",size:0,mtime:0,ghost:!0})).filter(m=>!r.some(L=>L.name===m.name)),o=[...r,...a];x.settings.ignored==="hide"&&(o=o.filter(m=>!Y(z(e,m.name))));let i=o.filter(m=>Pe.has(oe(m.name))).length,l=s?s==="grid":i>=4&&i>=o.length/2,p=Ra(se?o.filter(m=>m.name.toLowerCase().includes(se)):o),c=e?e.split("/"):[],d=[`<button class="crumb${c.length?"":" current"}" data-f="">${h(x.info.name)}</button>`,...c.map((m,L)=>`<span class="sep">/</span><button class="crumb${L===c.length-1?" current":""}" data-f="${h(c.slice(0,L+1).join("/"))}">${h(m)}</button>`)].join(""),u=o.filter(m=>m.type==="folder").length,k=m=>{let L=z(e,m.name),E=m.ghost?"deleted":ne(L,m.type),C=Ue(L);return`<button class="${["row",m.name===n?"open":"",E?"s-"+E:"",m.ghost?"ghost":""].filter(Boolean).join(" ")}" data-e="${h(m.name)}" data-k="${m.type}" title="${h(m.name)}${E?" \xB7 "+G[E]:""}">${Aa(m,e)}<span class="nm">${h(m.name)}${m.link?' <span class="faint">\u21AA</span>':""}</span><span class="marks">${C?`<span class="pill warn">${$("chat",12)}${C}</span>`:""}${B(E,m.type==="folder")}</span><span class="sz">${m.type==="folder"||m.ghost?"":Me(m.size)}</span><span class="tm">${m.ghost?"deleted":J(m.mtime)}</span></button>`},g=m=>{let L=z(e,m.name),E=oe(m.name),C=m.ghost?"deleted":ne(L,m.type),T=m.type==="folder"?$("folder",34):Pe.has(E)&&!m.ghost?`<img loading="lazy" src="${V(L)}" alt="">`:`<span class="ext">.${h(E||"file")}</span>`;return`<button class="tile${m.name===n?" open":""}${C?" s-"+C:""}" data-e="${h(m.name)}" data-k="${m.type}" title="${h(m.name)}"><div class="thumb">${T}${B(C,m.type==="folder")}</div><div class="nm">${h(m.name)}</div></button>`},f=p.length?l?`<div class="grid">${p.map(g).join("")}</div>`:`<div class="rows">${p.map(k).join("")}</div>`:`<p class="empty">${se?"Nothing matches.":"Nothing in this folder."}</p>`,b=r.find(m=>/^readme(\.md|\.markdown|\.txt)?$/i.test(m.name)&&m.type==="file"),v=(e?c[c.length-1]:x.info.name)+".zip";t.innerHTML=`<header class="head"><nav class="crumbs" aria-label="Folder trail">${d}</nav>
149
- <a class="icon-btn" href="api/zip?p=${encodeURIComponent(e)}" download="${h(v)}" title="Download this folder as a .zip" aria-label="Download this folder as a .zip">${$("download")}</a></header>
150
- <div class="head"><input class="filter" id="filter" type="search" placeholder="Filter this folder" value="${h(se)}" aria-label="Filter this folder">
151
- <div class="tools"><span class="seg"><button class="btn${l?"":" on"}" data-v="list" title="List" aria-label="List">${$("list",16)}</button><button class="btn${l?" on":""}" data-v="grid" title="Thumbnails" aria-label="Thumbnails">${$("grid",16)}</button></span>
152
- <select class="btn" id="sort" aria-label="Sort by"><option value="name"${fe==="name"?" selected":""}>Name</option><option value="mtime"${fe==="mtime"?" selected":""}>Newest</option><option value="size"${fe==="size"?" selected":""}>Largest</option></select>
153
- <button class="btn" id="search-here" title="Search inside this folder">${$("search",16)}<span class="hide-sm">Search here</span></button></div>
150
+ <div id="results"><p class="note">Searching\u2026</p></div>`,t.querySelectorAll("[data-o]").forEach(m=>m.onclick=()=>R({opts:n.includes(m.dataset.o)?n.replace(m.dataset.o,""):n+m.dataset.o})),t.querySelectorAll("[data-sc]").forEach(m=>m.onclick=()=>R({scope:m.dataset.sc}));let a=$("inc");a.onchange=()=>R({inc:a.value.trim()}),a.onkeydown=m=>m.key==="Enter"&&a.blur();let o=++Xt,i=new URLSearchParams({q:e.q,scope:s?e.folder:"",include:e.inc||""});n.includes("c")&&i.set("case","1"),n.includes("w")&&i.set("word","1"),n.includes("r")&&i.set("regex","1");let l;try{l=await M("api/search?"+i)}catch(m){o===Xt&&($("results").innerHTML=`<p class="note">${h(m.message)}</p>`);return}if(o!==Xt)return;if(l.error){$("results").innerHTML=`<p class="note">${h(l.error)}</p>`;return}let c=l.files.filter(m=>m.name),d=l.files.filter(m=>m.matches.length),u=`${d.reduce((m,w)=>m+w.matches.length,0).toLocaleString()} matching lines in ${d.length.toLocaleString()} files${c.length?` \xB7 ${c.length} file names`:""} \xB7 searched ${l.searched.toLocaleString()} files in ${l.ms} ms${l.truncated?" \xB7 stopped early, narrow the search":""}`,f=c.length?`<section class="sgroup"><h3 class="group-title">Files named like this</h3><div class="rows">${c.slice(0,100).map(m=>`<a class="row" href="${O(m.path)}"><span class="ico">${x("file",18)}</span><span class="nm">${h(m.path)}</span><span class="marks">${U(de(m.path,"file"))}</span></a>`).join("")}</div></section>`:"",g=d.map(m=>{let w=de(m.path,"file");return`<section class="sfile"><h3 class="group-title"><a href="${O(m.path)}">${h(m.path)}</a>${U(w)}<span class="faint">${m.matches.length}</span></h3><div class="slines">${m.matches.map(v=>`<a class="sline" href="${O(m.path,{line:String(v.line)})}"><span class="sn">${v.line}</span><code>${oo(v.text,v.hits)}</code></a>`).join("")}</div></section>`}).join("");$("results").innerHTML=`<p class="meta">${u}</p>${f}${g||(c.length?"":'<p class="empty">Nothing found.</p>')}`}var Ve=null,bs=()=>Ve=null;function io(t,e){let n=t.toLowerCase(),s=e.toLowerCase(),r=s.lastIndexOf("/")+1,a=0,o=0,i=0,l=[];for(let c of n){if(c===" ")continue;let d=s.indexOf(c,a);if(d<0)return null;i=d===a?i+1:0,o+=1+i*2+(d===0||"/._-".includes(s[d-1])?3:0)+(d>=r?2:0),l.push(d),a=d+1}return s.slice(r).startsWith(n)&&(o+=10),{total:o-e.length*.02,hits:l}}async function Qt(){if($("qo"))return;let t=document.createElement("div");t.id="qo",t.className="modal-back",t.innerHTML=`<div class="modal qo" role="dialog" aria-label="Go to a file"><label class="qo-in">${x("search")}<input id="qo-in" placeholder="Go to a file or folder\u2026" autocomplete="off" spellcheck="false" enterkeyhint="go"></label><div id="qo-list" class="qo-list"><p class="note">Loading\u2026</p></div><div class="qo-foot faint">\u2191\u2193 to move \xB7 Enter to open \xB7 Esc to close \xB7 type <b>?</b> then words to search inside files</div></div>`,document.body.append(t);let e=$("qo-in"),n=$("qo-list");e.focus();let s=()=>t.remove();if(t.onclick=l=>l.target===t&&s(),!Ve){let l=(await M("api/files")).files,c=new Set;for(let d of l)for(let p=ue(d);p&&!c.has(p);p=ue(p))c.add(p);Ve=[...l,...[...c].map(d=>d+"/")]}let r=[],a=0,o=()=>{let l=e.value.trim();if(l.startsWith("?")){r=l.length>1?[{search:l.slice(1).trim()}]:[],n.innerHTML=r.length?`<button class="qo-item on" data-i="0">${x("search",16)} Search everywhere for \u201C${h(r[0].search)}\u201D</button>`:'<p class="note">Type what to search for.</p>',a=0;return}l?r=Ve.map(c=>({p:c,s:io(l,c)})).filter(c=>c.s).sort((c,d)=>d.s.total-c.s.total).slice(0,60).map(c=>({p:c.p,hits:c.s.hits})):r=Ve.filter(c=>!c.endsWith("/")).slice(0,60).map(c=>({p:c,hits:[]})),a=Math.min(a,Math.max(0,r.length-1)),n.innerHTML=r.length?r.map((c,d)=>{let p=new Set(c.hits),u=[...c.p].map((m,w)=>p.has(w)?`<b>${h(m)}</b>`:h(m)).join(""),f=c.p.endsWith("/"),g=de(f?c.p.slice(0,-1):c.p,f?"folder":"file");return`<button class="qo-item${d===a?" on":""}${g?" s-"+g:""}" data-i="${d}">${x(f?"folder":"file",16)}<span class="nm">${u}</span>${U(g,f)}</button>`}).join(""):'<p class="note">No file matches. Start with ? to search inside files.</p>',n.querySelector(".on")?.scrollIntoView({block:"nearest"})},i=l=>{let c=r[l];c&&(s(),c.search?_({m:"search",q:c.search}):c.p.endsWith("/")?_({folder:c.p.slice(0,-1)}):location.hash=O(c.p))};e.oninput=kn(()=>{a=0,o()},30),e.onkeydown=l=>{l.key==="ArrowDown"||l.key==="ArrowUp"?(l.preventDefault(),a=Math.max(0,Math.min(r.length-1,a+(l.key==="ArrowDown"?1:-1))),n.querySelectorAll(".qo-item").forEach((c,d)=>c.classList.toggle("on",d===a)),n.querySelector(".on")?.scrollIntoView({block:"nearest"})):l.key==="Enter"?(l.preventDefault(),i(a)):l.key==="Escape"&&(l.preventDefault(),s())},n.onclick=l=>{let c=l.target.closest("[data-i]");c&&i(Number(c.dataset.i))},o()}var pe="",ft=()=>pe="",we=H("sort")||"name",lo=new Set(["ts","tsx","js","mjs","cjs","jsx","md","mdx","json","css","scss","html","vue","py","rs","go"]),co={png:"image",jpg:"image",jpeg:"image",gif:"image",webp:"image",svg:"image",mp3:"music",wav:"music",ogg:"music",mp4:"video",webm:"video",mov:"video",csv:"table",tsv:"table",pdf:"book",zip:"layers",gz:"layers"};function po(t,e){if(t.type==="folder")return`<span class="ico folder">${x("folder",18)}</span>`;let n=Q(t.name);return be.has(n)&&t.size<4*1048576&&!t.ghost?`<span class="ico"><img loading="lazy" src="${W(z(e,t.name))}" alt=""></span>`:lo.has(n)?`<span class="ico lang-${n}"><span class="ext">${h(n.slice(0,4))}</span></span>`:`<span class="ico">${x(co[n]||"file",18)}</span>`}function de(t,e){return e==="folder"?b.folderStates.get(t)||(te(t)?"ignored":""):b.changes.get(t)?.state||(te(t)?"ignored":"")}function U(t,e){return!t||t==="ignored"&&!e?"":e?t==="ignored"?"":`<span class="dot s-${t}" title="Something inside is ${ne[t].toLowerCase()}"></span>`:`<span class="badge s-${t}" title="${ne[t]}">${tt[t]||"\xB7"}</span>`}function ho(t){let e=(n,s)=>(s.type==="folder")-(n.type==="folder");return we==="size"?[...t].sort((n,s)=>e(n,s)||s.size-n.size):we==="mtime"?[...t].sort((n,s)=>e(n,s)||s.mtime-n.mtime):t}var Jt=new Map;async function ut(t){let{folder:e,open:n,view:s}=L(),r;try{r=await ye(e)}catch(k){t.innerHTML=`<p class="empty">${h(k.message)}</p>`;return}let a=[...b.changes.values()].filter(k=>k.state==="deleted"&&(k.path.includes("/")?k.path.slice(0,k.path.lastIndexOf("/")):"")===e).map(k=>({name:k.path.slice(k.path.lastIndexOf("/")+1),type:"file",size:0,mtime:0,ghost:!0})).filter(k=>!r.some(S=>S.name===k.name)),o=[...r,...a];b.settings.ignored==="hide"&&(o=o.filter(k=>!te(z(e,k.name))));let i=o.filter(k=>be.has(Q(k.name))).length,l=s?s==="grid":i>=4&&i>=o.length/2,c=ho(pe?o.filter(k=>k.name.toLowerCase().includes(pe)):o),d=e?e.split("/"):[],p=[`<button class="crumb${d.length?"":" current"}" data-f="">${h(b.info.name)}</button>`,...d.map((k,S)=>`<span class="sep">/</span><button class="crumb${S===d.length-1?" current":""}" data-f="${h(d.slice(0,S+1).join("/"))}">${h(k)}</button>`)].join(""),u=o.filter(k=>k.type==="folder").length,f=k=>{let S=z(e,k.name),C=k.ghost?"deleted":de(S,k.type),q=nt(S);return`<button class="${["row",k.name===n?"open":"",C?"s-"+C:"",k.ghost?"ghost":""].filter(Boolean).join(" ")}" data-e="${h(k.name)}" data-k="${k.type}" title="${h(k.name)}${C?" \xB7 "+ne[C]:""}">${po(k,e)}<span class="nm">${h(k.name)}${k.link?' <span class="faint">\u21AA</span>':""}</span><span class="marks">${q?`<span class="pill warn">${x("chat",12)}${q}</span>`:""}${U(C,k.type==="folder")}</span><span class="sz">${k.type==="folder"||k.ghost?"":je(k.size)}</span><span class="tm">${k.ghost?"deleted":Z(k.mtime)}</span></button>`},g=k=>{let S=z(e,k.name),C=Q(k.name),q=k.ghost?"deleted":de(S,k.type),j=k.type==="folder"?x("folder",34):be.has(C)&&!k.ghost?`<img loading="lazy" src="${W(S)}" alt="">`:`<span class="ext">.${h(C||"file")}</span>`;return`<button class="tile${k.name===n?" open":""}${q?" s-"+q:""}" data-e="${h(k.name)}" data-k="${k.type}" title="${h(k.name)}"><div class="thumb">${j}${U(q,k.type==="folder")}</div><div class="nm">${h(k.name)}</div></button>`},m=c.length?l?`<div class="grid">${c.map(g).join("")}</div>`:`<div class="rows">${c.map(f).join("")}</div>`:`<p class="empty">${pe?"Nothing matches.":"Nothing in this folder."}</p>`,w=r.find(k=>/^readme(\.md|\.markdown|\.txt)?$/i.test(k.name)&&k.type==="file"),v=(e?d[d.length-1]:b.info.name)+".zip";t.innerHTML=`<header class="head"><nav class="crumbs" aria-label="Folder trail">${p}</nav>
151
+ <a class="icon-btn" href="api/zip?p=${encodeURIComponent(e)}" download="${h(v)}" title="Download this folder as a .zip" aria-label="Download this folder as a .zip">${x("download")}</a></header>
152
+ <div class="head"><input class="filter" id="filter" type="search" placeholder="Filter this folder" value="${h(pe)}" aria-label="Filter this folder">
153
+ <div class="tools"><span class="seg"><button class="btn${l?"":" on"}" data-v="list" title="List" aria-label="List">${x("list",16)}</button><button class="btn${l?" on":""}" data-v="grid" title="Thumbnails" aria-label="Thumbnails">${x("grid",16)}</button></span>
154
+ <select class="btn" id="sort" aria-label="Sort by"><option value="name"${we==="name"?" selected":""}>Name</option><option value="mtime"${we==="mtime"?" selected":""}>Newest</option><option value="size"${we==="size"?" selected":""}>Largest</option></select>
155
+ <button class="btn" id="search-here" title="Search inside this folder">${x("search",16)}<span class="hide-sm">Search here</span></button></div>
154
156
  <span class="meta">${u} folders \xB7 ${o.length-u} files</span></div>
155
- ${f}
156
- ${b&&!n?`<section class="card readme"><div class="card-head">${$("book",16)} ${h(b.name)}</div><article class="md" id="readme"></article></section>`:""}`;let y=w("filter");if(y.oninput=()=>{se=y.value.toLowerCase();let m=y.selectionStart;nt(t).then(()=>{let L=w("filter");L.focus(),L.setSelectionRange(m,m)})},y.onkeydown=m=>{m.key==="Enter"&&t.querySelector("[data-e]")?.click()},w("sort").onchange=m=>{fe=m.target.value,I("sort",fe),nt(t)},w("search-here").onclick=()=>tt("here"),b&&!n){let m=z(e,b.name),L=m+"@"+b.mtime,E=C=>{let T=w("readme");!T||M().folder!==e||(/\.txt$/i.test(b.name)||!/\./.test(b.name)?T.innerHTML=`<pre>${h(C)}</pre>`:Se(T,String(C),e))};Dt.has(L)?E(Dt.get(L)):(w("readme").innerHTML='<div class="skeleton" style="width:50%"></div>',R(V(m)).then(C=>{Dt.set(L,String(C)),E(String(C))}).catch(C=>{let T=w("readme");T&&(T.innerHTML=`<p class="note">${h(C.message)}</p>`)}))}}function Xn(t){t.addEventListener("click",e=>{let n=e.target,s=n.closest("[data-f]"),r=n.closest("[data-e]"),a=n.closest("[data-v]"),o=M();s?(se="",H({folder:s.dataset.f})):a?q({view:a.dataset.v}):r&&(r.dataset.k==="folder"?(se="",H({folder:z(o.folder,r.dataset.e)})):H({folder:o.folder,open:r.dataset.e}))})}var re=new Set(JSON.parse(I("open")||'[""]'));function Jn(t,e,n){let s=re.has(t),r=s&&x.cache.has(t)?x.cache.get(t).filter(i=>i.type==="folder"):[];x.settings.ignored==="hide"&&(r=r.filter(i=>!Y(z(t,i.name))));let a=t?ne(t,"folder"):"",o=t?Ue(t):0;return`<li><div class="item"><button class="twist" data-t="${h(t)}" aria-expanded="${s}" aria-label="${s?"Close":"Open"} ${h(e)}">${$("chevron-right",14)}</button><button class="node${n===t?" chosen":""}${a?" s-"+a:""}" data-c="${h(t)}">${$(s?"folder-open":"folder",16)}<span class="nm">${h(e)}</span>${o?`<span class="pill warn">${o}</span>`:""}${B(a,!0)}</button></div>${s?`<ul class="level">${r.map(i=>Jn(z(t,i.name),i.name,n)).join("")}</ul>`:""}</li>`}async function Le(){let t=M().folder,e=t?t.split("/"):[];for(let n=0;n<=e.length;n++)re.add(e.slice(0,n).join("/"));await Promise.all([...re].map(n=>Fe(n).catch(()=>re.delete(n)))),I("open",JSON.stringify([...re])),w("tree").innerHTML=Jn("",x.info.name,t),w("tree").querySelector(".chosen")?.scrollIntoView({block:"nearest"})}function Yn(){w("tree").addEventListener("click",t=>{let e=t.target.closest("[data-t]"),n=t.target.closest("[data-c]");if(e){let s=e.dataset.t;re.has(s)?re.delete(s):re.add(s),Le()}else n&&(st(),H({folder:n.dataset.c}))})}var Ft=["conflict","modified","renamed","added","new","deleted"];function Wt(){let t=x.git;if(!t)return"";let e=[t.ahead?`\u2191${t.ahead}`:"",t.behind?`\u2193${t.behind}`:""].filter(Boolean).join(" ");return`<span class="branch" title="${h(t.upstream?`Tracking ${t.upstream}`:"No upstream")}">${$("git-branch",14)}${h(t.branch||"detached")}${t.head?` <span class="faint">${h(t.head)}</span>`:""}${e?` <span class="sync">${e}</span>`:""}</span>`}async function es(t){let e=x.git;if(!e){t.innerHTML='<p class="empty">This folder isn\u2019t in a git repository, so there are no changes to show.</p>';return}let s=M().q==="all",r={};for(let c of e.changes)r[c.state]=(r[c.state]||0)+1;let a=[...e.changes].sort((c,d)=>Ft.indexOf(c.state)-Ft.indexOf(d.state)||c.path.localeCompare(d.path)),o=e.changes.reduce((c,d)=>c+(d.add||0),0),i=e.changes.reduce((c,d)=>c+(d.del||0),0),l=Ft.filter(c=>r[c]).map(c=>`<span class="legend">${B(c)} ${r[c]} ${G[c].toLowerCase()}</span>`).join("");if(t.innerHTML=`<header class="head"><h2 class="page-title">${$("diff")} Changes</h2>${Wt()}</header>
157
+ ${m}
158
+ ${w&&!n?`<section class="card readme"><div class="card-head">${x("book",16)} ${h(w.name)}</div><article class="md" id="readme"></article></section>`:""}`;let y=$("filter");if(y.oninput=()=>{pe=y.value.toLowerCase();let k=y.selectionStart;ut(t).then(()=>{let S=$("filter");S.focus(),S.setSelectionRange(k,k)})},y.onkeydown=k=>{k.key==="Enter"&&t.querySelector("[data-e]")?.click()},$("sort").onchange=k=>{we=k.target.value,H("sort",we),ut(t)},$("search-here").onclick=()=>ht("here"),w&&!n){let k=z(e,w.name),S=k+"@"+w.mtime,C=q=>{let j=$("readme");!j||L().folder!==e||(/\.txt$/i.test(w.name)||!/\./.test(w.name)?j.innerHTML=`<pre>${h(q)}</pre>`:Ae(j,String(q),e))};Jt.has(S)?C(Jt.get(S)):($("readme").innerHTML='<div class="skeleton" style="width:50%"></div>',M(W(k)).then(q=>{Jt.set(S,String(q)),C(String(q))}).catch(q=>{let j=$("readme");j&&(j.innerHTML=`<p class="note">${h(q.message)}</p>`)}))}}function ws(t){t.addEventListener("click",e=>{let n=e.target,s=n.closest("[data-f]"),r=n.closest("[data-e]"),a=n.closest("[data-v]"),o=L();s?(pe="",_({folder:s.dataset.f})):a?R({view:a.dataset.v}):r&&(r.dataset.k==="folder"?(pe="",_({folder:z(o.folder,r.dataset.e)})):_({folder:o.folder,open:r.dataset.e}))})}var he=new Set(JSON.parse(H("open")||'[""]'));function $s(t,e,n){let s=he.has(t),r=s&&b.cache.has(t)?b.cache.get(t).filter(i=>i.type==="folder"):[];b.settings.ignored==="hide"&&(r=r.filter(i=>!te(z(t,i.name))));let a=t?de(t,"folder"):"",o=t?nt(t):0;return`<li><div class="item"><button class="twist" data-t="${h(t)}" aria-expanded="${s}" aria-label="${s?"Close":"Open"} ${h(e)}">${x("chevron-right",14)}</button><button class="node${n===t?" chosen":""}${a?" s-"+a:""}" data-c="${h(t)}">${x(s?"folder-open":"folder",16)}<span class="nm">${h(e)}</span>${o?`<span class="pill warn">${o}</span>`:""}${U(a,!0)}</button></div>${s?`<ul class="level">${r.map(i=>$s(z(t,i.name),i.name,n)).join("")}</ul>`:""}</li>`}async function Re(){let t=L().folder,e=t?t.split("/"):[];for(let n=0;n<=e.length;n++)he.add(e.slice(0,n).join("/"));await Promise.all([...he].map(n=>ye(n).catch(()=>he.delete(n)))),H("open",JSON.stringify([...he])),$("tree").innerHTML=$s("",b.info.name,t),$("tree").querySelector(".chosen")?.scrollIntoView({block:"nearest"})}function xs(){$("tree").addEventListener("click",t=>{let e=t.target.closest("[data-t]"),n=t.target.closest("[data-c]");if(e){let s=e.dataset.t;he.has(s)?he.delete(s):he.add(s),Re()}else n&&(ft(),_({folder:n.dataset.c}))})}var sn=t=>be.has(Q(t))||Q(t)==="svg",Yt=["conflict","modified","renamed","added","new","deleted"];function Qe(){let t=b.git;if(!t)return"";let e=[t.ahead?`\u2191${t.ahead}`:"",t.behind?`\u2193${t.behind}`:""].filter(Boolean).join(" ");return`<span class="branch" title="${h(t.upstream?`Tracking ${t.upstream}`:"No upstream")}">${x("git-branch",14)}${h(t.branch||"detached")}${t.head?` <span class="faint">${h(t.head)}</span>`:""}${e?` <span class="sync">${e}</span>`:""}</span>`}function ln(t){let e=b.git?.changes.length||0;return`<div class="tabs gtabs"><button class="btn${t==="changes"?" on":""}" data-gt="changes">Uncommitted${e?` <span class="count-pill">${e}</span>`:""}</button><button class="btn${t==="history"?" on":""}" data-gt="history">${x("clock",14)} History</button></div>`}function cn(t){t.querySelectorAll("[data-gt]").forEach(e=>e.onclick=()=>_({folder:L().folder,m:e.dataset.gt}))}var Ss=t=>t.innerHTML='<p class="empty">This folder isn\u2019t in a git repository, so there are no changes to show.</p>';async function Ts(t){let e=b.git;if(!e)return Ss(t);let s=L().q==="all",r={};for(let c of e.changes)r[c.state]=(r[c.state]||0)+1;let a=[...e.changes].sort((c,d)=>Yt.indexOf(c.state)-Yt.indexOf(d.state)||c.path.localeCompare(d.path)),o=e.changes.reduce((c,d)=>c+(d.add||0),0),i=e.changes.reduce((c,d)=>c+(d.del||0),0),l=Yt.filter(c=>r[c]).map(c=>`<span class="legend">${U(c)} ${r[c]} ${ne[c].toLowerCase()}</span>`).join("");if(t.innerHTML=`<header class="head"><h2 class="page-title">${x("diff")} Changes</h2>${Qe()}</header>
159
+ ${ln("changes")}
157
160
  ${a.length?`<div class="head"><span class="meta"><span class="plus">+${o}</span> <span class="minus">\u2212${i}</span> in ${a.length} files</span>${l}<span class="grow"></span>
158
161
  <button class="btn${s?"":" on"}" data-cv="">Files</button><button class="btn${s?" on":""}" data-cv="all">All diffs</button></div>
159
- <div class="rows">${a.map(c=>`<a class="row s-${c.state}" href="${P(c.path,{tab:"diff"})}"><span class="ico">${$(c.state==="deleted"?"trash":"file",18)}</span><span class="nm">${h(c.path)}${c.from?` <span class="faint">\u2190 ${h(c.from)}</span>`:""}</span><span class="marks">${c.staged?'<span class="pill" title="Staged">staged</span>':""}${B(c.state)}</span><span class="sz">${c.add!==void 0?`<span class="plus">+${c.add}</span> <span class="minus">\u2212${c.del||0}</span>`:""}</span><span class="tm">${G[c.state]}</span></a>`).join("")}</div>
160
- ${s?'<div id="all-diffs"></div>':""}`:'<p class="empty">Nothing has changed since the last commit. \u2728</p>'}`,t.querySelectorAll("[data-cv]").forEach(c=>c.onclick=()=>q({q:c.dataset.cv})),!s||!a.length)return;let p=t.querySelector("#all-diffs");for(let c of a.slice(0,80)){let d=document.createElement("section");d.className="diff-file",d.innerHTML=`<h3 class="group-title"><a href="${P(c.path,{tab:"diff"})}">${h(c.path)}</a>${B(c.state)}</h3><div class="dbody"><p class="note">Loading\u2026</p></div>`,p.append(d),R("api/git/diff?p="+encodeURIComponent(c.path)).then(u=>He(d.querySelector(".dbody"),u,c.path)).catch(u=>d.querySelector(".dbody").innerHTML=`<p class="note">${h(u.message)}</p>`)}}var Be=matchMedia("(max-width: 759px)"),ts=t=>Be.matches?document.scrollingElement:t,ns=new Map,Ut="",Te=matchMedia("(min-width: 1000px)"),Vt=matchMedia("(min-width: 1280px)");function ss(){let t=x.settings.theme;document.documentElement.dataset.theme=t==="auto"?"":t}function Ea(){let{open:t}=M(),e=w("app");e.classList.toggle("rail",Te.matches),e.classList.toggle("split",!!t&&Vt.matches),w("main").hidden=!!t&&!Vt.matches,w("file").hidden=!t}var Zt="";async function rt(t=!1){let e=M(),n=JSON.stringify([e.folder,e.m,e.q,e.scope,e.opts,e.inc,e.view,e.open]);if(!t&&n===Zt)return;let s=n===Zt?ts(w("main")).scrollTop:0;Zt=n;let r=w("main");Ca(r)||(document.querySelectorAll("[data-nav]").forEach(a=>a.classList.toggle("on",a.dataset.nav===e.m)),e.m==="search"&&e.q?await Gn(r):e.m==="changes"?await es(r):e.m==="review"?Hn(r,e.q):await nt(r),Be.matches&&e.open||(ts(r).scrollTop=s))}var Ca=t=>{let e=document.activeElement;return e&&e.tagName==="TEXTAREA"&&t.contains(e)&&e.value.trim()};function rs(){w("branch").innerHTML=Wt();let t=x.git?x.git.changes.length:0;w("changes-btn").hidden=!x.info.git,w("changes-count").textContent=String(t),w("changes-count").hidden=!t,qt()}async function Ne(){let t=M();Be.matches&&t.open&&!Ut&&ns.set(t.folder,document.scrollingElement.scrollTop);let e=Be.matches&&!t.open&&Ut;Ut=t.open,Ea(),await rt(e),t.open?Ye(w("file")):Un(),e&&(document.scrollingElement.scrollTop=ns.get(t.folder)||0),Te.matches&&Le(),document.title=`${t.open||(t.m==="search"?"\u201C"+t.q+"\u201D":t.folder.split("/").pop()||x.info.name)} \u2014 folderview`}function qa(){let t=new EventSource("api/events");t.addEventListener("hello",()=>w("live").classList.add("on")),t.onerror=()=>w("live").classList.remove("on"),t.addEventListener("change",async e=>{let n=JSON.parse(e.data);for(let a of n.folders)x.cache.delete(a);n.files.length&&Qn(),n.git&&await dt(),rs();let s=M(),r=s.open?(s.folder?s.folder+"/":"")+s.open:"";(s.m==="changes"?n.git:!s.m&&(n.folders.includes(s.folder)||n.git))&&await rt(!0),r&&n.files.includes(r)&&Ye(w("file"),!0),Te.matches&&Le()}),t.addEventListener("comments",async()=>{await Ae(),K("comments")})}pt("comments",()=>{qt(),Zn(w("file"));let t=M();(t.m==="review"||!t.m)&&rt(!0),Te.matches&&Le()});pt("settings",()=>{ss(),rt(!0),M().open&&Ye(w("file"),!0),Te.matches&&Le()});function ja(){let t=w("settings-pop");if(t)return t.remove();let e=x.settings,n=document.createElement("div");n.id="settings-pop",n.className="pop",n.innerHTML=`<h3>Settings</h3>
162
+ <div class="rows">${a.map(c=>Ls(c,O(c.path,{tab:"diff"}),c.staged)).join("")}</div>
163
+ ${s?'<div id="all-diffs"></div>':""}`:'<p class="empty">Nothing has changed since the last commit. \u2728</p>'}`,cn(t),t.querySelectorAll("[data-cv]").forEach(c=>c.onclick=()=>R({q:c.dataset.cv})),!!a.length){if(!s){for(let c of a.slice(0,40)){let d="api/git/diff?p="+encodeURIComponent(c.path);sn(c.path)||M(d).then(p=>rn.set(d,p)).catch(()=>{})}return}a.length>80&&t.querySelector("#all-diffs").insertAdjacentHTML("beforebegin",`<p class="note">Showing the first 80 diffs of ${a.length.toLocaleString()} changed files.</p>`),Ms(t.querySelector("#all-diffs"),a.slice(0,80),{url:c=>"api/git/diff?p="+encodeURIComponent(c.path),link:c=>O(c.path,{tab:"diff"}),comments:!b.info.readOnly,key:"now",picture:c=>sn(c.path)&&{before:c.state==="new"||c.state==="added"?"":`api/git/raw?p=${encodeURIComponent(c.from||c.path)}`,after:c.state==="deleted"?"":W(c.path)}})}}function Ls(t,e,n){return`<a class="row s-${t.state}" href="${e}"><span class="ico">${x(t.state==="deleted"?"trash":"file",18)}</span><span class="nm">${h(t.path)}${t.from?` <span class="faint">\u2190 ${h(t.from)}</span>`:""}</span><span class="marks">${n?'<span class="pill" title="Staged">staged</span>':""}${U(t.state)}</span><span class="sz">${t.add!==void 0?`<span class="plus">+${t.add}</span> <span class="minus">\u2212${t.del||0}</span>`:""}</span><span class="tm">${ne[t.state]}</span></a>`}function Ms(t,e,{url:n,link:s,comments:r,key:a,picture:o}){let i=d=>a+":"+d.path;t.innerHTML=`<div class="diffs-bar"><span class="faint">${r?"Tap a line number to comment on that line.":""}</span><span class="grow"></span><button class="btn small" data-fold="all"></button></div>`;for(let d of e){let p=document.createElement("section"),u=Xe.has(i(d));p.className="diff-file"+(u?" folded":""),p.dataset.path=d.path,p.dataset.fk=i(d),p.innerHTML=`<h3 class="group-title"><button class="mini fold" data-fold="one" aria-expanded="${!u}" title="Collapse or expand" aria-label="Collapse or expand ${h(d.path)}">${x("chevron-down",16)}</button><a href="${s(d)}">${h(d.path)}</a>${U(d.state)}${d.add!==void 0?`<span class="sz faint"><span class="plus">+${d.add}</span> <span class="minus">\u2212${d.del||0}</span></span>`:""}<span class="ncom"></span><span class="grow"></span>${r?`<button class="mini" data-fcom title="Comment on the whole file" aria-label="Comment on ${h(d.path)}">${x("chat",14)}<span class="hide-sm"> Comment</span></button>`:""}</h3><div class="fold-body"><div class="fthreads"></div><div class="dbody"></div></div>`,t.append(p),r&&As(p);let f=p.querySelector(".dbody"),g=o?.(d);if(g){f.innerHTML=`<div class="compare">${g.before?`<figure><figcaption>Before</figcaption><div class="stage"><img src="${g.before}" alt="Before" loading="lazy"></div></figure>`:""}${g.after?`<figure><figcaption>${g.before?"After":"Added"}</figcaption><div class="stage"><img src="${g.after}" alt="After" loading="lazy"></div></figure>`:"<figure><figcaption>Deleted</figcaption></figure>"}</div>`;continue}let m=n(d),w=rn.get(m),v=y=>We(f,y,d.path,{comments:r,caption:d.path});w!==void 0?v(w):f.innerHTML='<p class="note">Loading\u2026</p>',!(w!==void 0&&a!=="now")&&M(m).then(y=>{rn.set(m,y),y!==w&&f.isConnected&&v(y)}).catch(y=>{w===void 0&&(f.innerHTML=`<p class="note">${h(y.message)}</p>`)})}let l=t.querySelector('[data-fold="all"]'),c=()=>{let d=e.some(p=>!Xe.has(i(p)));l.innerHTML=`${x(d?"chevron-right":"chevron-down",14)} ${d?"Collapse all":"Expand all"}`,l.dataset.to=d?"collapse":"expand"};c(),t.onclick=d=>{let p=d.target.closest("[data-fold], [data-fcom]");if(p){if(p.dataset.fold==="all"){let u=p.dataset.to==="collapse";for(let f of t.querySelectorAll(".diff-file"))en(f,u)}else if(p.dataset.fold==="one"){let u=p.closest(".diff-file");en(u,!u.classList.contains("folded"))}else{let u=p.closest(".diff-file");en(u,!1);let f=u.querySelector(".fthreads");f.querySelector(".composer")||f.insertAdjacentHTML("beforeend",ae(u.dataset.path,0,0)),f.querySelector(".composer textarea").focus()}c()}}}var rn=new Map,Xe=new Set(JSON.parse(uo("folded")||"[]"));function uo(t){try{return sessionStorage.getItem("folderview:"+t)}catch{return null}}function en(t,e){t.classList.toggle("folded",e),t.querySelector('[data-fold="one"]').setAttribute("aria-expanded",String(!e)),e?Xe.add(t.dataset.fk):Xe.delete(t.dataset.fk);try{sessionStorage.setItem("folderview:folded",JSON.stringify([...Xe]))}catch{}}function As(t){let e=t.dataset.path,n=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",s=t.querySelector(".fthreads"),r=s.querySelector(".composer");s.innerHTML=Fe(e,n),r&&s.append(r);let a=F(e).filter(o=>o.status==="open").length;t.querySelector(".ncom").innerHTML=a?`<span class="pill warn" title="Open comments">${x("chat",12)} ${a}</span>`:""}function Cs(t){for(let e of t.querySelectorAll("#all-diffs .diff-file"))e.querySelector(".fthreads")&&(As(e),Ze(e.querySelector(".diff")))}var an={local:["arrow-up","Not pushed","Only in this copy: not pushed yet"],pushed:["check","Pushed","On a remote"],incoming:["arrow-down","Not pulled","On the upstream, not pulled here yet"],unknown:["","",""]};function tn(t){let[e,n,s]=an[t.state];return`<a class="commit s-${t.state}" href="${h(on(t.hash))}"><code>${h(t.hash)}</code><span class="subj">${h(t.subject)}</span><span class="faint">${h(t.author)} \xB7 ${Z(t.time)}</span>${n?`<span class="push ${t.state}" title="${s}">${x(e,12)}<span class="hide-sm"> ${n}</span></span>`:""}</a>`}var on=t=>V({folder:L().folder,m:"history",q:t}),D=null,qs=()=>matchMedia("(max-width: 759px)").matches?document.scrollingElement:document.getElementById("main");async function Rs(t){if(!b.git)return Ss(t);let e=L().q;if(e)return fo(t,e);let n=D?.find||"";t.innerHTML=`<header class="head"><h2 class="page-title">${x("diff")} Changes</h2>${Qe()}</header>${ln("history")}
164
+ <div class="hist-find"><input class="filter" id="hist-q" type="search" placeholder="Find a commit: words from its message, or a hash" value="${h(n)}" aria-label="Find a commit"></div>
165
+ <div id="hist"><div class="skeleton" style="width:60%"></div></div>`,cn(t);let s=t.querySelector("#hist-q"),r=0;if(s.oninput=()=>{clearTimeout(r),r=setTimeout(()=>ys(t,s.value.trim()),300)},D&&D.head===b.git.head&&D.find===n){Es(t);let a=D.scroll||0;requestAnimationFrame(()=>qs().scrollTop=a)}else await ys(t,n)}async function ys(t,e){let n=t.querySelector("#hist");try{let s=await M("api/git/history"+(e?"?q="+encodeURIComponent(e):""));if(!n.isConnected)return;D={head:b.git.head,find:e,...s}}catch(s){n.innerHTML=`<p class="note">${h(s.message)}</p>`;return}Es(t)}function Es(t){let e=D,n=t.querySelector("#hist");if(!n)return;let s=e.find?`${e.commits.length}${e.more?"+":""} ${e.commits.length===1&&!e.more?"commit matches":"commits match"}.`:e.remotes?[e.upstream?`Tracking <code>${h(e.upstream)}</code>.`:"No upstream branch.",e.localTotal&&e.localTotal!=="0"?`${e.localTotal} not pushed.`:"Everything is pushed.",e.incomingTotal?`${e.incomingTotal} not pulled yet${e.incomingTotal>e.incoming.length?` (the newest ${e.incoming.length} below)`:""}.`:""].filter(Boolean).join(" "):"No remote: nothing here has been pushed anywhere.";n.innerHTML=`<p class="meta hist-sum">${s}</p>
166
+ ${!e.find&&e.incoming.length?`<h3 class="group-title">${x("arrow-down",14)} Not pulled yet</h3><div class="commits">${e.incoming.map(tn).join("")}</div><h3 class="group-title">This branch</h3>`:""}
167
+ ${e.commits.length?`<div class="commits" id="hist-list">${e.commits.map(tn).join("")}</div>`:`<p class="empty">${e.find?"No commit matches that.":"No commits yet."}</p>`}
168
+ <div id="hist-more-box">${e.more?'<button class="btn" id="hist-more">Show more</button>':""}</div>`,n.onclick=i=>{i.target.closest("a.commit")&&(D.scroll=qs().scrollTop)};let r=n.querySelector("#hist-more");if(!r)return;let a=async()=>{if(r.disabled||D!==e)return;r.disabled=!0,r.textContent="Loading\u2026";let i=await M(`api/git/history?skip=${e.commits.length}${e.find?"&q="+encodeURIComponent(e.find):""}`).catch(()=>null);if(D!==e||!r.isConnected||(r.disabled=!1,r.textContent="Show more",!i))return;let l=new Set(e.commits.map(d=>d.full)),c=i.commits.filter(d=>!l.has(d.full));e.commits.push(...c),e.more=i.more,n.querySelector("#hist-list")?.insertAdjacentHTML("beforeend",c.map(tn).join("")),e.more?r.getBoundingClientRect().top<innerHeight+600&&a():(o.disconnect(),r.remove())};r.onclick=a;let o=new IntersectionObserver(i=>i.some(l=>l.isIntersecting)&&a(),{rootMargin:"600px"});o.observe(r)}var Ge=120,nn=1e3,vs=new Map;async function fo(t,e){t.innerHTML=`<header class="head"><h2 class="page-title">${x("diff")} Changes</h2>${Qe()}</header>${ln("history")}<div id="commit"><div class="skeleton" style="width:60%"></div></div>`,cn(t);let n=vs.get(e);if(!n)try{n=await M("api/git/commit-info?h="+encodeURIComponent(e)),vs.set(e,n)}catch(p){t.querySelector("#commit").innerHTML=`<p class="note">${h(p.message)}</p>`;return}if(L().q!==e)return;let s=n.commit,r=D&&[...D.commits,...D.incoming].find(p=>p.full===s.full),[a,o,i]=r?an[r.state]:an.unknown,l=L().show?L().show==="all":n.files.length<=Ge,c=n.files.reduce((p,u)=>p+(u.add||0),0),d=n.files.reduce((p,u)=>p+(u.del||0),0);t.querySelector("#commit").innerHTML=`<div class="commit-card">
169
+ <div class="commit-top"><a class="btn small" href="${h(on(""))}">${x("chevron-left",14)} History</a><code class="hash" title="${h(s.full)}">${h(s.hash)}</code>${o?`<span class="push ${r.state}" title="${i}">${x(a,12)} ${o}</span>`:""}</div>
170
+ <h3 class="commit-subj">${h(s.subject)}</h3>
171
+ ${s.body?`<pre class="commit-body">${h(s.body)}</pre>`:""}
172
+ <p class="meta">${h(s.author)} \xB7 ${new Date(s.time).toLocaleString()} (${Z(s.time)})${s.parents.length>1?` \xB7 merge of ${s.parents.map(p=>`<code>${h(p.slice(0,7))}</code>`).join(" + ")}, shown against the first`:""}</p>
173
+ </div>
174
+ ${n.files.length?`<div class="head"><span class="meta"><span class="plus">+${c}</span> <span class="minus">\u2212${d}</span> in ${n.files.length} files</span><span class="grow"></span><button class="btn${l?"":" on"}" data-cv="files">Files</button><button class="btn${l?" on":""}" data-cv="all">All diffs</button></div>
175
+ ${l?"":`<div class="rows">${n.files.slice(0,nn).map(p=>Ls(p,h(on(e)),!1)).join("")}</div>${n.files.length>nn?`<p class="note">Showing the first ${nn.toLocaleString()} of ${n.files.length.toLocaleString()} files.</p>`:""}`}
176
+ ${l&&n.files.length>Ge?`<p class="note">Showing the first ${Ge} diffs of ${n.files.length.toLocaleString()} files.</p>`:""}
177
+ ${l?'<div id="all-diffs"></div>':""}`:'<p class="empty">This commit changed nothing in this folder.</p>'}`,t.querySelectorAll("[data-cv]").forEach(p=>p.onclick=()=>R({show:p.dataset.cv})),t.querySelectorAll(".rows .row").forEach((p,u)=>{p.onclick=f=>{f.preventDefault(),R({show:"all"}),!(u>=Ge)&&requestAnimationFrame(()=>t.querySelectorAll("#all-diffs .diff-file")[u]?.scrollIntoView({block:"start"}))}}),!(!l||!n.files.length)&&Ms(t.querySelector("#all-diffs"),n.files.slice(0,Ge),{url:p=>`api/git/commit-diff?h=${encodeURIComponent(s.full)}&p=${encodeURIComponent(p.path)}${p.from?"&from="+encodeURIComponent(p.from):""}`,link:p=>O(p.path,{tab:"history"}),comments:!1,key:s.full,picture:p=>sn(p.path)&&{before:p.state==="added"||!s.parents[0]?"":`api/git/raw?p=${encodeURIComponent(p.from||p.path)}&rev=${s.parents[0]}`,after:p.state==="deleted"?"":`api/git/raw?p=${encodeURIComponent(p.path)}&rev=${s.full}`}})}var Ye=matchMedia("(max-width: 759px)"),js=t=>Ye.matches?document.scrollingElement:t,Is=new Map,dn="",Ee=matchMedia("(min-width: 1000px)"),hn=matchMedia("(min-width: 1280px)");function zs(){let t=b.settings.theme;document.documentElement.dataset.theme=t==="auto"?"":t}function mo(){let{open:t}=L(),e=$("app");e.classList.toggle("rail",Ee.matches),e.classList.toggle("split",!!t&&hn.matches),$("main").hidden=!!t&&!hn.matches,$("file").hidden=!t}var pn="";async function mt(t=!1){let e=L(),n=JSON.stringify([e.folder,e.m,e.q,e.show,e.scope,e.opts,e.inc,e.view,e.open]);if(!t&&n===pn)return;let s=n===pn?js($("main")).scrollTop:0;pn=n;let r=$("main");go(r)||(document.querySelectorAll("[data-nav]").forEach(a=>a.classList.toggle("on",a.dataset.nav===(e.m==="history"?"changes":e.m))),e.m==="search"&&e.q?await ks(r):e.m==="changes"?await Ts(r):e.m==="history"?await Rs(r):e.m==="review"?ts(r,e.q):await ut(r),Ye.matches&&e.open||(js(r).scrollTop=s))}var go=t=>{let e=document.activeElement;return e&&e.tagName==="TEXTAREA"&&t.contains(e)&&e.value.trim()};function Hs(){$("branch").innerHTML=Qe();let t=b.git?b.git.changes.length:0;$("changes-btn").hidden=!b.info.git,$("changes-count").textContent=String(t),$("changes-count").hidden=!t,Bt()}async function Je(){let t=L();Ye.matches&&t.open&&!dn&&Is.set(t.folder,document.scrollingElement.scrollTop);let e=Ye.matches&&!t.open&&dn;dn=t.open,mo(),await mt(e),t.open?dt($("file")):hs(),e&&(document.scrollingElement.scrollTop=Is.get(t.folder)||0),Ee.matches&&Re(),document.title=`${t.open||(t.m==="search"?"\u201C"+t.q+"\u201D":t.folder.split("/").pop()||b.info.name)} \u2014 folderview`}function ko(){let t=new EventSource("api/events");t.addEventListener("hello",()=>$("live").classList.add("on")),t.onerror=()=>$("live").classList.remove("on"),t.addEventListener("change",async e=>{let n=JSON.parse(e.data);for(let a of n.folders)b.cache.delete(a);n.files.length&&bs(),n.git&&await xt(),Hs();let s=L(),r=s.open?(s.folder?s.folder+"/":"")+s.open:"";(s.m==="changes"||s.m==="history"?n.git:!s.m&&(n.folders.includes(s.folder)||n.git))&&await mt(!0),r&&n.files.includes(r)&&dt($("file"),!0),Ee.matches&&Re()}),t.addEventListener("comments",async()=>{await ze(),ee("comments")})}Ie("comments",()=>{Bt(),fs($("file"));let t=L();t.m==="review"||!t.m?mt(!0):t.m==="changes"&&Cs($("main")),Ee.matches&&Re()});Ie("settings",()=>{zs(),mt(!0),L().open&&dt($("file"),!0),Ee.matches&&Re()});function bo(){let t=$("settings-pop");if(t)return t.remove();let e=b.settings,n=document.createElement("div");n.id="settings-pop",n.className="pop",n.innerHTML=`<h3>Settings</h3>
161
178
  <label>Theme <select data-s="theme"><option value="auto">Match the system</option><option value="dark">Dark</option><option value="light">Light</option></select></label>
162
179
  <label>Ignored files <select data-s="ignored"><option value="dim">Show dimmed</option><option value="hide">Hide</option></select></label>
163
180
  <label class="check"><input type="checkbox" data-s="wrap"> Wrap long lines</label>
164
181
  <label class="check"><input type="checkbox" data-s="review"> Review mode (click a line to comment)</label>
165
182
  <label class="check"><input type="checkbox" data-s="resolved"> Show resolved comments in files</label>
166
- <label>Your name on comments <input data-s="author" placeholder="${h(x.info.author)}" value="${h(e.author)}"></label>
183
+ <label>Your name on comments <input data-s="author" placeholder="${h(b.info.author)}" value="${h(e.author)}"></label>
167
184
  <h3>Shortcuts</h3>
168
- <dl class="keys"><dt><kbd>Ctrl</kbd> <kbd>P</kbd></dt><dd>Go to a file</dd><dt><kbd>/</kbd></dt><dd>Search</dd><dt><kbd>Esc</kbd></dt><dd>Close the file</dd><dt><kbd>Shift</kbd>-click</dt><dd>Select a range of lines</dd><dt><kbd>Ctrl</kbd> <kbd>Enter</kbd></dt><dd>Save a comment</dd></dl>
169
- <p class="faint">folderview ${h(x.info.version||"")} \xB7 ${h(x.info.root||"")}</p>`,document.body.append(n);for(let s of n.querySelectorAll("[data-s]")){let r=s.dataset.s;s.type==="checkbox"?s.checked=!!e[r]:s.value=e[r],s.onchange=()=>{be(r,s.type==="checkbox"?s.checked:s.value.trim()),K("settings")}}setTimeout(()=>{let s=r=>{!n.contains(r.target)&&r.target!==w("settings-btn")&&(n.remove(),removeEventListener("pointerdown",s))};addEventListener("pointerdown",s)})}addEventListener("keydown",t=>{let e=/^(INPUT|TEXTAREA|SELECT)$/.test(document.activeElement?.tagName||"");(t.ctrlKey||t.metaKey)&&(t.key==="p"||t.key==="k")?(t.preventDefault(),Bt()):t.key==="/"&&!e?(t.preventDefault(),tt()):t.key==="Escape"&&!e&&!w("qo")&&M().open?q({open:"",tab:"",line:""}):t.key==="Escape"&&document.activeElement===w("q")&&w("q").blur()});function Ia(){let t=Number(I("tree"))||280;w("app").style.setProperty("--tree",t+"px"),w("splitter").onpointerdown=e=>{e.preventDefault();let n=r=>{let a=Math.min(560,Math.max(180,r.clientX));w("app").style.setProperty("--tree",a+"px"),I("tree",String(a))},s=()=>{removeEventListener("pointermove",n),removeEventListener("pointerup",s)};addEventListener("pointermove",n),addEventListener("pointerup",s)}}async function za(){ss();try{x.info=await R("api/info")}catch(t){w("main").innerHTML=`<p class="empty">Can't reach the filescope server: ${h(t.message)}</p>`;return}w("repo").textContent=x.info.name,w("search-icon").innerHTML=$("search",16),w("qo-btn").insertAdjacentHTML("afterbegin",$("file")),w("changes-btn").insertAdjacentHTML("afterbegin",$("diff")),w("review-btn").insertAdjacentHTML("afterbegin",$("chat")),w("settings-btn").innerHTML=$("settings"),new ResizeObserver(()=>document.documentElement.style.setProperty("--bar-h",w("bar").offsetHeight+"px")).observe(w("bar")),Be.onchange=()=>Ne(),w("home").onclick=()=>{st(),H({folder:""})},document.querySelectorAll("[data-nav]").forEach(t=>t.onclick=()=>{let e=M();e.m===t.dataset.nav?H({folder:e.folder}):H({folder:e.folder,m:t.dataset.nav})}),w("qo-btn").onclick=()=>Bt(),w("settings-btn").onclick=ja,Yn(),Xn(w("main")),Kn(),Ia(),await Promise.all([dt(),Ae()]),rs(),addEventListener("hashchange",Ne),Te.onchange=()=>Ne(),Vt.onchange=()=>Ne(),await Ne(),qa(),x.info.readOnly&&ke("Read-only: comments can\u2019t be added")}za();
185
+ <dl class="keys"><dt><kbd>Ctrl</kbd> <kbd>P</kbd></dt><dd>Go to a file</dd><dt><kbd>/</kbd></dt><dd>Search</dd><dt><kbd>Esc</kbd></dt><dd>Close the file</dd><dt><kbd>[</kbd> <kbd>]</kbd></dt><dd>Previous / next file (\u2190 \u2192 on a picture; swipe on a phone)</dd><dt><kbd>Shift</kbd>-click</dt><dd>Select a range of lines</dd><dt><kbd>Ctrl</kbd> <kbd>Enter</kbd></dt><dd>Save a comment</dd></dl>
186
+ <p class="faint">folderview ${h(b.info.version||"")} \xB7 ${h(b.info.root||"")}</p>`,document.body.append(n);for(let s of n.querySelectorAll("[data-s]")){let r=s.dataset.s;s.type==="checkbox"?s.checked=!!e[r]:s.value=e[r],s.onchange=()=>{xe(r,s.type==="checkbox"?s.checked:s.value.trim()),ee("settings")}}setTimeout(()=>{let s=r=>{!n.contains(r.target)&&r.target!==$("settings-btn")&&(n.remove(),removeEventListener("pointerdown",s))};addEventListener("pointerdown",s)})}addEventListener("keydown",t=>{let e=/^(INPUT|TEXTAREA|SELECT)$/.test(document.activeElement?.tagName||"");(t.ctrlKey||t.metaKey)&&(t.key==="p"||t.key==="k")?(t.preventDefault(),Qt()):t.key==="/"&&!e?(t.preventDefault(),ht()):!e&&!t.ctrlKey&&!t.metaKey&&!t.altKey&&L().open&&(t.key==="["||t.key==="]"||$("picwrap")&&(t.key==="ArrowLeft"||t.key==="ArrowRight"))?(t.preventDefault(),Ke(t.key==="["||t.key==="ArrowLeft"?-1:1)):t.key==="Escape"&&!e&&!$("qo")&&L().open?R({open:"",tab:"",line:""}):t.key==="Escape"&&document.activeElement===$("q")&&$("q").blur()});function wo(){let t=Number(H("tree"))||280;$("app").style.setProperty("--tree",t+"px"),$("splitter").onpointerdown=e=>{e.preventDefault();let n=r=>{let a=Math.min(560,Math.max(180,r.clientX));$("app").style.setProperty("--tree",a+"px"),H("tree",String(a))},s=()=>{removeEventListener("pointermove",n),removeEventListener("pointerup",s)};addEventListener("pointermove",n),addEventListener("pointerup",s)}}async function $o(){zs();try{b.info=await M("api/info")}catch(t){$("main").innerHTML=`<p class="empty">Can't reach the filescope server: ${h(t.message)}</p>`;return}$("repo").textContent=b.info.name,$("search-icon").innerHTML=x("search",16),$("qo-btn").insertAdjacentHTML("afterbegin",x("file")),$("changes-btn").insertAdjacentHTML("afterbegin",x("diff")),$("review-btn").insertAdjacentHTML("afterbegin",x("chat")),$("settings-btn").innerHTML=x("settings"),new ResizeObserver(()=>document.documentElement.style.setProperty("--bar-h",$("bar").offsetHeight+"px")).observe($("bar")),Ye.onchange=()=>Je(),$("home").onclick=()=>{ft(),_({folder:""})},document.querySelectorAll("[data-nav]").forEach(t=>t.onclick=()=>{let e=L();e.m===t.dataset.nav||e.m==="history"&&t.dataset.nav==="changes"?_({folder:e.folder}):_({folder:e.folder,m:t.dataset.nav})}),$("qo-btn").onclick=()=>Qt(),$("settings-btn").onclick=bo,xs(),ws($("main")),gs(),wo(),await Promise.all([xt(),ze()]),Hs(),addEventListener("hashchange",Je),Ee.onchange=()=>Je(),hn.onchange=()=>Je(),await Je(),ko(),b.info.readOnly&&le("Read-only: comments can\u2019t be added")}$o();