@workflow/next 5.0.0-beta.42 → 5.0.0-beta.44

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.
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.classifyRebuild = exports.replaceSourceSnapshots = exports.getRelevantFiles = exports.createSourceSnapshot = exports.createSourceSnapshotFromSource = exports.extractDefinitionSignature = exports.extractImportSignature = exports.stripCommentsFromSource = void 0;
3
+ exports.classifyRebuild = exports.pinBaselinesAcrossFullRebuild = exports.replaceSourceSnapshots = exports.getRelevantFiles = exports.createSourceSnapshot = exports.createSourceSnapshotFromSource = exports.extractDefinitionSignature = exports.extractImportSignature = exports.stripCommentsFromSource = void 0;
4
4
  const promises_1 = require("node:fs/promises");
5
5
  const importSpecifierPatterns = [
6
6
  /\bfrom\s+['"]([^'"]+)['"]/g,
@@ -192,11 +192,88 @@ const replaceSourceSnapshots = async ({ discoveredEntries, inputFiles, normalize
192
192
  sourceSnapshots.set(file, await readSnapshot(file));
193
193
  }
194
194
  catch {
195
- sourceSnapshots.delete(file);
195
+ // Unreadable (e.g. just deleted) files stay absent from the
196
+ // freshly cleared map.
196
197
  }
197
198
  }));
198
199
  };
199
200
  exports.replaceSourceSnapshots = replaceSourceSnapshots;
201
+ /**
202
+ * Read snapshots for every currently relevant file without mutating the
203
+ * shared baseline map. Used by `pinBaselinesAcrossFullRebuild` to capture
204
+ * content at rebuild start, so the baseline can later be pinned to what the
205
+ * rebuild actually consumed.
206
+ */
207
+ const captureSourceSnapshots = async ({ discoveredEntries, inputFiles, normalizePath = defaultNormalizePath, readSnapshot, }) => {
208
+ const snapshots = new Map();
209
+ await Promise.all([
210
+ ...(0, exports.getRelevantFiles)({
211
+ discoveredEntries,
212
+ inputFiles,
213
+ normalizePath,
214
+ }),
215
+ ].map(async (file) => {
216
+ try {
217
+ snapshots.set(file, await readSnapshot(file));
218
+ }
219
+ catch { }
220
+ }));
221
+ return snapshots;
222
+ };
223
+ /**
224
+ * Run a full rebuild while keeping the classifier baseline anchored to the
225
+ * content the rebuild consumed.
226
+ *
227
+ * A full rebuild reads sources twice: once when the bundler consumes them and
228
+ * once when the baseline is refreshed from disk afterwards (the `rebuild`
229
+ * callback owns both, in that order). An edit that lands between those reads
230
+ * would be absorbed into the baseline without ever being built, and its
231
+ * queued watcher event would then classify as a no-op, silently dropping
232
+ * the change until the next unrelated rebuild.
233
+ *
234
+ * To prevent that, the relevant files are re-read from disk immediately
235
+ * before the rebuild starts, and files present both before and after get
236
+ * that captured value restored. A mid-(multi-second-)rebuild edit then still
237
+ * diffs against what the rebuild consumed, while a duplicate watcher event
238
+ * for content the rebuild already consumed (watchers routinely emit several
239
+ * events per edit, the triggering edit included) diffs equal and stays a
240
+ * no-op instead of cascading into back-to-back full rebuilds.
241
+ *
242
+ * The capture costs one serial read of the relevant set (~150-250ms at ~250
243
+ * files) per full rediscovery. A zero-read formulation (cloning the live
244
+ * baseline map and pinning the triggering batch to the snapshots
245
+ * `classifyRebuild` read) was tried and reverted: writes landing in the
246
+ * capture window (test-teardown restores, multi-flush setup bursts) are
247
+ * content the imminent build consumes anyway, and the clone un-absorbs them
248
+ * into follow-up full rebuilds; with real-world multi-second rebuilds that
249
+ * bursts into rebuild chains. The disk capture intentionally coalesces such
250
+ * writes into the in-flight rebuild.
251
+ *
252
+ * Files the rebuild discovered for the first time have no captured content
253
+ * and keep their post-build baseline. That is already sound for the two
254
+ * cases that matter: a new file the build missed has no baseline at all, so
255
+ * its queued add event forces the follow-up rebuild, and a new file the
256
+ * build did consume gets a baseline matching what it consumed. What stays
257
+ * narrowed rather than closed is a file created and then edited again within
258
+ * one rebuild window; eviction-style conservatism was tried against that
259
+ * and rejected too: it turned every added file's routine duplicate watcher
260
+ * events into redundant full rebuilds.
261
+ */
262
+ const pinBaselinesAcrossFullRebuild = async ({ discoveredEntries, inputFiles, normalizePath = defaultNormalizePath, readSnapshot, rebuild, sourceSnapshots, }) => {
263
+ const preBuildSnapshots = await captureSourceSnapshots({
264
+ discoveredEntries,
265
+ inputFiles,
266
+ normalizePath,
267
+ readSnapshot,
268
+ });
269
+ await rebuild();
270
+ for (const [file, snapshot] of preBuildSnapshots) {
271
+ if (sourceSnapshots.has(file)) {
272
+ sourceSnapshots.set(file, snapshot);
273
+ }
274
+ }
275
+ };
276
+ exports.pinBaselinesAcrossFullRebuild = pinBaselinesAcrossFullRebuild;
200
277
  const didSourceSnapshotChange = (previousSnapshot, nextSnapshot) => previousSnapshot.importSignature !== nextSnapshot.importSignature ||
201
278
  previousSnapshot.definitionSignature !== nextSnapshot.definitionSignature ||
202
279
  previousSnapshot.hasDirective !== nextSnapshot.hasDirective ||
@@ -396,4 +473,4 @@ const classifyRebuild = async ({ discoveredEntries, fileChanges, inputFiles, nor
396
473
  }
397
474
  };
398
475
  exports.classifyRebuild = classifyRebuild;
399
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtcmVidWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YXRjaC1yZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0QztBQW9DNUMsTUFBTSx1QkFBdUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsMENBQTBDO0lBQzFDLHdDQUF3QztJQUN4Qyx5Q0FBeUM7Q0FDMUMsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsb0dBQW9HO0lBQ3BHLHlJQUF5STtDQUMxSSxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FDckIsa01BQWtNLENBQUM7QUFFck0sTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztDQUNKLENBQUMsQ0FBQztBQUNILE1BQU0scUJBQXFCLEdBQ3pCLHVFQUF1RSxDQUFDO0FBRTFFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFH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aUJBQWlCO1lBQ2pCLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQztZQUNBLENBQUMsQ0FBQztnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCx3QkFBd0IsRUFBRSw0QkFBNEIsQ0FBQztvQkFDckQsWUFBWSxFQUFFLG9CQUFvQjtvQkFDbEMsaUJBQWlCO29CQUNqQixhQUFhO2lCQUNkLENBQUM7Z0JBQ0YsU0FBUzthQUNWO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBM0ZXLFFBQUEsZUFBZSxtQkEyRjFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkRW50cmllc0xpa2Uge1xuICBkaXNjb3ZlcmVkU3RlcHM6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBTZXQ8c3RyaW5nPjtcbiAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkRmlsZXM/OiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ2hhbmdlcyB7XG4gIGFkZGVkRmlsZXM6IHN0cmluZ1tdO1xuICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VTbmFwc2hvdCB7XG4gIGltcG9ydFNpZ25hdHVyZTogc3RyaW5nO1xuICBkZWZpbml0aW9uU2lnbmF0dXJlOiBzdHJpbmc7XG4gIGhhc0RpcmVjdGl2ZTogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJlYnVpbGREZWNpc2lvbiA9XG4gIHwgeyBraW5kOiAnbm9uZSc7IHNuYXBzaG90cz86IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PiB9XG4gIHwge1xuICAgICAga2luZDogJ2hvdCc7XG4gICAgICByZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnM6IGJvb2xlYW47XG4gICAgICBzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PjtcbiAgICB9XG4gIHwgeyBraW5kOiAnZnVsbCcgfTtcblxuZXhwb3J0IHR5cGUgU291cmNlUGF0dGVybkRldGVjdG9yID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGhhc0RpcmVjdGl2ZTogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59O1xuXG5jb25zdCBpbXBvcnRTcGVjaWZpZXJQYXR0ZXJucyA9IFtcbiAgL1xcYmZyb21cXHMrWydcIl0oW14nXCJdKylbJ1wiXS9nLFxuICAvKD86XnxbO1xcbl0pXFxzKmltcG9ydFxccytbJ1wiXShbXidcIl0rKVsnXCJdL2csXG4gIC9cXGJpbXBvcnRcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXSspWydcIl1cXHMqXFwpL2csXG4gIC9cXGJyZXF1aXJlXFxzKlxcKFxccypbJ1wiXShbXidcIl0rKVsnXCJdXFxzKlxcKS9nLFxuXTtcbmNvbnN0IGRpcmVjdGl2ZUZ1bmN0aW9uUGF0dGVybnMgPSBbXG4gIC9cXGIoPzpleHBvcnRcXHMrKT8oPzphc3luY1xccyspP2Z1bmN0aW9uXFxzKyhbQS1aYS16XyRdW1xcdyRdKilbXntdKlxce1xccypbJ1wiXXVzZVxccysod29ya2Zsb3d8c3RlcClbJ1wiXS9nLFxuICAvXFxiKD86ZXhwb3J0XFxzKyk/Y29uc3RcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccyo9XFxzKig/OmFzeW5jXFxzKik/KD86XFwoW14pXSpcXCl8W0EtWmEtel8kXVtcXHckXSopXFxzKj0+XFxzKlxce1xccypbJ1wiXXVzZVxccysod29ya2Zsb3d8c3RlcClbJ1wiXS9nLFxuXTtcbmNvbnN0IHNlcmRlQ2xhc3NQYXR0ZXJuID1cbiAgL1xcYmNsYXNzXFxzKyhbQS1aYS16XyRdW1xcdyRdKilbXFxzXFxTXSo/KD86c3RhdGljXFxzK2NsYXNzSWRcXHMqPVxccypbJ1wiXShbXidcIl0rKVsnXCJdfFN5bWJvbFxcLmZvclxccypcXChcXHMqWydcIl13b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpWydcIl1cXHMqXFwpfFxcW1xccypXT1JLRkxPV18oPzpTRVJJQUxJWkV8REVTRVJJQUxJWkUpXFxzKlxcXSkvZztcblxuY29uc3QgZGVmYXVsdE5vcm1hbGl6ZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZykgPT4gcGF0aG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5jb25zdCBSRUdFWF9QUkVGSVhfQ0hBUlMgPSBuZXcgU2V0KFtcbiAgJygnLFxuICAneycsXG4gICdbJyxcbiAgJz0nLFxuICAnOicsXG4gICcsJyxcbiAgJzsnLFxuICAnIScsXG4gICc/JyxcbiAgJyYnLFxuICAnfCcsXG4gICcrJyxcbiAgJy0nLFxuICAnKicsXG4gICd+JyxcbiAgJ14nLFxuICAnPCcsXG4gICc+JyxcbiAgJyUnLFxuXSk7XG5jb25zdCBSRUdFWF9QUkVGSVhfS0VZV09SRFMgPVxuICAvXFxiKD86cmV0dXJufHRocm93fGNhc2V8ZGVsZXRlfHZvaWR8dHlwZW9mfGluc3RhbmNlb2Z8aW58eWllbGR8YXdhaXQpJC87XG5cbmNvbnN0IGNhblN0YXJ0UmVnZXhMaXRlcmFsID0gKG91dHB1dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHByZXZpb3VzID0gb3V0cHV0LnRyaW1FbmQoKTtcbiAgaWYgKHByZXZpb3VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHByZXZpb3VzQ2hhciA9IHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gKFxuICAgIFJFR0VYX1BSRUZJWF9DSEFSUy5oYXMocHJldmlvdXNDaGFyKSB8fCBSRUdFWF9QUkVGSVhfS0VZV09SRFMudGVzdChwcmV2aW91cylcbiAgKTtcbn07XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9FeGNlc3NpdmVDb2duaXRpdmVDb21wbGV4aXR5OiBLZWVwIHRoZSBzdHJpbmcvY29tbWVudC9yZWdleCBzY2FubmVyIGxvY2FsIGFuZCBhbGxvY2F0aW9uLWxpZ2h0LlxuZXhwb3J0IGNvbnN0IHN0cmlwQ29tbWVudHNGcm9tU291cmNlID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGxldCBvdXRwdXQgPSAnJztcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHF1b3RlOiAnXCInIHwgXCInXCIgfCAnYCcgfCB1bmRlZmluZWQ7XG4gIGxldCByZWdleCA9IGZhbHNlO1xuICBsZXQgcmVnZXhDaGFyQ2xhc3MgPSBmYWxzZTtcbiAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcblxuICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgY29uc3QgbmV4dCA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgaWYgKHF1b3RlIHx8IHJlZ2V4KSB7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChxdW90ZSAmJiBjaGFyID09PSBxdW90ZSkge1xuICAgICAgICBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJ1snKSB7XG4gICAgICAgIHJlZ2V4Q2hhckNsYXNzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJ10nKSB7XG4gICAgICAgIHJlZ2V4Q2hhckNsYXNzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ICYmIGNoYXIgPT09ICcvJyAmJiAhcmVnZXhDaGFyQ2xhc3MpIHtcbiAgICAgICAgcmVnZXggPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInIHx8IGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgcXVvdGUgPSBjaGFyO1xuICAgICAgb3V0cHV0ICs9IGNoYXI7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhciA9PT0gJy8nICYmXG4gICAgICBuZXh0ICE9PSAnLycgJiZcbiAgICAgIG5leHQgIT09ICcqJyAmJlxuICAgICAgY2FuU3RhcnRSZWdleExpdGVyYWwob3V0cHV0KVxuICAgICkge1xuICAgICAgcmVnZXggPSB0cnVlO1xuICAgICAgb3V0cHV0ICs9IGNoYXI7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGggJiYgc291cmNlW2luZGV4XSAhPT0gJ1xcbicpIHtcbiAgICAgICAgb3V0cHV0ICs9ICcgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7XG4gICAgICBvdXRwdXQgKz0gJyAgJztcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrQ2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICAgIGNvbnN0IGJsb2NrTmV4dCA9IHNvdXJjZVtpbmRleCArIDFdO1xuICAgICAgICBpZiAoYmxvY2tDaGFyID09PSAnKicgJiYgYmxvY2tOZXh0ID09PSAnLycpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gJyAgJztcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCArPSBibG9ja0NoYXIgPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmNvbnN0IHNvdXJjZU1heUNvbnRhaW5JbXBvcnRTcGVjaWZpZXJzID0gKHNvdXJjZTogc3RyaW5nKSA9PlxuICBzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCcpIHx8XG4gIHNvdXJjZS5pbmNsdWRlcygncmVxdWlyZScpIHx8XG4gIHNvdXJjZS5pbmNsdWRlcygnZnJvbScpO1xuXG5jb25zdCBjb2xsZWN0SW1wb3J0U3BlY2lmaWVycyA9IChzb3VyY2U6IHN0cmluZykgPT4ge1xuICBjb25zdCBzcGVjaWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBpbXBvcnRTcGVjaWZpZXJQYXR0ZXJucykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZS5tYXRjaEFsbChwYXR0ZXJuKSkge1xuICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgIHNwZWNpZmllcnMuYWRkKG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zcGVjaWZpZXJzXS5zb3J0KCkuam9pbignXFxuJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZXh0cmFjdEltcG9ydFNpZ25hdHVyZSA9IChzb3VyY2U6IHN0cmluZykgPT5cbiAgc291cmNlTWF5Q29udGFpbkltcG9ydFNwZWNpZmllcnMoc291cmNlKVxuICAgID8gY29sbGVjdEltcG9ydFNwZWNpZmllcnMoc291cmNlKVxuICAgIDogJyc7XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0RGVmaW5pdGlvblNpZ25hdHVyZSA9IChzb3VyY2U6IHN0cmluZykgPT4ge1xuICBjb25zdCBkZWZpbml0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRpcmVjdGl2ZUZ1bmN0aW9uUGF0dGVybnMpIHtcbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzb3VyY2UubWF0Y2hBbGwocGF0dGVybikpIHtcbiAgICAgIGRlZmluaXRpb25zLnB1c2goYCR7bWF0Y2hbMl19OiR7bWF0Y2hbMV19YCk7XG4gICAgfVxuICB9XG4gIHNlcmRlQ2xhc3NQYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKHNlcmRlQ2xhc3NQYXR0ZXJuKSkge1xuICAgIGRlZmluaXRpb25zLnB1c2goYHNlcmRlOiR7bWF0Y2hbMl0gPz8gbWF0Y2hbMV19YCk7XG4gIH1cbiAgcmV0dXJuIGRlZmluaXRpb25zLnNvcnQoKS5qb2luKCdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3VyY2VTbmFwc2hvdEZyb21Tb3VyY2UgPSAoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zOiBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3Jcbik6IFNvdXJjZVNuYXBzaG90ID0+IHtcbiAgY29uc3Qgc291cmNlV2l0aG91dENvbW1lbnRzID0gc3RyaXBDb21tZW50c0Zyb21Tb3VyY2Uoc291cmNlKTtcbiAgY29uc3QgcGF0dGVybnMgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZVdpdGhvdXRDb21tZW50cyk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbXBvcnRTaWduYXR1cmU6IGV4dHJhY3RJbXBvcnRTaWduYXR1cmUoc291cmNlV2l0aG91dENvbW1lbnRzKSxcbiAgICBkZWZpbml0aW9uU2lnbmF0dXJlOiBleHRyYWN0RGVmaW5pdGlvblNpZ25hdHVyZShzb3VyY2VXaXRob3V0Q29tbWVudHMpLFxuICAgIGhhc0RpcmVjdGl2ZTogcGF0dGVybnMuaGFzRGlyZWN0aXZlLFxuICAgIGhhc1NlcmRlOiBwYXR0ZXJucy5oYXNTZXJkZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3VyY2VTbmFwc2hvdCA9IGFzeW5jICh7XG4gIGZpbGUsXG4gIGRldGVjdFdvcmtmbG93UGF0dGVybnMsXG59OiB7XG4gIGZpbGU6IHN0cmluZztcbiAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJuczogU291cmNlUGF0dGVybkRldGVjdG9yO1xufSk6IFByb21pc2U8U291cmNlU25hcHNob3Q+ID0+XG4gIGNyZWF0ZVNvdXJjZVNuYXBzaG90RnJvbVNvdXJjZShcbiAgICBhd2FpdCByZWFkRmlsZShmaWxlLCAndXRmOCcpLFxuICAgIGRldGVjdFdvcmtmbG93UGF0dGVybnNcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGV2YW50RmlsZXMgPSAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aD86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbn0pID0+XG4gIG5ldyBTZXQoXG4gICAgW1xuICAgICAgLi4uaW5wdXRGaWxlcyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTdGVwcyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRXb3JrZmxvd3MsXG4gICAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgICAgIC4uLihkaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkRmlsZXMgfHwgW10pLFxuICAgIF0ubWFwKG5vcm1hbGl6ZVBhdGgpXG4gICk7XG5cbmV4cG9ydCBjb25zdCByZXBsYWNlU291cmNlU25hcHNob3RzID0gYXN5bmMgKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xuICBzb3VyY2VTbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pjtcbn0pID0+IHtcbiAgc291cmNlU25hcHNob3RzLmNsZWFyKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFtcbiAgICAgIC4uLmdldFJlbGV2YW50RmlsZXMoe1xuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIH0pLFxuICAgIF0ubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzb3VyY2VTbmFwc2hvdHMuc2V0KGZpbGUsIGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgc291cmNlU25hcHNob3RzLmRlbGV0ZShmaWxlKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufTtcblxuY29uc3QgZGlkU291cmNlU25hcHNob3RDaGFuZ2UgPSAoXG4gIHByZXZpb3VzU25hcHNob3Q6IFNvdXJjZVNuYXBzaG90LFxuICBuZXh0U25hcHNob3Q6IFNvdXJjZVNuYXBzaG90XG4pID0+XG4gIHByZXZpb3VzU25hcHNob3QuaW1wb3J0U2lnbmF0dXJlICE9PSBuZXh0U25hcHNob3QuaW1wb3J0U2lnbmF0dXJlIHx8XG4gIHByZXZpb3VzU25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSAhPT0gbmV4dFNuYXBzaG90LmRlZmluaXRpb25TaWduYXR1cmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5oYXNEaXJlY3RpdmUgIT09IG5leHRTbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5oYXNTZXJkZSAhPT0gbmV4dFNuYXBzaG90Lmhhc1NlcmRlO1xuXG5jb25zdCB1bmlxdWUgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiBbLi4ubmV3IFNldChwYXRocyldO1xuXG5jb25zdCBzbmFwc2hvdENoYW5nZWRGaWxlID0gYXN5bmMgKHtcbiAgZmlsZSxcbiAgbmV4dFNuYXBzaG90cyxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGZpbGU6IHN0cmluZztcbiAgbmV4dFNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xuICBzb3VyY2VTbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pjtcbn0pID0+IHtcbiAgY29uc3QgcHJldmlvdXNTbmFwc2hvdCA9IHNvdXJjZVNuYXBzaG90cy5nZXQoZmlsZSk7XG4gIGlmICghcHJldmlvdXNTbmFwc2hvdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5leHRTbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBuZXh0U25hcHNob3RzLnNldChmaWxlLCBuZXh0U25hcHNob3QpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IHJlbW92ZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBpbnB1dEZpbGVzLFxuICBub3JtYWxpemVQYXRoLFxuICByZW1vdmVkRmlsZXMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlbW92ZWRGaWxlczogc3RyaW5nW107XG59KSA9PiB7XG4gIGNvbnN0IHJlbGV2YW50RmlsZXMgPSBnZXRSZWxldmFudEZpbGVzKHtcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBpbnB1dEZpbGVzLFxuICAgIG5vcm1hbGl6ZVBhdGgsXG4gIH0pO1xuICByZXR1cm4gcmVtb3ZlZEZpbGVzLnNvbWUoKGZpbGUpID0+IHJlbGV2YW50RmlsZXMuaGFzKGZpbGUpKTtcbn07XG5cbmNvbnN0IGFkZGVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBhZGRlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG59OiB7XG4gIGFkZGVkRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYWRkZWRGaWxlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgICAgIGlmIChzbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHwgc25hcHNob3QuaGFzU2VyZGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgcHJ1bmVTdGFsZUFkZGVkRmlsZXMgPSBhc3luYyAoe1xuICBhZGRlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBuZXh0QWRkZWRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiB1bmlxdWUoYWRkZWRGaWxlcykpIHtcbiAgICBjb25zdCBwcmV2aW91c1NuYXBzaG90ID0gc291cmNlU25hcHNob3RzLmdldChmaWxlKTtcbiAgICBpZiAoIXByZXZpb3VzU25hcHNob3QpIHtcbiAgICAgIG5leHRBZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgbmV4dEFkZGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdHMuc2V0KGZpbGUsIG5leHRTbmFwc2hvdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBuZXh0QWRkZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFkZGVkRmlsZXM6IG5leHRBZGRlZEZpbGVzLCBzbmFwc2hvdHMgfTtcbn07XG5cbmNvbnN0IG1vZGlmaWVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBtb2RpZmllZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgbW9kaWZpZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgdW5pcXVlKG1vZGlmaWVkRmlsZXMpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5leHRTbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU25hcHNob3QgPSBzb3VyY2VTbmFwc2hvdHMuZ2V0KGZpbGUpO1xuICAgICAgaWYgKCFwcmV2aW91c1NuYXBzaG90KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0U25hcHNob3QuaW1wb3J0U2lnbmF0dXJlIHx8XG4gICAgICAgICAgbmV4dFNuYXBzaG90LmRlZmluaXRpb25TaWduYXR1cmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuaGFzRGlyZWN0aXZlIHx8XG4gICAgICAgICAgbmV4dFNuYXBzaG90Lmhhc1NlcmRlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZ2V0Q2hhbmdlZFJlbGV2YW50RmlsZXMgPSAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgZmlsZUNoYW5nZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGgsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgcmVsZXZhbnRGaWxlcyA9IGdldFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIHJldHVybiB1bmlxdWUoZmlsZUNoYW5nZXMubW9kaWZpZWRGaWxlcykuZmlsdGVyKChmaWxlKSA9PlxuICAgIHJlbGV2YW50RmlsZXMuaGFzKGZpbGUpXG4gICk7XG59O1xuXG5jb25zdCBjb2xsZWN0SG90UmVidWlsZFNuYXBzaG90cyA9IGFzeW5jICh7XG4gIGNoYW5nZWRGaWxlcyxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBjaGFuZ2VkRmlsZXMpIHtcbiAgICBpZiAoXG4gICAgICAhKGF3YWl0IHNuYXBzaG90Q2hhbmdlZEZpbGUoe1xuICAgICAgICBmaWxlLFxuICAgICAgICBuZXh0U25hcHNob3RzOiBzbmFwc2hvdHMsXG4gICAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICAgICAgc291cmNlU25hcHNob3RzLFxuICAgICAgfSkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbmFwc2hvdHM7XG59O1xuXG5jb25zdCB3b3JrZmxvd0VudHJ5RmlsZXNDaGFuZ2VkID0gKHtcbiAgY2hhbmdlZEZpbGVzLFxuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyZW50SGFzQ2hpbGQsXG59OiB7XG4gIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcGFyZW50SGFzQ2hpbGQ6IChcbiAgICBwYXJlbnQ6IHN0cmluZyxcbiAgICBjaGlsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGV4Y2x1ZGVkUm9vdHM/OiBJdGVyYWJsZTxzdHJpbmc+IH1cbiAgKSA9PiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCB3b3JrZmxvd0VudHJ5RmlsZXMgPSBbXG4gICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgXS5tYXAobm9ybWFsaXplUGF0aCk7XG4gIGNvbnN0IHN0ZXBFbnRyeUZpbGVzID0gWy4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTdGVwc10ubWFwKFxuICAgIG5vcm1hbGl6ZVBhdGhcbiAgKTtcblxuICByZXR1cm4gY2hhbmdlZEZpbGVzLnNvbWUoKGNoYW5nZWRGaWxlKSA9PiB7XG4gICAgaWYgKHdvcmtmbG93RW50cnlGaWxlcy5pbmNsdWRlcyhjaGFuZ2VkRmlsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoc3RlcEVudHJ5RmlsZXMuaW5jbHVkZXMoY2hhbmdlZEZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZmxvd0VudHJ5RmlsZXMuc29tZSgod29ya2Zsb3dGaWxlKSA9PlxuICAgICAgcGFyZW50SGFzQ2hpbGQod29ya2Zsb3dGaWxlLCBjaGFuZ2VkRmlsZSwge1xuICAgICAgICBleGNsdWRlZFJvb3RzOiBzdGVwRW50cnlGaWxlcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59O1xuXG5jb25zdCBzdGVwUmVnaXN0cmF0aW9uc05lZWRSZWZyZXNoID0gKHtcbiAgY2hhbmdlZEZpbGVzLFxuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgbm9ybWFsaXplUGF0aCxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCBzZXJkZUZpbGVzID0gbmV3IFNldChcbiAgICBbLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFNlcmRlRmlsZXNdLm1hcChub3JtYWxpemVQYXRoKVxuICApO1xuICByZXR1cm4gY2hhbmdlZEZpbGVzLnNvbWUoKGZpbGUpID0+IHNlcmRlRmlsZXMuaGFzKGZpbGUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGFzc2lmeVJlYnVpbGQgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgZmlsZUNoYW5nZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcGFyZW50SGFzQ2hpbGQsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBmaWxlQ2hhbmdlczogRmlsZUNoYW5nZXM7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwYXJlbnRIYXNDaGlsZDogKFxuICAgIHBhcmVudDogc3RyaW5nLFxuICAgIGNoaWxkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZXhjbHVkZWRSb290cz86IEl0ZXJhYmxlPHN0cmluZz4gfVxuICApID0+IGJvb2xlYW47XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSk6IFByb21pc2U8UmVidWlsZERlY2lzaW9uPiA9PiB7XG4gIGNvbnN0IHBydW5lZEFkZGVkRmlsZXMgPSBhd2FpdCBwcnVuZVN0YWxlQWRkZWRGaWxlcyh7XG4gICAgYWRkZWRGaWxlczogZmlsZUNoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICByZWFkU25hcHNob3QsXG4gICAgc291cmNlU25hcHNob3RzLFxuICB9KTtcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVDaGFuZ2VzID0ge1xuICAgIC4uLmZpbGVDaGFuZ2VzLFxuICAgIGFkZGVkRmlsZXM6IHBydW5lZEFkZGVkRmlsZXMuYWRkZWRGaWxlcyxcbiAgfTtcblxuICBpZiAoXG4gICAgcmVtb3ZlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgICByZW1vdmVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5yZW1vdmVkRmlsZXMsXG4gICAgfSkgfHxcbiAgICAoYXdhaXQgYWRkZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCh7XG4gICAgICBhZGRlZEZpbGVzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICB9KSkgfHxcbiAgICAoYXdhaXQgbW9kaWZpZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCh7XG4gICAgICBtb2RpZmllZEZpbGVzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMubW9kaWZpZWRGaWxlcyxcbiAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICAgIHNvdXJjZVNuYXBzaG90cyxcbiAgICB9KSlcbiAgKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ2Z1bGwnIH07XG4gIH1cblxuICBjb25zdCBjaGFuZ2VkUmVsZXZhbnRGaWxlcyA9IGdldENoYW5nZWRSZWxldmFudEZpbGVzKHtcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBmaWxlQ2hhbmdlczogbm9ybWFsaXplZEZpbGVDaGFuZ2VzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIGlmIChjaGFuZ2VkUmVsZXZhbnRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcHJ1bmVkQWRkZWRGaWxlcy5zbmFwc2hvdHMuc2l6ZSA+IDBcbiAgICAgID8geyBraW5kOiAnbm9uZScsIHNuYXBzaG90czogcHJ1bmVkQWRkZWRGaWxlcy5zbmFwc2hvdHMgfVxuICAgICAgOiB7IGtpbmQ6ICdub25lJyB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzbmFwc2hvdHMgPSBhd2FpdCBjb2xsZWN0SG90UmVidWlsZFNuYXBzaG90cyh7XG4gICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgc291cmNlU25hcHNob3RzLFxuICAgIH0pO1xuICAgIGlmICghc25hcHNob3RzKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtmbG93RW50cnlGaWxlc0NoYW5nZWQoe1xuICAgICAgY2hhbmdlZEZpbGVzOiBjaGFuZ2VkUmVsZXZhbnRGaWxlcyxcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIHBhcmVudEhhc0NoaWxkLFxuICAgIH0pXG4gICAgICA/IHtcbiAgICAgICAgICBraW5kOiAnaG90JyxcbiAgICAgICAgICByZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnM6IHN0ZXBSZWdpc3RyYXRpb25zTmVlZFJlZnJlc2goe1xuICAgICAgICAgICAgY2hhbmdlZEZpbGVzOiBjaGFuZ2VkUmVsZXZhbnRGaWxlcyxcbiAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzbmFwc2hvdHMsXG4gICAgICAgIH1cbiAgICAgIDogeyBraW5kOiAnbm9uZScsIHNuYXBzaG90cyB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgfVxufTtcbiJdfQ==
476
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtcmVidWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YXRjaC1yZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0QztBQW9DNUMsTUFBTSx1QkFBdUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsMENBQTBDO0lBQzFDLHdDQUF3QztJQUN4Qyx5Q0FBeUM7Q0FDMUMsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsb0dBQW9HO0lBQ3BHLHlJQUF5STtDQUMxSSxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FDckIsa01BQWtNLENBQUM7QUFFck0sTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztDQUNKLENBQUMsQ0FBQztBQUNILE1BQU0scUJBQXFCLEdBQ3pCLHVFQUF1RSxDQUFDO0FBRTFFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFH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QUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8seUJBQXlCLENBQUM7WUFDL0IsWUFBWSxFQUFFLG9CQUFvQjtZQUNsQyxpQkFBaUI7WUFDakIsYUFBYTtZQUNiLGNBQWM7U0FDZixDQUFDO1lBQ0EsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLHdCQUF3QixFQUFFLDRCQUE0QixDQUFDO29CQUNyRCxZQUFZLEVBQUUsb0JBQW9CO29CQUNsQyxpQkFBaUI7b0JBQ2pCLGFBQWE7aUJBQ2QsQ0FBQztnQkFDRixTQUFTO2FBQ1Y7WUFDSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDLENBQUM7QUEzRlcsUUFBQSxlQUFlLG1CQTJGMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc2NvdmVyZWRFbnRyaWVzTGlrZSB7XG4gIGRpc2NvdmVyZWRTdGVwczogU2V0PHN0cmluZz47XG4gIGRpc2NvdmVyZWRXb3JrZmxvd3M6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogU2V0PHN0cmluZz47XG4gIGRpc2NvdmVyZWRGaWxlcz86IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2VzIHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIG1vZGlmaWVkRmlsZXM6IHN0cmluZ1tdO1xuICByZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVNuYXBzaG90IHtcbiAgaW1wb3J0U2lnbmF0dXJlOiBzdHJpbmc7XG4gIGRlZmluaXRpb25TaWduYXR1cmU6IHN0cmluZztcbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUmVidWlsZERlY2lzaW9uID1cbiAgfCB7IGtpbmQ6ICdub25lJzsgc25hcHNob3RzPzogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+IH1cbiAgfCB7XG4gICAgICBraW5kOiAnaG90JztcbiAgICAgIHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9uczogYm9vbGVhbjtcbiAgICAgIHNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xuICAgIH1cbiAgfCB7IGtpbmQ6ICdmdWxsJyB9O1xuXG5leHBvcnQgdHlwZSBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3IgPSAoc291cmNlOiBzdHJpbmcpID0+IHtcbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn07XG5cbmNvbnN0IGltcG9ydFNwZWNpZmllclBhdHRlcm5zID0gW1xuICAvXFxiZnJvbVxccytbJ1wiXShbXidcIl0rKVsnXCJdL2csXG4gIC8oPzpefFs7XFxuXSlcXHMqaW1wb3J0XFxzK1snXCJdKFteJ1wiXSspWydcIl0vZyxcbiAgL1xcYmltcG9ydFxccypcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccypcXCkvZyxcbiAgL1xcYnJlcXVpcmVcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXSspWydcIl1cXHMqXFwpL2csXG5dO1xuY29uc3QgZGlyZWN0aXZlRnVuY3Rpb25QYXR0ZXJucyA9IFtcbiAgL1xcYig/OmV4cG9ydFxccyspPyg/OmFzeW5jXFxzKyk/ZnVuY3Rpb25cXHMrKFtBLVphLXpfJF1bXFx3JF0qKVtee10qXFx7XFxzKlsnXCJddXNlXFxzKyh3b3JrZmxvd3xzdGVwKVsnXCJdL2csXG4gIC9cXGIoPzpleHBvcnRcXHMrKT9jb25zdFxccysoW0EtWmEtel8kXVtcXHckXSopXFxzKj1cXHMqKD86YXN5bmNcXHMqKT8oPzpcXChbXildKlxcKXxbQS1aYS16XyRdW1xcdyRdKilcXHMqPT5cXHMqXFx7XFxzKlsnXCJddXNlXFxzKyh3b3JrZmxvd3xzdGVwKVsnXCJdL2csXG5dO1xuY29uc3Qgc2VyZGVDbGFzc1BhdHRlcm4gPVxuICAvXFxiY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVtcXHNcXFNdKj8oPzpzdGF0aWNcXHMrY2xhc3NJZFxccyo9XFxzKlsnXCJdKFteJ1wiXSspWydcIl18U3ltYm9sXFwuZm9yXFxzKlxcKFxccypbJ1wiXXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlbJ1wiXVxccypcXCl8XFxbXFxzKldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSlcXHMqXFxdKS9nO1xuXG5jb25zdCBkZWZhdWx0Tm9ybWFsaXplUGF0aCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbmNvbnN0IFJFR0VYX1BSRUZJWF9DSEFSUyA9IG5ldyBTZXQoW1xuICAnKCcsXG4gICd7JyxcbiAgJ1snLFxuICAnPScsXG4gICc6JyxcbiAgJywnLFxuICAnOycsXG4gICchJyxcbiAgJz8nLFxuICAnJicsXG4gICd8JyxcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJ34nLFxuICAnXicsXG4gICc8JyxcbiAgJz4nLFxuICAnJScsXG5dKTtcbmNvbnN0IFJFR0VYX1BSRUZJWF9LRVlXT1JEUyA9XG4gIC9cXGIoPzpyZXR1cm58dGhyb3d8Y2FzZXxkZWxldGV8dm9pZHx0eXBlb2Z8aW5zdGFuY2VvZnxpbnx5aWVsZHxhd2FpdCkkLztcblxuY29uc3QgY2FuU3RhcnRSZWdleExpdGVyYWwgPSAob3V0cHV0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcHJldmlvdXMgPSBvdXRwdXQudHJpbUVuZCgpO1xuICBpZiAocHJldmlvdXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcHJldmlvdXNDaGFyID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gIHJldHVybiAoXG4gICAgUkVHRVhfUFJFRklYX0NIQVJTLmhhcyhwcmV2aW91c0NoYXIpIHx8IFJFR0VYX1BSRUZJWF9LRVlXT1JEUy50ZXN0KHByZXZpb3VzKVxuICApO1xufTtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0V4Y2Vzc2l2ZUNvZ25pdGl2ZUNvbXBsZXhpdHk6IEtlZXAgdGhlIHN0cmluZy9jb21tZW50L3JlZ2V4IHNjYW5uZXIgbG9jYWwgYW5kIGFsbG9jYXRpb24tbGlnaHQuXG5leHBvcnQgY29uc3Qgc3RyaXBDb21tZW50c0Zyb21Tb3VyY2UgPSAoc291cmNlOiBzdHJpbmcpID0+IHtcbiAgbGV0IG91dHB1dCA9ICcnO1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcXVvdGU6ICdcIicgfCBcIidcIiB8ICdgJyB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlZ2V4ID0gZmFsc2U7XG4gIGxldCByZWdleENoYXJDbGFzcyA9IGZhbHNlO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuXG4gIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICBjb25zdCBuZXh0ID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICBpZiAocXVvdGUgfHwgcmVnZXgpIHtcbiAgICAgIG91dHB1dCArPSBjaGFyO1xuICAgICAgaW5kZXgrKztcblxuICAgICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHF1b3RlICYmIGNoYXIgPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChyZWdleCAmJiBjaGFyID09PSAnWycpIHtcbiAgICAgICAgcmVnZXhDaGFyQ2xhc3MgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChyZWdleCAmJiBjaGFyID09PSAnXScpIHtcbiAgICAgICAgcmVnZXhDaGFyQ2xhc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJy8nICYmICFyZWdleENoYXJDbGFzcykge1xuICAgICAgICByZWdleCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICBxdW90ZSA9IGNoYXI7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFyID09PSAnLycgJiZcbiAgICAgIG5leHQgIT09ICcvJyAmJlxuICAgICAgbmV4dCAhPT0gJyonICYmXG4gICAgICBjYW5TdGFydFJlZ2V4TGl0ZXJhbChvdXRwdXQpXG4gICAgKSB7XG4gICAgICByZWdleCA9IHRydWU7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcvJykge1xuICAgICAgb3V0cHV0ICs9ICcgICc7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgd2hpbGUgKGluZGV4IDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2VbaW5kZXhdICE9PSAnXFxuJykge1xuICAgICAgICBvdXRwdXQgKz0gJyAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnKicpIHtcbiAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYmxvY2tDaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgICAgY29uc3QgYmxvY2tOZXh0ID0gc291cmNlW2luZGV4ICsgMV07XG4gICAgICAgIGlmIChibG9ja0NoYXIgPT09ICcqJyAmJiBibG9ja05leHQgPT09ICcvJykge1xuICAgICAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IGJsb2NrQ2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG91dHB1dCArPSBjaGFyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuY29uc3Qgc291cmNlTWF5Q29udGFpbkltcG9ydFNwZWNpZmllcnMgPSAoc291cmNlOiBzdHJpbmcpID0+XG4gIHNvdXJjZS5pbmNsdWRlcygnaW1wb3J0JykgfHxcbiAgc291cmNlLmluY2x1ZGVzKCdyZXF1aXJlJykgfHxcbiAgc291cmNlLmluY2x1ZGVzKCdmcm9tJyk7XG5cbmNvbnN0IGNvbGxlY3RJbXBvcnRTcGVjaWZpZXJzID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHNwZWNpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGltcG9ydFNwZWNpZmllclBhdHRlcm5zKSB7XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKHBhdHRlcm4pKSB7XG4gICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgc3BlY2lmaWVycy5hZGQobWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnNwZWNpZmllcnNdLnNvcnQoKS5qb2luKCdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0SW1wb3J0U2lnbmF0dXJlID0gKHNvdXJjZTogc3RyaW5nKSA9PlxuICBzb3VyY2VNYXlDb250YWluSW1wb3J0U3BlY2lmaWVycyhzb3VyY2UpXG4gICAgPyBjb2xsZWN0SW1wb3J0U3BlY2lmaWVycyhzb3VyY2UpXG4gICAgOiAnJztcblxuZXhwb3J0IGNvbnN0IGV4dHJhY3REZWZpbml0aW9uU2lnbmF0dXJlID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRlZmluaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZGlyZWN0aXZlRnVuY3Rpb25QYXR0ZXJucykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZS5tYXRjaEFsbChwYXR0ZXJuKSkge1xuICAgICAgZGVmaW5pdGlvbnMucHVzaChgJHttYXRjaFsyXX06JHttYXRjaFsxXX1gKTtcbiAgICB9XG4gIH1cbiAgc2VyZGVDbGFzc1BhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBzb3VyY2UubWF0Y2hBbGwoc2VyZGVDbGFzc1BhdHRlcm4pKSB7XG4gICAgZGVmaW5pdGlvbnMucHVzaChgc2VyZGU6JHttYXRjaFsyXSA/PyBtYXRjaFsxXX1gKTtcbiAgfVxuICByZXR1cm4gZGVmaW5pdGlvbnMuc29ydCgpLmpvaW4oJ1xcbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvdXJjZVNuYXBzaG90RnJvbVNvdXJjZSA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIGRldGVjdFdvcmtmbG93UGF0dGVybnM6IFNvdXJjZVBhdHRlcm5EZXRlY3RvclxuKTogU291cmNlU25hcHNob3QgPT4ge1xuICBjb25zdCBzb3VyY2VXaXRob3V0Q29tbWVudHMgPSBzdHJpcENvbW1lbnRzRnJvbVNvdXJjZShzb3VyY2UpO1xuICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlV2l0aG91dENvbW1lbnRzKTtcblxuICByZXR1cm4ge1xuICAgIGltcG9ydFNpZ25hdHVyZTogZXh0cmFjdEltcG9ydFNpZ25hdHVyZShzb3VyY2VXaXRob3V0Q29tbWVudHMpLFxuICAgIGRlZmluaXRpb25TaWduYXR1cmU6IGV4dHJhY3REZWZpbml0aW9uU2lnbmF0dXJlKHNvdXJjZVdpdGhvdXRDb21tZW50cyksXG4gICAgaGFzRGlyZWN0aXZlOiBwYXR0ZXJucy5oYXNEaXJlY3RpdmUsXG4gICAgaGFzU2VyZGU6IHBhdHRlcm5zLmhhc1NlcmRlLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvdXJjZVNuYXBzaG90ID0gYXN5bmMgKHtcbiAgZmlsZSxcbiAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyxcbn06IHtcbiAgZmlsZTogc3RyaW5nO1xuICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zOiBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3I7XG59KTogUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD4gPT5cbiAgY3JlYXRlU291cmNlU25hcHNob3RGcm9tU291cmNlKFxuICAgIGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4JyksXG4gICAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJuc1xuICApO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsZXZhbnRGaWxlcyA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBpbnB1dEZpbGVzLFxuICBub3JtYWxpemVQYXRoID0gZGVmYXVsdE5vcm1hbGl6ZVBhdGgsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT5cbiAgbmV3IFNldChcbiAgICBbXG4gICAgICAuLi5pbnB1dEZpbGVzLFxuICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFN0ZXBzLFxuICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICAgICAgLi4uKGRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRGaWxlcyB8fCBbXSksXG4gICAgXS5tYXAobm9ybWFsaXplUGF0aClcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHJlcGxhY2VTb3VyY2VTbmFwc2hvdHMgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBzb3VyY2VTbmFwc2hvdHMuY2xlYXIoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgW1xuICAgICAgLi4uZ2V0UmVsZXZhbnRGaWxlcyh7XG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgfSksXG4gICAgXS5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBVbnJlYWRhYmxlIChlLmcuIGp1c3QgZGVsZXRlZCkgZmlsZXMgc3RheSBhYnNlbnQgZnJvbSB0aGVcbiAgICAgICAgLy8gZnJlc2hseSBjbGVhcmVkIG1hcC5cbiAgICAgIH1cbiAgICB9KVxuICApO1xufTtcblxuLyoqXG4gKiBSZWFkIHNuYXBzaG90cyBmb3IgZXZlcnkgY3VycmVudGx5IHJlbGV2YW50IGZpbGUgd2l0aG91dCBtdXRhdGluZyB0aGVcbiAqIHNoYXJlZCBiYXNlbGluZSBtYXAuIFVzZWQgYnkgYHBpbkJhc2VsaW5lc0Fjcm9zc0Z1bGxSZWJ1aWxkYCB0byBjYXB0dXJlXG4gKiBjb250ZW50IGF0IHJlYnVpbGQgc3RhcnQsIHNvIHRoZSBiYXNlbGluZSBjYW4gbGF0ZXIgYmUgcGlubmVkIHRvIHdoYXQgdGhlXG4gKiByZWJ1aWxkIGFjdHVhbGx5IGNvbnN1bWVkLlxuICovXG5jb25zdCBjYXB0dXJlU291cmNlU25hcHNob3RzID0gYXN5bmMgKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcmVhZFNuYXBzaG90LFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aD86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90Pjtcbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pj4gPT4ge1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFtcbiAgICAgIC4uLmdldFJlbGV2YW50RmlsZXMoe1xuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIH0pLFxuICAgIF0ubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzbmFwc2hvdHMuc2V0KGZpbGUsIGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKSk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIHNuYXBzaG90cztcbn07XG5cbi8qKlxuICogUnVuIGEgZnVsbCByZWJ1aWxkIHdoaWxlIGtlZXBpbmcgdGhlIGNsYXNzaWZpZXIgYmFzZWxpbmUgYW5jaG9yZWQgdG8gdGhlXG4gKiBjb250ZW50IHRoZSByZWJ1aWxkIGNvbnN1bWVkLlxuICpcbiAqIEEgZnVsbCByZWJ1aWxkIHJlYWRzIHNvdXJjZXMgdHdpY2U6IG9uY2Ugd2hlbiB0aGUgYnVuZGxlciBjb25zdW1lcyB0aGVtIGFuZFxuICogb25jZSB3aGVuIHRoZSBiYXNlbGluZSBpcyByZWZyZXNoZWQgZnJvbSBkaXNrIGFmdGVyd2FyZHMgKHRoZSBgcmVidWlsZGBcbiAqIGNhbGxiYWNrIG93bnMgYm90aCwgaW4gdGhhdCBvcmRlcikuIEFuIGVkaXQgdGhhdCBsYW5kcyBiZXR3ZWVuIHRob3NlIHJlYWRzXG4gKiB3b3VsZCBiZSBhYnNvcmJlZCBpbnRvIHRoZSBiYXNlbGluZSB3aXRob3V0IGV2ZXIgYmVpbmcgYnVpbHQsIGFuZCBpdHNcbiAqIHF1ZXVlZCB3YXRjaGVyIGV2ZW50IHdvdWxkIHRoZW4gY2xhc3NpZnkgYXMgYSBuby1vcCwgc2lsZW50bHkgZHJvcHBpbmdcbiAqIHRoZSBjaGFuZ2UgdW50aWwgdGhlIG5leHQgdW5yZWxhdGVkIHJlYnVpbGQuXG4gKlxuICogVG8gcHJldmVudCB0aGF0LCB0aGUgcmVsZXZhbnQgZmlsZXMgYXJlIHJlLXJlYWQgZnJvbSBkaXNrIGltbWVkaWF0ZWx5XG4gKiBiZWZvcmUgdGhlIHJlYnVpbGQgc3RhcnRzLCBhbmQgZmlsZXMgcHJlc2VudCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgZ2V0XG4gKiB0aGF0IGNhcHR1cmVkIHZhbHVlIHJlc3RvcmVkLiBBIG1pZC0obXVsdGktc2Vjb25kLSlyZWJ1aWxkIGVkaXQgdGhlbiBzdGlsbFxuICogZGlmZnMgYWdhaW5zdCB3aGF0IHRoZSByZWJ1aWxkIGNvbnN1bWVkLCB3aGlsZSBhIGR1cGxpY2F0ZSB3YXRjaGVyIGV2ZW50XG4gKiBmb3IgY29udGVudCB0aGUgcmVidWlsZCBhbHJlYWR5IGNvbnN1bWVkICh3YXRjaGVycyByb3V0aW5lbHkgZW1pdCBzZXZlcmFsXG4gKiBldmVudHMgcGVyIGVkaXQsIHRoZSB0cmlnZ2VyaW5nIGVkaXQgaW5jbHVkZWQpIGRpZmZzIGVxdWFsIGFuZCBzdGF5cyBhXG4gKiBuby1vcCBpbnN0ZWFkIG9mIGNhc2NhZGluZyBpbnRvIGJhY2stdG8tYmFjayBmdWxsIHJlYnVpbGRzLlxuICpcbiAqIFRoZSBjYXB0dXJlIGNvc3RzIG9uZSBzZXJpYWwgcmVhZCBvZiB0aGUgcmVsZXZhbnQgc2V0ICh+MTUwLTI1MG1zIGF0IH4yNTBcbiAqIGZpbGVzKSBwZXIgZnVsbCByZWRpc2NvdmVyeS4gQSB6ZXJvLXJlYWQgZm9ybXVsYXRpb24gKGNsb25pbmcgdGhlIGxpdmVcbiAqIGJhc2VsaW5lIG1hcCBhbmQgcGlubmluZyB0aGUgdHJpZ2dlcmluZyBiYXRjaCB0byB0aGUgc25hcHNob3RzXG4gKiBgY2xhc3NpZnlSZWJ1aWxkYCByZWFkKSB3YXMgdHJpZWQgYW5kIHJldmVydGVkOiB3cml0ZXMgbGFuZGluZyBpbiB0aGVcbiAqIGNhcHR1cmUgd2luZG93ICh0ZXN0LXRlYXJkb3duIHJlc3RvcmVzLCBtdWx0aS1mbHVzaCBzZXR1cCBidXJzdHMpIGFyZVxuICogY29udGVudCB0aGUgaW1taW5lbnQgYnVpbGQgY29uc3VtZXMgYW55d2F5LCBhbmQgdGhlIGNsb25lIHVuLWFic29yYnMgdGhlbVxuICogaW50byBmb2xsb3ctdXAgZnVsbCByZWJ1aWxkczsgd2l0aCByZWFsLXdvcmxkIG11bHRpLXNlY29uZCByZWJ1aWxkcyB0aGF0XG4gKiBidXJzdHMgaW50byByZWJ1aWxkIGNoYWlucy4gVGhlIGRpc2sgY2FwdHVyZSBpbnRlbnRpb25hbGx5IGNvYWxlc2NlcyBzdWNoXG4gKiB3cml0ZXMgaW50byB0aGUgaW4tZmxpZ2h0IHJlYnVpbGQuXG4gKlxuICogRmlsZXMgdGhlIHJlYnVpbGQgZGlzY292ZXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUgaGF2ZSBubyBjYXB0dXJlZCBjb250ZW50XG4gKiBhbmQga2VlcCB0aGVpciBwb3N0LWJ1aWxkIGJhc2VsaW5lLiBUaGF0IGlzIGFscmVhZHkgc291bmQgZm9yIHRoZSB0d29cbiAqIGNhc2VzIHRoYXQgbWF0dGVyOiBhIG5ldyBmaWxlIHRoZSBidWlsZCBtaXNzZWQgaGFzIG5vIGJhc2VsaW5lIGF0IGFsbCwgc29cbiAqIGl0cyBxdWV1ZWQgYWRkIGV2ZW50IGZvcmNlcyB0aGUgZm9sbG93LXVwIHJlYnVpbGQsIGFuZCBhIG5ldyBmaWxlIHRoZVxuICogYnVpbGQgZGlkIGNvbnN1bWUgZ2V0cyBhIGJhc2VsaW5lIG1hdGNoaW5nIHdoYXQgaXQgY29uc3VtZWQuIFdoYXQgc3RheXNcbiAqIG5hcnJvd2VkIHJhdGhlciB0aGFuIGNsb3NlZCBpcyBhIGZpbGUgY3JlYXRlZCBhbmQgdGhlbiBlZGl0ZWQgYWdhaW4gd2l0aGluXG4gKiBvbmUgcmVidWlsZCB3aW5kb3c7IGV2aWN0aW9uLXN0eWxlIGNvbnNlcnZhdGlzbSB3YXMgdHJpZWQgYWdhaW5zdCB0aGF0XG4gKiBhbmQgcmVqZWN0ZWQgdG9vOiBpdCB0dXJuZWQgZXZlcnkgYWRkZWQgZmlsZSdzIHJvdXRpbmUgZHVwbGljYXRlIHdhdGNoZXJcbiAqIGV2ZW50cyBpbnRvIHJlZHVuZGFudCBmdWxsIHJlYnVpbGRzLlxuICovXG5leHBvcnQgY29uc3QgcGluQmFzZWxpbmVzQWNyb3NzRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICByZWFkU25hcHNob3QsXG4gIHJlYnVpbGQsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHJlYnVpbGQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBwcmVCdWlsZFNuYXBzaG90cyA9IGF3YWl0IGNhcHR1cmVTb3VyY2VTbmFwc2hvdHMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgICByZWFkU25hcHNob3QsXG4gIH0pO1xuXG4gIGF3YWl0IHJlYnVpbGQoKTtcblxuICBmb3IgKGNvbnN0IFtmaWxlLCBzbmFwc2hvdF0gb2YgcHJlQnVpbGRTbmFwc2hvdHMpIHtcbiAgICBpZiAoc291cmNlU25hcHNob3RzLmhhcyhmaWxlKSkge1xuICAgICAgc291cmNlU25hcHNob3RzLnNldChmaWxlLCBzbmFwc2hvdCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBkaWRTb3VyY2VTbmFwc2hvdENoYW5nZSA9IChcbiAgcHJldmlvdXNTbmFwc2hvdDogU291cmNlU25hcHNob3QsXG4gIG5leHRTbmFwc2hvdDogU291cmNlU25hcHNob3RcbikgPT5cbiAgcHJldmlvdXNTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgIT09IG5leHRTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5kZWZpbml0aW9uU2lnbmF0dXJlICE9PSBuZXh0U25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSB8fFxuICBwcmV2aW91c1NuYXBzaG90Lmhhc0RpcmVjdGl2ZSAhPT0gbmV4dFNuYXBzaG90Lmhhc0RpcmVjdGl2ZSB8fFxuICBwcmV2aW91c1NuYXBzaG90Lmhhc1NlcmRlICE9PSBuZXh0U25hcHNob3QuaGFzU2VyZGU7XG5cbmNvbnN0IHVuaXF1ZSA9IChwYXRoczogc3RyaW5nW10pID0+IFsuLi5uZXcgU2V0KHBhdGhzKV07XG5cbmNvbnN0IHNuYXBzaG90Q2hhbmdlZEZpbGUgPSBhc3luYyAoe1xuICBmaWxlLFxuICBuZXh0U25hcHNob3RzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZmlsZTogc3RyaW5nO1xuICBuZXh0U25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBwcmV2aW91c1NuYXBzaG90ID0gc291cmNlU25hcHNob3RzLmdldChmaWxlKTtcbiAgaWYgKCFwcmV2aW91c1NuYXBzaG90KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG5leHRTbmFwc2hvdHMuc2V0KGZpbGUsIG5leHRTbmFwc2hvdCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgcmVtb3ZlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkID0gKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHJlbW92ZWRGaWxlcyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbn0pID0+IHtcbiAgY29uc3QgcmVsZXZhbnRGaWxlcyA9IGdldFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIHJldHVybiByZW1vdmVkRmlsZXMuc29tZSgoZmlsZSkgPT4gcmVsZXZhbnRGaWxlcy5oYXMoZmlsZSkpO1xufTtcblxuY29uc3QgYWRkZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9IGFzeW5jICh7XG4gIGFkZGVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbn06IHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhZGRlZEZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgaWYgKHNuYXBzaG90Lmhhc0RpcmVjdGl2ZSB8fCBzbmFwc2hvdC5oYXNTZXJkZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBwcnVuZVN0YWxlQWRkZWRGaWxlcyA9IGFzeW5jICh7XG4gIGFkZGVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBhZGRlZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGNvbnN0IG5leHRBZGRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIHVuaXF1ZShhZGRlZEZpbGVzKSkge1xuICAgIGNvbnN0IHByZXZpb3VzU25hcHNob3QgPSBzb3VyY2VTbmFwc2hvdHMuZ2V0KGZpbGUpO1xuICAgIGlmICghcHJldmlvdXNTbmFwc2hvdCkge1xuICAgICAgbmV4dEFkZGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXh0U25hcHNob3QgPSBhd2FpdCByZWFkU25hcHNob3QoZmlsZSk7XG4gICAgICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICBuZXh0QWRkZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90cy5zZXQoZmlsZSwgbmV4dFNuYXBzaG90KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIG5leHRBZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWRkZWRGaWxlczogbmV4dEFkZGVkRmlsZXMsIHNuYXBzaG90cyB9O1xufTtcblxuY29uc3QgbW9kaWZpZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9IGFzeW5jICh7XG4gIG1vZGlmaWVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiB1bmlxdWUobW9kaWZpZWRGaWxlcykpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgY29uc3QgcHJldmlvdXNTbmFwc2hvdCA9IHNvdXJjZVNuYXBzaG90cy5nZXQoZmlsZSk7XG4gICAgICBpZiAoIXByZXZpb3VzU25hcHNob3QpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSB8fFxuICAgICAgICAgIG5leHRTbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuaGFzU2VyZGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBnZXRDaGFuZ2VkUmVsZXZhbnRGaWxlcyA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBmaWxlQ2hhbmdlcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCByZWxldmFudEZpbGVzID0gZ2V0UmVsZXZhbnRGaWxlcyh7XG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgaW5wdXRGaWxlcyxcbiAgICBub3JtYWxpemVQYXRoLFxuICB9KTtcbiAgcmV0dXJuIHVuaXF1ZShmaWxlQ2hhbmdlcy5tb2RpZmllZEZpbGVzKS5maWx0ZXIoKGZpbGUpID0+XG4gICAgcmVsZXZhbnRGaWxlcy5oYXMoZmlsZSlcbiAgKTtcbn07XG5cbmNvbnN0IGNvbGxlY3RIb3RSZWJ1aWxkU25hcHNob3RzID0gYXN5bmMgKHtcbiAgY2hhbmdlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNoYW5nZWRGaWxlcykge1xuICAgIGlmIChcbiAgICAgICEoYXdhaXQgc25hcHNob3RDaGFuZ2VkRmlsZSh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIG5leHRTbmFwc2hvdHM6IHNuYXBzaG90cyxcbiAgICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgICB9KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90cztcbn07XG5cbmNvbnN0IHdvcmtmbG93RW50cnlGaWxlc0NoYW5nZWQgPSAoe1xuICBjaGFuZ2VkRmlsZXMsXG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBub3JtYWxpemVQYXRoLFxuICBwYXJlbnRIYXNDaGlsZCxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwYXJlbnRIYXNDaGlsZDogKFxuICAgIHBhcmVudDogc3RyaW5nLFxuICAgIGNoaWxkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZXhjbHVkZWRSb290cz86IEl0ZXJhYmxlPHN0cmluZz4gfVxuICApID0+IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IHdvcmtmbG93RW50cnlGaWxlcyA9IFtcbiAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkV29ya2Zsb3dzLFxuICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICBdLm1hcChub3JtYWxpemVQYXRoKTtcbiAgY29uc3Qgc3RlcEVudHJ5RmlsZXMgPSBbLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFN0ZXBzXS5tYXAoXG4gICAgbm9ybWFsaXplUGF0aFxuICApO1xuXG4gIHJldHVybiBjaGFuZ2VkRmlsZXMuc29tZSgoY2hhbmdlZEZpbGUpID0+IHtcbiAgICBpZiAod29ya2Zsb3dFbnRyeUZpbGVzLmluY2x1ZGVzKGNoYW5nZWRGaWxlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGVwRW50cnlGaWxlcy5pbmNsdWRlcyhjaGFuZ2VkRmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtmbG93RW50cnlGaWxlcy5zb21lKCh3b3JrZmxvd0ZpbGUpID0+XG4gICAgICBwYXJlbnRIYXNDaGlsZCh3b3JrZmxvd0ZpbGUsIGNoYW5nZWRGaWxlLCB7XG4gICAgICAgIGV4Y2x1ZGVkUm9vdHM6IHN0ZXBFbnRyeUZpbGVzLFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn07XG5cbmNvbnN0IHN0ZXBSZWdpc3RyYXRpb25zTmVlZFJlZnJlc2ggPSAoe1xuICBjaGFuZ2VkRmlsZXMsXG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBub3JtYWxpemVQYXRoLFxufToge1xuICBjaGFuZ2VkRmlsZXM6IHN0cmluZ1tdO1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBub3JtYWxpemVQYXRoOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG59KSA9PiB7XG4gIGNvbnN0IHNlcmRlRmlsZXMgPSBuZXcgU2V0KFxuICAgIFsuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlc10ubWFwKG5vcm1hbGl6ZVBhdGgpXG4gICk7XG4gIHJldHVybiBjaGFuZ2VkRmlsZXMuc29tZSgoZmlsZSkgPT4gc2VyZGVGaWxlcy5oYXMoZmlsZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzaWZ5UmVidWlsZCA9IGFzeW5jICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBmaWxlQ2hhbmdlcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICBwYXJlbnRIYXNDaGlsZCxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHBhcmVudEhhc0NoaWxkOiAoXG4gICAgcGFyZW50OiBzdHJpbmcsXG4gICAgY2hpbGQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBleGNsdWRlZFJvb3RzPzogSXRlcmFibGU8c3RyaW5nPiB9XG4gICkgPT4gYm9vbGVhbjtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KTogUHJvbWlzZTxSZWJ1aWxkRGVjaXNpb24+ID0+IHtcbiAgY29uc3QgcHJ1bmVkQWRkZWRGaWxlcyA9IGF3YWl0IHBydW5lU3RhbGVBZGRlZEZpbGVzKHtcbiAgICBhZGRlZEZpbGVzOiBmaWxlQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgIHJlYWRTbmFwc2hvdCxcbiAgICBzb3VyY2VTbmFwc2hvdHMsXG4gIH0pO1xuICBjb25zdCBub3JtYWxpemVkRmlsZUNoYW5nZXMgPSB7XG4gICAgLi4uZmlsZUNoYW5nZXMsXG4gICAgYWRkZWRGaWxlczogcHJ1bmVkQWRkZWRGaWxlcy5hZGRlZEZpbGVzLFxuICB9O1xuXG4gIGlmIChcbiAgICByZW1vdmVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQoe1xuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIHJlbW92ZWRGaWxlczogbm9ybWFsaXplZEZpbGVDaGFuZ2VzLnJlbW92ZWRGaWxlcyxcbiAgICB9KSB8fFxuICAgIChhd2FpdCBhZGRlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIGFkZGVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgIH0pKSB8fFxuICAgIChhd2FpdCBtb2RpZmllZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIG1vZGlmaWVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5tb2RpZmllZEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgc291cmNlU25hcHNob3RzLFxuICAgIH0pKVxuICApIHtcbiAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZWRSZWxldmFudEZpbGVzID0gZ2V0Q2hhbmdlZFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGZpbGVDaGFuZ2VzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMsXG4gICAgaW5wdXRGaWxlcyxcbiAgICBub3JtYWxpemVQYXRoLFxuICB9KTtcbiAgaWYgKGNoYW5nZWRSZWxldmFudEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBwcnVuZWRBZGRlZEZpbGVzLnNuYXBzaG90cy5zaXplID4gMFxuICAgICAgPyB7IGtpbmQ6ICdub25lJywgc25hcHNob3RzOiBwcnVuZWRBZGRlZEZpbGVzLnNuYXBzaG90cyB9XG4gICAgICA6IHsga2luZDogJ25vbmUnIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90cyA9IGF3YWl0IGNvbGxlY3RIb3RSZWJ1aWxkU25hcHNob3RzKHtcbiAgICAgIGNoYW5nZWRGaWxlczogY2hhbmdlZFJlbGV2YW50RmlsZXMsXG4gICAgICByZWFkU25hcHNob3QsXG4gICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgfSk7XG4gICAgaWYgKCFzbmFwc2hvdHMpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdmdWxsJyB9O1xuICAgIH1cbiAgICByZXR1cm4gd29ya2Zsb3dFbnRyeUZpbGVzQ2hhbmdlZCh7XG4gICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgcGFyZW50SGFzQ2hpbGQsXG4gICAgfSlcbiAgICAgID8ge1xuICAgICAgICAgIGtpbmQ6ICdob3QnLFxuICAgICAgICAgIHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9uczogc3RlcFJlZ2lzdHJhdGlvbnNOZWVkUmVmcmVzaCh7XG4gICAgICAgICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNuYXBzaG90cyxcbiAgICAgICAgfVxuICAgICAgOiB7IGtpbmQ6ICdub25lJywgc25hcHNob3RzIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGtpbmQ6ICdmdWxsJyB9O1xuICB9XG59O1xuIl19
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  title: withWorkflow
3
- description: Configure webpack/turbopack to transform workflow directives in Next.js.
3
+ description: Configure webpack and Turbopack to transform workflow directives in Next.js.
4
4
  type: reference
5
5
  summary: Wrap your Next.js config with withWorkflow to enable workflow directive transformation.
6
6
  prerequisites:
7
7
  - /docs/getting-started/next
8
8
  ---
9
9
 
10
- Configures webpack/turbopack loaders to transform workflow code (`"use step"`/`"use workflow"` directives)
10
+ Configures webpack and Turbopack loaders to transform workflow code (`"use step"` and `"use workflow"` directives).
11
11
 
12
12
  ## Usage
13
13
 
@@ -16,13 +16,13 @@ To enable `"use step"` and `"use workflow"` directives while developing locally
16
16
  ```typescript title="next.config.ts" lineNumbers
17
17
  import { withWorkflow } from "workflow/next"; // [!code highlight]
18
18
  import type { NextConfig } from "next";
19
-
19
+
20
20
  const nextConfig: NextConfig = {
21
21
  // … rest of your Next.js config
22
22
  };
23
23
 
24
24
  // not required but allows configuring workflow options
25
- const workflowConfig = {}
25
+ const workflowConfig = {};
26
26
 
27
27
  export default withWorkflow(nextConfig, workflowConfig); // [!code highlight]
28
28
  ```
@@ -36,22 +36,22 @@ Remove that package from `serverExternalPackages` in your
36
36
  `next.config` to silence the warning.
37
37
  </Callout>
38
38
 
39
- ### Workflow Discovery in Next.js
39
+ ### Workflow discovery in Next.js
40
40
 
41
- `withWorkflow()` discovers workflows by scanning your Next.js entrypoints App
42
- Router `route`, `page`, and `layout` files (under `app/` or `src/app/`) and any
43
- file under `pages/` or `src/pages/` for `start()` calls imported from
41
+ `withWorkflow()` discovers workflows by scanning your Next.js entrypoints (App
42
+ Router `route`, `page`, and `layout` files under `app/` or `src/app/`, and any
43
+ file under `pages/` or `src/pages/`) for `start()` calls imported from
44
44
  `workflow/api`. The workflow and step files themselves can live anywhere (for
45
45
  example `src/workflows/`); they are discovered transitively through imports, as
46
46
  long as a `start()` call in an entrypoint statically reaches them.
47
47
 
48
48
  <Callout type="info">
49
49
  Call `start()` from server-side entrypoints, including Route Handlers and Server
50
- Actions. Don't call workflow functions directly that bypasses the workflow
50
+ Actions. Don't call workflow functions directly, which bypasses the workflow
51
51
  runtime.
52
52
  </Callout>
53
53
 
54
- ### Next.js Server Actions and `"use server"`
54
+ ### Next.js server actions and `"use server"`
55
55
 
56
56
  Don't put a top-level `"use server"` directive in modules imported by workflow
57
57
  or step functions. Workflow transformation wraps imported modules in synchronous
@@ -60,7 +60,7 @@ with errors like `Server Actions must be async functions`. Keep `"use server"`
60
60
  on the files that define your Server Actions, and move shared logic into
61
61
  separate modules that don't carry the directive.
62
62
 
63
- ### Monorepos and Workspace Imports
63
+ ### Monorepos and workspace imports
64
64
 
65
65
  By default, Next.js detects the correct workspace root automatically. If your Next.js app lives in a subdirectory such as `apps/web` and workspace resolution is not working correctly, you can set `outputFileTracingRoot` as a workaround:
66
66
 
@@ -107,7 +107,7 @@ export default withWorkflow(nextConfig, {
107
107
 
108
108
  ### Source maps
109
109
 
110
- The step bundle and intermediate workflow bundle default to `'inline'` source maps **in development** so stack traces from step errors and workflow VM errors point at your source files and to **`false` in production**, so function bundles stay small. The `sourcemap` option lets you change that:
110
+ The step bundle and intermediate workflow bundle default to `'inline'` source maps **in development** (so stack traces from step errors and workflow virtual machine (VM) errors point at your source files) and to **`false` in production**, so function bundles stay small. The `sourcemap` option lets you change that:
111
111
 
112
112
  | Value | Behavior |
113
113
  | --- | --- |
@@ -117,10 +117,10 @@ The step bundle and intermediate workflow bundle default to `'inline'` source ma
117
117
  | `'both'` | Emit both inline and external source maps. |
118
118
  | `false` | Omit source maps entirely. |
119
119
 
120
- In production, source maps are already off by default. Setting `sourcemap: false` explicitly also turns them off in development, and it drops the inline source map from every bundle while skipping the source-map-support runtime shim on the Vercel step function (the same behavior production gets by default) the main lever for staying under the Vercel 250MB function size limit. The tradeoff is that workflow VM stack traces will reference generated code (e.g. `evalmachine.<anonymous>`) rather than your source files.
120
+ In production, source maps are already off by default. Setting `sourcemap: false` explicitly also turns them off in development, and it drops the inline source map from every bundle while skipping the source-map-support runtime shim on the Vercel step function (the same behavior production gets by default), the main lever for staying under the Vercel 250 MB function size limit. The tradeoff is that workflow VM stack traces will reference generated code (for example, `evalmachine.<anonymous>`) rather than your source files.
121
121
 
122
122
  <Callout type="info">
123
- Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower it only toggles source maps on the final workflow wrapper and webhook bundle (which default to off). It continues to work, but new code should use the `sourcemap` option or the `WORKFLOW_SOURCEMAP` environment variable instead.
123
+ Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower: it only toggles source maps on the final workflow wrapper and webhook bundle (which default to off). It continues to work, but new code should use the `sourcemap` option or the `WORKFLOW_SOURCEMAP` environment variable instead.
124
124
  </Callout>
125
125
 
126
126
  The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, which accepts the same values plus `'0'` / `'1'` as aliases for `false` / `true`. Precedence is: explicit config > `WORKFLOW_SOURCEMAP` > the environment-aware default (`'inline'` in development, `false` in production). Development is detected from `next dev` / `NODE_ENV=development`, so the config option and the env var both let you force either behavior in either environment.
@@ -129,7 +129,7 @@ The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, wh
129
129
  The `workflows.local` options only affect local development. When deployed to Vercel, the runtime ignores `local` settings and uses the Vercel world automatically.
130
130
  </Callout>
131
131
 
132
- ## Exporting a Function
132
+ ## Exporting a function
133
133
 
134
134
 
135
135
  If you are exporting a function in your `next.config` you will need to ensure you call the function returned from `withWorkflow`.
@@ -158,4 +158,4 @@ export default async function config(
158
158
  }
159
159
  return nextConfig;
160
160
  }
161
- ```
161
+ ```
package/docs/next.mdx CHANGED
@@ -17,7 +17,7 @@ related:
17
17
  <Steps>
18
18
 
19
19
  <Step>
20
- ## Create Your Next.js Project
20
+ ## Create your Next.js project
21
21
 
22
22
  Start by creating a new Next.js project. This command will create a new directory named `my-workflow-app` and set up a Next.js project inside it.
23
23
 
@@ -89,7 +89,7 @@ If your Next.js app has a [proxy handler](https://nextjs.org/docs/app/api-refere
89
89
  (formerly known as "middleware"), you'll need to update the matcher pattern to exclude Workflow's
90
90
  internal paths to prevent the proxy handler from running on them.
91
91
 
92
- If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This is especially easy to miss in Next.js 16, where `proxy.ts` replaced `middleware.ts`.
92
+ If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This issue can be hard to spot in Next.js 16, where `proxy.ts` replaced `middleware.ts`.
93
93
 
94
94
  Add `.well-known/workflow/*` to your matcher exclusion list:
95
95
 
@@ -121,7 +121,7 @@ This ensures that internal Workflow paths are not intercepted by your middleware
121
121
 
122
122
  <Step>
123
123
 
124
- ## Create Your First Workflow
124
+ ## Create your first workflow
125
125
 
126
126
  Create a new file for our first workflow:
127
127
 
@@ -144,14 +144,14 @@ export async function handleUserSignup(email: string) {
144
144
 
145
145
  ```
146
146
 
147
- We'll fill in those functions next, but let's take a look at this code:
147
+ We'll fill in those functions next. The current code does the following:
148
148
 
149
149
  * We define a **workflow** function with the directive `"use workflow"`. Think of the workflow function as the _orchestrator_ of individual **steps**.
150
150
  * The Workflow SDK's `sleep` function allows us to suspend execution of the workflow without using up any resources. A sleep can be a few seconds, hours, days, or even months long.
151
151
 
152
- ## Create Your Workflow Steps
152
+ ## Create your workflow steps
153
153
 
154
- Let's now define those missing functions.
154
+ Define the missing functions.
155
155
 
156
156
  ```typescript title="workflows/user-signup.ts" lineNumbers
157
157
  import { FatalError } from "workflow"
@@ -204,7 +204,7 @@ We'll dive deeper into workflows, steps, and other ways to suspend or handle eve
204
204
 
205
205
  <Step>
206
206
 
207
- ## Create Your Route Handler
207
+ ## Create your route handler
208
208
 
209
209
  To invoke your new workflow, we'll need to add your workflow to a `POST` API Route Handler, `app/api/signup/route.ts`, with the following code:
210
210
 
@@ -276,12 +276,12 @@ Check the [Deploying](/docs/deploying) section to learn how your workflows can b
276
276
 
277
277
  If you see this error when upgrading to Next.js 16.1 or later:
278
278
 
279
- ```
279
+ ```text
280
280
  Build error occurred
281
281
  Error: Cannot find module 'next/dist/lib/server-external-packages.json'
282
282
  ```
283
283
 
284
- Upgrade to `workflow@4.0.1-beta.26` or later:
284
+ Upgrade `workflow` to the latest release:
285
285
 
286
286
  ```package-install
287
287
  workflow@latest
@@ -315,7 +315,7 @@ Without this configuration, you may experience intermittent issues where workflo
315
315
 
316
316
  If you see this error:
317
317
 
318
- ```
318
+ ```text
319
319
  'start' received an invalid workflow function. Ensure the Workflow SDK is configured correctly and the function includes a 'use workflow' directive.
320
320
  ```
321
321
 
@@ -326,7 +326,7 @@ Check both of these first:
326
326
 
327
327
  See [start-invalid-workflow-function](/docs/errors/start-invalid-workflow-function) for full examples and fixes.
328
328
 
329
- ## Next Steps
329
+ ## Next steps
330
330
 
331
331
  * Learn more about the [Foundations](/docs/foundations).
332
332
  * Check [Errors](/docs/errors) if you encounter issues.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/next",
3
- "version": "5.0.0-beta.42",
3
+ "version": "5.0.0-beta.44",
4
4
  "description": "Next.js integration for Workflow SDK",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
@@ -30,8 +30,8 @@
30
30
  "chokidar": "4.0.3",
31
31
  "ignore": "7.0.5",
32
32
  "semver": "7.7.4",
33
- "@workflow/builders": "5.0.0-beta.42",
34
- "@workflow/core": "5.0.0-beta.42",
33
+ "@workflow/builders": "5.0.0-beta.44",
34
+ "@workflow/core": "5.0.0-beta.44",
35
35
  "@workflow/swc-plugin": "5.0.0-beta.5"
36
36
  },
37
37
  "devDependencies": {