@decohere/flux 0.0.1-dev.74 → 0.0.1-dev.76

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.
@@ -23,8 +23,8 @@ export class HotReloadServer extends EventEmitter {
23
23
  logger = scribe.logger(HotReloadServer.name);
24
24
  disposed = false;
25
25
  hooksRegistered = false;
26
- entryModulePath;
27
- entryModule;
26
+ /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
27
+ pendingEntryReboots = new Set();
28
28
  workspace;
29
29
  buildConfig = "debug";
30
30
  watchSubscription;
@@ -47,6 +47,8 @@ export class HotReloadServer extends EventEmitter {
47
47
  this.dependencies.clear();
48
48
  this.moduleCache.clear();
49
49
  this.transpileCache.clear();
50
+ this.entries.clear();
51
+ this.pendingEntryReboots.clear();
50
52
  this.rebootTail = Promise.resolve();
51
53
  this.rebootInFlight = false;
52
54
  this.rebootFollowUp = false;
@@ -55,16 +57,25 @@ export class HotReloadServer extends EventEmitter {
55
57
  const { buildConfig } = options;
56
58
  this.buildConfig = buildConfig;
57
59
  this.workspace = await this.resolveWorkspace(options);
58
- const project = this.resolveProject(buildConfig, options.project);
59
- this.entryModulePath = path.resolve(project.getSourceEntryPath());
60
+ const selected = this.resolveProjects(buildConfig, options);
61
+ for (const project of selected){
62
+ const entryPath = path.resolve(project.getSourceEntryPath());
63
+ this.entries.set(entryPath, {
64
+ path: entryPath
65
+ });
66
+ }
60
67
  this.fileInfoMap = await this.buildFileInfoMap(buildConfig);
61
68
  this.aliasPaths = await this.buildAliasPaths();
62
69
  this.registerHooks();
63
70
  this.invalidateAllSourceFiles();
64
71
  await this.workspace.watch(buildConfig);
65
72
  this.watchSubscription = this.workspace.projectFileChanged$.subscribe(this.onFileChange);
66
- this.logger.trace(`Serving ${this.entryModulePath}`);
67
- await this.bootEntry();
73
+ for (const entry of this.entries.values()){
74
+ this.logger.trace(`Serving ${entry.path}`);
75
+ }
76
+ await this.bootEntries([
77
+ ...this.entries.keys()
78
+ ]);
68
79
  this.emit("start");
69
80
  }
70
81
  async dispose() {
@@ -74,18 +85,25 @@ export class HotReloadServer extends EventEmitter {
74
85
  this.watchSubscription?.unsubscribe();
75
86
  this.workspace?.[Symbol.dispose]();
76
87
  await this.rebootTail;
77
- await this.disposeEntry();
88
+ await this.disposeEntries([
89
+ ...this.entries.keys()
90
+ ]);
78
91
  }
79
92
  async [Symbol.asyncDispose]() {
80
93
  await this.dispose();
81
94
  }
82
95
  // ── Lifecycle ────────────────────────────────────────────────────────────
83
- async bootEntry() {
96
+ async bootEntries(entryPaths) {
97
+ await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
98
+ }
99
+ async bootEntry(entryPath) {
100
+ const state = this.entries.get(entryPath);
101
+ if (state == null) return;
84
102
  try {
85
- const url = this.versionModule(io.pathToFileUrl(this.entryModulePath));
86
- this.entryModule = (await import(url))?.default;
103
+ const url = this.versionModule(io.pathToFileUrl(entryPath));
104
+ state.module = (await import(url))?.default;
87
105
  } catch (error) {
88
- this.entryModule = undefined;
106
+ state.module = undefined;
89
107
  this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
90
108
  }
91
109
  }
@@ -114,9 +132,15 @@ export class HotReloadServer extends EventEmitter {
114
132
  do {
115
133
  this.rebootFollowUp = false;
116
134
  if (this.disposed) return;
117
- this.logger.trace("Rebooting entry module");
118
- await this.disposeEntry();
119
- await this.bootEntry();
135
+ const toReboot = this.pendingEntryReboots.size > 0 ? [
136
+ ...this.pendingEntryReboots
137
+ ] : [
138
+ ...this.entries.keys()
139
+ ];
140
+ this.pendingEntryReboots.clear();
141
+ this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
142
+ await this.disposeEntries(toReboot);
143
+ await this.bootEntries(toReboot);
120
144
  this.emit("reboot");
121
145
  }while (this.rebootFollowUp && !this.disposed)
122
146
  } finally{
@@ -126,13 +150,25 @@ export class HotReloadServer extends EventEmitter {
126
150
  if (needsFollowUp) this.requestReboot();
127
151
  }
128
152
  }
129
- async disposeEntry() {
130
- const entry = this.entryModule;
131
- this.entryModule = undefined;
132
- try {
133
- await entry?.[Symbol.asyncDispose]();
134
- } catch (error) {
135
- this.logger.error("Entry asyncDispose failed", error);
153
+ async disposeEntries(entryPaths) {
154
+ await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
155
+ }
156
+ async disposeEntry(entryPath) {
157
+ const paths = entryPath != null ? [
158
+ entryPath
159
+ ] : [
160
+ ...this.entries.keys()
161
+ ];
162
+ for (const p of paths){
163
+ const state = this.entries.get(p);
164
+ if (state == null) continue;
165
+ const entry = state.module;
166
+ state.module = undefined;
167
+ try {
168
+ await entry?.[Symbol.asyncDispose]();
169
+ } catch (error) {
170
+ this.logger.error("Entry asyncDispose failed", error);
171
+ }
136
172
  }
137
173
  }
138
174
  // ── Setup ────────────────────────────────────────────────────────────────
@@ -142,13 +178,29 @@ export class HotReloadServer extends EventEmitter {
142
178
  rootDir: process.cwd()
143
179
  });
144
180
  }
145
- resolveProject(buildConfig, name) {
181
+ resolveProjects(buildConfig, options) {
146
182
  const projects = this.workspace?.getProjects(buildConfig) ?? [];
147
- const found = name == null ? projects.at(0) : projects.find((p)=>p.name === name);
148
- if (found == null) {
149
- throw new Error(name == null ? `No projects found for configuration: ${buildConfig}` : `Project "${name}" not found in workspace`);
183
+ const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
184
+ options.project
185
+ ] : undefined;
186
+ if (names == null) {
187
+ const first = projects.at(0);
188
+ if (first == null) {
189
+ throw new Error(`No projects found for configuration: ${buildConfig}`);
190
+ }
191
+ return [
192
+ first
193
+ ];
150
194
  }
151
- return found;
195
+ const selected = [];
196
+ for (const name of names){
197
+ const found = projects.find((p)=>p.name === name);
198
+ if (found == null) {
199
+ throw new Error(`Project "${name}" not found in workspace`);
200
+ }
201
+ selected.push(found);
202
+ }
203
+ return selected;
152
204
  }
153
205
  async buildFileInfoMap(buildConfig) {
154
206
  const projects = this.workspace?.getProjects(buildConfig) ?? [];
@@ -296,12 +348,18 @@ export class HotReloadServer extends EventEmitter {
296
348
  fullPath
297
349
  ])
298
350
  ];
299
- if (!modules.includes(this.entryModulePath)) {
351
+ const affectedEntries = [
352
+ ...this.entries.keys()
353
+ ].filter((entryPath)=>modules.includes(entryPath));
354
+ if (affectedEntries.length === 0) {
300
355
  this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
301
356
  return false;
302
357
  }
303
358
  this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
304
359
  this.invalidateModule(...modules);
360
+ for (const entryPath of affectedEntries){
361
+ this.pendingEntryReboots.add(entryPath);
362
+ }
305
363
  this.scheduleReboot();
306
364
  return true;
307
365
  }
@@ -382,4 +440,4 @@ export class HotReloadServer extends EventEmitter {
382
440
  }
383
441
  }
384
442
 
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGFuY2UgdG8gdXNlIGluc3RlYWQgb2YgcnVubmluZyBXb3Jrc3BhY2VGYWN0b3J5LlxuXHQgKiBVc2VmdWwgaW4gdGVzdHMgdG8gYnlwYXNzIGZpbGVzeXN0ZW0tYmFzZWQgd29ya3NwYWNlIGRpc2NvdmVyeS5cblx0ICovXG5cdHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0LyoqXG5cdCAqIFF1aWV0IHdpbmRvdyBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGxhc3QgYWZmZWN0aW5nIHNhdmUgYmVmb3JlIGEgcmVib290LlxuXHQgKiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVN9LiBSYWlzZSB0aGlzIGZvciBhZ2VudCBzYXZlIHRyYWlucy5cblx0ICovXG5cdHJlYm9vdERlYm91bmNlTXM/OiBudW1iZXI7XG59XG5cbnR5cGUgRmlsZUluZm8gPSB7IHByb2plY3Q6IFByb2plY3QgfTtcblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0Ly8g4pSA4pSAIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXHRwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihIb3RSZWxvYWRTZXJ2ZXIubmFtZSk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBob29rc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblx0cHJpdmF0ZSBlbnRyeU1vZHVsZVBhdGghOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnlNb2R1bGU/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdHByaXZhdGUgd29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHRwcml2YXRlIGJ1aWxkQ29uZmlnID0gXCJkZWJ1Z1wiO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHQvKiogTWFwIGZyb20gYWJzb2x1dGUgLnRzIHNvdXJjZSBmaWxlIHBhdGggdG8gcHJvamVjdCBpbmZvICovXG5cdHByaXZhdGUgZmlsZUluZm9NYXAgPSBuZXcgTWFwPHN0cmluZywgRmlsZUluZm8+KCk7XG5cdHByaXZhdGUgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblx0cHJpdmF0ZSBkZXBlbmRlbmNpZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cdHByaXZhdGUgdHJhbnNwaWxlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZXIgPSBuZXcgU3djVHJhbnNwaWxlcigpO1xuXHRwcml2YXRlIGFsaWFzUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXHRwcml2YXRlIGFsaWFzQmFzZVVybCA9IHBhdGgucmVzb2x2ZShcIi5cIik7XG5cdHByaXZhdGUgcmVib290VGFpbDogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRwcml2YXRlIHJlYm9vdERlYm91bmNlR2VuID0gMDtcblx0cHJpdmF0ZSByZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdHByaXZhdGUgcmVib290UXVldWVkID0gZmFsc2U7XG5cdHByaXZhdGUgc2NoZWR1bGVSZWJvb3Q6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuXHQvLyDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwdWJsaWMgYXN5bmMgc3RhcnQob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucykge1xuXHRcdHRoaXMuZGlzcG9zZWQgPSBmYWxzZTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5jbGVhcigpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuY2xlYXIoKTtcblx0XHR0aGlzLnRyYW5zcGlsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdHRoaXMuYmluZFNjaGVkdWxlUmVib290KHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKG9wdGlvbnMucmVib290RGVib3VuY2VNcykpO1xuXG5cdFx0Y29uc3QgeyBidWlsZENvbmZpZyB9ID0gb3B0aW9ucztcblx0XHR0aGlzLmJ1aWxkQ29uZmlnID0gYnVpbGRDb25maWc7XG5cdFx0dGhpcy53b3Jrc3BhY2UgPSBhd2FpdCB0aGlzLnJlc29sdmVXb3Jrc3BhY2Uob3B0aW9ucyk7XG5cdFx0Y29uc3QgcHJvamVjdCA9IHRoaXMucmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWcsIG9wdGlvbnMucHJvamVjdCk7XG5cblx0XHR0aGlzLmVudHJ5TW9kdWxlUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0LmdldFNvdXJjZUVudHJ5UGF0aCgpKTtcblx0XHR0aGlzLmZpbGVJbmZvTWFwID0gYXdhaXQgdGhpcy5idWlsZEZpbGVJbmZvTWFwKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLmFsaWFzUGF0aHMgPSBhd2FpdCB0aGlzLmJ1aWxkQWxpYXNQYXRocygpO1xuXG5cdFx0dGhpcy5yZWdpc3Rlckhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblxuXHRcdGF3YWl0IHRoaXMud29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy53b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHt0aGlzLmVudHJ5TW9kdWxlUGF0aH1gKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHR0aGlzLndvcmtzcGFjZT8uW1N5bWJvbC5kaXNwb3NlXSgpO1xuXHRcdGF3YWl0IHRoaXMucmVib290VGFpbDtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8vIOKUgOKUgCBMaWZlY3ljbGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGVQYXRoKSk7XG5cdFx0XHR0aGlzLmVudHJ5TW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFxuXHRcdFx0XHRcIlRoZXJlIHdhcyBhbiBlcnJvciBib290aW5nIHRoZSBlbnRyeSBwb2ludC4gWW91ciBhcHBsaWNhdGlvbiBtYXkgbm90IGZ1bmN0aW9uIGFzIGV4cGVjdGVkXCIsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGJpbmRTY2hlZHVsZVJlYm9vdChkZWxheU1zOiBudW1iZXIpIHtcblx0XHRjb25zdCBnZW4gPSArK3RoaXMucmVib290RGVib3VuY2VHZW47XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkIHx8IGdlbiAhPT0gdGhpcy5yZWJvb3REZWJvdW5jZUdlbikgcmV0dXJuO1xuXHRcdFx0dGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fSwgZGVsYXlNcyk7XG5cdH1cblxuXHRwcml2YXRlIHJlcXVlc3RSZWJvb3QoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRpZiAodGhpcy5yZWJvb3RJbkZsaWdodCkge1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IHRydWU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmICh0aGlzLnJlYm9vdFF1ZXVlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSB0aGlzLnJlYm9vdFRhaWwudGhlbihcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1blJlYm9vdCgpIHtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IHRydWU7XG5cdFx0dHJ5IHtcblx0XHRcdGRvIHtcblx0XHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcIlJlYm9vdGluZyBlbnRyeSBtb2R1bGVcIik7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdFx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHRcdH0gd2hpbGUgKHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQpO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRjb25zdCBuZWVkc0ZvbGxvd1VwID0gdGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZDtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHRcdGlmIChuZWVkc0ZvbGxvd1VwKSB0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeSgpIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZW50cnlNb2R1bGU7XG5cdFx0dGhpcy5lbnRyeU1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcIkVudHJ5IGFzeW5jRGlzcG9zZSBmYWlsZWRcIiwgZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBTZXR1cCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVXb3Jrc3BhY2Uob3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb21pc2U8V29ya3NwYWNlPiB7XG5cdFx0cmV0dXJuIChcblx0XHRcdG9wdGlvbnMud29ya3NwYWNlID8/XG5cdFx0XHRXb3Jrc3BhY2VGYWN0b3J5LmNyZWF0ZSh7IC4uLldvcmtzcGFjZURlZmF1bHRzLCByb290RGlyOiBwcm9jZXNzLmN3ZCgpIH0pXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVByb2plY3QoYnVpbGRDb25maWc6IHN0cmluZywgbmFtZT86IHN0cmluZyk6IFByb2plY3Qge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2U/LmdldFByb2plY3RzKGJ1aWxkQ29uZmlnKSA/PyBbXTtcblx0XHRjb25zdCBmb3VuZCA9IG5hbWUgPT0gbnVsbCA/IHByb2plY3RzLmF0KDApIDogcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRuYW1lID09IG51bGxcblx0XHRcdFx0XHQ/IGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gXG5cdFx0XHRcdFx0OiBgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cblx0XHRpZiAoIW1vZHVsZXMuaW5jbHVkZXModGhpcy5lbnRyeU1vZHVsZVBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGRvZXMgbm90IGFmZmVjdCBlbnRyeSDigJQgc2tpcHBpbmcgcmVsb2FkYCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXG5cdFx0XHRgQ2hhbmdlIGluICR7ZnVsbFBhdGh9IGFmZmVjdHMgJHttb2R1bGVzLmxlbmd0aH0gbW9kdWxlKHMpIOKAlCBzY2hlZHVsaW5nIHJlbG9hZGAsXG5cdFx0KTtcblx0XHR0aGlzLmludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlcyk7XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmZpbGVJbmZvTWFwLmhhcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKG1vZHVsZSk7XG5cdFx0XHQvLyBQcnVuZSBzdGFsZSBvdXRnb2luZyBlZGdlczogcmVtb3ZlIHRoaXMgbW9kdWxlIGFzIGEgcGFyZW50IGZyb20gYWxsIGRlcGVuZGVuY3kgbGlzdHNcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5maWxlSW5mb01hcC5rZXlzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgVXRpbGl0aWVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgaXNTZWxmKGZpbGVQYXRoOiBzdHJpbmcpIHtcblx0XHRyZXR1cm4gY3VycmVudEZpbGVQYXRoID09PSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRXZlbnRFbWl0dGVyIiwicmVnaXN0ZXJIb29rcyIsInBhdGgiLCJCdWlsZFRhcmdldHMiLCJTd2NUcmFuc3BpbGVyIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJwYWNrYWdlQWxpYXNlcyIsIldvcmtzcGFjZUZhY3RvcnkiLCJGaWxlRXgiLCJpbyIsImRlYm91bmNlIiwic2NyaWJlIiwicmV3cml0ZVNlcnZlU3BlY2lmaWVyIiwiY3VycmVudEZpbGVQYXRoIiwiZmlsZVVybFRvUGF0aCIsInVybCIsIlZFUlNJT05fVVJMX1BBUkFNIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJkaXNwb3NlZCIsImhvb2tzUmVnaXN0ZXJlZCIsImVudHJ5TW9kdWxlUGF0aCIsImVudHJ5TW9kdWxlIiwid29ya3NwYWNlIiwiYnVpbGRDb25maWciLCJ3YXRjaFN1YnNjcmlwdGlvbiIsImZpbGVJbmZvTWFwIiwiTWFwIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJ0cmFuc3BpbGVDYWNoZSIsInRyYW5zcGlsZXIiLCJhbGlhc1BhdGhzIiwiYWxpYXNCYXNlVXJsIiwicmVzb2x2ZSIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVib290RGVib3VuY2VHZW4iLCJyZWJvb3RJbkZsaWdodCIsInJlYm9vdEZvbGxvd1VwIiwicmVib290UXVldWVkIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJyZXNvbHZlV29ya3NwYWNlIiwicHJvamVjdCIsInJlc29sdmVQcm9qZWN0IiwiZ2V0U291cmNlRW50cnlQYXRoIiwiYnVpbGRGaWxlSW5mb01hcCIsImJ1aWxkQWxpYXNQYXRocyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsIlN5bWJvbCIsImRpc3Bvc2VFbnRyeSIsImFzeW5jRGlzcG9zZSIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwiZGVmYXVsdCIsImVycm9yIiwidW5kZWZpbmVkIiwiZGVsYXlNcyIsImdlbiIsInJlcXVlc3RSZWJvb3QiLCJ0aGVuIiwicnVuUmVib290IiwibmVlZHNGb2xsb3dVcCIsImVudHJ5IiwiY3JlYXRlIiwicm9vdERpciIsInByb2Nlc3MiLCJjd2QiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwiZm91bmQiLCJhdCIsImZpbmQiLCJwIiwiZW50cmllcyIsImFsbCIsIm1hcCIsImZpbGVzIiwiZ2V0QWxsRmlsZXMiLCJmaWxlIiwiZnVsbFBhdGgiLCJmbGF0Iiwic3BlY2lmaWVyIiwiY29udGV4dCIsIm5leHQiLCJwYXJlbnRVcmwiLCJwYXJlbnRVUkwiLCJyZXdyaXR0ZW4iLCJpc1dhdGNoZWRUcyIsImZpbGVQYXRoIiwiaGFzIiwicmVzb2x2ZUJhcmUiLCJiYXJlIiwicmVzb2x2ZVBhdGgiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsInJlc3VsdCIsIm9uUG9zdFJlc29sdmUiLCJsb2FkIiwibG9hZFRzIiwiZm9ybWF0Iiwic291cmNlIiwic2hvcnRDaXJjdWl0IiwiZ2V0UGFja2FnZUFsaWFzZXMiLCJiYXNlVXJsIiwicGF0aHMiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJwYXJlbnRJc1NvdXJjZSIsInRyYWNrRGVwZW5kZW5jeSIsInN0YXJ0c1dpdGgiLCJjbGVhblBhdGgiLCJwYXRobmFtZSIsImZpbGVJbmZvIiwiZ2V0IiwiY2FjaGVkIiwidHNDb25maWciLCJnZXRUc0NvbmZpZ1N5bmMiLCJ1c2VyQ29uZmlnIiwiZ2V0U3djQ29uZmlnU3luYyIsInJlc3BvbnNlIiwidHJhbnNmb3JtRmlsZVN5bmMiLCJlczYiLCJvdXRjb21lIiwic2V0IiwiY29kZSIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsIlNldCIsImluY2x1ZGVzIiwibGVuZ3RoIiwiaW52YWxpZGF0ZU1vZHVsZSIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwidmVyc2lvbmVkIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwibW9kdWxlIiwia2V5IiwicGFyZW50cyIsImZpbHRlcmVkIiwiZmlsdGVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsWUFBWSxRQUFRLGNBQWM7QUFPM0MsU0FBU0MsYUFB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
443
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuXHRMb2FkRm5PdXRwdXQsXG5cdExvYWRIb29rQ29udGV4dCxcblx0UmVzb2x2ZUZuT3V0cHV0LFxuXHRSZXNvbHZlSG9va0NvbnRleHQsXG59IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgcmVnaXN0ZXJIb29rcyB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQnVpbGRUYXJnZXRzLCBTd2NUcmFuc3BpbGVyLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCJAZGVjb2hlcmUvZm9yZ2VcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBwYWNrYWdlQWxpYXNlcywgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgcmV3cml0ZVNlcnZlU3BlY2lmaWVyIH0gZnJvbSBcIi4vcmV3cml0ZS1zZXJ2ZS1zcGVjaWZpZXIuanNcIjtcblxudHlwZSBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHsgc291cmNlOiBzdHJpbmcgfSB8IG51bGw7XG5cbmNvbnN0IGN1cnJlbnRGaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IFZFUlNJT05fVVJMX1BBUkFNID0gXCJ2ZXJzaW9uXCI7XG4vKiogRGVmYXVsdCBxdWlldCB3aW5kb3cgYmVmb3JlIGEgZmlsZS1jaGFuZ2UgcmVib290LiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TID0gMjUwO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBGaWxlSW5mbyA9IHsgcHJvamVjdDogUHJvamVjdCB9O1xudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGhvb2tzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdvcmtzcGFjZT86IFdvcmtzcGFjZTtcblx0cHJpdmF0ZSBidWlsZENvbmZpZyA9IFwiZGVidWdcIjtcblx0cHJpdmF0ZSB3YXRjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblx0LyoqIE1hcCBmcm9tIGFic29sdXRlIC50cyBzb3VyY2UgZmlsZSBwYXRoIHRvIHByb2plY3QgaW5mbyAqL1xuXHRwcml2YXRlIGZpbGVJbmZvTWFwID0gbmV3IE1hcDxzdHJpbmcsIEZpbGVJbmZvPigpO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHRyYW5zcGlsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblx0cHJpdmF0ZSB0cmFuc3BpbGVyID0gbmV3IFN3Y1RyYW5zcGlsZXIoKTtcblx0cHJpdmF0ZSBhbGlhc1BhdGhzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblx0cHJpdmF0ZSBhbGlhc0Jhc2VVcmwgPSBwYXRoLnJlc29sdmUoXCIuXCIpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHRwcml2YXRlIHNjaGVkdWxlUmVib290OiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cblx0Ly8g4pSA4pSAIFB1YmxpYyBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KG9wdGlvbnM6IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMpIHtcblx0XHR0aGlzLmRpc3Bvc2VkID0gZmFsc2U7XG5cdFx0dGhpcy5kZXBlbmRlbmNpZXMuY2xlYXIoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLmNsZWFyKCk7XG5cdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cdFx0dGhpcy5idWlsZENvbmZpZyA9IGJ1aWxkQ29uZmlnO1xuXHRcdHRoaXMud29ya3NwYWNlID0gYXdhaXQgdGhpcy5yZXNvbHZlV29ya3NwYWNlKG9wdGlvbnMpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuZmlsZUluZm9NYXAgPSBhd2FpdCB0aGlzLmJ1aWxkRmlsZUluZm9NYXAoYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNQYXRocyA9IGF3YWl0IHRoaXMuYnVpbGRBbGlhc1BhdGhzKCk7XG5cblx0XHR0aGlzLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgdGhpcy53b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB0aGlzLndvcmtzcGFjZS5wcm9qZWN0RmlsZUNoYW5nZWQkLnN1YnNjcmliZSh0aGlzLm9uRmlsZUNoYW5nZSk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFNlcnZpbmcgJHtlbnRyeS5wYXRofWApO1xuXHRcdH1cblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKFsuLi50aGlzLmVudHJpZXMua2V5cygpXSk7XG5cdFx0dGhpcy5lbWl0KFwic3RhcnRcIik7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZGlzcG9zZSgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290RGVib3VuY2VHZW4gKz0gMTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXHRcdHRoaXMud29ya3NwYWNlPy5bU3ltYm9sLmRpc3Bvc2VdKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybCA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKGVudHJ5UGF0aCkpO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gKGF3YWl0IGltcG9ydCh1cmwpKT8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgcmVzb2x2ZVdvcmtzcGFjZShvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvbWlzZTxXb3Jrc3BhY2U+IHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0b3B0aW9ucy53b3Jrc3BhY2UgPz9cblx0XHRcdFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgLi4uV29ya3NwYWNlRGVmYXVsdHMsIHJvb3REaXI6IHByb2Nlc3MuY3dkKCkgfSlcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgYnVpbGRGaWxlSW5mb01hcChidWlsZENvbmZpZzogc3RyaW5nKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBGaWxlSW5mbz4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZXMubWFwKChmaWxlKTogW3N0cmluZywgRmlsZUluZm9dID0+IFtmaWxlLmZ1bGxQYXRoLCB7IHByb2plY3QgfV0pO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0XHRyZXR1cm4gbmV3IE1hcChlbnRyaWVzLmZsYXQoKSk7XG5cdH1cblxuXHRwcml2YXRlIHJlZ2lzdGVySG9va3MoKSB7XG5cdFx0aWYgKHRoaXMuaG9va3NSZWdpc3RlcmVkKSByZXR1cm47XG5cdFx0dGhpcy5ob29rc1JlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHJlZ2lzdGVySG9va3Moe1xuXHRcdFx0cmVzb2x2ZTogKFxuXHRcdFx0XHRzcGVjaWZpZXI6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogUmVzb2x2ZUhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAoc3BlY2lmaWVyOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPFJlc29sdmVIb29rQ29udGV4dD4pID0+IFJlc29sdmVGbk91dHB1dCxcblx0XHRcdCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuIG5leHQoc3BlY2lmaWVyLCBjb250ZXh0KTtcblx0XHRcdFx0Y29uc3QgcGFyZW50VXJsID0gY29udGV4dC5wYXJlbnRVUkwgPz8gXCJcIjtcblx0XHRcdFx0Y29uc3QgcmV3cml0dGVuID1cblx0XHRcdFx0XHRyZXdyaXRlU2VydmVTcGVjaWZpZXIoe1xuXHRcdFx0XHRcdFx0c3BlY2lmaWVyLFxuXHRcdFx0XHRcdFx0cGFyZW50VXJsLFxuXHRcdFx0XHRcdFx0aXNXYXRjaGVkVHM6IChmaWxlUGF0aCkgPT4gdGhpcy5maWxlSW5mb01hcC5oYXMoZmlsZVBhdGgpLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZUJhcmU6IChiYXJlKSA9PlxuXHRcdFx0XHRcdFx0XHRwYWNrYWdlQWxpYXNlcy5yZXNvbHZlUGF0aChiYXJlLCB0aGlzLmFsaWFzUGF0aHMsIHRoaXMuYWxpYXNCYXNlVXJsKSxcblx0XHRcdFx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdFx0XHR9KSA/PyBzcGVjaWZpZXI7XG5cdFx0XHRcdGNvbnN0IHJlc3VsdCA9IG5leHQocmV3cml0dGVuLCBjb250ZXh0KSBhcyBSZXNvbHZlRm5PdXRwdXQ7XG5cdFx0XHRcdHRoaXMub25Qb3N0UmVzb2x2ZShyZXN1bHQsIHBhcmVudFVybCk7XG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXHRcdFx0bG9hZDogKFxuXHRcdFx0XHR1cmw6IHN0cmluZyxcblx0XHRcdFx0Y29udGV4dDogTG9hZEhvb2tDb250ZXh0LFxuXHRcdFx0XHRuZXh0OiAodXJsOiBzdHJpbmcsIGNvbnRleHQ/OiBQYXJ0aWFsPExvYWRIb29rQ29udGV4dD4pID0+IExvYWRGbk91dHB1dCxcblx0XHRcdCk6IExvYWRGbk91dHB1dCA9PiB7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmxvYWRUcyh1cmwpO1xuXHRcdFx0XHRpZiAocmVzdWx0ICE9IG51bGwpXG5cdFx0XHRcdFx0cmV0dXJuIHsgZm9ybWF0OiBcIm1vZHVsZVwiLCBzb3VyY2U6IHJlc3VsdC5zb3VyY2UsIHNob3J0Q2lyY3VpdDogdHJ1ZSB9O1xuXHRcdFx0XHRyZXR1cm4gbmV4dCh1cmwsIGNvbnRleHQpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdC8vIOKUgOKUgCBNb2R1bGUgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZEFsaWFzUGF0aHMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IHtcblx0XHRjb25zdCB3b3Jrc3BhY2UgPSB0aGlzLndvcmtzcGFjZTtcblx0XHRpZiAod29ya3NwYWNlID09IG51bGwpIHJldHVybiB7fTtcblxuXHRcdGNvbnN0IHBhY2thZ2VBbGlhc2VzID0gd29ya3NwYWNlLmdldFBhY2thZ2VBbGlhc2VzKHRoaXMuYnVpbGRDb25maWcpO1xuXHRcdHRoaXMuYWxpYXNCYXNlVXJsID0gcGFja2FnZUFsaWFzZXMuYmFzZVVybDtcblx0XHRyZXR1cm4gcGFja2FnZUFsaWFzZXMucGF0aHM7XG5cdH1cblxuXHQvKipcblx0ICogUG9zdC1uZXh0IGRlcGVuZGVuY3kgdHJhY2tlcjogcmVjb3JkcyB3aGljaCBzb3VyY2UgZmlsZXMgaW1wb3J0IHdoaWNoXG5cdCAqIG90aGVyIHNvdXJjZSBmaWxlcyBzbyB0aGF0IHJlbG9hZElmQWZmZWN0ZWQgY2FuIHRyYXZlcnNlIHRoZSBncmFwaC5cblx0ICovXG5cdHByaXZhdGUgb25Qb3N0UmVzb2x2ZSA9IChyZXN1bHQ6IFJlc29sdmVGbk91dHB1dCwgcGFyZW50VXJsOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB7IHVybCB9ID0gcmVzdWx0O1xuXHRcdGNvbnN0IHBhcmVudFVybENsZWFuID0gcGFyZW50VXJsLnNwbGl0KFwiP1wiKVswXTtcblxuXHRcdGxldCBmaWxlUGF0aDogc3RyaW5nO1xuXHRcdGxldCBwYXJlbnRQYXRoOiBzdHJpbmc7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXHRcdFx0dXJsT2JqLnNlYXJjaCA9IFwiXCI7XG5cdFx0XHRmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsT2JqLnRvU3RyaW5nKCkpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRyeSB7XG5cdFx0XHRwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmxDbGVhbik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRwYXJlbnRQYXRoID0gXCJcIjtcblx0XHR9XG5cblx0XHRjb25zdCBpc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMuZmlsZUluZm9NYXAuaGFzKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgbG9hZFRzOiBMb2FkRGVsZWdhdGUgPSAodXJsOiBzdHJpbmcpID0+IHtcblx0XHRpZiAoIXVybC5zdGFydHNXaXRoKFwiZmlsZTpcIikpIHJldHVybiBudWxsO1xuXG5cdFx0Y29uc3QgY2xlYW5QYXRoID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuXHRcdGNvbnN0IGZpbGVJbmZvID0gdGhpcy5maWxlSW5mb01hcC5nZXQoY2xlYW5QYXRoKTtcblx0XHRpZiAoZmlsZUluZm8gPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLnRyYW5zcGlsZUNhY2hlLmdldChjbGVhblBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCkgcmV0dXJuIHsgc291cmNlOiBjYWNoZWQgfTtcblxuXHRcdGNvbnN0IHsgcHJvamVjdCB9ID0gZmlsZUluZm87XG5cdFx0Y29uc3QgdHNDb25maWcgPSBwcm9qZWN0LmdldFRzQ29uZmlnU3luYygpO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBwcm9qZWN0LmdldFN3Y0NvbmZpZ1N5bmMoKTtcblxuXHRcdGNvbnN0IGZpbGUgPSBuZXcgRmlsZUV4KHsgZnVsbFBhdGg6IGNsZWFuUGF0aCB9KTtcblx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMudHJhbnNwaWxlci50cmFuc2Zvcm1GaWxlU3luYyhmaWxlLCBCdWlsZFRhcmdldHMuZXM2LCB7XG5cdFx0XHR0c0NvbmZpZyxcblx0XHRcdGFsaWFzUGF0aHM6IHRydWUsXG5cdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdHByb2plY3RzOiB0aGlzLndvcmtzcGFjZT8uZ2V0UHJvamVjdHModGhpcy5idWlsZENvbmZpZyksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWAsIHJlc3BvbnNlKTtcblx0XHRcdC8vIERvIG5vdCBmYWxsIHRocm91Z2ggdG8gbmV4dCgpOiBWaXRlc3QvTm9kZSBsb2FkZXJzIGNhbiBkZWFkbG9jayBvbiBhXG5cdFx0XHQvLyB2ZXJzaW9uZWQgLnRzIFVSTC4gRmFpbCB0aGUgaW1wb3J0IHNvIGJvb3RFbnRyeSBjYW4gY2F0Y2ggYW5kIGNvbnRpbnVlLlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gdHJhbnNwaWxlICR7Y2xlYW5QYXRofWApO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuc2V0KGNsZWFuUGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0cmV0dXJuIHsgc291cmNlOiByZXNwb25zZS5jb2RlIH07XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmZpbGVJbmZvTWFwLnNldChmdWxsUGF0aCwgeyBwcm9qZWN0IH0pO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMudHJhbnNwaWxlQ2FjaGUuZGVsZXRlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnRyYW5zcGlsZXIuaW52YWxpZGF0ZUNvbnRlbnRDYWNoZShuZXcgRmlsZUV4KHsgZnVsbFBhdGggfSkpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnNjaGVkdWxlUmVib290KCk7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvLyDilIDilIAgRGVwZW5kZW5jeSBncmFwaCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldERlcGVuZGVuY3lHcmFwaChtb2R1bGVJZDogc3RyaW5nLCBwYXJlbnRNb2R1bGVzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuXHRcdGlmICh0aGlzLmlzU2VsZihtb2R1bGVJZCkpIHJldHVybiBbXTtcblxuXHRcdGNvbnN0IG1vZHVsZURlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQobW9kdWxlSWQpID8/IFtdO1xuXHRcdGlmIChwYXJlbnRNb2R1bGVzLmluY2x1ZGVzKG1vZHVsZUlkKSkge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZDogJHttb2R1bGVJZH1gKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRsZXQgc3ViRGVwczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRlcCBvZiBtb2R1bGVEZXBzKSB7XG5cdFx0XHRpZiAoIXRoaXMuZmlsZUluZm9NYXAuaGFzKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGUoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy50cmFuc3BpbGVDYWNoZS5kZWxldGUobW9kdWxlKTtcblx0XHRcdC8vIFBydW5lIHN0YWxlIG91dGdvaW5nIGVkZ2VzOiByZW1vdmUgdGhpcyBtb2R1bGUgYXMgYSBwYXJlbnQgZnJvbSBhbGwgZGVwZW5kZW5jeSBsaXN0c1xuXHRcdFx0Zm9yIChjb25zdCBba2V5LCBwYXJlbnRzXSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuXHRcdFx0XHRjb25zdCBmaWx0ZXJlZCA9IHBhcmVudHMuZmlsdGVyKChwKSA9PiBwICE9PSBtb2R1bGUpO1xuXHRcdFx0XHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGtleSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuc2V0KGtleSwgZmlsdGVyZWQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKSB7XG5cdFx0Zm9yIChjb25zdCBmaWxlUGF0aCBvZiB0aGlzLmZpbGVJbmZvTWFwLmtleXMoKSkge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIG51bGwpO1xuXHRcdH1cblx0fVxuXG5cdC8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJyZWdpc3Rlckhvb2tzIiwicGF0aCIsIkJ1aWxkVGFyZ2V0cyIsIlN3Y1RyYW5zcGlsZXIiLCJXb3Jrc3BhY2VEZWZhdWx0cyIsInBhY2thZ2VBbGlhc2VzIiwiV29ya3NwYWNlRmFjdG9yeSIsIkZpbGVFeCIsImlvIiwiZGVib3VuY2UiLCJzY3JpYmUiLCJyZXdyaXRlU2VydmVTcGVjaWZpZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJmaWxlVXJsVG9QYXRoIiwidXJsIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwidmFsdWUiLCJkZWxheSIsIk51bWJlciIsImlzRmluaXRlIiwiRXJyb3IiLCJTdHJpbmciLCJtb2R1bGVWZXJzaW9uU2VxIiwiSG90UmVsb2FkU2VydmVyIiwibG9nZ2VyIiwibmFtZSIsImRpc3Bvc2VkIiwiaG9va3NSZWdpc3RlcmVkIiwiZW50cmllcyIsIk1hcCIsInBlbmRpbmdFbnRyeVJlYm9vdHMiLCJTZXQiLCJ3b3Jrc3BhY2UiLCJidWlsZENvbmZpZyIsIndhdGNoU3Vic2NyaXB0aW9uIiwiZmlsZUluZm9NYXAiLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInRyYW5zcGlsZUNhY2hlIiwidHJhbnNwaWxlciIsImFsaWFzUGF0aHMiLCJhbGlhc0Jhc2VVcmwiLCJyZXNvbHZlIiwicmVib290VGFpbCIsIlByb21pc2UiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJzY2hlZHVsZVJlYm9vdCIsInN0YXJ0Iiwib3B0aW9ucyIsImNsZWFyIiwiYmluZFNjaGVkdWxlUmVib290IiwicmVib290RGVib3VuY2VNcyIsInJlc29sdmVXb3Jrc3BhY2UiLCJzZWxlY3RlZCIsInJlc29sdmVQcm9qZWN0cyIsInByb2plY3QiLCJlbnRyeVBhdGgiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJzZXQiLCJidWlsZEZpbGVJbmZvTWFwIiwiYnVpbGRBbGlhc1BhdGhzIiwiaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzIiwid2F0Y2giLCJwcm9qZWN0RmlsZUNoYW5nZWQkIiwic3Vic2NyaWJlIiwib25GaWxlQ2hhbmdlIiwiZW50cnkiLCJ2YWx1ZXMiLCJ0cmFjZSIsImJvb3RFbnRyaWVzIiwia2V5cyIsImVtaXQiLCJkaXNwb3NlIiwidW5zdWJzY3JpYmUiLCJTeW1ib2wiLCJkaXNwb3NlRW50cmllcyIsImFzeW5jRGlzcG9zZSIsImVudHJ5UGF0aHMiLCJhbGwiLCJtYXAiLCJib290RW50cnkiLCJzdGF0ZSIsImdldCIsInZlcnNpb25Nb2R1bGUiLCJwYXRoVG9GaWxlVXJsIiwibW9kdWxlIiwiZGVmYXVsdCIsImVycm9yIiwidW5kZWZpbmVkIiwiZGVsYXlNcyIsImdlbiIsInJlcXVlc3RSZWJvb3QiLCJ0aGVuIiwicnVuUmVib290IiwidG9SZWJvb3QiLCJzaXplIiwibGVuZ3RoIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImNyZWF0ZSIsInJvb3REaXIiLCJwcm9jZXNzIiwiY3dkIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsIm5hbWVzIiwiZmlyc3QiLCJhdCIsImZvdW5kIiwiZmluZCIsInB1c2giLCJmaWxlcyIsImdldEFsbEZpbGVzIiwiZmlsZSIsImZ1bGxQYXRoIiwiZmxhdCIsInNwZWNpZmllciIsImNvbnRleHQiLCJuZXh0IiwicGFyZW50VXJsIiwicGFyZW50VVJMIiwicmV3cml0dGVuIiwiaXNXYXRjaGVkVHMiLCJmaWxlUGF0aCIsImhhcyIsInJlc29sdmVCYXJlIiwiYmFyZSIsInJlc29sdmVQYXRoIiwidmVyc2lvbkZpbGVVcmwiLCJmaWxlVXJsIiwiZ2V0Q2FjaGVkT3JOZXciLCJyZXN1bHQiLCJvblBvc3RSZXNvbHZlIiwibG9hZCIsImxvYWRUcyIsImZvcm1hdCIsInNvdXJjZSIsInNob3J0Q2lyY3VpdCIsImdldFBhY2thZ2VBbGlhc2VzIiwiYmFzZVVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJwYXJlbnRQYXRoIiwidXJsT2JqIiwiVVJMIiwic2VhcmNoIiwidG9TdHJpbmciLCJpc1NvdXJjZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5Iiwic3RhcnRzV2l0aCIsImNsZWFuUGF0aCIsInBhdGhuYW1lIiwiZmlsZUluZm8iLCJjYWNoZWQiLCJ0c0NvbmZpZyIsImdldFRzQ29uZmlnU3luYyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWdTeW5jIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1GaWxlU3luYyIsImVzNiIsIm91dGNvbWUiLCJjb2RlIiwiZXZ0IiwiZXZlbnROYW1lIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJyZWxvYWRJZkFmZmVjdGVkIiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uZWRVcmwiLCJzZWFyY2hQYXJhbXMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxjQUFjO0FBTzNDLFNBQVNDLGFBQWEsUUFBUSxjQUFjO0FBQzVDLE9BQU9DLFVBQVUsWUFBWTtBQUM3QixTQUFTQyxZQUFZLEVBQUVDLGFBQWEsRUFBRUMsaUJBQWlCLFFBQVEsa0JBQWtCO0FBRWpGLFNBQVNDLGNBQWMsRUFBRUMsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBQ2xFLFNBQVNDLE1BQU0sRUFBRUMsRUFBRSxRQUFRLHFCQUFxQjtBQUNoRCxTQUFTQyxRQUFRLFFBQVEseUJBQXlCO0FBQ2xELFNBQXNCQyxNQUFNLFFBQVEsbUJBQW1CO0FBRXZELFNBQVNDLHFCQUFxQixRQUFRLCtCQUErQjtBQUlyRSxNQUFNQyxrQkFBa0JKLEdBQUdLLGFBQWEsQ0FBQyxZQUFZQyxHQUFHO0FBQ3hELE1BQU1DLG9CQUFvQjtBQUMxQixzREFBc0QsR0FDdEQsT0FBTyxNQUFNQyw2QkFBNkIsSUFBSTtBQUU5QyxPQUFPLFNBQVNDLHdCQUF3QkMsS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU0Y7SUFDdkIsSUFBSSxDQUFDSSxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FB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
package/es6/src/index.js CHANGED
@@ -1,4 +1,6 @@
1
+ export { DeferredScriptRunner } from "./deferred-script-runner.js";
1
2
  export { FluxModule } from "./flux.module.js";
2
3
  export { DEFAULT_REBOOT_DEBOUNCE_MS, HotReloadServer } from "./hot-reload-server.js";
4
+ export { classifySliceProject, classifySliceProjects, normalizeSlicePrefix, projectsInSlice, projectsInSlices, resolveDeferScript } from "./slice-serve.js";
3
5
 
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZsdXhNb2R1bGUgfSBmcm9tIFwiLi9mbHV4Lm1vZHVsZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB7IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TLCBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHR5cGUgeyBTZXJ2ZU9wdGlvbnMgfSBmcm9tIFwiLi9zZXJ2ZS5hY3Rpb24uanNcIjtcbiJdLCJuYW1lcyI6WyJGbHV4TW9kdWxlIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJIb3RSZWxvYWRTZXJ2ZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxtQkFBbUI7QUFFOUMsU0FBU0MsMEJBQTBCLEVBQUVDLGVBQWUsUUFBUSx5QkFBeUIifQ==
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbiJdLCJuYW1lcyI6WyJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkZsdXhNb2R1bGUiLCJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0IiwiY2xhc3NpZnlTbGljZVByb2plY3RzIiwibm9ybWFsaXplU2xpY2VQcmVmaXgiLCJwcm9qZWN0c0luU2xpY2UiLCJwcm9qZWN0c0luU2xpY2VzIiwicmVzb2x2ZURlZmVyU2NyaXB0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxvQkFBb0IsUUFBUSw4QkFBOEI7QUFDbkUsU0FBU0MsVUFBVSxRQUFRLG1CQUFtQjtBQUU5QyxTQUFTQywwQkFBMEIsRUFBRUMsZUFBZSxRQUFRLHlCQUF5QjtBQUVyRixTQUVDQyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMsb0JBQW9CLEVBQ3BCQyxlQUFlLEVBQ2ZDLGdCQUFnQixFQUNoQkMsa0JBQWtCLFFBR1osbUJBQW1CIn0=
@@ -7,20 +7,35 @@ function _ts_decorate(decorators, target, key, desc) {
7
7
  function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
+ import path from "node:path";
10
11
  import { injectable } from "@decohere/crucible/decorators";
11
12
  // biome-ignore lint/style/useImportType: <DI>
12
13
  import { Workspace } from "@decohere/mesh";
13
14
  import { ActionResponse } from "@decohere/nexus/cli";
15
+ import { scribe } from "@decohere/scribe";
16
+ // biome-ignore lint/style/useImportType: <DI>
17
+ import { DeferredScriptRunner } from "./deferred-script-runner.js";
14
18
  // biome-ignore lint/style/useImportType: <DI>
15
19
  import { HotReloadServer } from "./hot-reload-server.js";
20
+ import { classifySliceProjects, resolveDeferScript } from "./slice-serve.js";
16
21
  export class ServeAction {
17
22
  server;
18
23
  workspace;
19
- constructor(server, workspace){
24
+ deferredScripts;
25
+ logger = scribe.logger(ServeAction.name);
26
+ constructor(server, workspace, deferredScripts){
20
27
  this.server = server;
21
28
  this.workspace = workspace;
29
+ this.deferredScripts = deferredScripts;
22
30
  }
23
31
  async run(options) {
32
+ const slices = (options.slices ?? []).filter((s)=>s !== "");
33
+ if (slices.length > 0 && options.project != null) {
34
+ throw new Error("Use either directory slices or --project, not both");
35
+ }
36
+ if (slices.length > 0) {
37
+ return this.runSlices(options, slices);
38
+ }
24
39
  await this.server.start({
25
40
  workspace: this.workspace,
26
41
  buildConfig: options.configuration,
@@ -29,14 +44,67 @@ export class ServeAction {
29
44
  });
30
45
  return ActionResponse.Blocking(ServeAction.name);
31
46
  }
47
+ async runSlices(options, slices) {
48
+ const views = await this.toSliceViews(options.configuration);
49
+ const classified = classifySliceProjects(views, slices);
50
+ const label = slices.join(" ");
51
+ for (const skipped of classified.skip){
52
+ this.logger.info(`skipped ${skipped.projectDirectory} — library (no Flux entry / scripts)`);
53
+ }
54
+ if (classified.flux.length === 0 && classified.defer.length === 0) {
55
+ throw new Error(`No runnable projects in slice(s) "${label}" (need Flux main.ts apps and/or package scripts.dev/serve)`);
56
+ }
57
+ const workspaceRoot = path.resolve(this.workspace.rootDir ?? process.cwd());
58
+ for (const deferred of classified.defer){
59
+ const script = resolveDeferScript(deferred.scripts);
60
+ if (script == null) continue;
61
+ const project = this.findProject(options.configuration, deferred.name);
62
+ this.deferredScripts.start({
63
+ label: deferred.projectDirectory,
64
+ cwd: project.projectRoot,
65
+ script,
66
+ workspaceRoot
67
+ });
68
+ }
69
+ if (classified.flux.length > 0) {
70
+ await this.server.start({
71
+ workspace: this.workspace,
72
+ buildConfig: options.configuration,
73
+ projects: classified.flux.map((p)=>p.name),
74
+ rebootDebounceMs: options.rebootDebounceMs
75
+ });
76
+ }
77
+ return ActionResponse.Blocking(ServeAction.name);
78
+ }
79
+ async toSliceViews(configuration) {
80
+ const projects = this.workspace.getProjects(configuration);
81
+ return Promise.all(projects.map((project)=>this.toSliceView(project)));
82
+ }
83
+ async toSliceView(project) {
84
+ const pkg = await project.getPackageJson();
85
+ return {
86
+ name: project.name,
87
+ projectDirectory: project.projectDirectory.replaceAll("\\", "/"),
88
+ main: pkg.main ?? "src/index.ts",
89
+ scripts: pkg.scripts ?? {}
90
+ };
91
+ }
92
+ findProject(configuration, name) {
93
+ const found = this.workspace.getProjects(configuration).find((p)=>p.name === name);
94
+ if (found == null) {
95
+ throw new Error(`Project "${name}" not found in workspace`);
96
+ }
97
+ return found;
98
+ }
32
99
  }
33
100
  ServeAction = _ts_decorate([
34
101
  injectable(),
35
102
  _ts_metadata("design:type", Function),
36
103
  _ts_metadata("design:paramtypes", [
37
104
  typeof HotReloadServer === "undefined" ? Object : HotReloadServer,
38
- typeof Workspace === "undefined" ? Object : Workspace
105
+ typeof Workspace === "undefined" ? Object : Workspace,
106
+ typeof DeferredScriptRunner === "undefined" ? Object : DeferredScriptRunner
39
107
  ])
40
108
  ], ServeAction);
41
109
 
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IHR5cGUgQWN0aW9uLCBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBTZXJ2ZU9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0cHJvamVjdD86IHN0cmluZztcblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsXG5cdFx0cHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0KSB7fVxuXG5cdHB1YmxpYyBhc3luYyBydW4ob3B0aW9uczogU2VydmVPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0XHRidWlsZENvbmZpZzogb3B0aW9ucy5jb25maWd1cmF0aW9uLFxuXHRcdFx0cHJvamVjdDogb3B0aW9ucy5wcm9qZWN0LFxuXHRcdFx0cmVib290RGVib3VuY2VNczogb3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zLFxuXHRcdH0pO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbImluamVjdGFibGUiLCJXb3Jrc3BhY2UiLCJBY3Rpb25SZXNwb25zZSIsIkhvdFJlbG9hZFNlcnZlciIsIlNlcnZlQWN0aW9uIiwic2VydmVyIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsInN0YXJ0IiwiYnVpbGRDb25maWciLCJjb25maWd1cmF0aW9uIiwicHJvamVjdCIsInJlYm9vdERlYm91bmNlTXMiLCJCbG9ja2luZyIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLFNBQVNBLFVBQVUsUUFBUSxnQ0FBZ0M7QUFDM0QsOENBQThDO0FBQzlDLFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFDM0MsU0FBc0JDLGNBQWMsUUFBUSxzQkFBc0I7QUFDbEUsOENBQThDO0FBQzlDLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFTekQsT0FBTyxNQUFNQzs7O0lBQ1osWUFDQyxBQUFpQkMsTUFBdUIsRUFDeEMsQUFBaUJDLFNBQW9CLENBQ3BDO2FBRmdCRCxTQUFBQTthQUNBQyxZQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBcUIsRUFBMkI7UUFDaEUsTUFBTSxJQUFJLENBQUNILE1BQU0sQ0FBQ0ksS0FBSyxDQUFDO1lBQ3ZCSCxXQUFXLElBQUksQ0FBQ0EsU0FBUztZQUN6QkksYUFBYUYsUUFBUUcsYUFBYTtZQUNsQ0MsU0FBU0osUUFBUUksT0FBTztZQUN4QkMsa0JBQWtCTCxRQUFRSyxnQkFBZ0I7UUFDM0M7UUFDQSxPQUFPWCxlQUFlWSxRQUFRLENBQUNWLFlBQVlXLElBQUk7SUFDaEQ7QUFDRCJ9
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyB0eXBlIFByb2plY3QsIFdvcmtzcGFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgdHlwZSBBY3Rpb24sIEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBIb3RSZWxvYWRTZXJ2ZXIgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuaW1wb3J0IHtcblx0Y2xhc3NpZnlTbGljZVByb2plY3RzLFxuXHRyZXNvbHZlRGVmZXJTY3JpcHQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcblxuZXhwb3J0IHR5cGUgU2VydmVPcHRpb25zID0ge1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKiBPbmUgb3IgbW9yZSBtb2R1bGUgZGlyZWN0b3J5IHRva2VucyAoYGZ1bmRpbmdgLCBgc2hlbGxgLCBgcHJvamVjdHMvZnVuZGluZ2ApLiAqL1xuXHRzbGljZXM/OiBzdHJpbmdbXTtcblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTZXJ2ZUFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxTZXJ2ZU9wdGlvbnM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoU2VydmVBY3Rpb24ubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBIb3RSZWxvYWRTZXJ2ZXIsXG5cdFx0cHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0XHRwcml2YXRlIHJlYWRvbmx5IGRlZmVycmVkU2NyaXB0czogRGVmZXJyZWRTY3JpcHRSdW5uZXIsXG5cdCkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFNlcnZlT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCBzbGljZXMgPSAob3B0aW9ucy5zbGljZXMgPz8gW10pLmZpbHRlcigocykgPT4gcyAhPT0gXCJcIik7XG5cdFx0aWYgKHNsaWNlcy5sZW5ndGggPiAwICYmIG9wdGlvbnMucHJvamVjdCAhPSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVc2UgZWl0aGVyIGRpcmVjdG9yeSBzbGljZXMgb3IgLS1wcm9qZWN0LCBub3QgYm90aFwiKTtcblx0XHR9XG5cblx0XHRpZiAoc2xpY2VzLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnJ1blNsaWNlcyhvcHRpb25zLCBzbGljZXMpO1xuXHRcdH1cblxuXHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0XHRidWlsZENvbmZpZzogb3B0aW9ucy5jb25maWd1cmF0aW9uLFxuXHRcdFx0cHJvamVjdDogb3B0aW9ucy5wcm9qZWN0LFxuXHRcdFx0cmVib290RGVib3VuY2VNczogb3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zLFxuXHRcdH0pO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuU2xpY2VzKG9wdGlvbnM6IFNlcnZlT3B0aW9ucywgc2xpY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+IHtcblx0XHRjb25zdCB2aWV3cyA9IGF3YWl0IHRoaXMudG9TbGljZVZpZXdzKG9wdGlvbnMuY29uZmlndXJhdGlvbik7XG5cdFx0Y29uc3QgY2xhc3NpZmllZCA9IGNsYXNzaWZ5U2xpY2VQcm9qZWN0cyh2aWV3cywgc2xpY2VzKTtcblx0XHRjb25zdCBsYWJlbCA9IHNsaWNlcy5qb2luKFwiIFwiKTtcblxuXHRcdGZvciAoY29uc3Qgc2tpcHBlZCBvZiBjbGFzc2lmaWVkLnNraXApIHtcblx0XHRcdHRoaXMubG9nZ2VyLmluZm8oXG5cdFx0XHRcdGBza2lwcGVkICR7c2tpcHBlZC5wcm9qZWN0RGlyZWN0b3J5fSDigJQgbGlicmFyeSAobm8gRmx1eCBlbnRyeSAvIHNjcmlwdHMpYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNsYXNzaWZpZWQuZmx1eC5sZW5ndGggPT09IDAgJiYgY2xhc3NpZmllZC5kZWZlci5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YE5vIHJ1bm5hYmxlIHByb2plY3RzIGluIHNsaWNlKHMpIFwiJHtsYWJlbH1cIiAobmVlZCBGbHV4IG1haW4udHMgYXBwcyBhbmQvb3IgcGFja2FnZSBzY3JpcHRzLmRldi9zZXJ2ZSlgLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCB3b3Jrc3BhY2VSb290ID0gcGF0aC5yZXNvbHZlKHRoaXMud29ya3NwYWNlLnJvb3REaXIgPz8gcHJvY2Vzcy5jd2QoKSk7XG5cblx0XHRmb3IgKGNvbnN0IGRlZmVycmVkIG9mIGNsYXNzaWZpZWQuZGVmZXIpIHtcblx0XHRcdGNvbnN0IHNjcmlwdCA9IHJlc29sdmVEZWZlclNjcmlwdChkZWZlcnJlZC5zY3JpcHRzKTtcblx0XHRcdGlmIChzY3JpcHQgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBwcm9qZWN0ID0gdGhpcy5maW5kUHJvamVjdChvcHRpb25zLmNvbmZpZ3VyYXRpb24sIGRlZmVycmVkLm5hbWUpO1xuXHRcdFx0dGhpcy5kZWZlcnJlZFNjcmlwdHMuc3RhcnQoe1xuXHRcdFx0XHRsYWJlbDogZGVmZXJyZWQucHJvamVjdERpcmVjdG9yeSxcblx0XHRcdFx0Y3dkOiBwcm9qZWN0LnByb2plY3RSb290LFxuXHRcdFx0XHRzY3JpcHQsXG5cdFx0XHRcdHdvcmtzcGFjZVJvb3QsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAoY2xhc3NpZmllZC5mbHV4Lmxlbmd0aCA+IDApIHtcblx0XHRcdGF3YWl0IHRoaXMuc2VydmVyLnN0YXJ0KHtcblx0XHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdFx0YnVpbGRDb25maWc6IG9wdGlvbnMuY29uZmlndXJhdGlvbixcblx0XHRcdFx0cHJvamVjdHM6IGNsYXNzaWZpZWQuZmx1eC5tYXAoKHApID0+IHAubmFtZSksXG5cdFx0XHRcdHJlYm9vdERlYm91bmNlTXM6IG9wdGlvbnMucmVib290RGVib3VuY2VNcyxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5CbG9ja2luZyhTZXJ2ZUFjdGlvbi5uYW1lKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdG9TbGljZVZpZXdzKGNvbmZpZ3VyYXRpb246IHN0cmluZyk6IFByb21pc2U8U2xpY2VQcm9qZWN0Vmlld1tdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZS5nZXRQcm9qZWN0cyhjb25maWd1cmF0aW9uKTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvamVjdHMubWFwKChwcm9qZWN0KSA9PiB0aGlzLnRvU2xpY2VWaWV3KHByb2plY3QpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHRvU2xpY2VWaWV3KHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFNsaWNlUHJvamVjdFZpZXc+IHtcblx0XHRjb25zdCBwa2cgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdHByb2plY3REaXJlY3Rvcnk6IHByb2plY3QucHJvamVjdERpcmVjdG9yeS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIiksXG5cdFx0XHRtYWluOiBwa2cubWFpbiA/PyBcInNyYy9pbmRleC50c1wiLFxuXHRcdFx0c2NyaXB0czogcGtnLnNjcmlwdHMgPz8ge30sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZmluZFByb2plY3QoY29uZmlndXJhdGlvbjogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9qZWN0IHtcblx0XHRjb25zdCBmb3VuZCA9IHRoaXMud29ya3NwYWNlLmdldFByb2plY3RzKGNvbmZpZ3VyYXRpb24pLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0aWYgKGZvdW5kID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0fVxuXHRcdHJldHVybiBmb3VuZDtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkhvdFJlbG9hZFNlcnZlciIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0cyIsInJlc29sdmVEZWZlclNjcmlwdCIsIlNlcnZlQWN0aW9uIiwibG9nZ2VyIiwibmFtZSIsInNlcnZlciIsIndvcmtzcGFjZSIsImRlZmVycmVkU2NyaXB0cyIsInJ1biIsIm9wdGlvbnMiLCJzbGljZXMiLCJmaWx0ZXIiLCJzIiwibGVuZ3RoIiwicHJvamVjdCIsIkVycm9yIiwicnVuU2xpY2VzIiwic3RhcnQiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWJvb3REZWJvdW5jZU1zIiwiQmxvY2tpbmciLCJ2aWV3cyIsInRvU2xpY2VWaWV3cyIsImNsYXNzaWZpZWQiLCJsYWJlbCIsImpvaW4iLCJza2lwcGVkIiwic2tpcCIsImluZm8iLCJwcm9qZWN0RGlyZWN0b3J5IiwiZmx1eCIsImRlZmVyIiwid29ya3NwYWNlUm9vdCIsInJlc29sdmUiLCJyb290RGlyIiwicHJvY2VzcyIsImN3ZCIsImRlZmVycmVkIiwic2NyaXB0Iiwic2NyaXB0cyIsImZpbmRQcm9qZWN0IiwicHJvamVjdFJvb3QiLCJwcm9qZWN0cyIsIm1hcCIsInAiLCJnZXRQcm9qZWN0cyIsIlByb21pc2UiLCJhbGwiLCJ0b1NsaWNlVmlldyIsInBrZyIsImdldFBhY2thZ2VKc29uIiwicmVwbGFjZUFsbCIsIm1haW4iLCJmb3VuZCIsImZpbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU9BLFVBQVUsWUFBWTtBQUM3QixTQUFTQyxVQUFVLFFBQVEsZ0NBQWdDO0FBQzNELDhDQUE4QztBQUM5QyxTQUF1QkMsU0FBUyxRQUFRLGlCQUFpQjtBQUN6RCxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msb0JBQW9CLFFBQVEsOEJBQThCO0FBQ25FLDhDQUE4QztBQUM5QyxTQUFTQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3pELFNBQ0NDLHFCQUFxQixFQUNyQkMsa0JBQWtCLFFBRVosbUJBQW1CO0FBVzFCLE9BQU8sTUFBTUM7Ozs7SUFDS0MsU0FBaUJO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
@@ -9,11 +9,39 @@ export class ServeCommand extends DecohereCommand {
9
9
  }
10
10
  constructor(name){
11
11
  super(name);
12
- this.description("Serve a project in a workspace configuration");
12
+ this.description("Serve a project or directory slices (Flux apps in-process; foreign packages via package scripts)");
13
+ this.argument("[slices...]", "Module directories to serve (e.g. funding shell secmaster, or projects/funding)");
13
14
  this.addOption(new ConfigurationOption("debug"));
14
15
  this.addOption(new ProjectOption());
15
16
  this.option("--reboot-debounce-ms <ms>", "Quiet window in milliseconds after the last affecting save before a reboot", (value)=>resolveRebootDebounceMs(Number(value)), DEFAULT_REBOOT_DEBOUNCE_MS);
16
17
  }
18
+ /**
19
+ * Commander passes positional args before options when `[slices...]` is declared.
20
+ * Terminal's ModuleFactory expects `(opts, cmd)` — normalize here.
21
+ */ action(fn) {
22
+ return super.action((...args)=>{
23
+ const cmd = args.at(-1);
24
+ const first = args[0];
25
+ const hasPositionalSlices = Array.isArray(first) || typeof first === "string" || first === undefined;
26
+ const opts = hasPositionalSlices ? args[1] : args[0];
27
+ const slices = normalizePositionalSlices(first);
28
+ if (slices.length > 0) {
29
+ cmd.setOptionValue("slices", slices);
30
+ }
31
+ return fn(opts, cmd);
32
+ });
33
+ }
34
+ }
35
+ function normalizePositionalSlices(first) {
36
+ if (Array.isArray(first)) {
37
+ return first.filter((s)=>typeof s === "string" && s !== "");
38
+ }
39
+ if (typeof first === "string" && first !== "") {
40
+ return [
41
+ first
42
+ ];
43
+ }
44
+ return [];
17
45
  }
18
46
 
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlndXJhdGlvbk9wdGlvbiwgRGVjb2hlcmVDb21tYW5kLCBQcm9qZWN0T3B0aW9uIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TLCByZXNvbHZlUmVib290RGVib3VuY2VNcyB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTZXJ2ZUFjdGlvbiB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2VydmVDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIG92ZXJyaWRlIGdldCBhY3Rpb25zKCkge1xuXHRcdHJldHVybiBbU2VydmVBY3Rpb25dO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJTZXJ2ZSBhIHByb2plY3QgaW4gYSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvblwiKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgQ29uZmlndXJhdGlvbk9wdGlvbihcImRlYnVnXCIpKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgUHJvamVjdE9wdGlvbigpKTtcblx0XHR0aGlzLm9wdGlvbihcblx0XHRcdFwiLS1yZWJvb3QtZGVib3VuY2UtbXMgPG1zPlwiLFxuXHRcdFx0XCJRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdFwiLFxuXHRcdFx0KHZhbHVlOiBzdHJpbmcpID0+IHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKE51bWJlcih2YWx1ZSkpLFxuXHRcdFx0REVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsXG5cdFx0KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNvbmZpZ3VyYXRpb25PcHRpb24iLCJEZWNvaGVyZUNvbW1hbmQiLCJQcm9qZWN0T3B0aW9uIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsIlNlcnZlQWN0aW9uIiwiU2VydmVDb21tYW5kIiwiYWN0aW9ucyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImFkZE9wdGlvbiIsIm9wdGlvbiIsInZhbHVlIiwiTnVtYmVyIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFQyxhQUFhLFFBQVEsc0JBQXNCO0FBQzFGLFNBQVNDLDBCQUEwQixFQUFFQyx1QkFBdUIsUUFBUSx5QkFBeUI7QUFDN0YsU0FBU0MsV0FBVyxRQUFRLG9CQUFvQjtBQUVoRCxPQUFPLE1BQU1DLHFCQUFxQkw7SUFDakMsSUFBb0JNLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtTQUFZO0lBQ3JCO0lBRUEsWUFBbUJHLElBQVksQ0FBRTtRQUNoQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQUM7UUFDakIsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSVYsb0JBQW9CO1FBQ3ZDLElBQUksQ0FBQ1UsU0FBUyxDQUFDLElBQUlSO1FBQ25CLElBQUksQ0FBQ1MsTUFBTSxDQUNWLDZCQUNBLDhFQUNBLENBQUNDLFFBQWtCUix3QkFBd0JTLE9BQU9ELFNBQ2xEVDtJQUVGO0FBQ0QifQ==
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3NlcnZlLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlndXJhdGlvbk9wdGlvbiwgRGVjb2hlcmVDb21tYW5kLCBQcm9qZWN0T3B0aW9uIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uVmFsdWVzIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIHJlc29sdmVSZWJvb3REZWJvdW5jZU1zIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZUNvbW1hbmQgZXh0ZW5kcyBEZWNvaGVyZUNvbW1hbmQge1xuXHRwdWJsaWMgb3ZlcnJpZGUgZ2V0IGFjdGlvbnMoKSB7XG5cdFx0cmV0dXJuIFtTZXJ2ZUFjdGlvbl07XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5kZXNjcmlwdGlvbihcblx0XHRcdFwiU2VydmUgYSBwcm9qZWN0IG9yIGRpcmVjdG9yeSBzbGljZXMgKEZsdXggYXBwcyBpbi1wcm9jZXNzOyBmb3JlaWduIHBhY2thZ2VzIHZpYSBwYWNrYWdlIHNjcmlwdHMpXCIsXG5cdFx0KTtcblx0XHR0aGlzLmFyZ3VtZW50KFxuXHRcdFx0XCJbc2xpY2VzLi4uXVwiLFxuXHRcdFx0XCJNb2R1bGUgZGlyZWN0b3JpZXMgdG8gc2VydmUgKGUuZy4gZnVuZGluZyBzaGVsbCBzZWNtYXN0ZXIsIG9yIHByb2plY3RzL2Z1bmRpbmcpXCIsXG5cdFx0KTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgQ29uZmlndXJhdGlvbk9wdGlvbihcImRlYnVnXCIpKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgUHJvamVjdE9wdGlvbigpKTtcblx0XHR0aGlzLm9wdGlvbihcblx0XHRcdFwiLS1yZWJvb3QtZGVib3VuY2UtbXMgPG1zPlwiLFxuXHRcdFx0XCJRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdFwiLFxuXHRcdFx0KHZhbHVlOiBzdHJpbmcpID0+IHJlc29sdmVSZWJvb3REZWJvdW5jZU1zKE51bWJlcih2YWx1ZSkpLFxuXHRcdFx0REVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb21tYW5kZXIgcGFzc2VzIHBvc2l0aW9uYWwgYXJncyBiZWZvcmUgb3B0aW9ucyB3aGVuIGBbc2xpY2VzLi4uXWAgaXMgZGVjbGFyZWQuXG5cdCAqIFRlcm1pbmFsJ3MgTW9kdWxlRmFjdG9yeSBleHBlY3RzIGAob3B0cywgY21kKWAg4oCUIG5vcm1hbGl6ZSBoZXJlLlxuXHQgKi9cblx0cHVibGljIG92ZXJyaWRlIGFjdGlvbihmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPik6IHRoaXMge1xuXHRcdHJldHVybiBzdXBlci5hY3Rpb24oKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG5cdFx0XHRjb25zdCBjbWQgPSBhcmdzLmF0KC0xKSBhcyBEZWNvaGVyZUNvbW1hbmQ7XG5cdFx0XHRjb25zdCBmaXJzdCA9IGFyZ3NbMF07XG5cdFx0XHRjb25zdCBoYXNQb3NpdGlvbmFsU2xpY2VzID1cblx0XHRcdFx0QXJyYXkuaXNBcnJheShmaXJzdCkgfHwgdHlwZW9mIGZpcnN0ID09PSBcInN0cmluZ1wiIHx8IGZpcnN0ID09PSB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCBvcHRzID0gaGFzUG9zaXRpb25hbFNsaWNlcyA/IChhcmdzWzFdIGFzIE9wdGlvblZhbHVlcykgOiAoYXJnc1swXSBhcyBPcHRpb25WYWx1ZXMpO1xuXG5cdFx0XHRjb25zdCBzbGljZXMgPSBub3JtYWxpemVQb3NpdGlvbmFsU2xpY2VzKGZpcnN0KTtcblx0XHRcdGlmIChzbGljZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRjbWQuc2V0T3B0aW9uVmFsdWUoXCJzbGljZXNcIiwgc2xpY2VzKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBmbihvcHRzLCBjbWQpO1xuXHRcdH0pO1xuXHR9XG59XG5mdW5jdGlvbiBub3JtYWxpemVQb3NpdGlvbmFsU2xpY2VzKGZpcnN0OiB1bmtub3duKTogc3RyaW5nW10ge1xuXHRpZiAoQXJyYXkuaXNBcnJheShmaXJzdCkpIHtcblx0XHRyZXR1cm4gZmlyc3QuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09IFwic3RyaW5nXCIgJiYgcyAhPT0gXCJcIik7XG5cdH1cblx0aWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiBmaXJzdCAhPT0gXCJcIikge1xuXHRcdHJldHVybiBbZmlyc3RdO1xuXHR9XG5cdHJldHVybiBbXTtcbn1cbiJdLCJuYW1lcyI6WyJDb25maWd1cmF0aW9uT3B0aW9uIiwiRGVjb2hlcmVDb21tYW5kIiwiUHJvamVjdE9wdGlvbiIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJTZXJ2ZUFjdGlvbiIsIlNlcnZlQ29tbWFuZCIsImFjdGlvbnMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJhcmd1bWVudCIsImFkZE9wdGlvbiIsIm9wdGlvbiIsInZhbHVlIiwiTnVtYmVyIiwiYWN0aW9uIiwiZm4iLCJhcmdzIiwiY21kIiwiYXQiLCJmaXJzdCIsImhhc1Bvc2l0aW9uYWxTbGljZXMiLCJBcnJheSIsImlzQXJyYXkiLCJ1bmRlZmluZWQiLCJvcHRzIiwic2xpY2VzIiwibm9ybWFsaXplUG9zaXRpb25hbFNsaWNlcyIsImxlbmd0aCIsInNldE9wdGlvblZhbHVlIiwiZmlsdGVyIiwicyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsbUJBQW1CLEVBQUVDLGVBQWUsRUFBRUMsYUFBYSxRQUFRLHNCQUFzQjtBQUUxRixTQUFTQywwQkFBMEIsRUFBRUMsdUJBQXVCLFFBQVEseUJBQXlCO0FBQzdGLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFFaEQsT0FBTyxNQUFNQyxxQkFBcUJMO0lBQ2pDLElBQW9CTSxVQUFVO1FBQzdCLE9BQU87WUFBQ0Y7U0FBWTtJQUNyQjtJQUVBLFlBQW1CRyxJQUFZLENBQUU7UUFDaEMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsV0FBVyxDQUNmO1FBRUQsSUFBSSxDQUFDQyxRQUFRLENBQ1osZUFDQTtRQUVELElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUlYLG9CQUFvQjtRQUN2QyxJQUFJLENBQUNXLFNBQVMsQ0FBQyxJQUFJVDtRQUNuQixJQUFJLENBQUNVLE1BQU0sQ0FDViw2QkFDQSw4RUFDQSxDQUFDQyxRQUFrQlQsd0JBQXdCVSxPQUFPRCxTQUNsRFY7SUFFRjtJQUVBOzs7RUFHQyxHQUNELEFBQWdCWSxPQUFPQyxFQUE0QyxFQUFRO1FBQzFFLE9BQU8sS0FBSyxDQUFDRCxPQUFPLENBQUMsR0FBR0U7WUFDdkIsTUFBTUMsTUFBTUQsS0FBS0UsRUFBRSxDQUFDLENBQUM7WUFDckIsTUFBTUMsUUFBUUgsSUFBSSxDQUFDLEVBQUU7WUFDckIsTUFBTUksc0JBQ0xDLE1BQU1DLE9BQU8sQ0FBQ0gsVUFBVSxPQUFPQSxVQUFVLFlBQVlBLFVBQVVJO1lBQ2hFLE1BQU1DLE9BQU9KLHNCQUF1QkosSUFBSSxDQUFDLEVBQUUsR0FBcUJBLElBQUksQ0FBQyxFQUFFO1lBRXZFLE1BQU1TLFNBQVNDLDBCQUEwQlA7WUFDekMsSUFBSU0sT0FBT0UsTUFBTSxHQUFHLEdBQUc7Z0JBQ3RCVixJQUFJVyxjQUFjLENBQUMsVUFBVUg7WUFDOUI7WUFDQSxPQUFPVixHQUFHUyxNQUFNUDtRQUNqQjtJQUNEO0FBQ0Q7QUFDQSxTQUFTUywwQkFBMEJQLEtBQWM7SUFDaEQsSUFBSUUsTUFBTUMsT0FBTyxDQUFDSCxRQUFRO1FBQ3pCLE9BQU9BLE1BQU1VLE1BQU0sQ0FBQyxDQUFDQyxJQUFtQixPQUFPQSxNQUFNLFlBQVlBLE1BQU07SUFDeEU7SUFDQSxJQUFJLE9BQU9YLFVBQVUsWUFBWUEsVUFBVSxJQUFJO1FBQzlDLE9BQU87WUFBQ0E7U0FBTTtJQUNmO0lBQ0EsT0FBTyxFQUFFO0FBQ1YifQ==