binja 0.8.0 → 0.9.0

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.
@@ -0,0 +1,381 @@
1
+ // @bun
2
+ var{defineProperty:ZO,getOwnPropertyNames:XE,getOwnPropertyDescriptor:IE}=Object,ME=Object.prototype.hasOwnProperty;var bO=new WeakMap,fO=(O)=>{var E=bO.get(O),A;if(E)return E;if(E=ZO({},"__esModule",{value:!0}),O&&typeof O==="object"||typeof O==="function")XE(O).map((U)=>!ME.call(E,U)&&ZO(E,U,{get:()=>O[U],enumerable:!(A=IE(O,U))||A.enumerable}));return bO.set(O,E),E};var o=(O,E)=>{for(var A in E)ZO(O,A,{get:E[A],enumerable:!0,configurable:!0,set:(U)=>E[A]=()=>U})};var R=(O,E)=>()=>(O&&(E=O(O=0)),E);var JO;var YO=R(()=>{JO={and:"AND",or:"OR",not:"NOT",true:"NAME",false:"NAME",True:"NAME",False:"NAME",None:"NAME",none:"NAME",is:"NAME",in:"NAME"}});function _(O,E){return DE?`${kO[O]}${E}${kO.reset}`:E}function gO(O,E,A){let U=[],B=A.templateName?`${A.templateName}:${A.line}:${A.column}`:`line ${A.line}, column ${A.column}`;if(U.push(`${_("red",_("bold",O))}: ${E} at ${_("cyan",B)}`),A.source)U.push(""),U.push(PE(A.source,A.line,A.column));if(A.suggestion)U.push(""),U.push(`${_("yellow","Did you mean")}: ${_("cyan",A.suggestion)}?`);if(A.availableOptions&&A.availableOptions.length>0){U.push("");let Q=A.availableOptions.slice(0,8),J=A.availableOptions.length>8?` ${_("gray",`... and ${A.availableOptions.length-8} more`)}`:"";U.push(`${_("gray","Available")}: ${Q.join(", ")}${J}`)}return U.join(`
3
+ `)}function PE(O,E,A){let U=O.split(`
4
+ `),B=[],Q=Math.max(1,E-2),J=Math.min(U.length,E+1),Z=String(J).length;for(let K=Q;K<=J;K++){let $=U[K-1]||"",Y=String(K).padStart(Z," ");if(K===E){B.push(`${_("red"," \u2192")} ${_("gray",Y)} ${_("dim","\u2502")} ${$}`);let I=" ".repeat(Z+4+Math.max(0,A-1)),D=_("red","^");B.push(`${I}${D}`)}else B.push(` ${_("gray",Y)} ${_("dim","\u2502")} ${_("gray",$)}`)}return B.join(`
5
+ `)}function yO(O,E,A=3){let U=null,B=A+1,Q=O.toLowerCase();for(let J of E){let Z=GE(Q,J.toLowerCase());if(Z<B)B=Z,U=J}return B<=A?U:null}function GE(O,E){if(O.length===0)return E.length;if(E.length===0)return O.length;let A=[];for(let U=0;U<=E.length;U++)A[U]=[U];for(let U=0;U<=O.length;U++)A[0][U]=U;for(let U=1;U<=E.length;U++)for(let B=1;B<=O.length;B++)if(E[U-1]===O[B-1])A[U][B]=A[U-1][B-1];else A[U][B]=Math.min(A[U-1][B-1]+1,A[U][B-1]+1,A[U-1][B]+1);return A[E.length][O.length]}var kO,DE,N,a;var y=R(()=>{kO={red:"\x1B[31m",yellow:"\x1B[33m",cyan:"\x1B[36m",gray:"\x1B[90m",bold:"\x1B[1m",dim:"\x1B[2m",reset:"\x1B[0m"},DE=process.stdout?.isTTY!==!1;N=class N extends Error{line;column;source;templateName;suggestion;constructor(O,E){let A=gO("TemplateSyntaxError",O,E);super(A);this.name="TemplateSyntaxError",this.line=E.line,this.column=E.column,this.source=E.source,this.templateName=E.templateName,this.suggestion=E.suggestion}};a=class a extends Error{line;column;source;templateName;suggestion;availableOptions;constructor(O,E){let A=gO("TemplateRuntimeError",O,E);super(A);this.name="TemplateRuntimeError",this.line=E.line,this.column=E.column,this.source=E.source,this.templateName=E.templateName,this.suggestion=E.suggestion,this.availableOptions=E.availableOptions}}});class q{state;variableStart;variableEnd;blockStart;blockEnd;commentStart;commentEnd;constructor(O,E={}){this.state={source:O,pos:0,line:1,column:1,tokens:[]},this.variableStart=E.variableStart??"{{",this.variableEnd=E.variableEnd??"}}",this.blockStart=E.blockStart??"{%",this.blockEnd=E.blockEnd??"%}",this.commentStart=E.commentStart??"{#",this.commentEnd=E.commentEnd??"#}"}tokenize(){while(!this.isAtEnd())this.scanToken();return this.addToken("EOF",""),this.state.tokens}scanToken(){if(this.match(this.variableStart)){this.addToken("VARIABLE_START",this.variableStart),this.scanExpression(this.variableEnd,"VARIABLE_END");return}if(this.match(this.blockStart)){let O=this.peek()==="-";if(O)this.advance();let E=this.state.pos;if(this.skipWhitespace(),this.checkWord("raw")||this.checkWord("verbatim")){let A=this.checkWord("raw")?"raw":"verbatim";this.scanRawBlock(A,O);return}this.state.pos=E,this.addToken("BLOCK_START",this.blockStart+(O?"-":"")),this.scanExpression(this.blockEnd,"BLOCK_END");return}if(this.match(this.commentStart)){this.scanComment();return}this.scanText()}checkWord(O){let E=this.state.pos;for(let U=0;U<O.length;U++)if(this.state.source[E+U]?.toLowerCase()!==O[U])return!1;let A=this.state.source[E+O.length];return!A||!this.isAlphaNumeric(A)}scanRawBlock(O,E){let A=this.state.line,U=this.state.column;for(let J=0;J<O.length;J++)this.advance();if(this.skipWhitespace(),this.peek()==="-")this.advance();if(!this.match(this.blockEnd))throw new N(`Expected '${this.blockEnd}' after '${O}'`,{line:this.state.line,column:this.state.column,source:this.state.source});let B=`end${O}`,Q=this.state.pos;while(!this.isAtEnd()){if(this.check(this.blockStart)){let J=this.state.pos,Z=this.state.line,K=this.state.column;if(this.match(this.blockStart),this.peek()==="-")this.advance();if(this.skipWhitespace(),this.checkWord(B)){let $=this.state.source.slice(Q,J);if($.length>0)this.state.tokens.push({type:"TEXT",value:$,line:A,column:U});for(let Y=0;Y<B.length;Y++)this.advance();if(this.skipWhitespace(),this.peek()==="-")this.advance();if(!this.match(this.blockEnd))throw new N(`Expected '${this.blockEnd}' after '${B}'`,{line:this.state.line,column:this.state.column,source:this.state.source});return}this.state.pos=J,this.state.line=Z,this.state.column=K}if(this.peek()===`
6
+ `)this.state.line++,this.state.column=0;this.advance()}throw new N(`Unclosed '${O}' block`,{line:A,column:U,source:this.state.source,suggestion:`Add {% end${O} %} to close the block`})}scanText(){let O=this.state.pos,E=this.state.line,A=this.state.column;while(!this.isAtEnd()){if(this.check(this.variableStart)||this.check(this.blockStart)||this.check(this.commentStart))break;if(this.peek()===`
7
+ `)this.state.line++,this.state.column=0;this.advance()}if(this.state.pos>O){let U=this.state.source.slice(O,this.state.pos);this.state.tokens.push({type:"TEXT",value:U,line:E,column:A})}}scanExpression(O,E){this.skipWhitespace();while(!this.isAtEnd()){if(this.skipWhitespace(),this.peek()==="-"&&this.check(O,1))this.advance();if(this.match(O)){this.addToken(E,O);return}this.scanExpressionToken()}throw new N("Unclosed template tag",{line:this.state.line,column:this.state.column,source:this.state.source,suggestion:`Add closing delimiter '${O}'`})}scanExpressionToken(){if(this.skipWhitespace(),this.isAtEnd())return;let O=this.peek();if(O==='"'||O==="'"){this.scanString(O);return}if(this.isDigit(O)){this.scanNumber();return}if(this.isAlpha(O)||O==="_"){this.scanIdentifier();return}this.scanOperator()}scanString(O){this.advance();let E=this.state.pos;while(!this.isAtEnd()&&this.peek()!==O){if(this.peek()==="\\"&&this.peekNext()===O)this.advance();if(this.peek()===`
8
+ `)this.state.line++,this.state.column=0;this.advance()}if(this.isAtEnd())throw new N("Unterminated string literal",{line:this.state.line,column:this.state.column,source:this.state.source,suggestion:`Add closing quote '${O}'`});let A=this.state.source.slice(E,this.state.pos);this.advance(),this.addToken("STRING",A)}scanNumber(){let O=this.state.pos;while(this.isDigit(this.peek()))this.advance();if(this.peek()==="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}let E=this.state.source.slice(O,this.state.pos);this.addToken("NUMBER",E)}scanIdentifier(){let O=this.state.pos;while(this.isAlphaNumeric(this.peek())||this.peek()==="_")this.advance();let E=this.state.source.slice(O,this.state.pos),A=JO[E]??"NAME";this.addToken(A,E)}scanOperator(){let O=this.advance();switch(O){case".":this.addToken("DOT",O);break;case",":this.addToken("COMMA",O);break;case":":this.addToken("COLON",O);break;case"|":this.addToken("PIPE",O);break;case"(":this.addToken("LPAREN",O);break;case")":this.addToken("RPAREN",O);break;case"[":this.addToken("LBRACKET",O);break;case"]":this.addToken("RBRACKET",O);break;case"{":this.addToken("LBRACE",O);break;case"}":this.addToken("RBRACE",O);break;case"+":this.addToken("ADD",O);break;case"-":this.addToken("SUB",O);break;case"*":this.addToken("MUL",O);break;case"/":this.addToken("DIV",O);break;case"%":this.addToken("MOD",O);break;case"~":this.addToken("TILDE",O);break;case"=":if(this.match("="))this.addToken("EQ","==");else this.addToken("ASSIGN","=");break;case"!":if(this.match("="))this.addToken("NE","!=");else throw new N("Unexpected character '!'",{line:this.state.line,column:this.state.column-1,source:this.state.source,suggestion:"Use '!=' for not-equal comparison or 'not' for negation"});break;case"<":if(this.match("="))this.addToken("LE","<=");else this.addToken("LT","<");break;case">":if(this.match("="))this.addToken("GE",">=");else this.addToken("GT",">");break;case"?":if(this.match("?"))this.addToken("NULLCOALESCE","??");else this.addToken("QUESTION","?");break;default:if(!this.isWhitespace(O))throw new N(`Unexpected character '${O}'`,{line:this.state.line,column:this.state.column-1,source:this.state.source})}}scanComment(){while(!this.isAtEnd()&&!this.check(this.commentEnd)){if(this.peek()===`
9
+ `)this.state.line++,this.state.column=0;this.advance()}if(!this.isAtEnd())this.match(this.commentEnd)}isAtEnd(){return this.state.pos>=this.state.source.length}peek(){if(this.isAtEnd())return"\x00";return this.state.source[this.state.pos]}peekNext(){if(this.state.pos+1>=this.state.source.length)return"\x00";return this.state.source[this.state.pos+1]}advance(){let O=this.state.source[this.state.pos];return this.state.pos++,this.state.column++,O}match(O,E=0){let A=this.state.source,U=this.state.pos+E,B=O.length;if(U+B>A.length)return!1;for(let Q=0;Q<B;Q++)if(A[U+Q]!==O[Q])return!1;if(E===0)this.state.pos+=B,this.state.column+=B;return!0}check(O,E=0){let A=this.state.source,U=this.state.pos+E,B=O.length;if(U+B>A.length)return!1;for(let Q=0;Q<B;Q++)if(A[U+Q]!==O[Q])return!1;return!0}skipWhitespace(){while(!this.isAtEnd()&&this.isWhitespace(this.peek())){if(this.peek()===`
10
+ `)this.state.line++,this.state.column=0;this.advance()}}isWhitespace(O){return O===" "||O==="\t"||O===`
11
+ `||O==="\r"}isDigit(O){let E=O.charCodeAt(0);return E>=48&&E<=57}isAlpha(O){let E=O.charCodeAt(0);return E>=97&&E<=122||E>=65&&E<=90}isAlphaNumeric(O){let E=O.charCodeAt(0);return E>=48&&E<=57||E>=97&&E<=122||E>=65&&E<=90}addToken(O,E){this.state.tokens.push({type:O,value:E,line:this.state.line,column:this.state.column-E.length})}}var x=R(()=>{YO();y();YO()});class h{tokens;current=0;source;constructor(O,E){this.tokens=O,this.source=E}parse(){let O=[];while(!this.isAtEnd()){let E=this.parseStatement();if(E)O.push(E)}return{type:"Template",body:O,line:1,column:1}}parseStatement(){switch(this.peek().type){case"TEXT":return this.parseText();case"VARIABLE_START":return this.parseOutput();case"BLOCK_START":return this.parseBlock();case"EOF":return null;default:return this.advance(),null}}parseText(){let O=this.advance();return{type:"Text",value:O.value,line:O.line,column:O.column}}parseOutput(){let O=this.advance(),E=this.parseExpression();return this.expect("VARIABLE_END"),{type:"Output",expression:E,line:O.line,column:O.column}}parseBlock(){let O=this.advance(),E=this.expect("NAME");switch(E.value){case"if":return this.parseIf(O);case"for":return this.parseFor(O);case"block":return this.parseBlockTag(O);case"extends":return this.parseExtends(O);case"include":return this.parseInclude(O);case"set":return this.parseSet(O);case"with":return this.parseWith(O);case"load":return this.parseLoad(O);case"url":return this.parseUrl(O);case"static":return this.parseStatic(O);case"now":return this.parseNow(O);case"comment":return this.parseComment(O);case"spaceless":case"autoescape":case"verbatim":return this.parseSimpleBlock(O,E.value);case"cycle":return this.parseCycle(O);case"firstof":return this.parseFirstof(O);case"ifchanged":return this.parseIfchanged(O);case"regroup":return this.parseRegroup(O);case"widthratio":return this.parseWidthratio(O);case"lorem":return this.parseLorem(O);case"csrf_token":return this.parseCsrfToken(O);case"debug":return this.parseDebug(O);case"templatetag":return this.parseTemplatetag(O);case"ifequal":return this.parseIfequal(O,!1);case"ifnotequal":return this.parseIfequal(O,!0);default:return this.skipToBlockEnd(),null}}parseIf(O){let E=this.parseExpression();this.expect("BLOCK_END");let A=[],U=[],B=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let Q=this.parseStatement();if(Q)A.push(Q)}while(this.checkBlockTag("elif")){this.advance(),this.advance();let Q=this.parseExpression();this.expect("BLOCK_END");let J=[];while(!this.isAtEnd()){if(this.checkBlockTag("elif")||this.checkBlockTag("else")||this.checkBlockTag("endif"))break;let Z=this.parseStatement();if(Z)J.push(Z)}U.push({test:Q,body:J})}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endif"))break;let Q=this.parseStatement();if(Q)B.push(Q)}}return this.expectBlockTag("endif"),{type:"If",test:E,body:A,elifs:U,else_:B,line:O.line,column:O.column}}parseFor(O){let E,A=this.expect("NAME").value;if(this.check("COMMA")){let K=[A];while(this.match("COMMA"))K.push(this.expect("NAME").value);E=K}else E=A;let U=this.expect("NAME");if(U.value!=="in")throw this.error(`Expected 'in' in for loop, got '${U.value}'`);let B=this.parseExpression(),Q=this.check("NAME")&&this.peek().value==="recursive";if(Q)this.advance();this.expect("BLOCK_END");let J=[],Z=[];while(!this.isAtEnd()){if(this.checkBlockTag("empty")||this.checkBlockTag("else")||this.checkBlockTag("endfor"))break;let K=this.parseStatement();if(K)J.push(K)}if(this.checkBlockTag("empty")||this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endfor"))break;let K=this.parseStatement();if(K)Z.push(K)}}return this.expectBlockTag("endfor"),{type:"For",target:E,iter:B,body:J,else_:Z,recursive:Q,line:O.line,column:O.column}}parseBlockTag(O){let E=this.expect("NAME").value,A=this.check("NAME")&&this.peek().value==="scoped";if(A)this.advance();this.expect("BLOCK_END");let U=[];while(!this.isAtEnd()){if(this.checkBlockTag("endblock"))break;let B=this.parseStatement();if(B)U.push(B)}if(this.advance(),this.advance(),this.check("NAME"))this.advance();return this.expect("BLOCK_END"),{type:"Block",name:E,body:U,scoped:A,line:O.line,column:O.column}}parseExtends(O){let E=this.parseExpression();return this.expect("BLOCK_END"),{type:"Extends",template:E,line:O.line,column:O.column}}parseInclude(O){let E=this.parseExpression(),A=null,U=!1,B=!1;while(this.check("NAME")){let Q=this.peek().value;if(Q==="ignore"&&this.peekNext()?.value==="missing")this.advance(),this.advance(),B=!0;else if(Q==="with")this.advance(),A=this.parseKeywordArgs();else if(Q==="only")this.advance(),U=!0;else if(Q==="without"){if(this.advance(),this.check("NAME")&&this.peek().value==="context")this.advance(),U=!0}else break}return this.expect("BLOCK_END"),{type:"Include",template:E,context:A,only:U,ignoreMissing:B,line:O.line,column:O.column}}parseSet(O){let E=this.expect("NAME").value;this.expect("ASSIGN");let A=this.parseExpression();return this.expect("BLOCK_END"),{type:"Set",target:E,value:A,line:O.line,column:O.column}}parseWith(O){let E=[];do{let U=this.expect("NAME").value;this.expect("ASSIGN");let B=this.parseExpression();E.push({target:U,value:B})}while(this.match("COMMA")||this.check("NAME")&&this.peekNext()?.type==="ASSIGN");this.expect("BLOCK_END");let A=[];while(!this.isAtEnd()){if(this.checkBlockTag("endwith"))break;let U=this.parseStatement();if(U)A.push(U)}return this.expectBlockTag("endwith"),{type:"With",assignments:E,body:A,line:O.line,column:O.column}}parseLoad(O){let E=[];while(this.check("NAME"))E.push(this.advance().value);return this.expect("BLOCK_END"),{type:"Load",names:E,line:O.line,column:O.column}}parseUrl(O){let E=this.parseExpression(),A=[],U={},B=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),B=this.expect("NAME").value;break}if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let Q=this.advance().value;this.advance(),U[Q]=this.parseExpression()}else A.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Url",name:E,args:A,kwargs:U,asVar:B,line:O.line,column:O.column}}parseStatic(O){let E=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Static",path:E,asVar:A,line:O.line,column:O.column}}parseNow(O){let E=this.parseExpression(),A=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),A=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Now",format:E,asVar:A,line:O.line,column:O.column}}parseComment(O){this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endcomment"))break;this.advance()}return this.expectBlockTag("endcomment"),null}parseSimpleBlock(O,E){this.skipToBlockEnd();let A=`end${E}`;while(!this.isAtEnd()){if(this.checkBlockTag(A))break;this.advance()}if(this.checkBlockTag(A))this.advance(),this.advance(),this.expect("BLOCK_END");return null}parseCycle(O){let E=[],A=null,U=!1;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){if(this.advance(),A=this.expect("NAME").value,this.check("NAME")&&this.peek().value==="silent")this.advance(),U=!0;break}E.push(this.parseExpression())}return this.expect("BLOCK_END"),{type:"Cycle",values:E,asVar:A,silent:U,line:O.line,column:O.column}}parseFirstof(O){let E=[],A=null,U=null;while(!this.check("BLOCK_END")){if(this.check("NAME")&&this.peek().value==="as"){this.advance(),U=this.expect("NAME").value;break}E.push(this.parseExpression())}if(E.length>0){let B=E[E.length-1];if(B.type==="Literal"&&typeof B.value==="string")A=E.pop()}return this.expect("BLOCK_END"),{type:"Firstof",values:E,fallback:A,asVar:U,line:O.line,column:O.column}}parseIfchanged(O){let E=[];while(!this.check("BLOCK_END"))E.push(this.parseExpression());this.expect("BLOCK_END");let A=[],U=[];while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag("endifchanged"))break;let B=this.parseStatement();if(B)A.push(B)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag("endifchanged"))break;let B=this.parseStatement();if(B)U.push(B)}}return this.expectBlockTag("endifchanged"),{type:"Ifchanged",values:E,body:A,else_:U,line:O.line,column:O.column}}parseRegroup(O){let E=this.parseExpression();this.expectName("by");let A=this.expect("NAME").value;this.expectName("as");let U=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Regroup",target:E,key:A,asVar:U,line:O.line,column:O.column}}parseWidthratio(O){let E=this.parseExpression(),A=this.parseExpression(),U=this.parseExpression(),B=null;if(this.check("NAME")&&this.peek().value==="as")this.advance(),B=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Widthratio",value:E,maxValue:A,maxWidth:U,asVar:B,line:O.line,column:O.column}}parseLorem(O){let E=null,A="p",U=!1;if(this.check("NUMBER"))E={type:"Literal",value:parseInt(this.advance().value,10),line:O.line,column:O.column};if(this.check("NAME")){let B=this.peek().value.toLowerCase();if(B==="w"||B==="p"||B==="b")A=B,this.advance()}if(this.check("NAME")&&this.peek().value==="random")U=!0,this.advance();return this.expect("BLOCK_END"),{type:"Lorem",count:E,method:A,random:U,line:O.line,column:O.column}}parseCsrfToken(O){return this.expect("BLOCK_END"),{type:"CsrfToken",line:O.line,column:O.column}}parseDebug(O){return this.expect("BLOCK_END"),{type:"Debug",line:O.line,column:O.column}}parseTemplatetag(O){let E=this.expect("NAME").value;return this.expect("BLOCK_END"),{type:"Templatetag",tagType:E,line:O.line,column:O.column}}parseIfequal(O,E){let A=this.parseExpression(),U=this.parseExpression();this.expect("BLOCK_END");let B={type:"Compare",left:A,ops:[{operator:E?"!=":"==",right:U}],line:O.line,column:O.column},Q=[],J=[],Z=E?"endifnotequal":"endifequal";while(!this.isAtEnd()){if(this.checkBlockTag("else")||this.checkBlockTag(Z))break;let K=this.parseStatement();if(K)Q.push(K)}if(this.checkBlockTag("else")){this.advance(),this.advance(),this.expect("BLOCK_END");while(!this.isAtEnd()){if(this.checkBlockTag(Z))break;let K=this.parseStatement();if(K)J.push(K)}}return this.expectBlockTag(Z),{type:"If",test:B,body:Q,elifs:[],else_:J,line:O.line,column:O.column}}parseExpression(){return this.parseConditional()}parseConditional(){let O=this.parseOr();if(this.check("NAME")&&this.peek().value==="if"){this.advance();let E=this.parseOr();this.expectName("else");let A=this.parseConditional();O={type:"Conditional",test:E,trueExpr:O,falseExpr:A,line:O.line,column:O.column}}return O}parseOr(){let O=this.parseAnd();while(this.check("OR")||this.check("NAME")&&this.peek().value==="or"){this.advance();let E=this.parseAnd();O={type:"BinaryOp",operator:"or",left:O,right:E,line:O.line,column:O.column}}return O}parseAnd(){let O=this.parseNot();while(this.check("AND")||this.check("NAME")&&this.peek().value==="and"){this.advance();let E=this.parseNot();O={type:"BinaryOp",operator:"and",left:O,right:E,line:O.line,column:O.column}}return O}parseNot(){if(this.check("NOT")||this.check("NAME")&&this.peek().value==="not"){let O=this.advance();return{type:"UnaryOp",operator:"not",operand:this.parseNot(),line:O.line,column:O.column}}return this.parseCompare()}parseCompare(){let O=this.parseAddSub(),E=[];while(!0){let A=null;if(this.match("EQ"))A="==";else if(this.match("NE"))A="!=";else if(this.match("LT"))A="<";else if(this.match("GT"))A=">";else if(this.match("LE"))A="<=";else if(this.match("GE"))A=">=";else if(this.check("NAME")){let B=this.peek().value;if(B==="in")this.advance(),A="in";else if(B==="not"&&this.peekNext()?.value==="in")this.advance(),this.advance(),A="not in";else if(B==="is"){this.advance();let Q=this.check("NOT");if(Q)this.advance();let Z=this.expect("NAME").value,K=[];if(this.match("LPAREN")){while(!this.check("RPAREN"))if(K.push(this.parseExpression()),!this.check("RPAREN"))this.expect("COMMA");this.expect("RPAREN")}O={type:"TestExpr",node:O,test:Z,args:K,negated:Q,line:O.line,column:O.column};continue}}if(!A)break;let U=this.parseAddSub();E.push({operator:A,right:U})}if(E.length===0)return O;return{type:"Compare",left:O,ops:E,line:O.line,column:O.column}}parseAddSub(){let O=this.parseMulDiv();while(this.check("ADD")||this.check("SUB")||this.check("TILDE")){let E=this.advance(),A=this.parseMulDiv();O={type:"BinaryOp",operator:E.value,left:O,right:A,line:O.line,column:O.column}}return O}parseMulDiv(){let O=this.parseUnary();while(this.check("MUL")||this.check("DIV")||this.check("MOD")){let E=this.advance(),A=this.parseUnary();O={type:"BinaryOp",operator:E.value,left:O,right:A,line:O.line,column:O.column}}return O}parseUnary(){if(this.check("SUB")||this.check("ADD")){let O=this.advance(),E=this.parseUnary();return{type:"UnaryOp",operator:O.value,operand:E,line:O.line,column:O.column}}return this.parseFilter()}parseFilter(){let O=this.parsePostfix();while(this.match("PIPE")){let E=this.expect("NAME").value,A=[],U={};if(this.match("COLON"))if(this.check("SUB")||this.check("ADD")){let B=this.advance(),Q=this.parsePostfix();A.push({type:"UnaryOp",operator:B.value,operand:Q,line:B.line,column:B.column})}else A.push(this.parsePostfix());else if(this.match("LPAREN")){while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let B=this.advance().value;this.advance(),U[B]=this.parseExpression()}else A.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN")}O={type:"FilterExpr",node:O,filter:E,args:A,kwargs:U,line:O.line,column:O.column}}return O}parsePostfix(){let O=this.parsePrimary();while(!0)if(this.match("DOT")){let E;if(this.check("NUMBER"))E=this.advance().value;else E=this.expect("NAME").value;O={type:"GetAttr",object:O,attribute:E,line:O.line,column:O.column}}else if(this.match("LBRACKET")){let E=this.parseExpression();this.expect("RBRACKET"),O={type:"GetItem",object:O,index:E,line:O.line,column:O.column}}else if(this.match("LPAREN")){let E=[],A={};while(!this.check("RPAREN")){if(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let U=this.advance().value;this.advance(),A[U]=this.parseExpression()}else E.push(this.parseExpression());if(!this.check("RPAREN"))this.expect("COMMA")}this.expect("RPAREN"),O={type:"FunctionCall",callee:O,args:E,kwargs:A,line:O.line,column:O.column}}else break;return O}parsePrimary(){let O=this.peek();if(this.match("STRING"))return{type:"Literal",value:O.value,line:O.line,column:O.column};if(this.match("NUMBER"))return{type:"Literal",value:O.value.includes(".")?parseFloat(O.value):parseInt(O.value,10),line:O.line,column:O.column};if(this.check("NAME")){let E=this.advance().value;if(E==="true"||E==="True")return{type:"Literal",value:!0,line:O.line,column:O.column};if(E==="false"||E==="False")return{type:"Literal",value:!1,line:O.line,column:O.column};if(E==="none"||E==="None"||E==="null")return{type:"Literal",value:null,line:O.line,column:O.column};return{type:"Name",name:E,line:O.line,column:O.column}}if(this.match("LPAREN")){let E=this.parseExpression();return this.expect("RPAREN"),E}if(this.match("LBRACKET")){let E=[];while(!this.check("RBRACKET"))if(E.push(this.parseExpression()),!this.check("RBRACKET"))this.expect("COMMA");return this.expect("RBRACKET"),{type:"Array",elements:E,line:O.line,column:O.column}}if(this.match("LBRACE")){let E=[];while(!this.check("RBRACE")){let A=this.parseExpression();this.expect("COLON");let U=this.parseExpression();if(E.push({key:A,value:U}),!this.check("RBRACE"))this.expect("COMMA")}return this.expect("RBRACE"),{type:"Object",pairs:E,line:O.line,column:O.column}}throw this.error(`Unexpected token: ${O.type} (${O.value})`)}parseKeywordArgs(){let O={};while(this.check("NAME")&&this.peekNext()?.type==="ASSIGN"){let E=this.advance().value;this.advance(),O[E]=this.parseExpression()}return O}checkBlockTag(O){if(this.peek().type!=="BLOCK_START")return!1;let E=this.current+1;if(E>=this.tokens.length)return!1;let A=this.tokens[E];return A.type==="NAME"&&A.value===O}expectBlockTag(O){this.advance();let E=this.expect("NAME");if(E.value!==O)throw this.error(`Expected '${O}', got '${E.value}'`);this.expect("BLOCK_END")}expectName(O){let E=this.expect("NAME");if(E.value!==O)throw this.error(`Expected '${O}', got '${E.value}'`)}skipToBlockEnd(){while(!this.isAtEnd()&&!this.check("BLOCK_END"))this.advance();if(this.check("BLOCK_END"))this.advance()}isAtEnd(){return this.peek().type==="EOF"}peek(){return this.tokens[this.current]}peekNext(){if(this.current+1>=this.tokens.length)return null;return this.tokens[this.current+1]}advance(){if(!this.isAtEnd())this.current++;return this.tokens[this.current-1]}check(O){if(this.isAtEnd())return!1;return this.peek().type===O}match(O){if(this.check(O))return this.advance(),!0;return!1}expect(O){if(this.check(O))return this.advance();let E=this.peek();throw this.error(`Expected ${O}, got ${E.type} (${E.value})`)}error(O){let E=this.peek();return new N(O,{line:E.line,column:E.column,source:this.source})}}var e=R(()=>{x();y()});function FE(O,E,A,U,B){let Q=O.length,J=Q-E,Z={_items:O,_idx:E,counter:E+1,counter0:E,first:E===0,last:E===Q-1,length:Q,index:E+1,index0:E,depth:A,depth0:A-1,revcounter:J,revcounter0:J-1,revindex:J,revindex0:J-1,get previtem(){return this._idx>0?this._items[this._idx-1]:void 0},get nextitem(){return this._idx<this._items.length-1?this._items[this._idx+1]:void 0},cycle(...K){return K[this._idx%K.length]},changed:(K)=>{let $=K!==U.value;return U.value=K,$}};if(B)Z.parentloop=B;return Z}class C{scopes=[];parent=null;_forloopStack=[];_lastCycleValue={value:null};_currentForloop=null;_currentScope;constructor(O={},E=null){this.parent=E,this._currentScope={...O},this.scopes.push(this._currentScope)}get(O){if(O==="forloop"||O==="loop")return this._currentForloop;for(let E=this.scopes.length-1;E>=0;E--){let A=this.scopes[E];if(O in A)return A[O]}return this.parent?this.parent.get(O):void 0}set(O,E){this._currentScope[O]=E}has(O){for(let E=this.scopes.length-1;E>=0;E--)if(O in this.scopes[E])return!0;return this.parent?this.parent.has(O):!1}push(O={}){this._currentScope={...O},this.scopes.push(this._currentScope)}pop(){if(this.scopes.length>1)this.scopes.pop(),this._currentScope=this.scopes[this.scopes.length-1]}derived(O={}){return new C(O,this)}pushForLoop(O,E){let A=this._forloopStack.length+1,U=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:void 0,B=FE(O,E,A,this._lastCycleValue,U);return this._forloopStack.push(B),this._currentForloop=B,B}popForLoop(){this._forloopStack.pop(),this._currentForloop=this._forloopStack.length>0?this._forloopStack[this._forloopStack.length-1]:null}updateForLoop(O,E){let A=this._currentForloop;if(!A)return;let U=E.length;if(A._idx=O,A._items!==E)A._items=E;A.counter=O+1,A.counter0=O,A.index=O+1,A.index0=O,A.first=O===0,A.last=O===U-1;let B=U-O;A.revcounter=B,A.revcounter0=B-1,A.revindex=B,A.revindex0=B-1}toObject(){let O={};if(this.parent)Object.assign(O,this.parent.toObject());for(let E of this.scopes)Object.assign(O,E);return O}}var zE,RE,WE,_E,jE,vO,NE,HE,pO,cO,CE,SE,wE,VE,LE,qE=(O)=>String(O).toUpperCase(),hE=(O)=>String(O).toLowerCase(),bE=(O)=>{let E=String(O);return E.charAt(0).toUpperCase()+E.slice(1).toLowerCase()},fE=(O)=>{let E=String(O);return E.charAt(0).toUpperCase()+E.slice(1)},kE=(O)=>String(O).replace(zE,(E)=>E.toUpperCase()),gE=(O)=>String(O).trim(),yE=(O)=>String(O).replace(RE,""),xO=(O)=>{if(O?.__safe__)return O;let E=Bun.escapeHTML(String(O)),A=new String(E);return A.__safe__=!0,A},xE=(O)=>{let E=new String(O);return E.__safe__=!0,E},TE=(O)=>JSON.stringify(String(O)).slice(1,-1),mE=(O)=>{let A=String(O).split(HE),U="";for(let Q=0;Q<A.length;Q++){if(Q>0)U+=`
12
+ `;U+=`<p>${A[Q].replace(pO,"<br>")}</p>`}let B=new String(U);return B.__safe__=!0,B},vE=(O)=>{let E=String(O).replace(pO,"<br>"),A=new String(E);return A.__safe__=!0,A},pE=(O,E=30)=>{let A=String(O);if(A.length<=E)return A;return A.slice(0,E-3)+"..."},cE=(O,E=15)=>{let A=String(O).split(cO);if(A.length<=E)return O;return A.slice(0,E).join(" ")+"..."},sE=(O)=>String(O).split(cO).filter(Boolean).length,iE=(O,E=80)=>{let A=String(O),U=Math.max(0,E-A.length),B=Math.floor(U/2),Q=U-B;return" ".repeat(B)+A+" ".repeat(Q)},dE=(O,E=80)=>String(O).padEnd(E),uE=(O,E=80)=>String(O).padStart(E),rE=(O,E="")=>String(O).split(E).join(""),lE=(O)=>String(O).toLowerCase().replace(WE,"").replace(_E,"-").replace(jE,""),nE=(O)=>Math.abs(Number(O)),oE=(O,E=0)=>Number(Number(O).toFixed(E)),aE=(O)=>parseInt(String(O),10)||0,tE=(O)=>parseFloat(String(O))||0,eE=(O,E=-1)=>{let A=parseFloat(String(O));if(isNaN(A))return"";if(E===-1){let U=A.toFixed(1);return U.endsWith(".0")?Math.round(A).toString():U}return A.toFixed(Math.abs(E))},OA=(O,E)=>{let A=Number(O),U=Number(E);if(!isNaN(A)&&!isNaN(U))return A+U;return String(O)+String(E)},EA=(O,E)=>Number(O)%Number(E)===0,AA=(O)=>{let E=Number(O),A=["bytes","KB","MB","GB","TB","PB"],U=0,B=E;while(B>=1024&&U<A.length-1)B/=1024,U++;return`${B.toFixed(1)} ${A[U]}`},sO=(O)=>{if(O==null)return 0;if(typeof O==="string"||Array.isArray(O))return O.length;if(typeof O==="object"){let E=0;for(let A in O)E++;return E}return 0},BA=(O,E)=>sO(O)===Number(E),UA=(O)=>{if(Array.isArray(O))return O[0];if(typeof O==="string")return O[0];return O},KA=(O)=>{if(Array.isArray(O))return O[O.length-1];if(typeof O==="string")return O[O.length-1];return O},QA=(O,E="")=>{if(Array.isArray(O))return O.join(E);return String(O)},$A=(O,E)=>{if(!O)return O;let[A,U]=String(E).split(":"),B=A?parseInt(A,10):0,Q=U?parseInt(U,10):void 0;if(Array.isArray(O)||typeof O==="string")return O.slice(B,Q);return O},ZA=(O)=>{if(Array.isArray(O))return[...O].reverse();if(typeof O==="string")return O.split("").reverse().join("");return O},JA=(O,E=!1)=>{if(!Array.isArray(O))return O;let A=[...O].sort();return E?A.reverse():A},YA=(O)=>{if(!Array.isArray(O))return O;let E=new Set,A=[];for(let U=0;U<O.length;U++){let B=O[U];if(!E.has(B))E.add(B),A.push(B)}return A},XA=(O)=>{if(Array.isArray(O))return O;return String(O).split("")},iO=(O,E)=>{if(!Array.isArray(O))return O;return[...O].sort((A,U)=>{let B=E?A[E]:A,Q=E?U[E]:U;return B<Q?-1:B>Q?1:0})},IA=(O,E)=>{let A=iO(O,E);return Array.isArray(A)?A.reverse():A},MA=(O,E)=>{if(!Array.isArray(O))return[[O]];let A=[],U=Number(E)||2;for(let B=0;B<O.length;B+=U)A.push(O.slice(B,B+U));return A},DA=(O,E)=>{switch(E){case"d":return String(O.getDate()).padStart(2,"0");case"j":return String(O.getDate());case"D":return CE[O.getDay()];case"l":return SE[O.getDay()];case"m":return String(O.getMonth()+1).padStart(2,"0");case"n":return String(O.getMonth()+1);case"M":return wE[O.getMonth()];case"F":return VE[O.getMonth()];case"N":return LE[O.getMonth()];case"y":return String(O.getFullYear()).slice(-2);case"Y":return String(O.getFullYear());case"H":return String(O.getHours()).padStart(2,"0");case"G":return String(O.getHours());case"i":return String(O.getMinutes()).padStart(2,"0");case"s":return String(O.getSeconds()).padStart(2,"0");case"a":return O.getHours()<12?"a.m.":"p.m.";case"A":return O.getHours()<12?"AM":"PM";case"g":return String(O.getHours()%12||12);case"h":return String(O.getHours()%12||12).padStart(2,"0");default:return E}},dO=(O,E="N j, Y")=>{let A=O instanceof Date?O:new Date(O);if(isNaN(A.getTime()))return"";return E.replace(NE,(U)=>DA(A,U))},PA=(O,E="H:i")=>dO(O,E),GA=(O,E=new Date)=>{let A=O instanceof Date?O:new Date(O),U=(new Date(E).getTime()-A.getTime())/1000,B=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[Q,J,Z]of B){let K=Math.floor(U/Q);if(K>=1)return`${K} ${K===1?J:Z}`}return"just now"},FA=(O,E=new Date)=>{let U=((O instanceof Date?O:new Date(O)).getTime()-new Date(E).getTime())/1000,B=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[Q,J,Z]of B){let K=Math.floor(U/Q);if(K>=1)return`${K} ${K===1?J:Z}`}return"now"},TO=(O,E="")=>{if(O===void 0||O===null||O===""||O===!1)return E;return O},zA=(O,E="")=>O===null||O===void 0?E:O,RA=(O,E="yes,no,maybe")=>{let[A,U,B]=E.split(",");if(O===!0)return A;if(O===!1)return U;return B??U},WA=(O,E="s")=>{let[A,U]=E.includes(",")?E.split(","):["",E];return Number(O)===1?A:U},_A=(O)=>encodeURIComponent(String(O)),jA=(O)=>{let E=String(O).replace(vO,'<a href="$1">$1</a>'),A=new String(E);return A.__safe__=!0,A},mO=(O,E)=>{try{let A=JSON.stringify(O,null,E),U=new String(A);return U.__safe__=!0,U}catch{return""}},NA=(O)=>{if(Array.isArray(O))return O[Math.floor(Math.random()*O.length)];return O},HA=(O,E,A=null)=>{if(!Array.isArray(O))return[[O]];let U=[],B=Number(E)||1;for(let Q=0;Q<O.length;Q+=B){let J=O.slice(Q,Q+B);while(A!==null&&J.length<B)J.push(A);U.push(J)}return U},CA=(O,E)=>{if(!Array.isArray(O))return[];let A={};for(let B of O){let Q=String(E?B[E]:B);if(!(Q in A))A[Q]=[];A[Q].push(B)}let U=[];for(let B in A)U.push({grouper:B,list:A[B]});return U},SA=(O,E=79,A=!0,U=`
13
+ `)=>{let B=String(O);if(B.length<=E)return B;let Q=B.split(" "),J=[],Z="";for(let K of Q)if(Z.length+K.length+1<=E)Z+=(Z?" ":"")+K;else{if(Z)J.push(Z);if(A&&K.length>E){let $=K;while($.length>E)J.push($.slice(0,E)),$=$.slice(E);Z=$}else Z=K}if(Z)J.push(Z);return J.join(U)},wA=(O,E=4,A=!1,U=!1)=>{let B=String(O),Q=typeof E==="string"?E:" ".repeat(Number(E)),J=B.split(`
14
+ `),Z="";for(let K=0;K<J.length;K++){if(K>0)Z+=`
15
+ `;let $=J[K];if(K===0&&!A)Z+=$;else if(!U&&$.trim()==="")Z+=$;else Z+=Q+$}return Z},VA=(O,E,A,U)=>{let B=String(O),Q=String(E),J=String(A);if(U===void 0||U<0)return B.replaceAll(Q,J);let Z=Number(U);if(Z===0)return B;let K="",$=0,Y=0;while($<B.length&&Y<Z){let X=B.indexOf(Q,$);if(X===-1)break;K+=B.slice($,X)+J,$=X+Q.length,Y++}return K+=B.slice($),K},LA=(O,...E)=>{let A=String(O);for(let U=0;U<E.length;U++){let B=String(E[U]);A=A.replace(/%s/,B);let Q=`%${U+1}`;if(A.includes(Q))A=A.replaceAll(Q,B)}return A},qA=(O)=>String(O),hA=(O)=>{if(Array.isArray(O))return O;if(typeof O==="string")return O.split("");if(O&&typeof O[Symbol.iterator]==="function")return[...O];if(typeof O==="object"&&O!==null)return Object.values(O);return[O]},bA=(O,E)=>{if(!Array.isArray(O))return[];if(typeof E==="string")return O.map((A)=>A?.[E]);return O},fA=(O,E)=>{if(!Array.isArray(O))return[];if(E===void 0)return O.filter((A)=>!!A);return O.filter((A)=>!!A?.[E])},kA=(O,E)=>{if(!Array.isArray(O))return[];if(E===void 0)return O.filter((A)=>!A);return O.filter((A)=>!A?.[E])},uO=(O,E,A,U)=>{if(!Array.isArray(O))return[];return O.filter((B)=>{let Q=B?.[E];if(A===void 0)return!!Q;if(A==="eq"||A==="equalto")return Q===U;if(A==="ne")return Q!==U;if(A==="gt")return Q>U;if(A==="lt")return Q<U;if(A==="ge"||A==="gte")return Q>=U;if(A==="le"||A==="lte")return Q<=U;if(A==="in")return U?.includes?.(Q);if(A==="defined")return Q!==void 0;if(A==="undefined")return Q===void 0;if(A==="none")return Q===null;if(A==="true")return Q===!0;if(A==="false")return Q===!1;return!!Q})},gA=(O,E,A,U)=>{if(!Array.isArray(O))return[];let B=uO(O,E,A,U);return O.filter((Q)=>!B.includes(Q))},yA=(O,E)=>{if(O==null)return;return O[E]},xA=(O,E,A)=>{if(!Array.isArray(O)||O.length===0)return A;if(E){let B=O[0];for(let Q=1;Q<O.length;Q++)if(O[Q][E]>B[E])B=O[Q];return B}let U=O[0];for(let B=1;B<O.length;B++)if(O[B]>U)U=O[B];return U},TA=(O,E,A)=>{if(!Array.isArray(O)||O.length===0)return A;if(E){let B=O[0];for(let Q=1;Q<O.length;Q++)if(O[Q][E]<B[E])B=O[Q];return B}let U=O[0];for(let B=1;B<O.length;B++)if(O[B]<U)U=O[B];return U},mA=(O,E,A=0)=>{if(!Array.isArray(O))return A;let U=Number(A);for(let B=0;B<O.length;B++){let Q=E?O[B][E]:O[B];U+=Number(Q)||0}return U},vA=(O)=>{try{let E=JSON.stringify(O,null,2),A=new String(E);return A.__safe__=!0,A}catch{return String(O)}},pA=(O)=>{let E=Bun.escapeHTML(String(O)),A=new String(E);return A.__safe__=!0,A},cA,sA=(O)=>{let E=String(O).toLowerCase(),A=E.length,U=Array(A);for(let B=0;B<A;B++)U[B]=cA[E[B]]??E[B];return U.join("")},iA=(O)=>{let E=String(O).split(`
16
+ `),A=String(E.length).length,U="";for(let B=0;B<E.length;B++){if(B>0)U+=`
17
+ `;U+=`${String(B+1).padStart(A," ")}. ${E[B]}`}return U},dA=(O)=>{if(!Array.isArray(O))return String(O);let E=(B,Q=0)=>{let J=" ".repeat(Q),Z="";for(let K=0;K<B.length;K++){let $=B[K];if(Array.isArray($))Z+=`
18
+ ${J}<ul>
19
+ ${E($,Q+1)}${J}</ul>
20
+ `;else{if(Z+=`${J}<li>${$}`,K+1<B.length&&Array.isArray(B[K+1]))Z+=`
21
+ ${J}<ul>
22
+ ${E(B[K+1],Q+1)}${J}</ul>
23
+ ${J}`,K++;Z+=`</li>
24
+ `}}return Z},A=E(O),U=new String(A);return U.__safe__=!0,U},uA=(O)=>{let E=String(O).replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/"/g,"\\\""),A=new String(E);return A.__safe__=!0,A},rA=(O,E)=>{let A=parseInt(String(O),10);if(isNaN(A))return O;let U=String(Math.abs(A)),B=Number(E)||1;if(B<1||B>U.length)return O;return parseInt(U[U.length-B],10)},lA=(O)=>{return String(O).replace(/ /g,"%20").replace(/"/g,"%22").replace(/</g,"%3C").replace(/>/g,"%3E").replace(/\\/g,"%5C").replace(/\^/g,"%5E").replace(/`/g,"%60").replace(/\{/g,"%7B").replace(/\|/g,"%7C").replace(/\}/g,"%7D")},nA=(O,E)=>{let A=JSON.stringify(O).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),B=`<script${E?` id="${String(E)}"`:""} type="application/json">${A}</script>`,Q=new String(B);return Q.__safe__=!0,Q},oA=(O)=>{if(!Array.isArray(O))return O;return O.map((E)=>{let A=new String(E);return A.__safe__=!0,A})},aA=(O,E)=>{let A=String(E),U=O;if(A==="s")return String(U);if(A==="d"||A==="i")return String(parseInt(String(U),10)||0);if(A==="f")return String(parseFloat(String(U))||0);if(A==="x")return(parseInt(String(U),10)||0).toString(16);if(A==="X")return(parseInt(String(U),10)||0).toString(16).toUpperCase();if(A==="o")return(parseInt(String(U),10)||0).toString(8);if(A==="b")return(parseInt(String(U),10)||0).toString(2);if(A==="e")return(parseFloat(String(U))||0).toExponential();let B=A.match(/^\.?(\d+)f$/);if(B){let J=parseInt(B[1],10);return(parseFloat(String(U))||0).toFixed(J)}let Q=A.match(/^(\d+)([sd])$/);if(Q){let J=parseInt(Q[1],10),Z=Q[2];return(Z==="d"?String(parseInt(String(U),10)||0):String(U)).padStart(J,Z==="d"?"0":" ")}return String(U)},tA=(O,E=30)=>{let A=String(O),U=Number(E),B="",Q=0,J=!1,Z=[];for(let $=0;$<A.length&&Q<U;$++){let Y=A[$];if(Y==="<"){J=!0;let X=A.slice($).match(/^<\/(\w+)/),I=A.slice($).match(/^<(\w+)/);if(X){let D=X[1].toLowerCase(),M=Z.lastIndexOf(D);if(M!==-1)Z.splice(M,1)}else if(I&&!A.slice($).match(/^<\w+[^>]*\/>/))Z.push(I[1].toLowerCase())}if(B+=Y,Y===">")J=!1;else if(!J)Q++}if(Q>=U&&A.length>B.length)B+="...";for(let $=Z.length-1;$>=0;$--)B+=`</${Z[$]}>`;let K=new String(B);return K.__safe__=!0,K},eA=(O,E=15)=>{let A=String(O),U=Number(E),B="",Q=0,J=!1,Z=!1,K=[];for(let Y=0;Y<A.length&&Q<U;Y++){let X=A[Y];if(X==="<"){J=!0;let I=A.slice(Y).match(/^<\/(\w+)/),D=A.slice(Y).match(/^<(\w+)/);if(I){let M=I[1].toLowerCase(),W=K.lastIndexOf(M);if(W!==-1)K.splice(W,1)}else if(D&&!A.slice(Y).match(/^<\w+[^>]*\/>/))K.push(D[1].toLowerCase())}if(B+=X,X===">")J=!1;else if(!J){let I=/\s/.test(X);if(!I&&!Z)Z=!0;else if(I&&Z)Z=!1,Q++}}if(Z)Q++;if(Q>=U)B=B.trimEnd()+"...";for(let Y=K.length-1;Y>=0;Y--)B+=`</${K[Y]}>`;let $=new String(B);return $.__safe__=!0,$},OB=(O,E=15)=>{let A=Number(E),U=String(O).replace(vO,(Q)=>{let J=Q.length>A?Q.slice(0,A)+"...":Q;return`<a href="${Q}">${J}</a>`}),B=new String(U);return B.__safe__=!0,B},EB=(O)=>{if(O==null||typeof O!=="object")return[];return Object.entries(O)},AB=(O,E=!0)=>{if(O==null||typeof O!=="object")return"";let A=[];for(let[J,Z]of Object.entries(O))if(Z===!0)A.push(J);else if(Z!==!1&&Z!=null){let K=Bun.escapeHTML(String(Z));A.push(`${J}="${K}"`)}let U=A.join(" "),B=E&&U?" "+U:U,Q=new String(B);return Q.__safe__=!0,Q},T;var OO=R(()=>{zE=/\b\w/g,RE=/<[^>]*>/g,WE=/[^\w\s-]/g,_E=/[\s_-]+/g,jE=/^-+|-+$/g,vO=/(https?:\/\/[^\s]+)/g,NE=/[a-zA-Z]/g,HE=/\n\n+/,pO=/\n/g,cO=/\s+/,CE=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],SE=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],wE=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],VE=["January","February","March","April","May","June","July","August","September","October","November","December"],LE=["Jan.","Feb.","March","April","May","June","July","Aug.","Sept.","Oct.","Nov.","Dec."],cA={a:"2",b:"2",c:"2",d:"3",e:"3",f:"3",g:"4",h:"4",i:"4",j:"5",k:"5",l:"5",m:"6",n:"6",o:"6",p:"7",q:"7",r:"7",s:"7",t:"8",u:"8",v:"8",w:"9",x:"9",y:"9",z:"9"},T={upper:qE,lower:hE,capitalize:bE,capfirst:fE,title:kE,trim:gE,striptags:yE,escape:xO,e:xO,safe:xE,escapejs:TE,linebreaks:mE,linebreaksbr:vE,truncatechars:pE,truncatewords:cE,wordcount:sE,center:iE,ljust:dE,rjust:uE,cut:rE,slugify:lE,abs:nE,round:oE,int:aE,float:tE,floatformat:eE,add:OA,divisibleby:EA,filesizeformat:AA,length:sO,length_is:BA,first:UA,last:KA,join:QA,slice:$A,reverse:ZA,sort:JA,unique:YA,make_list:XA,dictsort:iO,dictsortreversed:IA,columns:MA,date:dO,time:PA,timesince:GA,timeuntil:FA,default:TO,d:TO,default_if_none:zA,yesno:RA,pluralize:WA,urlencode:_A,urlize:jA,json:mO,tojson:mO,random:NA,batch:HA,groupby:CA,wordwrap:SA,indent:wA,replace:VA,format:LA,string:qA,list:hA,map:bA,select:fA,reject:kA,selectattr:uO,rejectattr:gA,attr:yA,max:xA,min:TA,sum:mA,pprint:vA,forceescape:pA,phone2numeric:sA,linenumbers:iA,unordered_list:dA,addslashes:uA,get_digit:rA,iriencode:lA,json_script:nA,safeseq:oA,stringformat:aA,truncatechars_html:tA,truncatewords_html:eA,urlizetrunc:OB,items:EB,xmlattr:AB}});var BB=(O,E)=>{let A=Number(O),U=Number(E);if(U===0)return!1;return A%U===0},UB=(O)=>{let E=Number(O);return Number.isInteger(E)&&E%2===0},KB=(O)=>{let E=Number(O);return Number.isInteger(E)&&E%2!==0},QB=(O)=>{return typeof O==="number"&&!isNaN(O)},$B=(O)=>{return Number.isInteger(O)},ZB=(O)=>{return typeof O==="number"&&!Number.isInteger(O)&&!isNaN(O)},lO=(O,E)=>Number(O)>Number(E),JB=(O,E)=>Number(O)>=Number(E),nO=(O,E)=>Number(O)<Number(E),YB=(O,E)=>Number(O)<=Number(E),XB,IB,MB=(O)=>{return O!==IO},IO=(O)=>{return O===IO},rO=(O)=>{return O===null},DB=(O)=>{return typeof O==="boolean"},PB=(O)=>{return typeof O==="string"},GB=(O)=>{return O!==null&&typeof O==="object"&&!Array.isArray(O)&&!(O instanceof Date)},FB=(O)=>{if(O==null)return!1;return typeof O==="string"||Array.isArray(O)||typeof O[Symbol.iterator]==="function"},zB=(O)=>{return Array.isArray(O)||typeof O==="string"},RB=(O)=>{return typeof O==="function"},WB=(O)=>{if(typeof O!=="string")return!1;return O===O.toLowerCase()&&O!==O.toUpperCase()},_B=(O)=>{if(typeof O!=="string")return!1;return O===O.toUpperCase()&&O!==O.toLowerCase()},jB=(O)=>{if(O==null)return!0;if(typeof O==="string"||Array.isArray(O))return O.length===0;if(typeof O==="object"){for(let E in O)return!1;return!0}return!1},NB=(O,E)=>{if(Array.isArray(E))return E.includes(O);if(typeof E==="string")return E.includes(String(O));if(typeof E==="object"&&E!==null)return O in E;return!1},oO=(O,E)=>O===E,HB=(O,E)=>O!==E,CB=(O,E)=>O===E,SB,aO=(O)=>{if(O==null)return!1;if(typeof O==="boolean")return O;if(typeof O==="number")return O!==0;if(typeof O==="string")return O.length>0;if(Array.isArray(O))return O.length>0;if(typeof O==="object"){for(let E in O)return!0;return!1}return!0},wB=(O)=>!aO(O),VB=(O)=>O===!0,LB=(O)=>O===!1,m;var EO=R(()=>{XB=lO,IB=nO,SB=oO,m={divisibleby:BB,even:UB,odd:KB,number:QB,integer:$B,float:ZB,gt:lO,ge:JB,lt:nO,le:YB,greaterthan:XB,lessthan:IB,defined:MB,undefined:IO,none:rO,None:rO,boolean:DB,string:PB,mapping:GB,iterable:FB,sequence:zB,callable:RB,lower:WB,upper:_B,empty:jB,in:NB,eq:oO,ne:HB,sameas:CB,equalto:SB,truthy:aO,falsy:wB,true:VB,false:LB}});var MO={};o(MO,{Runtime:()=>z,Context:()=>C});var z;var f=R(()=>{OO();EO();y();z=class z{options;filters;tests;blocks=new Map;parentTemplate=null;source;constructor(O={}){if(this.options={autoescape:O.autoescape??!0,filters:O.filters??{},tests:O.tests??{},globals:O.globals??{},urlResolver:O.urlResolver??((E)=>`#${E}`),staticResolver:O.staticResolver??((E)=>`/static/${E}`),templateLoader:O.templateLoader??(async()=>{throw Error("Template loader not configured")}),timezone:O.timezone??void 0},this.filters={...T,...this.options.filters},this.options.timezone){let E=this.options.timezone;this.filters.date=(A,U="N j, Y")=>{let B=A instanceof Date?A:new Date(A);if(isNaN(B.getTime()))return"";return this.formatDate(B,U)},this.filters.time=(A,U="H:i")=>{return this.filters.date(A,U)}}this.tests={...m,...this.options.tests}}async render(O,E={}){let A=new C({...this.options.globals,...E});if(this.blocks.clear(),this.parentTemplate=null,this.templateNeedsAsync(O)){if(await this.collectBlocks(O,A),this.parentTemplate)return this.renderTemplateAsync(this.parentTemplate,A);return this.renderTemplateAsync(O,A)}return this.collectBlocksSync(O),this.renderTemplateSync(O,A)}templateNeedsAsync(O){for(let E of O.body){if(E.type==="Extends"||E.type==="Include")return!0;if(E.type==="If"){let A=E;if(this.nodesNeedAsync(A.body))return!0;for(let U of A.elifs)if(this.nodesNeedAsync(U.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(E.type==="For"){let A=E;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(E.type==="Block"){if(this.nodesNeedAsync(E.body))return!0}if(E.type==="With"){if(this.nodesNeedAsync(E.body))return!0}}return!1}nodesNeedAsync(O){for(let E of O){if(E.type==="Extends"||E.type==="Include")return!0;if(E.type==="If"){let A=E;if(this.nodesNeedAsync(A.body))return!0;for(let U of A.elifs)if(this.nodesNeedAsync(U.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(E.type==="For"){let A=E;if(this.nodesNeedAsync(A.body))return!0;if(this.nodesNeedAsync(A.else_))return!0}if(E.type==="Block"){if(this.nodesNeedAsync(E.body))return!0}if(E.type==="With"){if(this.nodesNeedAsync(E.body))return!0}}return!1}collectBlocksSync(O){for(let E of O.body)if(E.type==="Block")this.blocks.set(E.name,E)}renderTemplateSync(O,E){let A=[];for(let U of O.body){let B=this.renderNodeSync(U,E);if(B!==null)A.push(B)}return A.join("")}renderNodeSync(O,E){if(O.type==="Text")return O.value;if(O.type==="Output")return this.stringify(this.eval(O.expression,E));switch(O.type){case"If":return this.renderIfSync(O,E);case"For":return this.renderForSync(O,E);case"Block":return this.renderBlockSync(O,E);case"Set":return E.set(O.target,this.eval(O.value,E)),"";case"With":return this.renderWithSync(O,E);case"Url":return this.renderUrlSync(O,E);case"Static":return this.renderStaticSync(O,E);case"Now":return this.renderNowSync(O,E);case"Load":case"Extends":return null;case"Cycle":return this.renderCycleSync(O,E);case"Firstof":return this.renderFirstofSync(O,E);case"Ifchanged":return this.renderIfchangedSync(O,E);case"Regroup":return this.renderRegroupSync(O,E);case"Widthratio":return this.renderWidthratioSync(O,E);case"Lorem":return this.renderLoremSync(O,E);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(E);case"Templatetag":return this.renderTemplatetagSync(O);default:return null}}renderIfSync(O,E){if(this.isTruthy(this.eval(O.test,E)))return this.renderNodesSync(O.body,E);for(let A of O.elifs)if(this.isTruthy(this.eval(A.test,E)))return this.renderNodesSync(A.body,E);return O.else_.length>0?this.renderNodesSync(O.else_,E):""}renderForSync(O,E){let A=this.eval(O.iter,E),U=this.toIterable(A),B=U.length;if(B===0)return this.renderNodesSync(O.else_,E);E.push(),E.pushForLoop(U,0);let Q;if(Array.isArray(O.target)){let J=O.target,Z=J.length;if(B<25){Q="";for(let K=0;K<B;K++){let $=U[K];if(K>0)E.updateForLoop(K,U);let Y=Array.isArray($)?$:[$,$];for(let X=0;X<Z;X++)E.set(J[X],Y[X]);Q+=this.renderNodesSync(O.body,E)}}else{let K=Array(B);for(let $=0;$<B;$++){let Y=U[$];if($>0)E.updateForLoop($,U);let X=Array.isArray(Y)?Y:[Y,Y];for(let I=0;I<Z;I++)E.set(J[I],X[I]);K[$]=this.renderNodesSync(O.body,E)}Q=K.join("")}}else{let J=O.target;if(B<25){Q="";for(let Z=0;Z<B;Z++){if(Z>0)E.updateForLoop(Z,U);E.set(J,U[Z]),Q+=this.renderNodesSync(O.body,E)}}else{let Z=Array(B);for(let K=0;K<B;K++){if(K>0)E.updateForLoop(K,U);E.set(J,U[K]),Z[K]=this.renderNodesSync(O.body,E)}Q=Z.join("")}}return E.popForLoop(),E.pop(),Q}renderBlockSync(O,E){let A=this.blocks.get(O.name)||O;E.push();let U=this.renderNodesSync(O.body,E),B=new String(U);B.__safe__=!0,E.set("block",{super:B});let Q=this.renderNodesSync(A.body,E);return E.pop(),Q}renderWithSync(O,E){E.push();for(let{target:U,value:B}of O.assignments)E.set(U,this.eval(B,E));let A=this.renderNodesSync(O.body,E);return E.pop(),A}renderUrlSync(O,E){let A=this.eval(O.name,E),U=[];for(let J=0;J<O.args.length;J++)U.push(this.eval(O.args[J],E));let B=this.evalObjectSync(O.kwargs,E),Q=this.options.urlResolver(String(A),U,B);if(O.asVar)return E.set(O.asVar,Q),"";return Q}renderStaticSync(O,E){let A=this.eval(O.path,E),U=this.options.staticResolver(String(A));if(O.asVar)return E.set(O.asVar,U),"";return U}renderNowSync(O,E){let A=String(this.eval(O.format,E)),U=this.formatDate(new Date,A);if(O.asVar)return E.set(O.asVar,U),"";return U}cycleState=new Map;renderCycleSync(O,E){let A=`cycle_${O.line}_${O.column}`,U=this.cycleState.get(A)??0,B=[];for(let J=0;J<O.values.length;J++)B.push(this.eval(O.values[J],E));let Q=B[U%B.length];if(this.cycleState.set(A,U+1),O.asVar)return E.set(O.asVar,Q),O.silent?"":this.stringify(Q);return this.stringify(Q)}renderFirstofSync(O,E){for(let U of O.values){let B=this.eval(U,E);if(this.isTruthy(B)){if(O.asVar)return E.set(O.asVar,B),"";return this.stringify(B)}}let A=O.fallback?this.eval(O.fallback,E):"";if(O.asVar)return E.set(O.asVar,A),"";return this.stringify(A)}ifchangedState=new Map;renderIfchangedSync(O,E){let A=`ifchanged_${O.line}_${O.column}`,U;if(O.values.length>0){let J=[];for(let Z=0;Z<O.values.length;Z++)J.push(this.eval(O.values[Z],E));U=J}else U=this.renderNodesSync(O.body,E);let B=this.ifchangedState.get(A),Q=!this.deepEqual(U,B);if(this.ifchangedState.set(A,U),Q){if(O.values.length>0)return this.renderNodesSync(O.body,E);return U}else return this.renderNodesSync(O.else_,E)}renderRegroupSync(O,E){let A=this.toIterable(this.eval(O.target,E)),U=[],B=Symbol("initial"),Q=[];for(let J of A){let Z=J&&typeof J==="object"?J[O.key]:void 0;if(Z!==B){if(Q.length>0)U.push({grouper:B,list:Q});B=Z,Q=[J]}else Q.push(J)}if(Q.length>0)U.push({grouper:B,list:Q});return E.set(O.asVar,U),""}renderWidthratioSync(O,E){let A=Number(this.eval(O.value,E)),U=Number(this.eval(O.maxValue,E)),B=Number(this.eval(O.maxWidth,E)),Q=U===0?0:Math.round(A/U*B);if(O.asVar)return E.set(O.asVar,Q),"";return String(Q)}renderLoremSync(O,E){let A=O.count?Number(this.eval(O.count,E)):1,U=O.method,B=["lorem","ipsum","dolor","sit","amet","consectetur","adipiscing","elit","sed","do","eiusmod","tempor","incididunt","ut","labore","et","dolore","magna","aliqua","enim","ad","minim","veniam","quis","nostrud","exercitation","ullamco","laboris","nisi","aliquip","ex","ea","commodo","consequat","duis","aute","irure","in","reprehenderit","voluptate","velit","esse","cillum","fugiat","nulla","pariatur","excepteur","sint","occaecat","cupidatat","non","proident","sunt","culpa","qui","officia","deserunt","mollit","anim","id","est","laborum"],Q=(J)=>{if(O.random)return B[Math.floor(Math.random()*B.length)];return B[J%B.length]};if(U==="w"){let J=[];for(let Z=0;Z<A;Z++)J.push(Q(Z));return J.join(" ")}else if(U==="p"||U==="b"){let J=[];for(let Z=0;Z<A;Z++){let K=3+Z%3,$=[];for(let Y=0;Y<K;Y++){let X=8+Y%7,I=[];for(let D=0;D<X;D++)I.push(Q(Z*100+Y*20+D));I[0]=I[0].charAt(0).toUpperCase()+I[0].slice(1),$.push(I.join(" ")+".")}J.push($.join(" "))}if(U==="b")return J.join(`
25
+
26
+ `);return J.map((Z)=>`<p>${Z}</p>`).join(`
27
+ `)}return""}renderCsrfTokenSync(){return'<input type="hidden" name="csrfmiddlewaretoken" value="CSRF_TOKEN_PLACEHOLDER">'}renderDebugSync(O){let E=O.toObject?.()||{};return`<pre>${JSON.stringify(E,null,2)}</pre>`}renderTemplatetagSync(O){return{openblock:"{%",closeblock:"%}",openvariable:"{{",closevariable:"}}",openbrace:"{",closebrace:"}",opencomment:"{#",closecomment:"#}"}[O.tagType]||""}getDateInTimezone(O,E){if(!E)return{year:O.getFullYear(),month:O.getMonth(),day:O.getDate(),weekday:O.getDay(),hours:O.getHours(),minutes:O.getMinutes(),seconds:O.getSeconds()};let U=new Intl.DateTimeFormat("en-US",{timeZone:E,year:"numeric",month:"2-digit",day:"2-digit",weekday:"short",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(O),B=(J)=>U.find((Z)=>Z.type===J)?.value||"",Q={Sun:0,Mon:1,Tue:2,Wed:3,Thu:4,Fri:5,Sat:6};return{year:parseInt(B("year"),10),month:parseInt(B("month"),10)-1,day:parseInt(B("day"),10),weekday:Q[B("weekday")]??0,hours:parseInt(B("hour"),10),minutes:parseInt(B("minute"),10),seconds:parseInt(B("second"),10)}}formatDate(O,E){let A=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],U=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],B=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Q=["January","February","March","April","May","June","July","August","September","October","November","December"],J=this.options.timezone,{year:Z,month:K,day:$,weekday:Y,hours:X,minutes:I,seconds:D}=this.getDateInTimezone(O,J),M="";for(let W=0;W<E.length;W++){let H=E[W];switch(H){case"d":M+=String($).padStart(2,"0");break;case"j":M+=String($);break;case"D":M+=A[Y];break;case"l":M+=U[Y];break;case"m":M+=String(K+1).padStart(2,"0");break;case"n":M+=String(K+1);break;case"M":M+=B[K];break;case"F":M+=Q[K];break;case"y":M+=String(Z).slice(-2);break;case"Y":M+=String(Z);break;case"H":M+=String(X).padStart(2,"0");break;case"G":M+=String(X);break;case"i":M+=String(I).padStart(2,"0");break;case"s":M+=String(D).padStart(2,"0");break;case"a":M+=X<12?"a.m.":"p.m.";break;case"A":M+=X<12?"AM":"PM";break;case"g":M+=String(X%12||12);break;case"h":M+=String(X%12||12).padStart(2,"0");break;default:M+=H}}return M}renderNodesSync(O,E){let A=O.length;if(A===0)return"";if(A===1)return this.renderNodeSync(O[0],E)??"";if(A===2){let B=this.renderNodeSync(O[0],E)??"",Q=this.renderNodeSync(O[1],E)??"";return B+Q}let U=[];for(let B=0;B<A;B++){let Q=this.renderNodeSync(O[B],E);if(Q!==null)U.push(Q)}return U.join("")}eval(O,E){if(O.type==="Literal")return O.value;if(O.type==="Name")return E.get(O.name);if(O.type==="GetAttr")return this.evalGetAttr(O,E);switch(O.type){case"GetItem":return this.evalGetItem(O,E);case"FilterExpr":return this.evalFilter(O,E);case"BinaryOp":return this.evalBinaryOp(O,E);case"UnaryOp":return this.evalUnaryOp(O,E);case"Compare":return this.evalCompare(O,E);case"Conditional":return this.evalConditional(O,E);case"Array":{let A=O.elements,U=[];for(let B=0;B<A.length;B++)U.push(this.eval(A[B],E));return U}case"Object":return this.evalObjectLiteral(O,E);case"FunctionCall":return this.evalFunctionCall(O,E);case"TestExpr":return this.evalTest(O,E);default:return}}evalGetAttr(O,E){let A=this.eval(O.object,E);if(A==null)return;let U=O.attribute,B=A[U];if(B===void 0){if(Array.isArray(A)){let Q=parseInt(U,10);if(!isNaN(Q))return A[Q]}return}if(typeof B==="function")return B.bind(A);return B}evalGetItem(O,E){let A=this.eval(O.object,E),U=this.eval(O.index,E);if(A==null)return;return A[U]}static TITLE_REGEX=/\b\w/g;static STRIPTAGS_REGEX=/<[^>]*>/g;static SLUGIFY_REGEX1=/[^\w\s-]/g;static SLUGIFY_REGEX2=/[\s_-]+/g;static SLUGIFY_REGEX3=/^-+|-+$/g;static WHITESPACE_REGEX=/\s+/;static URLIZE_REGEX=/(https?:\/\/[^\s]+)/g;static NEWLINE_REGEX=/\n/g;static DOUBLE_NEWLINE_REGEX=/\n\n+/;evalFilter(O,E){let A=this.eval(O.node,E),U=O.filter,B=O.args.length;if(B===0)switch(U){case"upper":return String(A??"").toUpperCase();case"lower":return String(A??"").toLowerCase();case"trim":return String(A??"").trim();case"capitalize":{let K=String(A??"");return K.charAt(0).toUpperCase()+K.slice(1).toLowerCase()}case"capfirst":{let K=String(A??"");return K.charAt(0).toUpperCase()+K.slice(1)}case"title":return String(A??"").replace(z.TITLE_REGEX,(K)=>K.toUpperCase());case"striptags":return String(A??"").replace(z.STRIPTAGS_REGEX,"");case"slugify":return String(A??"").toLowerCase().replace(z.SLUGIFY_REGEX1,"").replace(z.SLUGIFY_REGEX2,"-").replace(z.SLUGIFY_REGEX3,"");case"wordcount":{let K=String(A??"").trim();return K?K.split(z.WHITESPACE_REGEX).length:0}case"escapejs":return JSON.stringify(String(A??"")).slice(1,-1);case"linebreaksbr":{let K=String(A??"").replace(z.NEWLINE_REGEX,"<br>"),$=new String(K);return $.__safe__=!0,$}case"linebreaks":{let K=String(A??"").split(z.DOUBLE_NEWLINE_REGEX),$="";for(let X=0;X<K.length;X++){if(X>0)$+=`
28
+ `;$+=`<p>${K[X].replace(z.NEWLINE_REGEX,"<br>")}</p>`}let Y=new String($);return Y.__safe__=!0,Y}case"urlencode":return encodeURIComponent(String(A??""));case"safe":{let K=new String(A??"");return K.__safe__=!0,K}case"escape":case"e":{if(A?.__safe__)return A;let K=new String(Bun.escapeHTML(String(A??"")));return K.__safe__=!0,K}case"forceescape":{let K=new String(Bun.escapeHTML(String(A??"")));return K.__safe__=!0,K}case"int":return parseInt(String(A),10)||0;case"float":return parseFloat(String(A))||0;case"abs":return Math.abs(Number(A)||0);case"filesizeformat":{let K=Number(A)||0,$=["bytes","KB","MB","GB","TB","PB"],Y=0,X=K;while(X>=1024&&Y<$.length-1)X/=1024,Y++;return`${X.toFixed(1)} ${$[Y]}`}case"length":if(A==null)return 0;if(typeof A==="string"||Array.isArray(A))return A.length;if(typeof A==="object"){let K=0;for(let $ in A)K++;return K}return 0;case"first":if(Array.isArray(A))return A[0];if(typeof A==="string")return A[0];return A;case"last":if(Array.isArray(A))return A[A.length-1];if(typeof A==="string")return A[A.length-1];return A;case"reverse":if(Array.isArray(A))return[...A].reverse();if(typeof A==="string")return A.split("").reverse().join("");return A;case"sort":if(Array.isArray(A))return[...A].sort();return A;case"unique":if(Array.isArray(A))return[...new Set(A)];return A;case"list":case"make_list":if(Array.isArray(A))return A;if(typeof A==="string")return A.split("");if(A&&typeof A[Symbol.iterator]==="function")return[...A];if(typeof A==="object"&&A!==null)return Object.values(A);return[A];case"random":if(Array.isArray(A))return A[Math.floor(Math.random()*A.length)];return A;case"items":if(A==null||typeof A!=="object")return[];return Object.entries(A);case"string":return String(A??"");case"json":case"tojson":try{let K=new String(JSON.stringify(A));return K.__safe__=!0,K}catch{return""}case"pprint":try{let K=new String(JSON.stringify(A,null,2));return K.__safe__=!0,K}catch{return String(A)}case"urlize":{let K=String(A??"").replace(z.URLIZE_REGEX,'<a href="$1">$1</a>'),$=new String(K);return $.__safe__=!0,$}}if(B===1){let K=this.eval(O.args[0],E);switch(U){case"default":case"d":if(A===void 0||A===null||A===""||A===!1)return K;return A;case"default_if_none":return A===null||A===void 0?K:A;case"truncatechars":{let $=String(A??""),Y=Number(K)||30;if($.length<=Y)return $;return $.slice(0,Y-3)+"..."}case"truncatewords":{let $=String(A??"").split(z.WHITESPACE_REGEX),Y=Number(K)||15;if($.length<=Y)return A;return $.slice(0,Y).join(" ")+"..."}case"center":{let $=String(A??""),Y=Number(K)||80,X=Math.max(0,Y-$.length),I=Math.floor(X/2);return" ".repeat(I)+$+" ".repeat(X-I)}case"ljust":return String(A??"").padEnd(Number(K)||80);case"rjust":return String(A??"").padStart(Number(K)||80);case"cut":return String(A??"").split(String(K)).join("");case"add":{let $=Number(A),Y=Number(K);if(!isNaN($)&&!isNaN(Y))return $+Y;return String(A)+String(K)}case"divisibleby":return Number(A)%Number(K)===0;case"round":return Number(Number(A).toFixed(Number(K)||0));case"floatformat":{let $=parseFloat(String(A));if(isNaN($))return"";let Y=Number(K);if(Y===-1){let X=$.toFixed(1);return X.endsWith(".0")?Math.round($).toString():X}return $.toFixed(Math.abs(Y))}case"get_digit":{let $=parseInt(String(A),10);if(isNaN($))return A;let Y=String(Math.abs($)),X=Number(K)||1;if(X<1||X>Y.length)return A;return parseInt(Y[Y.length-X],10)}case"join":if(Array.isArray(A))return A.join(String(K??""));return String(A);case"slice":{if(!A)return A;let[$,Y]=String(K).split(":"),X=$?parseInt($,10):0,I=Y?parseInt(Y,10):void 0;if(Array.isArray(A)||typeof A==="string")return A.slice(X,I);return A}case"batch":{if(!Array.isArray(A))return[[A]];let $=Number(K)||1,Y=[];for(let X=0;X<A.length;X+=$)Y.push(A.slice(X,X+$));return Y}case"columns":{if(!Array.isArray(A))return[[A]];let $=Number(K)||2,Y=[];for(let X=0;X<A.length;X+=$)Y.push(A.slice(X,X+$));return Y}case"length_is":return(A==null?0:A.length??Object.keys(A).length??0)===Number(K);case"attr":return A==null?void 0:A[K];case"dictsort":if(!Array.isArray(A))return A;return[...A].sort(($,Y)=>{let X=K?$[K]:$,I=K?Y[K]:Y;return X<I?-1:X>I?1:0});case"dictsortreversed":if(!Array.isArray(A))return A;return[...A].sort(($,Y)=>{let X=K?$[K]:$,I=K?Y[K]:Y;return X>I?-1:X<I?1:0});case"map":if(!Array.isArray(A))return[];if(typeof K==="string")return A.map(($)=>$?.[K]);return A;case"select":if(!Array.isArray(A))return[];if(K===void 0)return A.filter(($)=>!!$);return A.filter(($)=>!!$?.[K]);case"reject":if(!Array.isArray(A))return[];if(K===void 0)return A.filter(($)=>!$);return A.filter(($)=>!$?.[K]);case"groupby":{if(!Array.isArray(A))return[];let $={};for(let X of A){let I=String(K?X[K]:X);if(!(I in $))$[I]=[];$[I].push(X)}let Y=[];for(let X in $)Y.push({grouper:X,list:$[X]});return Y}case"date":case"time":{let $=A instanceof Date?A:new Date(A);if(isNaN($.getTime()))return"";return this.formatDate($,String(K||(U==="time"?"H:i":"N j, Y")))}case"pluralize":{let $=String(K??"s"),[Y,X]=$.includes(",")?$.split(","):["",$];return Number(A)===1?Y:X}case"yesno":{let[$,Y,X]=String(K??"yes,no,maybe").split(",");if(A===!0)return $;if(A===!1)return Y;return X??Y}case"json":case"tojson":try{let $=new String(JSON.stringify(A,null,K));return $.__safe__=!0,$}catch{return""}case"urlizetrunc":{let $=Number(K)||15,Y=String(A??"").replace(z.URLIZE_REGEX,(I)=>{let D=I.length>$?I.slice(0,$)+"...":I;return`<a href="${I}">${D}</a>`}),X=new String(Y);return X.__safe__=!0,X}case"indent":{let $=String(A??""),Y=typeof K==="string"?K:" ".repeat(Number(K)||4),X=$.split(`
29
+ `),I=X[0];for(let D=1;D<X.length;D++)I+=`
30
+ `+(X[D].trim()===""?X[D]:Y+X[D]);return I}case"stringformat":{let $=String(K),Y=A;if($==="s")return String(Y);if($==="d"||$==="i")return String(parseInt(String(Y),10)||0);if($==="f")return String(parseFloat(String(Y))||0);if($==="x")return(parseInt(String(Y),10)||0).toString(16);if($==="X")return(parseInt(String(Y),10)||0).toString(16).toUpperCase();if($==="o")return(parseInt(String(Y),10)||0).toString(8);if($==="b")return(parseInt(String(Y),10)||0).toString(2);if($==="e")return(parseFloat(String(Y))||0).toExponential();let X=$.match(/^\.?(\d+)f$/);if(X)return(parseFloat(String(Y))||0).toFixed(parseInt(X[1],10));let I=$.match(/^(0?)(\d+)([sd])$/);if(I){let[,D,M,W]=I,H=parseInt(M,10);return(W==="d"?String(parseInt(String(Y),10)||0):String(Y)).padStart(H,D?"0":" ")}return String(Y)}case"json_script":{let $=JSON.stringify(A).replace(/</g,"\\u003C").replace(/>/g,"\\u003E").replace(/&/g,"\\u0026"),X=`<script${K?` id="${String(K)}"`:""} type="application/json">${$}</script>`,I=new String(X);return I.__safe__=!0,I}}}if(B===2){let K=this.eval(O.args[0],E),$=this.eval(O.args[1],E);switch(U){case"replace":return String(A??"").replaceAll(String(K),String($));case"batch":{if(!Array.isArray(A))return[[A]];let Y=Number(K)||1,X=$,I=[];for(let D=0;D<A.length;D+=Y){let M=A.slice(D,D+Y);while(X!==null&&M.length<Y)M.push(X);I.push(M)}return I}case"sum":{if(!Array.isArray(A))return Number($)||0;let Y=Number($)||0;for(let X=0;X<A.length;X++)Y+=Number(K?A[X][K]:A[X])||0;return Y}case"max":{if(!Array.isArray(A)||A.length===0)return $;if(K){let X=A[0];for(let I=1;I<A.length;I++)if(A[I][K]>X[K])X=A[I];return X}let Y=A[0];for(let X=1;X<A.length;X++)if(A[X]>Y)Y=A[X];return Y}case"min":{if(!Array.isArray(A)||A.length===0)return $;if(K){let X=A[0];for(let I=1;I<A.length;I++)if(A[I][K]<X[K])X=A[I];return X}let Y=A[0];for(let X=1;X<A.length;X++)if(A[X]<Y)Y=A[X];return Y}case"timesince":{let Y=A instanceof Date?A:new Date(A),I=((K instanceof Date?K:new Date(K??Date.now())).getTime()-Y.getTime())/1000,D=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[M,W,H]of D){let j=Math.floor(I/M);if(j>=1)return`${j} ${j===1?W:H}`}return"just now"}case"timeuntil":{let Y=A instanceof Date?A:new Date(A),X=K instanceof Date?K:new Date(K??Date.now()),I=(Y.getTime()-X.getTime())/1000,D=[[31536000,"year","years"],[2592000,"month","months"],[604800,"week","weeks"],[86400,"day","days"],[3600,"hour","hours"],[60,"minute","minutes"]];for(let[M,W,H]of D){let j=Math.floor(I/M);if(j>=1)return`${j} ${j===1?W:H}`}return"now"}}}let Q=[];for(let K=0;K<B;K++)Q.push(this.eval(O.args[K],E));let J=this.evalObjectSync(O.kwargs,E),Z=this.filters[U];if(!Z){let K=Object.keys(this.filters),$=yO(U,K);throw new a(`Unknown filter '${U}'`,{line:O.line,column:O.column,source:this.source,suggestion:$||void 0,availableOptions:K.slice(0,15)})}return Z(A,...Q,...Object.values(J))}evalBinaryOp(O,E){let A=this.eval(O.left,E),U=O.operator;if(U==="and")return this.isTruthy(A)?this.eval(O.right,E):A;if(U==="or")return this.isTruthy(A)?A:this.eval(O.right,E);let B=this.eval(O.right,E);if(U==="%"){if(typeof A==="number"&&typeof B==="number")return B===0?NaN:A%B;let Q=Number(B);return Q===0?NaN:Number(A)%Q}if(U==="+"){if(typeof A==="number"&&typeof B==="number")return A+B;return typeof A==="string"||typeof B==="string"?String(A)+String(B):Number(A)+Number(B)}switch(U){case"-":return Number(A)-Number(B);case"*":return Number(A)*Number(B);case"/":return Number(A)/Number(B);case"~":return String(A)+String(B);default:return}}evalUnaryOp(O,E){let A=this.eval(O.operand,E);switch(O.operator){case"not":return!this.isTruthy(A);case"-":return-Number(A);case"+":return+Number(A);default:return A}}evalCompare(O,E){let A=this.eval(O.left,E),U=O.ops;if(U.length===1){let{operator:Q,right:J}=U[0],Z=this.eval(J,E);if(Q==="==")return A===Z;if(Q==="!=")return A!==Z;if(Q==="<")return A<Z;if(Q===">")return A>Z;if(Q==="<=")return A<=Z;if(Q===">=")return A>=Z;if(Q==="in")return this.isIn(A,Z);if(Q==="not in")return!this.isIn(A,Z);if(Q==="is")return A===Z;if(Q==="is not")return A!==Z;return!1}let B=A;for(let{operator:Q,right:J}of U){let Z=this.eval(J,E),K;switch(Q){case"==":K=B===Z;break;case"!=":K=B!==Z;break;case"<":K=B<Z;break;case">":K=B>Z;break;case"<=":K=B<=Z;break;case">=":K=B>=Z;break;case"in":K=this.isIn(B,Z);break;case"not in":K=!this.isIn(B,Z);break;case"is":K=B===Z;break;case"is not":K=B!==Z;break;default:K=!1}if(!K)return!1;B=Z}return!0}evalConditional(O,E){return this.isTruthy(this.eval(O.test,E))?this.eval(O.trueExpr,E):this.eval(O.falseExpr,E)}evalObjectLiteral(O,E){let A={};for(let{key:U,value:B}of O.pairs)A[String(this.eval(U,E))]=this.eval(B,E);return A}evalFunctionCall(O,E){let A=this.eval(O.callee,E),U=[];for(let Q=0;Q<O.args.length;Q++)U.push(this.eval(O.args[Q],E));let B=this.evalObjectSync(O.kwargs,E);return typeof A==="function"?A(...U,B):void 0}evalTest(O,E){let{test:A,negated:U}=O;if(A==="defined"||A==="undefined"){let K=!1;if(O.node.type==="Name")K=E.has(O.node.name);else K=this.eval(O.node,E)!==void 0;let $=A==="defined"?K:!K;return U?!$:$}let B=this.eval(O.node,E);if(O.args.length===0){let K;switch(A){case"even":{let $=Number(B);K=Number.isInteger($)&&$%2===0;break}case"odd":{let $=Number(B);K=Number.isInteger($)&&$%2!==0;break}case"number":K=typeof B==="number"&&!isNaN(B);break;case"integer":K=Number.isInteger(B);break;case"float":K=typeof B==="number"&&!Number.isInteger(B)&&!isNaN(B);break;case"none":case"None":K=B===null;break;case"boolean":K=typeof B==="boolean";break;case"string":K=typeof B==="string";break;case"mapping":K=B!==null&&typeof B==="object"&&!Array.isArray(B)&&!(B instanceof Date);break;case"iterable":K=B!=null&&(typeof B==="string"||Array.isArray(B)||typeof B[Symbol.iterator]==="function");break;case"sequence":K=Array.isArray(B)||typeof B==="string";break;case"callable":K=typeof B==="function";break;case"lower":K=typeof B==="string"&&B===B.toLowerCase()&&B!==B.toUpperCase();break;case"upper":K=typeof B==="string"&&B===B.toUpperCase()&&B!==B.toLowerCase();break;case"empty":if(B==null)K=!0;else if(typeof B==="string"||Array.isArray(B))K=B.length===0;else if(typeof B==="object"){K=!0;for(let $ in B){K=!1;break}}else K=!1;break;case"truthy":if(B==null)K=!1;else if(typeof B==="boolean")K=B;else if(typeof B==="number")K=B!==0;else if(typeof B==="string")K=B.length>0;else if(Array.isArray(B))K=B.length>0;else if(typeof B==="object"){K=!1;for(let $ in B){K=!0;break}}else K=!0;break;case"falsy":if(B==null)K=!0;else if(typeof B==="boolean")K=!B;else if(typeof B==="number")K=B===0;else if(typeof B==="string")K=B.length===0;else if(Array.isArray(B))K=B.length===0;else if(typeof B==="object"){K=!0;for(let $ in B){K=!1;break}}else K=!1;break;case"true":K=B===!0;break;case"false":K=B===!1;break;default:{let $=this.tests[A];if(!$)throw Error(`Unknown test: ${A}`);K=$(B)}}return U?!K:K}if(O.args.length===1){let K=this.eval(O.args[0],E),$;switch(A){case"divisibleby":{let Y=Number(B),X=Number(K);$=X!==0&&Y%X===0;break}case"gt":case"greaterthan":$=Number(B)>Number(K);break;case"ge":$=Number(B)>=Number(K);break;case"lt":case"lessthan":$=Number(B)<Number(K);break;case"le":$=Number(B)<=Number(K);break;case"eq":case"equalto":case"sameas":$=B===K;break;case"ne":$=B!==K;break;case"in":if(Array.isArray(K))$=K.includes(B);else if(typeof K==="string")$=K.includes(String(B));else if(typeof K==="object"&&K!==null)$=B in K;else $=!1;break;default:{let Y=this.tests[A];if(!Y)throw Error(`Unknown test: ${A}`);$=Y(B,K)}}return U?!$:$}let Q=[];for(let K=0;K<O.args.length;K++)Q.push(this.eval(O.args[K],E));let J=this.tests[A];if(!J)throw Error(`Unknown test: ${A}`);let Z=J(B,...Q);return U?!Z:Z}evalObjectSync(O,E){let A={};for(let U in O)A[U]=this.eval(O[U],E);return A}async collectBlocks(O,E){for(let A of O.body)if(A.type==="Extends"){let U=this.eval(A.template,E);this.parentTemplate=await this.options.templateLoader(String(U)),await this.collectBlocks(this.parentTemplate,E)}else if(A.type==="Block")this.blocks.set(A.name,A)}async renderTemplateAsync(O,E){let A=[];for(let U of O.body){let B=await this.renderNodeAsync(U,E);if(B!==null)A.push(B)}return A.join("")}async renderNodeAsync(O,E){switch(O.type){case"Text":return O.value;case"Output":return this.stringify(this.eval(O.expression,E));case"If":return this.renderIfAsync(O,E);case"For":return this.renderForAsync(O,E);case"Block":return this.renderBlockAsync(O,E);case"Extends":return null;case"Include":return this.renderInclude(O,E);case"Set":return E.set(O.target,this.eval(O.value,E)),"";case"With":return this.renderWithAsync(O,E);case"Load":return null;case"Url":return this.renderUrlSync(O,E);case"Static":return this.renderStaticSync(O,E);case"Now":return this.renderNowSync(O,E);case"Cycle":return this.renderCycleSync(O,E);case"Firstof":return this.renderFirstofSync(O,E);case"Ifchanged":return this.renderIfchangedSync(O,E);case"Regroup":return this.renderRegroupSync(O,E);case"Widthratio":return this.renderWidthratioSync(O,E);case"Lorem":return this.renderLoremSync(O,E);case"CsrfToken":return this.renderCsrfTokenSync();case"Debug":return this.renderDebugSync(E);case"Templatetag":return this.renderTemplatetagSync(O);default:return null}}async renderIfAsync(O,E){if(this.isTruthy(this.eval(O.test,E)))return this.renderNodesAsync(O.body,E);for(let A of O.elifs)if(this.isTruthy(this.eval(A.test,E)))return this.renderNodesAsync(A.body,E);return O.else_.length>0?this.renderNodesAsync(O.else_,E):""}async renderForAsync(O,E){let A=this.eval(O.iter,E),U=this.toIterable(A),B=U.length;if(B===0)return this.renderNodesAsync(O.else_,E);let Q=Array(B),J=Array.isArray(O.target);E.push(),E.pushForLoop(U,0);for(let Z=0;Z<B;Z++){let K=U[Z];if(Z>0)E.updateForLoop(Z,U);if(J){let $=Array.isArray(K)?K:[K,K],Y=O.target;for(let X=0;X<Y.length;X++)E.set(Y[X],$[X])}else E.set(O.target,K);Q[Z]=await this.renderNodesAsync(O.body,E)}return E.popForLoop(),E.pop(),Q.join("")}async renderBlockAsync(O,E){let A=this.blocks.get(O.name)||O;E.push();let U=await this.renderNodesAsync(O.body,E),B=new String(U);B.__safe__=!0,E.set("block",{super:B});let Q=await this.renderNodesAsync(A.body,E);return E.pop(),Q}async renderInclude(O,E){try{let A=this.eval(O.template,E),U=await this.options.templateLoader(String(A)),B;if(O.only)B=new C(O.context?this.evalObjectSync(O.context,E):{});else{let Q=O.context?this.evalObjectSync(O.context,E):{};B=E.derived(Q)}return this.renderTemplateAsync(U,B)}catch(A){if(O.ignoreMissing)return"";throw A}}async renderWithAsync(O,E){E.push();for(let{target:U,value:B}of O.assignments)E.set(U,this.eval(B,E));let A=await this.renderNodesAsync(O.body,E);return E.pop(),A}async renderNodesAsync(O,E){let A=[];for(let U of O){let B=await this.renderNodeAsync(U,E);if(B!==null)A.push(B)}return A.join("")}async evaluate(O,E){return this.eval(O,E)}stringify(O){if(O==null)return"";if(typeof O==="string"){if(O.__safe__)return O;return this.options.autoescape?Bun.escapeHTML(O):O}if(typeof O==="boolean")return O?"True":"False";if(typeof O==="number")return String(O);let E=String(O);if(O.__safe__)return E;return this.options.autoescape?Bun.escapeHTML(E):E}isTruthy(O){if(typeof O==="boolean")return O;if(O==null)return!1;if(typeof O==="string")return O.length>0;if(typeof O==="number")return O!==0;if(Array.isArray(O))return O.length>0;if(typeof O==="object"){for(let E in O)return!0;return!1}return!0}deepEqual(O,E){if(O===E)return!0;if(O==null||E==null)return O===E;let A=typeof O;if(A!==typeof E)return!1;if(A!=="object")return!1;if(Array.isArray(O)){if(!Array.isArray(E)||O.length!==E.length)return!1;for(let B=0;B<O.length;B++)if(!this.deepEqual(O[B],E[B]))return!1;return!0}return JSON.stringify(O)===JSON.stringify(E)}isIn(O,E){if(Array.isArray(E))return E.includes(O);if(typeof E==="string")return E.includes(String(O));if(typeof E==="object"&&E!==null)return O in E;return!1}toIterable(O){if(Array.isArray(O))return O;if(O==null)return[];if(typeof O==="string")return O.split("");if(typeof O==="object"){if(typeof O[Symbol.iterator]==="function")return Array.from(O);let E=Object.keys(O),A=E.length,U=Array(A);for(let B=0;B<A;B++){let Q=E[B],J=O[Q],Z=[Q,J];Z.key=Q,Z.value=J,U[B]=Z}return U}return[O]}addFilter(O,E){this.filters[O]=E}addTest(O,E){this.tests[O]=E}addGlobal(O,E){this.options.globals[O]=E}setSource(O){this.source=O}}});class i{source;pos=0;line=1;column=1;tokens=[];constructor(O){this.source=O}tokenize(){while(!this.isAtEnd())this.scanToken();return this.addToken("EOF",""),this.tokens}scanToken(){if(this.check("{{{")){this.match("{{{"),this.addToken("OPEN_UNESCAPED","{{{"),this.scanExpression(!0);return}if(this.check("{{!--")){this.match("{{!--"),this.scanBlockComment();return}if(this.check("{{!")){this.match("{{!"),this.addToken("OPEN_COMMENT","{{!"),this.scanComment();return}if(this.check("{{#")){this.match("{{#"),this.addToken("OPEN_BLOCK","{{#"),this.scanExpression(!1);return}if(this.check("{{/")){this.match("{{/"),this.addToken("OPEN_END","{{/"),this.scanExpression(!1);return}if(this.check("{{>")){this.match("{{>"),this.addToken("OPEN_PARTIAL","{{>"),this.scanExpression(!1);return}if(this.check("{{")){this.match("{{"),this.addToken("OPEN","{{"),this.scanExpression(!1);return}this.scanText()}scanText(){let O=this.pos,E=this.line,A=this.column;while(!this.isAtEnd()&&!this.check("{{")){if(this.peek()===`
31
+ `)this.line++,this.column=0;this.advance()}if(this.pos>O){let U=this.source.slice(O,this.pos);this.tokens.push({type:"TEXT",value:U,line:E,column:A})}}scanExpression(O){this.skipWhitespace();while(!this.isAtEnd()){if(this.skipWhitespace(),O&&this.check("}}}")){this.match("}}}"),this.addToken("CLOSE_UNESCAPED","}}}");return}if(this.check("}}")){this.match("}}"),this.addToken("CLOSE","}}");return}this.scanExpressionToken()}}scanExpressionToken(){let O=this.peek();if(O==='"'||O==="'"){this.scanString(O);return}if(this.isDigit(O)||O==="-"&&this.isDigit(this.peekNext())){this.scanNumber();return}if(O==="."){if(this.peekNext()===".")this.advance(),this.advance(),this.addToken("DOTDOT","..");else this.advance(),this.addToken("DOT",".");return}if(O==="/"){this.advance(),this.addToken("SLASH","/");return}if(O==="="){this.advance(),this.addToken("EQUALS","=");return}if(O==="|"){this.advance(),this.addToken("PIPE","|");return}if(this.isAlpha(O)||O==="_"||O==="@"){this.scanIdentifier();return}this.advance()}scanString(O){this.advance();let E=this.pos;while(!this.isAtEnd()&&this.peek()!==O){if(this.peek()==="\\")this.advance();this.advance()}let A=this.source.slice(E,this.pos);this.advance(),this.addToken("STRING",A)}scanNumber(){let O=this.pos;if(this.peek()==="-")this.advance();while(this.isDigit(this.peek()))this.advance();if(this.peek()==="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}this.addToken("NUMBER",this.source.slice(O,this.pos))}scanIdentifier(){let O=this.pos;while(this.isAlphaNumeric(this.peek())||this.peek()==="_"||this.peek()==="-"||this.peek()==="@")this.advance();let E=this.source.slice(O,this.pos);if(E==="true"||E==="false")this.addToken("BOOLEAN",E);else this.addToken("ID",E)}scanComment(){while(!this.isAtEnd()&&!this.check("}}")){if(this.peek()===`
32
+ `)this.line++,this.column=0;this.advance()}if(this.check("}}"))this.match("}}"),this.addToken("CLOSE","}}")}scanBlockComment(){while(!this.isAtEnd()&&!this.check("--}}")){if(this.peek()===`
33
+ `)this.line++,this.column=0;this.advance()}if(this.check("--}}"))this.match("--}}")}isAtEnd(){return this.pos>=this.source.length}peek(){return this.source[this.pos]||"\x00"}peekNext(){return this.source[this.pos+1]||"\x00"}advance(){let O=this.source[this.pos];return this.pos++,this.column++,O}check(O){for(let E=0;E<O.length;E++)if(this.source[this.pos+E]!==O[E])return!1;return!0}match(O){if(!this.check(O))return!1;return this.pos+=O.length,this.column+=O.length,!0}skipWhitespace(){while(this.peek()===" "||this.peek()==="\t"||this.peek()===`
34
+ `||this.peek()==="\r"){if(this.peek()===`
35
+ `)this.line++,this.column=0;this.advance()}}isDigit(O){return O>="0"&&O<="9"}isAlpha(O){return O>="a"&&O<="z"||O>="A"&&O<="Z"}isAlphaNumeric(O){return this.isDigit(O)||this.isAlpha(O)}addToken(O,E){this.tokens.push({type:O,value:E,line:this.line,column:this.column-E.length})}}var AO;var BO=R(()=>{((P)=>{P.TEXT="TEXT";P.OPEN="OPEN";P.OPEN_BLOCK="OPEN_BLOCK";P.OPEN_END="OPEN_END";P.OPEN_PARTIAL="OPEN_PARTIAL";P.OPEN_UNESCAPED="OPEN_UNESCAPED";P.OPEN_COMMENT="OPEN_COMMENT";P.CLOSE="CLOSE";P.CLOSE_UNESCAPED="CLOSE_UNESCAPED";P.ID="ID";P.STRING="STRING";P.NUMBER="NUMBER";P.BOOLEAN="BOOLEAN";P.DOT="DOT";P.DOTDOT="DOTDOT";P.SLASH="SLASH";P.EQUALS="EQUALS";P.PIPE="PIPE";P.EOF="EOF"})(AO||={})});class d{tokens;current=0;source;constructor(O,E=""){this.tokens=O,this.source=E}parse(){return{type:"Template",body:this.parseNodes(),line:1,column:1}}parseNodes(O=[]){let E=[];while(!this.isAtEnd()){let A=this.peek();if(A.type==="OPEN_END"){let B=this.tokens[this.current+1];if(B&&O.includes(B.value))break}if(A.type==="OPEN"&&O.includes("else")){if(this.tokens[this.current+1]?.value==="else")break}let U=this.parseNode();if(U)E.push(U)}return E}parseNode(){switch(this.peek().type){case"TEXT":return this.parseText();case"OPEN":case"OPEN_UNESCAPED":return this.parseOutput();case"OPEN_BLOCK":return this.parseBlock();case"OPEN_END":return this.consumeEndBlock(),null;case"OPEN_COMMENT":return this.skipComment(),null;case"OPEN_PARTIAL":return this.parsePartial();default:return this.advance(),null}}parseText(){let O=this.advance();return{type:"Text",value:O.value,line:O.line,column:O.column}}parseOutput(){let O=this.advance(),E=O.type==="OPEN_UNESCAPED",A=this.parseExpression();if(E)this.expect("CLOSE_UNESCAPED");else this.expect("CLOSE");if(E)return{type:"Output",expression:{type:"FilterExpr",node:A,filter:"safe",args:[],kwargs:{},line:O.line,column:O.column},line:O.line,column:O.column};return{type:"Output",expression:A,line:O.line,column:O.column}}parseBlock(){let O=this.advance(),E=this.expect("ID").value,A=O.line,U=O.column,B=[],Q={};while(!this.check("CLOSE"))if(this.check("ID")&&this.tokens[this.current+1]?.type==="EQUALS"){let J=this.advance().value;this.advance(),Q[J]=this.parseExpressionAtom()}else B.push(this.parseExpressionAtom());switch(this.expect("CLOSE"),E){case"if":return this.parseIfBlock(B[0],A,U);case"unless":return this.parseUnlessBlock(B[0],A,U);case"each":return this.parseEachBlock(B[0],A,U);case"with":return this.parseWithBlock(B[0],A,U);default:return this.parseCustomBlock(E,B,Q,A,U)}}parseIfBlock(O,E,A){let U=this.parseNodes(["if","else"]),B=[];if(this.checkOpenBlock("else"))this.consumeElse(),B=this.parseNodes(["if"]);return this.consumeEndBlock(),{type:"If",test:O,body:U,elifs:[],else_:B,line:E,column:A}}parseUnlessBlock(O,E,A){let U=this.parseNodes(["unless"]);return this.consumeEndBlock(),{type:"If",test:{type:"UnaryOp",operator:"not",operand:O,line:E,column:A},body:U,elifs:[],else_:[],line:E,column:A}}parseEachBlock(O,E,A){let U=this.parseNodes(["each","else"]),B=[];if(this.checkOpenBlock("else"))this.consumeElse(),B=this.parseNodes(["each"]);return this.consumeEndBlock(),{type:"For",target:"this",iter:O,body:U,else_:B,line:E,column:A}}parseWithBlock(O,E,A){let U=this.parseNodes(["with"]);return this.consumeEndBlock(),{type:"With",assignments:[{target:"this",value:O}],body:U,line:E,column:A}}parseCustomBlock(O,E,A,U,B){let Q=this.parseNodes([O]);return this.consumeEndBlock(),{type:"Output",expression:{type:"FunctionCall",callee:{type:"Name",name:O,line:U,column:B},args:E,kwargs:A,line:U,column:B},line:U,column:B}}parsePartial(){let O=this.advance(),E=this.expect("ID").value,A;if(!this.check("CLOSE"))A=this.parseExpressionAtom();return this.expect("CLOSE"),{type:"Include",template:{type:"Literal",value:E,line:O.line,column:O.column},context:A?{_:A}:void 0,line:O.line,column:O.column}}parseExpression(){let O=this.parseExpressionAtom();while(this.check("ID")||this.check("STRING")||this.check("NUMBER")){let E=[O];while(!this.check("CLOSE")&&!this.check("CLOSE_UNESCAPED")&&!this.check("PIPE"))E.push(this.parseExpressionAtom());if(E.length>1){let A=E.shift();O={type:"FunctionCall",callee:A,args:E,kwargs:{},line:A.line,column:A.column}}}return O}parseExpressionAtom(){let O=this.peek();switch(O.type){case"STRING":return this.advance(),{type:"Literal",value:O.value,line:O.line,column:O.column};case"NUMBER":return this.advance(),{type:"Literal",value:parseFloat(O.value),line:O.line,column:O.column};case"BOOLEAN":return this.advance(),{type:"Literal",value:O.value==="true",line:O.line,column:O.column};case"ID":return this.parsePath();case"DOTDOT":return this.advance(),{type:"Name",name:"__parent__",line:O.line,column:O.column};default:return this.advance(),{type:"Literal",value:null,line:O.line,column:O.column}}}parsePath(){let O=this.advance(),E={type:"Name",name:O.value,line:O.line,column:O.column};if(O.value.startsWith("@")){let A=O.value.slice(1),U={index:"forloop.counter0",key:"forloop.key",first:"forloop.first",last:"forloop.last"};if(U[A]){let B=U[A].split(".");E={type:"Name",name:B[0],line:O.line,column:O.column};for(let Q=1;Q<B.length;Q++)E={type:"GetAttr",object:E,attribute:B[Q],line:O.line,column:O.column}}}while(this.check("DOT")||this.check("SLASH"))if(this.advance(),this.check("ID")){let A=this.advance();E={type:"GetAttr",object:E,attribute:A.value,line:A.line,column:A.column}}return E}checkOpenBlock(O){if(!this.check("OPEN"))return!1;let E=this.tokens[this.current+1];return E?.type==="ID"&&E.value===O}consumeElse(){this.expect("OPEN"),this.expect("ID"),this.expect("CLOSE")}consumeEndBlock(){if(this.check("OPEN_END")){if(this.advance(),this.check("ID"))this.advance();if(this.check("CLOSE"))this.advance()}}skipComment(){this.advance();while(!this.isAtEnd()&&!this.check("CLOSE"))this.advance();if(this.check("CLOSE"))this.advance()}isAtEnd(){return this.current>=this.tokens.length||this.peek().type==="EOF"}peek(){return this.tokens[this.current]||{type:"EOF",value:"",line:1,column:1}}advance(){if(!this.isAtEnd())this.current++;return this.tokens[this.current-1]}check(O){return this.peek().type===O}expect(O){if(this.check(O))return this.advance();throw Error(`Expected ${O} but got ${this.peek().type}`)}}var GO=R(()=>{BO()});var RO={};o(RO,{render:()=>KE,parse:()=>FO,engine:()=>lB,compile:()=>zO,HbsTokenType:()=>AO,HandlebarsParser:()=>d,HandlebarsLexer:()=>i});function FO(O){let A=new i(O).tokenize();return new d(A,O).parse()}function zO(O){let E=FO(O),{Runtime:A}=(f(),fO(MO)),U=new A;return async(B)=>{return U.render(E,B,O)}}async function KE(O,E={}){return zO(O)(E)}var lB;var WO=R(()=>{BO();GO();BO();GO();lB={name:"handlebars",extensions:[".hbs",".handlebars"],parse:FO,compile:zO,render:KE}});class u{source;pos=0;line=1;column=1;tokens=[];constructor(O){this.source=O}tokenize(){while(!this.isAtEnd())this.scanToken();return this.addToken("EOF",""),this.tokens}scanToken(){if(this.checkRawTag()){this.scanRawBlock();return}if(this.check("{{")){if(this.match("{{"),this.peek()==="-")this.advance();this.addToken("VAR_START","{{"),this.scanExpression("}}");return}if(this.check("{%")){if(this.match("{%"),this.peek()==="-")this.advance();this.addToken("TAG_START","{%"),this.scanExpression("%}");return}this.scanText()}checkRawTag(){let O=this.source.slice(this.pos);return/^\{%\s*raw\s*%\}/.test(O)}scanRawBlock(){let O=this.source.slice(this.pos).match(/^\{%\s*raw\s*%\}/);if(!O)return;let E=O[0];this.pos+=E.length,this.column+=E.length,this.addToken("TAG_START","{%"),this.addToken("ID","raw"),this.addToken("TAG_END","%}");let A=this.pos,U=this.line,B=this.column;while(!this.isAtEnd()){let J=this.source.slice(this.pos);if(/^\{%\s*endraw\s*%\}/.test(J))break;if(this.peek()===`
36
+ `)this.line++,this.column=0;this.advance()}if(this.pos>A){let J=this.source.slice(A,this.pos);this.tokens.push({type:"TEXT",value:J,line:U,column:B})}let Q=this.source.slice(this.pos).match(/^\{%\s*endraw\s*%\}/);if(Q){let J=Q[0];this.pos+=J.length,this.column+=J.length,this.addToken("TAG_START","{%"),this.addToken("ID","endraw"),this.addToken("TAG_END","%}")}}scanText(){let O=this.pos,E=this.line,A=this.column;while(!this.isAtEnd()&&!this.check("{{")&&!this.check("{%")){if(this.peek()===`
37
+ `)this.line++,this.column=0;this.advance()}if(this.pos>O)this.tokens.push({type:"TEXT",value:this.source.slice(O,this.pos),line:E,column:A})}scanExpression(O){this.skipWhitespace();while(!this.isAtEnd()){if(this.skipWhitespace(),this.peek()==="-"&&this.check("-"+O))this.advance();if(this.check(O)){this.match(O),this.addToken(O==="}}"?"VAR_END":"TAG_END",O);return}this.scanExpressionToken()}}scanExpressionToken(){let O=this.peek();if(O==='"'||O==="'"){this.scanString(O);return}if(this.isDigit(O)||O==="-"&&this.isDigit(this.peekNext())){this.scanNumber();return}if(O==="."){if(this.peekNext()===".")this.advance(),this.advance(),this.addToken("RANGE","..");else this.advance(),this.addToken("DOT",".");return}if(O==="|"){this.advance(),this.addToken("PIPE","|");return}if(O===":"){this.advance(),this.addToken("COLON",":");return}if(O===","){this.advance(),this.addToken("COMMA",",");return}if(O==="["){this.advance(),this.addToken("LBRACKET","[");return}if(O==="]"){this.advance(),this.addToken("RBRACKET","]");return}if(O==="="){if(this.peekNext()==="=")this.advance(),this.advance(),this.addToken("EQ","==");else this.advance(),this.addToken("EQUALS","=");return}if(O==="!"&&this.peekNext()==="="){this.advance(),this.advance(),this.addToken("NE","!=");return}if(O==="<"){if(this.peekNext()==="=")this.advance(),this.advance(),this.addToken("LE","<=");else if(this.peekNext()===">")this.advance(),this.advance(),this.addToken("NE","<>");else this.advance(),this.addToken("LT","<");return}if(O===">"){if(this.peekNext()==="=")this.advance(),this.advance(),this.addToken("GE",">=");else this.advance(),this.addToken("GT",">");return}if(this.isAlpha(O)||O==="_"){this.scanIdentifier();return}this.advance()}scanString(O){this.advance();let E=this.pos;while(!this.isAtEnd()&&this.peek()!==O){if(this.peek()==="\\")this.advance();if(this.peek()===`
38
+ `)this.line++,this.column=0;this.advance()}let A=this.source.slice(E,this.pos);this.advance(),this.addToken("STRING",A)}scanNumber(){let O=this.pos;if(this.peek()==="-")this.advance();while(this.isDigit(this.peek()))this.advance();if(this.peek()==="."&&this.isDigit(this.peekNext())){this.advance();while(this.isDigit(this.peek()))this.advance()}this.addToken("NUMBER",this.source.slice(O,this.pos))}scanIdentifier(){let O=this.pos;while(this.isAlphaNumeric(this.peek())||this.peek()==="_"||this.peek()==="-")this.advance();let E=this.source.slice(O,this.pos);switch(E){case"and":this.addToken("AND",E);break;case"or":this.addToken("OR",E);break;case"contains":this.addToken("CONTAINS",E);break;default:this.addToken("ID",E)}}isAtEnd(){return this.pos>=this.source.length}peek(){return this.source[this.pos]||"\x00"}peekNext(){return this.source[this.pos+1]||"\x00"}advance(){let O=this.source[this.pos];return this.pos++,this.column++,O}check(O){for(let E=0;E<O.length;E++)if(this.source[this.pos+E]!==O[E])return!1;return!0}match(O){if(!this.check(O))return!1;return this.pos+=O.length,this.column+=O.length,!0}skipWhitespace(){while(this.peek()===" "||this.peek()==="\t"||this.peek()===`
39
+ `||this.peek()==="\r"){if(this.peek()===`
40
+ `)this.line++,this.column=0;this.advance()}}isDigit(O){return O>="0"&&O<="9"}isAlpha(O){return O>="a"&&O<="z"||O>="A"&&O<="Z"}isAlphaNumeric(O){return this.isDigit(O)||this.isAlpha(O)}addToken(O,E){this.tokens.push({type:O,value:E,line:this.line,column:this.column-E.length})}}var UO;var KO=R(()=>{((G)=>{G.TEXT="TEXT";G.VAR_START="VAR_START";G.VAR_END="VAR_END";G.TAG_START="TAG_START";G.TAG_END="TAG_END";G.ID="ID";G.STRING="STRING";G.NUMBER="NUMBER";G.DOT="DOT";G.PIPE="PIPE";G.COLON="COLON";G.COMMA="COMMA";G.LBRACKET="LBRACKET";G.RBRACKET="RBRACKET";G.RANGE="RANGE";G.EQUALS="EQUALS";G.EQ="EQ";G.NE="NE";G.LT="LT";G.LE="LE";G.GT="GT";G.GE="GE";G.CONTAINS="CONTAINS";G.AND="AND";G.OR="OR";G.EOF="EOF"})(UO||={})});class r{tokens;current=0;source;constructor(O,E=""){this.tokens=O,this.source=E}parse(){return{type:"Template",body:this.parseNodes(),line:1,column:1}}parseNodes(O=[]){let E=[];while(!this.isAtEnd()){if(this.peek().type==="TAG_START"){let B=this.tokens[this.current+1];if(B&&O.includes(B.value))break}let U=this.parseNode();if(U)E.push(U)}return E}parseNode(){switch(this.peek().type){case"TEXT":return this.parseText();case"VAR_START":return this.parseOutput();case"TAG_START":return this.parseTag();default:return this.advance(),null}}parseText(){let O=this.advance();return{type:"Text",value:O.value,line:O.line,column:O.column}}parseOutput(){let O=this.advance(),E=this.parseExpression();return this.expect("VAR_END"),{type:"Output",expression:E,line:O.line,column:O.column}}parseTag(){this.advance();let O=this.expect("ID"),E=O.value,A=O.line,U=O.column;switch(E){case"if":return this.parseIfTag(A,U);case"unless":return this.parseUnlessTag(A,U);case"case":return this.parseCaseTag(A,U);case"for":return this.parseForTag(A,U);case"assign":return this.parseAssignTag(A,U);case"capture":return this.parseCaptureTag(A,U);case"increment":case"decrement":return this.parseIncrementTag(E,A,U);case"include":case"render":return this.parseIncludeTag(A,U);case"comment":return this.parseCommentTag();case"raw":return this.parseRawTag(A,U);case"break":return this.expect("TAG_END"),{type:"Break",line:A,column:U};case"continue":return this.expect("TAG_END"),{type:"Continue",line:A,column:U};case"endif":case"endunless":case"endcase":case"endfor":case"endcapture":case"endcomment":case"endraw":case"elsif":case"else":case"when":return this.current-=2,null;default:while(!this.check("TAG_END")&&!this.isAtEnd())this.advance();if(this.check("TAG_END"))this.advance();return null}}parseIfTag(O,E){let A=this.parseCondition();this.expect("TAG_END");let U=this.parseNodes(["elsif","else","endif"]),B=[],Q=[];while(this.checkTag("elsif")){this.consumeTag("elsif");let J=this.parseCondition();this.expect("TAG_END");let Z=this.parseNodes(["elsif","else","endif"]);B.push({test:J,body:Z})}if(this.checkTag("else"))this.consumeTag("else"),this.expect("TAG_END"),Q=this.parseNodes(["endif"]);return this.consumeTag("endif"),this.expect("TAG_END"),{type:"If",test:A,body:U,elifs:B,else_:Q,line:O,column:E}}parseUnlessTag(O,E){let A=this.parseCondition();this.expect("TAG_END");let U=this.parseNodes(["else","endunless"]),B=[];if(this.checkTag("else"))this.consumeTag("else"),this.expect("TAG_END"),B=this.parseNodes(["endunless"]);return this.consumeTag("endunless"),this.expect("TAG_END"),{type:"If",test:{type:"UnaryOp",operator:"not",operand:A,line:O,column:E},body:U,elifs:[],else_:B,line:O,column:E}}parseCaseTag(O,E){let A=this.parseExpressionAtom();this.expect("TAG_END"),this.parseNodes(["when","else","endcase"]);let U=[],B=[];while(this.checkTag("when")){this.consumeTag("when");let Z=this.parseExpressionAtom();this.expect("TAG_END");let K=this.parseNodes(["when","else","endcase"]);U.push({value:Z,body:K})}if(this.checkTag("else"))this.consumeTag("else"),this.expect("TAG_END"),B=this.parseNodes(["endcase"]);if(this.consumeTag("endcase"),this.expect("TAG_END"),U.length===0)return{type:"Text",value:"",line:O,column:E};let Q=U[0],J=U.slice(1).map((Z)=>({test:{type:"Compare",left:A,ops:[{operator:"==",right:Z.value}],line:O,column:E},body:Z.body}));return{type:"If",test:{type:"Compare",left:A,ops:[{operator:"==",right:Q.value}],line:O,column:E},body:Q.body,elifs:J,else_:B,line:O,column:E}}parseForTag(O,E){let A=this.expect("ID").value;this.expectKeyword("in");let U=this.parseForIterable(),B,Q,J=!1;while(!this.check("TAG_END"))if(this.checkKeyword("limit"))this.advance(),this.expect("COLON"),B=this.parseExpressionAtom();else if(this.checkKeyword("offset"))this.advance(),this.expect("COLON"),Q=this.parseExpressionAtom();else if(this.checkKeyword("reversed"))this.advance(),J=!0;else break;this.expect("TAG_END");let Z=this.parseNodes(["else","endfor"]),K=[];if(this.checkTag("else"))this.consumeTag("else"),this.expect("TAG_END"),K=this.parseNodes(["endfor"]);return this.consumeTag("endfor"),this.expect("TAG_END"),{type:"For",target:A,iter:U,body:Z,else_:K,line:O,column:E}}parseForIterable(){if(this.check("LBRACKET")||this.peek().type==="ID"&&this.peek().value==="("){if(this.peek().value==="(")this.advance();if(this.check("LBRACKET"))this.advance();let O=this.parseExpressionAtom();if(this.check("RANGE")){this.advance();let E=this.parseExpressionAtom();if(this.peek().value===")")this.advance();if(this.check("RBRACKET"))this.advance();return{type:"FunctionCall",callee:{type:"Name",name:"range",line:O.line,column:O.column},args:[O,E],kwargs:{},line:O.line,column:O.column}}}return this.parseExpressionAtom()}parseAssignTag(O,E){let A=this.expect("ID").value;this.expect("EQUALS");let U=this.parseExpression();return this.expect("TAG_END"),{type:"Set",target:A,value:U,line:O,column:E}}parseCaptureTag(O,E){let A=this.expect("ID").value;this.expect("TAG_END");let U=this.parseNodes(["endcapture"]);return this.consumeTag("endcapture"),this.expect("TAG_END"),{type:"Set",targets:[A],value:{type:"Capture",body:U,line:O,column:E},line:O,column:E}}parseIncrementTag(O,E,A){let U=this.expect("ID").value;return this.expect("TAG_END"),{type:"Output",expression:{type:"FunctionCall",callee:{type:"Name",name:O,line:E,column:A},args:[{type:"Name",name:U,line:E,column:A}],kwargs:{},line:E,column:A},line:E,column:A}}parseIncludeTag(O,E){let A=this.parseExpressionAtom(),U={};if(this.checkKeyword("with")){this.advance();let B=this.parseExpressionAtom();U._=B}while(this.check("ID")||this.check("COMMA")){if(this.check("COMMA"))this.advance();if(!this.check("ID"))break;let B=this.advance().value;if(this.check("COLON"))this.advance(),U[B]=this.parseExpressionAtom()}return this.expect("TAG_END"),{type:"Include",template:A,context:Object.keys(U).length>0?U:void 0,line:O,column:E}}parseCommentTag(){while(!this.isAtEnd()){if(this.checkTag("endcomment")){this.consumeTag("endcomment"),this.expect("TAG_END");break}this.advance()}return null}parseRawTag(O,E){this.expect("TAG_END");let A="";while(!this.isAtEnd()){if(this.checkTag("endraw")){this.consumeTag("endraw"),this.expect("TAG_END");break}let U=this.advance();A+=U.value}return{type:"Text",value:A,line:O,column:E}}parseCondition(){return this.parseOr()}parseOr(){let O=this.parseAnd();while(this.check("OR")){this.advance();let E=this.parseAnd();O={type:"BinaryOp",operator:"or",left:O,right:E,line:O.line,column:O.column}}return O}parseAnd(){let O=this.parseComparison();while(this.check("AND")){this.advance();let E=this.parseComparison();O={type:"BinaryOp",operator:"and",left:O,right:E,line:O.line,column:O.column}}return O}parseComparison(){let O=this.parseExpressionAtom(),E={EQ:"==",NE:"!=",LT:"<",LE:"<=",GT:">",GE:">="},A=this.peek();if(E[A.type]){this.advance();let U=this.parseExpressionAtom();return{type:"Compare",left:O,ops:[{operator:E[A.type],right:U}],line:O.line,column:O.column}}if(this.check("CONTAINS")){this.advance();let U=this.parseExpressionAtom();return{type:"Test",node:O,test:"in",args:[U],line:O.line,column:O.column}}return O}parseExpression(){let O=this.parseExpressionAtom();while(this.check("PIPE")){this.advance();let E=this.expect("ID").value,A=[];if(this.check("COLON")){this.advance(),A.push(this.parseExpressionAtom());while(this.check("COMMA"))this.advance(),A.push(this.parseExpressionAtom())}O={type:"FilterExpr",node:O,filter:E,args:A,kwargs:{},line:O.line,column:O.column}}return O}parseExpressionAtom(){let O=this.peek();switch(O.type){case"STRING":return this.advance(),{type:"Literal",value:O.value,line:O.line,column:O.column};case"NUMBER":return this.advance(),{type:"Literal",value:parseFloat(O.value),line:O.line,column:O.column};case"ID":if(O.value==="true"||O.value==="false")return this.advance(),{type:"Literal",value:O.value==="true",line:O.line,column:O.column};if(O.value==="nil"||O.value==="null")return this.advance(),{type:"Literal",value:null,line:O.line,column:O.column};if(O.value==="empty"||O.value==="blank")return this.advance(),{type:"Literal",value:"",line:O.line,column:O.column};return this.parsePath();default:return this.advance(),{type:"Literal",value:null,line:O.line,column:O.column}}}parsePath(){let O=this.advance(),E={type:"Name",name:O.value,line:O.line,column:O.column};if(O.value==="forloop"){if(this.check("DOT")){if(this.advance(),this.check("ID")){let A=this.advance(),B={index:"counter",index0:"counter0",first:"first",last:"last",length:"length",rindex:"revcounter",rindex0:"revcounter0"}[A.value]||A.value;E={type:"GetAttr",object:E,attribute:B,line:A.line,column:A.column}}}return E}while(this.check("DOT")||this.check("LBRACKET"))if(this.check("DOT")){if(this.advance(),this.check("ID")){let A=this.advance();E={type:"GetAttr",object:E,attribute:A.value,line:A.line,column:A.column}}}else if(this.check("LBRACKET")){this.advance();let A=this.parseExpressionAtom();this.expect("RBRACKET"),E={type:"GetItem",object:E,index:A,line:A.line,column:A.column}}return E}checkTag(O){if(!this.check("TAG_START"))return!1;let E=this.tokens[this.current+1];return E?.type==="ID"&&E.value===O}consumeTag(O){this.expect("TAG_START"),this.expect("ID")}checkKeyword(O){return this.check("ID")&&this.peek().value===O}expectKeyword(O){if(!this.checkKeyword(O))throw Error(`Expected keyword '${O}' but got '${this.peek().value}'`);this.advance()}isAtEnd(){return this.current>=this.tokens.length||this.peek().type==="EOF"}peek(){return this.tokens[this.current]||{type:"EOF",value:"",line:1,column:1}}advance(){if(!this.isAtEnd())this.current++;return this.tokens[this.current-1]}check(O){return this.peek().type===O}expect(O){if(this.check(O))return this.advance();throw Error(`Expected ${O} but got ${this.peek().type}`)}}var _O=R(()=>{KO()});var HO={};o(HO,{render:()=>QE,parse:()=>jO,engine:()=>nB,compile:()=>NO,LiquidTokenType:()=>UO,LiquidParser:()=>r,LiquidLexer:()=>u});function jO(O){let A=new u(O).tokenize();return new r(A,O).parse()}function NO(O){let E=jO(O),{Runtime:A}=(f(),fO(MO)),U=new A;return async(B)=>{return U.render(E,B,O)}}async function QE(O,E={}){return NO(O)(E)}var nB;var CO=R(()=>{KO();_O();KO();_O();nB={name:"liquid",extensions:[".liquid"],parse:jO,compile:NO,render:QE}});var l;var SO=R(()=>{x();l=class l extends q{constructor(O){super(O)}}});var wO,n;var VO=R(()=>{e();wO={e:"escape",raw:"safe",nl2br:"linebreaksbr",number_format:"floatformat",striptags:"striptags",json_encode:"json",merge:"concat",keys:"list",column:"map"};n=class n extends h{constructor(O,E=""){super(O,E)}parse(){let O=super.parse();return this.transformTwigAST(O)}transformTwigAST(O){return{...O,body:O.body.map((E)=>this.transformNode(E))}}transformNode(O){if(!O||typeof O!=="object")return O;if(O.type==="Conditional")return{...O,test:this.transformNode(O.test),body:this.transformNode(O.body),else_:this.transformNode(O.else_)};if(O.type==="BinOp"&&O.operator==="??")return{type:"Conditional",test:{type:"Compare",left:this.transformNode(O.left),ops:[{operator:"isnot",right:{type:"Literal",value:null,line:O.line,column:O.column}}],line:O.line,column:O.column},body:this.transformNode(O.left),else_:this.transformNode(O.right),line:O.line,column:O.column};if(O.type==="FilterExpr"){let E=wO[O.filter]||O.filter;return{...O,filter:E,node:this.transformNode(O.node),args:O.args?.map((A)=>this.transformNode(A))||[]}}if(O.body)O.body=Array.isArray(O.body)?O.body.map((E)=>this.transformNode(E)):this.transformNode(O.body);if(O.else_)O.else_=Array.isArray(O.else_)?O.else_.map((E)=>this.transformNode(E)):this.transformNode(O.else_);if(O.expression)O.expression=this.transformNode(O.expression);if(O.test)O.test=this.transformNode(O.test);if(O.elifs)O.elifs=O.elifs.map((E)=>({...E,test:this.transformNode(E.test),body:E.body.map((A)=>this.transformNode(A))}));if(O.iter)O.iter=this.transformNode(O.iter);if(O.left)O.left=this.transformNode(O.left);if(O.right)O.right=this.transformNode(O.right);if(O.object)O.object=this.transformNode(O.object);if(O.operand)O.operand=this.transformNode(O.operand);if(O.args)O.args=O.args.map((E)=>this.transformNode(E));return O}}});var LO={};o(LO,{render:()=>ZE,parse:()=>QO,engine:()=>oB,compile:()=>$E,TwigParser:()=>n,TwigLexer:()=>l,TWIG_FILTER_MAP:()=>wO});function QO(O){let A=new l(O).tokenize();return new n(A,O).parse()}function $E(O){let E=QO(O),A=new z;return async(U)=>A.render(E,U)}async function ZE(O,E={}){let A=QO(O);return new z().render(A,E)}var oB;var qO=R(()=>{SO();VO();f();SO();VO();oB={name:"twig",extensions:[".twig",".html.twig"],parse:QO,compile:$E,render:ZE}});import{readFile as JE}from"fs/promises";import{join as YE,extname as hO}from"path";x();e();f();OO();EO();function tO(O,E={}){return new OE(E).compile(O)}function eO(O,E={}){let A=tO(O,E),U=Function("__ctx","__helpers",`
41
+ const { escape, isTruthy, toArray, applyFilter, applyTest } = __helpers;
42
+ ${A}
43
+ return render(__ctx);
44
+ `);return(B)=>U(B,qB)}var qB={escape:(O)=>{if(O==null)return"";if(typeof O==="object"&&O.__safe)return String(O.value??"");if(O?.__safe__)return String(O);return Bun.escapeHTML(String(O))},isTruthy:(O)=>{if(O==null)return!1;if(typeof O==="boolean")return O;if(typeof O==="number")return O!==0;if(typeof O==="string")return O.length>0;if(Array.isArray(O))return O.length>0;if(typeof O==="object"){for(let E in O)return!0;return!1}return!0},toArray:(O)=>{if(O==null)return[];if(Array.isArray(O))return O;if(typeof O==="string")return O.split("");if(typeof O==="object"){if(typeof O[Symbol.iterator]==="function")return[...O];return Object.entries(O)}return[]},applyFilter:(O,E,...A)=>{let U=T[O];if(!U)throw Error(`Unknown filter: ${O}`);return U(E,...A)},applyTest:(O,E,...A)=>{let U=m[O];if(!U)throw Error(`Unknown test: ${O}`);return U(E,...A)}};class OE{options;indent=0;varCounter=0;loopStack=[];localVars=[];constructor(O={}){this.options={functionName:O.functionName??"render",inlineHelpers:O.inlineHelpers??!0,minify:O.minify??!1,autoescape:O.autoescape??!0}}pushScope(){this.localVars.push(new Set)}popScope(){this.localVars.pop()}addLocalVar(O){if(this.localVars.length>0)this.localVars[this.localVars.length-1].add(O)}isLocalVar(O){for(let E=this.localVars.length-1;E>=0;E--)if(this.localVars[E].has(O))return!0;return!1}compile(O){let E=this.compileNodes(O.body),A=this.options.minify?"":`
45
+ `;return`function ${this.options.functionName}(__ctx) {${A} let __out = '';${A}`+E+` return __out;${A}}`}compileNodes(O){return O.map((E)=>this.compileNode(E)).join("")}compileNode(O){switch(O.type){case"Text":return this.compileText(O);case"Output":return this.compileOutput(O);case"If":return this.compileIf(O);case"For":return this.compileFor(O);case"Set":return this.compileSet(O);case"With":return this.compileWith(O);case"Comment":return"";case"Extends":case"Block":case"Include":throw Error(`AOT compilation does not support '${O.type}' - use Environment.render() for templates with inheritance`);case"Url":case"Static":throw Error(`AOT compilation does not support '${O.type}' tag - use Environment.render() with urlResolver/staticResolver`);default:throw Error(`Unknown node type in AOT compiler: ${O.type}`)}}compileText(O){return` __out += ${JSON.stringify(O.value)};${this.nl()}`}compileOutput(O){let E=this.compileExpr(O.expression);if(this.options.autoescape&&!this.isMarkedSafe(O.expression))return` __out += escape(${E});${this.nl()}`;return` __out += (${E}) ?? '';${this.nl()}`}compileIf(O){let E="",A=this.compileExpr(O.test);E+=` if (isTruthy(${A})) {${this.nl()}`,E+=this.compileNodes(O.body),E+=" }";for(let U of O.elifs){let B=this.compileExpr(U.test);E+=` else if (isTruthy(${B})) {${this.nl()}`,E+=this.compileNodes(U.body),E+=" }"}if(O.else_.length>0)E+=` else {${this.nl()}`,E+=this.compileNodes(O.else_),E+=" }";return E+=this.nl(),E}compileFor(O){let E=this.genVar("iter"),A=this.genVar("i"),U=this.genVar("len"),B=this.genVar("loop"),Q=Array.isArray(O.target)?O.target[0]:O.target,J=Array.isArray(O.target)&&O.target[1]?O.target[1]:null,Z=this.loopStack.length>0?this.loopStack[this.loopStack.length-1]:null,K=this.compileExpr(O.iter),$="";if($+=` const ${E} = toArray(${K});${this.nl()}`,$+=` const ${U} = ${E}.length;${this.nl()}`,O.else_.length>0)$+=` if (${U} === 0) {${this.nl()}`,$+=this.compileNodes(O.else_),$+=` } else {${this.nl()}`;if($+=` for (let ${A} = 0; ${A} < ${U}; ${A}++) {${this.nl()}`,J)$+=` const ${Q} = ${E}[${A}][0];${this.nl()}`,$+=` const ${J} = ${E}[${A}][1];${this.nl()}`;else $+=` const ${Q} = ${E}[${A}];${this.nl()}`;if($+=` const ${B} = {${this.nl()}`,$+=` counter: ${A} + 1,${this.nl()}`,$+=` counter0: ${A},${this.nl()}`,$+=` revcounter: ${U} - ${A},${this.nl()}`,$+=` revcounter0: ${U} - ${A} - 1,${this.nl()}`,$+=` first: ${A} === 0,${this.nl()}`,$+=` last: ${A} === ${U} - 1,${this.nl()}`,$+=` length: ${U},${this.nl()}`,$+=` index: ${A} + 1,${this.nl()}`,$+=` index0: ${A},${this.nl()}`,Z)$+=` parentloop: ${Z},${this.nl()}`,$+=` parent: ${Z}${this.nl()}`;else $+=` parentloop: null,${this.nl()}`,$+=` parent: null${this.nl()}`;$+=` };${this.nl()}`,$+=` const forloop = ${B};${this.nl()}`,$+=` const loop = ${B};${this.nl()}`,this.loopStack.push(B);let Y=this.compileNodes(O.body);if($+=Y.replace(new RegExp(`__ctx\\.${Q}`,"g"),Q),this.loopStack.pop(),$+=` }${this.nl()}`,O.else_.length>0)$+=` }${this.nl()}`;return $}compileSet(O){let E=this.compileExpr(O.value);return` const ${O.target} = ${E};${this.nl()}`}compileWith(O){let E=` {${this.nl()}`;this.pushScope();for(let{target:A,value:U}of O.assignments){let B=this.compileExpr(U);E+=` const ${A} = ${B};${this.nl()}`,this.addLocalVar(A)}return E+=this.compileNodes(O.body),E+=` }${this.nl()}`,this.popScope(),E}compileExpr(O){switch(O.type){case"Name":return this.compileName(O);case"Literal":return this.compileLiteral(O);case"Array":return this.compileArray(O);case"Object":return this.compileObject(O);case"BinaryOp":return this.compileBinaryOp(O);case"UnaryOp":return this.compileUnaryOp(O);case"Compare":return this.compileCompare(O);case"GetAttr":return this.compileGetAttr(O);case"GetItem":return this.compileGetItem(O);case"FilterExpr":return this.compileFilter(O);case"TestExpr":return this.compileTest(O);case"Conditional":return this.compileConditional(O);default:return"undefined"}}compileName(O){if(O.name==="true"||O.name==="True")return"true";if(O.name==="false"||O.name==="False")return"false";if(O.name==="none"||O.name==="None"||O.name==="null")return"null";if(O.name==="forloop"||O.name==="loop")return O.name;if(this.isLocalVar(O.name))return O.name;return`__ctx.${O.name}`}compileLiteral(O){if(typeof O.value==="string")return JSON.stringify(O.value);return String(O.value)}compileArray(O){return`[${O.elements.map((A)=>this.compileExpr(A)).join(", ")}]`}compileObject(O){return`{${O.pairs.map(({key:A,value:U})=>{let B=this.compileExpr(A),Q=this.compileExpr(U);return`[${B}]: ${Q}`}).join(", ")}}`}compileBinaryOp(O){let E=this.compileExpr(O.left),A=this.compileExpr(O.right);switch(O.operator){case"and":return`(${E} && ${A})`;case"or":return`(${E} || ${A})`;case"~":return`(String(${E}) + String(${A}))`;case"in":return`(Array.isArray(${A}) ? ${A}.includes(${E}) : String(${A}).includes(String(${E})))`;case"not in":return`!(Array.isArray(${A}) ? ${A}.includes(${E}) : String(${A}).includes(String(${E})))`;default:return`(${E} ${O.operator} ${A})`}}compileUnaryOp(O){let E=this.compileExpr(O.operand);switch(O.operator){case"not":return`!isTruthy(${E})`;case"-":return`-(${E})`;case"+":return`+(${E})`;default:return E}}compileCompare(O){let E=this.compileExpr(O.left);for(let{operator:A,right:U}of O.ops){let B=this.compileExpr(U);switch(A){case"==":case"===":E=`(${E} === ${B})`;break;case"!=":case"!==":E=`(${E} !== ${B})`;break;default:E=`(${E} ${A} ${B})`}}return E}compileGetAttr(O){return`${this.compileExpr(O.object)}?.${O.attribute}`}compileGetItem(O){let E=this.compileExpr(O.object),A=this.compileExpr(O.index);return`${E}?.[${A}]`}compileFilter(O){let E=this.compileExpr(O.node),A=O.args.map((U)=>this.compileExpr(U));switch(O.filter){case"upper":return`String(${E}).toUpperCase()`;case"lower":return`String(${E}).toLowerCase()`;case"title":return`String(${E}).replace(/\\b\\w/g, c => c.toUpperCase())`;case"trim":return`String(${E}).trim()`;case"length":return`(${E}?.length ?? Object.keys(${E} ?? {}).length)`;case"first":return`(${E})?.[0]`;case"last":return`(${E})?.[(${E})?.length - 1]`;case"default":return`((${E}) ?? ${A[0]??'""'})`;case"safe":return`{ __safe: true, value: String(${E}) }`;case"escape":case"e":return`escape(${E})`;case"join":return`(${E} ?? []).join(${A[0]??'""'})`;case"abs":return`Math.abs(${E})`;case"round":return A.length?`Number(${E}).toFixed(${A[0]})`:`Math.round(${E})`;case"int":return`parseInt(${E}, 10)`;case"float":return`parseFloat(${E})`;case"floatformat":return`Number(${E}).toFixed(${A[0]??1})`;case"filesizeformat":return`applyFilter('filesizeformat', ${E})`;default:let U=A.length?", "+A.join(", "):"";return`applyFilter('${O.filter}', ${E}${U})`}}compileTest(O){let E=this.compileExpr(O.node),A=O.args.map((B)=>this.compileExpr(B)),U=O.negated?"!":"";switch(O.test){case"defined":return`${U}(${E} !== undefined)`;case"undefined":return`${U}(${E} === undefined)`;case"none":return`${U}(${E} === null)`;case"even":return`${U}(${E} % 2 === 0)`;case"odd":return`${U}(${E} % 2 !== 0)`;case"divisibleby":return`${U}(${E} % ${A[0]} === 0)`;case"empty":return`${U}((${E} == null) || (${E}.length === 0) || (Object.keys(${E}).length === 0))`;case"iterable":return`${U}(Array.isArray(${E}) || typeof ${E} === 'string')`;case"number":return`${U}(typeof ${E} === 'number' && !isNaN(${E}))`;case"string":return`${U}(typeof ${E} === 'string')`;default:let B=A.length?", "+A.join(", "):"";return`${U}applyTest('${O.test}', ${E}${B})`}}compileConditional(O){let E=this.compileExpr(O.test),A=this.compileExpr(O.trueExpr),U=this.compileExpr(O.falseExpr);return`(isTruthy(${E}) ? ${A} : ${U})`}isMarkedSafe(O){if(O.type==="FilterExpr")return O.filter==="safe";return!1}genVar(O){return`__${O}${this.varCounter++}`}nl(){return this.options.minify?"":`
46
+ `}}class DO{data;constructor(){this.data={startTime:performance.now(),templateChain:[],mode:"runtime",isAsync:!1,contextKeys:[],contextSnapshot:{},filtersUsed:new Map,testsUsed:new Map,cacheHits:0,cacheMisses:0,queries:[],queryStats:{count:0,totalDuration:0,slowCount:0,n1Count:0,queryCounts:new Map},warnings:[]}}startLexer(){this.data._lexerStart=performance.now()}endLexer(){if(this.data._lexerStart)this.data.lexerTime=performance.now()-this.data._lexerStart}startParser(){this.data._parserStart=performance.now()}endParser(){if(this.data._parserStart)this.data.parserTime=performance.now()-this.data._parserStart}startRender(){this.data._renderStart=performance.now()}endRender(){if(this.data._renderStart)this.data.renderTime=performance.now()-this.data._renderStart;this.data.endTime=performance.now(),this.data.totalTime=this.data.endTime-this.data.startTime}addTemplate(O,E,A){if(this.data.templateChain.push({name:O,type:E,parent:A}),E==="root")this.data.rootTemplate=O}setMode(O){this.data.mode=O}setAsync(O){this.data.isAsync=O}captureContext(O){this.data.contextKeys=Object.keys(O);for(let[E,A]of Object.entries(O))this.data.contextSnapshot[E]=this.captureValue(A)}captureValue(O,E=0){let A=this.getType(O),U=this.getPreview(O),B=this.isExpandable(O),Q={type:A,preview:U,value:O,expandable:B};if(B&&E<3){if(Q.children={},Array.isArray(O))O.forEach((J,Z)=>{Q.children[String(Z)]=this.captureValue(J,E+1)});else if(typeof O==="object"&&O!==null)for(let[J,Z]of Object.entries(O))Q.children[J]=this.captureValue(Z,E+1)}return Q}isExpandable(O){if(O===null||O===void 0)return!1;if(Array.isArray(O))return O.length>0;if(typeof O==="object")return Object.keys(O).length>0;return!1}getType(O){if(O===null)return"null";if(O===void 0)return"undefined";if(Array.isArray(O))return`Array(${O.length})`;if(O instanceof Date)return"Date";if(typeof O==="object")return"Object";return typeof O}getPreview(O,E=50){if(O===null)return"null";if(O===void 0)return"undefined";if(typeof O==="string")return O.length>E?`"${O.slice(0,E)}..."`:`"${O}"`;if(typeof O==="number"||typeof O==="boolean")return String(O);if(Array.isArray(O)){if(O.length===0)return"[]";if(O.length<=3)return`[${O.map((U)=>this.getPreview(U,15)).join(", ")}]`;return`[${this.getPreview(O[0],15)}, ... +${O.length-1}]`}if(O instanceof Date)return O.toISOString();if(typeof O==="object"){let A=Object.keys(O);if(A.length===0)return"{}";if(A.length<=2)return`{ ${A.join(", ")} }`;return`{ ${A.slice(0,2).join(", ")}, ... +${A.length-2} }`}if(typeof O==="function")return"function()";return String(O)}recordFilter(O){this.data.filtersUsed.set(O,(this.data.filtersUsed.get(O)||0)+1)}recordTest(O){this.data.testsUsed.set(O,(this.data.testsUsed.get(O)||0)+1)}recordCacheHit(){this.data.cacheHits++}recordCacheMiss(){this.data.cacheMisses++}addWarning(O){this.data.warnings.push(O)}recordQuery(O){let E=this.normalizeQuery(O.sql),A=this.data.queryStats.queryCounts.get(E)||0;this.data.queryStats.queryCounts.set(E,A+1);let U=A>=2,B={...O,timestamp:performance.now(),isN1:U};if(this.data.queries.push(B),this.data.queryStats.count++,this.data.queryStats.totalDuration+=O.duration,O.duration>100)this.data.queryStats.slowCount++;if(U&&A===2)this.data.queryStats.n1Count++,this.addWarning(`N+1 query detected: ${E.slice(0,50)}...`)}normalizeQuery(O){return O.replace(/\s+/g," ").replace(/= \?/g,"= ?").replace(/= \$\d+/g,"= ?").replace(/= '\w+'/g,"= '?'").replace(/= \d+/g,"= ?").replace(/IN \([^)]+\)/gi,"IN (?)").trim()}getQueryStats(){return this.data.queryStats}getData(){return this.data}getSummary(){return{totalTime:this.data.totalTime||0,templateCount:this.data.templateChain.length,filterCount:this.data.filtersUsed.size,mode:this.data.mode}}}var v=null;function p(){return v=new DO,v}function c(){if(v){let O=v.getData();return v=null,O}return null}var hB={position:"bottom",height:300,width:400,open:!1,dark:!0};function s(O,E={}){let A={...hB,...E},U=`binja-dbg-${Date.now()}`,B=A.dark?bB:fB;return`
47
+ <!-- Binja Debug Panel -->
48
+ <div id="${U}" class="binja-devtools" data-position="${A.position}" data-open="${A.open}">
49
+ <style>${kB(U,B,A)}</style>
50
+ ${gB(U,O,B,A)}
51
+ <script>${iB(U,O,A)}</script>
52
+ </div>
53
+ <!-- /Binja Debug Panel -->
54
+ `}var bB={bg:"#1e1e1e",bgPanel:"#252526",bgHover:"#2a2d2e",bgActive:"#37373d",border:"#3c3c3c",text:"#cccccc",textSecondary:"#969696",textMuted:"#6e6e6e",accent:"#0078d4",accentHover:"#1c86d8",success:"#4ec9b0",warning:"#dcdcaa",error:"#f14c4c",info:"#75beff",string:"#ce9178",number:"#b5cea8",keyword:"#569cd6"},fB={bg:"#f3f3f3",bgPanel:"#ffffff",bgHover:"#e8e8e8",bgActive:"#d4d4d4",border:"#d4d4d4",text:"#1e1e1e",textSecondary:"#616161",textMuted:"#a0a0a0",accent:"#0078d4",accentHover:"#106ebe",success:"#16825d",warning:"#bf8803",error:"#cd3131",info:"#0078d4",string:"#a31515",number:"#098658",keyword:"#0000ff"};function kB(O,E,A){return`
55
+ #${O} { --bg: ${E.bg}; --bg-panel: ${E.bgPanel}; --bg-hover: ${E.bgHover}; --bg-active: ${E.bgActive}; --border: ${E.border}; --text: ${E.text}; --text-secondary: ${E.textSecondary}; --text-muted: ${E.textMuted}; --accent: ${E.accent}; --success: ${E.success}; --warning: ${E.warning}; --error: ${E.error}; --string: ${E.string}; --number: ${E.number}; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; font-size: 12px; line-height: 1.4; color: var(--text); }
56
+ #${O} * { box-sizing: border-box; margin: 0; padding: 0; }
57
+
58
+ /* Toggle Button */
59
+ #${O} .devtools-toggle { position: fixed; bottom: 10px; right: 10px; z-index: 2147483646; display: flex; align-items: center; gap: 6px; padding: 8px 12px; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; color: var(--text); cursor: pointer; font-size: 11px; font-weight: 500; box-shadow: 0 2px 8px rgba(0,0,0,0.2); transition: all 0.15s; }
60
+ #${O} .devtools-toggle:hover { background: var(--bg-hover); border-color: var(--accent); }
61
+ #${O} .devtools-toggle svg { width: 14px; height: 14px; color: var(--accent); }
62
+ #${O} .devtools-toggle .badge { padding: 2px 6px; background: var(--accent); color: #fff; border-radius: 3px; font-size: 10px; }
63
+ #${O}[data-open="true"] .devtools-toggle { display: none; }
64
+
65
+ /* Panel Container */
66
+ #${O} .devtools-panel { display: none; position: fixed; z-index: 2147483647; background: var(--bg); border: 1px solid var(--border); box-shadow: 0 -2px 12px rgba(0,0,0,0.3); }
67
+ #${O}[data-open="true"] .devtools-panel { display: flex; flex-direction: column; }
68
+ #${O}[data-position="bottom"] .devtools-panel { left: 0; right: 0; bottom: 0; height: ${A.height}px; border-left: none; border-right: none; border-bottom: none; }
69
+ #${O}[data-position="right"] .devtools-panel { top: 0; right: 0; bottom: 0; width: ${A.width}px; border-top: none; border-right: none; border-bottom: none; }
70
+ #${O}[data-position="popup"] .devtools-panel { bottom: 50px; right: 20px; width: 700px; height: 500px; border-radius: 8px; }
71
+
72
+ /* Resize Handle */
73
+ #${O} .devtools-resize { position: absolute; background: transparent; }
74
+ #${O}[data-position="bottom"] .devtools-resize { top: 0; left: 0; right: 0; height: 4px; cursor: ns-resize; }
75
+ #${O}[data-position="right"] .devtools-resize { top: 0; left: 0; bottom: 0; width: 4px; cursor: ew-resize; }
76
+ #${O} .devtools-resize:hover { background: var(--accent); }
77
+
78
+ /* Toolbar */
79
+ #${O} .devtools-toolbar { display: flex; align-items: center; justify-content: space-between; height: 30px; padding: 0 8px; background: var(--bg-panel); border-bottom: 1px solid var(--border); flex-shrink: 0; }
80
+ #${O} .devtools-tabs { display: flex; height: 100%; }
81
+ #${O} .devtools-tab { display: flex; align-items: center; gap: 4px; padding: 0 12px; border: none; background: none; color: var(--text-secondary); font-size: 11px; cursor: pointer; border-bottom: 2px solid transparent; transition: all 0.1s; }
82
+ #${O} .devtools-tab:hover { color: var(--text); background: var(--bg-hover); }
83
+ #${O} .devtools-tab.active { color: var(--text); border-bottom-color: var(--accent); }
84
+ #${O} .devtools-tab svg { width: 12px; height: 12px; opacity: 0.7; }
85
+ #${O} .devtools-tab .count { margin-left: 4px; padding: 1px 5px; background: var(--bg-active); border-radius: 8px; font-size: 10px; }
86
+ #${O} .devtools-tab .count.warn { background: rgba(241,76,76,0.2); color: var(--error); }
87
+ #${O} .devtools-actions { display: flex; align-items: center; gap: 4px; }
88
+ #${O} .devtools-btn { display: flex; align-items: center; justify-content: center; width: 24px; height: 24px; border: none; background: none; color: var(--text-secondary); cursor: pointer; border-radius: 3px; }
89
+ #${O} .devtools-btn:hover { background: var(--bg-hover); color: var(--text); }
90
+ #${O} .devtools-btn svg { width: 14px; height: 14px; }
91
+
92
+ /* Content Area */
93
+ #${O} .devtools-content { flex: 1; overflow: hidden; }
94
+ #${O} .devtools-pane { display: none; height: 100%; overflow: auto; padding: 8px; }
95
+ #${O} .devtools-pane.active { display: block; }
96
+
97
+ /* Performance Tab */
98
+ #${O} .perf-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px; margin-bottom: 12px; }
99
+ #${O} .perf-card { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; padding: 10px; text-align: center; }
100
+ #${O} .perf-card-value { font-size: 20px; font-weight: 600; font-family: 'SF Mono', Monaco, monospace; color: var(--success); }
101
+ #${O} .perf-card-label { font-size: 10px; color: var(--text-muted); margin-top: 4px; text-transform: uppercase; }
102
+ #${O} .perf-breakdown { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; overflow: hidden; }
103
+ #${O} .perf-row { display: flex; align-items: center; padding: 8px 12px; border-bottom: 1px solid var(--border); }
104
+ #${O} .perf-row:last-child { border-bottom: none; }
105
+ #${O} .perf-row-label { flex: 1; font-size: 11px; color: var(--text-secondary); }
106
+ #${O} .perf-row-value { font-family: 'SF Mono', Monaco, monospace; font-size: 11px; min-width: 60px; text-align: right; }
107
+ #${O} .perf-row-bar { flex: 2; height: 4px; background: var(--bg-active); border-radius: 2px; margin: 0 12px; overflow: hidden; }
108
+ #${O} .perf-row-fill { height: 100%; border-radius: 2px; }
109
+ #${O} .perf-row-fill.lexer { background: ${E.info}; }
110
+ #${O} .perf-row-fill.parser { background: ${E.warning}; }
111
+ #${O} .perf-row-fill.render { background: ${E.success}; }
112
+
113
+ /* Context Tab - Tree View */
114
+ #${O} .tree { font-family: 'SF Mono', Monaco, Consolas, monospace; font-size: 11px; }
115
+ #${O} .tree-item { }
116
+ #${O} .tree-row { display: flex; align-items: center; padding: 2px 4px; cursor: default; border-radius: 2px; }
117
+ #${O} .tree-row:hover { background: var(--bg-hover); }
118
+ #${O} .tree-row.expandable { cursor: pointer; }
119
+ #${O} .tree-arrow { width: 12px; height: 12px; color: var(--text-muted); transition: transform 0.1s; flex-shrink: 0; }
120
+ #${O} .tree-item.open > .tree-row .tree-arrow { transform: rotate(90deg); }
121
+ #${O} .tree-key { color: var(--keyword); margin-right: 4px; }
122
+ #${O} .tree-colon { color: var(--text-muted); margin-right: 6px; }
123
+ #${O} .tree-value { color: var(--text); }
124
+ #${O} .tree-value.string { color: var(--string); }
125
+ #${O} .tree-value.number { color: var(--number); }
126
+ #${O} .tree-value.null { color: var(--text-muted); font-style: italic; }
127
+ #${O} .tree-type { color: var(--text-muted); margin-left: 6px; font-size: 10px; }
128
+ #${O} .tree-children { display: none; padding-left: 16px; }
129
+ #${O} .tree-item.open > .tree-children { display: block; }
130
+
131
+ /* Templates Tab */
132
+ #${O} .template-list { display: flex; flex-direction: column; gap: 4px; }
133
+ #${O} .template-item { display: flex; align-items: center; gap: 8px; padding: 8px 10px; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; }
134
+ #${O} .template-icon { width: 14px; height: 14px; color: var(--text-muted); }
135
+ #${O} .template-name { font-family: 'SF Mono', Monaco, monospace; font-size: 11px; }
136
+ #${O} .template-badge { font-size: 9px; padding: 2px 6px; border-radius: 3px; text-transform: uppercase; font-weight: 500; }
137
+ #${O} .template-badge.root { background: rgba(0,120,212,0.15); color: var(--accent); }
138
+ #${O} .template-badge.extends { background: rgba(156,86,246,0.15); color: #9c56f6; }
139
+ #${O} .template-badge.include { background: rgba(78,201,176,0.15); color: var(--success); }
140
+
141
+ /* Queries Tab */
142
+ #${O} .queries-stats { display: flex; gap: 16px; padding: 8px 12px; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; margin-bottom: 8px; }
143
+ #${O} .queries-stat { text-align: center; }
144
+ #${O} .queries-stat-value { font-size: 16px; font-weight: 600; font-family: 'SF Mono', Monaco, monospace; }
145
+ #${O} .queries-stat-value.warn { color: var(--warning); }
146
+ #${O} .queries-stat-value.error { color: var(--error); }
147
+ #${O} .queries-stat-label { font-size: 9px; color: var(--text-muted); text-transform: uppercase; }
148
+ #${O} .query-list { display: flex; flex-direction: column; gap: 4px; }
149
+ #${O} .query-item { background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; overflow: hidden; }
150
+ #${O} .query-item.n1 { border-left: 3px solid var(--error); }
151
+ #${O} .query-item.slow { border-left: 3px solid var(--warning); }
152
+ #${O} .query-header { display: flex; align-items: center; gap: 8px; padding: 6px 10px; }
153
+ #${O} .query-sql { flex: 1; font-family: 'SF Mono', Monaco, monospace; font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--text); }
154
+ #${O} .query-meta { display: flex; align-items: center; gap: 6px; flex-shrink: 0; }
155
+ #${O} .query-badge { font-size: 9px; padding: 2px 5px; border-radius: 3px; font-weight: 600; }
156
+ #${O} .query-badge.n1 { background: rgba(241,76,76,0.15); color: var(--error); }
157
+ #${O} .query-source { font-size: 9px; padding: 2px 5px; border-radius: 3px; background: var(--bg-active); color: var(--text-muted); text-transform: uppercase; }
158
+ #${O} .query-time { font-family: 'SF Mono', Monaco, monospace; font-size: 10px; color: var(--text-secondary); }
159
+ #${O} .query-time.slow { color: var(--warning); }
160
+ #${O} .query-rows { font-size: 10px; color: var(--text-muted); }
161
+
162
+ /* Filters Tab */
163
+ #${O} .filter-grid { display: flex; flex-wrap: wrap; gap: 6px; }
164
+ #${O} .filter-chip { display: inline-flex; align-items: center; gap: 4px; padding: 4px 10px; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; font-family: 'SF Mono', Monaco, monospace; font-size: 11px; }
165
+ #${O} .filter-count { color: var(--accent); font-weight: 600; font-size: 10px; }
166
+
167
+ /* Cache Tab */
168
+ #${O} .cache-stats { display: flex; gap: 20px; }
169
+ #${O} .cache-stat { flex: 1; background: var(--bg-panel); border: 1px solid var(--border); border-radius: 4px; padding: 16px; text-align: center; }
170
+ #${O} .cache-value { font-size: 32px; font-weight: 600; font-family: 'SF Mono', Monaco, monospace; }
171
+ #${O} .cache-value.hit { color: var(--success); }
172
+ #${O} .cache-value.miss { color: var(--error); }
173
+ #${O} .cache-label { font-size: 11px; color: var(--text-muted); margin-top: 4px; }
174
+
175
+ /* Warnings Tab */
176
+ #${O} .warning-list { display: flex; flex-direction: column; gap: 6px; }
177
+ #${O} .warning-item { display: flex; align-items: flex-start; gap: 8px; padding: 10px 12px; background: rgba(241,76,76,0.08); border: 1px solid rgba(241,76,76,0.2); border-radius: 4px; }
178
+ #${O} .warning-icon { color: var(--error); flex-shrink: 0; width: 14px; height: 14px; }
179
+ #${O} .warning-text { font-size: 11px; color: var(--text); }
180
+
181
+ /* Empty State */
182
+ #${O} .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; color: var(--text-muted); font-size: 12px; }
183
+ #${O} .empty-state svg { width: 32px; height: 32px; margin-bottom: 8px; opacity: 0.5; }
184
+ `}var F={logo:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>',close:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6L6 18M6 6l12 12"/></svg>',minimize:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M5 12h14"/></svg>',dock:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 15h18"/></svg>',dockRight:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M15 3v18"/></svg>',popup:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M9 3v6h6"/></svg>',arrow:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 18l6-6-6-6"/></svg>',perf:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>',context:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/></svg>',template:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><path d="M14 2v6h6"/></svg>',filter:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3"/></svg>',database:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>',cache:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2a10 10 0 1010 10H12V2z"/><path d="M12 2a10 10 0 00-8.66 15"/></svg>',warning:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>'};function gB(O,E,A,U){let B=(E.totalTime||0).toFixed(1),Q=E.queries?.length||0,J=E.warnings.length>0||E.queryStats?.n1Count>0,K=[{id:"perf",icon:F.perf,label:"Performance",count:`${B}ms`},{id:"context",icon:F.context,label:"Context",count:Object.keys(E.contextSnapshot).length||null},{id:"templates",icon:F.template,label:"Templates",count:E.templateChain.length||null},{id:"filters",icon:F.filter,label:"Filters",count:E.filtersUsed.size||null},{id:"queries",icon:F.database,label:"Queries",count:Q||null,warn:E.queryStats?.n1Count>0},{id:"cache",icon:F.cache,label:"Cache",count:E.cacheHits+E.cacheMisses||null},{id:"warnings",icon:F.warning,label:"Warnings",count:E.warnings.length||null,warn:J}].map(($,Y)=>{let X=$.count!==null?`<span class="count${$.warn?" warn":""}">${$.count}</span>`:"";return`<button class="devtools-tab${Y===0?" active":""}" data-tab="${$.id}">${$.icon}${$.label}${X}</button>`}).join("");return`
185
+ <button class="devtools-toggle" onclick="document.getElementById('${O}').dataset.open='true'">
186
+ ${F.logo}
187
+ <span>Binja</span>
188
+ <span class="badge">${B}ms</span>
189
+ </button>
190
+
191
+ <div class="devtools-panel">
192
+ <div class="devtools-resize"></div>
193
+ <div class="devtools-toolbar">
194
+ <div class="devtools-tabs">${K}</div>
195
+ <div class="devtools-actions">
196
+ <button class="devtools-btn" title="Dock to bottom" data-dock="bottom">${F.dock}</button>
197
+ <button class="devtools-btn" title="Dock to right" data-dock="right">${F.dockRight}</button>
198
+ <button class="devtools-btn" title="Popup" data-dock="popup">${F.popup}</button>
199
+ <button class="devtools-btn" title="Close" onclick="document.getElementById('${O}').dataset.open='false'">${F.close}</button>
200
+ </div>
201
+ </div>
202
+ <div class="devtools-content">
203
+ ${yB(E)}
204
+ ${xB(E)}
205
+ ${mB(E)}
206
+ ${vB(E)}
207
+ ${pB(E)}
208
+ ${cB(E)}
209
+ ${sB(E)}
210
+ </div>
211
+ </div>`}function yB(O){let E=O.totalTime||0.01,A=O.lexerTime||0,U=O.parserTime||0,B=O.renderTime||0,Q=O.mode==="aot"?"AOT":"Runtime";return`
212
+ <div class="devtools-pane active" data-pane="perf">
213
+ <div class="perf-grid">
214
+ <div class="perf-card">
215
+ <div class="perf-card-value">${E.toFixed(2)}ms</div>
216
+ <div class="perf-card-label">Total Time</div>
217
+ </div>
218
+ <div class="perf-card">
219
+ <div class="perf-card-value" style="color:var(--accent)">${Q}</div>
220
+ <div class="perf-card-label">Mode</div>
221
+ </div>
222
+ <div class="perf-card">
223
+ <div class="perf-card-value">${O.templateChain.length}</div>
224
+ <div class="perf-card-label">Templates</div>
225
+ </div>
226
+ <div class="perf-card">
227
+ <div class="perf-card-value">${O.queries?.length||0}</div>
228
+ <div class="perf-card-label">Queries</div>
229
+ </div>
230
+ </div>
231
+ <div class="perf-breakdown">
232
+ <div class="perf-row">
233
+ <span class="perf-row-label">Lexer</span>
234
+ <div class="perf-row-bar"><div class="perf-row-fill lexer" style="width:${A/E*100}%"></div></div>
235
+ <span class="perf-row-value">${A.toFixed(2)}ms</span>
236
+ </div>
237
+ <div class="perf-row">
238
+ <span class="perf-row-label">Parser</span>
239
+ <div class="perf-row-bar"><div class="perf-row-fill parser" style="width:${U/E*100}%"></div></div>
240
+ <span class="perf-row-value">${U.toFixed(2)}ms</span>
241
+ </div>
242
+ <div class="perf-row">
243
+ <span class="perf-row-label">Render</span>
244
+ <div class="perf-row-bar"><div class="perf-row-fill render" style="width:${B/E*100}%"></div></div>
245
+ <span class="perf-row-value">${B.toFixed(2)}ms</span>
246
+ </div>
247
+ </div>
248
+ </div>`}function xB(O){let E=Object.keys(O.contextSnapshot);if(E.length===0)return`<div class="devtools-pane" data-pane="context"><div class="empty-state">${F.context}<span>No context variables</span></div></div>`;return`<div class="devtools-pane" data-pane="context"><div class="tree">${E.map((U)=>EE(U,O.contextSnapshot[U])).join("")}</div></div>`}function EE(O,E){let A=E.expandable&&E.children&&Object.keys(E.children).length>0,U=A?`<span class="tree-arrow">${F.arrow}</span>`:'<span class="tree-arrow" style="visibility:hidden">${icons.arrow}</span>',B=A?"expandable":"",Q=TB(E.type),J="";if(A&&E.children)J=`<div class="tree-children">${Object.entries(E.children).map(([Z,K])=>EE(Z,K)).join("")}</div>`;return`
249
+ <div class="tree-item">
250
+ <div class="tree-row ${B}">
251
+ ${U}
252
+ <span class="tree-key">${S(O)}</span>
253
+ <span class="tree-colon">:</span>
254
+ <span class="tree-value ${Q}">${S(E.preview)}</span>
255
+ <span class="tree-type">${E.type}</span>
256
+ </div>
257
+ ${J}
258
+ </div>`}function TB(O){if(O==="string")return"string";if(O==="number"||O==="integer"||O==="float")return"number";if(O==="null"||O==="undefined")return"null";return""}function mB(O){if(O.templateChain.length===0)return`<div class="devtools-pane" data-pane="templates"><div class="empty-state">${F.template}<span>No templates loaded</span></div></div>`;return`<div class="devtools-pane" data-pane="templates"><div class="template-list">${O.templateChain.map((A)=>`
259
+ <div class="template-item">
260
+ <span class="template-icon">${F.template}</span>
261
+ <span class="template-name">${S(A.name)}</span>
262
+ <span class="template-badge ${A.type}">${A.type}</span>
263
+ </div>
264
+ `).join("")}</div></div>`}function vB(O){let E=Array.from(O.filtersUsed.entries());if(E.length===0)return`<div class="devtools-pane" data-pane="filters"><div class="empty-state">${F.filter}<span>No filters used</span></div></div>`;return`<div class="devtools-pane" data-pane="filters"><div class="filter-grid">${E.map(([U,B])=>`
265
+ <span class="filter-chip">${S(U)}<span class="filter-count">\xD7${B}</span></span>
266
+ `).join("")}</div></div>`}function pB(O){if(!O.queries||O.queries.length===0)return`<div class="devtools-pane" data-pane="queries"><div class="empty-state">${F.database}<span>No queries recorded</span></div></div>`;let E=O.queryStats,A=`
267
+ <div class="queries-stats">
268
+ <div class="queries-stat">
269
+ <div class="queries-stat-value">${E.count}</div>
270
+ <div class="queries-stat-label">Queries</div>
271
+ </div>
272
+ <div class="queries-stat">
273
+ <div class="queries-stat-value">${E.totalDuration.toFixed(1)}ms</div>
274
+ <div class="queries-stat-label">Total</div>
275
+ </div>
276
+ <div class="queries-stat">
277
+ <div class="queries-stat-value ${E.slowCount>0?"warn":""}">${E.slowCount}</div>
278
+ <div class="queries-stat-label">Slow</div>
279
+ </div>
280
+ <div class="queries-stat">
281
+ <div class="queries-stat-value ${E.n1Count>0?"error":""}">${E.n1Count}</div>
282
+ <div class="queries-stat-label">N+1</div>
283
+ </div>
284
+ </div>`,U=O.queries.map((B)=>{let Q=B.duration>100,J=["query-item",B.isN1?"n1":"",Q?"slow":""].filter(Boolean).join(" "),Z=B.isN1?'<span class="query-badge n1">N+1</span>':"",K=B.source?`<span class="query-source">${S(B.source)}</span>`:"",$=B.rows!==void 0?`<span class="query-rows">${B.rows} rows</span>`:"";return`
285
+ <div class="${J}">
286
+ <div class="query-header">
287
+ <span class="query-sql" title="${S(B.sql)}">${S(B.sql)}</span>
288
+ <div class="query-meta">
289
+ ${Z}${K}${$}
290
+ <span class="query-time ${Q?"slow":""}">${B.duration.toFixed(1)}ms</span>
291
+ </div>
292
+ </div>
293
+ </div>`}).join("");return`<div class="devtools-pane" data-pane="queries">${A}<div class="query-list">${U}</div></div>`}function cB(O){let E=O.cacheHits+O.cacheMisses;if(E===0)return`<div class="devtools-pane" data-pane="cache"><div class="empty-state">${F.cache}<span>No cache activity</span></div></div>`;let A=(O.cacheHits/E*100).toFixed(0);return`
294
+ <div class="devtools-pane" data-pane="cache">
295
+ <div class="cache-stats">
296
+ <div class="cache-stat">
297
+ <div class="cache-value hit">${O.cacheHits}</div>
298
+ <div class="cache-label">Cache Hits</div>
299
+ </div>
300
+ <div class="cache-stat">
301
+ <div class="cache-value miss">${O.cacheMisses}</div>
302
+ <div class="cache-label">Cache Misses</div>
303
+ </div>
304
+ <div class="cache-stat">
305
+ <div class="cache-value">${A}%</div>
306
+ <div class="cache-label">Hit Rate</div>
307
+ </div>
308
+ </div>
309
+ </div>`}function sB(O){if(O.warnings.length===0)return`<div class="devtools-pane" data-pane="warnings"><div class="empty-state">${F.warning}<span>No warnings</span></div></div>`;return`<div class="devtools-pane" data-pane="warnings"><div class="warning-list">${O.warnings.map((A)=>`
310
+ <div class="warning-item">
311
+ <span class="warning-icon">${F.warning}</span>
312
+ <span class="warning-text">${S(A)}</span>
313
+ </div>
314
+ `).join("")}</div></div>`}function iB(O,E,A){return`
315
+ (function() {
316
+ var root = document.getElementById('${O}');
317
+ if (!root) return;
318
+
319
+ // Tab switching
320
+ root.querySelectorAll('.devtools-tab').forEach(function(tab) {
321
+ tab.addEventListener('click', function() {
322
+ root.querySelectorAll('.devtools-tab').forEach(function(t) { t.classList.remove('active'); });
323
+ root.querySelectorAll('.devtools-pane').forEach(function(p) { p.classList.remove('active'); });
324
+ tab.classList.add('active');
325
+ var pane = root.querySelector('[data-pane="' + tab.dataset.tab + '"]');
326
+ if (pane) pane.classList.add('active');
327
+ });
328
+ });
329
+
330
+ // Tree expand/collapse
331
+ root.querySelectorAll('.tree-row.expandable').forEach(function(row) {
332
+ row.addEventListener('click', function() {
333
+ row.parentElement.classList.toggle('open');
334
+ });
335
+ });
336
+
337
+ // Dock position switching
338
+ root.querySelectorAll('[data-dock]').forEach(function(btn) {
339
+ btn.addEventListener('click', function() {
340
+ root.dataset.position = btn.dataset.dock;
341
+ });
342
+ });
343
+
344
+ // Resize functionality
345
+ var resize = root.querySelector('.devtools-resize');
346
+ var panel = root.querySelector('.devtools-panel');
347
+ if (resize && panel) {
348
+ var isResizing = false;
349
+ var startY, startX, startHeight, startWidth;
350
+
351
+ resize.addEventListener('mousedown', function(e) {
352
+ isResizing = true;
353
+ startY = e.clientY;
354
+ startX = e.clientX;
355
+ startHeight = panel.offsetHeight;
356
+ startWidth = panel.offsetWidth;
357
+ document.body.style.cursor = root.dataset.position === 'right' ? 'ew-resize' : 'ns-resize';
358
+ e.preventDefault();
359
+ });
360
+
361
+ document.addEventListener('mousemove', function(e) {
362
+ if (!isResizing) return;
363
+ if (root.dataset.position === 'bottom') {
364
+ var newHeight = startHeight - (e.clientY - startY);
365
+ if (newHeight > 100 && newHeight < window.innerHeight * 0.8) {
366
+ panel.style.height = newHeight + 'px';
367
+ }
368
+ } else if (root.dataset.position === 'right') {
369
+ var newWidth = startWidth - (e.clientX - startX);
370
+ if (newWidth > 200 && newWidth < window.innerWidth * 0.6) {
371
+ panel.style.width = newWidth + 'px';
372
+ }
373
+ }
374
+ });
375
+
376
+ document.addEventListener('mouseup', function() {
377
+ isResizing = false;
378
+ document.body.style.cursor = '';
379
+ });
380
+ }
381
+ })();`}function S(O){return String(O).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}x();e();f();OO();y();EO();import*as BE from"path";var AE=/<[^>]+>|:[a-zA-Z_]+|\(\?P<[^>]+>\[[^\]]+\]\)/g;class PO{options;runtime;templateCache=new Map;routes=new Map;cacheHits=0;cacheMisses=0;constructor(O={}){this.options={templates:O.templates??"./templates",autoescape:O.autoescape??!0,filters:O.filters??{},globals:O.globals??{},urlResolver:O.urlResolver??this.defaultUrlResolver.bind(this),staticResolver:O.staticResolver??this.defaultStaticResolver.bind(this),cache:O.cache??!0,cacheMaxSize:O.cacheMaxSize??100,extensions:O.extensions??[".html",".jinja",".jinja2",""],debug:O.debug??!1,debugOptions:O.debugOptions??{},timezone:O.timezone??void 0},this.runtime=new z({autoescape:this.options.autoescape,filters:this.options.filters,globals:this.options.globals,urlResolver:this.options.urlResolver,staticResolver:this.options.staticResolver,templateLoader:this.loadTemplate.bind(this),timezone:this.options.timezone})}async render(O,E={}){if(this.options.debug)return this.renderWithDebug(O,E);let A=await this.loadTemplate(O);return this.runtime.render(A,E)}async renderString(O,E={}){if(this.options.debug)return this.renderStringWithDebug(O,E);let A=this.compile(O);return this.runtime.render(A,E)}async renderWithDebug(O,E){let A=p();A.captureContext(E),A.addTemplate(O,"root"),A.setMode("runtime"),A.startRender();let U=await this.loadTemplate(O),B=this.runtime.render(U,E);if(B&&typeof B.then==="function")B=await B;A.endRender();let Q=c();return this.injectDebugPanel(String(B||""),Q)}async renderStringWithDebug(O,E){let A=p();A.captureContext(E),A.setMode("runtime"),A.startRender();let U=this.compile(O),B=this.runtime.render(U,E);if(B&&typeof B.then==="function")B=await B;A.endRender();let Q=c();return this.injectDebugPanel(String(B||""),Q)}injectDebugPanel(O,E){if(!O||typeof O!=="string")return O||"";if(!(O.includes("<html")||O.includes("<body")||O.includes("<!DOCTYPE")))return O;let U=s(E,this.options.debugOptions);if(O.includes("</body>"))return O.replace("</body>",`${U}</body>`);return O+U}compile(O){let A=new q(O).tokenize();return new h(A,O).parse()}async loadTemplate(O){if(this.options.cache&&this.templateCache.has(O)){this.cacheHits++;let B=this.templateCache.get(O);return this.templateCache.delete(O),this.templateCache.set(O,B),B}this.cacheMisses++;let E=await this.resolveTemplatePath(O);if(!E)throw Error(`Template not found: ${O}`);let A=await Bun.file(E).text(),U=this.compile(A);if(this.options.cache){while(this.templateCache.size>=this.options.cacheMaxSize){let B=this.templateCache.keys().next().value;if(B)this.templateCache.delete(B)}this.templateCache.set(O,U)}return U}clearCache(){this.templateCache.clear(),this.cacheHits=0,this.cacheMisses=0}cacheSize(){return this.templateCache.size}cacheStats(){let O=this.cacheHits+this.cacheMisses;return{size:this.templateCache.size,maxSize:this.options.cacheMaxSize,hits:this.cacheHits,misses:this.cacheMisses,hitRate:O>0?this.cacheHits/O*100:0}}addFilter(O,E){this.runtime.addFilter(O,E)}addGlobal(O,E){this.runtime.addGlobal(O,E)}addUrl(O,E){this.routes.set(O,E)}addUrls(O){for(let[E,A]of Object.entries(O))this.routes.set(E,A)}async resolveTemplatePath(O){let E=BE.resolve(this.options.templates,O);for(let A of this.options.extensions){let U=E+A;if(await Bun.file(U).exists())return U}return null}defaultUrlResolver(O,E,A){let U=this.routes.get(O);if(!U)return console.warn(`URL pattern not found: ${O}`),`#${O}`;let B=U;for(let J in A){let Z=encodeURIComponent(String(A[J]));B=B.replaceAll(`:${J}`,Z),B=B.replaceAll(`<${J}>`,Z),B=B.replaceAll(`(?P<${J}>[^/]+)`,Z)}let Q=0;return AE.lastIndex=0,B=B.replace(AE,()=>{if(Q<E.length)return encodeURIComponent(String(E[Q++]));return""}),B}defaultStaticResolver(O){return`/static/${O}`}}function UE(O,E={}){let U=new q(O).tokenize(),Q=new h(U,O).parse();return eO(Q,E)}var k=new Map;function aB(O={}){let{root:E="./views",extension:A=".html",engine:U="jinja2",debug:B=!1,cache:Q=!1,globals:J={},layout:Z,contentVar:K="content"}=O,$=new PO({debug:B}),Y=async(I)=>{switch(I){case"handlebars":return(await Promise.resolve().then(() => (WO(),RO))).render;case"liquid":return(await Promise.resolve().then(() => (CO(),HO))).render;case"twig":return(await Promise.resolve().then(() => (qO(),LO))).render;default:return(D,M)=>$.renderString(D,M)}},X=async(I,D={})=>{let M=hO(I)||A,W=hO(I)?I:`${I}${M}`,H=YE(E,W),j=`${U}:${H}`,b;if(Q&&k.has(j))b=await k.get(j)({...J,...D});else{let P=await JE(H,"utf-8"),$O=await Y(U);if(Q){let w;switch(U){case"handlebars":{let{compile:V}=await Promise.resolve().then(() => (WO(),RO)),L=V(P);w=async(g)=>L(g);break}case"liquid":{let{compile:V}=await Promise.resolve().then(() => (CO(),HO)),L=V(P);w=async(g)=>L(g);break}case"twig":{let{compile:V}=await Promise.resolve().then(() => (qO(),LO)),L=V(P);w=async(g)=>L(g);break}default:{let V=UE(P);w=async(L)=>V(L)}}k.set(j,w),b=await w({...J,...D})}else b=await $O(P,{...J,...D})}if(Z){let P=YE(E,hO(Z)?Z:`${Z}${A}`),$O=await JE(P,"utf-8");b=await(await Y(U))($O,{...J,...D,[K]:b})}return new Response(b,{headers:{"Content-Type":"text/html; charset=utf-8"}})};return(I)=>I.derive(()=>({render:X}))}function rU(){k.clear()}function lU(){return{size:k.size,keys:Array.from(k.keys())}}var oU=aB;export{lU as getCacheStats,oU as default,rU as clearCache,aB as binja};