speexjs 0.2.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.
Files changed (67) hide show
  1. package/README.md +555 -0
  2. package/dist/cli/index.d.ts +1 -0
  3. package/dist/cli/index.js +1017 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/client/index.d.ts +73 -0
  6. package/dist/client/index.js +927 -0
  7. package/dist/client/index.js.map +1 -0
  8. package/dist/client/signals/index.d.ts +62 -0
  9. package/dist/client/signals/index.js +248 -0
  10. package/dist/client/signals/index.js.map +1 -0
  11. package/dist/client/vdom/index.d.ts +50 -0
  12. package/dist/client/vdom/index.js +540 -0
  13. package/dist/client/vdom/index.js.map +1 -0
  14. package/dist/client/vdom/jsx-runtime.d.ts +9 -0
  15. package/dist/client/vdom/jsx-runtime.js +203 -0
  16. package/dist/client/vdom/jsx-runtime.js.map +1 -0
  17. package/dist/index-CMkhSDh7.d.ts +97 -0
  18. package/dist/index.d.ts +18 -0
  19. package/dist/index.js +6402 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jsx-DGrnv8QB.d.ts +8 -0
  22. package/dist/response-Ca8KWK5_.d.ts +173 -0
  23. package/dist/rpc/index.d.ts +70 -0
  24. package/dist/rpc/index.js +136 -0
  25. package/dist/rpc/index.js.map +1 -0
  26. package/dist/schema/index.d.ts +231 -0
  27. package/dist/schema/index.js +1160 -0
  28. package/dist/schema/index.js.map +1 -0
  29. package/dist/server/auth/index.d.ts +61 -0
  30. package/dist/server/auth/index.js +462 -0
  31. package/dist/server/auth/index.js.map +1 -0
  32. package/dist/server/cache/index.d.ts +45 -0
  33. package/dist/server/cache/index.js +238 -0
  34. package/dist/server/cache/index.js.map +1 -0
  35. package/dist/server/container/index.d.ts +20 -0
  36. package/dist/server/container/index.js +62 -0
  37. package/dist/server/container/index.js.map +1 -0
  38. package/dist/server/controller/index.d.ts +37 -0
  39. package/dist/server/controller/index.js +139 -0
  40. package/dist/server/controller/index.js.map +1 -0
  41. package/dist/server/database/index.d.ts +461 -0
  42. package/dist/server/database/index.js +1977 -0
  43. package/dist/server/database/index.js.map +1 -0
  44. package/dist/server/events/index.d.ts +29 -0
  45. package/dist/server/events/index.js +159 -0
  46. package/dist/server/events/index.js.map +1 -0
  47. package/dist/server/gate/index.d.ts +36 -0
  48. package/dist/server/gate/index.js +169 -0
  49. package/dist/server/gate/index.js.map +1 -0
  50. package/dist/server/http/index.d.ts +45 -0
  51. package/dist/server/http/index.js +871 -0
  52. package/dist/server/http/index.js.map +1 -0
  53. package/dist/server/index.d.ts +79 -0
  54. package/dist/server/index.js +4185 -0
  55. package/dist/server/index.js.map +1 -0
  56. package/dist/server/middleware/index.d.ts +5 -0
  57. package/dist/server/middleware/index.js +416 -0
  58. package/dist/server/middleware/index.js.map +1 -0
  59. package/dist/server/router/index.d.ts +5 -0
  60. package/dist/server/router/index.js +231 -0
  61. package/dist/server/router/index.js.map +1 -0
  62. package/dist/server/storage/index.d.ts +66 -0
  63. package/dist/server/storage/index.js +244 -0
  64. package/dist/server/storage/index.js.map +1 -0
  65. package/dist/session-guard-CZeN87L9.d.ts +48 -0
  66. package/dist/types-CXH8hPei.d.ts +38 -0
  67. package/package.json +138 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/database/connection.ts","../../../src/server/database/dialect.ts","../../../src/server/database/driver.ts","../../../src/server/database/query.ts","../../../src/server/database/migration.ts","../../../src/server/database/pagination.ts","../../../src/server/database/seeder.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { createDriver, type Dialect, type Driver } from \"./driver.js\";\nimport { QueryBuilder } from \"./query.js\";\nimport type {\n\tConnectionConfig,\n\tDatabaseDriver,\n\tQueryResult,\n\tQueryRunner,\n} from \"./types.js\";\n\nexport type { ConnectionConfig, DatabaseDriver, QueryResult };\n\nexport class DatabaseConnection implements QueryRunner {\n\tprivate config: ConnectionConfig;\n\tprivate driver: Driver | null = null;\n\n\tconstructor(config: ConnectionConfig) {\n\t\tthis.config = {\n\t\t\tdriver: \"mysql\",\n\t\t\thost: \"127.0.0.1\",\n\t\t\tcharset: \"utf8mb4\",\n\t\t\tprefix: \"\",\n\t\t\t...config,\n\t\t};\n\n\t\tif (this.config.port === undefined) {\n\t\t\tif (this.config.driver === \"mysql\") this.config.port = 3306;\n\t\t\telse if (this.config.driver === \"postgresql\") this.config.port = 5432;\n\t\t}\n\t}\n\n\tasync connect(): Promise<void> {\n\t\tif (this.driver !== null) return;\n\t\tthis.driver = await createDriver(this.config);\n\t\tawait this.driver.connect();\n\t}\n\n\tasync disconnect(): Promise<void> {\n\t\tif (this.driver !== null) {\n\t\t\tawait this.driver.disconnect();\n\t\t\tthis.driver = null;\n\t\t}\n\t}\n\n\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.raw(sql, bindings);\n\t}\n\n\ttable(tableName: string): QueryBuilder {\n\t\treturn new QueryBuilder(this, `${this.config.prefix ?? \"\"}${tableName}`);\n\t}\n\n\tisConnected(): boolean {\n\t\treturn this.driver !== null && this.driver.isConnected();\n\t}\n\n\tgetDriver(): DatabaseDriver {\n\t\treturn (this.config.driver ?? \"mysql\") as DatabaseDriver;\n\t}\n\n\tgetDialect(): Dialect {\n\t\tthis.ensureConnected();\n\t\treturn this.driver!.getDialect();\n\t}\n\n\tgetPrefix(): string {\n\t\treturn this.config.prefix ?? \"\";\n\t}\n\n\tgetConfig(): Readonly<ConnectionConfig> {\n\t\treturn { ...this.config };\n\t}\n\n\tasync transaction<T>(\n\t\tcallback: (trx: DatabaseConnection) => Promise<T>,\n\t): Promise<T> {\n\t\tthis.ensureConnected();\n\n\t\treturn this.driver!.transaction(async (_driver: Driver) => {\n\t\t\tconst trxConnection = new DatabaseConnection(this.config);\n\t\t\ttrxConnection[\"driver\"] = this.driver;\n\n\t\t\ttrxConnection.raw = async (\n\t\t\t\tsql: string,\n\t\t\t\tbindings?: any[],\n\t\t\t): Promise<QueryResult> => {\n\t\t\t\treturn this.driver!.raw(sql, bindings);\n\t\t\t};\n\n\t\t\treturn callback(trxConnection);\n\t\t});\n\t}\n\n\tstatic generateId(): string {\n\t\treturn randomUUID();\n\t}\n\n\tprivate ensureConnected(): void {\n\t\tif (this.driver === null || !this.driver.isConnected()) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Database not connected. Call connect() before performing operations.\",\n\t\t\t);\n\t\t}\n\t}\n}\n","export interface Dialect {\n\twrapIdentifier(identifier: string): string;\n\tmakeParameter(index: number): string;\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string;\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\tbindings: any[],\n\t\tidColumn?: string,\n\t): string;\n\tcompileTruncate(tableName: string): string;\n\tcompileCreateMigrationsTable(): string;\n\tcompileColumn(column: ColumnCompileOptions): string;\n\tcompileModifyColumn(column: ColumnCompileOptions): string;\n\tcompileTableBlueprint(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileAddColumns(tableName: string, columns: ColumnCompileOptions[]): string;\n\tcompileDropColumns(tableName: string, columns: string[]): string;\n\tcompileRenameColumn(tableName: string, from: string, to: string): string;\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string;\n\tcompileRenameTable(from: string, to: string): string;\n\tcompileDropTable(tableName: string): string;\n\tcompileDropTableIfExists(tableName: string): string;\n\tcompileHasTable(tableName: string): string;\n\tcompileHasColumn(tableName: string, columnName: string): string;\n\tcompileInsert(sql: string): string;\n}\n\nexport interface ColumnCompileOptions {\n\tname: string;\n\ttype: string;\n\tnullable: boolean;\n\tdefaultValue: any;\n\tunsigned: boolean;\n\tunique: boolean;\n\tprimary: boolean;\n\tindex: boolean;\n\tcomment: string | null;\n\tafter: string | null;\n\tfirst: boolean;\n\tautoIncrement: boolean;\n\tprecision: number | null;\n\tscale: number | null;\n\tlength: number | null;\n\tvalues: string[] | null;\n\tisForeignId: boolean;\n}\n\nexport class MysqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\\`${identifier.replace(/`/g, \"``\")}\\``;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT LAST_INSERT_ID() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \\`migrations\\` (\n \\`id\\` INT AUTO_INCREMENT PRIMARY KEY,\n \\`name\\` VARCHAR(255) NOT NULL,\n \\`batch\\` INT NOT NULL,\n \\`executed_at\\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGINT AUTO_INCREMENT PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INT\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"TINYINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"TINYINT(1)\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"FLOAT\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"DATETIME\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"YEAR\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"CHAR(36)\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INT UNSIGNED\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.unsigned &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\" &&\n\t\t\toptions.type !== \"foreignId\"\n\t\t)\n\t\t\tsql += \" UNSIGNED\";\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTO_INCREMENT\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t} else if (\n\t\t\t!options.nullable &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t) {\n\t\t\tsql += \" NOT NULL\";\n\t\t}\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` COMMENT '${options.comment.replace(/'/g, \"\\\\'\")}'`;\n\t\tif (options.after !== null)\n\t\t\tsql += ` AFTER ${this.wrapIdentifier(options.after)}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `MODIFY COLUMN ${this.compileColumn(options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD ${columns.map((c) => this.compileColumn(c)).join(\", ADD \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `RENAME TABLE ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`tables\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*) as \\`count\\` FROM \\`information_schema\\`.\\`columns\\` WHERE \\`table_schema\\` = DATABASE() AND \\`table_name\\` = ? AND \\`column_name\\` = ?`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"\\\\'\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class SqliteDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(_index: number): string {\n\t\treturn \"?\";\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn \" LIMIT ? OFFSET ?\";\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn \" LIMIT ?\";\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\t_idColumn?: string,\n\t): string {\n\t\treturn `${sql}; SELECT last_insert_rowid() as id`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `DELETE FROM ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" INTEGER PRIMARY KEY AUTOINCREMENT,\n \"name\" TEXT NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TEXT DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"INTEGER PRIMARY KEY AUTOINCREMENT\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"date\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"json\":\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BLOB\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\toptions.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" AUTOINCREMENT\";\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.defaultValue === undefined &&\n\t\t\t!options.autoIncrement &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (options.primary) sql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn this.compileColumn(options);\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(tableName: string): string {\n\t\treturn `DROP TABLE ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*) as \"count\" FROM \"sqlite_master\" WHERE \"type\" = 'table' AND \"name\" = ?`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `PRAGMA table_info(${this.wrapIdentifier(_tableName)})`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n\t\treturn String(value);\n\t}\n}\n\nexport class PostgresqlDialect implements Dialect {\n\twrapIdentifier(identifier: string): string {\n\t\treturn `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tmakeParameter(index: number): string {\n\t\treturn `$${index + 1}`;\n\t}\n\n\tcompileLimitOffset(\n\t\tbindings: any[],\n\t\tlimit: number | null,\n\t\toffset: number | null,\n\t): string {\n\t\tif (limit === null && offset === null) return \"\";\n\t\tconst start = bindings.length;\n\t\tif (offset !== null) {\n\t\t\tbindings.push(limit ?? 0, offset);\n\t\t\treturn ` LIMIT $${start + 1} OFFSET $${start + 2}`;\n\t\t}\n\t\tbindings.push(limit);\n\t\treturn ` LIMIT $${start + 1}`;\n\t}\n\n\tcompileInsertReturning(\n\t\tsql: string,\n\t\t_bindings: any[],\n\t\tidColumn = \"id\",\n\t): string {\n\t\treturn `${sql} RETURNING ${this.wrapIdentifier(idColumn)}`;\n\t}\n\n\tcompileTruncate(tableName: string): string {\n\t\treturn `TRUNCATE TABLE ${this.wrapIdentifier(tableName)} RESTART IDENTITY CASCADE`;\n\t}\n\n\tcompileCreateMigrationsTable(): string {\n\t\treturn `CREATE TABLE IF NOT EXISTS \"migrations\" (\n \"id\" SERIAL PRIMARY KEY,\n \"name\" VARCHAR(255) NOT NULL,\n \"batch\" INTEGER NOT NULL,\n \"executed_at\" TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)`;\n\t}\n\n\tprivate mapType(type: string, options: ColumnCompileOptions): string {\n\t\tswitch (type) {\n\t\t\tcase \"id\":\n\t\t\tcase \"increments\":\n\t\t\t\treturn \"SERIAL PRIMARY KEY\";\n\t\t\tcase \"bigIncrements\":\n\t\t\t\treturn \"BIGSERIAL PRIMARY KEY\";\n\t\t\tcase \"string\":\n\t\t\t\treturn `VARCHAR(${options.length ?? 255})`;\n\t\t\tcase \"text\":\n\t\t\t\treturn \"TEXT\";\n\t\t\tcase \"integer\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"bigInteger\":\n\t\t\t\treturn \"BIGINT\";\n\t\t\tcase \"tinyInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"smallInteger\":\n\t\t\t\treturn \"SMALLINT\";\n\t\t\tcase \"boolean\":\n\t\t\t\treturn \"BOOLEAN\";\n\t\t\tcase \"float\":\n\t\t\t\treturn \"REAL\";\n\t\t\tcase \"double\":\n\t\t\t\treturn \"DOUBLE PRECISION\";\n\t\t\tcase \"decimal\":\n\t\t\t\treturn `DECIMAL(${options.precision ?? 10},${options.scale ?? 0})`;\n\t\t\tcase \"date\":\n\t\t\t\treturn \"DATE\";\n\t\t\tcase \"datetime\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn \"TIMESTAMP\";\n\t\t\tcase \"time\":\n\t\t\t\treturn \"TIME\";\n\t\t\tcase \"year\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tcase \"json\":\n\t\t\t\treturn \"JSON\";\n\t\t\tcase \"jsonb\":\n\t\t\t\treturn \"JSONB\";\n\t\t\tcase \"binary\":\n\t\t\t\treturn \"BYTEA\";\n\t\t\tcase \"uuid\":\n\t\t\t\treturn \"UUID\";\n\t\t\tcase \"foreignId\":\n\t\t\t\treturn \"INTEGER\";\n\t\t\tdefault:\n\t\t\t\treturn type;\n\t\t}\n\t}\n\n\tcompileColumn(options: ColumnCompileOptions): string {\n\t\tlet sql = `${this.wrapIdentifier(options.name)} ${this.mapType(options.type, options)}`;\n\t\tif (\n\t\t\t!options.nullable &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" NOT NULL\";\n\t\tif (options.nullable) sql += \" NULL\";\n\t\tif (options.defaultValue !== undefined && options.defaultValue !== null) {\n\t\t\tsql += ` DEFAULT ${this.formatDefault(options.defaultValue)}`;\n\t\t}\n\t\tif (\n\t\t\toptions.primary &&\n\t\t\toptions.type !== \"id\" &&\n\t\t\toptions.type !== \"increments\" &&\n\t\t\toptions.type !== \"bigIncrements\"\n\t\t)\n\t\t\tsql += \" PRIMARY KEY\";\n\t\tif (options.unique) sql += \" UNIQUE\";\n\t\tif (options.comment !== null)\n\t\t\tsql += ` -- ${options.comment.replace(/--/g, \"\")}`;\n\t\treturn sql;\n\t}\n\n\tcompileModifyColumn(options: ColumnCompileOptions): string {\n\t\treturn `ALTER COLUMN ${this.wrapIdentifier(options.name)} TYPE ${this.mapType(options.type, options)}`;\n\t}\n\n\tcompileTableBlueprint(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst parts = [\n\t\t\t...columns.map((c) => this.compileColumn(c)),\n\t\t\t...constraints,\n\t\t];\n\t\treturn parts.join(\",\\n \");\n\t}\n\n\tcompileAddColumns(\n\t\t_tableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t): string {\n\t\treturn `ADD COLUMN ${columns.map((c) => this.compileColumn(c)).join(\", ADD COLUMN \")}`;\n\t}\n\n\tcompileDropColumns(_tableName: string, columns: string[]): string {\n\t\treturn `DROP COLUMN ${columns.map((c) => this.wrapIdentifier(c)).join(\", DROP COLUMN \")}`;\n\t}\n\n\tcompileRenameColumn(_tableName: string, from: string, to: string): string {\n\t\treturn `RENAME COLUMN ${this.wrapIdentifier(from)} TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileCreateTable(\n\t\ttableName: string,\n\t\tcolumns: ColumnCompileOptions[],\n\t\tconstraints: string[],\n\t): string {\n\t\tconst body = this.compileTableBlueprint(tableName, columns, constraints);\n\t\treturn `CREATE TABLE ${this.wrapIdentifier(tableName)} (\\n ${body}\\n)`;\n\t}\n\n\tcompileRenameTable(from: string, to: string): string {\n\t\treturn `ALTER TABLE ${this.wrapIdentifier(from)} RENAME TO ${this.wrapIdentifier(to)}`;\n\t}\n\n\tcompileDropTable(_tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(_tableName)}`;\n\t}\n\n\tcompileDropTableIfExists(tableName: string): string {\n\t\treturn `DROP TABLE IF EXISTS ${this.wrapIdentifier(tableName)}`;\n\t}\n\n\tcompileHasTable(_tableName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"tables\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1`;\n\t}\n\n\tcompileHasColumn(_tableName: string, _columnName: string): string {\n\t\treturn `SELECT COUNT(*)::int as \"count\" FROM \"information_schema\".\"columns\" WHERE \"table_schema\" = 'public' AND \"table_name\" = $1 AND \"column_name\" = $2`;\n\t}\n\n\tcompileInsert(sql: string): string {\n\t\treturn sql;\n\t}\n\n\tprivate formatDefault(value: any): string {\n\t\tif (typeof value === \"string\") {\n\t\t\tif (value === \"CURRENT_TIMESTAMP\") return value;\n\t\t\treturn `'${value.replace(/'/g, \"''\")}'`;\n\t\t}\n\t\tif (value === null) return \"NULL\";\n\t\tif (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n\t\treturn String(value);\n\t}\n}\n\nexport function createDialect(driver: string): Dialect {\n\tswitch (driver) {\n\t\tcase \"mysql\":\n\t\t\treturn new MysqlDialect();\n\t\tcase \"sqlite\":\n\t\t\treturn new SqliteDialect();\n\t\tcase \"postgresql\":\n\t\t\treturn new PostgresqlDialect();\n\t\tdefault:\n\t\t\treturn new MysqlDialect();\n\t}\n}\n","import {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresqlDialect,\n\tSqliteDialect,\n} from \"./dialect.js\";\nimport type { ConnectionConfig, QueryResult } from \"./types.js\";\n\nexport type { Dialect };\n\nexport function createDialect(driver: string): Dialect {\n\tswitch (driver) {\n\t\tcase \"mysql\":\n\t\t\treturn new MysqlDialect();\n\t\tcase \"sqlite\":\n\t\t\treturn new SqliteDialect();\n\t\tcase \"postgresql\":\n\t\t\treturn new PostgresqlDialect();\n\t\tdefault:\n\t\t\treturn new MysqlDialect();\n\t}\n}\n\nexport interface Driver {\n\tconnect(): Promise<void>;\n\tdisconnect(): Promise<void>;\n\tisConnected(): boolean;\n\traw(sql: string, bindings?: any[]): Promise<QueryResult>;\n\ttransaction<T>(callback: (driver: Driver) => Promise<T>): Promise<T>;\n\tgetDialect(): Dialect;\n\tgetDriver(): string;\n}\n\nexport async function createDriver(config: ConnectionConfig): Promise<Driver> {\n\tconst driverType = config.driver ?? \"mysql\";\n\n\tswitch (driverType) {\n\t\tcase \"mysql\":\n\t\t\treturn createMysqlDriver(config);\n\t\tcase \"postgresql\":\n\t\t\treturn createPostgresqlDriver(config);\n\t\tcase \"sqlite\":\n\t\t\treturn createSqliteDriver(config);\n\t\tdefault:\n\t\t\treturn createMysqlDriver(config);\n\t}\n}\n\nasync function createMysqlDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet mysqlPackage: any;\n\ttry {\n\t\t// @ts-expect-error - mysql2 is an optional runtime dependency\n\t\tmysqlPackage = await import(\"mysql2/promise\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"MySQL driver (mysql2) is not installed. Run: npm install mysql2\",\n\t\t);\n\t}\n\n\tlet connection: any = null;\n\tconst dialect = new MysqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tconnection = await mysqlPackage.createConnection({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 3306,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t\tcharset: config.charset ?? \"utf8mb4\",\n\t\t\t});\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (connection !== null) {\n\t\t\t\tawait connection.end();\n\t\t\t\tconnection = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn connection !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (connection === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst [rows, fields] = await connection.execute(sql, bindings ?? []);\n\t\t\treturn { rows, fields };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (connection === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tawait connection.beginTransaction();\n\t\t\ttry {\n\t\t\t\tconst result = await callback(driver);\n\t\t\t\tawait connection.commit();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait connection.rollback();\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"mysql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createPostgresqlDriver(\n\tconfig: ConnectionConfig,\n): Promise<Driver> {\n\tlet pgPackage: any;\n\ttry {\n\t\t// @ts-expect-error - pg is an optional runtime dependency\n\t\tpgPackage = await import(\"pg\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"PostgreSQL driver (pg) is not installed. Run: npm install pg\",\n\t\t);\n\t}\n\n\tlet pool: any = null;\n\tconst dialect = new PostgresqlDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tconst { Pool } = pgPackage;\n\t\t\tpool = new Pool({\n\t\t\t\thost: config.host ?? \"127.0.0.1\",\n\t\t\t\tport: config.port ?? 5432,\n\t\t\t\tuser: config.username,\n\t\t\t\tpassword: config.password,\n\t\t\t\tdatabase: config.database,\n\t\t\t});\n\t\t\tawait pool.query(\"SELECT 1\");\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (pool !== null) {\n\t\t\t\tawait pool.end();\n\t\t\t\tpool = null;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn pool !== null;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst result = await pool.query(sql, bindings ?? []);\n\t\t\treturn { rows: result.rows };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (pool === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst client = await pool.connect();\n\t\t\ttry {\n\t\t\t\tawait client.query(\"BEGIN\");\n\t\t\t\tconst trxDriver: Driver = {\n\t\t\t\t\t...driver,\n\t\t\t\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\t\t\t\tconst result = await client.query(sql, bindings ?? []);\n\t\t\t\t\t\treturn { rows: result.rows };\n\t\t\t\t\t},\n\t\t\t\t\tgetDialect(): Dialect {\n\t\t\t\t\t\treturn dialect;\n\t\t\t\t\t},\n\t\t\t\t\tgetDriver(): string {\n\t\t\t\t\t\treturn \"postgresql\";\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst result = await callback(trxDriver);\n\t\t\t\tawait client.query(\"COMMIT\");\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tawait client.query(\"ROLLBACK\");\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tclient.release();\n\t\t\t}\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"postgresql\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n\nasync function createSqliteDriver(config: ConnectionConfig): Promise<Driver> {\n\tlet sqlitePackage: any;\n\ttry {\n\t\t// @ts-expect-error - better-sqlite3 is an optional runtime dependency\n\t\tsqlitePackage = await import(\"better-sqlite3\");\n\t} catch {\n\t\tthrow new Error(\n\t\t\t\"SQLite driver (better-sqlite3) is not installed. Run: npm install better-sqlite3\",\n\t\t);\n\t}\n\n\tlet db: any = null;\n\tlet connected = false;\n\tconst dialect = new SqliteDialect();\n\n\tconst driver: Driver = {\n\t\tasync connect(): Promise<void> {\n\t\t\tdb = new sqlitePackage(config.database);\n\t\t\tdb.pragma(\"journal_mode = WAL\");\n\t\t\tconnected = true;\n\t\t},\n\n\t\tasync disconnect(): Promise<void> {\n\t\t\tif (db !== null) {\n\t\t\t\tdb.close();\n\t\t\t\tdb = null;\n\t\t\t\tconnected = false;\n\t\t\t}\n\t\t},\n\n\t\tisConnected(): boolean {\n\t\t\treturn connected;\n\t\t},\n\n\t\tasync raw(sql: string, bindings?: any[]): Promise<QueryResult> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst trimmedSQL = sql.trim().toUpperCase();\n\t\t\tconst isQuery =\n\t\t\t\ttrimmedSQL.startsWith(\"SELECT\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"WITH\") ||\n\t\t\t\ttrimmedSQL.startsWith(\"PRAGMA\");\n\t\t\tconst stmt = db.prepare(sql);\n\t\t\tif (isQuery) {\n\t\t\t\tconst rows =\n\t\t\t\t\tbindings !== undefined && bindings.length > 0\n\t\t\t\t\t\t? stmt.all(...bindings)\n\t\t\t\t\t\t: stmt.all();\n\t\t\t\treturn { rows };\n\t\t\t}\n\t\t\tif (bindings !== undefined && bindings.length > 0) {\n\t\t\t\tstmt.run(...bindings);\n\t\t\t} else {\n\t\t\t\tstmt.run();\n\t\t\t}\n\t\t\treturn { rows: [] };\n\t\t},\n\n\t\tasync transaction<T>(callback: (d: Driver) => Promise<T>): Promise<T> {\n\t\t\tif (db === null) {\n\t\t\t\tthrow new Error(\"Database not connected. Call connect() first.\");\n\t\t\t}\n\t\t\tconst txn = db.transaction(async () => {\n\t\t\t\treturn await callback(driver);\n\t\t\t});\n\t\t\treturn txn();\n\t\t},\n\n\t\tgetDialect(): Dialect {\n\t\t\treturn dialect;\n\t\t},\n\n\t\tgetDriver(): string {\n\t\t\treturn \"sqlite\";\n\t\t},\n\t};\n\n\treturn driver;\n}\n","import type { Dialect } from \"./dialect.js\";\nimport type { JoinType, OrderDirection, QueryRunner } from \"./types.js\";\n\ninterface WhereClause {\n\ttype:\n\t\t| \"basic\"\n\t\t| \"in\"\n\t\t| \"notIn\"\n\t\t| \"null\"\n\t\t| \"notNull\"\n\t\t| \"between\"\n\t\t| \"notBetween\"\n\t\t| \"like\"\n\t\t| \"nested\";\n\tcolumn?: string;\n\toperator?: string;\n\tvalue?: any;\n\tvalues?: any[];\n\tboolean: \"and\" | \"or\";\n\tnested?: WhereClause[];\n}\n\ninterface JoinClause {\n\ttable: string;\n\tfirst: string;\n\toperator: string;\n\tsecond: string;\n\ttype: JoinType;\n}\n\ninterface OrderByClause {\n\tcolumn: string;\n\tdirection: OrderDirection;\n}\n\ninterface HavingClause {\n\tcolumn: string;\n\toperator: string;\n\tvalue: any;\n}\n\nexport interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class QueryBuilder {\n\tprivate connection: QueryRunner;\n\tprivate tableName: string;\n\tprivate columns: string[] = [\"*\"];\n\tprivate distinctEnabled = false;\n\tprivate wheres: WhereClause[] = [];\n\tprivate joins: JoinClause[] = [];\n\tprivate orderBys: OrderByClause[] = [];\n\tprivate havings: HavingClause[] = [];\n\tprivate groupBys: string[] = [];\n\tprivate limitValue: number | null = null;\n\tprivate offsetValue: number | null = null;\n\tprivate fromSubquery: string | null = null;\n\n\tconstructor(connection: QueryRunner, tableName: string) {\n\t\tthis.connection = connection;\n\t\tthis.tableName = tableName;\n\t}\n\n\tselect(...columns: string[]): this {\n\t\tthis.columns = columns.length > 0 ? columns : [\"*\"];\n\t\treturn this;\n\t}\n\n\taddSelect(...columns: string[]): this {\n\t\tif (this.columns[0] === \"*\") {\n\t\t\tthis.columns = columns;\n\t\t} else {\n\t\t\tthis.columns.push(...columns);\n\t\t}\n\t\treturn this;\n\t}\n\n\tdistinct(): this {\n\t\tthis.distinctEnabled = true;\n\t\treturn this;\n\t}\n\n\tfrom(table: string): this {\n\t\tthis.fromSubquery = table;\n\t\treturn this;\n\t}\n\n\twhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\torWhere(column: string, operator: any, value?: any): this {\n\t\tif (value === undefined) {\n\t\t\tvalue = operator;\n\t\t\toperator = \"=\";\n\t\t}\n\t\tthis.wheres.push({\n\t\t\ttype: \"basic\",\n\t\t\tcolumn,\n\t\t\toperator: String(operator),\n\t\t\tvalue,\n\t\t\tboolean: \"or\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"in\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotIn(column: string, values: any[]): this {\n\t\tthis.wheres.push({ type: \"notIn\", column, values, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNull(column: string): this {\n\t\tthis.wheres.push({ type: \"null\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereNotNull(column: string): this {\n\t\tthis.wheres.push({ type: \"notNull\", column, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\twhereBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"between\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereNotBetween(column: string, range: [any, any]): this {\n\t\tthis.wheres.push({\n\t\t\ttype: \"notBetween\",\n\t\t\tcolumn,\n\t\t\tvalues: range,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\twhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"and\" });\n\t\treturn this;\n\t}\n\n\torWhereLike(column: string, pattern: string): this {\n\t\tthis.wheres.push({ type: \"like\", column, value: pattern, boolean: \"or\" });\n\t\treturn this;\n\t}\n\n\twhereGroup(callback: (query: QueryBuilder) => void): this {\n\t\tconst subQuery = new QueryBuilder(this.connection, this.tableName);\n\t\tcallback(subQuery);\n\t\tthis.wheres.push({\n\t\t\ttype: \"nested\",\n\t\t\tnested: subQuery.wheres,\n\t\t\tboolean: \"and\",\n\t\t});\n\t\treturn this;\n\t}\n\n\tjoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t\ttype: JoinType = \"inner\",\n\t): this {\n\t\tthis.joins.push({ table, first, operator, second, type });\n\t\treturn this;\n\t}\n\n\tleftJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"left\");\n\t}\n\n\trightJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"right\");\n\t}\n\n\tcrossJoin(\n\t\ttable: string,\n\t\tfirst: string,\n\t\toperator: string,\n\t\tsecond: string,\n\t): this {\n\t\treturn this.join(table, first, operator, second, \"cross\");\n\t}\n\n\torderBy(column: string, direction: OrderDirection = \"asc\"): this {\n\t\tthis.orderBys.push({ column, direction });\n\t\treturn this;\n\t}\n\n\torderByDesc(column: string): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\tlatest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"desc\");\n\t}\n\n\toldest(column = \"created_at\"): this {\n\t\treturn this.orderBy(column, \"asc\");\n\t}\n\n\tinRandomOrder(): this {\n\t\tthis.orderBys.push({ column: \"RANDOM()\", direction: \"asc\" });\n\t\treturn this;\n\t}\n\n\tlimit(limit: number): this {\n\t\tthis.limitValue = limit;\n\t\treturn this;\n\t}\n\n\toffset(offset: number): this {\n\t\tthis.offsetValue = offset;\n\t\treturn this;\n\t}\n\n\tskip(skip: number): this {\n\t\treturn this.offset(skip);\n\t}\n\n\ttake(take: number): this {\n\t\treturn this.limit(take);\n\t}\n\n\tgroupBy(...columns: string[]): this {\n\t\tthis.groupBys.push(...columns);\n\t\treturn this;\n\t}\n\n\thaving(column: string, operator: string, value: any): this {\n\t\tthis.havings.push({ column, operator, value });\n\t\treturn this;\n\t}\n\n\tasync get<T = any>(): Promise<T[]> {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows as T[];\n\t}\n\n\tasync first<T = any>(): Promise<T | null> {\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = 1;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn (result.rows.length > 0 ? result.rows[0] : null) as T | null;\n\t}\n\n\tasync find<T = any>(id: number | string): Promise<T | null> {\n\t\treturn this.where(\"id\", id).first<T>();\n\t}\n\n\tasync pluck(column: string): Promise<any[]> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [column];\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\treturn result.rows.map((row: any) => row[column]);\n\t}\n\n\tasync count(column = \"*\"): Promise<number> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [\n\t\t\t`COUNT(${column === \"*\" ? \"*\" : this.wrap(column)}) as aggregate`,\n\t\t];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return 0;\n\t\treturn Number(row.aggregate ?? row.count ?? row[\"COUNT(*)\"] ?? 0);\n\t}\n\n\tasync exists(): Promise<boolean> {\n\t\tconst count = await this.count();\n\t\treturn count > 0;\n\t}\n\n\tasync doesntExist(): Promise<boolean> {\n\t\treturn !(await this.exists());\n\t}\n\n\tasync max(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MAX\", column);\n\t}\n\n\tasync min(column: string): Promise<number | null> {\n\t\treturn this.aggregate(\"MIN\", column);\n\t}\n\n\tasync sum(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"SUM\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync avg(column: string): Promise<number> {\n\t\tconst result = await this.aggregate(\"AVG\", column);\n\t\treturn result ?? 0;\n\t}\n\n\tasync paginate(perPage = 15, page = 1): Promise<PaginatedResult> {\n\t\tconst countQb = this.clone();\n\t\tconst total = await countQb.count();\n\n\t\tconst lastPage = Math.max(1, Math.ceil(total / perPage));\n\t\tconst currentPage = Math.max(1, Math.min(page, lastPage));\n\t\tconst fromVal = (currentPage - 1) * perPage + 1;\n\t\tconst toVal = Math.min(currentPage * perPage, total);\n\n\t\tconst qb = this.clone();\n\t\tqb.limitValue = perPage;\n\t\tqb.offsetValue = (currentPage - 1) * perPage;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\n\t\treturn {\n\t\t\tdata: result.rows,\n\t\t\tcurrentPage,\n\t\t\tperPage,\n\t\t\ttotal,\n\t\t\tlastPage,\n\t\t\tfrom: total > 0 ? fromVal : 0,\n\t\t\tto: total > 0 ? toVal : 0,\n\t\t\thasMore: currentPage < lastPage,\n\t\t\thasPrev: currentPage > 1,\n\t\t\tisEmpty: total === 0,\n\t\t};\n\t}\n\n\tasync insert(data: Record<string, any>): Promise<number | string> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst driverType = this.connection.getDriver();\n\n\t\tif (driverType === \"postgresql\") {\n\t\t\tconst dialect = this.connection.getDialect();\n\t\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\t\treturn result.rows.length > 0 ? (Number(result.rows[0].id) ?? 0) : 0;\n\t\t}\n\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tif (result.rows && result.rows.length > 0) {\n\t\t\treturn Number(result.rows[0].id) ?? result.rows[0].insertId ?? 0;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync insertGetId(data: Record<string, any>): Promise<number | string> {\n\t\treturn this.insert(data);\n\t}\n\n\tasync insertReturning(data: Record<string, any>): Promise<any> {\n\t\tconst { sql, bindings } = this.compileInsert(data);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst returningSQL = dialect.compileInsertReturning(sql, bindings);\n\t\tconst result = await this.connection.raw(returningSQL, bindings);\n\t\treturn result.rows.length > 0 ? result.rows[0] : null;\n\t}\n\n\tasync update(data: Record<string, any>): Promise<number> {\n\t\tconst { sql, bindings } = this.compileUpdate(data);\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync delete(): Promise<number> {\n\t\tconst { sql, bindings } = this.compileDelete();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst rows = result.rows;\n\t\tif (rows.length > 0) {\n\t\t\tconst info = rows[0];\n\t\t\treturn info.affectedRows ?? info.changes ?? rows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\tasync truncate(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileTruncate(this.tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync chunk(\n\t\tsize: number,\n\t\tcallback: (rows: any[]) => Promise<void>,\n\t): Promise<void> {\n\t\tlet page = 1;\n\t\tlet hasMore = true;\n\n\t\twhile (hasMore) {\n\t\t\tconst qb = this.clone();\n\t\t\tqb.limitValue = size;\n\t\t\tqb.offsetValue = (page - 1) * size;\n\t\t\tconst rows = await qb.get();\n\n\t\t\tif (rows.length === 0) {\n\t\t\t\thasMore = false;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tawait callback(rows);\n\n\t\t\tif (rows.length < size) {\n\t\t\t\thasMore = false;\n\t\t\t}\n\n\t\t\tpage++;\n\t\t}\n\t}\n\n\tclone(): QueryBuilder {\n\t\tconst qb = new QueryBuilder(this.connection, this.tableName);\n\t\tqb.columns = [...this.columns];\n\t\tqb.distinctEnabled = this.distinctEnabled;\n\t\tqb.wheres = this.cloneWheres(this.wheres);\n\t\tqb.joins = [...this.joins];\n\t\tqb.orderBys = [...this.orderBys];\n\t\tqb.havings = [...this.havings];\n\t\tqb.groupBys = [...this.groupBys];\n\t\tqb.limitValue = this.limitValue;\n\t\tqb.offsetValue = this.offsetValue;\n\t\tqb.fromSubquery = this.fromSubquery;\n\t\treturn qb;\n\t}\n\n\ttoSQL(): { sql: string; bindings: any[] } {\n\t\tconst bindings: any[] = [];\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tconst wrappedColumns = this.columns\n\t\t\t.map((c) =>\n\t\t\t\tc.includes(\"(\") || c === \"*\" || c.includes(\" as \") || c.includes(\" AS \")\n\t\t\t\t\t? c\n\t\t\t\t\t: dialect.wrapIdentifier(c),\n\t\t\t)\n\t\t\t.join(\", \");\n\n\t\tconst from = this.fromSubquery ?? this.tableName;\n\t\tconst wrappedFrom = this.fromSubquery ?? dialect.wrapIdentifier(from);\n\n\t\tlet sql = this.distinctEnabled\n\t\t\t? `SELECT DISTINCT ${wrappedColumns} FROM ${wrappedFrom}`\n\t\t\t: `SELECT ${wrappedColumns} FROM ${wrappedFrom}`;\n\n\t\tconst joinSQL = this.compileJoins(dialect);\n\t\tif (joinSQL) sql += joinSQL;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.groupBys.length > 0) {\n\t\t\tsql += ` GROUP BY ${this.groupBys.map((c) => dialect.wrapIdentifier(c)).join(\", \")}`;\n\t\t}\n\n\t\tconst havingSQL = this.compileHavings(dialect, bindings);\n\t\tif (havingSQL) sql += havingSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tdd(): never {\n\t\tconst { sql, bindings } = this.toSQL();\n\t\tconst output = `SQL: ${sql}\\nBindings: ${JSON.stringify(bindings)}`;\n\t\tconsole.error(output);\n\t\tprocess.exit(1);\n\t}\n\n\tprivate compileJoins(dialect: Dialect): string {\n\t\tif (this.joins.length === 0) return \"\";\n\n\t\treturn (\n\t\t\t\" \" +\n\t\t\tthis.joins\n\t\t\t\t.map((j) => {\n\t\t\t\t\tconst type = j.type.toUpperCase();\n\t\t\t\t\treturn `${type} JOIN ${dialect.wrapIdentifier(j.table)} ON ${dialect.wrapIdentifier(j.first)} ${j.operator} ${this.wrap(j.second)}`;\n\t\t\t\t})\n\t\t\t\t.join(\" \")\n\t\t);\n\t}\n\n\tprivate compileWheres(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.wheres.length === 0) return \"\";\n\n\t\tconst sql = this.compileWhereArray(this.wheres, dialect, bindings);\n\t\treturn sql ? ` WHERE ${sql}` : \"\";\n\t}\n\n\tprivate compileWhereArray(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tif (wheres.length === 0) return \"\";\n\n\t\tconst parts: string[] = [];\n\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) parts.push(sql);\n\t\t}\n\n\t\tif (parts.length === 0) return \"\";\n\n\t\treturn parts.join(\" AND \");\n\t}\n\n\tprivate compileSingleWhere(\n\t\tw: WhereClause,\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string | null {\n\t\tconst col = w.column ? dialect.wrapIdentifier(w.column) : \"\";\n\n\t\tswitch (w.type) {\n\t\t\tcase \"basic\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\tconst operator = w.operator === \"=\" ? \"=\" : w.operator;\n\t\t\t\treturn `${col} ${operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"in\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"notIn\": {\n\t\t\t\tconst placeholders = w\n\t\t\t\t\t.values!.map((v: any) => {\n\t\t\t\t\t\tbindings.push(v);\n\t\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t\t})\n\t\t\t\t\t.join(\", \");\n\t\t\t\treturn `${col} NOT IN (${placeholders})`;\n\t\t\t}\n\t\t\tcase \"null\":\n\t\t\t\treturn `${col} IS NULL`;\n\t\t\tcase \"notNull\":\n\t\t\t\treturn `${col} IS NOT NULL`;\n\t\t\tcase \"between\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"notBetween\": {\n\t\t\t\tbindings.push(w.values![0], w.values![1]);\n\t\t\t\treturn `${col} NOT BETWEEN ${dialect.makeParameter(bindings.length - 2)} AND ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"like\": {\n\t\t\t\tbindings.push(w.value);\n\t\t\t\treturn `${col} LIKE ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t\t}\n\t\t\tcase \"nested\": {\n\t\t\t\tconst nestedSQL = this.compileNestedWhere(w.nested!, dialect, bindings);\n\t\t\t\treturn nestedSQL ? `(${nestedSQL})` : null;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate compileNestedWhere(\n\t\twheres: WhereClause[],\n\t\tdialect: Dialect,\n\t\tbindings: any[],\n\t): string {\n\t\tconst parts: string[] = [];\n\n\t\tfor (const w of wheres) {\n\t\t\tconst sql = this.compileSingleWhere(w, dialect, bindings);\n\t\t\tif (sql !== null) {\n\t\t\t\tparts.push(sql);\n\t\t\t}\n\t\t}\n\n\t\tif (parts.length === 0) return \"\";\n\n\t\treturn parts.join(\" AND \");\n\t}\n\n\tprivate compileHavings(dialect: Dialect, bindings: any[]): string {\n\t\tif (this.havings.length === 0) return \"\";\n\n\t\tconst parts = this.havings.map((h) => {\n\t\t\tbindings.push(h.value);\n\t\t\treturn `${dialect.wrapIdentifier(h.column)} ${h.operator} ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\treturn ` HAVING ${parts.join(\" AND \")}`;\n\t}\n\n\tprivate compileInsert(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = Object.keys(data);\n\t\tconst values = Object.values(data);\n\t\tconst bindings: any[] = [];\n\n\t\tconst placeholders = values\n\t\t\t.map((v: any) => {\n\t\t\t\tbindings.push(v);\n\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t})\n\t\t\t.join(\", \");\n\n\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(this.tableName)} (${columns.map((c) => dialect.wrapIdentifier(c)).join(\", \")}) VALUES (${placeholders})`;\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileUpdate(data: Record<string, any>): {\n\t\tsql: string;\n\t\tbindings: any[];\n\t} {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tconst sets = Object.entries(data).map(([key, value]) => {\n\t\t\tbindings.push(value);\n\t\t\treturn `${dialect.wrapIdentifier(key)} = ${dialect.makeParameter(bindings.length - 1)}`;\n\t\t});\n\n\t\tlet sql = `UPDATE ${dialect.wrapIdentifier(this.tableName)} SET ${sets.join(\", \")}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate compileDelete(): { sql: string; bindings: any[] } {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst bindings: any[] = [];\n\n\t\tlet sql = `DELETE FROM ${dialect.wrapIdentifier(this.tableName)}`;\n\n\t\tconst whereSQL = this.compileWheres(dialect, bindings);\n\t\tif (whereSQL) sql += whereSQL;\n\n\t\tif (this.orderBys.length > 0) {\n\t\t\tsql += ` ORDER BY ${this.orderBys\n\t\t\t\t.map((o) => {\n\t\t\t\t\tconst col =\n\t\t\t\t\t\to.column === \"RANDOM()\"\n\t\t\t\t\t\t\t? o.column\n\t\t\t\t\t\t\t: dialect.wrapIdentifier(o.column);\n\t\t\t\t\treturn `${col} ${o.direction.toUpperCase()}`;\n\t\t\t\t})\n\t\t\t\t.join(\", \")}`;\n\t\t}\n\n\t\tconst limitOffsetSQL = dialect.compileLimitOffset(\n\t\t\tbindings,\n\t\t\tthis.limitValue,\n\t\t\tthis.offsetValue,\n\t\t);\n\t\tif (limitOffsetSQL) sql += limitOffsetSQL;\n\n\t\treturn { sql, bindings };\n\t}\n\n\tprivate async aggregate(fn: string, column: string): Promise<number | null> {\n\t\tconst qb = this.clone();\n\t\tqb.columns = [`${fn}(${this.wrap(column)}) as aggregate`];\n\t\tqb.orderBys = [];\n\t\tqb.limitValue = null;\n\t\tqb.offsetValue = null;\n\t\tconst { sql, bindings } = qb.toSQL();\n\t\tconst result = await this.connection.raw(sql, bindings);\n\t\tconst row = result.rows[0];\n\t\tif (!row) return null;\n\t\tconst val = row.aggregate ?? row[`${fn}(${column})`];\n\t\treturn val !== null && val !== undefined ? Number(val) : null;\n\t}\n\n\tprivate cloneWheres(wheres: WhereClause[]): WhereClause[] {\n\t\treturn wheres.map((w) => ({\n\t\t\t...w,\n\t\t\tvalues: w.values ? [...w.values] : undefined,\n\t\t\tnested: w.nested ? this.cloneWheres(w.nested) : undefined,\n\t\t}));\n\t}\n\n\tprivate wrap(identifier: string): string {\n\t\tif (identifier === \"*\" || identifier.includes(\"(\")) return identifier;\n\t\tconst dialect = this.connection.getDialect();\n\t\treturn dialect.wrapIdentifier(identifier);\n\t}\n}\n","import type { DatabaseConnection } from \"./connection.js\";\nimport type { ColumnCompileOptions, Dialect } from \"./dialect.js\";\nimport type { QueryResult } from \"./types.js\";\n\nexport interface MigrationDefinition {\n\tname: string;\n\tup: (schema: SchemaBuilder) => Promise<void>;\n\tdown: (schema: SchemaBuilder) => Promise<void>;\n}\n\nexport interface MigrationStatusRow {\n\tname: string;\n\tbatch: number;\n\texecutedAt: string;\n}\n\nexport class SchemaBuilder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync createTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"create\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst columns = blueprint.compileColumns();\n\t\tconst constraints = blueprint.compileConstraints(dialect);\n\t\tconst sql = dialect.compileCreateTable(tableName, columns, constraints);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTable(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTable(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync dropTableIfExists(tableName: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileDropTableIfExists(tableName);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync renameTable(from: string, to: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileRenameTable(from, to);\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tasync alterTable(\n\t\ttableName: string,\n\t\tcallback: (table: TableBlueprint) => void,\n\t): Promise<void> {\n\t\tconst blueprint = new TableBlueprint(this.connection, \"alter\");\n\t\tcallback(blueprint);\n\t\tconst dialect = this.connection.getDialect();\n\n\t\tif (blueprint.droppedColumns.length > 0) {\n\t\t\tconst dropSQL = dialect.compileDropColumns(\n\t\t\t\ttableName,\n\t\t\t\tblueprint.droppedColumns,\n\t\t\t);\n\t\t\tawait this.connection.raw(\n\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${dropSQL}`,\n\t\t\t);\n\t\t}\n\n\t\tif (blueprint.renamedColumns.length > 0) {\n\t\t\tfor (const { from, to } of blueprint.renamedColumns) {\n\t\t\t\tconst renameSQL = dialect.compileRenameColumn(tableName, from, to);\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${renameSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst compiledColumns = blueprint.compileColumnDefinitions(dialect);\n\t\tif (compiledColumns.length > 0) {\n\t\t\tfor (const colSQL of compiledColumns) {\n\t\t\t\tawait this.connection.raw(\n\t\t\t\t\t`ALTER TABLE ${dialect.wrapIdentifier(tableName)} ${colSQL}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync hasTable(tableName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileHasTable(tableName);\n\t\tconst result = await this.connection.raw(sql, [tableName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tasync hasColumn(tableName: string, columnName: string): Promise<boolean> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\t\tconst result = await this.connection.raw(sql);\n\t\t\treturn result.rows.some((row: any) => row.name === columnName);\n\t\t}\n\n\t\tconst sql = dialect.compileHasColumn(tableName, columnName);\n\t\tconst result = await this.connection.raw(sql, [tableName, columnName]);\n\t\treturn this.parseCount(result) > 0;\n\t}\n\n\tprivate parseCount(result: QueryResult): number {\n\t\tif (result.rows.length === 0) return 0;\n\t\tconst row = result.rows[0];\n\t\treturn Number(row.count ?? row.Count ?? 0);\n\t}\n}\n\nexport type BlueprintMode = \"create\" | \"alter\";\n\nexport class TableBlueprint {\n\tprivate mode: BlueprintMode;\n\tprivate columns: ColumnDefinition[] = [];\n\tprivate primaryKeys: string[] = [];\n\tprivate uniqueKeys: string[][] = [];\n\tprivate indexKeys: string[][] = [];\n\tprivate foreignKeys: ForeignKeyDef[] = [];\n\tdroppedColumns: string[] = [];\n\trenamedColumns: { from: string; to: string }[] = [];\n\n\tconstructor(_connection: DatabaseConnection, mode: BlueprintMode) {\n\t\tthis.mode = mode;\n\t}\n\n\tid(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"id\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tincrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"increments\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tbigIncrements(name = \"id\"): ColumnDefinition {\n\t\tconst col = this.addColumn(\"bigIncrements\", name);\n\t\tcol.autoIncrement();\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tstring(name: string, length = 255): ColumnDefinition {\n\t\tconst col = this.addColumn(\"string\", name);\n\t\tcol.setLength(length);\n\t\treturn col;\n\t}\n\n\ttext(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"text\", name);\n\t}\n\n\tinteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"integer\", name);\n\t}\n\n\tbigInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"bigInteger\", name);\n\t}\n\n\ttinyInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"tinyInteger\", name);\n\t}\n\n\tsmallInteger(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"smallInteger\", name);\n\t}\n\n\tboolean(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"boolean\", name);\n\t}\n\n\tfloat(name: string, _precision?: number): ColumnDefinition {\n\t\tconst col = this.addColumn(\"float\", name);\n\t\tif (_precision !== undefined) col.setPrecision(_precision);\n\t\treturn col;\n\t}\n\n\tdouble(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"double\", name);\n\t}\n\n\tdecimal(name: string, precision = 10, scale = 0): ColumnDefinition {\n\t\tconst col = this.addColumn(\"decimal\", name);\n\t\tcol.setPrecision(precision);\n\t\tcol.setScale(scale);\n\t\treturn col;\n\t}\n\n\tdate(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"date\", name);\n\t}\n\n\tdatetime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"datetime\", name);\n\t}\n\n\ttimestamp(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"timestamp\", name);\n\t}\n\n\ttime(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"time\", name);\n\t}\n\n\tyear(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"year\", name);\n\t}\n\n\tjson(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"json\", name);\n\t}\n\n\tjsonb(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"jsonb\", name);\n\t}\n\n\tbinary(name: string): ColumnDefinition {\n\t\treturn this.addColumn(\"binary\", name);\n\t}\n\n\tuuid(name = \"uuid\"): ColumnDefinition {\n\t\treturn this.addColumn(\"uuid\", name);\n\t}\n\n\tenum(name: string, values: string[]): ColumnDefinition {\n\t\tconst col = this.addColumn(\"enum\", name);\n\t\tcol.setValues(values);\n\t\treturn col;\n\t}\n\n\tforeignId(name: string): ColumnDefinition {\n\t\tconst col = this.addColumn(\"foreignId\", name);\n\t\tcol.unsigned();\n\t\treturn col;\n\t}\n\n\tprimary(...columns: string[]): void {\n\t\tthis.primaryKeys.push(...columns);\n\t}\n\n\tunique(...columns: string[]): void {\n\t\tthis.uniqueKeys.push(columns);\n\t}\n\n\tindex(...columns: string[]): void {\n\t\tthis.indexKeys.push(columns);\n\t}\n\n\tforeign(column: string): ForeignKeyDefinition {\n\t\tconst fk: ForeignKeyDef = {\n\t\t\tcolumn,\n\t\t\treferences: \"\",\n\t\t\ton: \"\",\n\t\t\tonDelete: null,\n\t\t\tonUpdate: null,\n\t\t};\n\t\tthis.foreignKeys.push(fk);\n\t\treturn new ForeignKeyDefinition(fk);\n\t}\n\n\ttimestamps(): void {\n\t\tthis.timestamp(\"created_at\").nullable();\n\t\tthis.timestamp(\"updated_at\").nullable();\n\t}\n\n\tsoftDeletes(): void {\n\t\tthis.timestamp(\"deleted_at\").nullable();\n\t}\n\n\trememberToken(): void {\n\t\tthis.string(\"remember_token\", 100).nullable();\n\t}\n\n\tdropColumn(column: string): void {\n\t\tthis.droppedColumns.push(column);\n\t}\n\n\trenameColumn(from: string, to: string): void {\n\t\tthis.renamedColumns.push({ from, to });\n\t}\n\n\tdropPrimary(): void {\n\t\tthis.primaryKeys = [];\n\t}\n\n\tdropUnique(_indexName?: string): void {\n\t\tthis.uniqueKeys = [];\n\t}\n\n\tdropIndex(_indexName?: string): void {\n\t\tthis.indexKeys = [];\n\t}\n\n\tdropForeign(_indexName?: string): void {\n\t\tthis.foreignKeys = [];\n\t}\n\n\tdropTimestamps(): void {\n\t\tthis.droppedColumns.push(\"created_at\", \"updated_at\");\n\t}\n\n\tdropSoftDeletes(): void {\n\t\tthis.droppedColumns.push(\"deleted_at\");\n\t}\n\n\tdropRememberToken(): void {\n\t\tthis.droppedColumns.push(\"remember_token\");\n\t}\n\n\tcompileColumns(): ColumnCompileOptions[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => this.mode === \"create\" || c.isNew)\n\t\t\t.map((c) => c.compile());\n\t}\n\n\tcompileConstraints(dialect: Dialect): string[] {\n\t\tconst constraints: string[] = [];\n\t\tconst wrap = (name: string) => dialect.wrapIdentifier(name);\n\n\t\tfor (const pk of this.primaryKeys) {\n\t\t\tconstraints.push(`PRIMARY KEY (${wrap(pk)})`);\n\t\t}\n\n\t\tfor (const uk of this.uniqueKeys) {\n\t\t\tconstraints.push(`UNIQUE (${uk.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const ik of this.indexKeys) {\n\t\t\tconstraints.push(`INDEX (${ik.map((c) => wrap(c)).join(\", \")})`);\n\t\t}\n\n\t\tfor (const fk of this.foreignKeys) {\n\t\t\tlet fkSQL = `FOREIGN KEY (${wrap(fk.column)}) REFERENCES ${wrap(fk.on)} (${wrap(fk.references)})`;\n\t\t\tif (fk.onDelete) fkSQL += ` ON DELETE ${fk.onDelete}`;\n\t\t\tif (fk.onUpdate) fkSQL += ` ON UPDATE ${fk.onUpdate}`;\n\t\t\tconstraints.push(fkSQL);\n\t\t}\n\n\t\treturn constraints;\n\t}\n\n\tcompileColumnDefinitions(dialect: Dialect): string[] {\n\t\treturn this.columns\n\t\t\t.filter((c) => c.isNew && this.mode === \"alter\")\n\t\t\t.map((c) => dialect.compileAddColumns(\"\", [c.compile()]));\n\t}\n\n\tprivate addColumn(type: string, name: string): ColumnDefinition {\n\t\tconst col = new ColumnDefinition(type, name);\n\t\tthis.columns.push(col);\n\t\treturn col;\n\t}\n}\n\nexport class ColumnDefinition {\n\tprivate type: string;\n\tprivate name: string;\n\tprivate isNullable = false;\n\tprivate defaultValue: any = undefined;\n\tprivate isUnsigned = false;\n\tprivate isUnique = false;\n\tprivate isPrimary = false;\n\tprivate isIndex = false;\n\tprivate commentText: string | null = null;\n\tprivate afterColumn: string | null = null;\n\tprivate isFirst = false;\n\tprivate isAutoIncrement = false;\n\tprivate precisionValue: number | null = null;\n\tprivate scaleValue: number | null = null;\n\tprivate lengthValue: number | null = null;\n\tprivate enumValues: string[] | null = null;\n\tprivate isForeignId = false;\n\tisNew = true;\n\n\tconstructor(type: string, name: string) {\n\t\tthis.type = type;\n\t\tthis.name = name;\n\t}\n\n\tnullable(): this {\n\t\tthis.isNullable = true;\n\t\treturn this;\n\t}\n\n\tdefault(value: any): this {\n\t\tthis.defaultValue = value;\n\t\treturn this;\n\t}\n\n\tunsigned(): this {\n\t\tthis.isUnsigned = true;\n\t\treturn this;\n\t}\n\n\tunique(): this {\n\t\tthis.isUnique = true;\n\t\treturn this;\n\t}\n\n\tprimary(): this {\n\t\tthis.isPrimary = true;\n\t\treturn this;\n\t}\n\n\tindex(): this {\n\t\tthis.isIndex = true;\n\t\treturn this;\n\t}\n\n\tcomment(text: string): this {\n\t\tthis.commentText = text;\n\t\treturn this;\n\t}\n\n\tafter(column: string): this {\n\t\tthis.afterColumn = column;\n\t\treturn this;\n\t}\n\n\tfirst(): this {\n\t\tthis.isFirst = true;\n\t\treturn this;\n\t}\n\n\tautoIncrement(): this {\n\t\tthis.isAutoIncrement = true;\n\t\treturn this;\n\t}\n\n\tsetValues(vals: string[]): this {\n\t\tthis.enumValues = vals;\n\t\treturn this;\n\t}\n\n\tsetLength(len: number): this {\n\t\tthis.lengthValue = len;\n\t\treturn this;\n\t}\n\n\tsetPrecision(precision: number): this {\n\t\tthis.precisionValue = precision;\n\t\treturn this;\n\t}\n\n\tsetScale(scale: number): this {\n\t\tthis.scaleValue = scale;\n\t\treturn this;\n\t}\n\n\tcompile(): ColumnCompileOptions {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\ttype: this.type,\n\t\t\tnullable: this.isNullable,\n\t\t\tdefaultValue: this.defaultValue,\n\t\t\tunsigned: this.isUnsigned,\n\t\t\tunique: this.isUnique,\n\t\t\tprimary: this.isPrimary,\n\t\t\tindex: this.isIndex,\n\t\t\tcomment: this.commentText,\n\t\t\tafter: this.afterColumn,\n\t\t\tfirst: this.isFirst,\n\t\t\tautoIncrement: this.isAutoIncrement,\n\t\t\tprecision: this.precisionValue,\n\t\t\tscale: this.scaleValue,\n\t\t\tlength: this.lengthValue,\n\t\t\tvalues: this.enumValues,\n\t\t\tisForeignId: this.isForeignId,\n\t\t};\n\t}\n}\n\ninterface ForeignKeyDef {\n\tcolumn: string;\n\treferences: string;\n\ton: string;\n\tonDelete: string | null;\n\tonUpdate: string | null;\n}\n\nexport class ForeignKeyDefinition {\n\tprivate def: ForeignKeyDef;\n\n\tconstructor(def: ForeignKeyDef) {\n\t\tthis.def = def;\n\t}\n\n\treferences(column: string): this {\n\t\tthis.def.references = column;\n\t\treturn this;\n\t}\n\n\ton(table: string): this {\n\t\tthis.def.on = table;\n\t\treturn this;\n\t}\n\n\tonDelete(action: string): this {\n\t\tthis.def.onDelete = action;\n\t\treturn this;\n\t}\n\n\tonUpdate(action: string): this {\n\t\tthis.def.onUpdate = action;\n\t\treturn this;\n\t}\n}\n\nexport class Migrator {\n\tprivate connection: DatabaseConnection;\n\tprivate migrations: MigrationDefinition[] = [];\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\taddMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations.push(...migrations);\n\t}\n\n\tsetMigrations(migrations: MigrationDefinition[]): void {\n\t\tthis.migrations = migrations;\n\t}\n\n\tasync run(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst ran = await this.getRanMigrations();\n\t\tconst ranNames = new Set(ran.map((r) => r.name));\n\n\t\tconst pending = this.migrations.filter((m) => !ranNames.has(m.name));\n\t\tif (pending.length === 0) {\n\t\t\tconsole.log(\"Nothing to migrate.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextBatch = await this.getNextBatchNumber();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of pending) {\n\t\t\tconsole.log(`Migrating: ${migration.name}`);\n\t\t\ttry {\n\t\t\t\tawait migration.up(schema);\n\t\t\t\tawait this.recordMigration(migration.name, nextBatch);\n\t\t\t\tconsole.log(`Migrated: ${migration.name}`);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(`Migration failed: ${migration.name}`, err);\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync rollback(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst lastBatch = await this.getLastBatchNumber();\n\t\tif (lastBatch === 0) {\n\t\t\tconsole.log(\"Nothing to rollback.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastBatchMigrations = await this.getMigrationsByBatch(lastBatch);\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of lastBatchMigrations.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Rolling back: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Rolled back: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Rollback failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync reset(): Promise<void> {\n\t\tawait this.ensureMigrationTable();\n\n\t\tconst allRan = await this.getRanMigrations();\n\t\tconst schema = new SchemaBuilder(this.connection);\n\n\t\tfor (const migration of allRan.reverse()) {\n\t\t\tconst def = this.migrations.find((m) => m.name === migration.name);\n\t\t\tif (def) {\n\t\t\t\tconsole.log(`Resetting: ${migration.name}`);\n\t\t\t\ttry {\n\t\t\t\t\tawait def.down(schema);\n\t\t\t\t\tawait this.removeMigration(migration.name);\n\t\t\t\t\tconsole.log(`Reset: ${migration.name}`);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(`Reset failed: ${migration.name}`, err);\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync refresh(): Promise<void> {\n\t\tawait this.reset();\n\t\tawait this.run();\n\t}\n\n\tasync status(): Promise<MigrationStatusRow[]> {\n\t\tawait this.ensureMigrationTable();\n\t\treturn this.getRanMigrations();\n\t}\n\n\tprivate async ensureMigrationTable(): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst sql = dialect.compileCreateMigrationsTable();\n\t\tawait this.connection.raw(sql);\n\t}\n\n\tprivate async getRanMigrations(): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations ORDER BY batch ASC, name ASC\",\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async getNextBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) + 1 as next_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.next_batch ?? 1);\n\t}\n\n\tprivate async getLastBatchNumber(): Promise<number> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT COALESCE(MAX(batch), 0) as last_batch FROM migrations\",\n\t\t);\n\t\treturn Number(result.rows[0]?.last_batch ?? 0);\n\t}\n\n\tprivate async getMigrationsByBatch(\n\t\tbatch: number,\n\t): Promise<MigrationStatusRow[]> {\n\t\tconst result = await this.connection.raw(\n\t\t\t\"SELECT name, batch, executed_at as executedAt FROM migrations WHERE batch = ? ORDER BY name ASC\",\n\t\t\t[batch],\n\t\t);\n\t\treturn result.rows.map((row: any) => ({\n\t\t\tname: String(row.name),\n\t\t\tbatch: Number(row.batch),\n\t\t\texecutedAt: String(row.executedAt ?? \"\"),\n\t\t}));\n\t}\n\n\tprivate async recordMigration(name: string, batch: number): Promise<void> {\n\t\tawait this.connection.raw(\n\t\t\t\"INSERT INTO migrations (name, batch) VALUES (?, ?)\",\n\t\t\t[name, batch],\n\t\t);\n\t}\n\n\tprivate async removeMigration(name: string): Promise<void> {\n\t\tawait this.connection.raw(\"DELETE FROM migrations WHERE name = ?\", [name]);\n\t}\n}\n","export interface PaginatedResult<T = any> {\n\tdata: T[];\n\tcurrentPage: number;\n\tperPage: number;\n\ttotal: number;\n\tlastPage: number;\n\tfrom: number;\n\tto: number;\n\thasMore: boolean;\n\thasPrev: boolean;\n\tisEmpty: boolean;\n}\n\nexport class Pagination<T = any> {\n\treadonly data: T[];\n\treadonly currentPage: number;\n\treadonly perPage: number;\n\treadonly total: number;\n\treadonly lastPage: number;\n\treadonly from: number;\n\treadonly to: number;\n\n\tconstructor(result: PaginatedResult<T>) {\n\t\tthis.data = result.data;\n\t\tthis.currentPage = result.currentPage;\n\t\tthis.perPage = result.perPage;\n\t\tthis.total = result.total;\n\t\tthis.lastPage = result.lastPage;\n\t\tthis.from = result.from;\n\t\tthis.to = result.to;\n\t}\n\n\tget hasMore(): boolean {\n\t\treturn this.currentPage < this.lastPage;\n\t}\n\n\tget hasPrev(): boolean {\n\t\treturn this.currentPage > 1;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.data.length === 0;\n\t}\n\n\tnextPage(): PaginationUrl | null {\n\t\tif (!this.hasMore) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage + 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\tprevPage(): PaginationUrl | null {\n\t\tif (!this.hasPrev) return null;\n\t\treturn {\n\t\t\tpage: this.currentPage - 1,\n\t\t\tperPage: this.perPage,\n\t\t\turl: null,\n\t\t};\n\t}\n\n\ttoJSON(): Record<string, any> {\n\t\treturn {\n\t\t\tdata: this.data,\n\t\t\tpagination: {\n\t\t\t\tcurrentPage: this.currentPage,\n\t\t\t\tperPage: this.perPage,\n\t\t\t\ttotal: this.total,\n\t\t\t\tlastPage: this.lastPage,\n\t\t\t\tfrom: this.from,\n\t\t\t\tto: this.to,\n\t\t\t\thasMore: this.hasMore,\n\t\t\t\thasPrev: this.hasPrev,\n\t\t\t\tisEmpty: this.isEmpty,\n\t\t\t},\n\t\t};\n\t}\n\n\tmap<U>(fn: (item: T, index: number) => U): Pagination<U> {\n\t\treturn new Pagination<U>({\n\t\t\t...this,\n\t\t\tdata: this.data.map(fn),\n\t\t});\n\t}\n\n\titems(): T[] {\n\t\treturn this.data;\n\t}\n\n\tstatic from<T>(result: PaginatedResult<T>): Pagination<T> {\n\t\treturn new Pagination(result);\n\t}\n}\n\nexport interface PaginationUrl {\n\tpage: number;\n\tperPage: number;\n\turl: string | null;\n}\n","import type { DatabaseConnection } from \"./connection.js\";\n\nexport interface SeederClass {\n\trun(connection: DatabaseConnection): Promise<void>;\n}\n\nexport class Seeder {\n\tprivate connection: DatabaseConnection;\n\n\tconstructor(connection: DatabaseConnection) {\n\t\tthis.connection = connection;\n\t}\n\n\tasync call(seederClass: SeederClass): Promise<void> {\n\t\tawait seederClass.run(this.connection);\n\t}\n\n\tasync insert(table: string, data: Record<string, any>[]): Promise<void> {\n\t\tif (data.length === 0) return;\n\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst firstRow = data[0];\n\t\tif (!firstRow) return;\n\n\t\tconst columns = Object.keys(firstRow);\n\t\tconst wrappedColumns = columns\n\t\t\t.map((c) => dialect.wrapIdentifier(c))\n\t\t\t.join(\", \");\n\n\t\tconst batchSize = 100;\n\t\tfor (let i = 0; i < data.length; i += batchSize) {\n\t\t\tconst batch = data.slice(i, i + batchSize);\n\t\t\tconst placeholders: string[] = [];\n\t\t\tconst bindings: any[] = [];\n\n\t\t\tfor (const row of batch) {\n\t\t\t\tconst rowPlaceholders = columns.map((col) => {\n\t\t\t\t\tbindings.push(row[col]);\n\t\t\t\t\treturn dialect.makeParameter(bindings.length - 1);\n\t\t\t\t});\n\t\t\t\tplaceholders.push(`(${rowPlaceholders.join(\", \")})`);\n\t\t\t}\n\n\t\t\tconst sql = `INSERT INTO ${dialect.wrapIdentifier(table)} (${wrappedColumns}) VALUES ${placeholders.join(\", \")}`;\n\t\t\tawait this.connection.raw(sql, bindings);\n\t\t}\n\t}\n\n\tasync truncate(table: string): Promise<void> {\n\t\tconst dialect = this.connection.getDialect();\n\t\tconst driver = this.connection.getDriver();\n\n\t\tif (driver === \"sqlite\") {\n\t\t\tawait this.connection.raw(`DELETE FROM ${dialect.wrapIdentifier(table)}`);\n\t\t} else if (driver === \"postgresql\") {\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t} else {\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 0\");\n\t\t\tawait this.connection.raw(dialect.compileTruncate(table));\n\t\t\tawait this.connection.raw(\"SET FOREIGN_KEY_CHECKS = 1\");\n\t\t}\n\t}\n\n\tasync run(): Promise<void> {\n\t\tthrow new Error(\"Seeder.run() must be overridden by subclasses\");\n\t}\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;;;AC0DpB,IAAM,eAAN,MAAsC;AAAA,EAC5C,eAAe,YAA4B;AAC1C,WAAO,KAAK,WAAW,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC3C;AAAA,EAEA,cAAc,QAAwB;AACrC,WAAO;AAAA,EACR;AAAA,EAEA,mBACC,UACA,OACA,QACS;AACT,QAAI,UAAU,QAAQ,WAAW,KAAM,QAAO;AAC9C,QAAI,WAAW,MAAM;AACpB,eAAS,KAAK,SAAS,GAAG,MAAM;AAChC,aAAO;AAAA,IACR;AACA,aAAS,KAAK,KAAK;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,uBACC,KACA,WACA,WACS;AACT,WAAO,GAAG,GAAG;AAAA,EACd;AAAA,EAEA,gBAAgB,WAA2B;AAC1C,WAAO,kBAAkB,KAAK,eAAe,SAAS,CAAC;AAAA,EACxD;AAAA,EAEA,+BAAuC;AACtC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR;AAAA,EAEQ,QAAQ,MAAc,SAAuC;AACpE,YAAQ,MAAM;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO,WAAW,QAAQ,UAAU,GAAG;AAAA,MACxC,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO,WAAW,QAAQ,aAAa,EAAE,IAAI,QAAQ,SAAS,CAAC;AAAA,MAChE,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR;AACC,eAAO;AAAA,IACT;AAAA,EACD;AAAA,EAEA,cAAc,SAAuC;AACpD,QAAI,MAAM,GAAG,KAAK,eAAe,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,QAAQ,MAAM,OAAO,CAAC;AACrF,QACC,QAAQ,YACR,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS,mBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QACC,QAAQ,iBACR,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QAAI,QAAQ,iBAAiB,UAAa,QAAQ,iBAAiB,MAAM;AACxE,aAAO,YAAY,KAAK,cAAc,QAAQ,YAAY,CAAC;AAAA,IAC5D,WACC,CAAC,QAAQ,YACT,CAAC,QAAQ,iBACT,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS,iBAChB;AACD,aAAO;AAAA,IACR;AACA,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAI,QAAQ,YAAY;AACvB,aAAO,aAAa,QAAQ,QAAQ,QAAQ,MAAM,KAAK,CAAC;AACzD,QAAI,QAAQ,UAAU;AACrB,aAAO,UAAU,KAAK,eAAe,QAAQ,KAAK,CAAC;AACpD,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,SAAuC;AAC1D,WAAO,iBAAiB,KAAK,cAAc,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,sBACC,YACA,SACA,aACS;AACT,UAAM,QAAQ;AAAA,MACb,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;AAAA,MAC3C,GAAG;AAAA,IACJ;AACA,WAAO,MAAM,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,kBACC,YACA,SACS;AACT,WAAO,OAAO,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;AAAA,EACvE;AAAA,EAEA,mBAAmB,YAAoB,SAA2B;AACjE,WAAO,eAAe,QAAQ,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC;AAAA,EACxF;AAAA,EAEA,oBAAoB,YAAoB,MAAc,IAAoB;AACzE,WAAO,iBAAiB,KAAK,eAAe,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;AAAA,EAChF;AAAA,EAEA,mBACC,WACA,SACA,aACS;AACT,UAAM,OAAO,KAAK,sBAAsB,WAAW,SAAS,WAAW;AACvE,WAAO,gBAAgB,KAAK,eAAe,SAAS,CAAC;AAAA,IAAS,IAAI;AAAA;AAAA,EACnE;AAAA,EAEA,mBAAmB,MAAc,IAAoB;AACpD,WAAO,gBAAgB,KAAK,eAAe,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;AAAA,EAC/E;AAAA,EAEA,iBAAiB,WAA2B;AAC3C,WAAO,cAAc,KAAK,eAAe,SAAS,CAAC;AAAA,EACpD;AAAA,EAEA,yBAAyB,WAA2B;AACnD,WAAO,wBAAwB,KAAK,eAAe,SAAS,CAAC;AAAA,EAC9D;AAAA,EAEA,gBAAgB,YAA4B;AAC3C,WAAO;AAAA,EACR;AAAA,EAEA,iBAAiB,YAAoB,aAA6B;AACjE,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,KAAqB;AAClC,WAAO;AAAA,EACR;AAAA,EAEQ,cAAc,OAAoB;AACzC,QAAI,OAAO,UAAU,UAAU;AAC9B,UAAI,UAAU,oBAAqB,QAAO;AAC1C,aAAO,IAAI,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,IACtC;AACA,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,MAAM;AACrD,WAAO,OAAO,KAAK;AAAA,EACpB;AACD;AAEO,IAAM,gBAAN,MAAuC;AAAA,EAC7C,eAAe,YAA4B;AAC1C,WAAO,IAAI,WAAW,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC1C;AAAA,EAEA,cAAc,QAAwB;AACrC,WAAO;AAAA,EACR;AAAA,EAEA,mBACC,UACA,OACA,QACS;AACT,QAAI,UAAU,QAAQ,WAAW,KAAM,QAAO;AAC9C,QAAI,WAAW,MAAM;AACpB,eAAS,KAAK,SAAS,GAAG,MAAM;AAChC,aAAO;AAAA,IACR;AACA,aAAS,KAAK,KAAK;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,uBACC,KACA,WACA,WACS;AACT,WAAO,GAAG,GAAG;AAAA,EACd;AAAA,EAEA,gBAAgB,WAA2B;AAC1C,WAAO,eAAe,KAAK,eAAe,SAAS,CAAC;AAAA,EACrD;AAAA,EAEA,+BAAuC;AACtC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR;AAAA,EAEQ,QAAQ,MAAc,SAAuC;AACpE,YAAQ,MAAM;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO,WAAW,QAAQ,UAAU,GAAG;AAAA,MACxC,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR;AACC,eAAO;AAAA,IACT;AAAA,EACD;AAAA,EAEA,cAAc,SAAuC;AACpD,QAAI,MAAM,GAAG,KAAK,eAAe,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,QAAQ,MAAM,OAAO,CAAC;AACrF,QACC,QAAQ,iBACR,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QACC,CAAC,QAAQ,YACT,QAAQ,iBAAiB,UACzB,CAAC,QAAQ,iBACT,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,iBAAiB,UAAa,QAAQ,iBAAiB,MAAM;AACxE,aAAO,YAAY,KAAK,cAAc,QAAQ,YAAY,CAAC;AAAA,IAC5D;AACA,QAAI,QAAQ,QAAS,QAAO;AAC5B,QAAI,QAAQ,OAAQ,QAAO;AAC3B,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,SAAuC;AAC1D,WAAO,KAAK,cAAc,OAAO;AAAA,EAClC;AAAA,EAEA,sBACC,YACA,SACA,aACS;AACT,UAAM,QAAQ;AAAA,MACb,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;AAAA,MAC3C,GAAG;AAAA,IACJ;AACA,WAAO,MAAM,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,kBACC,YACA,SACS;AACT,WAAO,cAAc,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC;AAAA,EACrF;AAAA,EAEA,mBAAmB,YAAoB,SAA2B;AACjE,WAAO,eAAe,QAAQ,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC;AAAA,EACxF;AAAA,EAEA,oBAAoB,YAAoB,MAAc,IAAoB;AACzE,WAAO,iBAAiB,KAAK,eAAe,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;AAAA,EAChF;AAAA,EAEA,mBACC,WACA,SACA,aACS;AACT,UAAM,OAAO,KAAK,sBAAsB,WAAW,SAAS,WAAW;AACvE,WAAO,gBAAgB,KAAK,eAAe,SAAS,CAAC;AAAA,IAAS,IAAI;AAAA;AAAA,EACnE;AAAA,EAEA,mBAAmB,MAAc,IAAoB;AACpD,WAAO,eAAe,KAAK,eAAe,IAAI,CAAC,cAAc,KAAK,eAAe,EAAE,CAAC;AAAA,EACrF;AAAA,EAEA,iBAAiB,WAA2B;AAC3C,WAAO,cAAc,KAAK,eAAe,SAAS,CAAC;AAAA,EACpD;AAAA,EAEA,yBAAyB,WAA2B;AACnD,WAAO,wBAAwB,KAAK,eAAe,SAAS,CAAC;AAAA,EAC9D;AAAA,EAEA,gBAAgB,YAA4B;AAC3C,WAAO;AAAA,EACR;AAAA,EAEA,iBAAiB,YAAoB,aAA6B;AACjE,WAAO,qBAAqB,KAAK,eAAe,UAAU,CAAC;AAAA,EAC5D;AAAA,EAEA,cAAc,KAAqB;AAClC,WAAO;AAAA,EACR;AAAA,EAEQ,cAAc,OAAoB;AACzC,QAAI,OAAO,UAAU,UAAU;AAC9B,UAAI,UAAU,oBAAqB,QAAO;AAC1C,aAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IACrC;AACA,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,MAAM;AACrD,WAAO,OAAO,KAAK;AAAA,EACpB;AACD;AAEO,IAAM,oBAAN,MAA2C;AAAA,EACjD,eAAe,YAA4B;AAC1C,WAAO,IAAI,WAAW,QAAQ,MAAM,IAAI,CAAC;AAAA,EAC1C;AAAA,EAEA,cAAc,OAAuB;AACpC,WAAO,IAAI,QAAQ,CAAC;AAAA,EACrB;AAAA,EAEA,mBACC,UACA,OACA,QACS;AACT,QAAI,UAAU,QAAQ,WAAW,KAAM,QAAO;AAC9C,UAAM,QAAQ,SAAS;AACvB,QAAI,WAAW,MAAM;AACpB,eAAS,KAAK,SAAS,GAAG,MAAM;AAChC,aAAO,WAAW,QAAQ,CAAC,YAAY,QAAQ,CAAC;AAAA,IACjD;AACA,aAAS,KAAK,KAAK;AACnB,WAAO,WAAW,QAAQ,CAAC;AAAA,EAC5B;AAAA,EAEA,uBACC,KACA,WACA,WAAW,MACF;AACT,WAAO,GAAG,GAAG,cAAc,KAAK,eAAe,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,gBAAgB,WAA2B;AAC1C,WAAO,kBAAkB,KAAK,eAAe,SAAS,CAAC;AAAA,EACxD;AAAA,EAEA,+BAAuC;AACtC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMR;AAAA,EAEQ,QAAQ,MAAc,SAAuC;AACpE,YAAQ,MAAM;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO,WAAW,QAAQ,UAAU,GAAG;AAAA,MACxC,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO,WAAW,QAAQ,aAAa,EAAE,IAAI,QAAQ,SAAS,CAAC;AAAA,MAChE,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR,KAAK;AACJ,eAAO;AAAA,MACR;AACC,eAAO;AAAA,IACT;AAAA,EACD;AAAA,EAEA,cAAc,SAAuC;AACpD,QAAI,MAAM,GAAG,KAAK,eAAe,QAAQ,IAAI,CAAC,IAAI,KAAK,QAAQ,QAAQ,MAAM,OAAO,CAAC;AACrF,QACC,CAAC,QAAQ,YACT,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QAAI,QAAQ,SAAU,QAAO;AAC7B,QAAI,QAAQ,iBAAiB,UAAa,QAAQ,iBAAiB,MAAM;AACxE,aAAO,YAAY,KAAK,cAAc,QAAQ,YAAY,CAAC;AAAA,IAC5D;AACA,QACC,QAAQ,WACR,QAAQ,SAAS,QACjB,QAAQ,SAAS,gBACjB,QAAQ,SAAS;AAEjB,aAAO;AACR,QAAI,QAAQ,OAAQ,QAAO;AAC3B,QAAI,QAAQ,YAAY;AACvB,aAAO,OAAO,QAAQ,QAAQ,QAAQ,OAAO,EAAE,CAAC;AACjD,WAAO;AAAA,EACR;AAAA,EAEA,oBAAoB,SAAuC;AAC1D,WAAO,gBAAgB,KAAK,eAAe,QAAQ,IAAI,CAAC,SAAS,KAAK,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAAA,EACrG;AAAA,EAEA,sBACC,YACA,SACA,aACS;AACT,UAAM,QAAQ;AAAA,MACb,GAAG,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;AAAA,MAC3C,GAAG;AAAA,IACJ;AACA,WAAO,MAAM,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,kBACC,YACA,SACS;AACT,WAAO,cAAc,QAAQ,IAAI,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC;AAAA,EACrF;AAAA,EAEA,mBAAmB,YAAoB,SAA2B;AACjE,WAAO,eAAe,QAAQ,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC;AAAA,EACxF;AAAA,EAEA,oBAAoB,YAAoB,MAAc,IAAoB;AACzE,WAAO,iBAAiB,KAAK,eAAe,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;AAAA,EAChF;AAAA,EAEA,mBACC,WACA,SACA,aACS;AACT,UAAM,OAAO,KAAK,sBAAsB,WAAW,SAAS,WAAW;AACvE,WAAO,gBAAgB,KAAK,eAAe,SAAS,CAAC;AAAA,IAAS,IAAI;AAAA;AAAA,EACnE;AAAA,EAEA,mBAAmB,MAAc,IAAoB;AACpD,WAAO,eAAe,KAAK,eAAe,IAAI,CAAC,cAAc,KAAK,eAAe,EAAE,CAAC;AAAA,EACrF;AAAA,EAEA,iBAAiB,YAA4B;AAC5C,WAAO,wBAAwB,KAAK,eAAe,UAAU,CAAC;AAAA,EAC/D;AAAA,EAEA,yBAAyB,WAA2B;AACnD,WAAO,wBAAwB,KAAK,eAAe,SAAS,CAAC;AAAA,EAC9D;AAAA,EAEA,gBAAgB,YAA4B;AAC3C,WAAO;AAAA,EACR;AAAA,EAEA,iBAAiB,YAAoB,aAA6B;AACjE,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,KAAqB;AAClC,WAAO;AAAA,EACR;AAAA,EAEQ,cAAc,OAAoB;AACzC,QAAI,OAAO,UAAU,UAAU;AAC9B,UAAI,UAAU,oBAAqB,QAAO;AAC1C,aAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,IACrC;AACA,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAI,OAAO,UAAU,UAAW,QAAO,QAAQ,SAAS;AACxD,WAAO,OAAO,KAAK;AAAA,EACpB;AACD;AAEO,SAAS,cAAc,QAAyB;AACtD,UAAQ,QAAQ;AAAA,IACf,KAAK;AACJ,aAAO,IAAI,aAAa;AAAA,IACzB,KAAK;AACJ,aAAO,IAAI,cAAc;AAAA,IAC1B,KAAK;AACJ,aAAO,IAAI,kBAAkB;AAAA,IAC9B;AACC,aAAO,IAAI,aAAa;AAAA,EAC1B;AACD;;;AC/nBA,eAAsB,aAAa,QAA2C;AAC7E,QAAM,aAAa,OAAO,UAAU;AAEpC,UAAQ,YAAY;AAAA,IACnB,KAAK;AACJ,aAAO,kBAAkB,MAAM;AAAA,IAChC,KAAK;AACJ,aAAO,uBAAuB,MAAM;AAAA,IACrC,KAAK;AACJ,aAAO,mBAAmB,MAAM;AAAA,IACjC;AACC,aAAO,kBAAkB,MAAM;AAAA,EACjC;AACD;AAEA,eAAe,kBAAkB,QAA2C;AAC3E,MAAI;AACJ,MAAI;AAEH,mBAAe,MAAM,OAAO,gBAAgB;AAAA,EAC7C,QAAQ;AACP,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,MAAI,aAAkB;AACtB,QAAM,UAAU,IAAI,aAAa;AAEjC,QAAM,SAAiB;AAAA,IACtB,MAAM,UAAyB;AAC9B,mBAAa,MAAM,aAAa,iBAAiB;AAAA,QAChD,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO,WAAW;AAAA,MAC5B,CAAC;AAAA,IACF;AAAA,IAEA,MAAM,aAA4B;AACjC,UAAI,eAAe,MAAM;AACxB,cAAM,WAAW,IAAI;AACrB,qBAAa;AAAA,MACd;AAAA,IACD;AAAA,IAEA,cAAuB;AACtB,aAAO,eAAe;AAAA,IACvB;AAAA,IAEA,MAAM,IAAI,KAAa,UAAwC;AAC9D,UAAI,eAAe,MAAM;AACxB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,CAAC,MAAM,MAAM,IAAI,MAAM,WAAW,QAAQ,KAAK,YAAY,CAAC,CAAC;AACnE,aAAO,EAAE,MAAM,OAAO;AAAA,IACvB;AAAA,IAEA,MAAM,YAAe,UAAiD;AACrE,UAAI,eAAe,MAAM;AACxB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,WAAW,iBAAiB;AAClC,UAAI;AACH,cAAM,SAAS,MAAM,SAAS,MAAM;AACpC,cAAM,WAAW,OAAO;AACxB,eAAO;AAAA,MACR,SAAS,KAAK;AACb,cAAM,WAAW,SAAS;AAC1B,cAAM;AAAA,MACP;AAAA,IACD;AAAA,IAEA,aAAsB;AACrB,aAAO;AAAA,IACR;AAAA,IAEA,YAAoB;AACnB,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAe,uBACd,QACkB;AAClB,MAAI;AACJ,MAAI;AAEH,gBAAY,MAAM,OAAO,IAAI;AAAA,EAC9B,QAAQ;AACP,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,MAAI,OAAY;AAChB,QAAM,UAAU,IAAI,kBAAkB;AAEtC,QAAM,SAAiB;AAAA,IACtB,MAAM,UAAyB;AAC9B,YAAM,EAAE,KAAK,IAAI;AACjB,aAAO,IAAI,KAAK;AAAA,QACf,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,OAAO;AAAA,QACb,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,MAClB,CAAC;AACD,YAAM,KAAK,MAAM,UAAU;AAAA,IAC5B;AAAA,IAEA,MAAM,aAA4B;AACjC,UAAI,SAAS,MAAM;AAClB,cAAM,KAAK,IAAI;AACf,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IAEA,cAAuB;AACtB,aAAO,SAAS;AAAA,IACjB;AAAA,IAEA,MAAM,IAAI,KAAa,UAAwC;AAC9D,UAAI,SAAS,MAAM;AAClB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,SAAS,MAAM,KAAK,MAAM,KAAK,YAAY,CAAC,CAAC;AACnD,aAAO,EAAE,MAAM,OAAO,KAAK;AAAA,IAC5B;AAAA,IAEA,MAAM,YAAe,UAAiD;AACrE,UAAI,SAAS,MAAM;AAClB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,UAAI;AACH,cAAM,OAAO,MAAM,OAAO;AAC1B,cAAM,YAAoB;AAAA,UACzB,GAAG;AAAA,UACH,MAAM,IAAI,KAAa,UAAwC;AAC9D,kBAAMA,UAAS,MAAM,OAAO,MAAM,KAAK,YAAY,CAAC,CAAC;AACrD,mBAAO,EAAE,MAAMA,QAAO,KAAK;AAAA,UAC5B;AAAA,UACA,aAAsB;AACrB,mBAAO;AAAA,UACR;AAAA,UACA,YAAoB;AACnB,mBAAO;AAAA,UACR;AAAA,QACD;AACA,cAAM,SAAS,MAAM,SAAS,SAAS;AACvC,cAAM,OAAO,MAAM,QAAQ;AAC3B,eAAO;AAAA,MACR,SAAS,KAAK;AACb,cAAM,OAAO,MAAM,UAAU;AAC7B,cAAM;AAAA,MACP,UAAE;AACD,eAAO,QAAQ;AAAA,MAChB;AAAA,IACD;AAAA,IAEA,aAAsB;AACrB,aAAO;AAAA,IACR;AAAA,IAEA,YAAoB;AACnB,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAe,mBAAmB,QAA2C;AAC5E,MAAI;AACJ,MAAI;AAEH,oBAAgB,MAAM,OAAO,gBAAgB;AAAA,EAC9C,QAAQ;AACP,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AAEA,MAAI,KAAU;AACd,MAAI,YAAY;AAChB,QAAM,UAAU,IAAI,cAAc;AAElC,QAAM,SAAiB;AAAA,IACtB,MAAM,UAAyB;AAC9B,WAAK,IAAI,cAAc,OAAO,QAAQ;AACtC,SAAG,OAAO,oBAAoB;AAC9B,kBAAY;AAAA,IACb;AAAA,IAEA,MAAM,aAA4B;AACjC,UAAI,OAAO,MAAM;AAChB,WAAG,MAAM;AACT,aAAK;AACL,oBAAY;AAAA,MACb;AAAA,IACD;AAAA,IAEA,cAAuB;AACtB,aAAO;AAAA,IACR;AAAA,IAEA,MAAM,IAAI,KAAa,UAAwC;AAC9D,UAAI,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,aAAa,IAAI,KAAK,EAAE,YAAY;AAC1C,YAAM,UACL,WAAW,WAAW,QAAQ,KAC9B,WAAW,WAAW,MAAM,KAC5B,WAAW,WAAW,QAAQ;AAC/B,YAAM,OAAO,GAAG,QAAQ,GAAG;AAC3B,UAAI,SAAS;AACZ,cAAM,OACL,aAAa,UAAa,SAAS,SAAS,IACzC,KAAK,IAAI,GAAG,QAAQ,IACpB,KAAK,IAAI;AACb,eAAO,EAAE,KAAK;AAAA,MACf;AACA,UAAI,aAAa,UAAa,SAAS,SAAS,GAAG;AAClD,aAAK,IAAI,GAAG,QAAQ;AAAA,MACrB,OAAO;AACN,aAAK,IAAI;AAAA,MACV;AACA,aAAO,EAAE,MAAM,CAAC,EAAE;AAAA,IACnB;AAAA,IAEA,MAAM,YAAe,UAAiD;AACrE,UAAI,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,+CAA+C;AAAA,MAChE;AACA,YAAM,MAAM,GAAG,YAAY,YAAY;AACtC,eAAO,MAAM,SAAS,MAAM;AAAA,MAC7B,CAAC;AACD,aAAO,IAAI;AAAA,IACZ;AAAA,IAEA,aAAsB;AACrB,aAAO;AAAA,IACR;AAAA,IAEA,YAAoB;AACnB,aAAO;AAAA,IACR;AAAA,EACD;AAEA,SAAO;AACR;;;AC5OO,IAAM,eAAN,MAAM,cAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA,UAAoB,CAAC,GAAG;AAAA,EACxB,kBAAkB;AAAA,EAClB,SAAwB,CAAC;AAAA,EACzB,QAAsB,CAAC;AAAA,EACvB,WAA4B,CAAC;AAAA,EAC7B,UAA0B,CAAC;AAAA,EAC3B,WAAqB,CAAC;AAAA,EACtB,aAA4B;AAAA,EAC5B,cAA6B;AAAA,EAC7B,eAA8B;AAAA,EAEtC,YAAY,YAAyB,WAAmB;AACvD,SAAK,aAAa;AAClB,SAAK,YAAY;AAAA,EAClB;AAAA,EAEA,UAAU,SAAyB;AAClC,SAAK,UAAU,QAAQ,SAAS,IAAI,UAAU,CAAC,GAAG;AAClD,WAAO;AAAA,EACR;AAAA,EAEA,aAAa,SAAyB;AACrC,QAAI,KAAK,QAAQ,CAAC,MAAM,KAAK;AAC5B,WAAK,UAAU;AAAA,IAChB,OAAO;AACN,WAAK,QAAQ,KAAK,GAAG,OAAO;AAAA,IAC7B;AACA,WAAO;AAAA,EACR;AAAA,EAEA,WAAiB;AAChB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,OAAqB;AACzB,SAAK,eAAe;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAgB,UAAe,OAAmB;AACvD,QAAI,UAAU,QAAW;AACxB,cAAQ;AACR,iBAAW;AAAA,IACZ;AACA,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,OAAO,QAAQ;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,QAAgB,UAAe,OAAmB;AACzD,QAAI,UAAU,QAAW;AACxB,cAAQ;AACR,iBAAW;AAAA,IACZ;AACA,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,OAAO,QAAQ;AAAA,MACzB;AAAA,MACA,SAAS;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,QAAgB,QAAqB;AAC5C,SAAK,OAAO,KAAK,EAAE,MAAM,MAAM,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAC/D,WAAO;AAAA,EACR;AAAA,EAEA,WAAW,QAAgB,QAAqB;AAC/C,SAAK,OAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAClE,WAAO;AAAA,EACR;AAAA,EAEA,UAAU,QAAsB;AAC/B,SAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,QAAQ,SAAS,MAAM,CAAC;AACzD,WAAO;AAAA,EACR;AAAA,EAEA,aAAa,QAAsB;AAClC,SAAK,OAAO,KAAK,EAAE,MAAM,WAAW,QAAQ,SAAS,MAAM,CAAC;AAC5D,WAAO;AAAA,EACR;AAAA,EAEA,aAAa,QAAgB,OAAyB;AACrD,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,gBAAgB,QAAgB,OAAyB;AACxD,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM;AAAA,MACN;AAAA,MACA,QAAQ;AAAA,MACR,SAAS;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,UAAU,QAAgB,SAAuB;AAChD,SAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,QAAQ,OAAO,SAAS,SAAS,MAAM,CAAC;AACzE,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,QAAgB,SAAuB;AAClD,SAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,QAAQ,OAAO,SAAS,SAAS,KAAK,CAAC;AACxE,WAAO;AAAA,EACR;AAAA,EAEA,WAAW,UAA+C;AACzD,UAAM,WAAW,IAAI,cAAa,KAAK,YAAY,KAAK,SAAS;AACjE,aAAS,QAAQ;AACjB,SAAK,OAAO,KAAK;AAAA,MAChB,MAAM;AAAA,MACN,QAAQ,SAAS;AAAA,MACjB,SAAS;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,KACC,OACA,OACA,UACA,QACA,OAAiB,SACV;AACP,SAAK,MAAM,KAAK,EAAE,OAAO,OAAO,UAAU,QAAQ,KAAK,CAAC;AACxD,WAAO;AAAA,EACR;AAAA,EAEA,SACC,OACA,OACA,UACA,QACO;AACP,WAAO,KAAK,KAAK,OAAO,OAAO,UAAU,QAAQ,MAAM;AAAA,EACxD;AAAA,EAEA,UACC,OACA,OACA,UACA,QACO;AACP,WAAO,KAAK,KAAK,OAAO,OAAO,UAAU,QAAQ,OAAO;AAAA,EACzD;AAAA,EAEA,UACC,OACA,OACA,UACA,QACO;AACP,WAAO,KAAK,KAAK,OAAO,OAAO,UAAU,QAAQ,OAAO;AAAA,EACzD;AAAA,EAEA,QAAQ,QAAgB,YAA4B,OAAa;AAChE,SAAK,SAAS,KAAK,EAAE,QAAQ,UAAU,CAAC;AACxC,WAAO;AAAA,EACR;AAAA,EAEA,YAAY,QAAsB;AACjC,WAAO,KAAK,QAAQ,QAAQ,MAAM;AAAA,EACnC;AAAA,EAEA,OAAO,SAAS,cAAoB;AACnC,WAAO,KAAK,QAAQ,QAAQ,MAAM;AAAA,EACnC;AAAA,EAEA,OAAO,SAAS,cAAoB;AACnC,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EAClC;AAAA,EAEA,gBAAsB;AACrB,SAAK,SAAS,KAAK,EAAE,QAAQ,YAAY,WAAW,MAAM,CAAC;AAC3D,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAqB;AAC1B,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,QAAsB;AAC5B,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,MAAoB;AACxB,WAAO,KAAK,OAAO,IAAI;AAAA,EACxB;AAAA,EAEA,KAAK,MAAoB;AACxB,WAAO,KAAK,MAAM,IAAI;AAAA,EACvB;AAAA,EAEA,WAAW,SAAyB;AACnC,SAAK,SAAS,KAAK,GAAG,OAAO;AAC7B,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,QAAgB,UAAkB,OAAkB;AAC1D,SAAK,QAAQ,KAAK,EAAE,QAAQ,UAAU,MAAM,CAAC;AAC7C,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,MAA6B;AAClC,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,MAAM;AACrC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,WAAO,OAAO;AAAA,EACf;AAAA,EAEA,MAAM,QAAoC;AACzC,UAAM,KAAK,KAAK,MAAM;AACtB,OAAG,aAAa;AAChB,UAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,WAAQ,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI;AAAA,EACnD;AAAA,EAEA,MAAM,KAAc,IAAwC;AAC3D,WAAO,KAAK,MAAM,MAAM,EAAE,EAAE,MAAS;AAAA,EACtC;AAAA,EAEA,MAAM,MAAM,QAAgC;AAC3C,UAAM,KAAK,KAAK,MAAM;AACtB,OAAG,UAAU,CAAC,MAAM;AACpB,UAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,WAAO,OAAO,KAAK,IAAI,CAAC,QAAa,IAAI,MAAM,CAAC;AAAA,EACjD;AAAA,EAEA,MAAM,MAAM,SAAS,KAAsB;AAC1C,UAAM,KAAK,KAAK,MAAM;AACtB,OAAG,UAAU;AAAA,MACZ,SAAS,WAAW,MAAM,MAAM,KAAK,KAAK,MAAM,CAAC;AAAA,IAClD;AACA,OAAG,WAAW,CAAC;AACf,OAAG,aAAa;AAChB,OAAG,cAAc;AACjB,UAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,OAAO,IAAI,aAAa,IAAI,SAAS,IAAI,UAAU,KAAK,CAAC;AAAA,EACjE;AAAA,EAEA,MAAM,SAA2B;AAChC,UAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,WAAO,QAAQ;AAAA,EAChB;AAAA,EAEA,MAAM,cAAgC;AACrC,WAAO,CAAE,MAAM,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,IAAI,QAAwC;AACjD,WAAO,KAAK,UAAU,OAAO,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,QAAwC;AACjD,WAAO,KAAK,UAAU,OAAO,MAAM;AAAA,EACpC;AAAA,EAEA,MAAM,IAAI,QAAiC;AAC1C,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,MAAM;AACjD,WAAO,UAAU;AAAA,EAClB;AAAA,EAEA,MAAM,IAAI,QAAiC;AAC1C,UAAM,SAAS,MAAM,KAAK,UAAU,OAAO,MAAM;AACjD,WAAO,UAAU;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,UAAU,IAAI,OAAO,GAA6B;AAChE,UAAM,UAAU,KAAK,MAAM;AAC3B,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,UAAM,WAAW,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,OAAO,CAAC;AACvD,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,QAAQ,CAAC;AACxD,UAAM,WAAW,cAAc,KAAK,UAAU;AAC9C,UAAM,QAAQ,KAAK,IAAI,cAAc,SAAS,KAAK;AAEnD,UAAM,KAAK,KAAK,MAAM;AACtB,OAAG,aAAa;AAChB,OAAG,eAAe,cAAc,KAAK;AACrC,UAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AAEtD,WAAO;AAAA,MACN,MAAM,OAAO;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,QAAQ,IAAI,UAAU;AAAA,MAC5B,IAAI,QAAQ,IAAI,QAAQ;AAAA,MACxB,SAAS,cAAc;AAAA,MACvB,SAAS,cAAc;AAAA,MACvB,SAAS,UAAU;AAAA,IACpB;AAAA,EACD;AAAA,EAEA,MAAM,OAAO,MAAqD;AACjE,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,cAAc,IAAI;AACjD,UAAM,aAAa,KAAK,WAAW,UAAU;AAE7C,QAAI,eAAe,cAAc;AAChC,YAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,YAAM,eAAe,QAAQ,uBAAuB,KAAK,QAAQ;AACjE,YAAMC,UAAS,MAAM,KAAK,WAAW,IAAI,cAAc,QAAQ;AAC/D,aAAOA,QAAO,KAAK,SAAS,IAAK,OAAOA,QAAO,KAAK,CAAC,EAAE,EAAE,KAAK,IAAK;AAAA,IACpE;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,QAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,GAAG;AAC1C,aAAO,OAAO,OAAO,KAAK,CAAC,EAAE,EAAE,KAAK,OAAO,KAAK,CAAC,EAAE,YAAY;AAAA,IAChE;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,YAAY,MAAqD;AACtE,WAAO,KAAK,OAAO,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,gBAAgB,MAAyC;AAC9D,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,cAAc,IAAI;AACjD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,eAAe,QAAQ,uBAAuB,KAAK,QAAQ;AACjE,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,cAAc,QAAQ;AAC/D,WAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,MAA4C;AACxD,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,cAAc,IAAI;AACjD,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,SAAS,GAAG;AACpB,YAAM,OAAO,KAAK,CAAC;AACnB,aAAO,KAAK,gBAAgB,KAAK,WAAW,KAAK;AAAA,IAClD;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,SAA0B;AAC/B,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,cAAc;AAC7C,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,SAAS,GAAG;AACpB,YAAM,OAAO,KAAK,CAAC;AACnB,aAAO,KAAK,gBAAgB,KAAK,WAAW,KAAK;AAAA,IAClD;AACA,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,WAA0B;AAC/B,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,gBAAgB,KAAK,SAAS;AAClD,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,MACL,MACA,UACgB;AAChB,QAAI,OAAO;AACX,QAAI,UAAU;AAEd,WAAO,SAAS;AACf,YAAM,KAAK,KAAK,MAAM;AACtB,SAAG,aAAa;AAChB,SAAG,eAAe,OAAO,KAAK;AAC9B,YAAM,OAAO,MAAM,GAAG,IAAI;AAE1B,UAAI,KAAK,WAAW,GAAG;AACtB,kBAAU;AACV;AAAA,MACD;AAEA,YAAM,SAAS,IAAI;AAEnB,UAAI,KAAK,SAAS,MAAM;AACvB,kBAAU;AAAA,MACX;AAEA;AAAA,IACD;AAAA,EACD;AAAA,EAEA,QAAsB;AACrB,UAAM,KAAK,IAAI,cAAa,KAAK,YAAY,KAAK,SAAS;AAC3D,OAAG,UAAU,CAAC,GAAG,KAAK,OAAO;AAC7B,OAAG,kBAAkB,KAAK;AAC1B,OAAG,SAAS,KAAK,YAAY,KAAK,MAAM;AACxC,OAAG,QAAQ,CAAC,GAAG,KAAK,KAAK;AACzB,OAAG,WAAW,CAAC,GAAG,KAAK,QAAQ;AAC/B,OAAG,UAAU,CAAC,GAAG,KAAK,OAAO;AAC7B,OAAG,WAAW,CAAC,GAAG,KAAK,QAAQ;AAC/B,OAAG,aAAa,KAAK;AACrB,OAAG,cAAc,KAAK;AACtB,OAAG,eAAe,KAAK;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,QAA0C;AACzC,UAAM,WAAkB,CAAC;AACzB,UAAM,UAAU,KAAK,WAAW,WAAW;AAE3C,UAAM,iBAAiB,KAAK,QAC1B;AAAA,MAAI,CAAC,MACL,EAAE,SAAS,GAAG,KAAK,MAAM,OAAO,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,MAAM,IACpE,IACA,QAAQ,eAAe,CAAC;AAAA,IAC5B,EACC,KAAK,IAAI;AAEX,UAAM,OAAO,KAAK,gBAAgB,KAAK;AACvC,UAAM,cAAc,KAAK,gBAAgB,QAAQ,eAAe,IAAI;AAEpE,QAAI,MAAM,KAAK,kBACZ,mBAAmB,cAAc,SAAS,WAAW,KACrD,UAAU,cAAc,SAAS,WAAW;AAE/C,UAAM,UAAU,KAAK,aAAa,OAAO;AACzC,QAAI,QAAS,QAAO;AAEpB,UAAM,WAAW,KAAK,cAAc,SAAS,QAAQ;AACrD,QAAI,SAAU,QAAO;AAErB,QAAI,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAO,aAAa,KAAK,SAAS,IAAI,CAAC,MAAM,QAAQ,eAAe,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IACnF;AAEA,UAAM,YAAY,KAAK,eAAe,SAAS,QAAQ;AACvD,QAAI,UAAW,QAAO;AAEtB,QAAI,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAO,aAAa,KAAK,SACvB,IAAI,CAAC,MAAM;AACX,cAAM,MACL,EAAE,WAAW,aACV,EAAE,SACF,QAAQ,eAAe,EAAE,MAAM;AACnC,eAAO,GAAG,GAAG,IAAI,EAAE,UAAU,YAAY,CAAC;AAAA,MAC3C,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,IACb;AAEA,UAAM,iBAAiB,QAAQ;AAAA,MAC9B;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,QAAI,eAAgB,QAAO;AAE3B,WAAO,EAAE,KAAK,SAAS;AAAA,EACxB;AAAA,EAEA,KAAY;AACX,UAAM,EAAE,KAAK,SAAS,IAAI,KAAK,MAAM;AACrC,UAAM,SAAS,QAAQ,GAAG;AAAA,YAAe,KAAK,UAAU,QAAQ,CAAC;AACjE,YAAQ,MAAM,MAAM;AACpB,YAAQ,KAAK,CAAC;AAAA,EACf;AAAA,EAEQ,aAAa,SAA0B;AAC9C,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO;AAEpC,WACC,MACA,KAAK,MACH,IAAI,CAAC,MAAM;AACX,YAAM,OAAO,EAAE,KAAK,YAAY;AAChC,aAAO,GAAG,IAAI,SAAS,QAAQ,eAAe,EAAE,KAAK,CAAC,OAAO,QAAQ,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,IAAI,KAAK,KAAK,EAAE,MAAM,CAAC;AAAA,IAClI,CAAC,EACA,KAAK,GAAG;AAAA,EAEZ;AAAA,EAEQ,cAAc,SAAkB,UAAyB;AAChE,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO;AAErC,UAAM,MAAM,KAAK,kBAAkB,KAAK,QAAQ,SAAS,QAAQ;AACjE,WAAO,MAAM,UAAU,GAAG,KAAK;AAAA,EAChC;AAAA,EAEQ,kBACP,QACA,SACA,UACS;AACT,QAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,UAAM,QAAkB,CAAC;AAEzB,eAAW,KAAK,QAAQ;AACvB,YAAM,MAAM,KAAK,mBAAmB,GAAG,SAAS,QAAQ;AACxD,UAAI,QAAQ,KAAM,OAAM,KAAK,GAAG;AAAA,IACjC;AAEA,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,WAAO,MAAM,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEQ,mBACP,GACA,SACA,UACgB;AAChB,UAAM,MAAM,EAAE,SAAS,QAAQ,eAAe,EAAE,MAAM,IAAI;AAE1D,YAAQ,EAAE,MAAM;AAAA,MACf,KAAK,SAAS;AACb,iBAAS,KAAK,EAAE,KAAK;AACrB,cAAM,WAAW,EAAE,aAAa,MAAM,MAAM,EAAE;AAC9C,eAAO,GAAG,GAAG,IAAI,QAAQ,IAAI,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,MACxE;AAAA,MACA,KAAK,MAAM;AACV,cAAM,eAAe,EACnB,OAAQ,IAAI,CAAC,MAAW;AACxB,mBAAS,KAAK,CAAC;AACf,iBAAO,QAAQ,cAAc,SAAS,SAAS,CAAC;AAAA,QACjD,CAAC,EACA,KAAK,IAAI;AACX,eAAO,GAAG,GAAG,QAAQ,YAAY;AAAA,MAClC;AAAA,MACA,KAAK,SAAS;AACb,cAAM,eAAe,EACnB,OAAQ,IAAI,CAAC,MAAW;AACxB,mBAAS,KAAK,CAAC;AACf,iBAAO,QAAQ,cAAc,SAAS,SAAS,CAAC;AAAA,QACjD,CAAC,EACA,KAAK,IAAI;AACX,eAAO,GAAG,GAAG,YAAY,YAAY;AAAA,MACtC;AAAA,MACA,KAAK;AACJ,eAAO,GAAG,GAAG;AAAA,MACd,KAAK;AACJ,eAAO,GAAG,GAAG;AAAA,MACd,KAAK,WAAW;AACf,iBAAS,KAAK,EAAE,OAAQ,CAAC,GAAG,EAAE,OAAQ,CAAC,CAAC;AACxC,eAAO,GAAG,GAAG,YAAY,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC,QAAQ,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,MACtH;AAAA,MACA,KAAK,cAAc;AAClB,iBAAS,KAAK,EAAE,OAAQ,CAAC,GAAG,EAAE,OAAQ,CAAC,CAAC;AACxC,eAAO,GAAG,GAAG,gBAAgB,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC,QAAQ,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,MAC1H;AAAA,MACA,KAAK,QAAQ;AACZ,iBAAS,KAAK,EAAE,KAAK;AACrB,eAAO,GAAG,GAAG,SAAS,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,MACjE;AAAA,MACA,KAAK,UAAU;AACd,cAAM,YAAY,KAAK,mBAAmB,EAAE,QAAS,SAAS,QAAQ;AACtE,eAAO,YAAY,IAAI,SAAS,MAAM;AAAA,MACvC;AAAA,MACA;AACC,eAAO;AAAA,IACT;AAAA,EACD;AAAA,EAEQ,mBACP,QACA,SACA,UACS;AACT,UAAM,QAAkB,CAAC;AAEzB,eAAW,KAAK,QAAQ;AACvB,YAAM,MAAM,KAAK,mBAAmB,GAAG,SAAS,QAAQ;AACxD,UAAI,QAAQ,MAAM;AACjB,cAAM,KAAK,GAAG;AAAA,MACf;AAAA,IACD;AAEA,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,WAAO,MAAM,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEQ,eAAe,SAAkB,UAAyB;AACjE,QAAI,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEtC,UAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM;AACrC,eAAS,KAAK,EAAE,KAAK;AACrB,aAAO,GAAG,QAAQ,eAAe,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,IAAI,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,IACvG,CAAC;AAED,WAAO,WAAW,MAAM,KAAK,OAAO,CAAC;AAAA,EACtC;AAAA,EAEQ,cAAc,MAGpB;AACD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,UAAU,OAAO,KAAK,IAAI;AAChC,UAAM,SAAS,OAAO,OAAO,IAAI;AACjC,UAAM,WAAkB,CAAC;AAEzB,UAAM,eAAe,OACnB,IAAI,CAAC,MAAW;AAChB,eAAS,KAAK,CAAC;AACf,aAAO,QAAQ,cAAc,SAAS,SAAS,CAAC;AAAA,IACjD,CAAC,EACA,KAAK,IAAI;AAEX,UAAM,MAAM,eAAe,QAAQ,eAAe,KAAK,SAAS,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,QAAQ,eAAe,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,YAAY;AACvJ,WAAO,EAAE,KAAK,SAAS;AAAA,EACxB;AAAA,EAEQ,cAAc,MAGpB;AACD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,WAAkB,CAAC;AAEzB,UAAM,OAAO,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,eAAS,KAAK,KAAK;AACnB,aAAO,GAAG,QAAQ,eAAe,GAAG,CAAC,MAAM,QAAQ,cAAc,SAAS,SAAS,CAAC,CAAC;AAAA,IACtF,CAAC;AAED,QAAI,MAAM,UAAU,QAAQ,eAAe,KAAK,SAAS,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC;AAEjF,UAAM,WAAW,KAAK,cAAc,SAAS,QAAQ;AACrD,QAAI,SAAU,QAAO;AAErB,QAAI,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAO,aAAa,KAAK,SACvB,IAAI,CAAC,MAAM;AACX,cAAM,MACL,EAAE,WAAW,aACV,EAAE,SACF,QAAQ,eAAe,EAAE,MAAM;AACnC,eAAO,GAAG,GAAG,IAAI,EAAE,UAAU,YAAY,CAAC;AAAA,MAC3C,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,IACb;AAEA,UAAM,iBAAiB,QAAQ;AAAA,MAC9B;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,QAAI,eAAgB,QAAO;AAE3B,WAAO,EAAE,KAAK,SAAS;AAAA,EACxB;AAAA,EAEQ,gBAAkD;AACzD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,WAAkB,CAAC;AAEzB,QAAI,MAAM,eAAe,QAAQ,eAAe,KAAK,SAAS,CAAC;AAE/D,UAAM,WAAW,KAAK,cAAc,SAAS,QAAQ;AACrD,QAAI,SAAU,QAAO;AAErB,QAAI,KAAK,SAAS,SAAS,GAAG;AAC7B,aAAO,aAAa,KAAK,SACvB,IAAI,CAAC,MAAM;AACX,cAAM,MACL,EAAE,WAAW,aACV,EAAE,SACF,QAAQ,eAAe,EAAE,MAAM;AACnC,eAAO,GAAG,GAAG,IAAI,EAAE,UAAU,YAAY,CAAC;AAAA,MAC3C,CAAC,EACA,KAAK,IAAI,CAAC;AAAA,IACb;AAEA,UAAM,iBAAiB,QAAQ;AAAA,MAC9B;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,IACN;AACA,QAAI,eAAgB,QAAO;AAE3B,WAAO,EAAE,KAAK,SAAS;AAAA,EACxB;AAAA,EAEA,MAAc,UAAU,IAAY,QAAwC;AAC3E,UAAM,KAAK,KAAK,MAAM;AACtB,OAAG,UAAU,CAAC,GAAG,EAAE,IAAI,KAAK,KAAK,MAAM,CAAC,gBAAgB;AACxD,OAAG,WAAW,CAAC;AACf,OAAG,aAAa;AAChB,OAAG,cAAc;AACjB,UAAM,EAAE,KAAK,SAAS,IAAI,GAAG,MAAM;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AACtD,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,MAAM,IAAI,aAAa,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG;AACnD,WAAO,QAAQ,QAAQ,QAAQ,SAAY,OAAO,GAAG,IAAI;AAAA,EAC1D;AAAA,EAEQ,YAAY,QAAsC;AACzD,WAAO,OAAO,IAAI,CAAC,OAAO;AAAA,MACzB,GAAG;AAAA,MACH,QAAQ,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,IAAI;AAAA,MACnC,QAAQ,EAAE,SAAS,KAAK,YAAY,EAAE,MAAM,IAAI;AAAA,IACjD,EAAE;AAAA,EACH;AAAA,EAEQ,KAAK,YAA4B;AACxC,QAAI,eAAe,OAAO,WAAW,SAAS,GAAG,EAAG,QAAO;AAC3D,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,WAAO,QAAQ,eAAe,UAAU;AAAA,EACzC;AACD;;;AH9vBO,IAAM,qBAAN,MAAM,oBAA0C;AAAA,EAC9C;AAAA,EACA,SAAwB;AAAA,EAEhC,YAAY,QAA0B;AACrC,SAAK,SAAS;AAAA,MACb,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,GAAG;AAAA,IACJ;AAEA,QAAI,KAAK,OAAO,SAAS,QAAW;AACnC,UAAI,KAAK,OAAO,WAAW,QAAS,MAAK,OAAO,OAAO;AAAA,eAC9C,KAAK,OAAO,WAAW,aAAc,MAAK,OAAO,OAAO;AAAA,IAClE;AAAA,EACD;AAAA,EAEA,MAAM,UAAyB;AAC9B,QAAI,KAAK,WAAW,KAAM;AAC1B,SAAK,SAAS,MAAM,aAAa,KAAK,MAAM;AAC5C,UAAM,KAAK,OAAO,QAAQ;AAAA,EAC3B;AAAA,EAEA,MAAM,aAA4B;AACjC,QAAI,KAAK,WAAW,MAAM;AACzB,YAAM,KAAK,OAAO,WAAW;AAC7B,WAAK,SAAS;AAAA,IACf;AAAA,EACD;AAAA,EAEA,MAAM,IAAI,KAAa,UAAwC;AAC9D,SAAK,gBAAgB;AACrB,WAAO,KAAK,OAAQ,IAAI,KAAK,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,WAAiC;AACtC,WAAO,IAAI,aAAa,MAAM,GAAG,KAAK,OAAO,UAAU,EAAE,GAAG,SAAS,EAAE;AAAA,EACxE;AAAA,EAEA,cAAuB;AACtB,WAAO,KAAK,WAAW,QAAQ,KAAK,OAAO,YAAY;AAAA,EACxD;AAAA,EAEA,YAA4B;AAC3B,WAAQ,KAAK,OAAO,UAAU;AAAA,EAC/B;AAAA,EAEA,aAAsB;AACrB,SAAK,gBAAgB;AACrB,WAAO,KAAK,OAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,YAAoB;AACnB,WAAO,KAAK,OAAO,UAAU;AAAA,EAC9B;AAAA,EAEA,YAAwC;AACvC,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA,EAEA,MAAM,YACL,UACa;AACb,SAAK,gBAAgB;AAErB,WAAO,KAAK,OAAQ,YAAY,OAAO,YAAoB;AAC1D,YAAM,gBAAgB,IAAI,oBAAmB,KAAK,MAAM;AACxD,oBAAc,QAAQ,IAAI,KAAK;AAE/B,oBAAc,MAAM,OACnB,KACA,aAC0B;AAC1B,eAAO,KAAK,OAAQ,IAAI,KAAK,QAAQ;AAAA,MACtC;AAEA,aAAO,SAAS,aAAa;AAAA,IAC9B,CAAC;AAAA,EACF;AAAA,EAEA,OAAO,aAAqB;AAC3B,WAAO,WAAW;AAAA,EACnB;AAAA,EAEQ,kBAAwB;AAC/B,QAAI,KAAK,WAAW,QAAQ,CAAC,KAAK,OAAO,YAAY,GAAG;AACvD,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;AIzFO,IAAM,gBAAN,MAAoB;AAAA,EAClB;AAAA,EAER,YAAY,YAAgC;AAC3C,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,MAAM,YACL,WACA,UACgB;AAChB,UAAM,YAAY,IAAI,eAAe,KAAK,YAAY,QAAQ;AAC9D,aAAS,SAAS;AAClB,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,UAAU,UAAU,eAAe;AACzC,UAAM,cAAc,UAAU,mBAAmB,OAAO;AACxD,UAAM,MAAM,QAAQ,mBAAmB,WAAW,SAAS,WAAW;AACtE,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAU,WAAkC;AACjD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,iBAAiB,SAAS;AAC9C,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAkB,WAAkC;AACzD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,yBAAyB,SAAS;AACtD,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,YAAY,MAAc,IAA2B;AAC1D,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,mBAAmB,MAAM,EAAE;AAC/C,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,WACL,WACA,UACgB;AAChB,UAAM,YAAY,IAAI,eAAe,KAAK,YAAY,OAAO;AAC7D,aAAS,SAAS;AAClB,UAAM,UAAU,KAAK,WAAW,WAAW;AAE3C,QAAI,UAAU,eAAe,SAAS,GAAG;AACxC,YAAM,UAAU,QAAQ;AAAA,QACvB;AAAA,QACA,UAAU;AAAA,MACX;AACA,YAAM,KAAK,WAAW;AAAA,QACrB,eAAe,QAAQ,eAAe,SAAS,CAAC,IAAI,OAAO;AAAA,MAC5D;AAAA,IACD;AAEA,QAAI,UAAU,eAAe,SAAS,GAAG;AACxC,iBAAW,EAAE,MAAM,GAAG,KAAK,UAAU,gBAAgB;AACpD,cAAM,YAAY,QAAQ,oBAAoB,WAAW,MAAM,EAAE;AACjE,cAAM,KAAK,WAAW;AAAA,UACrB,eAAe,QAAQ,eAAe,SAAS,CAAC,IAAI,SAAS;AAAA,QAC9D;AAAA,MACD;AAAA,IACD;AAEA,UAAM,kBAAkB,UAAU,yBAAyB,OAAO;AAClE,QAAI,gBAAgB,SAAS,GAAG;AAC/B,iBAAW,UAAU,iBAAiB;AACrC,cAAM,KAAK,WAAW;AAAA,UACrB,eAAe,QAAQ,eAAe,SAAS,CAAC,IAAI,MAAM;AAAA,QAC3D;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,SAAS,WAAqC;AACnD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,gBAAgB,SAAS;AAC7C,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,SAAS,CAAC;AACzD,WAAO,KAAK,WAAW,MAAM,IAAI;AAAA,EAClC;AAAA,EAEA,MAAM,UAAU,WAAmB,YAAsC;AACxE,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,SAAS,KAAK,WAAW,UAAU;AAEzC,QAAI,WAAW,UAAU;AACxB,YAAMC,OAAM,QAAQ,iBAAiB,WAAW,UAAU;AAC1D,YAAMC,UAAS,MAAM,KAAK,WAAW,IAAID,IAAG;AAC5C,aAAOC,QAAO,KAAK,KAAK,CAAC,QAAa,IAAI,SAAS,UAAU;AAAA,IAC9D;AAEA,UAAM,MAAM,QAAQ,iBAAiB,WAAW,UAAU;AAC1D,UAAM,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC;AACrE,WAAO,KAAK,WAAW,MAAM,IAAI;AAAA,EAClC;AAAA,EAEQ,WAAW,QAA6B;AAC/C,QAAI,OAAO,KAAK,WAAW,EAAG,QAAO;AACrC,UAAM,MAAM,OAAO,KAAK,CAAC;AACzB,WAAO,OAAO,IAAI,SAAS,IAAI,SAAS,CAAC;AAAA,EAC1C;AACD;AAIO,IAAM,iBAAN,MAAqB;AAAA,EACnB;AAAA,EACA,UAA8B,CAAC;AAAA,EAC/B,cAAwB,CAAC;AAAA,EACzB,aAAyB,CAAC;AAAA,EAC1B,YAAwB,CAAC;AAAA,EACzB,cAA+B,CAAC;AAAA,EACxC,iBAA2B,CAAC;AAAA,EAC5B,iBAAiD,CAAC;AAAA,EAElD,YAAY,aAAiC,MAAqB;AACjE,SAAK,OAAO;AAAA,EACb;AAAA,EAEA,GAAG,OAAO,MAAwB;AACjC,UAAM,MAAM,KAAK,UAAU,MAAM,IAAI;AACrC,QAAI,cAAc;AAClB,QAAI,SAAS;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAW,OAAO,MAAwB;AACzC,UAAM,MAAM,KAAK,UAAU,cAAc,IAAI;AAC7C,QAAI,cAAc;AAClB,QAAI,SAAS;AACb,WAAO;AAAA,EACR;AAAA,EAEA,cAAc,OAAO,MAAwB;AAC5C,UAAM,MAAM,KAAK,UAAU,iBAAiB,IAAI;AAChD,QAAI,cAAc;AAClB,QAAI,SAAS;AACb,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,MAAc,SAAS,KAAuB;AACpD,UAAM,MAAM,KAAK,UAAU,UAAU,IAAI;AACzC,QAAI,UAAU,MAAM;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,MAAgC;AACpC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,QAAQ,MAAgC;AACvC,WAAO,KAAK,UAAU,WAAW,IAAI;AAAA,EACtC;AAAA,EAEA,WAAW,MAAgC;AAC1C,WAAO,KAAK,UAAU,cAAc,IAAI;AAAA,EACzC;AAAA,EAEA,YAAY,MAAgC;AAC3C,WAAO,KAAK,UAAU,eAAe,IAAI;AAAA,EAC1C;AAAA,EAEA,aAAa,MAAgC;AAC5C,WAAO,KAAK,UAAU,gBAAgB,IAAI;AAAA,EAC3C;AAAA,EAEA,QAAQ,MAAgC;AACvC,WAAO,KAAK,UAAU,WAAW,IAAI;AAAA,EACtC;AAAA,EAEA,MAAM,MAAc,YAAuC;AAC1D,UAAM,MAAM,KAAK,UAAU,SAAS,IAAI;AACxC,QAAI,eAAe,OAAW,KAAI,aAAa,UAAU;AACzD,WAAO;AAAA,EACR;AAAA,EAEA,OAAO,MAAgC;AACtC,WAAO,KAAK,UAAU,UAAU,IAAI;AAAA,EACrC;AAAA,EAEA,QAAQ,MAAc,YAAY,IAAI,QAAQ,GAAqB;AAClE,UAAM,MAAM,KAAK,UAAU,WAAW,IAAI;AAC1C,QAAI,aAAa,SAAS;AAC1B,QAAI,SAAS,KAAK;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,KAAK,MAAgC;AACpC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,SAAS,MAAgC;AACxC,WAAO,KAAK,UAAU,YAAY,IAAI;AAAA,EACvC;AAAA,EAEA,UAAU,MAAgC;AACzC,WAAO,KAAK,UAAU,aAAa,IAAI;AAAA,EACxC;AAAA,EAEA,KAAK,MAAgC;AACpC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,KAAK,MAAgC;AACpC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,KAAK,MAAgC;AACpC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,MAAgC;AACrC,WAAO,KAAK,UAAU,SAAS,IAAI;AAAA,EACpC;AAAA,EAEA,OAAO,MAAgC;AACtC,WAAO,KAAK,UAAU,UAAU,IAAI;AAAA,EACrC;AAAA,EAEA,KAAK,OAAO,QAA0B;AACrC,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,KAAK,MAAc,QAAoC;AACtD,UAAM,MAAM,KAAK,UAAU,QAAQ,IAAI;AACvC,QAAI,UAAU,MAAM;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,UAAU,MAAgC;AACzC,UAAM,MAAM,KAAK,UAAU,aAAa,IAAI;AAC5C,QAAI,SAAS;AACb,WAAO;AAAA,EACR;AAAA,EAEA,WAAW,SAAyB;AACnC,SAAK,YAAY,KAAK,GAAG,OAAO;AAAA,EACjC;AAAA,EAEA,UAAU,SAAyB;AAClC,SAAK,WAAW,KAAK,OAAO;AAAA,EAC7B;AAAA,EAEA,SAAS,SAAyB;AACjC,SAAK,UAAU,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEA,QAAQ,QAAsC;AAC7C,UAAM,KAAoB;AAAA,MACzB;AAAA,MACA,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,UAAU;AAAA,IACX;AACA,SAAK,YAAY,KAAK,EAAE;AACxB,WAAO,IAAI,qBAAqB,EAAE;AAAA,EACnC;AAAA,EAEA,aAAmB;AAClB,SAAK,UAAU,YAAY,EAAE,SAAS;AACtC,SAAK,UAAU,YAAY,EAAE,SAAS;AAAA,EACvC;AAAA,EAEA,cAAoB;AACnB,SAAK,UAAU,YAAY,EAAE,SAAS;AAAA,EACvC;AAAA,EAEA,gBAAsB;AACrB,SAAK,OAAO,kBAAkB,GAAG,EAAE,SAAS;AAAA,EAC7C;AAAA,EAEA,WAAW,QAAsB;AAChC,SAAK,eAAe,KAAK,MAAM;AAAA,EAChC;AAAA,EAEA,aAAa,MAAc,IAAkB;AAC5C,SAAK,eAAe,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EACtC;AAAA,EAEA,cAAoB;AACnB,SAAK,cAAc,CAAC;AAAA,EACrB;AAAA,EAEA,WAAW,YAA2B;AACrC,SAAK,aAAa,CAAC;AAAA,EACpB;AAAA,EAEA,UAAU,YAA2B;AACpC,SAAK,YAAY,CAAC;AAAA,EACnB;AAAA,EAEA,YAAY,YAA2B;AACtC,SAAK,cAAc,CAAC;AAAA,EACrB;AAAA,EAEA,iBAAuB;AACtB,SAAK,eAAe,KAAK,cAAc,YAAY;AAAA,EACpD;AAAA,EAEA,kBAAwB;AACvB,SAAK,eAAe,KAAK,YAAY;AAAA,EACtC;AAAA,EAEA,oBAA0B;AACzB,SAAK,eAAe,KAAK,gBAAgB;AAAA,EAC1C;AAAA,EAEA,iBAAyC;AACxC,WAAO,KAAK,QACV,OAAO,CAAC,MAAM,KAAK,SAAS,YAAY,EAAE,KAAK,EAC/C,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;AAAA,EACzB;AAAA,EAEA,mBAAmB,SAA4B;AAC9C,UAAM,cAAwB,CAAC;AAC/B,UAAM,OAAO,CAAC,SAAiB,QAAQ,eAAe,IAAI;AAE1D,eAAW,MAAM,KAAK,aAAa;AAClC,kBAAY,KAAK,gBAAgB,KAAK,EAAE,CAAC,GAAG;AAAA,IAC7C;AAEA,eAAW,MAAM,KAAK,YAAY;AACjC,kBAAY,KAAK,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IACjE;AAEA,eAAW,MAAM,KAAK,WAAW;AAChC,kBAAY,KAAK,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IAChE;AAEA,eAAW,MAAM,KAAK,aAAa;AAClC,UAAI,QAAQ,gBAAgB,KAAK,GAAG,MAAM,CAAC,gBAAgB,KAAK,GAAG,EAAE,CAAC,KAAK,KAAK,GAAG,UAAU,CAAC;AAC9F,UAAI,GAAG,SAAU,UAAS,cAAc,GAAG,QAAQ;AACnD,UAAI,GAAG,SAAU,UAAS,cAAc,GAAG,QAAQ;AACnD,kBAAY,KAAK,KAAK;AAAA,IACvB;AAEA,WAAO;AAAA,EACR;AAAA,EAEA,yBAAyB,SAA4B;AACpD,WAAO,KAAK,QACV,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,OAAO,EAC9C,IAAI,CAAC,MAAM,QAAQ,kBAAkB,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA,EAC1D;AAAA,EAEQ,UAAU,MAAc,MAAgC;AAC/D,UAAM,MAAM,IAAI,iBAAiB,MAAM,IAAI;AAC3C,SAAK,QAAQ,KAAK,GAAG;AACrB,WAAO;AAAA,EACR;AACD;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,eAAoB;AAAA,EACpB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,cAA6B;AAAA,EAC7B,cAA6B;AAAA,EAC7B,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,iBAAgC;AAAA,EAChC,aAA4B;AAAA,EAC5B,cAA6B;AAAA,EAC7B,aAA8B;AAAA,EAC9B,cAAc;AAAA,EACtB,QAAQ;AAAA,EAER,YAAY,MAAc,MAAc;AACvC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACb;AAAA,EAEA,WAAiB;AAChB,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,OAAkB;AACzB,SAAK,eAAe;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,WAAiB;AAChB,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,SAAe;AACd,SAAK,WAAW;AAChB,WAAO;AAAA,EACR;AAAA,EAEA,UAAgB;AACf,SAAK,YAAY;AACjB,WAAO;AAAA,EACR;AAAA,EAEA,QAAc;AACb,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA,EAEA,QAAQ,MAAoB;AAC3B,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAsB;AAC3B,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,QAAc;AACb,SAAK,UAAU;AACf,WAAO;AAAA,EACR;AAAA,EAEA,gBAAsB;AACrB,SAAK,kBAAkB;AACvB,WAAO;AAAA,EACR;AAAA,EAEA,UAAU,MAAsB;AAC/B,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,UAAU,KAAmB;AAC5B,SAAK,cAAc;AACnB,WAAO;AAAA,EACR;AAAA,EAEA,aAAa,WAAyB;AACrC,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,OAAqB;AAC7B,SAAK,aAAa;AAClB,WAAO;AAAA,EACR;AAAA,EAEA,UAAgC;AAC/B,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AACD;AAUO,IAAM,uBAAN,MAA2B;AAAA,EACzB;AAAA,EAER,YAAY,KAAoB;AAC/B,SAAK,MAAM;AAAA,EACZ;AAAA,EAEA,WAAW,QAAsB;AAChC,SAAK,IAAI,aAAa;AACtB,WAAO;AAAA,EACR;AAAA,EAEA,GAAG,OAAqB;AACvB,SAAK,IAAI,KAAK;AACd,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,QAAsB;AAC9B,SAAK,IAAI,WAAW;AACpB,WAAO;AAAA,EACR;AAAA,EAEA,SAAS,QAAsB;AAC9B,SAAK,IAAI,WAAW;AACpB,WAAO;AAAA,EACR;AACD;AAEO,IAAM,WAAN,MAAe;AAAA,EACb;AAAA,EACA,aAAoC,CAAC;AAAA,EAE7C,YAAY,YAAgC;AAC3C,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,cAAc,YAAyC;AACtD,SAAK,WAAW,KAAK,GAAG,UAAU;AAAA,EACnC;AAAA,EAEA,cAAc,YAAyC;AACtD,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,MAAM,MAAqB;AAC1B,UAAM,KAAK,qBAAqB;AAEhC,UAAM,MAAM,MAAM,KAAK,iBAAiB;AACxC,UAAM,WAAW,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAE/C,UAAM,UAAU,KAAK,WAAW,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC;AACnE,QAAI,QAAQ,WAAW,GAAG;AACzB,cAAQ,IAAI,qBAAqB;AACjC;AAAA,IACD;AAEA,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,UAAM,SAAS,IAAI,cAAc,KAAK,UAAU;AAEhD,eAAW,aAAa,SAAS;AAChC,cAAQ,IAAI,cAAc,UAAU,IAAI,EAAE;AAC1C,UAAI;AACH,cAAM,UAAU,GAAG,MAAM;AACzB,cAAM,KAAK,gBAAgB,UAAU,MAAM,SAAS;AACpD,gBAAQ,IAAI,cAAc,UAAU,IAAI,EAAE;AAAA,MAC3C,SAAS,KAAK;AACb,gBAAQ,MAAM,qBAAqB,UAAU,IAAI,IAAI,GAAG;AACxD,cAAM;AAAA,MACP;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,WAA0B;AAC/B,UAAM,KAAK,qBAAqB;AAEhC,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,cAAc,GAAG;AACpB,cAAQ,IAAI,sBAAsB;AAClC;AAAA,IACD;AAEA,UAAM,sBAAsB,MAAM,KAAK,qBAAqB,SAAS;AACrE,UAAM,SAAS,IAAI,cAAc,KAAK,UAAU;AAEhD,eAAW,aAAa,oBAAoB,QAAQ,GAAG;AACtD,YAAM,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,IAAI;AACjE,UAAI,KAAK;AACR,gBAAQ,IAAI,iBAAiB,UAAU,IAAI,EAAE;AAC7C,YAAI;AACH,gBAAM,IAAI,KAAK,MAAM;AACrB,gBAAM,KAAK,gBAAgB,UAAU,IAAI;AACzC,kBAAQ,IAAI,iBAAiB,UAAU,IAAI,EAAE;AAAA,QAC9C,SAAS,KAAK;AACb,kBAAQ,MAAM,oBAAoB,UAAU,IAAI,IAAI,GAAG;AACvD,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,QAAuB;AAC5B,UAAM,KAAK,qBAAqB;AAEhC,UAAM,SAAS,MAAM,KAAK,iBAAiB;AAC3C,UAAM,SAAS,IAAI,cAAc,KAAK,UAAU;AAEhD,eAAW,aAAa,OAAO,QAAQ,GAAG;AACzC,YAAM,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,IAAI;AACjE,UAAI,KAAK;AACR,gBAAQ,IAAI,cAAc,UAAU,IAAI,EAAE;AAC1C,YAAI;AACH,gBAAM,IAAI,KAAK,MAAM;AACrB,gBAAM,KAAK,gBAAgB,UAAU,IAAI;AACzC,kBAAQ,IAAI,WAAW,UAAU,IAAI,EAAE;AAAA,QACxC,SAAS,KAAK;AACb,kBAAQ,MAAM,iBAAiB,UAAU,IAAI,IAAI,GAAG;AACpD,gBAAM;AAAA,QACP;AAAA,MACD;AAAA,IACD;AAAA,EACD;AAAA,EAEA,MAAM,UAAyB;AAC9B,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,IAAI;AAAA,EAChB;AAAA,EAEA,MAAM,SAAwC;AAC7C,UAAM,KAAK,qBAAqB;AAChC,WAAO,KAAK,iBAAiB;AAAA,EAC9B;AAAA,EAEA,MAAc,uBAAsC;AACnD,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,MAAM,QAAQ,6BAA6B;AACjD,UAAM,KAAK,WAAW,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAc,mBAAkD;AAC/D,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACpC;AAAA,IACD;AACA,WAAO,OAAO,KAAK,IAAI,CAAC,SAAc;AAAA,MACrC,MAAM,OAAO,IAAI,IAAI;AAAA,MACrB,OAAO,OAAO,IAAI,KAAK;AAAA,MACvB,YAAY,OAAO,IAAI,cAAc,EAAE;AAAA,IACxC,EAAE;AAAA,EACH;AAAA,EAEA,MAAc,qBAAsC;AACnD,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACpC;AAAA,IACD;AACA,WAAO,OAAO,OAAO,KAAK,CAAC,GAAG,cAAc,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAc,qBAAsC;AACnD,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACpC;AAAA,IACD;AACA,WAAO,OAAO,OAAO,KAAK,CAAC,GAAG,cAAc,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAc,qBACb,OACgC;AAChC,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACpC;AAAA,MACA,CAAC,KAAK;AAAA,IACP;AACA,WAAO,OAAO,KAAK,IAAI,CAAC,SAAc;AAAA,MACrC,MAAM,OAAO,IAAI,IAAI;AAAA,MACrB,OAAO,OAAO,IAAI,KAAK;AAAA,MACvB,YAAY,OAAO,IAAI,cAAc,EAAE;AAAA,IACxC,EAAE;AAAA,EACH;AAAA,EAEA,MAAc,gBAAgB,MAAc,OAA8B;AACzE,UAAM,KAAK,WAAW;AAAA,MACrB;AAAA,MACA,CAAC,MAAM,KAAK;AAAA,IACb;AAAA,EACD;AAAA,EAEA,MAAc,gBAAgB,MAA6B;AAC1D,UAAM,KAAK,WAAW,IAAI,yCAAyC,CAAC,IAAI,CAAC;AAAA,EAC1E;AACD;;;AC9pBO,IAAM,aAAN,MAAM,YAAoB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,QAA4B;AACvC,SAAK,OAAO,OAAO;AACnB,SAAK,cAAc,OAAO;AAC1B,SAAK,UAAU,OAAO;AACtB,SAAK,QAAQ,OAAO;AACpB,SAAK,WAAW,OAAO;AACvB,SAAK,OAAO,OAAO;AACnB,SAAK,KAAK,OAAO;AAAA,EAClB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,cAAc,KAAK;AAAA,EAChC;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,cAAc;AAAA,EAC3B;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,KAAK,WAAW;AAAA,EAC7B;AAAA,EAEA,WAAiC;AAChC,QAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,WAAO;AAAA,MACN,MAAM,KAAK,cAAc;AAAA,MACzB,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,IACN;AAAA,EACD;AAAA,EAEA,WAAiC;AAChC,QAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,WAAO;AAAA,MACN,MAAM,KAAK,cAAc;AAAA,MACzB,SAAS,KAAK;AAAA,MACd,KAAK;AAAA,IACN;AAAA,EACD;AAAA,EAEA,SAA8B;AAC7B,WAAO;AAAA,MACN,MAAM,KAAK;AAAA,MACX,YAAY;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,MACf;AAAA,IACD;AAAA,EACD;AAAA,EAEA,IAAO,IAAkD;AACxD,WAAO,IAAI,YAAc;AAAA,MACxB,GAAG;AAAA,MACH,MAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACvB,CAAC;AAAA,EACF;AAAA,EAEA,QAAa;AACZ,WAAO,KAAK;AAAA,EACb;AAAA,EAEA,OAAO,KAAQ,QAA2C;AACzD,WAAO,IAAI,YAAW,MAAM;AAAA,EAC7B;AACD;;;ACvFO,IAAM,SAAN,MAAa;AAAA,EACX;AAAA,EAER,YAAY,YAAgC;AAC3C,SAAK,aAAa;AAAA,EACnB;AAAA,EAEA,MAAM,KAAK,aAAyC;AACnD,UAAM,YAAY,IAAI,KAAK,UAAU;AAAA,EACtC;AAAA,EAEA,MAAM,OAAO,OAAe,MAA4C;AACvE,QAAI,KAAK,WAAW,EAAG;AAEvB,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,WAAW,KAAK,CAAC;AACvB,QAAI,CAAC,SAAU;AAEf,UAAM,UAAU,OAAO,KAAK,QAAQ;AACpC,UAAM,iBAAiB,QACrB,IAAI,CAAC,MAAM,QAAQ,eAAe,CAAC,CAAC,EACpC,KAAK,IAAI;AAEX,UAAM,YAAY;AAClB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,WAAW;AAChD,YAAM,QAAQ,KAAK,MAAM,GAAG,IAAI,SAAS;AACzC,YAAM,eAAyB,CAAC;AAChC,YAAM,WAAkB,CAAC;AAEzB,iBAAW,OAAO,OAAO;AACxB,cAAM,kBAAkB,QAAQ,IAAI,CAAC,QAAQ;AAC5C,mBAAS,KAAK,IAAI,GAAG,CAAC;AACtB,iBAAO,QAAQ,cAAc,SAAS,SAAS,CAAC;AAAA,QACjD,CAAC;AACD,qBAAa,KAAK,IAAI,gBAAgB,KAAK,IAAI,CAAC,GAAG;AAAA,MACpD;AAEA,YAAM,MAAM,eAAe,QAAQ,eAAe,KAAK,CAAC,KAAK,cAAc,YAAY,aAAa,KAAK,IAAI,CAAC;AAC9G,YAAM,KAAK,WAAW,IAAI,KAAK,QAAQ;AAAA,IACxC;AAAA,EACD;AAAA,EAEA,MAAM,SAAS,OAA8B;AAC5C,UAAM,UAAU,KAAK,WAAW,WAAW;AAC3C,UAAM,SAAS,KAAK,WAAW,UAAU;AAEzC,QAAI,WAAW,UAAU;AACxB,YAAM,KAAK,WAAW,IAAI,eAAe,QAAQ,eAAe,KAAK,CAAC,EAAE;AAAA,IACzE,WAAW,WAAW,cAAc;AACnC,YAAM,KAAK,WAAW,IAAI,QAAQ,gBAAgB,KAAK,CAAC;AAAA,IACzD,OAAO;AACN,YAAM,KAAK,WAAW,IAAI,4BAA4B;AACtD,YAAM,KAAK,WAAW,IAAI,QAAQ,gBAAgB,KAAK,CAAC;AACxD,YAAM,KAAK,WAAW,IAAI,4BAA4B;AAAA,IACvD;AAAA,EACD;AAAA,EAEA,MAAM,MAAqB;AAC1B,UAAM,IAAI,MAAM,+CAA+C;AAAA,EAChE;AACD;","names":["result","result","sql","result"]}
@@ -0,0 +1,29 @@
1
+ type EventHandler = (...args: any[]) => void | Promise<void>;
2
+ interface EventConfig {
3
+ wildcard?: boolean;
4
+ maxListeners?: number;
5
+ }
6
+ declare class Event {
7
+ private emitter;
8
+ private wildcardMode;
9
+ private patterns;
10
+ constructor(config?: EventConfig);
11
+ on(event: string, handler: EventHandler): this;
12
+ addListener(event: string, handler: EventHandler): this;
13
+ once(event: string, handler: EventHandler): this;
14
+ emit(event: string, ...args: any[]): Promise<void>;
15
+ off(event: string, handler: EventHandler): this;
16
+ removeListener(event: string, handler: EventHandler): this;
17
+ removeAllListeners(event?: string): this;
18
+ listeners(event: string): EventHandler[];
19
+ hasListeners(event: string): boolean;
20
+ onPattern(pattern: string, handler: EventHandler): this;
21
+ ask<T>(event: string, ...args: any[]): Promise<T[]>;
22
+ listenerCount(event?: string): number;
23
+ eventNames(): string[];
24
+ private patternToRegex;
25
+ }
26
+ declare function createEvent(config?: EventConfig): Event;
27
+ declare function event(): Event;
28
+
29
+ export { Event, type EventConfig, type EventHandler, createEvent, event };
@@ -0,0 +1,159 @@
1
+ // src/server/events/index.ts
2
+ import { EventEmitter } from "events";
3
+ var Event = class {
4
+ emitter;
5
+ wildcardMode;
6
+ patterns = [];
7
+ constructor(config) {
8
+ this.emitter = new EventEmitter();
9
+ this.wildcardMode = config?.wildcard ?? false;
10
+ if (config?.maxListeners !== void 0) {
11
+ this.emitter.setMaxListeners(config.maxListeners);
12
+ }
13
+ }
14
+ on(event2, handler) {
15
+ this.emitter.on(event2, handler);
16
+ return this;
17
+ }
18
+ addListener(event2, handler) {
19
+ return this.on(event2, handler);
20
+ }
21
+ once(event2, handler) {
22
+ this.emitter.once(event2, handler);
23
+ return this;
24
+ }
25
+ async emit(event2, ...args) {
26
+ const listeners = this.emitter.listeners(event2);
27
+ for (const listener of listeners) {
28
+ const result = listener(...args);
29
+ if (result instanceof Promise) {
30
+ await result;
31
+ }
32
+ }
33
+ if (this.wildcardMode) {
34
+ for (const entry of this.patterns) {
35
+ if (entry.regex.test(event2)) {
36
+ const result = entry.handler(event2, ...args);
37
+ if (result instanceof Promise) {
38
+ await result;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ off(event2, handler) {
45
+ this.emitter.off(event2, handler);
46
+ return this;
47
+ }
48
+ removeListener(event2, handler) {
49
+ return this.off(event2, handler);
50
+ }
51
+ removeAllListeners(event2) {
52
+ if (event2 !== void 0) {
53
+ this.emitter.removeAllListeners(event2);
54
+ this.patterns = this.patterns.filter((p) => p.pattern !== event2);
55
+ } else {
56
+ this.emitter.removeAllListeners();
57
+ this.patterns = [];
58
+ }
59
+ return this;
60
+ }
61
+ listeners(event2) {
62
+ return this.emitter.listeners(event2);
63
+ }
64
+ hasListeners(event2) {
65
+ if (this.emitter.listenerCount(event2) > 0) {
66
+ return true;
67
+ }
68
+ if (this.wildcardMode) {
69
+ for (const entry of this.patterns) {
70
+ if (entry.regex.test(event2)) {
71
+ return true;
72
+ }
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ onPattern(pattern, handler) {
78
+ if (!this.wildcardMode) {
79
+ throw new Error(
80
+ "Pattern matching is not enabled. Set wildcard: true in EventConfig."
81
+ );
82
+ }
83
+ const regex = this.patternToRegex(pattern);
84
+ this.patterns.push({ pattern, regex, handler });
85
+ return this;
86
+ }
87
+ async ask(event2, ...args) {
88
+ const handlers = this.emitter.listeners(event2);
89
+ const results = [];
90
+ for (const handler of handlers) {
91
+ const result = handler(...args);
92
+ if (result instanceof Promise) {
93
+ const resolved = await result;
94
+ if (resolved !== void 0) {
95
+ results.push(resolved);
96
+ }
97
+ } else if (result !== void 0) {
98
+ results.push(result);
99
+ }
100
+ }
101
+ if (this.wildcardMode) {
102
+ for (const entry of this.patterns) {
103
+ if (entry.regex.test(event2)) {
104
+ const result = entry.handler(event2, ...args);
105
+ if (result instanceof Promise) {
106
+ const resolved = await result;
107
+ if (resolved !== void 0) {
108
+ results.push(resolved);
109
+ }
110
+ } else if (result !== void 0) {
111
+ results.push(result);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ return results;
117
+ }
118
+ listenerCount(event2) {
119
+ if (event2 !== void 0) {
120
+ let count = this.emitter.listenerCount(event2);
121
+ if (this.wildcardMode) {
122
+ for (const entry of this.patterns) {
123
+ if (entry.regex.test(event2)) {
124
+ count++;
125
+ }
126
+ }
127
+ }
128
+ return count;
129
+ }
130
+ return this.emitter.eventNames().reduce((sum, name) => sum + this.emitter.listenerCount(name), 0) + this.patterns.length;
131
+ }
132
+ eventNames() {
133
+ const nativeNames = this.emitter.eventNames();
134
+ const patternNames = this.patterns.map((p) => p.pattern);
135
+ return [.../* @__PURE__ */ new Set([...nativeNames, ...patternNames])];
136
+ }
137
+ patternToRegex(pattern) {
138
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&");
139
+ const regexStr = escaped.replace(/\*/g, "[^.]*");
140
+ return new RegExp(`^${regexStr}$`);
141
+ }
142
+ };
143
+ var defaultEvent = null;
144
+ function createEvent(config) {
145
+ defaultEvent = new Event(config);
146
+ return defaultEvent;
147
+ }
148
+ function event() {
149
+ if (defaultEvent === null) {
150
+ defaultEvent = new Event();
151
+ }
152
+ return defaultEvent;
153
+ }
154
+ export {
155
+ Event,
156
+ createEvent,
157
+ event
158
+ };
159
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/server/events/index.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\n\nexport type EventHandler = (...args: any[]) => void | Promise<void>;\n\nexport interface EventConfig {\n\twildcard?: boolean;\n\tmaxListeners?: number;\n}\n\ninterface PatternEntry {\n\tpattern: string;\n\tregex: RegExp;\n\thandler: EventHandler;\n}\n\nexport class Event {\n\tprivate emitter: EventEmitter;\n\tprivate wildcardMode: boolean;\n\tprivate patterns: PatternEntry[] = [];\n\n\tconstructor(config?: EventConfig) {\n\t\tthis.emitter = new EventEmitter();\n\t\tthis.wildcardMode = config?.wildcard ?? false;\n\n\t\tif (config?.maxListeners !== undefined) {\n\t\t\tthis.emitter.setMaxListeners(config.maxListeners);\n\t\t}\n\t}\n\n\ton(event: string, handler: EventHandler): this {\n\t\tthis.emitter.on(event, handler);\n\t\treturn this;\n\t}\n\n\taddListener(event: string, handler: EventHandler): this {\n\t\treturn this.on(event, handler);\n\t}\n\n\tonce(event: string, handler: EventHandler): this {\n\t\tthis.emitter.once(event, handler);\n\t\treturn this;\n\t}\n\n\tasync emit(event: string, ...args: any[]): Promise<void> {\n\t\tconst listeners = this.emitter.listeners(event);\n\n\t\tfor (const listener of listeners) {\n\t\t\tconst result = listener(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tawait result;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toff(event: string, handler: EventHandler): this {\n\t\tthis.emitter.off(event, handler);\n\t\treturn this;\n\t}\n\n\tremoveListener(event: string, handler: EventHandler): this {\n\t\treturn this.off(event, handler);\n\t}\n\n\tremoveAllListeners(event?: string): this {\n\t\tif (event !== undefined) {\n\t\t\tthis.emitter.removeAllListeners(event);\n\t\t\tthis.patterns = this.patterns.filter((p) => p.pattern !== event);\n\t\t} else {\n\t\t\tthis.emitter.removeAllListeners();\n\t\t\tthis.patterns = [];\n\t\t}\n\t\treturn this;\n\t}\n\n\tlisteners(event: string): EventHandler[] {\n\t\treturn this.emitter.listeners(event) as EventHandler[];\n\t}\n\n\thasListeners(event: string): boolean {\n\t\tif (this.emitter.listenerCount(event) > 0) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tonPattern(pattern: string, handler: EventHandler): this {\n\t\tif (!this.wildcardMode) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Pattern matching is not enabled. Set wildcard: true in EventConfig.\",\n\t\t\t);\n\t\t}\n\n\t\tconst regex = this.patternToRegex(pattern);\n\t\tthis.patterns.push({ pattern, regex, handler });\n\t\treturn this;\n\t}\n\n\tasync ask<T>(event: string, ...args: any[]): Promise<T[]> {\n\t\tconst handlers = this.emitter.listeners(event) as EventHandler[];\n\t\tconst results: T[] = [];\n\n\t\tfor (const handler of handlers) {\n\t\t\tconst result = handler(...args) as unknown;\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tconst resolved = await result;\n\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t}\n\t\t\t} else if (result !== undefined) {\n\t\t\t\tresults.push(result as T);\n\t\t\t}\n\t\t}\n\n\t\tif (this.wildcardMode) {\n\t\t\tfor (const entry of this.patterns) {\n\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\tconst result = entry.handler(event, ...args) as unknown;\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tconst resolved = await result;\n\t\t\t\t\t\tif (resolved !== undefined) {\n\t\t\t\t\t\t\tresults.push(resolved as T);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (result !== undefined) {\n\t\t\t\t\t\tresults.push(result as T);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tlistenerCount(event?: string): number {\n\t\tif (event !== undefined) {\n\t\t\tlet count = this.emitter.listenerCount(event);\n\n\t\t\tif (this.wildcardMode) {\n\t\t\t\tfor (const entry of this.patterns) {\n\t\t\t\t\tif (entry.regex.test(event)) {\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn count;\n\t\t}\n\n\t\treturn (\n\t\t\tthis.emitter\n\t\t\t\t.eventNames()\n\t\t\t\t.reduce((sum, name) => sum + this.emitter.listenerCount(name), 0) +\n\t\t\tthis.patterns.length\n\t\t);\n\t}\n\n\teventNames(): string[] {\n\t\tconst nativeNames = this.emitter.eventNames() as string[];\n\t\tconst patternNames = this.patterns.map((p) => p.pattern);\n\t\treturn [...new Set([...nativeNames, ...patternNames])];\n\t}\n\n\tprivate patternToRegex(pattern: string): RegExp {\n\t\tconst escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\tconst regexStr = escaped.replace(/\\*/g, \"[^.]*\");\n\t\treturn new RegExp(`^${regexStr}$`);\n\t}\n}\n\nlet defaultEvent: Event | null = null;\n\nexport function createEvent(config?: EventConfig): Event {\n\tdefaultEvent = new Event(config);\n\treturn defaultEvent;\n}\n\nexport function event(): Event {\n\tif (defaultEvent === null) {\n\t\tdefaultEvent = new Event();\n\t}\n\treturn defaultEvent;\n}\n"],"mappings":"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","names":["event"]}
@@ -0,0 +1,36 @@
1
+ import { A as AuthUser } from '../../session-guard-CZeN87L9.js';
2
+ import { M as Middleware } from '../../index-CMkhSDh7.js';
3
+ import '../../response-Ca8KWK5_.js';
4
+ import 'node:http';
5
+ import 'node:stream';
6
+ import '../container/index.js';
7
+
8
+ declare class AuthorizationError extends Error {
9
+ readonly ability: string;
10
+ constructor(message: string, ability: string);
11
+ }
12
+ type GateCallback = (user: AuthUser, ...args: unknown[]) => boolean | Promise<boolean>;
13
+ interface GatePolicy {
14
+ [ability: string]: GateCallback;
15
+ }
16
+ type BeforeCallback = (user: AuthUser, ability: string) => boolean | null | Promise<boolean | null>;
17
+ type AfterCallback = (user: AuthUser, ability: string, result: boolean) => void | Promise<void>;
18
+ declare class Gate {
19
+ private abilities;
20
+ private policies;
21
+ private beforeCallbacks;
22
+ private afterCallbacks;
23
+ define(ability: string, callback: GateCallback): this;
24
+ policy(resource: string, policy: GatePolicy): this;
25
+ allows(ability: string, user: AuthUser, ...args: unknown[]): Promise<boolean>;
26
+ denies(ability: string, user: AuthUser, ...args: unknown[]): Promise<boolean>;
27
+ authorize(ability: string, user: AuthUser, ...args: unknown[]): Promise<void>;
28
+ any(abilities: string[], user: AuthUser, ...args: unknown[]): Promise<boolean>;
29
+ all(abilities: string[], user: AuthUser, ...args: unknown[]): Promise<boolean>;
30
+ abilitiesFor(user: AuthUser): Promise<string[]>;
31
+ before(callback: BeforeCallback): this;
32
+ after(callback: AfterCallback): this;
33
+ }
34
+ declare function authorize(ability: string, ...args: unknown[]): Middleware;
35
+
36
+ export { AuthorizationError, Gate, type GateCallback, type GatePolicy, authorize };