@effect-app/cli 1.23.3 → 1.23.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @effect-app/cli
2
2
 
3
+ ## 1.23.5
4
+
5
+ ### Patch Changes
6
+
7
+ - de35a0f: add monitors for packagejson
8
+ - 8e1543e: add wrapping of child commands
9
+
10
+ ## 1.23.4
11
+
12
+ ### Patch Changes
13
+
14
+ - ca792d7: add some debug prints
15
+
3
16
  ## 1.23.3
4
17
 
5
18
  ### Patch Changes
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@
4
4
  import { Args, Command, Options, Prompt } from "@effect/cli";
5
5
  import { Command as NodeCommand, FileSystem, Path } from "@effect/platform";
6
6
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
7
- import { Effect, identity, Stream } from "effect";
7
+ import { Effect, identity, Option, Stream } from "effect";
8
8
  import { ExtractExportMappingsService } from "./extract.js";
9
9
  import { packages } from "./shared.js";
10
10
  Effect
@@ -12,6 +12,7 @@ Effect
12
12
  const fs = yield* FileSystem.FileSystem;
13
13
  const path = yield* Path.Path;
14
14
  const extractExportMappings = yield* ExtractExportMappingsService;
15
+ yield* Effect.addFinalizer(() => Effect.logInfo(`CLI has finished executing`));
15
16
  /**
16
17
  * Executes a shell command using Node.js Command API with inherited stdio streams.
17
18
  * The command is run through the system shell (/bin/sh) for proper command parsing.
@@ -85,7 +86,7 @@ Effect
85
86
  * @returns An Effect that succeeds when linking is complete
86
87
  */
87
88
  const linkPackages = Effect.fnUntraced(function* (effectAppLibsPath) {
88
- yield* Effect.log("Linking local effect-app packages...");
89
+ yield* Effect.logInfo("Linking local effect-app packages...");
89
90
  const packageJsonPath = "./package.json";
90
91
  const packageJsonContent = yield* fs.readFileString(packageJsonPath);
91
92
  const pj = JSON.parse(packageJsonContent);
@@ -100,9 +101,9 @@ Effect
100
101
  };
101
102
  pj.resolutions = resolutions;
102
103
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
103
- yield* Effect.log("Updated package.json with local file resolutions");
104
+ yield* Effect.logInfo("Updated package.json with local file resolutions");
104
105
  yield* runNodeCommand("pnpm i");
105
- yield* Effect.log("Successfully linked local packages");
106
+ yield* Effect.logInfo("Successfully linked local packages");
106
107
  });
107
108
  /**
108
109
  * Unlinks local effect-app packages by removing file resolutions from package.json.
@@ -112,7 +113,7 @@ Effect
112
113
  * @returns An Effect that succeeds when unlinking is complete
113
114
  */
114
115
  const unlinkPackages = Effect.fnUntraced(function* () {
115
- yield* Effect.log("Unlinking local effect-app packages...");
116
+ yield* Effect.logInfo("Unlinking local effect-app packages...");
116
117
  const packageJsonPath = "./package.json";
117
118
  const packageJsonContent = yield* fs.readFileString(packageJsonPath);
118
119
  const pj = JSON.parse(packageJsonContent);
@@ -124,9 +125,9 @@ Effect
124
125
  }, {});
125
126
  pj.resolutions = filteredResolutions;
126
127
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2));
127
- yield* Effect.log("Removed effect-app file resolutions from package.json");
128
+ yield* Effect.logInfo("Removed effect-app file resolutions from package.json");
128
129
  yield* runNodeCommand("pnpm i");
129
- yield* Effect.log("Successfully unlinked local packages");
130
+ yield* Effect.logInfo("Successfully unlinked local packages");
130
131
  })();
131
132
  /**
132
133
  * Monitors controller files for changes and runs eslint on related controllers.ts/routes.ts files.
@@ -136,12 +137,9 @@ Effect
136
137
  * @param debug - Whether to enable debug logging
137
138
  * @returns An Effect that sets up controller file monitoring
138
139
  */
139
- const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath, debug) {
140
- const fileSystem = yield* FileSystem.FileSystem;
141
- if (debug) {
142
- yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
143
- }
144
- const watchStream = fileSystem.watch(watchPath, { recursive: true });
140
+ const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(function* (watchPath) {
141
+ yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`);
142
+ const watchStream = fs.watch(watchPath, { recursive: true });
145
143
  yield* watchStream
146
144
  .pipe(Stream.runForEach(Effect.fn("effa-cli.monitorChildIndexes.handleEvent")(function* (event) {
147
145
  const pathParts = event.path.split("/");
@@ -156,14 +154,12 @@ Effect
156
154
  .map((f) => [...pathParts.slice(0, pathParts.length - i), f].join("/"));
157
155
  const existingFiles = [];
158
156
  for (const file of candidateFiles) {
159
- const exists = yield* fileSystem.exists(file);
157
+ const exists = yield* fs.exists(file);
160
158
  if (exists)
161
159
  existingFiles.push(file);
162
160
  }
163
161
  if (existingFiles.length > 0) {
164
- if (debug) {
165
- yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
166
- }
162
+ yield* Effect.logInfo(`Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`);
167
163
  const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ");
168
164
  yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`);
169
165
  break;
@@ -171,7 +167,7 @@ Effect
171
167
  i++;
172
168
  }
173
169
  })))
174
- .pipe(Effect.forkScoped);
170
+ .pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring child indexes in: ${watchPath}`))), Effect.forkScoped);
175
171
  });
176
172
  /**
177
173
  * Monitors a directory for changes and runs eslint on the specified index file.
@@ -182,22 +178,17 @@ Effect
182
178
  * @param debug - Whether to enable debug logging
183
179
  * @returns An Effect that sets up root index monitoring
184
180
  */
185
- const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile, debug) {
186
- const fileSystem = yield* FileSystem.FileSystem;
187
- if (debug) {
188
- yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
189
- }
190
- const watchStream = fileSystem.watch(watchPath);
181
+ const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(function* (watchPath, indexFile) {
182
+ yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`);
183
+ const watchStream = fs.watch(watchPath);
191
184
  yield* watchStream
192
185
  .pipe(Stream.runForEach(Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function* (event) {
193
186
  if (event.path.endsWith(indexFile))
194
187
  return;
195
- if (debug) {
196
- yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
197
- }
188
+ yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`);
198
189
  yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`);
199
190
  })))
200
- .pipe(Effect.forkScoped);
191
+ .pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring root indexes in: ${watchPath} -> ${indexFile}`))), Effect.forkScoped);
201
192
  });
202
193
  /**
203
194
  * Sets up comprehensive index monitoring for a given path.
@@ -207,22 +198,17 @@ Effect
207
198
  * @param debug - Whether to enable debug logging
208
199
  * @returns An Effect that sets up all index monitoring for the path
209
200
  */
210
- const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath, debug) {
211
- const fileSystem = yield* FileSystem.FileSystem;
212
- if (debug) {
213
- yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
214
- }
201
+ const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(function* (watchPath) {
202
+ yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`);
215
203
  const indexFile = watchPath + "/index.ts";
216
- const monitors = [monitorChildIndexes(watchPath, debug)];
217
- if (yield* fileSystem.exists(indexFile)) {
218
- monitors.push(monitorRootIndexes(watchPath, indexFile, debug));
204
+ const monitors = [monitorChildIndexes(watchPath)];
205
+ if (yield* fs.exists(indexFile)) {
206
+ monitors.push(monitorRootIndexes(watchPath, indexFile));
219
207
  }
220
208
  else {
221
209
  yield* Effect.logInfo(`Index file ${indexFile} does not exist`);
222
210
  }
223
- if (debug) {
224
- yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
225
- }
211
+ yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`);
226
212
  yield* Effect.all(monitors, { concurrency: monitors.length });
227
213
  });
228
214
  /**
@@ -231,19 +217,16 @@ Effect
231
217
  *
232
218
  * @returns An Effect that sets up file watching streams
233
219
  */
234
- const watcher = Effect.fn("watch")(function* (debug) {
235
- yield* Effect.log("Watch API resources and models for changes");
220
+ const watcher = Effect.fn("watch")(function* () {
221
+ yield* Effect.logInfo("Watch API resources and models for changes");
236
222
  const dirs = ["../api/src/resources", "../api/src/models"];
237
223
  const viteConfigFile = "./vite.config.ts";
238
- const fileSystem = yield* FileSystem.FileSystem;
239
- const viteConfigExists = yield* fileSystem.exists(viteConfigFile);
240
- if (debug) {
241
- yield* Effect.logInfo("watcher debug mode is enabled");
242
- }
224
+ const viteConfigExists = yield* fs.exists(viteConfigFile);
225
+ yield* Effect.logInfo("watcher debug mode is enabled");
243
226
  // validate directories and filter out non-existing ones
244
227
  const existingDirs = [];
245
228
  for (const dir of dirs) {
246
- const dirExists = yield* fileSystem.exists(dir);
229
+ const dirExists = yield* fs.exists(dir);
247
230
  if (dirExists) {
248
231
  existingDirs.push(dir);
249
232
  }
@@ -251,40 +234,29 @@ Effect
251
234
  yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
252
235
  }
253
236
  }
254
- if (existingDirs.length === 0) {
255
- return yield* Effect.logWarning("No directories to watch - exiting");
256
- }
257
237
  // start watching all existing directories concurrently
258
238
  const watchStreams = existingDirs.map((dir) => Effect.gen(function* () {
259
- if (debug) {
260
- yield* Effect.logInfo(`Starting to watch directory: ${dir}`);
261
- }
239
+ yield* Effect.logInfo(`Starting to watch directory: ${dir}`);
262
240
  const files = [];
263
- const watchStream = fileSystem.watch(dir, { recursive: true });
241
+ const watchStream = fs.watch(dir, { recursive: true });
264
242
  yield* watchStream
265
243
  .pipe(Stream.runForEach(Effect.fn("effa-cli.watch.handleEvent")(function* (event) {
266
- if (debug) {
267
- yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`);
268
- }
244
+ yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`);
269
245
  // touch tsconfig.json on any file change
270
246
  yield* touch("./tsconfig.json");
271
- if (debug) {
272
- yield* Effect.logInfo("Updated tsconfig.json");
273
- }
247
+ yield* Effect.logInfo("Updated tsconfig.json");
274
248
  // touch vite config only on file updates (not creates/deletes)
275
249
  if (viteConfigExists
276
250
  && event._tag === "Update"
277
251
  && !files.includes(event.path)) {
278
252
  yield* touch(viteConfigFile);
279
- if (debug) {
280
- yield* Effect.logInfo("Updated vite.config.ts");
281
- }
253
+ yield* Effect.logInfo("Updated vite.config.ts");
282
254
  files.push(event.path);
283
255
  }
284
256
  })))
285
- .pipe(Effect.forkScoped);
257
+ .pipe(Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped watching directory: ${dir}`))), Effect.forkScoped);
286
258
  // also start monitoring indexes in the watched directory
287
- yield* monitorIndexes(dir, debug);
259
+ yield* monitorIndexes(dir);
288
260
  }));
289
261
  // run all watch streams concurrently
290
262
  yield* Effect.all(watchStreams, { concurrency: existingDirs.length });
@@ -300,11 +272,11 @@ Effect
300
272
  * @returns An Effect that succeeds when the package.json is updated
301
273
  */
302
274
  const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(function* (startDir, p, levels = 0) {
303
- yield* Effect.log(`Generating exports for ${p}`);
275
+ yield* Effect.logInfo(`Generating exports for ${p}`);
304
276
  const exportMappings = yield* extractExportMappings(path.resolve(startDir, p));
305
277
  // if exportMappings is empty skip export generation
306
278
  if (exportMappings === "") {
307
- yield* Effect.log(`No src directory found for ${p}, skipping export generation`);
279
+ yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`);
308
280
  return;
309
281
  }
310
282
  const sortedExportEntries = JSON.parse(`{ ${exportMappings} }`);
@@ -335,12 +307,66 @@ Effect
335
307
  };
336
308
  const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"));
337
309
  pkgJson.exports = packageExports;
338
- yield* Effect.log(`Writing updated package.json for ${p}`);
310
+ yield* Effect.logInfo(`Writing updated package.json for ${p}`);
339
311
  return yield* fs.writeFileString(p + "/package.json", JSON.stringify(pkgJson, null, 2));
340
312
  });
313
+ /**
314
+ * Monitors a directory for TypeScript file changes and automatically updates package.json exports.
315
+ * Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
316
+ *
317
+ * @param watchPath - The directory path containing the package.json and src to monitor
318
+ * @param levels - Optional depth limit for export filtering (0 = no limit)
319
+ * @returns An Effect that sets up package.json monitoring
320
+ */
321
+ const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(function* (startDir, watchPath, levels = 0) {
322
+ yield* packagejsonUpdater(startDir, watchPath, levels);
323
+ const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`;
324
+ if (!(yield* fs.exists(srcPath))) {
325
+ yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`);
326
+ return;
327
+ }
328
+ const watchStream = fs.watch(srcPath, { recursive: true });
329
+ yield* watchStream.pipe(Stream.runForEach(Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function* (_) {
330
+ yield* packagejsonUpdater(startDir, watchPath, levels);
331
+ })), Effect.andThen(Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))), Effect.forkScoped);
332
+ });
341
333
  /*
342
334
  * CLI
343
335
  */
336
+ const WrapAsOption = Options.text("wrap").pipe(Options.withAlias("w"), Options.optional, Options.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
337
+ // has prio over WrapAsOption
338
+ const WrapAsArg = Args
339
+ .text({
340
+ name: "wrap"
341
+ })
342
+ .pipe(Args.atLeast(1), Args.optional, Args.withDescription("Wrap child bash command: the lifetime of the CLI command will be tied to the child process"));
343
+ /**
344
+ * Creates a command that automatically includes wrap functionality for executing child bash commands.
345
+ * Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
346
+ * If a wrap command is provided, it will be executed **after** the main command handler.
347
+ *
348
+ * @param name - The command name
349
+ * @param config - The command configuration (options, args, etc.)
350
+ * @param handler - The main command handler function
351
+ * @param completionMessage - Optional message to log when the command completes
352
+ * @returns A Command with integrated wrap functionality
353
+ */
354
+ const makeCommandWithWrap = (name, config, handler, completionMessage) => Command.make(name, { ...config, wo: WrapAsOption, wa: WrapAsArg }, Effect.fn("effa-cli.withWrapHandler")(function* (_) {
355
+ const { wa, wo, ...cfg } = _;
356
+ if (completionMessage) {
357
+ yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage));
358
+ }
359
+ const wrapOption = Option.orElse(wa, () => wo);
360
+ yield* handler(cfg);
361
+ if (Option.isSome(wrapOption)) {
362
+ const val = Array.isArray(wrapOption.value)
363
+ ? wrapOption.value.join(" ")
364
+ : wrapOption.value;
365
+ yield* Effect.logInfo(`Spawning child command: ${val}`);
366
+ yield* runNodeCommand(val);
367
+ }
368
+ return;
369
+ }, (_) => Effect.scoped(_)));
344
370
  const EffectAppLibsPath = Args
345
371
  .directory({
346
372
  exists: "yes",
@@ -359,7 +385,7 @@ Effect
359
385
  .pipe(Command.withDescription("Remove effect-app file resolutions and restore npm registry packages"));
360
386
  const ue = Command
361
387
  .make("ue", {}, Effect.fn("effa-cli.ue")(function* ({}) {
362
- yield* Effect.log("Update effect-app and/or effect packages");
388
+ yield* Effect.logInfo("Update effect-app and/or effect packages");
363
389
  const prompted = yield* Prompt.select({
364
390
  choices: [
365
391
  {
@@ -390,20 +416,16 @@ Effect
390
416
  }
391
417
  }))
392
418
  .pipe(Command.withDescription("Update effect-app and/or effect packages"));
393
- const DebugOption = Options.boolean("debug").pipe(Options.withAlias("d"), Options.withDescription("Enable debug logging"));
394
- const watch = Command
395
- .make("watch", { debug: DebugOption }, Effect.fn("effa-cli.watch")(function* ({ debug }) {
396
- return yield* watcher(debug);
397
- }))
419
+ const watch = makeCommandWithWrap("watch", {}, Effect.fn("effa-cli.watch")(function* ({}) {
420
+ return yield* watcher();
421
+ }), "Stopped watching API resources and models")
398
422
  .pipe(Command.withDescription("Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"));
399
- const indexMulti = Command
400
- .make("index-multi", { debug: DebugOption }, Effect.fn("effa-cli.index-multi")(function* ({ debug }) {
401
- yield* Effect.log("Starting multi-index monitoring");
423
+ const indexMulti = makeCommandWithWrap("index-multi", {}, Effect.fn("effa-cli.index-multi")(function* ({}) {
424
+ yield* Effect.logInfo("Starting multi-index monitoring");
402
425
  const dirs = ["./api/src"];
403
- const fileSystem = yield* FileSystem.FileSystem;
404
426
  const existingDirs = [];
405
427
  for (const dir of dirs) {
406
- const dirExists = yield* fileSystem.exists(dir);
428
+ const dirExists = yield* fs.exists(dir);
407
429
  if (dirExists) {
408
430
  existingDirs.push(dir);
409
431
  }
@@ -411,22 +433,17 @@ Effect
411
433
  yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`);
412
434
  }
413
435
  }
414
- if (existingDirs.length === 0) {
415
- return yield* Effect.logWarning("No directories to monitor - exiting");
416
- }
417
- const monitors = existingDirs.map((dir) => monitorIndexes(dir, debug));
436
+ const monitors = existingDirs.map((dir) => monitorIndexes(dir));
418
437
  yield* Effect.all(monitors, { concurrency: monitors.length });
419
- }))
438
+ }), "Stopped multi-index monitoring")
420
439
  .pipe(Command.withDescription("Monitor multiple directories for index and controller file changes"));
421
- const packagejson = Command
422
- .make("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
440
+ const packagejson = makeCommandWithWrap("packagejson", {}, Effect.fn("effa-cli.packagejson")(function* ({}) {
423
441
  // https://nodejs.org/api/path.html#pathresolvepaths
424
442
  const startDir = path.resolve();
425
- return yield* packagejsonUpdater(startDir, ".");
426
- }))
443
+ return yield* monitorPackageJson(startDir, ".");
444
+ }), "Stopped monitoring root package.json exports")
427
445
  .pipe(Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules"));
428
- const packagejsonPackages = Command
429
- .make("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
446
+ const packagejsonPackages = makeCommandWithWrap("packagejson-packages", {}, Effect.fn("effa-cli.packagejson-packages")(function* ({}) {
430
447
  // https://nodejs.org/api/path.html#pathresolvepaths
431
448
  const startDir = path.resolve();
432
449
  const packagesDir = path.join(startDir, "packages");
@@ -449,18 +466,15 @@ Effect
449
466
  validPackages.push(packagePath);
450
467
  }
451
468
  }
452
- if (validPackages.length === 0) {
453
- return yield* Effect.logWarning("No valid packages found to update");
454
- }
455
- yield* Effect.log(`Found ${validPackages.length} packages to update`);
469
+ yield* Effect.logInfo(`Found ${validPackages.length} packages to update`);
456
470
  // update each package sequentially
457
- yield* Effect.all(validPackages.map((packagePath) => Effect.gen(function* () {
471
+ yield* Effect.all(validPackages.map(Effect.fnUntraced(function* (packagePath) {
458
472
  const relativePackagePath = path.relative(startDir, packagePath);
459
- yield* Effect.log(`Updating ${relativePackagePath}`);
460
- return yield* packagejsonUpdater(startDir, relativePackagePath);
473
+ yield* Effect.logInfo(`Updating ${relativePackagePath}`);
474
+ return yield* monitorPackageJson(startDir, relativePackagePath);
461
475
  })));
462
- yield* Effect.log("All packages updated successfully");
463
- }))
476
+ yield* Effect.logInfo("All packages updated successfully");
477
+ }), "Stopped monitoring package.json exports for all packages")
464
478
  .pipe(Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo"));
465
479
  // configure CLI
466
480
  const cli = Command.run(Command
@@ -480,4 +494,4 @@ Effect
480
494
  return yield* cli(process.argv);
481
495
  })()
482
496
  .pipe(Effect.scoped, Effect.provide(NodeContext.layer), NodeRuntime.runMain);
483
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFDakQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFdEMsTUFBTTtLQUNILEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDdkIsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtJQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO0lBQzdCLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLENBQUMsNEJBQTRCLENBQUE7SUFFakU7Ozs7Ozs7T0FPRztJQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVksRUFBRSxFQUFFLENBQ25ELFdBQVc7U0FDUixJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUM7U0FDckIsSUFBSSxDQUNILFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQzdCLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQ2xELFdBQVcsQ0FBQyxRQUFRLENBQ3JCLENBQUE7SUFFTDs7Ozs7OztPQU9HO0lBQ0gsc0RBQXNEO0lBQ3RELGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsYUFBYTtJQUNiLHVDQUF1QztJQUN2Qyx1Q0FBdUM7SUFDdkMsNERBQTREO0lBQzVELDJCQUEyQjtJQUMzQixRQUFRO0lBRVI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxJQUFZO1FBQ3JELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFFdkIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FDckMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNyQyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVU7WUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM5QixDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUN4QixDQUFBO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRjs7O09BR0c7SUFDSCxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDeEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUE7UUFDL0MsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsOEJBQThCLE1BQU0sR0FBRyxDQUFDLENBQUE7WUFDOUQsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLGlDQUFpQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQ25FLENBQUM7SUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBRUo7Ozs7T0FJRztJQUNILE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUNsRixNQUFNLGFBQWEsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUMvRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyw4QkFBOEIsTUFBTSxHQUFHLENBQUMsQ0FBQTtZQUM5RCxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsaUNBQWlDLE1BQU0sR0FBRyxDQUFDLENBQUE7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFSjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBQyxpQkFBeUI7UUFDeEUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1FBRXpELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFBO1FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNwRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7UUFFekMsTUFBTSxXQUFXLEdBQUc7WUFDbEIsR0FBRyxFQUFFLENBQUMsV0FBVztZQUNqQixrQ0FBa0MsRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsZ0NBQWdDO1lBQ2xHLFlBQVksRUFBRSxPQUFPLEdBQUcsaUJBQWlCLEdBQUcsc0JBQXNCO1lBQ2xFLG1CQUFtQixFQUFFLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxpQkFBaUI7WUFDcEUsaUJBQWlCLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixHQUFHLGVBQWU7WUFDaEUsNEJBQTRCLEVBQUUsT0FBTyxHQUFHLGlCQUFpQixHQUFHLDBCQUEwQjtZQUN0RixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLGlCQUFpQixpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztTQUNyRyxDQUFBO1FBRUQsRUFBRSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7UUFFNUIsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBRXJFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUE7SUFDekQsQ0FBQyxDQUFDLENBQUE7SUFFRjs7Ozs7O09BTUc7SUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztRQUNoRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFFM0QsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUE7UUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBQ3BFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtRQUV6QyxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFdBQXFDLENBQUMsQ0FBQyxNQUFNLENBQ3pGLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDZCxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFBRSxPQUFPLEdBQUcsQ0FBQTtZQUMxRixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ1YsT0FBTyxHQUFHLENBQUE7UUFDWixDQUFDLEVBQ0QsRUFBNEIsQ0FDN0IsQ0FBQTtRQUVELEVBQUUsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUE7UUFFcEMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdkUsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO1FBRTFFLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUMvQixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDM0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtJQUVKOzs7Ozs7O09BT0c7SUFDSCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsQ0FDL0UsUUFBUSxDQUFDLEVBQUMsU0FBaUIsRUFBRSxLQUFjO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7UUFFL0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUNBQXVDLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFDM0UsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7UUFFcEUsS0FBSyxDQUFDLENBQUMsV0FBVzthQUNmLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUNmLE1BQU0sQ0FBQyxFQUFFLENBQUMsMENBQTBDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBQyxLQUFLO1lBQ25FLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sWUFBWSxHQUFHLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7WUFFdEUsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTTtZQUV6QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDVCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUE7WUFFNUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxNQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQztxQkFDbkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtnQkFFekUsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFBO2dCQUNsQyxLQUFLLE1BQU0sSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO29CQUM3QyxJQUFJLE1BQU07d0JBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDdEMsQ0FBQztnQkFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDbkIsK0JBQStCLEtBQUssQ0FBQyxJQUFJLG1CQUFtQixhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3ZGLENBQUE7b0JBQ0gsQ0FBQztvQkFFRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNsRSxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsK0JBQStCLFVBQVUsRUFBRSxDQUFDLENBQUE7b0JBQ2xFLE1BQUs7Z0JBQ1AsQ0FBQztnQkFDRCxDQUFDLEVBQUUsQ0FBQTtZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUNGO2FBQ0EsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7SUFDTCxDQUFDLENBQ0YsQ0FBQTtJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLHlDQUF5QyxDQUFDLENBQzdFLFFBQVEsQ0FBQyxFQUFDLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxLQUFjO1FBQzVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7UUFFL0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUNBQXVDLFNBQVMsT0FBTyxTQUFTLEVBQUUsQ0FBQyxDQUFBO1FBQzNGLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRS9DLEtBQUssQ0FBQyxDQUFDLFdBQVc7YUFDZixJQUFJLENBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FDZixNQUFNLENBQUMsRUFBRSxDQUFDLHFEQUFxRCxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBSztZQUM5RSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztnQkFBRSxPQUFNO1lBRTFDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsS0FBSyxDQUFDLElBQUksYUFBYSxTQUFTLEVBQUUsQ0FBQyxDQUFBO1lBQ3BGLENBQUM7WUFFRCxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLFNBQVMsR0FBRyxDQUFDLENBQUE7UUFDM0QsQ0FBQyxDQUFDLENBQ0gsQ0FDRjthQUNBLElBQUksQ0FDSCxNQUFNLENBQUMsVUFBVSxDQUNsQixDQUFBO0lBQ0wsQ0FBQyxDQUNGLENBQUE7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUNyRSxRQUFRLENBQUMsRUFBQyxTQUFpQixFQUFFLEtBQWM7UUFDekMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQTtRQUUvQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM3RSxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQTtRQUV6QyxNQUFNLFFBQVEsR0FBRyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBRXhELElBQUksS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLFNBQVMsaUJBQWlCLENBQUMsQ0FBQTtRQUNqRSxDQUFDO1FBRUQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxRQUFRLENBQUMsTUFBTSxtQkFBbUIsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNsRixDQUFDO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7SUFDL0QsQ0FBQyxDQUNGLENBQUE7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsS0FBYztRQUN6RCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxDQUFDLENBQUE7UUFFL0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFBO1FBQzFELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFBO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7UUFFL0MsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRWpFLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDeEQsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCxNQUFNLFlBQVksR0FBYSxFQUFFLENBQUE7UUFDakMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQy9DLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN4QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsNEJBQTRCLENBQUMsQ0FBQTtZQUN4RSxDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtRQUN0RSxDQUFDO1FBRUQsdURBQXVEO1FBQ3ZELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNsQixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDOUQsQ0FBQztZQUVELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtZQUMxQixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBRTlELEtBQUssQ0FBQyxDQUFDLFdBQVc7aUJBQ2YsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2YsTUFBTSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEtBQUs7Z0JBQ3JELElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7Z0JBQzFFLENBQUM7Z0JBRUQseUNBQXlDO2dCQUN6QyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtnQkFDL0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUE7Z0JBQ2hELENBQUM7Z0JBRUQsK0RBQStEO2dCQUMvRCxJQUNFLGdCQUFnQjt1QkFDYixLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7dUJBQ3ZCLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQzlCLENBQUM7b0JBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO29CQUM1QixJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNWLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtvQkFDakQsQ0FBQztvQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDeEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUNILENBQ0Y7aUJBQ0EsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFVLENBQ2xCLENBQUE7WUFFSCx5REFBeUQ7WUFDekQsS0FBSyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FDSCxDQUFBO1FBRUQscUNBQXFDO1FBQ3JDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZFLENBQUMsQ0FBQyxDQUFBO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQ2pFLFFBQVEsQ0FBQyxFQUFDLFFBQWdCLEVBQUUsQ0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDO1FBQy9DLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFaEQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUU5RSxvREFBb0Q7UUFDcEQsSUFBSSxjQUFjLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUIsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO1lBQ2hGLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNwQyxLQUFLLGNBQWMsSUFBSSxDQUl4QixDQUFBO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNO1lBQ2xDLENBQUMsQ0FBQyxNQUFNO2lCQUNMLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztnQkFDMUIscUZBQXFGO2lCQUNwRixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDN0QsTUFBTSxDQUNMLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUM3RCxFQUE2QixDQUM5QjtZQUNILENBQUMsQ0FBQyxtQkFBbUIsQ0FBQTtRQUV2QixNQUFNLGNBQWMsR0FBRztZQUNyQixHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQzttQkFDdEM7b0JBQ0QsR0FBRyxFQUFFO3dCQUNILE9BQU8sRUFBRSxtQkFBbUI7d0JBQzVCLFNBQVMsRUFBRSxpQkFBaUI7cUJBQzdCO2lCQUNGLENBQUM7WUFDSixHQUFHLE1BQU07aUJBQ04sSUFBSSxDQUFDLHFCQUFxQixDQUFDO2lCQUMzQixNQUFNLENBQ0wsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNkLEdBQUcsSUFBSTtnQkFDUCxpRUFBaUU7Z0JBQ2pFLCtEQUErRDtnQkFDL0QsNkRBQTZEO2dCQUM3RCxHQUFHLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsRUFBRTthQUM3RixDQUFDLEVBQ0YsRUFBNkIsQ0FDOUI7U0FDSixDQUFBO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNsRixPQUFPLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQTtRQUVoQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRTFELE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FDOUIsQ0FBQyxHQUFHLGVBQWUsRUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNqQyxDQUFBO0lBQ0gsQ0FBQyxDQUNGLENBQUE7SUFFRDs7T0FFRztJQUVILE1BQU0saUJBQWlCLEdBQUcsSUFBSTtTQUMzQixTQUFTLENBQUM7UUFDVCxNQUFNLEVBQUUsS0FBSztRQUNiLElBQUksRUFBRSxzQkFBc0I7S0FDN0IsQ0FBQztTQUNELElBQUksQ0FDSCxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLEVBQ3pDLElBQUksQ0FBQyxlQUFlLENBQUMsdUNBQXVDLENBQUMsQ0FDOUQsQ0FBQTtJQUVILE1BQU0sSUFBSSxHQUFHLE9BQU87U0FDakIsSUFBSSxDQUNILE1BQU0sRUFDTixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLEVBQ3hDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRSxpQkFBaUIsRUFBRTtRQUN4RCxPQUFPLEtBQUssQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQy9DLENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFBO0lBRXpGLE1BQU0sTUFBTSxHQUFHLE9BQU87U0FDbkIsSUFBSSxDQUNILFFBQVEsRUFDUixFQUFFLEVBQ0YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUU7UUFDdkMsT0FBTyxLQUFLLENBQUMsQ0FBQyxjQUFjLENBQUE7SUFDOUIsQ0FBQyxDQUFDLENBQ0g7U0FDQSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDLENBQUE7SUFFeEcsTUFBTSxFQUFFLEdBQUcsT0FBTztTQUNmLElBQUksQ0FDSCxJQUFJLEVBQ0osRUFBRSxFQUNGLE1BQU0sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUNuQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUE7UUFFN0QsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNwQyxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsS0FBSyxFQUFFLFlBQVk7b0JBQ25CLFdBQVcsRUFBRSxpQ0FBaUM7b0JBQzlDLEtBQUssRUFBRSxZQUFZO2lCQUNwQjtnQkFDRDtvQkFDRSxLQUFLLEVBQUUsUUFBUTtvQkFDZixXQUFXLEVBQUUsNkJBQTZCO29CQUMxQyxLQUFLLEVBQUUsUUFBUTtpQkFDaEI7Z0JBQ0Q7b0JBQ0UsS0FBSyxFQUFFLE1BQU07b0JBQ2IsV0FBVyxFQUFFLDRDQUE0QztvQkFDekQsS0FBSyxFQUFFLE1BQU07aUJBQ2Q7YUFDRjtZQUNELE9BQU8sRUFBRSxrQkFBa0I7U0FDNUIsQ0FBQyxDQUFBO1FBRUYsUUFBUSxRQUFRLEVBQUUsQ0FBQztZQUNqQixLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQ3hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3pDLENBQUE7WUFFSCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQ3pDLENBQUE7WUFDSCxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsRUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDekMsQ0FBQTtRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQTtJQUU1RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDL0MsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFDdEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUNoRCxDQUFBO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTztTQUNsQixJQUFJLENBQ0gsT0FBTyxFQUNQLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUN0QixNQUFNLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRSxLQUFLLEVBQUU7UUFDN0MsT0FBTyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDOUIsQ0FBQyxDQUFDLENBQ0g7U0FDQSxJQUFJLENBQ0gsT0FBTyxDQUFDLGVBQWUsQ0FDckIsb0dBQW9HLENBQ3JHLENBQ0YsQ0FBQTtJQUVILE1BQU0sVUFBVSxHQUFHLE9BQU87U0FDdkIsSUFBSSxDQUNILGFBQWEsRUFDYixFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFDdEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsS0FBSyxFQUFFO1FBQ25ELEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtRQUVwRCxNQUFNLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzFCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7UUFFL0MsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFBO1FBQ2pDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMvQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLDRCQUE0QixDQUFDLENBQUE7WUFDeEUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLHFDQUFxQyxDQUFDLENBQUE7UUFDeEUsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUN0RSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUMvRCxDQUFDLENBQUMsQ0FDSDtTQUNBLElBQUksQ0FDSCxPQUFPLENBQUMsZUFBZSxDQUNyQixvRUFBb0UsQ0FDckUsQ0FDRixDQUFBO0lBRUgsTUFBTSxXQUFXLEdBQUcsT0FBTztTQUN4QixJQUFJLENBQ0gsYUFBYSxFQUNiLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUM1QyxvREFBb0Q7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRS9CLE9BQU8sS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2pELENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUNILE9BQU8sQ0FBQyxlQUFlLENBQUMscUZBQXFGLENBQUMsQ0FDL0csQ0FBQTtJQUVILE1BQU0sbUJBQW1CLEdBQUcsT0FBTztTQUNoQyxJQUFJLENBQ0gsc0JBQXNCLEVBQ3RCLEVBQUUsRUFDRixNQUFNLENBQUMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUMsRUFBRTtRQUNyRCxvREFBb0Q7UUFDcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBRS9CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBRW5ELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV4RCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUE7UUFFbEMsMkRBQTJEO1FBQzNELEtBQUssTUFBTSxXQUFXLElBQUksV0FBVyxFQUFFLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUE7WUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUE7WUFDbEYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBRWpFLE1BQU0sYUFBYSxHQUFHLEtBQUs7bUJBQ3RCLFdBQVcsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7bUJBQzVDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUUzQyxJQUFJLGlCQUFpQixJQUFJLFNBQVMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyRCxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ2pDLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsYUFBYSxDQUFDLE1BQU0scUJBQXFCLENBQUMsQ0FBQTtRQUVyRSxtQ0FBbUM7UUFDbkMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDbEIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNoRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksbUJBQW1CLEVBQUUsQ0FBQyxDQUFBO1lBQ3BELE9BQU8sS0FBSyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUE7UUFDakUsQ0FBQyxDQUFDLENBQ0gsQ0FDRixDQUFBO1FBRUQsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFBO0lBQ3hELENBQUMsQ0FBQyxDQUNIO1NBQ0EsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQyxDQUFBO0lBRWxILGdCQUFnQjtJQUNoQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUNyQixPQUFPO1NBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQzVCLEVBQUU7UUFDRixJQUFJO1FBQ0osTUFBTTtRQUNOLEtBQUs7UUFDTCxVQUFVO1FBQ1YsV0FBVztRQUNYLG1CQUFtQjtLQUNwQixDQUFDLENBQUMsRUFDTDtRQUNFLElBQUksRUFBRSw2QkFBNkI7UUFDbkMsT0FBTyxFQUFFLFFBQVE7S0FDbEIsQ0FDRixDQUFBO0lBRUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBQ2pDLENBQUMsQ0FBQyxFQUFFO0tBQ0gsSUFBSSxDQUNILE1BQU0sQ0FBQyxNQUFNLEVBQ2IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQ2pDLFdBQVcsQ0FBQyxPQUFPLENBQ3BCLENBQUEifQ==
497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0RBQWtEO0FBQ2xELHFDQUFxQztBQUNyQyw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsT0FBTyxJQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDM0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUloRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFjLE1BQU0sUUFBUSxDQUFBO0FBQ3JFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBRXRDLE1BQU07S0FDSCxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUE7SUFDdkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQTtJQUM3QixNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxDQUFDLDRCQUE0QixDQUFBO0lBRWpFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUE7SUFFOUU7Ozs7Ozs7T0FPRztJQUNILE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVksRUFBRSxFQUFFLENBQ25ELFdBQVc7U0FDUixJQUFJLENBQUMsSUFBSSxF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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect-app/cli",
3
- "version": "1.23.3",
3
+ "version": "1.23.5",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.ts CHANGED
@@ -4,7 +4,10 @@
4
4
  import { Args, Command, Options, Prompt } from "@effect/cli"
5
5
  import { Command as NodeCommand, FileSystem, Path } from "@effect/platform"
6
6
  import { NodeContext, NodeRuntime } from "@effect/platform-node"
7
- import { Effect, identity, Stream } from "effect"
7
+
8
+ import { type CommandExecutor } from "@effect/platform/CommandExecutor"
9
+ import { type PlatformError } from "@effect/platform/Error"
10
+ import { Effect, identity, Option, Stream, type Types } from "effect"
8
11
  import { ExtractExportMappingsService } from "./extract.js"
9
12
  import { packages } from "./shared.js"
10
13
 
@@ -14,6 +17,8 @@ Effect
14
17
  const path = yield* Path.Path
15
18
  const extractExportMappings = yield* ExtractExportMappingsService
16
19
 
20
+ yield* Effect.addFinalizer(() => Effect.logInfo(`CLI has finished executing`))
21
+
17
22
  /**
18
23
  * Executes a shell command using Node.js Command API with inherited stdio streams.
19
24
  * The command is run through the system shell (/bin/sh) for proper command parsing.
@@ -102,7 +107,7 @@ Effect
102
107
  * @returns An Effect that succeeds when linking is complete
103
108
  */
104
109
  const linkPackages = Effect.fnUntraced(function*(effectAppLibsPath: string) {
105
- yield* Effect.log("Linking local effect-app packages...")
110
+ yield* Effect.logInfo("Linking local effect-app packages...")
106
111
 
107
112
  const packageJsonPath = "./package.json"
108
113
  const packageJsonContent = yield* fs.readFileString(packageJsonPath)
@@ -121,11 +126,11 @@ Effect
121
126
  pj.resolutions = resolutions
122
127
 
123
128
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
124
- yield* Effect.log("Updated package.json with local file resolutions")
129
+ yield* Effect.logInfo("Updated package.json with local file resolutions")
125
130
 
126
131
  yield* runNodeCommand("pnpm i")
127
132
 
128
- yield* Effect.log("Successfully linked local packages")
133
+ yield* Effect.logInfo("Successfully linked local packages")
129
134
  })
130
135
 
131
136
  /**
@@ -136,7 +141,7 @@ Effect
136
141
  * @returns An Effect that succeeds when unlinking is complete
137
142
  */
138
143
  const unlinkPackages = Effect.fnUntraced(function*() {
139
- yield* Effect.log("Unlinking local effect-app packages...")
144
+ yield* Effect.logInfo("Unlinking local effect-app packages...")
140
145
 
141
146
  const packageJsonPath = "./package.json"
142
147
  const packageJsonContent = yield* fs.readFileString(packageJsonPath)
@@ -154,10 +159,10 @@ Effect
154
159
  pj.resolutions = filteredResolutions
155
160
 
156
161
  yield* fs.writeFileString(packageJsonPath, JSON.stringify(pj, null, 2))
157
- yield* Effect.log("Removed effect-app file resolutions from package.json")
162
+ yield* Effect.logInfo("Removed effect-app file resolutions from package.json")
158
163
 
159
164
  yield* runNodeCommand("pnpm i")
160
- yield* Effect.log("Successfully unlinked local packages")
165
+ yield* Effect.logInfo("Successfully unlinked local packages")
161
166
  })()
162
167
 
163
168
  /**
@@ -169,14 +174,10 @@ Effect
169
174
  * @returns An Effect that sets up controller file monitoring
170
175
  */
171
176
  const monitorChildIndexes = Effect.fn("effa-cli.index-multi.monitorChildIndexes")(
172
- function*(watchPath: string, debug: boolean) {
173
- const fileSystem = yield* FileSystem.FileSystem
174
-
175
- if (debug) {
176
- yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
177
- }
177
+ function*(watchPath: string) {
178
+ yield* Effect.logInfo(`Starting controller monitoring for: ${watchPath}`)
178
179
 
179
- const watchStream = fileSystem.watch(watchPath, { recursive: true })
180
+ const watchStream = fs.watch(watchPath, { recursive: true })
180
181
 
181
182
  yield* watchStream
182
183
  .pipe(
@@ -197,16 +198,14 @@ Effect
197
198
 
198
199
  const existingFiles: string[] = []
199
200
  for (const file of candidateFiles) {
200
- const exists = yield* fileSystem.exists(file)
201
+ const exists = yield* fs.exists(file)
201
202
  if (exists) existingFiles.push(file)
202
203
  }
203
204
 
204
205
  if (existingFiles.length > 0) {
205
- if (debug) {
206
- yield* Effect.logInfo(
207
- `Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`
208
- )
209
- }
206
+ yield* Effect.logInfo(
207
+ `Controller change detected: ${event.path}, fixing files: ${existingFiles.join(", ")}`
208
+ )
210
209
 
211
210
  const eslintArgs = existingFiles.map((f) => `"../${f}"`).join(" ")
212
211
  yield* runNodeCommand(`cd api && pnpm eslint --fix ${eslintArgs}`)
@@ -218,6 +217,9 @@ Effect
218
217
  )
219
218
  )
220
219
  .pipe(
220
+ Effect.andThen(
221
+ Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring child indexes in: ${watchPath}`))
222
+ ),
221
223
  Effect.forkScoped
222
224
  )
223
225
  }
@@ -233,14 +235,10 @@ Effect
233
235
  * @returns An Effect that sets up root index monitoring
234
236
  */
235
237
  const monitorRootIndexes = Effect.fn("effa-cli.index-multi.monitorRootIndexes")(
236
- function*(watchPath: string, indexFile: string, debug: boolean) {
237
- const fileSystem = yield* FileSystem.FileSystem
238
-
239
- if (debug) {
240
- yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
241
- }
238
+ function*(watchPath: string, indexFile: string) {
239
+ yield* Effect.logInfo(`Starting root index monitoring for: ${watchPath} -> ${indexFile}`)
242
240
 
243
- const watchStream = fileSystem.watch(watchPath)
241
+ const watchStream = fs.watch(watchPath)
244
242
 
245
243
  yield* watchStream
246
244
  .pipe(
@@ -248,15 +246,18 @@ Effect
248
246
  Effect.fn("effa-cli.index-multi.monitorRootIndexes.handleEvent")(function*(event) {
249
247
  if (event.path.endsWith(indexFile)) return
250
248
 
251
- if (debug) {
252
- yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
253
- }
249
+ yield* Effect.logInfo(`Root change detected: ${event.path}, fixing: ${indexFile}`)
254
250
 
255
251
  yield* runNodeCommand(`pnpm eslint --fix "${indexFile}"`)
256
252
  })
257
253
  )
258
254
  )
259
255
  .pipe(
256
+ Effect.andThen(
257
+ Effect.addFinalizer(() =>
258
+ Effect.logInfo(`Stopped monitoring root indexes in: ${watchPath} -> ${indexFile}`)
259
+ )
260
+ ),
260
261
  Effect.forkScoped
261
262
  )
262
263
  }
@@ -271,26 +272,20 @@ Effect
271
272
  * @returns An Effect that sets up all index monitoring for the path
272
273
  */
273
274
  const monitorIndexes = Effect.fn("effa-cli.index-multi.monitorIndexes")(
274
- function*(watchPath: string, debug: boolean) {
275
- const fileSystem = yield* FileSystem.FileSystem
276
-
277
- if (debug) {
278
- yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
279
- }
275
+ function*(watchPath: string) {
276
+ yield* Effect.logInfo(`Setting up index monitoring for path: ${watchPath}`)
280
277
 
281
278
  const indexFile = watchPath + "/index.ts"
282
279
 
283
- const monitors = [monitorChildIndexes(watchPath, debug)]
280
+ const monitors = [monitorChildIndexes(watchPath)]
284
281
 
285
- if (yield* fileSystem.exists(indexFile)) {
286
- monitors.push(monitorRootIndexes(watchPath, indexFile, debug))
282
+ if (yield* fs.exists(indexFile)) {
283
+ monitors.push(monitorRootIndexes(watchPath, indexFile))
287
284
  } else {
288
285
  yield* Effect.logInfo(`Index file ${indexFile} does not exist`)
289
286
  }
290
287
 
291
- if (debug) {
292
- yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
293
- }
288
+ yield* Effect.logInfo(`Starting ${monitors.length} monitor(s) for ${watchPath}`)
294
289
 
295
290
  yield* Effect.all(monitors, { concurrency: monitors.length })
296
291
  }
@@ -302,23 +297,20 @@ Effect
302
297
  *
303
298
  * @returns An Effect that sets up file watching streams
304
299
  */
305
- const watcher = Effect.fn("watch")(function*(debug: boolean) {
306
- yield* Effect.log("Watch API resources and models for changes")
300
+ const watcher = Effect.fn("watch")(function*() {
301
+ yield* Effect.logInfo("Watch API resources and models for changes")
307
302
 
308
303
  const dirs = ["../api/src/resources", "../api/src/models"]
309
304
  const viteConfigFile = "./vite.config.ts"
310
- const fileSystem = yield* FileSystem.FileSystem
311
305
 
312
- const viteConfigExists = yield* fileSystem.exists(viteConfigFile)
306
+ const viteConfigExists = yield* fs.exists(viteConfigFile)
313
307
 
314
- if (debug) {
315
- yield* Effect.logInfo("watcher debug mode is enabled")
316
- }
308
+ yield* Effect.logInfo("watcher debug mode is enabled")
317
309
 
318
310
  // validate directories and filter out non-existing ones
319
311
  const existingDirs: string[] = []
320
312
  for (const dir of dirs) {
321
- const dirExists = yield* fileSystem.exists(dir)
313
+ const dirExists = yield* fs.exists(dir)
322
314
  if (dirExists) {
323
315
  existingDirs.push(dir)
324
316
  } else {
@@ -326,33 +318,24 @@ Effect
326
318
  }
327
319
  }
328
320
 
329
- if (existingDirs.length === 0) {
330
- return yield* Effect.logWarning("No directories to watch - exiting")
331
- }
332
-
333
321
  // start watching all existing directories concurrently
334
322
  const watchStreams = existingDirs.map((dir) =>
335
323
  Effect.gen(function*() {
336
- if (debug) {
337
- yield* Effect.logInfo(`Starting to watch directory: ${dir}`)
338
- }
324
+ yield* Effect.logInfo(`Starting to watch directory: ${dir}`)
339
325
 
340
326
  const files: string[] = []
341
- const watchStream = fileSystem.watch(dir, { recursive: true })
327
+ const watchStream = fs.watch(dir, { recursive: true })
342
328
 
343
329
  yield* watchStream
344
330
  .pipe(
345
331
  Stream.runForEach(
346
332
  Effect.fn("effa-cli.watch.handleEvent")(function*(event) {
347
- if (debug) {
348
- yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`)
349
- }
333
+ yield* Effect.logInfo(`File ${event._tag.toLowerCase()}: ${event.path}`)
350
334
 
351
335
  // touch tsconfig.json on any file change
352
336
  yield* touch("./tsconfig.json")
353
- if (debug) {
354
- yield* Effect.logInfo("Updated tsconfig.json")
355
- }
337
+
338
+ yield* Effect.logInfo("Updated tsconfig.json")
356
339
 
357
340
  // touch vite config only on file updates (not creates/deletes)
358
341
  if (
@@ -361,20 +344,23 @@ Effect
361
344
  && !files.includes(event.path)
362
345
  ) {
363
346
  yield* touch(viteConfigFile)
364
- if (debug) {
365
- yield* Effect.logInfo("Updated vite.config.ts")
366
- }
347
+
348
+ yield* Effect.logInfo("Updated vite.config.ts")
349
+
367
350
  files.push(event.path)
368
351
  }
369
352
  })
370
353
  )
371
354
  )
372
355
  .pipe(
356
+ Effect.andThen(
357
+ Effect.addFinalizer(() => Effect.logInfo(`Stopped watching directory: ${dir}`))
358
+ ),
373
359
  Effect.forkScoped
374
360
  )
375
361
 
376
362
  // also start monitoring indexes in the watched directory
377
- yield* monitorIndexes(dir, debug)
363
+ yield* monitorIndexes(dir)
378
364
  })
379
365
  )
380
366
 
@@ -394,13 +380,13 @@ Effect
394
380
  */
395
381
  const packagejsonUpdater = Effect.fn("effa-cli.packagejsonUpdater")(
396
382
  function*(startDir: string, p: string, levels = 0) {
397
- yield* Effect.log(`Generating exports for ${p}`)
383
+ yield* Effect.logInfo(`Generating exports for ${p}`)
398
384
 
399
385
  const exportMappings = yield* extractExportMappings(path.resolve(startDir, p))
400
386
 
401
387
  // if exportMappings is empty skip export generation
402
388
  if (exportMappings === "") {
403
- yield* Effect.log(`No src directory found for ${p}, skipping export generation`)
389
+ yield* Effect.logInfo(`No src directory found for ${p}, skipping export generation`)
404
390
  return
405
391
  }
406
392
 
@@ -447,7 +433,7 @@ Effect
447
433
  const pkgJson = JSON.parse(yield* fs.readFileString(p + "/package.json", "utf-8"))
448
434
  pkgJson.exports = packageExports
449
435
 
450
- yield* Effect.log(`Writing updated package.json for ${p}`)
436
+ yield* Effect.logInfo(`Writing updated package.json for ${p}`)
451
437
 
452
438
  return yield* fs.writeFileString(
453
439
  p + "/package.json",
@@ -456,10 +442,118 @@ Effect
456
442
  }
457
443
  )
458
444
 
445
+ /**
446
+ * Monitors a directory for TypeScript file changes and automatically updates package.json exports.
447
+ * Generates initial package.json exports, then watches the src directory for changes to regenerate exports.
448
+ *
449
+ * @param watchPath - The directory path containing the package.json and src to monitor
450
+ * @param levels - Optional depth limit for export filtering (0 = no limit)
451
+ * @returns An Effect that sets up package.json monitoring
452
+ */
453
+ const monitorPackageJson = Effect.fn("effa-cli.monitorPackageJson")(
454
+ function*(startDir: string, watchPath: string, levels = 0) {
455
+ yield* packagejsonUpdater(startDir, watchPath, levels)
456
+
457
+ const srcPath = watchPath === "." ? "./src" : `${watchPath}/src`
458
+
459
+ if (!(yield* fs.exists(srcPath))) {
460
+ yield* Effect.logWarning(`Source directory ${srcPath} does not exist - skipping monitoring`)
461
+ return
462
+ }
463
+
464
+ const watchStream = fs.watch(srcPath, { recursive: true })
465
+
466
+ yield* watchStream.pipe(
467
+ Stream.runForEach(
468
+ Effect.fn("effa-cli.monitorPackageJson.handleEvent")(function*(_) {
469
+ yield* packagejsonUpdater(startDir, watchPath, levels)
470
+ })
471
+ ),
472
+ Effect.andThen(
473
+ Effect.addFinalizer(() => Effect.logInfo(`Stopped monitoring package.json for: ${watchPath}`))
474
+ ),
475
+ Effect.forkScoped
476
+ )
477
+ }
478
+ )
479
+
459
480
  /*
460
481
  * CLI
461
482
  */
462
483
 
484
+ const WrapAsOption = Options.text("wrap").pipe(
485
+ Options.withAlias("w"),
486
+ Options.optional,
487
+ Options.withDescription(
488
+ "Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
489
+ )
490
+ )
491
+
492
+ // has prio over WrapAsOption
493
+ const WrapAsArg = Args
494
+ .text({
495
+ name: "wrap"
496
+ })
497
+ .pipe(
498
+ Args.atLeast(1),
499
+ Args.optional,
500
+ Args.withDescription(
501
+ "Wrap child bash command: the lifetime of the CLI command will be tied to the child process"
502
+ )
503
+ )
504
+
505
+ /**
506
+ * Creates a command that automatically includes wrap functionality for executing child bash commands.
507
+ * Combines both option-based (--wrap) and argument-based wrap parameters, giving priority to arguments.
508
+ * If a wrap command is provided, it will be executed **after** the main command handler.
509
+ *
510
+ * @param name - The command name
511
+ * @param config - The command configuration (options, args, etc.)
512
+ * @param handler - The main command handler function
513
+ * @param completionMessage - Optional message to log when the command completes
514
+ * @returns A Command with integrated wrap functionality
515
+ */
516
+ const makeCommandWithWrap = <Name extends string, const Config extends Command.Command.Config, R, E>(
517
+ name: Name,
518
+ config: Config,
519
+ handler: (_: Types.Simplify<Command.Command.ParseConfig<Config>>) => Effect.Effect<void, E, R>,
520
+ completionMessage?: string
521
+ ): Command.Command<
522
+ Name,
523
+ CommandExecutor | R,
524
+ PlatformError | E,
525
+ Types.Simplify<Command.Command.ParseConfig<Config>>
526
+ > =>
527
+ Command.make(
528
+ name,
529
+ { ...config, wo: WrapAsOption, wa: WrapAsArg },
530
+ Effect.fn("effa-cli.withWrapHandler")(function*(_) {
531
+ const { wa, wo, ...cfg } = _ as unknown as {
532
+ wo: Option.Option<string>
533
+ wa: Option.Option<[string, ...string[]]>
534
+ } & Types.Simplify<Command.Command.ParseConfig<Config>>
535
+
536
+ if (completionMessage) {
537
+ yield* Effect.addFinalizer(() => Effect.logInfo(completionMessage))
538
+ }
539
+
540
+ const wrapOption = Option.orElse(wa, () => wo)
541
+
542
+ yield* handler(cfg as any)
543
+
544
+ if (Option.isSome(wrapOption)) {
545
+ const val = Array.isArray(wrapOption.value)
546
+ ? wrapOption.value.join(" ")
547
+ : wrapOption.value
548
+
549
+ yield* Effect.logInfo(`Spawning child command: ${val}`)
550
+ yield* runNodeCommand(val)
551
+ }
552
+
553
+ return
554
+ }, (_) => Effect.scoped(_))
555
+ )
556
+
463
557
  const EffectAppLibsPath = Args
464
558
  .directory({
465
559
  exists: "yes",
@@ -495,7 +589,7 @@ Effect
495
589
  "ue",
496
590
  {},
497
591
  Effect.fn("effa-cli.ue")(function*({}) {
498
- yield* Effect.log("Update effect-app and/or effect packages")
592
+ yield* Effect.logInfo("Update effect-app and/or effect packages")
499
593
 
500
594
  const prompted = yield* Prompt.select({
501
595
  choices: [
@@ -538,130 +632,118 @@ Effect
538
632
  )
539
633
  .pipe(Command.withDescription("Update effect-app and/or effect packages"))
540
634
 
541
- const DebugOption = Options.boolean("debug").pipe(
542
- Options.withAlias("d"),
543
- Options.withDescription("Enable debug logging")
635
+ const watch = makeCommandWithWrap(
636
+ "watch",
637
+ {},
638
+ Effect.fn("effa-cli.watch")(function*({}) {
639
+ return yield* watcher()
640
+ }),
641
+ "Stopped watching API resources and models"
544
642
  )
545
-
546
- const watch = Command
547
- .make(
548
- "watch",
549
- { debug: DebugOption },
550
- Effect.fn("effa-cli.watch")(function*({ debug }) {
551
- return yield* watcher(debug)
552
- })
553
- )
554
643
  .pipe(
555
644
  Command.withDescription(
556
645
  "Watch API resources and models for changes and update tsconfig.json and vite.config.ts accordingly"
557
646
  )
558
647
  )
559
648
 
560
- const indexMulti = Command
561
- .make(
562
- "index-multi",
563
- { debug: DebugOption },
564
- Effect.fn("effa-cli.index-multi")(function*({ debug }) {
565
- yield* Effect.log("Starting multi-index monitoring")
566
-
567
- const dirs = ["./api/src"]
568
- const fileSystem = yield* FileSystem.FileSystem
569
-
570
- const existingDirs: string[] = []
571
- for (const dir of dirs) {
572
- const dirExists = yield* fileSystem.exists(dir)
573
- if (dirExists) {
574
- existingDirs.push(dir)
575
- } else {
576
- yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
577
- }
578
- }
579
-
580
- if (existingDirs.length === 0) {
581
- return yield* Effect.logWarning("No directories to monitor - exiting")
649
+ const indexMulti = makeCommandWithWrap(
650
+ "index-multi",
651
+ {},
652
+ Effect.fn("effa-cli.index-multi")(function*({}) {
653
+ yield* Effect.logInfo("Starting multi-index monitoring")
654
+
655
+ const dirs = ["./api/src"]
656
+
657
+ const existingDirs: string[] = []
658
+ for (const dir of dirs) {
659
+ const dirExists = yield* fs.exists(dir)
660
+ if (dirExists) {
661
+ existingDirs.push(dir)
662
+ } else {
663
+ yield* Effect.logWarning(`Directory ${dir} does not exist - skipping`)
582
664
  }
665
+ }
583
666
 
584
- const monitors = existingDirs.map((dir) => monitorIndexes(dir, debug))
585
- yield* Effect.all(monitors, { concurrency: monitors.length })
586
- })
587
- )
667
+ const monitors = existingDirs.map((dir) => monitorIndexes(dir))
668
+ yield* Effect.all(monitors, { concurrency: monitors.length })
669
+ }),
670
+ "Stopped multi-index monitoring"
671
+ )
588
672
  .pipe(
589
673
  Command.withDescription(
590
674
  "Monitor multiple directories for index and controller file changes"
591
675
  )
592
676
  )
593
677
 
594
- const packagejson = Command
595
- .make(
596
- "packagejson",
597
- {},
598
- Effect.fn("effa-cli.packagejson")(function*({}) {
599
- // https://nodejs.org/api/path.html#pathresolvepaths
600
- const startDir = path.resolve()
678
+ const packagejson = makeCommandWithWrap(
679
+ "packagejson",
680
+ {},
681
+ Effect.fn("effa-cli.packagejson")(function*({}) {
682
+ // https://nodejs.org/api/path.html#pathresolvepaths
683
+ const startDir = path.resolve()
601
684
 
602
- return yield* packagejsonUpdater(startDir, ".")
603
- })
604
- )
685
+ return yield* monitorPackageJson(startDir, ".")
686
+ }),
687
+ "Stopped monitoring root package.json exports"
688
+ )
605
689
  .pipe(
606
690
  Command.withDescription("Generate and update root-level package.json exports mappings for TypeScript modules")
607
691
  )
608
692
 
609
- const packagejsonPackages = Command
610
- .make(
611
- "packagejson-packages",
612
- {},
613
- Effect.fn("effa-cli.packagejson-packages")(function*({}) {
614
- // https://nodejs.org/api/path.html#pathresolvepaths
615
- const startDir = path.resolve()
693
+ const packagejsonPackages = makeCommandWithWrap(
694
+ "packagejson-packages",
695
+ {},
696
+ Effect.fn("effa-cli.packagejson-packages")(function*({}) {
697
+ // https://nodejs.org/api/path.html#pathresolvepaths
698
+ const startDir = path.resolve()
616
699
 
617
- const packagesDir = path.join(startDir, "packages")
700
+ const packagesDir = path.join(startDir, "packages")
618
701
 
619
- const packagesExists = yield* fs.exists(packagesDir)
620
- if (!packagesExists) {
621
- return yield* Effect.logWarning("No packages directory found")
622
- }
623
-
624
- // get all package directories
625
- const packageDirs = yield* fs.readDirectory(packagesDir)
702
+ const packagesExists = yield* fs.exists(packagesDir)
703
+ if (!packagesExists) {
704
+ return yield* Effect.logWarning("No packages directory found")
705
+ }
626
706
 
627
- const validPackages: string[] = []
707
+ // get all package directories
708
+ const packageDirs = yield* fs.readDirectory(packagesDir)
628
709
 
629
- // filter packages that have package.json and src directory
630
- for (const packageName of packageDirs) {
631
- const packagePath = path.join(packagesDir, packageName)
632
- const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json"))
633
- const srcExists = yield* fs.exists(path.join(packagePath, "src"))
710
+ const validPackages: string[] = []
634
711
 
635
- const shouldExclude = false
636
- || packageName.endsWith("eslint-codegen-model")
637
- || packageName.endsWith("vue-components")
712
+ // filter packages that have package.json and src directory
713
+ for (const packageName of packageDirs) {
714
+ const packagePath = path.join(packagesDir, packageName)
715
+ const packageJsonExists = yield* fs.exists(path.join(packagePath, "package.json"))
716
+ const srcExists = yield* fs.exists(path.join(packagePath, "src"))
638
717
 
639
- if (packageJsonExists && srcExists && !shouldExclude) {
640
- validPackages.push(packagePath)
641
- }
642
- }
718
+ const shouldExclude = false
719
+ || packageName.endsWith("eslint-codegen-model")
720
+ || packageName.endsWith("vue-components")
643
721
 
644
- if (validPackages.length === 0) {
645
- return yield* Effect.logWarning("No valid packages found to update")
722
+ if (packageJsonExists && srcExists && !shouldExclude) {
723
+ validPackages.push(packagePath)
646
724
  }
725
+ }
647
726
 
648
- yield* Effect.log(`Found ${validPackages.length} packages to update`)
727
+ yield* Effect.logInfo(`Found ${validPackages.length} packages to update`)
649
728
 
650
- // update each package sequentially
651
- yield* Effect.all(
652
- validPackages.map((packagePath) =>
653
- Effect.gen(function*() {
654
- const relativePackagePath = path.relative(startDir, packagePath)
655
- yield* Effect.log(`Updating ${relativePackagePath}`)
656
- return yield* packagejsonUpdater(startDir, relativePackagePath)
657
- })
658
- )
729
+ // update each package sequentially
730
+ yield* Effect.all(
731
+ validPackages.map(
732
+ Effect.fnUntraced(function*(packagePath) {
733
+ const relativePackagePath = path.relative(startDir, packagePath)
734
+ yield* Effect.logInfo(`Updating ${relativePackagePath}`)
735
+ return yield* monitorPackageJson(startDir, relativePackagePath)
736
+ })
659
737
  )
738
+ )
660
739
 
661
- yield* Effect.log("All packages updated successfully")
662
- })
740
+ yield* Effect.logInfo("All packages updated successfully")
741
+ }),
742
+ "Stopped monitoring package.json exports for all packages"
743
+ )
744
+ .pipe(
745
+ Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo")
663
746
  )
664
- .pipe(Command.withDescription("Generate and update package.json exports mappings for all packages in monorepo"))
665
747
 
666
748
  // configure CLI
667
749
  const cli = Command.run(