@goatlab/node-backend 1.1.11 → 1.1.13
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/Cache.d.ts +24 -4
- package/dist/Cache.js +47 -8
- package/dist/Cache.js.map +1 -1
- package/dist/cache/LazyRedisStore.d.ts +56 -0
- package/dist/cache/LazyRedisStore.js +140 -0
- package/dist/cache/LazyRedisStore.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/Cache.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
import { type Milliseconds } from '@goatlab/js-utils';
|
|
2
2
|
import type { Options } from 'keyv';
|
|
3
3
|
declare const Keyv: any;
|
|
4
|
+
export interface CacheOptions<T> extends Options<T> {
|
|
5
|
+
usesLRUMemory?: boolean;
|
|
6
|
+
tenantId?: string;
|
|
7
|
+
/**
|
|
8
|
+
* When true (default), Redis connection is deferred until first use.
|
|
9
|
+
* This prevents connection exhaustion during Cloud Run/serverless deployments
|
|
10
|
+
* where old and new containers may briefly run simultaneously.
|
|
11
|
+
*
|
|
12
|
+
* Set to false for eager connection (fail-fast behavior).
|
|
13
|
+
*
|
|
14
|
+
* @default true
|
|
15
|
+
*/
|
|
16
|
+
lazy?: boolean;
|
|
17
|
+
}
|
|
4
18
|
export declare class Cache<T extends object = any> extends Keyv<T> {
|
|
5
19
|
private ns;
|
|
6
20
|
private _tenantId?;
|
|
@@ -9,14 +23,20 @@ export declare class Cache<T extends object = any> extends Keyv<T> {
|
|
|
9
23
|
private memoryCache;
|
|
10
24
|
private connectionString?;
|
|
11
25
|
private connectionPool;
|
|
26
|
+
private lazyStore?;
|
|
12
27
|
constructor({ connection, opts }: {
|
|
13
28
|
connection: string | undefined;
|
|
14
|
-
opts?:
|
|
15
|
-
usesLRUMemory?: boolean;
|
|
16
|
-
tenantId?: string;
|
|
17
|
-
};
|
|
29
|
+
opts?: CacheOptions<T>;
|
|
18
30
|
});
|
|
19
31
|
get tenantId(): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Check if the cache is using lazy initialization
|
|
34
|
+
*/
|
|
35
|
+
isLazy(): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check if the Redis connection is established (for lazy mode)
|
|
38
|
+
*/
|
|
39
|
+
isConnected(): boolean;
|
|
20
40
|
private isValidResult;
|
|
21
41
|
private isNotNullish;
|
|
22
42
|
private isNotEmptyString;
|
package/dist/Cache.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.Cache = void 0;
|
|
|
4
4
|
const js_utils_1 = require("@goatlab/js-utils");
|
|
5
5
|
const Keyv = require('keyv');
|
|
6
6
|
const KeyvLrus_1 = require("./cache/KeyvLrus");
|
|
7
|
+
const LazyRedisStore_1 = require("./cache/LazyRedisStore");
|
|
7
8
|
const RedisConnectionPool_1 = require("./cache/RedisConnectionPool");
|
|
8
9
|
class Cache extends Keyv {
|
|
9
10
|
ns;
|
|
@@ -13,9 +14,11 @@ class Cache extends Keyv {
|
|
|
13
14
|
memoryCache;
|
|
14
15
|
connectionString;
|
|
15
16
|
connectionPool;
|
|
17
|
+
lazyStore;
|
|
16
18
|
constructor({ connection, opts }) {
|
|
17
19
|
const tenantId = opts?.tenantId;
|
|
18
20
|
const namespace = opts?.namespace || '';
|
|
21
|
+
const lazy = opts?.lazy !== false; // Default to true
|
|
19
22
|
// Build the full namespace including tenant ID if provided
|
|
20
23
|
// Format: "tenantId:namespace" or "tenantId" or "namespace" or ""
|
|
21
24
|
const fullNamespace = tenantId && namespace
|
|
@@ -23,19 +26,36 @@ class Cache extends Keyv {
|
|
|
23
26
|
: tenantId || namespace || '';
|
|
24
27
|
// Get connection pool instance
|
|
25
28
|
const pool = RedisConnectionPool_1.RedisConnectionPool.getInstance();
|
|
29
|
+
// Determine which store to use
|
|
30
|
+
let store;
|
|
31
|
+
let lazyStore;
|
|
32
|
+
if (connection) {
|
|
33
|
+
if (lazy) {
|
|
34
|
+
// Lazy mode: use LazyRedisStore that defers connection
|
|
35
|
+
lazyStore = new LazyRedisStore_1.LazyRedisStore(connection);
|
|
36
|
+
store = lazyStore;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Eager mode: connect immediately via pool
|
|
40
|
+
store = pool.getConnection(connection);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// No connection string: use in-memory LRU
|
|
45
|
+
store = new KeyvLrus_1.KeyvLru({
|
|
46
|
+
max: 1000,
|
|
47
|
+
resetTtl: false,
|
|
48
|
+
ttl: 0
|
|
49
|
+
});
|
|
50
|
+
}
|
|
26
51
|
super({
|
|
27
|
-
store
|
|
28
|
-
? pool.getConnection(connection)
|
|
29
|
-
: new KeyvLrus_1.KeyvLru({
|
|
30
|
-
max: 1000,
|
|
31
|
-
resetTtl: false,
|
|
32
|
-
ttl: 0
|
|
33
|
-
}),
|
|
52
|
+
store,
|
|
34
53
|
...opts,
|
|
35
54
|
namespace: fullNamespace
|
|
36
55
|
});
|
|
37
56
|
this.connectionString = connection;
|
|
38
57
|
this.connectionPool = pool;
|
|
58
|
+
this.lazyStore = lazyStore;
|
|
39
59
|
this.keyvLru = new KeyvLrus_1.KeyvLru({
|
|
40
60
|
max: 1000,
|
|
41
61
|
resetTtl: false,
|
|
@@ -52,6 +72,22 @@ class Cache extends Keyv {
|
|
|
52
72
|
get tenantId() {
|
|
53
73
|
return this._tenantId;
|
|
54
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if the cache is using lazy initialization
|
|
77
|
+
*/
|
|
78
|
+
isLazy() {
|
|
79
|
+
return this.lazyStore !== undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if the Redis connection is established (for lazy mode)
|
|
83
|
+
*/
|
|
84
|
+
isConnected() {
|
|
85
|
+
if (this.lazyStore) {
|
|
86
|
+
return this.lazyStore.isConnected();
|
|
87
|
+
}
|
|
88
|
+
// For eager mode or in-memory, always "connected"
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
55
91
|
isValidResult(result) {
|
|
56
92
|
return (this.isNotNullish(result) &&
|
|
57
93
|
this.isNotEmptyString(result) &&
|
|
@@ -252,7 +288,10 @@ class Cache extends Keyv {
|
|
|
252
288
|
* Use this when you're certain no other instances need this connection.
|
|
253
289
|
*/
|
|
254
290
|
async disconnect() {
|
|
255
|
-
if (this.
|
|
291
|
+
if (this.lazyStore) {
|
|
292
|
+
await this.lazyStore.disconnect();
|
|
293
|
+
}
|
|
294
|
+
else if (this.connectionString) {
|
|
256
295
|
await this.connectionPool.disconnect(this.connectionString);
|
|
257
296
|
}
|
|
258
297
|
}
|
package/dist/Cache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../src/Cache.ts"],"names":[],"mappings":";;;AAAA,gDAA+D;AAG/D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAE5B,+CAA0C;AAC1C,qEAAiE;
|
|
1
|
+
{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../src/Cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A lazy-loading Redis store for Keyv.
|
|
3
|
+
* Defers Redis connection until the first operation is performed.
|
|
4
|
+
* This prevents connection exhaustion during Cloud Run/serverless deployments
|
|
5
|
+
* where old and new containers may briefly run simultaneously.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const store = new LazyRedisStore('redis://localhost:6379')
|
|
10
|
+
* // No connection yet!
|
|
11
|
+
*
|
|
12
|
+
* await store.get('key') // Connection established on first use
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare class LazyRedisStore {
|
|
16
|
+
private connectionString;
|
|
17
|
+
private pool;
|
|
18
|
+
private _store;
|
|
19
|
+
private _connecting;
|
|
20
|
+
constructor(connectionString: string);
|
|
21
|
+
/**
|
|
22
|
+
* Get the underlying KeyvRedis store, creating connection if needed.
|
|
23
|
+
* Uses a promise to ensure only one connection attempt happens even
|
|
24
|
+
* if multiple operations are called simultaneously.
|
|
25
|
+
*/
|
|
26
|
+
private getStore;
|
|
27
|
+
/**
|
|
28
|
+
* Get the store synchronously if already connected.
|
|
29
|
+
* Returns undefined if not yet connected.
|
|
30
|
+
*/
|
|
31
|
+
private getStoreSync;
|
|
32
|
+
get(key: string): Promise<any>;
|
|
33
|
+
getMany(keys: string[]): Promise<any[]>;
|
|
34
|
+
set(key: string, value: any, ttl?: number): Promise<any>;
|
|
35
|
+
delete(key: string): Promise<boolean>;
|
|
36
|
+
deleteMany(keys: string[]): Promise<boolean>;
|
|
37
|
+
clear(): Promise<void>;
|
|
38
|
+
has(key: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Iterator for Keyv - returns an async iterable iterator.
|
|
41
|
+
* This method is defined to tell Keyv that iteration is supported.
|
|
42
|
+
*/
|
|
43
|
+
iterator(namespace?: string): AsyncGenerator<[string, any]>;
|
|
44
|
+
/**
|
|
45
|
+
* Check if the store is connected
|
|
46
|
+
*/
|
|
47
|
+
isConnected(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Get the connection string (for pool management)
|
|
50
|
+
*/
|
|
51
|
+
getConnectionString(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Disconnect the underlying store
|
|
54
|
+
*/
|
|
55
|
+
disconnect(): Promise<void>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LazyRedisStore = void 0;
|
|
4
|
+
const RedisConnectionPool_1 = require("./RedisConnectionPool");
|
|
5
|
+
/**
|
|
6
|
+
* A lazy-loading Redis store for Keyv.
|
|
7
|
+
* Defers Redis connection until the first operation is performed.
|
|
8
|
+
* This prevents connection exhaustion during Cloud Run/serverless deployments
|
|
9
|
+
* where old and new containers may briefly run simultaneously.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const store = new LazyRedisStore('redis://localhost:6379')
|
|
14
|
+
* // No connection yet!
|
|
15
|
+
*
|
|
16
|
+
* await store.get('key') // Connection established on first use
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
class LazyRedisStore {
|
|
20
|
+
connectionString;
|
|
21
|
+
pool;
|
|
22
|
+
_store;
|
|
23
|
+
_connecting;
|
|
24
|
+
constructor(connectionString) {
|
|
25
|
+
this.connectionString = connectionString;
|
|
26
|
+
this.pool = RedisConnectionPool_1.RedisConnectionPool.getInstance();
|
|
27
|
+
// Bind the iterator to this instance for Keyv compatibility
|
|
28
|
+
this.iterator = this.iterator.bind(this);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the underlying KeyvRedis store, creating connection if needed.
|
|
32
|
+
* Uses a promise to ensure only one connection attempt happens even
|
|
33
|
+
* if multiple operations are called simultaneously.
|
|
34
|
+
*/
|
|
35
|
+
async getStore() {
|
|
36
|
+
if (this._store) {
|
|
37
|
+
return this._store;
|
|
38
|
+
}
|
|
39
|
+
// If already connecting, wait for that to complete
|
|
40
|
+
if (this._connecting) {
|
|
41
|
+
return this._connecting;
|
|
42
|
+
}
|
|
43
|
+
// Start connection
|
|
44
|
+
this._connecting = new Promise((resolve, reject) => {
|
|
45
|
+
try {
|
|
46
|
+
this._store = this.pool.getConnection(this.connectionString);
|
|
47
|
+
resolve(this._store);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
this._connecting = undefined;
|
|
51
|
+
reject(error);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return this._connecting;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the store synchronously if already connected.
|
|
58
|
+
* Returns undefined if not yet connected.
|
|
59
|
+
*/
|
|
60
|
+
getStoreSync() {
|
|
61
|
+
return this._store;
|
|
62
|
+
}
|
|
63
|
+
// Keyv store interface methods - all lazily connect
|
|
64
|
+
async get(key) {
|
|
65
|
+
const store = await this.getStore();
|
|
66
|
+
return store.get(key);
|
|
67
|
+
}
|
|
68
|
+
async getMany(keys) {
|
|
69
|
+
const store = await this.getStore();
|
|
70
|
+
if (typeof store.getMany === 'function') {
|
|
71
|
+
return store.getMany(keys);
|
|
72
|
+
}
|
|
73
|
+
// Fallback if getMany not supported
|
|
74
|
+
return Promise.all(keys.map(k => store.get(k)));
|
|
75
|
+
}
|
|
76
|
+
async set(key, value, ttl) {
|
|
77
|
+
const store = await this.getStore();
|
|
78
|
+
return store.set(key, value, ttl);
|
|
79
|
+
}
|
|
80
|
+
async delete(key) {
|
|
81
|
+
const store = await this.getStore();
|
|
82
|
+
return store.delete(key);
|
|
83
|
+
}
|
|
84
|
+
async deleteMany(keys) {
|
|
85
|
+
const store = await this.getStore();
|
|
86
|
+
if (typeof store.deleteMany === 'function') {
|
|
87
|
+
return store.deleteMany(keys);
|
|
88
|
+
}
|
|
89
|
+
// Fallback
|
|
90
|
+
await Promise.all(keys.map(k => store.delete(k)));
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
async clear() {
|
|
94
|
+
const store = await this.getStore();
|
|
95
|
+
return store.clear();
|
|
96
|
+
}
|
|
97
|
+
async has(key) {
|
|
98
|
+
const store = await this.getStore();
|
|
99
|
+
if (typeof store.has === 'function') {
|
|
100
|
+
return store.has(key);
|
|
101
|
+
}
|
|
102
|
+
// Fallback
|
|
103
|
+
const value = await store.get(key);
|
|
104
|
+
return value !== undefined;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Iterator for Keyv - returns an async iterable iterator.
|
|
108
|
+
* This method is defined to tell Keyv that iteration is supported.
|
|
109
|
+
*/
|
|
110
|
+
async *iterator(namespace) {
|
|
111
|
+
const store = await this.getStore();
|
|
112
|
+
if (store.iterator) {
|
|
113
|
+
yield* store.iterator(namespace);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if the store is connected
|
|
118
|
+
*/
|
|
119
|
+
isConnected() {
|
|
120
|
+
return this._store !== undefined;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get the connection string (for pool management)
|
|
124
|
+
*/
|
|
125
|
+
getConnectionString() {
|
|
126
|
+
return this.connectionString;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Disconnect the underlying store
|
|
130
|
+
*/
|
|
131
|
+
async disconnect() {
|
|
132
|
+
if (this._store) {
|
|
133
|
+
await this.pool.disconnect(this.connectionString);
|
|
134
|
+
this._store = undefined;
|
|
135
|
+
this._connecting = undefined;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.LazyRedisStore = LazyRedisStore;
|
|
140
|
+
//# sourceMappingURL=LazyRedisStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LazyRedisStore.js","sourceRoot":"","sources":["../../src/cache/LazyRedisStore.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Options } from 'keyv';
|
|
2
|
-
import { Cache } from './Cache';
|
|
2
|
+
import { Cache, type CacheOptions } from './Cache';
|
|
3
|
+
import { LazyRedisStore } from './cache/LazyRedisStore';
|
|
3
4
|
import { RedisConnectionPool } from './cache/RedisConnectionPool';
|
|
4
|
-
export { Cache, RedisConnectionPool };
|
|
5
|
-
export type { Options };
|
|
5
|
+
export { Cache, LazyRedisStore, RedisConnectionPool };
|
|
6
|
+
export type { CacheOptions, Options };
|
|
6
7
|
export type * from '@trpc/server';
|
|
7
8
|
export { TRPCError } from '@trpc/server';
|
|
8
9
|
export type * from '@trpc/server/unstable-core-do-not-import';
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.zodCompat = exports.getTrpc = exports.mockedAuthenticatedTrpcRouter = exports.UrlService = exports.paginationUtility = exports.translationService = exports.tr = exports.SendgridService = exports.SecretService = exports.getGcpServiceAccountFromBase64 = exports.EmailService = exports.Layout = exports.EmailCategory = exports.Content = exports.SentryService = exports.getSentry = exports.getLogger = exports.handleRequest = exports.useCloudTaskDecryptMiddleware = exports.requestContext = exports.config = exports.getExpressTrpcApp = exports.getDefaultConfig = exports.createServiceCache = exports.getDistributedCacheInvalidator = exports.DistributedCacheInvalidator = exports.Container = exports.TRPCError = exports.RedisConnectionPool = exports.Cache = void 0;
|
|
3
|
+
exports.zodCompat = exports.getTrpc = exports.mockedAuthenticatedTrpcRouter = exports.UrlService = exports.paginationUtility = exports.translationService = exports.tr = exports.SendgridService = exports.SecretService = exports.getGcpServiceAccountFromBase64 = exports.EmailService = exports.Layout = exports.EmailCategory = exports.Content = exports.SentryService = exports.getSentry = exports.getLogger = exports.handleRequest = exports.useCloudTaskDecryptMiddleware = exports.requestContext = exports.config = exports.getExpressTrpcApp = exports.getDefaultConfig = exports.createServiceCache = exports.getDistributedCacheInvalidator = exports.DistributedCacheInvalidator = exports.Container = exports.TRPCError = exports.RedisConnectionPool = exports.LazyRedisStore = exports.Cache = void 0;
|
|
4
4
|
const Cache_1 = require("./Cache");
|
|
5
5
|
Object.defineProperty(exports, "Cache", { enumerable: true, get: function () { return Cache_1.Cache; } });
|
|
6
|
+
const LazyRedisStore_1 = require("./cache/LazyRedisStore");
|
|
7
|
+
Object.defineProperty(exports, "LazyRedisStore", { enumerable: true, get: function () { return LazyRedisStore_1.LazyRedisStore; } });
|
|
6
8
|
const RedisConnectionPool_1 = require("./cache/RedisConnectionPool");
|
|
7
9
|
Object.defineProperty(exports, "RedisConnectionPool", { enumerable: true, get: function () { return RedisConnectionPool_1.RedisConnectionPool; } });
|
|
8
10
|
var server_1 = require("@trpc/server");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,mCAAkD;AAIzC,sFAJA,aAAK,OAIA;AAHd,2DAAuD;AAGvC,+FAHP,+BAAc,OAGO;AAF9B,qEAAiE;AAEjC,oGAFvB,yCAAmB,OAEuB;AAInD,uCAAwC;AAA/B,mGAAA,SAAS,OAAA;AAElB,wBAAwB;AACxB,mBAAmB;AACnB,wBAAwB;AACxB,mDAAiD;AAAxC,sGAAA,SAAS,OAAA;AAClB,uFAGgD;AAF9C,0IAAA,2BAA2B,OAAA;AAC3B,6IAAA,8BAA8B,OAAA;AAEhC,iDAAyD;AAAhD,8GAAA,kBAAkB,OAAA;AAe3B,iFAA2E;AAAlE,wHAAA,gBAAgB,OAAA;AACzB,sBAAsB;AACtB,2EAAyE;AAAhE,sHAAA,iBAAiB,OAAA;AAE1B,0CAAwC;AAA/B,gGAAA,MAAM,OAAA;AAEf,oEAAiE;AAAxD,iHAAA,cAAc,OAAA;AACvB,+FAA+F;AAAtF,4IAAA,6BAA6B,OAAA;AACtC,yFAA4E;AAAnE,yHAAA,aAAa,OAAA;AACtB,4EAAqE;AAA5D,2GAAA,SAAS,OAAA;AAClB,uDAAqD;AAA5C,sGAAA,SAAS,OAAA;AAClB,iEAA8D;AAArD,+GAAA,aAAa,OAAA;AAMtB,mEAI4C;AAH1C,sGAAA,OAAO,OAAA;AACP,4GAAA,aAAa,OAAA;AACb,qGAAA,MAAM,OAAA;AAER,uEAAoE;AAA3D,6GAAA,YAAY,OAAA;AACrB,uGAAqG;AAA5F,gJAAA,8BAA8B,OAAA;AAKvC,2EAAwE;AAA/D,+GAAA,aAAa,OAAA;AAEtB,sFAAgF;AAAvE,sHAAA,eAAe,OAAA;AACxB,0FAG2D;AAFzD,yGAAA,EAAE,OAAA;AACF,yHAAA,kBAAkB,OAAA;AAEpB,gEAAqE;AAA5D,+GAAA,iBAAiB,OAAA;AAC1B,kEAA+D;AAAtD,yGAAA,UAAU,OAAA;AACnB,qDAAuE;AAA9D,0HAAA,6BAA6B,OAAA;AACtC,sCAAuC;AAA9B,+FAAA,OAAO,OAAA;AAGhB,wBAAwB;AACxB,oBAAoB;AACpB,wBAAwB;AACxB,mDAAgD"}
|