effect-cloudflare-r2-layer 1.0.10 → 1.0.11
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +10 -3
- package/cjs/layer/file-storage.layer.js.map +1 -1
- package/cjs/r2/implementations/bucket-infos.effect.js.map +1 -1
- package/dts/cjs/index.d.ts +2 -2
- package/dts/cjs/layer/file-storage.layer.d.ts +4 -4
- package/dts/cjs/r2/implementations/bucket-infos.effect.d.ts +5 -2
- package/dts/esm/index.d.ts +2 -2
- package/dts/esm/layer/file-storage.layer.d.ts +4 -4
- package/dts/esm/r2/implementations/bucket-infos.effect.d.ts +5 -2
- package/esm/layer/file-storage.layer.js.map +1 -1
- package/esm/r2/implementations/bucket-infos.effect.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
@@ -112,12 +112,17 @@ const task = pipe(
|
|
112
112
|
### 🔶 `bucketInfos`
|
113
113
|
|
114
114
|
```typescript
|
115
|
+
type BucketInfosInput<TBucket extends string> = {
|
116
|
+
Bucket: TBucket;
|
117
|
+
ExpectedBucketOwner?: string;
|
118
|
+
};
|
119
|
+
|
115
120
|
type BucketInfosResult = {
|
116
121
|
region?: string;
|
117
122
|
};
|
118
123
|
|
119
|
-
type bucketInfos = (
|
120
|
-
input:
|
124
|
+
type bucketInfos = <TBucket extends string>(
|
125
|
+
input: BucketInfosInput<TBucket>
|
121
126
|
) => Effect.Effect<
|
122
127
|
BucketInfosResult,
|
123
128
|
ConfigError | FileStorageError | BucketNotFoundError,
|
@@ -134,9 +139,11 @@ import {
|
|
134
139
|
FileStorageLayer,
|
135
140
|
} from 'effect-cloudflare-r2-layer';
|
136
141
|
|
142
|
+
type Buckets = 'assets' | 'config';
|
143
|
+
|
137
144
|
const task = pipe(
|
138
145
|
Effect.gen(function* () {
|
139
|
-
const result = yield* FileStorageLayer.bucketInfos({
|
146
|
+
const result = yield* FileStorageLayer.bucketInfos<Buckets>({
|
140
147
|
Bucket: 'assets',
|
141
148
|
});
|
142
149
|
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"file-storage.layer.js","sourceRoot":"","sources":["../../../src/layer/file-storage.layer.ts"],"names":[],"mappings":";;;AAEA,mCAAiC;
|
1
|
+
{"version":3,"file":"file-storage.layer.js","sourceRoot":"","sources":["../../../src/layer/file-storage.layer.ts"],"names":[],"mappings":";;;AAEA,mCAAiC;AAUjC,uCAAoC;AAkEvB,QAAA,uBAAuB,GAClC,gBAAO,CAAC,UAAU,CAAc,cAAc,CAAC,CAAC;AAErC,QAAA,gBAAgB,GAAG;IAC9B,YAAY,EAAE,CAAC,KAA+B,EAAE,EAAE,CAChD,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrD,YAAY,CAAC,KAAK,CAAC,CACpB;IACH,WAAW,EAAE,CAAyB,KAAgC,EAAE,EAAE,CACxE,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAyB,MAAe,EAAE,QAAgB,EAAE,EAAE,CACxE,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC7B;IACH,eAAe,EAAE,CACf,MAAe,EACf,QAAgB,EAChB,EAAE,CACF,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CACxD,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAClC;IACH,UAAU,EAAE,CACV,MAAe,EACf,QAAgB,EAChB,EAAE,CACF,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAkB,MAAM,EAAE,QAAQ,CAAC,CAC9C;IACH,UAAU,EAAE,CAAyB,MAAe,EAAE,QAAgB,EAAE,EAAE,CACxE,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC7B;IACH,UAAU,EAAE,CAAyB,KAA+B,EAAE,EAAE,CACtE,IAAA,mBAAQ,EAAC,+BAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;CAC3E,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"bucket-infos.effect.js","sourceRoot":"","sources":["../../../../src/r2/implementations/bucket-infos.effect.ts"],"names":[],"mappings":";;;AAAA,
|
1
|
+
{"version":3,"file":"bucket-infos.effect.js","sourceRoot":"","sources":["../../../../src/r2/implementations/bucket-infos.effect.ts"],"names":[],"mappings":";;;AAAA,kDAAuD;AACvD,mCAAsC;AAEtC,qCAAgE;AAChE,yCAAwD;AAIxD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAoC,EAAE;IACnE,OAAQ,KAAuB,EAAE,IAAI,KAAK,SAAS,CAAC;AACtD,CAAC,CAAC;AAWK,MAAM,WAAW,GAAG,CACzB,KAAgC,EAChC,EAAE,CACF,eAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAC3D,IAAA,aAAI,EACF,uCAA2B,EAC3B,eAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,eAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,6BAAiB,CAAC,KAAK,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,IAAI,6BAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,0BAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CACH,EACD,eAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,QAAQ,CAAC,YAAY;CAC9B,CAAC,CAAC,CACJ,CACF,CAAC;AAtBS,QAAA,WAAW,eAsBpB"}
|
package/dts/cjs/index.d.ts
CHANGED
@@ -3,5 +3,5 @@ import { FileStorageLayer } from './layer/file-storage.layer.js';
|
|
3
3
|
export { FileStorageLayer };
|
4
4
|
export type { FileStorage };
|
5
5
|
export * from './r2/r2-file-storage.layer.js';
|
6
|
-
export type { PutObjectCommandOutput, CreateBucketCommandInput, CreateBucketCommandOutput,
|
7
|
-
export type { BucketInfosResult } from './r2/implementations/bucket-infos.effect.js';
|
6
|
+
export type { PutObjectCommandOutput, CreateBucketCommandInput, CreateBucketCommandOutput, } from '@aws-sdk/client-s3';
|
7
|
+
export type { BucketInfosInput, BucketInfosResult, } from './r2/implementations/bucket-infos.effect.js';
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import { HttpClientError } from '@effect/platform/HttpClientError';
|
2
2
|
import type { ConfigError, Effect } from 'effect';
|
3
3
|
import { Context } from 'effect';
|
4
|
-
import { CreateBucketCommandInput, CreateBucketCommandOutput,
|
4
|
+
import { CreateBucketCommandInput, CreateBucketCommandOutput, PutObjectCommandOutput } from '@aws-sdk/client-s3';
|
5
5
|
import { HttpClient } from '@effect/platform';
|
6
6
|
import { Scope } from 'effect/Scope';
|
7
7
|
import type { BucketNotFoundError, FileStorageError } from '@errors';
|
8
|
-
import type { BucketInfosResult, UploadFileInput } from '@implementation';
|
8
|
+
import type { BucketInfosInput, BucketInfosResult, UploadFileInput } from '@implementation';
|
9
9
|
export interface FileStorage {
|
10
10
|
readonly createBucket: (input: CreateBucketCommandInput) => Effect.Effect<CreateBucketCommandOutput, ConfigError.ConfigError | FileStorageError, never>;
|
11
|
-
readonly bucketInfos: (input:
|
11
|
+
readonly bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<BucketInfosResult, ConfigError.ConfigError | FileStorageError | BucketNotFoundError, never>;
|
12
12
|
readonly getFileUrl: <TBucket extends string>(fileName: string, bucket: TBucket) => Effect.Effect<string, FileStorageError | ConfigError.ConfigError>;
|
13
13
|
readonly readAsRawBinary: <TBucket extends string>(bucketName: TBucket, documentKey: string) => Effect.Effect<ArrayBuffer, ConfigError.ConfigError | HttpClientError | FileStorageError, Scope | HttpClient.HttpClient.Service>;
|
14
14
|
readonly readAsJson: <TBucket extends string, TShape extends Record<string, unknown>>(bucketName: TBucket, documentKey: string) => Effect.Effect<TShape, ConfigError.ConfigError | HttpClientError | FileStorageError, Scope | HttpClient.HttpClient.Service>;
|
@@ -18,7 +18,7 @@ export interface FileStorage {
|
|
18
18
|
export declare const FileStorageLayerContext: Context.Tag<FileStorage, FileStorage>;
|
19
19
|
export declare const FileStorageLayer: {
|
20
20
|
createBucket: (input: CreateBucketCommandInput) => Effect.Effect<CreateBucketCommandOutput, FileStorageError | ConfigError.ConfigError, FileStorage>;
|
21
|
-
bucketInfos: (input:
|
21
|
+
bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<BucketInfosResult, BucketNotFoundError | FileStorageError | ConfigError.ConfigError, FileStorage>;
|
22
22
|
getFileUrl: <TBucket extends string>(bucket: TBucket, fileName: string) => Effect.Effect<string, FileStorageError | ConfigError.ConfigError, FileStorage>;
|
23
23
|
readAsRawBinary: <TBucket extends string>(bucket: TBucket, fileName: string) => Effect.Effect<ArrayBuffer, FileStorageError | ConfigError.ConfigError | HttpClientError, Scope | HttpClient.HttpClient.Service | FileStorage>;
|
24
24
|
readAsJson: <TBucket extends string, TShape extends Record<string, unknown>>(bucket: TBucket, fileName: string) => Effect.Effect<TShape, FileStorageError | ConfigError.ConfigError | HttpClientError, Scope | HttpClient.HttpClient.Service | FileStorage>;
|
@@ -1,9 +1,12 @@
|
|
1
|
-
import { HeadBucketCommandInput } from '@aws-sdk/client-s3';
|
2
1
|
import { Effect } from 'effect';
|
3
2
|
import { BucketNotFoundError, FileStorageError } from '@errors';
|
3
|
+
export type BucketInfosInput<TBucket extends string> = {
|
4
|
+
Bucket: TBucket;
|
5
|
+
ExpectedBucketOwner?: string;
|
6
|
+
};
|
4
7
|
export type BucketInfosResult = {
|
5
8
|
region: string | undefined;
|
6
9
|
};
|
7
|
-
export declare const bucketInfos: (input:
|
10
|
+
export declare const bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<{
|
8
11
|
region: string | undefined;
|
9
12
|
}, BucketNotFoundError | FileStorageError | import("effect/ConfigError").ConfigError, never>;
|
package/dts/esm/index.d.ts
CHANGED
@@ -3,5 +3,5 @@ import { FileStorageLayer } from './layer/file-storage.layer.js';
|
|
3
3
|
export { FileStorageLayer };
|
4
4
|
export type { FileStorage };
|
5
5
|
export * from './r2/r2-file-storage.layer.js';
|
6
|
-
export type { PutObjectCommandOutput, CreateBucketCommandInput, CreateBucketCommandOutput,
|
7
|
-
export type { BucketInfosResult } from './r2/implementations/bucket-infos.effect.js';
|
6
|
+
export type { PutObjectCommandOutput, CreateBucketCommandInput, CreateBucketCommandOutput, } from '@aws-sdk/client-s3';
|
7
|
+
export type { BucketInfosInput, BucketInfosResult, } from './r2/implementations/bucket-infos.effect.js';
|
@@ -1,14 +1,14 @@
|
|
1
1
|
import { HttpClientError } from '@effect/platform/HttpClientError';
|
2
2
|
import type { ConfigError, Effect } from 'effect';
|
3
3
|
import { Context } from 'effect';
|
4
|
-
import { CreateBucketCommandInput, CreateBucketCommandOutput,
|
4
|
+
import { CreateBucketCommandInput, CreateBucketCommandOutput, PutObjectCommandOutput } from '@aws-sdk/client-s3';
|
5
5
|
import { HttpClient } from '@effect/platform';
|
6
6
|
import { Scope } from 'effect/Scope';
|
7
7
|
import type { BucketNotFoundError, FileStorageError } from '@errors';
|
8
|
-
import type { BucketInfosResult, UploadFileInput } from '@implementation';
|
8
|
+
import type { BucketInfosInput, BucketInfosResult, UploadFileInput } from '@implementation';
|
9
9
|
export interface FileStorage {
|
10
10
|
readonly createBucket: (input: CreateBucketCommandInput) => Effect.Effect<CreateBucketCommandOutput, ConfigError.ConfigError | FileStorageError, never>;
|
11
|
-
readonly bucketInfos: (input:
|
11
|
+
readonly bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<BucketInfosResult, ConfigError.ConfigError | FileStorageError | BucketNotFoundError, never>;
|
12
12
|
readonly getFileUrl: <TBucket extends string>(fileName: string, bucket: TBucket) => Effect.Effect<string, FileStorageError | ConfigError.ConfigError>;
|
13
13
|
readonly readAsRawBinary: <TBucket extends string>(bucketName: TBucket, documentKey: string) => Effect.Effect<ArrayBuffer, ConfigError.ConfigError | HttpClientError | FileStorageError, Scope | HttpClient.HttpClient.Service>;
|
14
14
|
readonly readAsJson: <TBucket extends string, TShape extends Record<string, unknown>>(bucketName: TBucket, documentKey: string) => Effect.Effect<TShape, ConfigError.ConfigError | HttpClientError | FileStorageError, Scope | HttpClient.HttpClient.Service>;
|
@@ -18,7 +18,7 @@ export interface FileStorage {
|
|
18
18
|
export declare const FileStorageLayerContext: Context.Tag<FileStorage, FileStorage>;
|
19
19
|
export declare const FileStorageLayer: {
|
20
20
|
createBucket: (input: CreateBucketCommandInput) => Effect.Effect<CreateBucketCommandOutput, FileStorageError | ConfigError.ConfigError, FileStorage>;
|
21
|
-
bucketInfos: (input:
|
21
|
+
bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<BucketInfosResult, BucketNotFoundError | FileStorageError | ConfigError.ConfigError, FileStorage>;
|
22
22
|
getFileUrl: <TBucket extends string>(bucket: TBucket, fileName: string) => Effect.Effect<string, FileStorageError | ConfigError.ConfigError, FileStorage>;
|
23
23
|
readAsRawBinary: <TBucket extends string>(bucket: TBucket, fileName: string) => Effect.Effect<ArrayBuffer, FileStorageError | ConfigError.ConfigError | HttpClientError, Scope | HttpClient.HttpClient.Service | FileStorage>;
|
24
24
|
readAsJson: <TBucket extends string, TShape extends Record<string, unknown>>(bucket: TBucket, fileName: string) => Effect.Effect<TShape, FileStorageError | ConfigError.ConfigError | HttpClientError, Scope | HttpClient.HttpClient.Service | FileStorage>;
|
@@ -1,9 +1,12 @@
|
|
1
|
-
import { HeadBucketCommandInput } from '@aws-sdk/client-s3';
|
2
1
|
import { Effect } from 'effect';
|
3
2
|
import { BucketNotFoundError, FileStorageError } from '@errors';
|
3
|
+
export type BucketInfosInput<TBucket extends string> = {
|
4
|
+
Bucket: TBucket;
|
5
|
+
ExpectedBucketOwner?: string;
|
6
|
+
};
|
4
7
|
export type BucketInfosResult = {
|
5
8
|
region: string | undefined;
|
6
9
|
};
|
7
|
-
export declare const bucketInfos: (input:
|
10
|
+
export declare const bucketInfos: <TBucket extends string>(input: BucketInfosInput<TBucket>) => Effect.Effect<{
|
8
11
|
region: string | undefined;
|
9
12
|
}, BucketNotFoundError | FileStorageError | import("effect/ConfigError").ConfigError, never>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"file-storage.layer.js","sourceRoot":"","sources":["../../../src/layer/file-storage.layer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;
|
1
|
+
{"version":3,"file":"file-storage.layer.js","sourceRoot":"","sources":["../../../src/layer/file-storage.layer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAUjC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAkEpC,MAAM,CAAC,MAAM,uBAAuB,GAClC,OAAO,CAAC,UAAU,CAAc,cAAc,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE,CAAC,KAA+B,EAAE,EAAE,CAChD,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrD,YAAY,CAAC,KAAK,CAAC,CACpB;IACH,WAAW,EAAE,CAAyB,KAAgC,EAAE,EAAE,CACxE,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5E,UAAU,EAAE,CAAyB,MAAe,EAAE,QAAgB,EAAE,EAAE,CACxE,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC7B;IACH,eAAe,EAAE,CACf,MAAe,EACf,QAAgB,EAChB,EAAE,CACF,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CACxD,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAClC;IACH,UAAU,EAAE,CACV,MAAe,EACf,QAAgB,EAChB,EAAE,CACF,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAkB,MAAM,EAAE,QAAQ,CAAC,CAC9C;IACH,UAAU,EAAE,CAAyB,MAAe,EAAE,QAAgB,EAAE,EAAE,CACxE,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CACnD,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC7B;IACH,UAAU,EAAE,CAAyB,KAA+B,EAAE,EAAE,CACtE,QAAQ,CAAC,uBAAuB,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;CAC3E,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"bucket-infos.effect.js","sourceRoot":"","sources":["../../../../src/r2/implementations/bucket-infos.effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,
|
1
|
+
{"version":3,"file":"bucket-infos.effect.js","sourceRoot":"","sources":["../../../../src/r2/implementations/bucket-infos.effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAIxD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAoC,EAAE;IACnE,OAAQ,KAAuB,EAAE,IAAI,KAAK,SAAS,CAAC;AACtD,CAAC,CAAC;AAWF,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,KAAgC,EAChC,EAAE,CACF,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC,CAC3D,IAAI,CACF,2BAA2B,EAC3B,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,UAAU,CAAC;IAChB,GAAG,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,IAAI,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,IAAI,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC,CACH,EACD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,QAAQ,CAAC,YAAY;CAC9B,CAAC,CAAC,CACJ,CACF,CAAC"}
|