@satoshibits/functional 1.0.3 → 1.1.2

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 (134) hide show
  1. package/README.md +28 -145
  2. package/dist/array-utils.d.mts +13 -0
  3. package/dist/array-utils.d.mts.map +1 -1
  4. package/dist/array-utils.mjs +19 -3
  5. package/dist/array-utils.mjs.map +1 -1
  6. package/dist/array-utils.test.d.ts +2 -0
  7. package/dist/array-utils.test.d.ts.map +1 -0
  8. package/dist/array-utils.test.js +256 -0
  9. package/dist/array-utils.test.js.map +1 -0
  10. package/dist/composition.d.mts +53 -6
  11. package/dist/composition.d.mts.map +1 -1
  12. package/dist/composition.mjs +111 -22
  13. package/dist/composition.mjs.map +1 -1
  14. package/dist/composition.test.d.ts +2 -0
  15. package/dist/composition.test.d.ts.map +1 -0
  16. package/dist/composition.test.js +409 -0
  17. package/dist/composition.test.js.map +1 -0
  18. package/dist/index.d.mts +10 -5
  19. package/dist/index.d.mts.map +1 -1
  20. package/dist/index.mjs +10 -5
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/integration.test.d.mts +2 -0
  23. package/dist/integration.test.d.mts.map +1 -0
  24. package/dist/integration.test.mjs +486 -0
  25. package/dist/integration.test.mjs.map +1 -0
  26. package/dist/io.d.mts +338 -0
  27. package/dist/io.d.mts.map +1 -0
  28. package/dist/io.mjs +389 -0
  29. package/dist/io.mjs.map +1 -0
  30. package/dist/io.test.d.mts +2 -0
  31. package/dist/io.test.d.mts.map +1 -0
  32. package/dist/io.test.mjs +373 -0
  33. package/dist/io.test.mjs.map +1 -0
  34. package/dist/laws.test.d.mts +2 -0
  35. package/dist/laws.test.d.mts.map +1 -0
  36. package/dist/laws.test.mjs +614 -0
  37. package/dist/laws.test.mjs.map +1 -0
  38. package/dist/object-utils.d.mts +11 -0
  39. package/dist/object-utils.d.mts.map +1 -1
  40. package/dist/object-utils.mjs +11 -0
  41. package/dist/object-utils.mjs.map +1 -1
  42. package/dist/object-utils.test.d.ts +2 -0
  43. package/dist/object-utils.test.d.ts.map +1 -0
  44. package/dist/object-utils.test.js +286 -0
  45. package/dist/object-utils.test.js.map +1 -0
  46. package/dist/option-additions.test.d.mts +2 -0
  47. package/dist/option-additions.test.d.mts.map +1 -0
  48. package/dist/option-additions.test.mjs +325 -0
  49. package/dist/option-additions.test.mjs.map +1 -0
  50. package/dist/option.d.mts +202 -58
  51. package/dist/option.d.mts.map +1 -1
  52. package/dist/option.mjs +271 -63
  53. package/dist/option.mjs.map +1 -1
  54. package/dist/option.test.d.ts +6 -0
  55. package/dist/option.test.d.ts.map +1 -0
  56. package/dist/option.test.js +606 -0
  57. package/dist/option.test.js.map +1 -0
  58. package/dist/performance.d.mts +27 -10
  59. package/dist/performance.d.mts.map +1 -1
  60. package/dist/performance.mjs +42 -20
  61. package/dist/performance.mjs.map +1 -1
  62. package/dist/performance.test.d.ts +2 -0
  63. package/dist/performance.test.d.ts.map +1 -0
  64. package/dist/performance.test.js +424 -0
  65. package/dist/performance.test.js.map +1 -0
  66. package/dist/pipeline.d.mts +12 -0
  67. package/dist/pipeline.d.mts.map +1 -1
  68. package/dist/pipeline.mjs +12 -0
  69. package/dist/pipeline.mjs.map +1 -1
  70. package/dist/pipeline.test.d.ts +2 -0
  71. package/dist/pipeline.test.d.ts.map +1 -0
  72. package/dist/pipeline.test.js +445 -0
  73. package/dist/pipeline.test.js.map +1 -0
  74. package/dist/predicates.d.mts +12 -0
  75. package/dist/predicates.d.mts.map +1 -1
  76. package/dist/predicates.mjs +12 -0
  77. package/dist/predicates.mjs.map +1 -1
  78. package/dist/predicates.test.d.ts +2 -0
  79. package/dist/predicates.test.d.ts.map +1 -0
  80. package/dist/predicates.test.js +375 -0
  81. package/dist/predicates.test.js.map +1 -0
  82. package/dist/reader-result.d.mts +37 -16
  83. package/dist/reader-result.d.mts.map +1 -1
  84. package/dist/reader-result.mjs +37 -16
  85. package/dist/reader-result.mjs.map +1 -1
  86. package/dist/reader-result.test.d.ts +2 -0
  87. package/dist/reader-result.test.d.ts.map +1 -0
  88. package/dist/reader-result.test.js +1259 -0
  89. package/dist/reader-result.test.js.map +1 -0
  90. package/dist/reader.d.mts +443 -0
  91. package/dist/reader.d.mts.map +1 -0
  92. package/dist/reader.mjs +456 -0
  93. package/dist/reader.mjs.map +1 -0
  94. package/dist/reader.test.d.mts +2 -0
  95. package/dist/reader.test.d.mts.map +1 -0
  96. package/dist/reader.test.mjs +288 -0
  97. package/dist/reader.test.mjs.map +1 -0
  98. package/dist/result-additions.test.d.mts +2 -0
  99. package/dist/result-additions.test.d.mts.map +1 -0
  100. package/dist/result-additions.test.mjs +325 -0
  101. package/dist/result-additions.test.mjs.map +1 -0
  102. package/dist/result.d.mts +208 -0
  103. package/dist/result.d.mts.map +1 -1
  104. package/dist/result.mjs +287 -0
  105. package/dist/result.mjs.map +1 -1
  106. package/dist/result.test.d.ts +2 -0
  107. package/dist/result.test.d.ts.map +1 -0
  108. package/dist/result.test.js +453 -0
  109. package/dist/result.test.js.map +1 -0
  110. package/dist/task.d.mts +374 -0
  111. package/dist/task.d.mts.map +1 -0
  112. package/dist/task.mjs +386 -0
  113. package/dist/task.mjs.map +1 -0
  114. package/dist/task.test.d.mts +2 -0
  115. package/dist/task.test.d.mts.map +1 -0
  116. package/dist/task.test.mjs +1006 -0
  117. package/dist/task.test.mjs.map +1 -0
  118. package/dist/types.d.mts +12 -0
  119. package/dist/types.d.mts.map +1 -1
  120. package/dist/types.mjs +12 -0
  121. package/dist/types.mjs.map +1 -1
  122. package/dist/types.test.d.ts +6 -0
  123. package/dist/types.test.d.ts.map +1 -0
  124. package/dist/types.test.js +447 -0
  125. package/dist/types.test.js.map +1 -0
  126. package/dist/validation.d.mts +12 -0
  127. package/dist/validation.d.mts.map +1 -1
  128. package/dist/validation.mjs +22 -4
  129. package/dist/validation.mjs.map +1 -1
  130. package/dist/validation.test.d.ts +2 -0
  131. package/dist/validation.test.d.ts.map +1 -0
  132. package/dist/validation.test.js +518 -0
  133. package/dist/validation.test.js.map +1 -0
  134. package/package.json +77 -13
package/dist/io.d.mts ADDED
@@ -0,0 +1,338 @@
1
+ /**
2
+ * @module io
3
+ * @description IO represents a synchronous computation that may have side effects.
4
+ * An IO is a thunk (a function with no arguments) that performs a computation when called.
5
+ * This provides a way to make side effects referentially transparent by wrapping them
6
+ * in a function, delaying their execution until explicitly requested.
7
+ *
8
+ * ### For Dummies
9
+ * - An `IO<T>` is just `() => T`; you keep side effects in a box until you open it.
10
+ * - Build the pipeline now, run it later—great for tests and deterministic wiring.
11
+ * - No promises here: everything happens synchronously once you call `IO.run` or the IO itself.
12
+ *
13
+ * ### Decision Tree
14
+ * - Got a plain value? Wrap it with `IO.of(value)` to start a chain.
15
+ * - Need to transform without running? Use `IO.map(fn)(io)`.
16
+ * - Want the next step to also be an IO? Use `IO.chain(nextStep)(io)` (aka `flatMap`).
17
+ * - Collecting side-effect functions? Compose them with `IO.ap`, `IO.map`, or `IO.chain`.
18
+ * - Ready to execute? Either call the thunk directly or use `IO.run(io)` for clarity.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { IO } from './io.mts';
23
+ *
24
+ * // basic usage
25
+ * const getCurrentTime: IO<number> = () => Date.now();
26
+ * const randomNumber: IO<number> = () => Math.random();
27
+ *
28
+ * // composing IO operations
29
+ * const program = IO.chain((time: number) =>
30
+ * IO.map((rand: number) => `Time: ${time}, Random: ${rand}`)(
31
+ * randomNumber
32
+ * )
33
+ * )(getCurrentTime);
34
+ *
35
+ * // running IO
36
+ * const result = IO.run(program);
37
+ * ```
38
+ *
39
+ * @category Core
40
+ * @since 2025-09-18
41
+ */
42
+ /**
43
+ * IO type representing a synchronous computation that may have side effects.
44
+ * @description An IO is a function that takes no arguments and returns a value.
45
+ * The computation is lazy - it doesn't execute until explicitly run.
46
+ *
47
+ * @template A - The type of the value the IO will produce
48
+ *
49
+ * @category Types
50
+ * @example
51
+ * ```typescript
52
+ * // Simple IO
53
+ * const log: IO<void> = () => console.log('Hello');
54
+ *
55
+ * // IO returning a value
56
+ * const random: IO<number> = () => Math.random();
57
+ *
58
+ * // IO reading from environment
59
+ * const getEnv: IO<string | undefined> = () => process.env.HOME;
60
+ * ```
61
+ *
62
+ * @since 2025-09-18
63
+ */
64
+ export type IO<A> = () => A;
65
+ /**
66
+ * IO utility functions for working with IO types.
67
+ * @description Provides a functional API for creating, transforming, and composing IOs.
68
+ * All functions are curried to support functional composition and partial application.
69
+ *
70
+ * @category Utilities
71
+ * @since 2025-09-18
72
+ */
73
+ export declare const IO: {
74
+ /**
75
+ * Creates an IO that returns the given value.
76
+ * @description Factory function for creating IOs from values. The resulting
77
+ * IO will always return the provided value when run.
78
+ *
79
+ * @template A - The type of the value
80
+ * @param {A} value - The value to wrap in an IO
81
+ * @returns {IO<A>} An IO that returns the value
82
+ *
83
+ * @category Constructors
84
+ * @example
85
+ * ```typescript
86
+ * const io = IO.of(42);
87
+ * IO.run(io); // => 42
88
+ *
89
+ * // Useful for starting chains
90
+ * const result = IO.run(
91
+ * IO.chain((n: number) => IO.of(n * 2))(
92
+ * IO.of(21)
93
+ * )
94
+ * ); // => 42
95
+ * ```
96
+ *
97
+ * @since 2025-09-18
98
+ */
99
+ of: <A>(value: A) => IO<A>;
100
+ /**
101
+ * Transforms the value inside an IO using the given function.
102
+ * @description Applies a pure function to the value produced by an IO,
103
+ * creating a new IO with the transformed value. This is the functor
104
+ * map operation for IO types.
105
+ *
106
+ * @template A - The input type
107
+ * @template B - The output type
108
+ * @param {function(A): B} f - Function to transform the value
109
+ * @returns {function(IO<A>): IO<B>} A function that transforms IOs
110
+ *
111
+ * @category Transformations
112
+ * @example
113
+ * ```typescript
114
+ * const double = IO.map((n: number) => n * 2);
115
+ * const io = IO.of(21);
116
+ * const doubled = double(io);
117
+ * IO.run(doubled); // => 42
118
+ *
119
+ * // With side effects
120
+ * const random = () => Math.random();
121
+ * const percent = IO.map((n: number) => Math.round(n * 100))(random);
122
+ * IO.run(percent); // => random number 0-100
123
+ * ```
124
+ *
125
+ * @since 2025-09-18
126
+ */
127
+ map: <A, B>(f: (value: A) => B) => (io: IO<A>) => IO<B>;
128
+ /**
129
+ * Chains IO-returning operations.
130
+ * @description Sequences two IOs where the second depends on the result
131
+ * of the first. This is the monadic bind operation for IO types.
132
+ *
133
+ * @template A - The input type
134
+ * @template B - The output type
135
+ * @param {function(A): IO<B>} f - Function that returns a new IO
136
+ * @returns {function(IO<A>): IO<B>} A function that chains IOs
137
+ *
138
+ * @category Combinators
139
+ * @example
140
+ * ```typescript
141
+ * const readLine: IO<string> = () => prompt('Enter text:') || '';
142
+ * const toUpper = (s: string): IO<string> => IO.of(s.toUpperCase());
143
+ *
144
+ * const program = IO.chain(toUpper)(readLine);
145
+ * IO.run(program); // prompts user, returns uppercase input
146
+ * ```
147
+ *
148
+ * @since 2025-09-18
149
+ */
150
+ chain: <A, B>(f: (value: A) => IO<B>) => (io: IO<A>) => IO<B>;
151
+ /**
152
+ * Alias for chain to match fp-ts naming.
153
+ * @description See {@link chain} for details.
154
+ *
155
+ * @category Combinators
156
+ * @since 2025-09-18
157
+ */
158
+ flatMap: <A, B>(f: (value: A) => IO<B>) => (io: IO<A>) => IO<B>;
159
+ /**
160
+ * Applies an IO of a function to an IO of a value.
161
+ * @description Enables applying functions wrapped in IOs to values wrapped
162
+ * in IOs. This is the applicative apply operation for IO types.
163
+ *
164
+ * @template A - The input type
165
+ * @template B - The output type
166
+ * @param {IO<A>} ioValue - IO containing a value
167
+ * @returns {function(IO<function(A): B>): IO<B>} A function that applies IO functions
168
+ *
169
+ * @category Combinators
170
+ * @example
171
+ * ```typescript
172
+ * const add = (a: number) => (b: number) => a + b;
173
+ * const ioAdd = IO.of(add);
174
+ * const io5 = IO.of(5);
175
+ * const io3 = IO.of(3);
176
+ *
177
+ * const result = IO.run(
178
+ * IO.ap(io3)(
179
+ * IO.ap(io5)(
180
+ * IO.map(add)(IO.of(10))
181
+ * )
182
+ * )
183
+ * ); // => 18
184
+ * ```
185
+ *
186
+ * @since 2025-09-18
187
+ */
188
+ ap: <A, B>(ioValue: IO<A>) => (ioFn: IO<(a: A) => B>) => IO<B>;
189
+ /**
190
+ * Runs an IO to completion and returns its value.
191
+ * @description Executes an IO, triggering the computation and returning
192
+ * the result. This is where side effects actually occur.
193
+ *
194
+ * @template A - The type of the value
195
+ * @param {IO<A>} io - The IO to run
196
+ * @returns {A} The result of running the IO
197
+ *
198
+ * @category Execution
199
+ * @example
200
+ * ```typescript
201
+ * const io = IO.of(42);
202
+ * const result = IO.run(io); // => 42
203
+ *
204
+ * const sideEffect = () => {
205
+ * console.log('Side effect!');
206
+ * return 'done';
207
+ * };
208
+ * IO.run(sideEffect); // logs "Side effect!", returns 'done'
209
+ * ```
210
+ *
211
+ * @since 2025-09-18
212
+ */
213
+ run: <A>(io: IO<A>) => A;
214
+ /**
215
+ * Converts an array of IOs into an IO of an array.
216
+ * @description Sequences multiple IOs, running them in order and collecting
217
+ * their results.
218
+ *
219
+ * @template A - The type of values in the IOs
220
+ * @param {IO<A>[]} ios - Array of IOs to sequence
221
+ * @returns {IO<A[]>} An IO containing an array of results
222
+ *
223
+ * @category Combinators
224
+ * @example
225
+ * ```typescript
226
+ * const ios = [
227
+ * IO.of(1),
228
+ * IO.of(2),
229
+ * IO.of(3)
230
+ * ];
231
+ * const combined = IO.sequence(ios);
232
+ * IO.run(combined); // => [1, 2, 3]
233
+ * ```
234
+ *
235
+ * @since 2025-09-18
236
+ */
237
+ sequence: <A>(ios: IO<A>[]) => IO<A[]>;
238
+ /**
239
+ * Maps a function returning an IO over an array and sequences the results.
240
+ * @description Applies an IO-returning function to each element of an array
241
+ * and runs all resulting IOs in sequence.
242
+ *
243
+ * @template A - The input type
244
+ * @template B - The output type
245
+ * @param {function(A): IO<B>} f - Function that returns an IO
246
+ * @returns {function(A[]): IO<B[]>} A function that traverses arrays with IOs
247
+ *
248
+ * @category Combinators
249
+ * @example
250
+ * ```typescript
251
+ * const log = (msg: string): IO<string> => () => {
252
+ * console.log(msg);
253
+ * return msg;
254
+ * };
255
+ *
256
+ * const logAll = IO.traverse(log);
257
+ * const messages = IO.run(
258
+ * logAll(['Hello', 'World'])
259
+ * ); // logs each message, returns ['Hello', 'World']
260
+ * ```
261
+ *
262
+ * @since 2025-09-18
263
+ */
264
+ traverse: <A, B>(f: (a: A) => IO<B>) => (as: A[]) => IO<B[]>;
265
+ /**
266
+ * Combines the results of a tuple of IOs into an IO of a tuple.
267
+ * @description Takes multiple IOs and returns an IO containing a tuple
268
+ * of their results.
269
+ *
270
+ * @template T - Tuple type of IOs
271
+ * @param {...T} ios - IOs to combine
272
+ * @returns {IO<{ [K in keyof T]: T[K] extends IO<infer U> ? U : never }>} IO of tuple
273
+ *
274
+ * @category Combinators
275
+ * @example
276
+ * ```typescript
277
+ * const io1 = IO.of(1);
278
+ * const io2 = IO.of('hello');
279
+ * const io3 = IO.of(true);
280
+ *
281
+ * const combined = IO.sequenceT(io1, io2, io3);
282
+ * IO.run(combined); // => [1, 'hello', true]
283
+ * ```
284
+ *
285
+ * @since 2025-09-18
286
+ */
287
+ sequenceT: <T extends readonly IO<unknown>[]>(...ios: T) => IO<{ [K in keyof T]: T[K] extends IO<infer U> ? U : never; }>;
288
+ /**
289
+ * Combines the results of a record of IOs into an IO of a record.
290
+ * @description Takes an object with IO values and returns an IO containing
291
+ * an object with the results.
292
+ *
293
+ * @template R - Record type with IO values
294
+ * @param {R} ios - Record of IOs to combine
295
+ * @returns {IO<{ [K in keyof R]: R[K] extends IO<infer U> ? U : never }>} IO of record
296
+ *
297
+ * @category Combinators
298
+ * @example
299
+ * ```typescript
300
+ * const ios = {
301
+ * user: IO.of({ name: 'Alice' }),
302
+ * count: IO.of(42),
303
+ * enabled: IO.of(true)
304
+ * };
305
+ *
306
+ * const combined = IO.sequenceS(ios);
307
+ * IO.run(combined);
308
+ * // => { user: { name: 'Alice' }, count: 42, enabled: true }
309
+ * ```
310
+ *
311
+ * @since 2025-09-18
312
+ */
313
+ sequenceS: <R extends Record<string, IO<unknown>>>(ios: R) => IO<{ [K in keyof R]: R[K] extends IO<infer U> ? U : never; }>;
314
+ /**
315
+ * Executes an IO for its side effects, discarding the result.
316
+ * @description Runs an IO but returns the original value, useful for IOs
317
+ * that perform side effects where the result isn't needed.
318
+ *
319
+ * @template A - The type of the value
320
+ * @param {function(A): IO<unknown>} f - Function that returns an IO (result discarded)
321
+ * @returns {function(IO<A>): IO<A>} A function that executes side effects
322
+ *
323
+ * @category Combinators
324
+ * @example
325
+ * ```typescript
326
+ * const log = (msg: string): IO<void> => () => console.log(msg);
327
+ *
328
+ * const io = IO.chainFirst((n: number) => log(`Got: ${n}`))(
329
+ * IO.of(42)
330
+ * );
331
+ * IO.run(io); // logs "Got: 42", returns 42
332
+ * ```
333
+ *
334
+ * @since 2025-09-18
335
+ */
336
+ chainFirst: <A>(f: (a: A) => IO<unknown>) => (io: IO<A>) => IO<A>;
337
+ };
338
+ //# sourceMappingURL=io.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.d.mts","sourceRoot":"","sources":["../src/io.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAE5B;;;;;;;GAOG;AACH,eAAO,MAAM,EAAE;IACb;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;SAEA,CAAC,SAAU,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;IAIvB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;UAEA,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,UACpB,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;IAIpB;;;;;;;;;;;;;;;;;;;;;OAqBG;YAEA,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UACxB,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;IAIpB;;;;;;OAMG;cAEA,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UACxB,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;IAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;SAEA,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,YACd,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;IAIhC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;UACG,CAAC,MAAO,EAAE,CAAC,CAAC,CAAC,KAAG,CAAC;IAEvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;eAEA,CAAC,OAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAI7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;eAEA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,UACpB,CAAC,EAAE,KAAG,EAAE,CAAC,CAAC,EAAE,CAAC;IAGpB;;;;;;;;;;;;;;;;;;;;;OAqBG;gBAEA,CAAC,SAAS,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,UACvB,CAAC,KACR,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAE,CAAC;IAMjE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;gBAEA,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,OAC/B,CAAC,KACL,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,GAAE,CAAC;IAajE;;;;;;;;;;;;;;;;;;;;;OAqBG;iBAEA,CAAC,KAAM,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UACxB,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,CAAC,CAAC;CAMrB,CAAC"}