@sqg/sqg 0.17.4 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +2658 -2547
- package/dist/sqg.mjs +150 -39
- package/dist/templates/better-sqlite3.hbs +3 -1
- package/dist/templates/libsql.hbs +4 -2
- package/dist/templates/node-sqlite.hbs +4 -2
- package/dist/templates/turso.hbs +4 -2
- package/dist/templates/typescript-duckdb.hbs +2 -0
- package/dist/ui-public/assets/index-C22caD-U.js +45 -0
- package/dist/ui-public/assets/index-DQWvi9s-.css +1 -0
- package/dist/ui-public/index.html +2 -2
- package/dist/ui-server.mjs +24 -25
- package/package.json +2 -2
- package/dist/ui-public/assets/index-Bt3dXI_J.js +0 -45
- package/dist/ui-public/assets/index-DHD4h34g.css +0 -2
package/dist/sqg.mjs
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import { exit } from "node:process";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import consola, { LogLevels } from "consola";
|
|
5
|
-
import updateNotifier from "update-notifier";
|
|
6
5
|
import pc from "picocolors";
|
|
6
|
+
import updateNotifier from "update-notifier";
|
|
7
7
|
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
8
8
|
import * as clack from "@clack/prompts";
|
|
9
9
|
import { randomUUID } from "node:crypto";
|
|
@@ -18,11 +18,11 @@ import Handlebars from "handlebars";
|
|
|
18
18
|
import { z } from "zod";
|
|
19
19
|
import { DuckDBEnumType, DuckDBInstance, DuckDBListType, DuckDBMapType, DuckDBStructType } from "@duckdb/node-api";
|
|
20
20
|
import { LRParser } from "@lezer/lr";
|
|
21
|
-
import { isNotNil, sortBy } from "es-toolkit";
|
|
22
21
|
import { PostgreSqlContainer } from "@testcontainers/postgresql";
|
|
23
22
|
import { Client } from "pg";
|
|
24
23
|
import types from "pg-types";
|
|
25
24
|
import BetterSqlite3 from "better-sqlite3";
|
|
25
|
+
import { isNotNil } from "es-toolkit";
|
|
26
26
|
import prettier from "prettier/standalone";
|
|
27
27
|
import prettierPluginJava from "prettier-plugin-java";
|
|
28
28
|
import { execSync } from "node:child_process";
|
|
@@ -220,7 +220,8 @@ const SQL_SYNTAX_REFERENCE = `
|
|
|
220
220
|
SQL Annotation Syntax:
|
|
221
221
|
-- QUERY <name> [:one] [:pluck] Select query (returns rows)
|
|
222
222
|
-- EXEC <name> [:batch] Execute statement (INSERT/UPDATE/DELETE)
|
|
223
|
-
--
|
|
223
|
+
-- BASELINE <name> Schema created outside SQG (runs before migrations, not tracked)
|
|
224
|
+
-- MIGRATE <name> Schema migration (runs in source order; name is any identifier, e.g. "1" or "add_email")
|
|
224
225
|
-- TESTDATA <name> Test data setup (not generated)
|
|
225
226
|
-- TABLE <name> :appender Table for bulk insert appender (DuckDB, PostgreSQL)
|
|
226
227
|
|
|
@@ -716,21 +717,21 @@ async function initProject(options) {
|
|
|
716
717
|
//#region src/parser/sql-parser.ts
|
|
717
718
|
const parser = LRParser.deserialize({
|
|
718
719
|
version: 14,
|
|
719
|
-
states: "&
|
|
720
|
-
stateData: "&
|
|
721
|
-
goto: "
|
|
722
|
-
nodeNames: "⚠ File QueryBlock BlockCommentStartSpecial Name Modifiers Config LineCommentStartSpecial SetVarLine Value StringLiteral StringLiteralSingle SQLText SQLBlock
|
|
723
|
-
maxTerm:
|
|
720
|
+
states: "&fOVQPOOOOQO'#C`'#C`OOQO'#Cn'#CnOVQPOOOhQPO'#CyOmQPO'#C{OrQPO'#CxO!]QQO'#CaOOQO'#Co'#CoQ!jQPOOOOQO-E6l-E6lO!rQSO,59eO!}QPO,59gOOQO'#Cq'#CqO#VQQO,59dOOQO'#DO'#DOO#zQQO'#ClOOQO,58{,58{OOQO-E6m-E6mOOQO'#Cp'#CpO!rQSO1G/PO!uQSO1G/POOQO'#Ce'#CeOOQO1G/P1G/PO$[QPO1G/ROOQO-E6o-E6oO$dQPO'#CgOOQO'#Cr'#CrO$iQQO1G/OOOQO'#Cs'#CsO%ZQQO,59WOOQO-E6n-E6nO!uQSO7+$kOOQO7+$k7+$kO%kQPO,59ROOQO-E6p-E6pOOQO-E6q-E6qOOQO<<HV<<HVO%pQQO1G.mOOQO'#Ch'#ChOrQPO7+$XO%{QQO<<Gs",
|
|
721
|
+
stateData: "&}~OjOS~OQQORQOUSOYTOkPO~OVZO~OV[O~Ok]O~OQ_OR_O]_O^_O__Oa_O~OU`PY`Ph`P~PwOUSOYTO~OWcOk]OnfO~OWcOkoa~Ok]OpjOQlaRlaUlaYla]la^la_laalahla~OkPOU`XY`Xh`X~PwOWcOkoi~OVrO~OpjOQliRliUliYli]li^li_lialihli~OkPOU`aY`ah`a~PwOqvO~O]wO^wO_wO~Ok]OQZyRZyUZyYZy]Zy^Zy_ZyaZyhZypZy~OUapRj^Wn]YQ_~",
|
|
722
|
+
goto: "$PsPPPPt|PPP!RP!]!aPPP!dP!g!m!t#O#b#hPPPP#n#sP#sPP#xSQORTm`nVWORXQgZSqdeRupTk^lRxvRaVQRORYRSXORRbXQdZQh[TodhQ^UQeZWi^epyQpdRyxQl^RslQn`RtnVVORXVUORXQ`VTm`n",
|
|
723
|
+
nodeNames: "⚠ File LineComment BlockComment BR QueryBlock BlockCommentStartSpecial Name Modifiers Config LineCommentStartSpecial SetVarLine Value StringLiteral StringLiteralSingle SQLText SQLBlock VarRef",
|
|
724
|
+
maxTerm: 34,
|
|
724
725
|
skippedNodes: [0],
|
|
725
|
-
repeatNodeCount:
|
|
726
|
-
tokenData: "$3b~RqOX#YXY'wYZ(iZ]#Y]^$W^p#Ypq'wqr#Yrs(}st#Ytu6^uw#Ywx9[xz#Yz{%_{}#Y}!OKi!O!P#Y!P!Q#%p!Q![$)l![!]$+U!]!_#Y!_!`$.U!`!b#Y!b!c$/U!c!}$)l!}#R#Y#R#S$)l#S#T#Y#T#o$)l#o;'S#Y;'S;=`'q<%lO#YU#_][QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YS$ZTOz$Wz{$j{;'S$W;'S;=`%X<%lO$WS$mVOz$Wz{$j{!P$W!P!Q%S!Q;'S$W;'S;=`%X<%lO$WS%XOmSS%[P;=`<%l$WU%d_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!P#Y!P!Q&c!Q;'S#Y;'S;=`'q<%lO#YU&jVmS[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'UV[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'nP;=`<%l'PU'tP;=`<%l#Y~'|Xi~OX$WXY'wYp$Wpq'wqz$Wz{$j{;'S$W;'S;=`%X<%lO$W~(nTl~Oz$Wz{$j{;'S$W;'S;=`%X<%lO$WU)Sb[QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U*_ZOY*[YZ$WZr*[rs+Qsz*[z{+f{#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U+VTYQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU+i]OY*[YZ$WZr*[rs+Qsz*[z{+f{!P*[!P!Q,b!Q#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U,gWmSOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-qOYQQ-tTOY-PYZ-PZ;'S-P;'S;=`.T<%lO-PQ.WP;=`<%l-PU.^VOY*[YZ*[Zz*[z{+f{;'S*[;'S;=`.s<%lO*[U.vP;=`<%l*[U/Q]YQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU0Od[QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{!P(}!P!Q1^!Q#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U1e_mS[QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ2i_[QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ3oVYQ[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ4Z[[QOX2dXY-PYZ-PZ]2d]^-P^p2dpq-Pqt2dtu-Pu;'S2d;'S;=`5P<%lO2dQ5SP;=`<%l2dU5[^[QOX(}XY*[YZ*[Z](}]^*[^p(}pq*[qt(}tu*[uz(}z{/y{;'S(};'S;=`6W<%lO(}U6ZP;=`<%l(}U6cV[QOz$Wz{$j{#o$W#o#p6x#p;'S$W;'S;=`%X<%lO$WU6{]Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o;'S$W;'S;=`%X<%lO$WU7w_Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o#q$W#q#r8v#r;'S$W;'S;=`%X<%lO$WU8{T`QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU9ab[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[U:lZOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU;dTZQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU;v]OY:iYZ$WZw:iwx;_xz:iz{;s{!P:i!P!Q<o!Q#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU<tWmSOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q=aWOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>OOZQQ>RXOY=^YZ=^Zw=^wx>nx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>sWZQOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q?`P;=`<%l=^U?fZOY:iYZ:iZw:iwx@Xxz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU@^ZZQOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iUASP;=`<%l:iUA^]ZQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YUB[d[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{!P9[!P!QCj!Q#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UCq_mS[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQDu_[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQE{VZQ[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQFg`[QOXDpXY=^YZ=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxGix#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQGp_ZQ[QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQHrP;=`<%lDpUHzb[QOX9[XY:iYZ:iZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxJSxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UJZbZQ[QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UKfP;=`<%l9[VKn_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{}#Y}!OLm!O;'S#Y;'S;=`'q<%lO#YVLtf_Q[QOXNYXY!&vYZ$WZ]NY]^! ]^pNYpq!&vqtNYtu! ]uzNYz{!#k{!gNY!g!h!8V!h!oNY!o!p!<w!p!sNY!s!t!DP!t!vNY!v!w!Hu!w;'SNY;'S;=`!&p<%lONYUNa^_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{;'SNY;'S;=`!&p<%lONYU! bV_QOY! ]YZ$WZz! ]z{! w{;'S! ];'S;=`!#e<%lO! ]U! |X_QOY! ]YZ$WZz! ]z{! w{!P! ]!P!Q!!i!Q;'S! ];'S;=`!#e<%lO! ]U!!pSmS_QOY!!|Z;'S!!|;'S;=`!#_<%lO!!|Q!#RS_QOY!!|Z;'S!!|;'S;=`!#_<%lO!!|Q!#bP;=`<%l!!|U!#hP;=`<%l! ]U!#r`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!PNY!P!Q!$t!Q;'SNY;'S;=`!&p<%lONYU!$}ZmS_Q[QOX!%pXY!!|Z]!%p]^!!|^p!%ppq!!|qt!%ptu!!|u;'S!%p;'S;=`!&j<%lO!%pQ!%wZ_Q[QOX!%pXY!!|Z]!%p]^!!|^p!%ppq!!|qt!%ptu!!|u;'S!%p;'S;=`!&j<%lO!%pQ!&mP;=`<%l!%pU!&sP;=`<%lNYV!&{b_QOX! ]XY!&vYZ$WZp! ]pq!&vqz! ]z{! w{!g! ]!g!h!(T!h!o! ]!o!p!*u!p!s! ]!s!t!.}!t!v! ]!v!w!1s!w;'S! ];'S;=`!#e<%lO! ]V!(YX_QOY! ]YZ$WZz! ]z{! w{!z! ]!z!{!(u!{;'S! ];'S;=`!#e<%lO! ]V!(zX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!)g!h;'S! ];'S;=`!#e<%lO! ]V!)lX_QOY! ]YZ$WZz! ]z{! w{!e! ]!e!f!*X!f;'S! ];'S;=`!#e<%lO! ]V!*`VVR_QOY! ]YZ$WZz! ]z{! w{;'S! ];'S;=`!#e<%lO! ]V!*zX_QOY! ]YZ$WZz! ]z{! w{!k! ]!k!l!+g!l;'S! ];'S;=`!#e<%lO! ]V!+lX_QOY! ]YZ$WZz! ]z{! w{!i! ]!i!j!,X!j;'S! ];'S;=`!#e<%lO! ]V!,^X_QOY! ]YZ$WZz! ]z{! w{!t! ]!t!u!,y!u;'S! ];'S;=`!#e<%lO! ]V!-OX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!-k!d;'S! ];'S;=`!#e<%lO! ]V!-pX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!.]!w;'S! ];'S;=`!#e<%lO! ]V!.bX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!*X!h;'S! ];'S;=`!#e<%lO! ]V!/SX_QOY! ]YZ$WZz! ]z{! w{!w! ]!w!x!/o!x;'S! ];'S;=`!#e<%lO! ]V!/tX_QOY! ]YZ$WZz! ]z{! w{!g! ]!g!h!0a!h;'S! ];'S;=`!#e<%lO! ]V!0fX_QOY! ]YZ$WZz! ]z{! w{!t! ]!t!u!1R!u;'S! ];'S;=`!#e<%lO! ]V!1WX_QOY! ]YZ$WZz! ]z{! w{!{! ]!{!|!*X!|;'S! ];'S;=`!#e<%lO! ]V!1xZ_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!2k!d!g! ]!g!h!3}!h;'S! ];'S;=`!#e<%lO! ]V!2pX_QOY! ]YZ$WZz! ]z{! w{!d! ]!d!e!3]!e;'S! ];'S;=`!#e<%lO! ]V!3bX_QOY! ]YZ$WZz! ]z{! w{!n! ]!n!o!.]!o;'S! ];'S;=`!#e<%lO! ]V!4SX_QOY! ]YZ$WZz! ]z{! w{!u! ]!u!v!4o!v;'S! ];'S;=`!#e<%lO! ]V!4tX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!5a!w;'S! ];'S;=`!#e<%lO! ]V!5fX_QOY! ]YZ$WZz! ]z{! w{!f! ]!f!g!6R!g;'S! ];'S;=`!#e<%lO! ]V!6WX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!6s!d;'S! ];'S;=`!#e<%lO! ]V!6xX_QOY! ]YZ$WZz! ]z{! w{!v! ]!v!w!7e!w;'S! ];'S;=`!#e<%lO! ]V!7jX_QOY! ]YZ$WZz! ]z{! w{!c! ]!c!d!*X!d;'S! ];'S;=`!#e<%lO! ]V!8^`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!zNY!z!{!9`!{;'SNY;'S;=`!&p<%lONYV!9g`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!:i!h;'SNY;'S;=`!&p<%lONYV!:p`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!eNY!e!f!;r!f;'SNY;'S;=`!&p<%lONYV!;{^VR_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{;'SNY;'S;=`!&p<%lONYV!=O`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!kNY!k!l!>Q!l;'SNY;'S;=`!&p<%lONYV!>X`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!iNY!i!j!?Z!j;'SNY;'S;=`!&p<%lONYV!?b`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!tNY!t!u!@d!u;'SNY;'S;=`!&p<%lONYV!@k`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!Am!d;'SNY;'S;=`!&p<%lONYV!At`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w!Bv!w;'SNY;'S;=`!&p<%lONYV!B}`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!;r!h;'SNY;'S;=`!&p<%lONYV!DW`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!wNY!w!x!EY!x;'SNY;'S;=`!&p<%lONYV!Ea`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!gNY!g!h!Fc!h;'SNY;'S;=`!&p<%lONYV!Fj`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!tNY!t!u!Gl!u;'SNY;'S;=`!&p<%lONYV!Gs`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!{NY!{!|!;r!|;'SNY;'S;=`!&p<%lONYV!H|b_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!JU!d!gNY!g!h!Lh!h;'SNY;'S;=`!&p<%lONYV!J]`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!dNY!d!e!K_!e;'SNY;'S;=`!&p<%lONYV!Kf`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!nNY!n!o!Bv!o;'SNY;'S;=`!&p<%lONYV!Lo`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!uNY!u!v!Mq!v;'SNY;'S;=`!&p<%lONYV!Mx`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w!Nz!w;'SNY;'S;=`!&p<%lONYV# R`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!fNY!f!g#!T!g;'SNY;'S;=`!&p<%lONYV#![`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d##^!d;'SNY;'S;=`!&p<%lONYV##e`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!vNY!v!w#$g!w;'SNY;'S;=`!&p<%lONYV#$n`_Q[QOXNYXY! ]YZ$WZ]NY]^! ]^pNYpq! ]qtNYtu! ]uzNYz{!#k{!cNY!c!d!;r!d;'SNY;'S;=`!&p<%lONYV#%u][QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{#&n{;'S#Y;'S;=`'q<%lO#YV#&sh[QOX#(_XY#,`YZ#,`Z]#(_]^#)]^p#(_pq#,`qt#(_tu#)]uz#(_z{#*f{!P#(_!P!Q#9m!Q!g#(_!g!h#>j!h!o#(_!o!p#Bv!p!s#(_!s!t#I`!t!v#(_!v!w#Mp!w;'S#(_;'S;=`#,Y<%lO#(_U#(d][QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{;'S#(_;'S;=`#,Y<%lO#(_U#)`TOz#)]z{#)o{;'S#)];'S;=`#*`<%lO#)]U#)rVOz#)]z{#)o{!P#)]!P!Q#*X!Q;'S#)];'S;=`#*`<%lO#)]U#*`O^QmSU#*cP;=`<%l#)]U#*k_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!P#(_!P!Q#+j!Q;'S#(_;'S;=`#,Y<%lO#(_U#+sV^QmS[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PU#,]P;=`<%l#(_V#,cbOX#)]XY#,`YZ#,`Zp#)]pq#,`qz#)]z{#)o{!g#)]!g!h#-k!h!o#)]!o!p#/k!p!s#)]!s!t#2q!t!v#)]!v!w#4u!w;'S#)];'S;=`#*`<%lO#)]V#-nVOz#)]z{#)o{!z#)]!z!{#.T!{;'S#)];'S;=`#*`<%lO#)]V#.WVOz#)]z{#)o{!g#)]!g!h#.m!h;'S#)];'S;=`#*`<%lO#)]V#.pVOz#)]z{#)o{!e#)]!e!f#/V!f;'S#)];'S;=`#*`<%lO#)]V#/[TRROz#)]z{#)o{;'S#)];'S;=`#*`<%lO#)]V#/nVOz#)]z{#)o{!k#)]!k!l#0T!l;'S#)];'S;=`#*`<%lO#)]V#0WVOz#)]z{#)o{!i#)]!i!j#0m!j;'S#)];'S;=`#*`<%lO#)]V#0pVOz#)]z{#)o{!t#)]!t!u#1V!u;'S#)];'S;=`#*`<%lO#)]V#1YVOz#)]z{#)o{!c#)]!c!d#1o!d;'S#)];'S;=`#*`<%lO#)]V#1rVOz#)]z{#)o{!v#)]!v!w#2X!w;'S#)];'S;=`#*`<%lO#)]V#2[VOz#)]z{#)o{!g#)]!g!h#/V!h;'S#)];'S;=`#*`<%lO#)]V#2tVOz#)]z{#)o{!w#)]!w!x#3Z!x;'S#)];'S;=`#*`<%lO#)]V#3^VOz#)]z{#)o{!g#)]!g!h#3s!h;'S#)];'S;=`#*`<%lO#)]V#3vVOz#)]z{#)o{!t#)]!t!u#4]!u;'S#)];'S;=`#*`<%lO#)]V#4`VOz#)]z{#)o{!{#)]!{!|#/V!|;'S#)];'S;=`#*`<%lO#)]V#4xXOz#)]z{#)o{!c#)]!c!d#5e!d!g#)]!g!h#6g!h;'S#)];'S;=`#*`<%lO#)]V#5hVOz#)]z{#)o{!d#)]!d!e#5}!e;'S#)];'S;=`#*`<%lO#)]V#6QVOz#)]z{#)o{!n#)]!n!o#2X!o;'S#)];'S;=`#*`<%lO#)]V#6jVOz#)]z{#)o{!u#)]!u!v#7P!v;'S#)];'S;=`#*`<%lO#)]V#7SVOz#)]z{#)o{!v#)]!v!w#7i!w;'S#)];'S;=`#*`<%lO#)]V#7lVOz#)]z{#)o{!f#)]!f!g#8R!g;'S#)];'S;=`#*`<%lO#)]V#8UVOz#)]z{#)o{!c#)]!c!d#8k!d;'S#)];'S;=`#*`<%lO#)]V#8nVOz#)]z{#)o{!v#)]!v!w#9T!w;'S#)];'S;=`#*`<%lO#)]V#9WVOz#)]z{#)o{!c#)]!c!d#/V!d;'S#)];'S;=`#*`<%lO#)]U#9t]mS[QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{;'S#:m;'S;=`#>d<%lO#:mQ#:r][QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{;'S#:m;'S;=`#>d<%lO#:mQ#;nTOz#;kz{#;}{;'S#;k;'S;=`#<l<%lO#;kQ#<QVOz#;kz{#;}{!P#;k!P!Q#<g!Q;'S#;k;'S;=`#<l<%lO#;kQ#<lO^QQ#<oP;=`<%l#;kQ#<w_[QOX#:mXZ#;kZ]#:m]^#;k^p#:mpq#;kqt#:mtu#;kuz#:mz{#<r{!P#:m!P!Q#=v!Q;'S#:m;'S;=`#>d<%lO#:mQ#=}V^Q[QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ#>gP;=`<%l#:mV#>o_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!z#(_!z!{#?n!{;'S#(_;'S;=`#,Y<%lO#(_V#?s_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#@r!h;'S#(_;'S;=`#,Y<%lO#(_V#@w_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!e#(_!e!f#Av!f;'S#(_;'S;=`#,Y<%lO#(_V#A}]RR[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{;'S#(_;'S;=`#,Y<%lO#(_V#B{_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!k#(_!k!l#Cz!l;'S#(_;'S;=`#,Y<%lO#(_V#DP_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!i#(_!i!j#EO!j;'S#(_;'S;=`#,Y<%lO#(_V#ET_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!t#(_!t!u#FS!u;'S#(_;'S;=`#,Y<%lO#(_V#FX_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#GW!d;'S#(_;'S;=`#,Y<%lO#(_V#G]_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w#H[!w;'S#(_;'S;=`#,Y<%lO#(_V#Ha_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#Av!h;'S#(_;'S;=`#,Y<%lO#(_V#Ie_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!w#(_!w!x#Jd!x;'S#(_;'S;=`#,Y<%lO#(_V#Ji_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!g#(_!g!h#Kh!h;'S#(_;'S;=`#,Y<%lO#(_V#Km_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!t#(_!t!u#Ll!u;'S#(_;'S;=`#,Y<%lO#(_V#Lq_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!{#(_!{!|#Av!|;'S#(_;'S;=`#,Y<%lO#(_V#Mua[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#Nz!d!g#(_!g!h$#S!h;'S#(_;'S;=`#,Y<%lO#(_V$ P_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!d#(_!d!e$!O!e;'S#(_;'S;=`#,Y<%lO#(_V$!T_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!n#(_!n!o#H[!o;'S#(_;'S;=`#,Y<%lO#(_V$#X_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!u#(_!u!v$$W!v;'S#(_;'S;=`#,Y<%lO#(_V$$]_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w$%[!w;'S#(_;'S;=`#,Y<%lO#(_V$%a_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!f#(_!f!g$&`!g;'S#(_;'S;=`#,Y<%lO#(_V$&e_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d$'d!d;'S#(_;'S;=`#,Y<%lO#(_V$'i_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!v#(_!v!w$(h!w;'S#(_;'S;=`#,Y<%lO#(_V$(m_[QOX#(_XZ#)]Z]#(_]^#)]^p#(_pq#)]qt#(_tu#)]uz#(_z{#*f{!c#(_!c!d#Av!d;'S#(_;'S;=`#,Y<%lO#(_V$)seSP[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$)l![!c#Y!c!}$)l!}#R#Y#R#S$)l#S#T#Y#T#o$)l#o;'S#Y;'S;=`'q<%lO#Y~$+Ze[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$,l![!c#Y!c!}$,l!}#R#Y#R#S$,l#S#T#Y#T#o$,l#o;'S#Y;'S;=`'q<%lO#Y~$,seT~[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$,l![!c#Y!c!}$,l!}#R#Y#R#S$,l#S#T#Y#T#o$,l#o;'S#Y;'S;=`'q<%lO#YV$.]]pP[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU$/Z_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#g#Y#g#h$0Y#h;'S#Y;'S;=`'q<%lO#YU$0__[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#X#Y#X#Y$1^#Y;'S#Y;'S;=`'q<%lO#YU$1c_[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#h#Y#h#i$2b#i;'S#Y;'S;=`'q<%lO#YU$2i]oQ[QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#Y",
|
|
726
|
+
repeatNodeCount: 6,
|
|
727
|
+
tokenData: "$KR~RqOX#YXY'wYZ(iZ]#Y]^$W^p#Ypq'wqr#Yrs(}st#Ytu6^uw#Ywx9[xz#Yz{%_{}#Y}!OKi!O!P#Y!P!Q#2P!Q![$A]![!]$Bu!]!_#Y!_!`$Eu!`!b#Y!b!c$Fu!c!}$A]!}#R#Y#R#S$A]#S#T#Y#T#o$A]#o;'S#Y;'S;=`'q<%lO#YU#_]_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YS$ZTOz$Wz{$j{;'S$W;'S;=`%X<%lO$WS$mVOz$Wz{$j{!P$W!P!Q%S!Q;'S$W;'S;=`%X<%lO$WS%XOnSS%[P;=`<%l$WU%d__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!P#Y!P!Q&c!Q;'S#Y;'S;=`'q<%lO#YU&jVnS_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'UV_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ'nP;=`<%l'PU'tP;=`<%l#Y~'|Xj~OX$WXY'wYp$Wpq'wqz$Wz{$j{;'S$W;'S;=`%X<%lO$W~(nTk~Oz$Wz{$j{;'S$W;'S;=`%X<%lO$WU)Sb_QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U*_ZOY*[YZ$WZr*[rs+Qsz*[z{+f{#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U+VT]QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU+i]OY*[YZ$WZr*[rs+Qsz*[z{+f{!P*[!P!Q,b!Q#O*[#O#P.Z#P;'S*[;'S;=`.s<%lO*[U,gWnSOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-SWOY-PZr-Prs-ls#O-P#O#P-q#P;'S-P;'S;=`.T<%lO-PQ-qO]QQ-tTOY-PYZ-PZ;'S-P;'S;=`.T<%lO-PQ.WP;=`<%l-PU.^VOY*[YZ*[Zz*[z{+f{;'S*[;'S;=`.s<%lO*[U.vP;=`<%l*[U/Q]]Q_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU0Od_QOX(}XY*[YZ$WZ](}]^*[^p(}pq*[qr(}rs.yst(}tu*[uz(}z{/y{!P(}!P!Q1^!Q#O(}#O#P5V#P;'S(};'S;=`6W<%lO(}U1e_nS_QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ2i__QOX2dXY-PZ]2d]^-P^p2dpq-Pqr2drs3hst2dtu-Pu#O2d#O#P4U#P;'S2d;'S;=`5P<%lO2dQ3oV]Q_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQ4Z[_QOX2dXY-PYZ-PZ]2d]^-P^p2dpq-Pqt2dtu-Pu;'S2d;'S;=`5P<%lO2dQ5SP;=`<%l2dU5[^_QOX(}XY*[YZ*[Z](}]^*[^p(}pq*[qt(}tu*[uz(}z{/y{;'S(};'S;=`6W<%lO(}U6ZP;=`<%l(}U6cV_QOz$Wz{$j{#o$W#o#p6x#p;'S$W;'S;=`%X<%lO$WU6{]Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o;'S$W;'S;=`%X<%lO$WU7w_Oz$Wz{$j{!Q$W!Q![7t![!c$W!c!}7t!}#R$W#R#S7t#S#T$W#T#o7t#o#q$W#q#r8v#r;'S$W;'S;=`%X<%lO$WU8{TaQOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU9ab_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[U:lZOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU;dT^QOz$Wz{$j{;'S$W;'S;=`%X<%lO$WU;v]OY:iYZ$WZw:iwx;_xz:iz{;s{!P:i!P!Q<o!Q#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU<tWnSOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q=aWOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>OO^QQ>RXOY=^YZ=^Zw=^wx>nx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q>sW^QOY=^Zw=^wx=yx#O=^#O#P>O#P;'S=^;'S;=`?]<%lO=^Q?`P;=`<%l=^U?fZOY:iYZ:iZw:iwx@Xxz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iU@^Z^QOY:iYZ$WZw:iwx;_xz:iz{;s{#O:i#O#P?c#P;'S:i;'S;=`AP<%lO:iUASP;=`<%l:iUA^]^Q_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YUB[d_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{!P9[!P!QCj!Q#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UCq_nS_QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQDu__QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQE{V^Q_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PQFg`_QOXDpXY=^YZ=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxGix#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQGp_^Q_QOXDpXY=^Z]Dp]^=^^pDppq=^qtDptu=^uwDpwxEtx#ODp#O#PFb#P;'SDp;'S;=`Ho<%lODpQHrP;=`<%lDpUHzb_QOX9[XY:iYZ:iZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxJSxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UJZb^Q_QOX9[XY:iYZ$WZ]9[]^:i^p9[pq:iqt9[tu:iuw9[wxAVxz9[z{BV{#O9[#O#PHu#P;'S9[;'S;=`Kc<%lO9[UKfP;=`<%l9[VKn__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{}#Y}!OLm!O;'S#Y;'S;=`'q<%lO#YVLthQR_QOXN`XY!&|YZ$WZ]N`]^! c^pN`pq!&|qtN`tu! cuzN`z{!#q{!dN`!d!e!=`!e!gN`!g!h!Ft!h!oN`!o!p!Ja!p!sN`!s!t#!`!t!vN`!v!w#'U!w;'SN`;'S;=`!&v<%lON`VNg^QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{;'SN`;'S;=`!&v<%lON`V! hVQROY! cYZ$WZz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!!SXQROY! cYZ$WZz! cz{! }{!P! c!P!Q!!o!Q;'S! c;'S;=`!#k<%lO! cV!!vSnSQROY!#SZ;'S!#S;'S;=`!#e<%lO!#SR!#XSQROY!#SZ;'S!#S;'S;=`!#e<%lO!#SR!#hP;=`<%l!#SV!#nP;=`<%l! cV!#x`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!PN`!P!Q!$z!Q;'SN`;'S;=`!&v<%lON`V!%TZnSQR_QOX!%vXY!#SZ]!%v]^!#S^p!%vpq!#Sqt!%vtu!#Su;'S!%v;'S;=`!&p<%lO!%vR!%}ZQR_QOX!%vXY!#SZ]!%v]^!#S^p!%vpq!#Sqt!%vtu!#Su;'S!%v;'S;=`!&p<%lO!%vR!&sP;=`<%l!%vV!&yP;=`<%lN`V!'RdQROX! cXY!&|YZ$WZp! cpq!&|qz! cz{! }{!d! c!d!e!(a!e!g! c!g!h!.l!h!o! c!o!p!0p!p!s! c!s!t!4W!t!v! c!v!w!6|!w;'S! c;'S;=`!#k<%lO! cV!(fXQROY! cYZ$WZz! cz{! }{!c! c!c!d!)R!d;'S! c;'S;=`!#k<%lO! cV!)WXQROY! cYZ$WZz! cz{! }{!u! c!u!v!)s!v;'S! c;'S;=`!#k<%lO! cV!)xXQROY! cYZ$WZz! cz{! }{!g! c!g!h!*e!h;'S! c;'S;=`!#k<%lO! cV!*jXQROY! cYZ$WZz! cz{! }{!n! c!n!o!+V!o;'S! c;'S;=`!#k<%lO! cV!+[XQROY! cYZ$WZz! cz{! }{!k! c!k!l!+w!l;'S! c;'S;=`!#k<%lO! cV!+|XQROY! cYZ$WZz! cz{! }{!p! c!p!q!,i!q;'S! c;'S;=`!#k<%lO! cV!,nXQROY! cYZ$WZz! cz{! }{!g! c!g!h!-Z!h;'S! c;'S;=`!#k<%lO! cV!-`YQROX! cXY!.OYZ$WZp! cpq!.Oqz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!.VVYRQROY! cYZ$WZz! cz{! }{;'S! c;'S;=`!#k<%lO! cV!.qXQROY! cYZ$WZz! cz{! }{!z! c!z!{!/^!{;'S! c;'S;=`!#k<%lO! cV!/cXQROY! cYZ$WZz! cz{! }{!g! c!g!h!0O!h;'S! c;'S;=`!#k<%lO! cV!0TXQROY! cYZ$WZz! cz{! }{!e! c!e!f!-Z!f;'S! c;'S;=`!#k<%lO! cV!0uXQROY! cYZ$WZz! cz{! }{!k! c!k!l!1b!l;'S! c;'S;=`!#k<%lO! cV!1gXQROY! cYZ$WZz! cz{! }{!i! c!i!j!2S!j;'S! c;'S;=`!#k<%lO! cV!2XXQROY! cYZ$WZz! cz{! }{!t! c!t!u!2t!u;'S! c;'S;=`!#k<%lO! cV!2yXQROY! cYZ$WZz! cz{! }{!c! c!c!d!3f!d;'S! c;'S;=`!#k<%lO! cV!3kXQROY! cYZ$WZz! cz{! }{!v! c!v!w!,i!w;'S! c;'S;=`!#k<%lO! cV!4]XQROY! cYZ$WZz! cz{! }{!w! c!w!x!4x!x;'S! c;'S;=`!#k<%lO! cV!4}XQROY! cYZ$WZz! cz{! }{!g! c!g!h!5j!h;'S! c;'S;=`!#k<%lO! cV!5oXQROY! cYZ$WZz! cz{! }{!t! c!t!u!6[!u;'S! c;'S;=`!#k<%lO! cV!6aXQROY! cYZ$WZz! cz{! }{!{! c!{!|!-Z!|;'S! c;'S;=`!#k<%lO! cV!7RZQROY! cYZ$WZz! cz{! }{!c! c!c!d!7t!d!g! c!g!h!9W!h;'S! c;'S;=`!#k<%lO! cV!7yXQROY! cYZ$WZz! cz{! }{!d! c!d!e!8f!e;'S! c;'S;=`!#k<%lO! cV!8kXQROY! cYZ$WZz! cz{! }{!n! c!n!o!,i!o;'S! c;'S;=`!#k<%lO! cV!9]XQROY! cYZ$WZz! cz{! }{!u! c!u!v!9x!v;'S! c;'S;=`!#k<%lO! cV!9}XQROY! cYZ$WZz! cz{! }{!v! c!v!w!:j!w;'S! c;'S;=`!#k<%lO! cV!:oXQROY! cYZ$WZz! cz{! }{!f! c!f!g!;[!g;'S! c;'S;=`!#k<%lO! cV!;aXQROY! cYZ$WZz! cz{! }{!c! c!c!d!;|!d;'S! c;'S;=`!#k<%lO! cV!<RXQROY! cYZ$WZz! cz{! }{!v! c!v!w!<n!w;'S! c;'S;=`!#k<%lO! cV!<sXQROY! cYZ$WZz! cz{! }{!c! c!c!d!-Z!d;'S! c;'S;=`!#k<%lO! cV!=g`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d!>i!d;'SN`;'S;=`!&v<%lON`V!>p`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!uN`!u!v!?r!v;'SN`;'S;=`!&v<%lON`V!?y`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!@{!h;'SN`;'S;=`!&v<%lON`V!AS`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!nN`!n!o!BU!o;'SN`;'S;=`!&v<%lON`V!B]`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!kN`!k!l!C_!l;'SN`;'S;=`!&v<%lON`V!Cf`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!pN`!p!q!Dh!q;'SN`;'S;=`!&v<%lON`V!Do`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!Eq!h;'SN`;'S;=`!&v<%lON`V!Ex^QR_QOXN`XY!.OYZ$WZ]N`]^! c^pN`pq!.OqtN`tu! cuzN`z{!#q{;'SN`;'S;=`!&v<%lON`V!F{`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!zN`!z!{!G}!{;'SN`;'S;=`!&v<%lON`V!HU`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h!IW!h;'SN`;'S;=`!&v<%lON`V!I_`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!eN`!e!f!Eq!f;'SN`;'S;=`!&v<%lON`V!Jh`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!kN`!k!l!Kj!l;'SN`;'S;=`!&v<%lON`V!Kq`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!iN`!i!j!Ls!j;'SN`;'S;=`!&v<%lON`V!Lz`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!tN`!t!u!M|!u;'SN`;'S;=`!&v<%lON`V!NT`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d# V!d;'SN`;'S;=`!&v<%lON`V# ^`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w!Dh!w;'SN`;'S;=`!&v<%lON`V#!g`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!wN`!w!x##i!x;'SN`;'S;=`!&v<%lON`V##p`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!gN`!g!h#$r!h;'SN`;'S;=`!&v<%lON`V#$y`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!tN`!t!u#%{!u;'SN`;'S;=`!&v<%lON`V#&S`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!{N`!{!|!Eq!|;'SN`;'S;=`!&v<%lON`V#']bQR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d#(e!d!gN`!g!h#*w!h;'SN`;'S;=`!&v<%lON`V#(l`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!dN`!d!e#)n!e;'SN`;'S;=`!&v<%lON`V#)u`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!nN`!n!o!Dh!o;'SN`;'S;=`!&v<%lON`V#+O`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!uN`!u!v#,Q!v;'SN`;'S;=`!&v<%lON`V#,X`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w#-Z!w;'SN`;'S;=`!&v<%lON`V#-b`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!fN`!f!g#.d!g;'SN`;'S;=`!&v<%lON`V#.k`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d#/m!d;'SN`;'S;=`!&v<%lON`V#/t`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!vN`!v!w#0v!w;'SN`;'S;=`!&v<%lON`V#0}`QR_QOXN`XY! cYZ$WZ]N`]^! c^pN`pq! cqtN`tu! cuzN`z{!#q{!cN`!c!d!Eq!d;'SN`;'S;=`!&v<%lON`V#2U]_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{#2}{;'S#Y;'S;=`'q<%lO#YV#3Sj_QOX#4tXY#8uYZ#8uZ]#4t]^#5r^p#4tpq#8uqt#4ttu#5ruz#4tz{#6{{!P#4t!P!Q#Js!Q!d#4t!d!e$ p!e!g#4t!g!h$*_!h!o#4t!o!p$-k!p!s#4t!s!t$3P!t!v#4t!v!w$7a!w;'S#4t;'S;=`#8o<%lO#4tV#4y]_QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{;'S#4t;'S;=`#8o<%lO#4tV#5uTOz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#6XVOz#5rz{#6U{!P#5r!P!Q#6n!Q;'S#5r;'S;=`#6u<%lO#5rV#6uORRnSV#6xP;=`<%l#5rV#7Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!P#4t!P!Q#8P!Q;'S#4t;'S;=`#8o<%lO#4tV#8YVRRnS_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PV#8rP;=`<%l#4tV#8xdOX#5rXY#8uYZ#8uZp#5rpq#8uqz#5rz{#6U{!d#5r!d!e#:W!e!g#5r!g!h#?o!h!o#5r!o!p#AZ!p!s#5r!s!t#Cw!t!v#5r!v!w#E{!w;'S#5r;'S;=`#6u<%lO#5rV#:ZVOz#5rz{#6U{!c#5r!c!d#:p!d;'S#5r;'S;=`#6u<%lO#5rV#:sVOz#5rz{#6U{!u#5r!u!v#;Y!v;'S#5r;'S;=`#6u<%lO#5rV#;]VOz#5rz{#6U{!g#5r!g!h#;r!h;'S#5r;'S;=`#6u<%lO#5rV#;uVOz#5rz{#6U{!n#5r!n!o#<[!o;'S#5r;'S;=`#6u<%lO#5rV#<_VOz#5rz{#6U{!k#5r!k!l#<t!l;'S#5r;'S;=`#6u<%lO#5rV#<wVOz#5rz{#6U{!p#5r!p!q#=^!q;'S#5r;'S;=`#6u<%lO#5rV#=aVOz#5rz{#6U{!g#5r!g!h#=v!h;'S#5r;'S;=`#6u<%lO#5rV#=yYOX#5rXY#>iYZ#?ZZp#5rpq#>iqz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#>nXUROX#5rXY#>iYp#5rpq#>iqz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#?`TUROz#5rz{#6U{;'S#5r;'S;=`#6u<%lO#5rV#?rVOz#5rz{#6U{!z#5r!z!{#@X!{;'S#5r;'S;=`#6u<%lO#5rV#@[VOz#5rz{#6U{!g#5r!g!h#@q!h;'S#5r;'S;=`#6u<%lO#5rV#@tVOz#5rz{#6U{!e#5r!e!f#=v!f;'S#5r;'S;=`#6u<%lO#5rV#A^VOz#5rz{#6U{!k#5r!k!l#As!l;'S#5r;'S;=`#6u<%lO#5rV#AvVOz#5rz{#6U{!i#5r!i!j#B]!j;'S#5r;'S;=`#6u<%lO#5rV#B`VOz#5rz{#6U{!t#5r!t!u#Bu!u;'S#5r;'S;=`#6u<%lO#5rV#BxVOz#5rz{#6U{!c#5r!c!d#C_!d;'S#5r;'S;=`#6u<%lO#5rV#CbVOz#5rz{#6U{!v#5r!v!w#=^!w;'S#5r;'S;=`#6u<%lO#5rV#CzVOz#5rz{#6U{!w#5r!w!x#Da!x;'S#5r;'S;=`#6u<%lO#5rV#DdVOz#5rz{#6U{!g#5r!g!h#Dy!h;'S#5r;'S;=`#6u<%lO#5rV#D|VOz#5rz{#6U{!t#5r!t!u#Ec!u;'S#5r;'S;=`#6u<%lO#5rV#EfVOz#5rz{#6U{!{#5r!{!|#=v!|;'S#5r;'S;=`#6u<%lO#5rV#FOXOz#5rz{#6U{!c#5r!c!d#Fk!d!g#5r!g!h#Gm!h;'S#5r;'S;=`#6u<%lO#5rV#FnVOz#5rz{#6U{!d#5r!d!e#GT!e;'S#5r;'S;=`#6u<%lO#5rV#GWVOz#5rz{#6U{!n#5r!n!o#=^!o;'S#5r;'S;=`#6u<%lO#5rV#GpVOz#5rz{#6U{!u#5r!u!v#HV!v;'S#5r;'S;=`#6u<%lO#5rV#HYVOz#5rz{#6U{!v#5r!v!w#Ho!w;'S#5r;'S;=`#6u<%lO#5rV#HrVOz#5rz{#6U{!f#5r!f!g#IX!g;'S#5r;'S;=`#6u<%lO#5rV#I[VOz#5rz{#6U{!c#5r!c!d#Iq!d;'S#5r;'S;=`#6u<%lO#5rV#ItVOz#5rz{#6U{!v#5r!v!w#JZ!w;'S#5r;'S;=`#6u<%lO#5rV#J^VOz#5rz{#6U{!c#5r!c!d#=v!d;'S#5r;'S;=`#6u<%lO#5rV#Jz]nS_QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{;'S#Ks;'S;=`$ j<%lO#KsR#Kx]_QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{;'S#Ks;'S;=`$ j<%lO#KsR#LtTOz#Lqz{#MT{;'S#Lq;'S;=`#Mr<%lO#LqR#MWVOz#Lqz{#MT{!P#Lq!P!Q#Mm!Q;'S#Lq;'S;=`#Mr<%lO#LqR#MrORRR#MuP;=`<%l#LqR#M}__QOX#KsXZ#LqZ]#Ks]^#Lq^p#Kspq#Lqqt#Kstu#Lquz#Ksz{#Mx{!P#Ks!P!Q#N|!Q;'S#Ks;'S;=`$ j<%lO#KsR$ TVRR_QOX'PZ]'P^p'Pqt'Pu;'S'P;'S;=`'k<%lO'PR$ mP;=`<%l#KsV$ u__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$!t!d;'S#4t;'S;=`#8o<%lO#4tV$!y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!u#4t!u!v$#x!v;'S#4t;'S;=`#8o<%lO#4tV$#}__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$$|!h;'S#4t;'S;=`#8o<%lO#4tV$%R__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!n#4t!n!o$&Q!o;'S#4t;'S;=`#8o<%lO#4tV$&V__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!k#4t!k!l$'U!l;'S#4t;'S;=`#8o<%lO#4tV$'Z__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!p#4t!p!q$(Y!q;'S#4t;'S;=`#8o<%lO#4tV$(___QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$)^!h;'S#4t;'S;=`#8o<%lO#4tV$)c^_QOX#4tXY#>iYZ#?ZZ]#4t]^#5r^p#4tpq#>iqt#4ttu#5ruz#4tz{#6{{;'S#4t;'S;=`#8o<%lO#4tV$*d__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!z#4t!z!{$+c!{;'S#4t;'S;=`#8o<%lO#4tV$+h__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$,g!h;'S#4t;'S;=`#8o<%lO#4tV$,l__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!e#4t!e!f$)^!f;'S#4t;'S;=`#8o<%lO#4tV$-p__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!k#4t!k!l$.o!l;'S#4t;'S;=`#8o<%lO#4tV$.t__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!i#4t!i!j$/s!j;'S#4t;'S;=`#8o<%lO#4tV$/x__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!t#4t!t!u$0w!u;'S#4t;'S;=`#8o<%lO#4tV$0|__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$1{!d;'S#4t;'S;=`#8o<%lO#4tV$2Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$(Y!w;'S#4t;'S;=`#8o<%lO#4tV$3U__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!w#4t!w!x$4T!x;'S#4t;'S;=`#8o<%lO#4tV$4Y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!g#4t!g!h$5X!h;'S#4t;'S;=`#8o<%lO#4tV$5^__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!t#4t!t!u$6]!u;'S#4t;'S;=`#8o<%lO#4tV$6b__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!{#4t!{!|$)^!|;'S#4t;'S;=`#8o<%lO#4tV$7fa_QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$8k!d!g#4t!g!h$:s!h;'S#4t;'S;=`#8o<%lO#4tV$8p__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!d#4t!d!e$9o!e;'S#4t;'S;=`#8o<%lO#4tV$9t__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!n#4t!n!o$(Y!o;'S#4t;'S;=`#8o<%lO#4tV$:x__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!u#4t!u!v$;w!v;'S#4t;'S;=`#8o<%lO#4tV$;|__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$<{!w;'S#4t;'S;=`#8o<%lO#4tV$=Q__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!f#4t!f!g$>P!g;'S#4t;'S;=`#8o<%lO#4tV$>U__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$?T!d;'S#4t;'S;=`#8o<%lO#4tV$?Y__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!v#4t!v!w$@X!w;'S#4t;'S;=`#8o<%lO#4tV$@^__QOX#4tXZ#5rZ]#4t]^#5r^p#4tpq#5rqt#4ttu#5ruz#4tz{#6{{!c#4t!c!d$)^!d;'S#4t;'S;=`#8o<%lO#4tV$AdeVP_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$A]![!c#Y!c!}$A]!}#R#Y#R#S$A]#S#T#Y#T#o$A]#o;'S#Y;'S;=`'q<%lO#Y~$Bze_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$D]![!c#Y!c!}$D]!}#R#Y#R#S$D]#S#T#Y#T#o$D]#o;'S#Y;'S;=`'q<%lO#Y~$DdeW~_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{!Q#Y!Q![$D]![!c#Y!c!}$D]!}#R#Y#R#S$D]#S#T#Y#T#o$D]#o;'S#Y;'S;=`'q<%lO#YV$E|]qP_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#YU$Fz__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#g#Y#g#h$Gy#h;'S#Y;'S;=`'q<%lO#YU$HO__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#X#Y#X#Y$H}#Y;'S#Y;'S;=`'q<%lO#YU$IS__QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{#h#Y#h#i$JR#i;'S#Y;'S;=`'q<%lO#YU$JY]pQ_QOX#YXZ$WZ]#Y]^$W^p#Ypq$Wqt#Ytu$Wuz#Yz{%_{;'S#Y;'S;=`'q<%lO#Y",
|
|
727
728
|
tokenizers: [
|
|
728
729
|
0,
|
|
729
730
|
1,
|
|
730
731
|
2
|
|
731
732
|
],
|
|
732
733
|
topRules: { "File": [0, 1] },
|
|
733
|
-
tokenPrec:
|
|
734
|
+
tokenPrec: 262
|
|
734
735
|
});
|
|
735
736
|
//#endregion
|
|
736
737
|
//#region src/sql-query.ts
|
|
@@ -801,8 +802,11 @@ var SQLQuery = class {
|
|
|
801
802
|
get isTestdata() {
|
|
802
803
|
return this.type === "TESTDATA";
|
|
803
804
|
}
|
|
805
|
+
get isBaseline() {
|
|
806
|
+
return this.type === "BASELINE";
|
|
807
|
+
}
|
|
804
808
|
get skipGenerateFunction() {
|
|
805
|
-
return this.isTestdata || this.isMigrate || this.id.startsWith("_");
|
|
809
|
+
return this.isTestdata || this.isMigrate || this.isBaseline || this.id.startsWith("_");
|
|
806
810
|
}
|
|
807
811
|
validateVariables() {
|
|
808
812
|
const missingVars = [];
|
|
@@ -858,7 +862,21 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
858
862
|
function nodeStr(node) {
|
|
859
863
|
return content.slice(node.from, node.to);
|
|
860
864
|
}
|
|
861
|
-
const
|
|
865
|
+
const namesByKind = /* @__PURE__ */ new Map();
|
|
866
|
+
const namespaceFor = (kind) => kind === "MIGRATE" || kind === "TESTDATA" || kind === "BASELINE" ? kind : "METHOD";
|
|
867
|
+
const checkDuplicate = (kind, n) => {
|
|
868
|
+
const ns = namespaceFor(kind);
|
|
869
|
+
let set = namesByKind.get(ns);
|
|
870
|
+
if (!set) {
|
|
871
|
+
set = /* @__PURE__ */ new Set();
|
|
872
|
+
namesByKind.set(ns, set);
|
|
873
|
+
}
|
|
874
|
+
if (set.has(n)) {
|
|
875
|
+
const label = ns === "METHOD" ? "query/table name" : `${ns} name`;
|
|
876
|
+
throw SqgError.inFile(`Duplicate ${label} '${n}'`, "DUPLICATE_QUERY", filePath, { suggestion: `Rename one of the ${ns === "METHOD" ? "queries/tables" : ns.toLowerCase() + " blocks"} to have a unique name` });
|
|
877
|
+
}
|
|
878
|
+
set.add(n);
|
|
879
|
+
};
|
|
862
880
|
do
|
|
863
881
|
if (cursor.name === "QueryBlock") {
|
|
864
882
|
const annotationNode = cursor.node.getChild("LineCommentStartSpecial") ?? cursor.node.getChild("BlockCommentStartSpecial");
|
|
@@ -1008,8 +1026,7 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1008
1026
|
if (match) includeColumns.push(...match[1].split(",").map((c) => c.trim()));
|
|
1009
1027
|
}
|
|
1010
1028
|
const table = new TableInfo(filePath, name, tableName, includeColumns, hasAppender, annotationLine);
|
|
1011
|
-
|
|
1012
|
-
queryNames.add(name);
|
|
1029
|
+
checkDuplicate("TABLE", name);
|
|
1013
1030
|
tables.push(table);
|
|
1014
1031
|
consola.debug(`Added table: ${name} -> ${tableName} (appender: ${hasAppender})`);
|
|
1015
1032
|
continue;
|
|
@@ -1024,8 +1041,7 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1024
1041
|
config
|
|
1025
1042
|
});
|
|
1026
1043
|
const query = new SQLQuery(filePath, name, sqlContentStr, sql.toSqlWithAnonymousPlaceholders(), sql.toSqlWithNamedPlaceholders(), sql.toSqlWithPositionalPlaceholders(), queryType, isOne, isPluck, isBatch, variables, config, annotationLine);
|
|
1027
|
-
|
|
1028
|
-
queryNames.add(name);
|
|
1044
|
+
checkDuplicate(queryType, name);
|
|
1029
1045
|
queries.push(query);
|
|
1030
1046
|
consola.debug(`Added query: ${name} (${queryType})`);
|
|
1031
1047
|
}
|
|
@@ -1041,8 +1057,14 @@ function parseSQLQueries(filePath, extraVariables) {
|
|
|
1041
1057
|
//#endregion
|
|
1042
1058
|
//#region src/db/types.ts
|
|
1043
1059
|
async function initializeDatabase(queries, execQueries, reporter) {
|
|
1060
|
+
const baselineQueries = queries.filter((q) => q.isBaseline);
|
|
1061
|
+
for (const query of baselineQueries) try {
|
|
1062
|
+
await execQueries(query);
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
consola.error("Failed to apply baseline:" + error.message + " when running query:\n\n " + query.rawQuery);
|
|
1065
|
+
throw error;
|
|
1066
|
+
}
|
|
1044
1067
|
const migrationQueries = queries.filter((q) => q.isMigrate);
|
|
1045
|
-
sortBy(migrationQueries, [(q) => Number(q.id.split("_")[1])]);
|
|
1046
1068
|
for (const query of migrationQueries) try {
|
|
1047
1069
|
await execQueries(query);
|
|
1048
1070
|
} catch (error) {
|
|
@@ -1056,7 +1078,7 @@ async function initializeDatabase(queries, execQueries, reporter) {
|
|
|
1056
1078
|
consola.error("Failed to initialize testdata:" + error.message + " when running query:\n\n " + query.rawQuery);
|
|
1057
1079
|
throw error;
|
|
1058
1080
|
}
|
|
1059
|
-
if (migrationQueries.length + testdataQueries.length === 0) consola.warn("No migration or testdata queries found");
|
|
1081
|
+
if (baselineQueries.length + migrationQueries.length + testdataQueries.length === 0) consola.warn("No baseline, migration or testdata queries found");
|
|
1060
1082
|
reporter?.onDatabaseInitialized?.();
|
|
1061
1083
|
}
|
|
1062
1084
|
//#endregion
|
|
@@ -1514,6 +1536,45 @@ const sqlite = new class {
|
|
|
1514
1536
|
close() {
|
|
1515
1537
|
this.db.close();
|
|
1516
1538
|
}
|
|
1539
|
+
/**
|
|
1540
|
+
* For columns where SQLite's columns() returned no type (any expression),
|
|
1541
|
+
* probe the storage class via typeof() against a single row of the query.
|
|
1542
|
+
* Returns the SQL type and observed nullability per column (in the same
|
|
1543
|
+
* order as `info`). When the type cannot be inferred (no rows, or the
|
|
1544
|
+
* sampled value was NULL), `type` is "" and the caller should fall back
|
|
1545
|
+
* to "unknown" + nullable.
|
|
1546
|
+
*/
|
|
1547
|
+
probeExpressionTypes(db, sql, params, info) {
|
|
1548
|
+
const result = info.map(() => ({
|
|
1549
|
+
type: "",
|
|
1550
|
+
nullable: true
|
|
1551
|
+
}));
|
|
1552
|
+
if (!info.some((c) => !c.type)) return result;
|
|
1553
|
+
const typeofMap = {
|
|
1554
|
+
integer: "INTEGER",
|
|
1555
|
+
real: "REAL",
|
|
1556
|
+
text: "TEXT",
|
|
1557
|
+
blob: "BLOB"
|
|
1558
|
+
};
|
|
1559
|
+
const aliased = info.map((c, i) => `"${c.name.replace(/"/g, "\"\"")}" AS sqg_c${i}`).join(", ");
|
|
1560
|
+
const probeSql = `SELECT ${info.map((_, i) => `typeof(sqg_c${i}) AS sqg_t${i}`).join(", ")} FROM (SELECT ${aliased} FROM (${sql.replace(/[\s;]+$/, "")})) LIMIT 1`;
|
|
1561
|
+
try {
|
|
1562
|
+
const row = db.prepare(probeSql).get(...params);
|
|
1563
|
+
if (!row) return result;
|
|
1564
|
+
for (let i = 0; i < info.length; i++) {
|
|
1565
|
+
const t = row[`sqg_t${i}`];
|
|
1566
|
+
if (!t) continue;
|
|
1567
|
+
if (t === "null") continue;
|
|
1568
|
+
if (typeofMap[t]) result[i] = {
|
|
1569
|
+
type: typeofMap[t],
|
|
1570
|
+
nullable: false
|
|
1571
|
+
};
|
|
1572
|
+
}
|
|
1573
|
+
} catch (e) {
|
|
1574
|
+
consola.debug(`typeof() probe failed; falling back to 'unknown': ${e.message}`);
|
|
1575
|
+
}
|
|
1576
|
+
return result;
|
|
1577
|
+
}
|
|
1517
1578
|
getTableInfo(db, table) {
|
|
1518
1579
|
const info = db.pragma(`table_info('${table}')`);
|
|
1519
1580
|
return new Map(info.map((col) => [col.name, col]));
|
|
@@ -1523,24 +1584,27 @@ const sqlite = new class {
|
|
|
1523
1584
|
try {
|
|
1524
1585
|
consola.debug("Query:", statement.sql);
|
|
1525
1586
|
const stmt = db.prepare(statement.sql);
|
|
1587
|
+
const params = statement.parameters.map((p) => p.value);
|
|
1526
1588
|
if (query.isQuery) {
|
|
1527
1589
|
const info = stmt.columns();
|
|
1528
1590
|
const tables = new Set(info.map((col) => col.table).filter(isNotNil));
|
|
1529
1591
|
const data = new Map(Array.from(tables).map((table) => [table, this.getTableInfo(db, table)]));
|
|
1530
|
-
|
|
1592
|
+
const probedTypes = this.probeExpressionTypes(db, statement.sql, params, info);
|
|
1593
|
+
query.columns = info.map((col, i) => {
|
|
1531
1594
|
const colInfo = col.table ? data.get(col.table)?.get(col.name) : null;
|
|
1595
|
+
const probed = probedTypes[i];
|
|
1532
1596
|
return {
|
|
1533
1597
|
name: col.name,
|
|
1534
|
-
type: col.type || "unknown",
|
|
1535
|
-
nullable: colInfo?.pk === 0 && colInfo?.notnull === 0
|
|
1598
|
+
type: col.type || probed.type || "unknown",
|
|
1599
|
+
nullable: col.table ? colInfo?.pk === 0 && colInfo?.notnull === 0 : probed.nullable
|
|
1536
1600
|
};
|
|
1537
1601
|
});
|
|
1538
1602
|
}
|
|
1539
1603
|
if (query.isQuery) {
|
|
1540
|
-
if (query.isOne) return stmt.get(...
|
|
1541
|
-
return stmt.all(...
|
|
1604
|
+
if (query.isOne) return stmt.get(...params);
|
|
1605
|
+
return stmt.all(...params);
|
|
1542
1606
|
}
|
|
1543
|
-
return stmt.run(...
|
|
1607
|
+
return stmt.run(...params);
|
|
1544
1608
|
} catch (error) {
|
|
1545
1609
|
consola.error(`Failed to execute query '${query.id}' in ${query.filename}:\n ${statement.sql} \n ${statement.parameters.map((p) => p.value).join(", ")}`, error);
|
|
1546
1610
|
throw error;
|
|
@@ -1725,6 +1789,26 @@ var JavaTypeMapper = class JavaTypeMapper extends TypeMapper {
|
|
|
1725
1789
|
if (column.type instanceof EnumType && column.type.name) return path + pascalCase(column.type.name);
|
|
1726
1790
|
return super.getTypeName(column, path);
|
|
1727
1791
|
}
|
|
1792
|
+
/**
|
|
1793
|
+
* Returns the primitive Java type for a column when it's non-nullable and
|
|
1794
|
+
* its mapped type has a primitive equivalent (Integer→int, Long→long, etc.).
|
|
1795
|
+
* Falls back to {@link getTypeName} otherwise. Used for appender row types
|
|
1796
|
+
* to avoid auto-boxing on hot bulk-insert paths.
|
|
1797
|
+
*/
|
|
1798
|
+
getUnboxedTypeName(column, path = "") {
|
|
1799
|
+
const typeName = this.getTypeName(column, path);
|
|
1800
|
+
if (column.nullable) return typeName;
|
|
1801
|
+
return JavaTypeMapper.boxedToPrimitive[typeName] ?? typeName;
|
|
1802
|
+
}
|
|
1803
|
+
static boxedToPrimitive = {
|
|
1804
|
+
Integer: "int",
|
|
1805
|
+
Long: "long",
|
|
1806
|
+
Short: "short",
|
|
1807
|
+
Byte: "byte",
|
|
1808
|
+
Boolean: "boolean",
|
|
1809
|
+
Double: "double",
|
|
1810
|
+
Float: "float"
|
|
1811
|
+
};
|
|
1728
1812
|
mapPrimitiveType(type, _nullable) {
|
|
1729
1813
|
const upperType = type.toString().toUpperCase();
|
|
1730
1814
|
const mappedType = this.typeMap[upperType];
|
|
@@ -1820,6 +1904,18 @@ var JavaTypeMapper = class JavaTypeMapper extends TypeMapper {
|
|
|
1820
1904
|
* Generates TypeScript interfaces for struct types and handles DuckDB's complex types.
|
|
1821
1905
|
*/
|
|
1822
1906
|
var TypeScriptTypeMapper = class extends TypeMapper {
|
|
1907
|
+
/**
|
|
1908
|
+
* SQLite drivers (better-sqlite3, node:sqlite, libsql, turso) return JS
|
|
1909
|
+
* `number` for INTEGER/BIGINT columns by default. They each offer a "safe
|
|
1910
|
+
* integers" mode that returns `bigint` instead — opt in via
|
|
1911
|
+
* `config.safeIntegers: true` in the yaml. Other engines (DuckDB,
|
|
1912
|
+
* PostgreSQL) continue to use `bigint` for BIGINT/INT8.
|
|
1913
|
+
*/
|
|
1914
|
+
constructor(engine, safeIntegers = false) {
|
|
1915
|
+
super();
|
|
1916
|
+
this.engine = engine;
|
|
1917
|
+
this.safeIntegers = safeIntegers;
|
|
1918
|
+
}
|
|
1823
1919
|
/**
|
|
1824
1920
|
* Returns the TypeScript type name for a given SQL column.
|
|
1825
1921
|
* Overrides base to handle DuckDB's map type with key-value entry arrays.
|
|
@@ -1886,7 +1982,8 @@ var TypeScriptTypeMapper = class extends TypeMapper {
|
|
|
1886
1982
|
};
|
|
1887
1983
|
mapPrimitiveType(type, nullable) {
|
|
1888
1984
|
const upperType = type.toUpperCase();
|
|
1889
|
-
|
|
1985
|
+
let mappedType = this.typeMap[upperType];
|
|
1986
|
+
if (mappedType === "bigint" && this.engine === "sqlite" && !this.safeIntegers && (upperType === "BIGINT" || upperType === "INT8")) mappedType = "number";
|
|
1890
1987
|
if (mappedType) return nullable ? `${mappedType} | null` : mappedType;
|
|
1891
1988
|
if (upperType.startsWith("_")) {
|
|
1892
1989
|
const baseType = upperType.substring(1);
|
|
@@ -2201,7 +2298,7 @@ var JavaGenerator = class extends BaseGenerator {
|
|
|
2201
2298
|
return pgBulkInsertType(column.type.toString().toUpperCase());
|
|
2202
2299
|
});
|
|
2203
2300
|
Handlebars.registerHelper("pgBulkAccessor", (column) => {
|
|
2204
|
-
return pgBulkInsertAccessor(column
|
|
2301
|
+
return pgBulkInsertAccessor(column);
|
|
2205
2302
|
});
|
|
2206
2303
|
Handlebars.registerHelper("javaVarName", (name) => {
|
|
2207
2304
|
const n = camelCase(name);
|
|
@@ -2220,7 +2317,7 @@ var JavaGenerator = class extends BaseGenerator {
|
|
|
2220
2317
|
return queryHelper.typeMapper.getDeclarations(query.allColumns);
|
|
2221
2318
|
});
|
|
2222
2319
|
Handlebars.registerHelper("appenderType", (column) => {
|
|
2223
|
-
return this.
|
|
2320
|
+
return this.typeMapper.getUnboxedTypeName(column);
|
|
2224
2321
|
});
|
|
2225
2322
|
Handlebars.registerHelper("declareEnums", (queryHelpers) => {
|
|
2226
2323
|
const enumTypes = /* @__PURE__ */ new Map();
|
|
@@ -2409,8 +2506,21 @@ function pgBulkInsertType(sqlType) {
|
|
|
2409
2506
|
if (sqlType.startsWith("_")) return `array(PgBulkInsert.PostgresTypes.${PG_BULK_TYPE_MAP[sqlType.substring(1)] || "TEXT"})`;
|
|
2410
2507
|
return PG_BULK_TYPE_MAP[sqlType] || "TEXT";
|
|
2411
2508
|
}
|
|
2412
|
-
|
|
2509
|
+
const PG_BULK_PRIMITIVE_TYPES = new Set([
|
|
2510
|
+
"INT2",
|
|
2511
|
+
"INT4",
|
|
2512
|
+
"INT8",
|
|
2513
|
+
"FLOAT4",
|
|
2514
|
+
"FLOAT8",
|
|
2515
|
+
"BOOLEAN"
|
|
2516
|
+
]);
|
|
2517
|
+
function pgBulkInsertAccessor(column) {
|
|
2518
|
+
const sqlType = column.type.toString().toUpperCase();
|
|
2413
2519
|
if (sqlType === "TIMESTAMPTZ") return "offsetDateTime";
|
|
2520
|
+
if (!column.nullable) {
|
|
2521
|
+
const pgType = PG_BULK_TYPE_MAP[sqlType];
|
|
2522
|
+
if (pgType && PG_BULK_PRIMITIVE_TYPES.has(pgType)) return "primitive";
|
|
2523
|
+
}
|
|
2414
2524
|
return "from";
|
|
2415
2525
|
}
|
|
2416
2526
|
//#endregion
|
|
@@ -2662,8 +2772,8 @@ function resolveElementType(baseType) {
|
|
|
2662
2772
|
}[baseType.toString().toUpperCase()] || "VARCHAR";
|
|
2663
2773
|
}
|
|
2664
2774
|
var TsGenerator = class extends BaseGenerator {
|
|
2665
|
-
constructor(template) {
|
|
2666
|
-
super(template, new TypeScriptTypeMapper());
|
|
2775
|
+
constructor(template, engine) {
|
|
2776
|
+
super(template, new TypeScriptTypeMapper(engine));
|
|
2667
2777
|
}
|
|
2668
2778
|
getFunctionName(id) {
|
|
2669
2779
|
return camelCase(id);
|
|
@@ -2677,7 +2787,8 @@ var TsGenerator = class extends BaseGenerator {
|
|
|
2677
2787
|
getClassName(name) {
|
|
2678
2788
|
return pascalCase(name);
|
|
2679
2789
|
}
|
|
2680
|
-
async beforeGenerate(_projectDir,
|
|
2790
|
+
async beforeGenerate(_projectDir, gen, _queries, _tables) {
|
|
2791
|
+
if (this.typeMapper instanceof TypeScriptTypeMapper) this.typeMapper.safeIntegers = !!gen.config?.safeIntegers;
|
|
2681
2792
|
Handlebars.registerHelper("quote", (value) => this.quote(value));
|
|
2682
2793
|
Handlebars.registerHelper("appendMethod", (column) => {
|
|
2683
2794
|
if (column.type instanceof ListType) return "List";
|
|
@@ -2843,7 +2954,7 @@ var TsGenerator = class extends BaseGenerator {
|
|
|
2843
2954
|
*/
|
|
2844
2955
|
var TsDuckDBGenerator = class extends TsGenerator {
|
|
2845
2956
|
constructor(template) {
|
|
2846
|
-
super(template);
|
|
2957
|
+
super(template, "duckdb");
|
|
2847
2958
|
}
|
|
2848
2959
|
supportsAppenders(_engine) {
|
|
2849
2960
|
return true;
|
|
@@ -2922,7 +3033,7 @@ function getGenerator(generator) {
|
|
|
2922
3033
|
case "typescript/better-sqlite3":
|
|
2923
3034
|
case "typescript/node":
|
|
2924
3035
|
case "typescript/libsql":
|
|
2925
|
-
case "typescript/turso": return new TsGenerator(`templates/${info.template}
|
|
3036
|
+
case "typescript/turso": return new TsGenerator(`templates/${info.template}`, info.engine);
|
|
2926
3037
|
case "typescript/node-api": return new TsDuckDBGenerator(`templates/${info.template}`);
|
|
2927
3038
|
case "java/jdbc": return new JavaGenerator(`templates/${info.template}`, info.engine);
|
|
2928
3039
|
case "java/arrow": return new JavaDuckDBArrowGenerator(`templates/${info.template}`);
|
|
@@ -3454,7 +3565,7 @@ async function processProject(projectPath, ui) {
|
|
|
3454
3565
|
//#region src/mcp-server.ts
|
|
3455
3566
|
const server = new Server({
|
|
3456
3567
|
name: "sqg-mcp",
|
|
3457
|
-
version: process.env.npm_package_version ?? "0.
|
|
3568
|
+
version: process.env.npm_package_version ?? "0.19.1"
|
|
3458
3569
|
}, { capabilities: {
|
|
3459
3570
|
tools: {},
|
|
3460
3571
|
resources: {}
|
|
@@ -3525,8 +3636,8 @@ async function generateCode(sql, generator) {
|
|
|
3525
3636
|
const GENERATE_CODE_DESCRIPTION = `Generate type-safe database access code from annotated SQL queries.
|
|
3526
3637
|
|
|
3527
3638
|
CRITICAL REQUIREMENTS:
|
|
3528
|
-
1. MIGRATE statements MUST come BEFORE any QUERY/EXEC that references those tables
|
|
3529
|
-
2. Each query block needs a unique name
|
|
3639
|
+
1. MIGRATE (or BASELINE) statements MUST come BEFORE any QUERY/EXEC that references those tables. MIGRATE blocks run in source order; the name is an arbitrary identifier (e.g. "1", "add_email"), not a sort key.
|
|
3640
|
+
2. Each query block needs a unique name within its kind (QUERY/EXEC/TABLE share one namespace; MIGRATE/BASELINE/TESTDATA each have their own)
|
|
3530
3641
|
3. Parameters require @set declarations with sample values
|
|
3531
3642
|
|
|
3532
3643
|
${SQL_SYNTAX_REFERENCE}
|
|
@@ -3919,7 +4030,7 @@ function formatMs(ms) {
|
|
|
3919
4030
|
}
|
|
3920
4031
|
//#endregion
|
|
3921
4032
|
//#region src/sqg.ts
|
|
3922
|
-
const version = process.env.npm_package_version ?? "0.
|
|
4033
|
+
const version = process.env.npm_package_version ?? "0.19.1";
|
|
3923
4034
|
updateNotifier({ pkg: {
|
|
3924
4035
|
name: "@sqg/sqg",
|
|
3925
4036
|
version
|
|
@@ -4043,7 +4154,7 @@ program.command("ui").description("Start the SQG UI — interactive SQL developm
|
|
|
4043
4154
|
const { startUi } = await import("./start-ui-DuHxwbjr.mjs");
|
|
4044
4155
|
await startUi({
|
|
4045
4156
|
project,
|
|
4046
|
-
port: parseInt(options.port, 10)
|
|
4157
|
+
port: Number.parseInt(options.port, 10)
|
|
4047
4158
|
});
|
|
4048
4159
|
});
|
|
4049
4160
|
program.command("mcp").description("Start MCP (Model Context Protocol) server for AI assistants").action(async () => {
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import type { Database, RunResult, Statement } from 'better-sqlite3';
|
|
3
5
|
|
|
4
6
|
export class {{className}} {
|
|
@@ -106,7 +108,7 @@ any
|
|
|
106
108
|
{{#if isOne~}}
|
|
107
109
|
{{> rowType}} | undefined
|
|
108
110
|
{{~else~}}
|
|
109
|
-
{{> rowType}}[]
|
|
111
|
+
({{> rowType}})[]
|
|
110
112
|
{{/if~}}
|
|
111
113
|
{{~else~}}
|
|
112
114
|
RunResult
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import type { Client, InArgs } from '@libsql/client';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -109,7 +111,7 @@ unknown
|
|
|
109
111
|
{{#if isOne~}}
|
|
110
112
|
{{> rowType}} | undefined
|
|
111
113
|
{{~else~}}
|
|
112
|
-
{{> rowType}}[]
|
|
114
|
+
({{> rowType}})[]
|
|
113
115
|
{{/if~}}
|
|
114
116
|
{{~else~}}
|
|
115
117
|
RunResult
|
|
@@ -129,7 +131,7 @@ return (result.rows as unknown[])[0] as {{> rowType}} | undefined;
|
|
|
129
131
|
{{#if isPluck}}
|
|
130
132
|
return result.rows.map(row => Object.values(row)[0] as {{> rowType}});
|
|
131
133
|
{{else}}
|
|
132
|
-
return (result.rows as unknown[]) as {{> rowType}}[];
|
|
134
|
+
return (result.rows as unknown[]) as ({{> rowType}})[];
|
|
133
135
|
{{/if}}
|
|
134
136
|
{{/if}}
|
|
135
137
|
{{else}}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { DatabaseSync, StatementSync } from 'node:sqlite';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -111,7 +113,7 @@ any
|
|
|
111
113
|
{{#if isOne~}}
|
|
112
114
|
{{> rowType}} | undefined
|
|
113
115
|
{{~else~}}
|
|
114
|
-
{{> rowType}}[]
|
|
116
|
+
({{> rowType}})[]
|
|
115
117
|
{{/if~}}
|
|
116
118
|
{{~else~}}
|
|
117
119
|
RunResult
|
|
@@ -132,7 +134,7 @@ return stmt.get({{> params}}) as {{> rowType}} | undefined;
|
|
|
132
134
|
const rows = stmt.all({{> params}}) as Record<string, {{> rowType}}>[];
|
|
133
135
|
return rows.map(row => Object.values(row)[0]);
|
|
134
136
|
{{else}}
|
|
135
|
-
return stmt.all({{> params}}) as {{> rowType}}[];
|
|
137
|
+
return stmt.all({{> params}}) as ({{> rowType}})[];
|
|
136
138
|
{{/if}}
|
|
137
139
|
{{/if}}
|
|
138
140
|
{{else}}
|
package/dist/templates/turso.hbs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { connect, type Database } from '@tursodatabase/database';
|
|
3
5
|
|
|
4
6
|
interface RunResult {
|
|
@@ -112,7 +114,7 @@ unknown
|
|
|
112
114
|
{{#if isOne~}}
|
|
113
115
|
{{> rowType}} | undefined
|
|
114
116
|
{{~else~}}
|
|
115
|
-
{{> rowType}}[]
|
|
117
|
+
({{> rowType}})[]
|
|
116
118
|
{{/if~}}
|
|
117
119
|
{{~else~}}
|
|
118
120
|
RunResult
|
|
@@ -133,7 +135,7 @@ return await stmt.get({{> params}}) as {{> rowType}} | undefined;
|
|
|
133
135
|
const rows = await stmt.all({{> params}}) as Record<string, {{> rowType}}>[];
|
|
134
136
|
return rows.map(row => Object.values(row)[0]);
|
|
135
137
|
{{else}}
|
|
136
|
-
return await stmt.all({{> params}}) as {{> rowType}}[];
|
|
138
|
+
return await stmt.all({{> params}}) as ({{> rowType}})[];
|
|
137
139
|
{{/if}}
|
|
138
140
|
{{/if}}
|
|
139
141
|
{{else}}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
// {{generatedComment}}
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
// biome-ignore-all lint: generated code
|
|
2
4
|
import { DuckDBListType, listValue, VARCHAR, INTEGER, BIGINT, DOUBLE, FLOAT, BOOLEAN, SMALLINT, TINYINT, type DuckDBConnection, type DuckDBMaterializedResult, type DuckDBAppender, type DuckDBDateValue, type DuckDBTimeValue, type DuckDBTimestampValue, type DuckDBBlobValue, type DuckDBValue } from "@duckdb/node-api";
|
|
3
5
|
|
|
4
6
|
export class {{className}} {
|