wellcrafted 0.21.4 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -234,98 +234,88 @@ declare function isOk<T, E>(result: Result<T, E>): result is Ok<T>;
234
234
  */
235
235
  declare function isErr<T, E>(result: Result<T, E>): result is Err<E>;
236
236
  /**
237
- * Executes a synchronous operation and wraps its outcome (success or failure) in a `Result<T, E>`.
238
- *
239
- * This function attempts to execute the `operation`.
240
- * - If `operation` completes successfully, its return value is wrapped in an `Ok<T>` variant.
241
- * - If `operation` throws an exception, the caught exception (of type `unknown`) is passed to
242
- * the `mapErr` function. `mapErr` is responsible for transforming this `unknown`
243
- * exception into an `Err<E>` variant containing a well-typed error value of type `E`.
244
- *
245
- * @template T - The type of the success value returned by the `operation` if it succeeds.
246
- * @template E - The type of the error value produced by `mapErr` if the `operation` fails.
247
- * @param options - An object containing the operation and error mapping function.
248
- * @param options.try - The synchronous operation to execute. This function is expected to return a value of type `T`.
249
- * @param options.mapErr - A function that takes the `unknown` exception caught from `options.try`
250
- * and transforms it into an `Err<E>` variant containing a specific error value of type `E`.
251
- * @returns A `Result<T, E>`: `Ok<T>` if `options.try` succeeds, or `Err<E>` if it throws and `options.mapErr` provides an error variant.
252
- * @example
253
- * ```ts
254
- * function parseJson(jsonString: string): Result<object, SyntaxError> {
255
- * return trySync({
256
- * try: () => JSON.parse(jsonString),
257
- * mapErr: (err: unknown) => {
258
- * if (err instanceof SyntaxError) return Err(err);
259
- * return Err(new SyntaxError("Unknown parsing error"));
260
- * }
261
- * });
262
- * }
237
+ * Executes a synchronous operation and wraps its outcome in a Result type.
238
+ *
239
+ * This function attempts to execute the `try` operation:
240
+ * - If the `try` operation completes successfully, its return value is wrapped in an `Ok<T>` variant.
241
+ * - If the `try` operation throws an exception, the caught exception (of type `unknown`) is passed to
242
+ * the `catch` function, which transforms it into either an `Ok<T>` (recovery) or `Err<E>` (propagation).
243
+ *
244
+ * The return type is automatically narrowed based on what your catch function returns:
245
+ * - If catch always returns `Ok<T>`, the function returns `Ok<T>` (guaranteed success)
246
+ * - If catch can return `Err<E>`, the function returns `Result<T, E>` (may succeed or fail)
263
247
  *
264
- * const validResult = parseJson('{"name":"Result"}'); // Ok<{name: string}>
265
- * const invalidResult = parseJson('invalid json'); // Err<SyntaxError>
248
+ * @template T - The success value type
249
+ * @template E - The error value type (when catch can return errors)
250
+ * @param options - Configuration object
251
+ * @param options.try - The operation to execute
252
+ * @param options.catch - Error handler that transforms caught exceptions into either `Ok<T>` (recovery) or `Err<E>` (propagation)
253
+ * @returns `Ok<T>` if catch always returns Ok (recovery), otherwise `Result<T, E>` (propagation)
266
254
  *
267
- * if (isOk(validResult)) console.log(validResult.data);
268
- * if (isErr(invalidResult)) console.error(invalidResult.error.message);
255
+ * @example
256
+ * ```ts
257
+ * // Returns Ok<string> - guaranteed success since catch always returns Ok
258
+ * const alwaysOk = trySync({
259
+ * try: () => JSON.parse(input),
260
+ * catch: () => Ok("fallback") // Always Ok<T>
261
+ * });
262
+ *
263
+ * // Returns Result<object, string> - may fail since catch can return Err
264
+ * const mayFail = trySync({
265
+ * try: () => JSON.parse(input),
266
+ * catch: (err) => Err("Parse failed") // Returns Err<E>
267
+ * });
269
268
  * ```
270
269
  */
271
- declare function trySync<T, E>({
272
- try: operation,
273
- mapErr
274
- }: {
270
+ declare function trySync<T>(options: {
275
271
  try: () => T;
276
- mapErr: (error: unknown) => Err<E>;
272
+ catch: (error: unknown) => Ok<T>;
273
+ }): Ok<T>;
274
+ declare function trySync<T, E>(options: {
275
+ try: () => T;
276
+ catch: (error: unknown) => Err<E>;
277
277
  }): Result<T, E>;
278
278
  /**
279
- * Executes an asynchronous operation (returning a `Promise`) and wraps its outcome in a `Promise<Result<T, E>>`.
280
- *
281
- * This function attempts to execute the asynchronous `operation`.
282
- * - If the `Promise` returned by `operation` resolves successfully, its resolved value is wrapped in an `Ok<T>` variant.
283
- * - If the `Promise` returned by `operation` rejects, or if `operation` itself throws an exception synchronously,
284
- * the caught exception/rejection reason (of type `unknown`) is passed to the `mapErr` function.
285
- * `mapErr` is responsible for transforming this `unknown` error into an `Err<E>` variant containing
286
- * a well-typed error value of type `E`.
287
- *
288
- * The entire outcome (`Ok<T>` or `Err<E>`) is wrapped in a `Promise`.
289
- *
290
- * @template T - The type of the success value the `Promise` from `operation` resolves to.
291
- * @template E - The type of the error value produced by `mapErr` if the `operation` fails or rejects.
292
- * @param options - An object containing the asynchronous operation and error mapping function.
293
- * @param options.try - The asynchronous operation to execute. This function must return a `Promise<T>`.
294
- * @param options.mapErr - A function that takes the `unknown` exception/rejection reason caught from `options.try`
295
- * and transforms it into an `Err<E>` variant containing a specific error value of type `E`.
296
- * This function must return `Err<E>` directly.
297
- * @returns A `Promise` that resolves to a `Result<T, E>`: `Ok<T>` if `options.try`'s `Promise` resolves,
298
- * or `Err<E>` if it rejects/throws and `options.mapErr` provides an error variant.
279
+ * Executes an asynchronous operation and wraps its outcome in a Promise<Result>.
280
+ *
281
+ * This function attempts to execute the `try` operation:
282
+ * - If the `try` operation resolves successfully, its resolved value is wrapped in an `Ok<T>` variant.
283
+ * - If the `try` operation rejects or throws an exception, the caught error (of type `unknown`) is passed to
284
+ * the `catch` function, which transforms it into either an `Ok<T>` (recovery) or `Err<E>` (propagation).
285
+ *
286
+ * The return type is automatically narrowed based on what your catch function returns:
287
+ * - If catch always returns `Ok<T>`, the function returns `Promise<Ok<T>>` (guaranteed success)
288
+ * - If catch can return `Err<E>`, the function returns `Promise<Result<T, E>>` (may succeed or fail)
289
+ *
290
+ * @template T - The success value type
291
+ * @template E - The error value type (when catch can return errors)
292
+ * @param options - Configuration object
293
+ * @param options.try - The async operation to execute
294
+ * @param options.catch - Error handler that transforms caught exceptions/rejections into either `Ok<T>` (recovery) or `Err<E>` (propagation)
295
+ * @returns `Promise<Ok<T>>` if catch always returns Ok (recovery), otherwise `Promise<Result<T, E>>` (propagation)
296
+ *
299
297
  * @example
300
298
  * ```ts
301
- * async function fetchData(url: string): Promise<Result<Response, Error>> {
302
- * return tryAsync({
303
- * try: async () => fetch(url),
304
- * mapErr: (err: unknown) => {
305
- * if (err instanceof Error) return Err(err);
306
- * return Err(new Error("Network request failed"));
307
- * }
308
- * });
309
- * }
310
- *
311
- * async function processData() {
312
- * const result = await fetchData("/api/data");
313
- * if (isOk(result)) {
314
- * const response = result.data;
315
- * console.log("Data fetched:", await response.json());
316
- * } else {
317
- * console.error("Fetch error:", result.error.message);
318
- * }
319
- * }
320
- * processData();
299
+ * // Returns Promise<Ok<Response>> - guaranteed success since catch always returns Ok
300
+ * const alwaysOk = tryAsync({
301
+ * try: async () => fetch(url),
302
+ * catch: () => Ok(new Response()) // Always Ok<T>
303
+ * });
304
+ *
305
+ * // Returns Promise<Result<Response, Error>> - may fail since catch can return Err
306
+ * const mayFail = tryAsync({
307
+ * try: async () => fetch(url),
308
+ * catch: (err) => Err(new Error("Fetch failed")) // Returns Err<E>
309
+ * });
321
310
  * ```
322
311
  */
323
- declare function tryAsync<T, E>({
324
- try: operation,
325
- mapErr
326
- }: {
312
+ declare function tryAsync<T>(options: {
313
+ try: () => Promise<T>;
314
+ catch: (error: unknown) => Ok<T>;
315
+ }): Promise<Ok<T>>;
316
+ declare function tryAsync<T, E>(options: {
327
317
  try: () => Promise<T>;
328
- mapErr: (error: unknown) => Err<E>;
318
+ catch: (error: unknown) => Err<E>;
329
319
  }): Promise<Result<T, E>>;
330
320
  /**
331
321
  * Resolves a value that may or may not be wrapped in a `Result`, returning the final value.
@@ -426,4 +416,4 @@ declare function resolve<T, E>(value: T | Result<T, E>): T;
426
416
  //# sourceMappingURL=result.d.ts.map
427
417
  //#endregion
428
418
  export { Err, ExtractErrFromResult, ExtractOkFromResult, Ok, Result, UnwrapErr, UnwrapOk, isErr, isOk, isResult, resolve, tryAsync, trySync, unwrap };
429
- //# sourceMappingURL=result-DucAuR8u.d.ts.map
419
+ //# sourceMappingURL=result-DRq8PMRe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-DRq8PMRe.d.ts","names":[],"sources":["../src/result/result.ts"],"sourcesContent":[],"mappings":";;AAWA;AAaA;AAqCA;;;;;;AAAsC;AAiBtC;AAAgE,KAnEpD,EAmEoD,CAAA,CAAA,CAAA,GAAA;EAAA,IAApC,EAnEA,CAmEA;EAAC,KAAM,EAAA,IAAA;CAAC;AAAF;AAiBlC;;;;;AAAqC;AAWrC;;;;AAAsE,KAlF1D,GAkF0D,CAAA,CAAA,CAAA,GAAA;EAAO,KAAA,EAlF/C,CAkF+C;EAcjE,IAAA,EAAA,IAAA;CAAoB;;;;AAA8C;AAuB9E;;;;;;AACI;AAqBJ;;;;;;AAGI;AAgCJ;;;;;AAEkB;AAoClB;;;;;;;AAA8D;AAyB9D;;;AAA8C,KA1MlC,MA0MkC,CAAA,CAAA,EAAA,CAAA,CAAA,GA1MnB,EA0MmB,CA1MhB,CA0MgB,CAAA,GA1MX,GA0MW,CA1MP,CA0MO,CAAA;;;;AAAkB;AAsChE;;;;;;;AAGM;AAEN;;;AAEgC,cAtOnB,EAsOmB,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAtOJ,CAsOI,EAAA,GAtOA,EAsOA,CAtOG,CAsOH,CAAA;;;;;AACtB;AAmDV;;;;;;;;;AAGW;AAEW,cA9QT,GA8QiB,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EA9QA,CA8QA,EAAA,GA9QI,GA8QJ,CA9QQ,CA8QR,CAAA;;;;;;;;;;AAGnB,KAtQC,mBAsQD,CAAA,UAtQ+B,MAsQ/B,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GAtQ2D,OAsQ3D,CArQV,CAqQU,EAAA;EA+GK,KAAA,EAAA,IAAM;CAAA,CAAA;;;;;AAA+B;AAOrD;;;;AAAmD,KA9WvC,oBA8WuC,CAAA,UA9WR,MA8WQ,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GA9WoB,OA8WpB,CA7WlD,CA6WkD,EAAA;EAAC,IAAX,EAAA,IAAA;CAAM,CAAA;AAAU;;;;;;;;;;;;;;;;;;KAvV7C,mBAAmB,4BAA4B,UAAU,cAClE;;;;;;;;;;;;;;;;;;;KAqBS,oBAAoB,4BAA4B,UAAU,eAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCa,6DAEJ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAoCN,mBAAmB,OAAO,GAAG,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAyB/C,oBAAoB,OAAO,GAAG,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCjD;aACJ;6BACgB,GAAG;IAC3B,GAAG;iBAES;aACJ;6BACgB,IAAI;IAC5B,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmDQ;aACV,QAAQ;6BACQ,GAAG;IAC3B,QAAQ,GAAG;iBAEO;aACV,QAAQ;6BACQ,IAAI;IAC5B,QAAQ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+GN,qBAAqB,OAAO,GAAG,KAAK;iBAOpC,qBAAqB,IAAI,OAAO,GAAG,KAAK"}
@@ -1,4 +1,4 @@
1
- import { isOk } from "./result-BPrctj1f.js";
1
+ import { isOk } from "./result-B1iWFqM9.js";
2
2
 
3
3
  //#region src/result/utils.ts
4
4
  /**
@@ -27,4 +27,4 @@ function partitionResults(results) {
27
27
 
28
28
  //#endregion
29
29
  export { partitionResults };
30
- //# sourceMappingURL=result-DOgvmaNP.js.map
30
+ //# sourceMappingURL=result-DfuKgZo9.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"result-DOgvmaNP.js","names":["results: Result<T, E>[]"],"sources":["../src/result/utils.ts"],"sourcesContent":["import type { Err, Ok, Result } from \"./result.js\";\nimport { isOk } from \"./result.js\";\n\n/**\n * Partitions an array of Result objects into two separate arrays based on their status.\n *\n * @template T - The success type\n * @template E - The error type\n * @param results - An array of Result objects to partition\n * @returns An object containing two arrays:\n * - `oks`: Array of successful Result objects (Ok<T>[])\n * - `errs`: Array of error Result objects (Err<E>[])\n *\n * @example\n * const results = [Ok(1), Err(\"error\"), Ok(2)];\n * const { oks, errs } = partitionResults(results);\n * // oks = [Ok(1), Ok(2)]\n * // errs = [Err(\"error\")]\n */\nexport function partitionResults<T, E>(results: Result<T, E>[]) {\n\treturn {\n\t\toks: [],\n\t\terrs: [],\n\t\t...Object.groupBy(results, (result) => (isOk(result) ? \"oks\" : \"errs\")),\n\t} as { oks: Ok<T>[]; errs: Err<E>[] };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,iBAAuBA,SAAyB;AAC/D,QAAO;EACN,KAAK,CAAE;EACP,MAAM,CAAE;EACR,GAAG,OAAO,QAAQ,SAAS,CAAC,WAAY,KAAK,OAAO,GAAG,QAAQ,OAAQ;CACvE;AACD"}
1
+ {"version":3,"file":"result-DfuKgZo9.js","names":["results: Result<T, E>[]"],"sources":["../src/result/utils.ts"],"sourcesContent":["import type { Err, Ok, Result } from \"./result.js\";\nimport { isOk } from \"./result.js\";\n\n/**\n * Partitions an array of Result objects into two separate arrays based on their status.\n *\n * @template T - The success type\n * @template E - The error type\n * @param results - An array of Result objects to partition\n * @returns An object containing two arrays:\n * - `oks`: Array of successful Result objects (Ok<T>[])\n * - `errs`: Array of error Result objects (Err<E>[])\n *\n * @example\n * const results = [Ok(1), Err(\"error\"), Ok(2)];\n * const { oks, errs } = partitionResults(results);\n * // oks = [Ok(1), Ok(2)]\n * // errs = [Err(\"error\")]\n */\nexport function partitionResults<T, E>(results: Result<T, E>[]) {\n\treturn {\n\t\toks: [],\n\t\terrs: [],\n\t\t...Object.groupBy(results, (result) => (isOk(result) ? \"oks\" : \"errs\")),\n\t} as { oks: Ok<T>[]; errs: Err<E>[] };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,iBAAuBA,SAAyB;AAC/D,QAAO;EACN,KAAK,CAAE;EACP,MAAM,CAAE;EACR,GAAG,OAAO,QAAQ,SAAS,CAAC,WAAY,KAAK,OAAO,GAAG,QAAQ,OAAQ;CACvE;AACD"}
package/package.json CHANGED
@@ -1,56 +1,56 @@
1
1
  {
2
- "name": "wellcrafted",
3
- "version": "0.21.4",
4
- "description": "Delightful TypeScript patterns for elegant, type-safe applications",
5
- "type": "module",
6
- "files": [
7
- "dist",
8
- "README.md",
9
- "LICENSE"
10
- ],
11
- "exports": {
12
- "./result": {
13
- "types": "./dist/result/index.d.ts",
14
- "import": "./dist/result/index.js"
15
- },
16
- "./error": {
17
- "types": "./dist/error/index.d.ts",
18
- "import": "./dist/error/index.js"
19
- },
20
- "./brand": {
21
- "types": "./dist/brand.d.ts",
22
- "import": "./dist/brand.js"
23
- },
24
- "./query": {
25
- "types": "./dist/query/index.d.ts",
26
- "import": "./dist/query/index.js"
27
- }
28
- },
29
- "keywords": [
30
- "typescript",
31
- "delightful",
32
- "elegant",
33
- "type-safe",
34
- "well-crafted",
35
- "polished",
36
- "utilities",
37
- "result",
38
- "error-handling",
39
- "brand-types"
40
- ],
41
- "author": "",
42
- "license": "MIT",
43
- "devDependencies": {
44
- "@biomejs/biome": "^1.9.4",
45
- "@changesets/cli": "^2.27.10",
46
- "@tanstack/query-core": "^5.82.0",
47
- "tsdown": "^0.12.5",
48
- "typescript": "^5.8.3"
49
- },
50
- "scripts": {
51
- "build": "tsdown",
52
- "format": "biome format --write .",
53
- "lint": "biome lint --write .",
54
- "release": "pnpm run build && changeset version && changeset publish"
55
- }
56
- }
2
+ "name": "wellcrafted",
3
+ "version": "0.23.1",
4
+ "description": "Delightful TypeScript patterns for elegant, type-safe applications",
5
+ "type": "module",
6
+ "files": [
7
+ "dist",
8
+ "README.md",
9
+ "LICENSE"
10
+ ],
11
+ "exports": {
12
+ "./result": {
13
+ "types": "./dist/result/index.d.ts",
14
+ "import": "./dist/result/index.js"
15
+ },
16
+ "./error": {
17
+ "types": "./dist/error/index.d.ts",
18
+ "import": "./dist/error/index.js"
19
+ },
20
+ "./brand": {
21
+ "types": "./dist/brand.d.ts",
22
+ "import": "./dist/brand.js"
23
+ },
24
+ "./query": {
25
+ "types": "./dist/query/index.d.ts",
26
+ "import": "./dist/query/index.js"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsdown",
31
+ "format": "biome format --write .",
32
+ "lint": "biome lint --write .",
33
+ "release": "pnpm run build && changeset version && changeset publish"
34
+ },
35
+ "keywords": [
36
+ "typescript",
37
+ "delightful",
38
+ "elegant",
39
+ "type-safe",
40
+ "well-crafted",
41
+ "polished",
42
+ "utilities",
43
+ "result",
44
+ "error-handling",
45
+ "brand-types"
46
+ ],
47
+ "author": "",
48
+ "license": "MIT",
49
+ "devDependencies": {
50
+ "@biomejs/biome": "^2.3.3",
51
+ "@changesets/cli": "^2.27.10",
52
+ "@tanstack/query-core": "^5.82.0",
53
+ "tsdown": "^0.12.5",
54
+ "typescript": "^5.8.3"
55
+ }
56
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"result-DucAuR8u.d.ts","names":[],"sources":["../src/result/result.ts"],"sourcesContent":[],"mappings":";;AAWA;AAaA;AAqCA;;;;;;AAAsC;AAiBtC;AAAgE,KAnEpD,EAmEoD,CAAA,CAAA,CAAA,GAAA;EAAA,IAApC,EAnEA,CAmEA;EAAC,KAAM,EAAA,IAAA;CAAC;AAAF;AAiBlC;;;;;AAAqC;AAWrC;;;;AAAsE,KAlF1D,GAkF0D,CAAA,CAAA,CAAA,GAAA;EAAO,KAAA,EAlF/C,CAkF+C;EAcjE,IAAA,EAAA,IAAA;CAAoB;;;;AAA8C;AAuB9E;;;;;;AACI;AAqBJ;;;;;;AAGI;AAgCJ;;;;;AAEkB;AAoClB;;;;;;;AAA8D;AAyB9D;;;AAA8C,KA1MlC,MA0MkC,CAAA,CAAA,EAAA,CAAA,CAAA,GA1MnB,EA0MmB,CA1MhB,CA0MgB,CAAA,GA1MX,GA0MW,CA1MP,CA0MO,CAAA;;;;AAAkB;AAuChE;;;;;;;;;;AAMU;AAsDY,cA5RT,EA4RiB,EAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EA5RF,CA4RE,EAAA,GA5RE,EA4RF,CA5RK,CA4RL,CAAA;;;;;;;;;;;;AAMnB;AAuGX;;;AAA+C,cAxXlC,GAwXkC,EAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EAxXjB,CAwXiB,EAAA,GAxXb,GAwXa,CAxXT,CAwXS,CAAA;;;AAAM;AAOrD;;;;;;AAAwD,KApX5C,mBAoX4C,CAAA,UApXd,MAoXc,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GApXc,OAoXd,CAnXvD,CAmXuD,EAAA;EAAC,KAAA,EAAA,IAAA;;;;;;;;;;;KAtW7C,+BAA+B,4BAA4B,QACtE;;;;;;;;;;;;;;;;;;;;;KAsBW,mBAAmB,4BAA4B,UAAU,cAClE;;;;;;;;;;;;;;;;;;;KAqBS,oBAAoB,4BAA4B,UAAU,eAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCa,6DAEJ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAoCN,mBAAmB,OAAO,GAAG,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;iBAyB/C,oBAAoB,OAAO,GAAG,eAAe,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuCjD;OACV;;;aAGM;8BACiB,IAAI;IAC7B,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAsDQ;OAChB;;;aAGM,QAAQ;8BACS,IAAI;IAC7B,QAAQ,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuGN,qBAAqB,OAAO,GAAG,KAAK;iBAOpC,qBAAqB,IAAI,OAAO,GAAG,KAAK"}