sprint-es 0.0.45 ā 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.cjs +4 -2
- package/dist/cjs/index.cjs +4 -4
- package/dist/cjs/modules/jwt/index.cjs +3 -2
- package/dist/esm/cli.js +4 -2
- package/dist/esm/index.js +4 -4
- package/dist/esm/modules/jwt/index.js +3 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/modules/jwt/index.d.ts +1 -0
- package/dist/types/modules/jwt/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +1 -0
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/cjs/cli.cjs
CHANGED
|
@@ -87,14 +87,16 @@ switch (command) {
|
|
|
87
87
|
runCommand("node dist/index.js", { NODE_ENV: "production" });
|
|
88
88
|
break;
|
|
89
89
|
case "generate-keys":
|
|
90
|
-
const { publicKey, privateKey } = crypto__namespace.generateKeyPairSync("
|
|
91
|
-
|
|
90
|
+
const { publicKey, privateKey } = crypto__namespace.generateKeyPairSync("rsa", {
|
|
91
|
+
modulusLength: 4096,
|
|
92
92
|
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
93
93
|
privateKeyEncoding: { type: "pkcs8", format: "pem" }
|
|
94
94
|
});
|
|
95
|
+
const jwtSecret = crypto__namespace.randomBytes(32).toString("hex");
|
|
95
96
|
console.log("\nš Generating JWT keys...\n");
|
|
96
97
|
console.log("JWT_PUBLIC_KEY='" + publicKey + "'");
|
|
97
98
|
console.log("\nJWT_PRIVATE_KEY='" + privateKey + "'");
|
|
99
|
+
console.log("\nJWT_ENCRYPTION_SECRET=" + jwtSecret);
|
|
98
100
|
console.log("\nš Add these to your .env file (use single quotes for multiline values):\n");
|
|
99
101
|
process.exit(0);
|
|
100
102
|
break;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -184,7 +184,7 @@ class Sprint {
|
|
|
184
184
|
name,
|
|
185
185
|
filePath
|
|
186
186
|
});
|
|
187
|
-
console.log(`[Sprint] Loaded middleware: ${name} (priority: ${config.priority ?? 100})`);
|
|
187
|
+
if (isVerbose) console.log(`[Sprint] Loaded middleware: ${name} (priority: ${config.priority ?? 100})`);
|
|
188
188
|
}
|
|
189
189
|
} catch (err) {
|
|
190
190
|
console.warn(`[Sprint] Failed to load middleware ${filePath}:`, err);
|
|
@@ -226,10 +226,10 @@ class Sprint {
|
|
|
226
226
|
const routeMiddlewares = this.getMiddlewaresForRoute(routePath);
|
|
227
227
|
if (routeMiddlewares.length > 0) {
|
|
228
228
|
this.app.use(finalRoute, ...routeMiddlewares, router);
|
|
229
|
-
console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath} (with ${routeMiddlewares.length} middleware(s))`);
|
|
229
|
+
if (isVerbose) console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath} (with ${routeMiddlewares.length} middleware(s))`);
|
|
230
230
|
} else {
|
|
231
231
|
this.app.use(finalRoute, router);
|
|
232
|
-
console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath}`);
|
|
232
|
+
if (isVerbose) console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath}`);
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
} catch (err) {
|
|
@@ -249,7 +249,7 @@ class Sprint {
|
|
|
249
249
|
try {
|
|
250
250
|
const moduleUrl = url.pathToFileURL(filePath).href;
|
|
251
251
|
await import(moduleUrl);
|
|
252
|
-
console.log(`[Sprint] Loaded cronjob: ${file.replace(/\.(ts|js)$/, "")}`);
|
|
252
|
+
if (isVerbose) console.log(`[Sprint] Loaded cronjob: ${file.replace(/\.(ts|js)$/, "")}`);
|
|
253
253
|
} catch (err) {
|
|
254
254
|
console.warn(`[Sprint] Failed to load cronjob ${filePath}:`, err);
|
|
255
255
|
}
|
|
@@ -115,9 +115,10 @@ function verifyTokenPair(accessToken, refreshToken, publicKey) {
|
|
|
115
115
|
function getJwtFromEnv() {
|
|
116
116
|
let publicKey = process.env.JWT_PUBLIC_KEY;
|
|
117
117
|
let privateKey = process.env.JWT_PRIVATE_KEY;
|
|
118
|
-
|
|
118
|
+
let encryptionSecret = process.env.JWT_ENCRYPTION_SECRET;
|
|
119
|
+
if (!publicKey || !privateKey || !encryptionSecret) throw new Error("JWT keys not configured. Run 'npm run generate:keys' and add the keys to your .env file.");
|
|
119
120
|
const normalize = (k) => k.replace(/^['"]|['"]$/g, "").replace(/\\n/g, "\n");
|
|
120
|
-
return { publicKey: normalize(publicKey), privateKey: normalize(privateKey) };
|
|
121
|
+
return { publicKey: normalize(publicKey), privateKey: normalize(privateKey), encryptionSecret };
|
|
121
122
|
}
|
|
122
123
|
exports.createTokenPair = createTokenPair;
|
|
123
124
|
exports.generateKeyPair = generateKeyPair;
|
package/dist/esm/cli.js
CHANGED
|
@@ -69,14 +69,16 @@ switch (command) {
|
|
|
69
69
|
runCommand("node dist/index.js", { NODE_ENV: "production" });
|
|
70
70
|
break;
|
|
71
71
|
case "generate-keys":
|
|
72
|
-
const { publicKey, privateKey } = crypto.generateKeyPairSync("
|
|
73
|
-
|
|
72
|
+
const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
|
|
73
|
+
modulusLength: 4096,
|
|
74
74
|
publicKeyEncoding: { type: "spki", format: "pem" },
|
|
75
75
|
privateKeyEncoding: { type: "pkcs8", format: "pem" }
|
|
76
76
|
});
|
|
77
|
+
const jwtSecret = crypto.randomBytes(32).toString("hex");
|
|
77
78
|
console.log("\nš Generating JWT keys...\n");
|
|
78
79
|
console.log("JWT_PUBLIC_KEY='" + publicKey + "'");
|
|
79
80
|
console.log("\nJWT_PRIVATE_KEY='" + privateKey + "'");
|
|
81
|
+
console.log("\nJWT_ENCRYPTION_SECRET=" + jwtSecret);
|
|
80
82
|
console.log("\nš Add these to your .env file (use single quotes for multiline values):\n");
|
|
81
83
|
process.exit(0);
|
|
82
84
|
break;
|
package/dist/esm/index.js
CHANGED
|
@@ -181,7 +181,7 @@ class Sprint {
|
|
|
181
181
|
name,
|
|
182
182
|
filePath
|
|
183
183
|
});
|
|
184
|
-
console.log(`[Sprint] Loaded middleware: ${name} (priority: ${config.priority ?? 100})`);
|
|
184
|
+
if (isVerbose) console.log(`[Sprint] Loaded middleware: ${name} (priority: ${config.priority ?? 100})`);
|
|
185
185
|
}
|
|
186
186
|
} catch (err) {
|
|
187
187
|
console.warn(`[Sprint] Failed to load middleware ${filePath}:`, err);
|
|
@@ -223,10 +223,10 @@ class Sprint {
|
|
|
223
223
|
const routeMiddlewares = this.getMiddlewaresForRoute(routePath);
|
|
224
224
|
if (routeMiddlewares.length > 0) {
|
|
225
225
|
this.app.use(finalRoute, ...routeMiddlewares, router);
|
|
226
|
-
console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath} (with ${routeMiddlewares.length} middleware(s))`);
|
|
226
|
+
if (isVerbose) console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath} (with ${routeMiddlewares.length} middleware(s))`);
|
|
227
227
|
} else {
|
|
228
228
|
this.app.use(finalRoute, router);
|
|
229
|
-
console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath}`);
|
|
229
|
+
if (isVerbose) console.log(`[Sprint] Loaded route: ${finalRoute} -> ${filePath}`);
|
|
230
230
|
}
|
|
231
231
|
}
|
|
232
232
|
} catch (err) {
|
|
@@ -246,7 +246,7 @@ class Sprint {
|
|
|
246
246
|
try {
|
|
247
247
|
const moduleUrl = pathToFileURL(filePath).href;
|
|
248
248
|
await import(moduleUrl);
|
|
249
|
-
console.log(`[Sprint] Loaded cronjob: ${file.replace(/\.(ts|js)$/, "")}`);
|
|
249
|
+
if (isVerbose) console.log(`[Sprint] Loaded cronjob: ${file.replace(/\.(ts|js)$/, "")}`);
|
|
250
250
|
} catch (err) {
|
|
251
251
|
console.warn(`[Sprint] Failed to load cronjob ${filePath}:`, err);
|
|
252
252
|
}
|
|
@@ -113,9 +113,10 @@ function verifyTokenPair(accessToken, refreshToken, publicKey) {
|
|
|
113
113
|
function getJwtFromEnv() {
|
|
114
114
|
let publicKey = process.env.JWT_PUBLIC_KEY;
|
|
115
115
|
let privateKey = process.env.JWT_PRIVATE_KEY;
|
|
116
|
-
|
|
116
|
+
let encryptionSecret = process.env.JWT_ENCRYPTION_SECRET;
|
|
117
|
+
if (!publicKey || !privateKey || !encryptionSecret) throw new Error("JWT keys not configured. Run 'npm run generate:keys' and add the keys to your .env file.");
|
|
117
118
|
const normalize = (k) => k.replace(/^['"]|['"]$/g, "").replace(/\\n/g, "\n");
|
|
118
|
-
return { publicKey: normalize(publicKey), privateKey: normalize(privateKey) };
|
|
119
|
+
return { publicKey: normalize(publicKey), privateKey: normalize(privateKey), encryptionSecret };
|
|
119
120
|
}
|
|
120
121
|
export {
|
|
121
122
|
createTokenPair,
|
package/dist/types/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Sprint } from './sprint';
|
|
|
2
2
|
export { Sprint, isDevelopment, isProduction } from './sprint';
|
|
3
3
|
export { defineMiddleware } from './middleware';
|
|
4
4
|
export { __filename, __dirname } from './utils';
|
|
5
|
-
export type { Handler, AsyncRequestHandler, MiddlewareConfig, SprintOptions, LoadedMiddleware, AuthorizationSource, SprintRequest } from './types';
|
|
5
|
+
export type { Handler, AsyncRequestHandler, MiddlewareConfig, SprintOptions, LoadedMiddleware, AuthorizationSource, SprintRequest, SprintResponse } from './types';
|
|
6
6
|
export declare const Router: () => import('express-serve-static-core').Router;
|
|
7
7
|
export default Sprint;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGhD,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGnK,eAAO,MAAM,MAAM,kDAAwB,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,eAAe,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/jwt/index.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAwDD,wBAAgB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAa9F;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAoB1E;AAMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAGjI;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU7G;AAID,wBAAgB,eAAe,CAC3B,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,GACzB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAQ/C;AAED,wBAAgB,eAAe,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAClB;IAAE,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAKrE;AAID,wBAAgB,aAAa,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/modules/jwt/index.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,eAAe,IAAI,OAAO,CAOzC;AAwDD,wBAAgB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAa9F;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAoB1E;AAMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,MAAM,CAGjI;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAU7G;AAID,wBAAgB,eAAe,CAC3B,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,UAAe,GACzB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAQ/C;AAED,wBAAgB,eAAe,CAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAClB;IAAE,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,CAKrE;AAID,wBAAgB,aAAa,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CASnG"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type AuthorizationSource = `query:${string}` | `headers:${string}`;
|
|
|
5
5
|
export interface SprintRequest {
|
|
6
6
|
getAuthorization: (sources?: AuthorizationSource | AuthorizationSource[]) => string | undefined;
|
|
7
7
|
}
|
|
8
|
+
export type SprintResponse = Response;
|
|
8
9
|
declare global {
|
|
9
10
|
namespace Express {
|
|
10
11
|
interface Request {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEpG,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,GAAG,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GACzB,SAAS,MAAM,EAAE,GACjB,WAAW,MAAM,EAAE,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC1B,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,KAAK,MAAM,GAAG,SAAS,CAAC;CACnG;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,OAAO,CAAC;QACd,UAAU,OAAO;YACb,MAAM,EAAE,aAAa,CAAC;SACzB;KACJ;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,oFAAoF;IACpF,OAAO,EAAE,cAAc,GAAG,mBAAmB,GAAG,CAAC,cAAc,GAAG,mBAAmB,CAAC,EAAE,CAAC;IACzF;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEpG,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,GAAG,CAAC;AAE/E,MAAM,MAAM,mBAAmB,GACzB,SAAS,MAAM,EAAE,GACjB,WAAW,MAAM,EAAE,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC1B,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE,KAAK,MAAM,GAAG,SAAS,CAAC;CACnG;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEtC,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,OAAO,CAAC;QACd,UAAU,OAAO;YACb,MAAM,EAAE,aAAa,CAAC;SACzB;KACJ;CACJ;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC7B,oFAAoF;IACpF,OAAO,EAAE,cAAc,GAAG,mBAAmB,GAAG,CAAC,cAAc,GAAG,mBAAmB,CAAC,EAAE,CAAC;IACzF;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB"}
|