@dbx-tools/shared-core 0.6.69 → 0.6.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/log.d.ts CHANGED
@@ -2,17 +2,20 @@
2
2
  * Tagged, leveled logging for every runtime - the one logger the whole
3
3
  * monorepo shares.
4
4
  *
5
- * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}
6
- * chosen once at module load. {@link LogLevel} filtering runs through
7
- * {@link shouldEmit} in the consola reporter or in per-level wrappers on the
8
- * `console` fallbacks.
5
+ * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}.
6
+ * The factory starts as a synchronous console sink so this module never uses
7
+ * top-level `await` (that left importers with a null namespace mid-load in
8
+ * browser bundles). A memoized async chain then upgrades to consola when it
9
+ * is available. {@link LogLevel} filtering runs through {@link shouldEmit} in
10
+ * the consola reporter or in per-level wrappers on the `console` fallbacks.
9
11
  *
10
12
  * Sink selection chains two factories with nullish coalescing (first match
11
13
  * wins):
12
14
  *
13
15
  * 1. {@link createConsolaLoggerFactory} when consola resolves and
14
16
  * `LOG_CONSOLA_DISABLED` is not truthy.
15
- * 2. {@link createConsoleLoggerFactory} everywhere else.
17
+ * 2. {@link createConsoleLoggerFactory} everywhere else (also the sync
18
+ * bootstrap before that promise settles).
16
19
  *
17
20
  * The console fallback writes formatted lines to `process.stderr` when it is
18
21
  * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
@@ -21,8 +24,8 @@
21
24
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
22
25
  * tag.
23
26
  *
24
- * Env toggles (read once at init): `LOG_LEVEL`, `LOG_CONSOLA_DISABLED`,
25
- * `LOG_BUN_CONSOLE_DISABLED`.
27
+ * Env toggles: `LOG_LEVEL` (read per call), `LOG_CONSOLA_DISABLED` /
28
+ * `LOG_BUN_CONSOLE_DISABLED` (read once during factory init).
26
29
  *
27
30
  * Browser-safe: `process` / `Bun` / `window` / `document` are all reached
28
31
  * through `globalThis` and guarded, consola loads lazily, and `node:util` is
package/lib/src/log.js CHANGED
@@ -2,17 +2,20 @@
2
2
  * Tagged, leveled logging for every runtime - the one logger the whole
3
3
  * monorepo shares.
4
4
  *
5
- * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}
6
- * chosen once at module load. {@link LogLevel} filtering runs through
7
- * {@link shouldEmit} in the consola reporter or in per-level wrappers on the
8
- * `console` fallbacks.
5
+ * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}.
6
+ * The factory starts as a synchronous console sink so this module never uses
7
+ * top-level `await` (that left importers with a null namespace mid-load in
8
+ * browser bundles). A memoized async chain then upgrades to consola when it
9
+ * is available. {@link LogLevel} filtering runs through {@link shouldEmit} in
10
+ * the consola reporter or in per-level wrappers on the `console` fallbacks.
9
11
  *
10
12
  * Sink selection chains two factories with nullish coalescing (first match
11
13
  * wins):
12
14
  *
13
15
  * 1. {@link createConsolaLoggerFactory} when consola resolves and
14
16
  * `LOG_CONSOLA_DISABLED` is not truthy.
15
- * 2. {@link createConsoleLoggerFactory} everywhere else.
17
+ * 2. {@link createConsoleLoggerFactory} everywhere else (also the sync
18
+ * bootstrap before that promise settles).
16
19
  *
17
20
  * The console fallback writes formatted lines to `process.stderr` when it is
18
21
  * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
@@ -21,8 +24,8 @@
21
24
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
22
25
  * tag.
23
26
  *
24
- * Env toggles (read once at init): `LOG_LEVEL`, `LOG_CONSOLA_DISABLED`,
25
- * `LOG_BUN_CONSOLE_DISABLED`.
27
+ * Env toggles: `LOG_LEVEL` (read per call), `LOG_CONSOLA_DISABLED` /
28
+ * `LOG_BUN_CONSOLE_DISABLED` (read once during factory init).
26
29
  *
27
30
  * Browser-safe: `process` / `Bun` / `window` / `document` are all reached
28
31
  * through `globalThis` and guarded, consola loads lazily, and `node:util` is
@@ -160,6 +163,15 @@ async function createConsoleLoggerFactory(globalProcessStdErr) {
160
163
  const utils = globalProcessStdErr === undefined
161
164
  ? undefined
162
165
  : await import(__rewriteRelativeImportExtension(/* @vite-ignore */ nodeUtil)).catch(() => undefined);
166
+ return consoleLoggerFactory(globalProcessStdErr, utils);
167
+ }
168
+ /**
169
+ * The synchronous core of {@link createConsoleLoggerFactory}, split out so the
170
+ * same emitter also serves as the bootstrap sink before any async factory has
171
+ * resolved. `utils` is `node:util` when it loaded; without it, object arguments
172
+ * format through the `JSON.stringify` fallback.
173
+ */
174
+ function consoleLoggerFactory(globalProcessStdErr, utils) {
163
175
  const bunInspect = globalBun !== undefined && !toBoolean(globalBun.env?.LOG_BUN_CONSOLE_DISABLED)
164
176
  ? globalBun.inspect
165
177
  : undefined;
@@ -229,14 +241,43 @@ async function createConsoleLoggerFactory(globalProcessStdErr) {
229
241
  return (name) => (name ? factory(name) : defaultFactory());
230
242
  }
231
243
  /**
232
- * Module-scoped {@link LoggerFactory}, initialized once via top-level `await`.
233
- * Delegates to {@link createConsolaLoggerFactory}, then
234
- * {@link createConsoleLoggerFactory}. Each {@link logger} call invokes the
235
- * chosen factory with a resolved tag. Env toggles are read only during init.
244
+ * Preferred factory: consola when it loads, else the full console sink (with
245
+ * optional `node:util` inspect). Memoized so concurrent / repeat callers share
246
+ * one in-flight promise and one settled result.
236
247
  */
237
- const createLogger = await (async () => {
248
+ const resolveFactory = memoize(async () => {
238
249
  return ((await createConsolaLoggerFactory()) ?? (await createConsoleLoggerFactory(globalProcessStdErr)));
239
- })();
250
+ });
251
+ /**
252
+ * Active factory starts as a sync console sink (no `await`, so this module
253
+ * finishes evaluating immediately) and swaps to {@link resolveFactory}'s
254
+ * result when that lands. Kick the resolve off at load so consola is usually
255
+ * ready before the first interesting log line.
256
+ */
257
+ let activeFactory = consoleLoggerFactory(globalProcessStdErr);
258
+ void resolveFactory().then((factory) => {
259
+ activeFactory = factory;
260
+ }, () => {
261
+ // Keep the sync console sink; never leave importers without a factory.
262
+ });
263
+ /**
264
+ * Build a logger that rebinds when {@link activeFactory} upgrades. Callers that
265
+ * capture `const log = logger("x")` at module scope still get consola once it
266
+ * arrives, without every call site waiting on a promise.
267
+ */
268
+ function createLogger(name) {
269
+ let bound;
270
+ const sink = () => {
271
+ if (bound?.factory !== activeFactory) {
272
+ bound = { factory: activeFactory, logger: activeFactory(name) };
273
+ }
274
+ return bound.logger;
275
+ };
276
+ return Object.fromEntries([...LOG_LEVELS, "success", "start"].map((level) => [
277
+ level,
278
+ (...args) => sink()[level](...args),
279
+ ]));
280
+ }
240
281
  /**
241
282
  * Build a line prefix of `LEVEL [name]` on Node/Bun hosts, or `[name]` alone
242
283
  * in browsers (either part omitted when absent). Applies per-level ANSI color
@@ -366,4 +407,4 @@ export function logger(loggerName) {
366
407
  const name = extractLoggerName(loggerName);
367
408
  return createLogger(name);
368
409
  }
369
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBY3ZELE1BQU0sYUFBYSxHQUFJLFVBQXdDLENBQUMsT0FBTyxDQUFDO0FBQ3hFLE1BQU0sU0FBUyxHQUFJLFVBQWdDLENBQUMsR0FBRyxDQUFDO0FBRXhEOzs7Ozs7R0FNRztBQUNILDhEQUE4RDtBQUM5RCxNQUFNLG1CQUFtQixHQUN2QixhQUFhLElBQUksT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssS0FBSyxVQUFVO0lBQ2hFLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTTtJQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDO0FBRWhCLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDdkMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ3JCLENBQUM7QUFDOUIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUN6QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDdkIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsT0FBTztJQUMvQixRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1QsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87WUFDM0IsTUFBTTtRQUNS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LElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZTtJQUM1QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyx3REFBd0QsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBeUM7SUFDbEUsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFVBQXlDO0lBQzlELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRhZ2dlZCwgbGV2ZWxlZCBsb2dnaW5nIGZvciBldmVyeSBydW50aW1lIC0gdGhlIG9uZSBsb2dnZXIgdGhlIHdob2xlXG4gKiBtb25vcmVwbyBzaGFyZXMuXG4gKlxuICoge0BsaW5rIGxvZ2dlcn0gcmVzb2x2ZXMgYSB0YWdnZWQge0BsaW5rIExvZ2dlcn0gdmlhIGEge0BsaW5rIExvZ2dlckZhY3Rvcnl9XG4gKiBjaG9zZW4gb25jZSBhdCBtb2R1bGUgbG9hZC4ge0BsaW5rIExvZ0xldmVsfSBmaWx0ZXJpbmcgcnVucyB0aHJvdWdoXG4gKiB7QGxpbmsgc2hvdWxkRW1pdH0gaW4gdGhlIGNvbnNvbGEgcmVwb3J0ZXIgb3IgaW4gcGVyLWxldmVsIHdyYXBwZXJzIG9uIHRoZVxuICogYGNvbnNvbGVgIGZhbGxiYWNrcy5cbiAqXG4gKiBTaW5rIHNlbGVjdGlvbiBjaGFpbnMgdHdvIGZhY3RvcmllcyB3aXRoIG51bGxpc2ggY29hbGVzY2luZyAoZmlyc3QgbWF0Y2hcbiAqIHdpbnMpOlxuICpcbiAqIDEuIHtAbGluayBjcmVhdGVDb25zb2xhTG9nZ2VyRmFjdG9yeX0gd2hlbiBjb25zb2xhIHJlc29sdmVzIGFuZFxuICogICAgYExPR19DT05TT0xBX0RJU0FCTEVEYCBpcyBub3QgdHJ1dGh5LlxuICogMi4ge0BsaW5rIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5fSBldmVyeXdoZXJlIGVsc2UuXG4gKlxuICogVGhlIGNvbnNvbGUgZmFsbGJhY2sgd3JpdGVzIGZvcm1hdHRlZCBsaW5lcyB0byBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gaXQgaXNcbiAqIGF2YWlsYWJsZSAoQnVuIGBpbnNwZWN0YCBwZXIgYXJndW1lbnQgd2hlbiBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYCBpc1xuICogdW5zZXQsIG90aGVyd2lzZSBgbm9kZTp1dGlsYCBgZm9ybWF0V2l0aE9wdGlvbnNgKSwgb3IgZGVsZWdhdGVzIHRvIGdsb2JhbFxuICogYGNvbnNvbGUuKmAgd2hlbiBzdGRlcnIgb3IgYG5vZGU6dXRpbGAgaXMgdW5hdmFpbGFibGUuIEJyb3dzZXIgaG9zdHMgb21pdFxuICogdGhlIGBMRVZFTGAgdGV4dCBwcmVmaXggKGRldnRvb2xzIHNob3cgc2V2ZXJpdHkpIGFuZCBrZWVwIG9ubHkgdGhlIGBbbmFtZV1gXG4gKiB0YWcuXG4gKlxuICogRW52IHRvZ2dsZXMgKHJlYWQgb25jZSBhdCBpbml0KTogYExPR19MRVZFTGAsIGBMT0dfQ09OU09MQV9ESVNBQkxFRGAsXG4gKiBgTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEYC5cbiAqXG4gKiBCcm93c2VyLXNhZmU6IGBwcm9jZXNzYCAvIGBCdW5gIC8gYHdpbmRvd2AgLyBgZG9jdW1lbnRgIGFyZSBhbGwgcmVhY2hlZFxuICogdGhyb3VnaCBgZ2xvYmFsVGhpc2AgYW5kIGd1YXJkZWQsIGNvbnNvbGEgbG9hZHMgbGF6aWx5LCBhbmQgYG5vZGU6dXRpbGAgaXNcbiAqIGltcG9ydGVkIE9OTFkgb24gYSBob3N0IHRoYXQgaGFzIGBwcm9jZXNzLnN0ZGVycmAgLSBuZXZlciBpbiBhIGJyb3dzZXIsXG4gKiB3aGVyZSB0aGUgc3BlY2lmaWVyIGlzIHVucmVzb2x2YWJsZSAtIHNvIHRoZSBtb2R1bGUgd29ya3MgaW4gYW55IHJ1bnRpbWUuXG4gKiBDb25zb2xhIGlzIGFuIG9wdGlvbmFsIHBlZXI7IHRoZSBtb2R1bGUgbG9hZHMgZmluZSB3aXRob3V0IGl0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBtZW1vaXplIH0gZnJvbSBcIi4vZnVuY3Rpb24udHNcIjtcbmltcG9ydCB7IHR5cGUgTmFtZUxpa2UsIHRvQm9vbGVhbiB9IGZyb20gXCIuL29iamVjdC50c1wiO1xuXG4vKiogYHByb2Nlc3NgLXNoYXBlZCB2aWV3IG9mZiBgZ2xvYmFsVGhpc2AsIHNvIG5vIG5vZGUgdHlwZXMgYXJlIG5lZWRlZC4gKi9cbmludGVyZmFjZSBQcm9jZXNzTGlrZSB7XG4gIGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0ZGVycj86IHsgd3JpdGU/OiAoY2h1bms6IHN0cmluZykgPT4gdm9pZDsgaXNUVFk/OiB1bmtub3duIH07XG59XG5cbi8qKiBgQnVuYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBgQHR5cGVzL2J1bmAgaXMgbmVlZGVkLiAqL1xuaW50ZXJmYWNlIEJ1bkxpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBpbnNwZWN0PzogKHZhbHVlOiB1bmtub3duLCBvcHRpb25zPzogeyBjb2xvcnM/OiBib29sZWFuOyBkZXB0aD86IG51bWJlciB9KSA9PiBzdHJpbmc7XG59XG5cbmNvbnN0IGdsb2JhbFByb2Nlc3MgPSAoZ2xvYmFsVGhpcyBhcyB7IHByb2Nlc3M/OiBQcm9jZXNzTGlrZSB9KS5wcm9jZXNzO1xuY29uc3QgZ2xvYmFsQnVuID0gKGdsb2JhbFRoaXMgYXMgeyBCdW4/OiBCdW5MaWtlIH0pLkJ1bjtcblxuLyoqXG4gKiBOb2RlIGBwcm9jZXNzLnN0ZGVycmAgd2hlbiB3cml0YWJsZSwgZWxzZSBgdW5kZWZpbmVkYCAoc3RhYmxlIGZvciB0aGVcbiAqIHByb2Nlc3MpLiBUeXBlZCBsb29zZWx5IChgYW55YCkgYmVjYXVzZSBpdCBpcyBoYW5kZWQgdG8gY29uc29sYSdzXG4gKiBgY3R4Lm9wdGlvbnMuc3Rkb3V0YCAoYSBgV3JpdGVTdHJlYW1gKSBhbmQgdG8gdGhlIGNvbnNvbGUgZmFsbGJhY2snc1xuICogYC53cml0ZWAsIG5laXRoZXIgb2Ygd2hpY2ggb3VyIHN0cnVjdHVyYWwge0BsaW5rIFByb2Nlc3NMaWtlfSBzaGFwZSBzYXRpc2ZpZXNcbiAqIG5vbWluYWxseS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSA9XG4gIGdsb2JhbFByb2Nlc3MgJiYgdHlwZW9mIGdsb2JhbFByb2Nlc3Muc3RkZXJyPy53cml0ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyBnbG9iYWxQcm9jZXNzLnN0ZGVyclxuICAgIDogdW5kZWZpbmVkO1xuXG5jb25zdCBMT0dfTEVWRUxTID0gW1wiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdIGFzIGNvbnN0O1xuY29uc3QgTE9HX0xFVkVMX1JBTksgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCwgaW5kZXgpID0+IFtsZXZlbCwgaW5kZXhdKSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SUyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgbGV0IGNvbG9yID0gXCJcXHgxYls5MG1cIjsgLy8gZ3JheVxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgXCJpbmZvXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszNG1cIjsgLy8gYmx1ZVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ3YXJuXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszM21cIjsgLy8geWVsbG93XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImVycm9yXCI6XG4gICAgICAgIGNvbG9yID0gXCJcXHgxYlszMW1cIjsgLy8gcmVkXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gW2xldmVsLCBjb2xvcl07XG4gIH0pLFxuKSBhcyBSZWNvcmQ8TG9nTGV2ZWwsIHN0cmluZz47XG5jb25zdCBMT0dfTEVWRUxfQ09MT1JfUkVTRVQgPSBcIlxceDFiWzBtXCI7XG5jb25zdCBERUZBVUxUX0xFVkVMOiBMb2dMZXZlbCA9IFwiaW5mb1wiO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBzZXZlcml0aWVzLCBsb3dlc3QgdG8gaGlnaGVzdDogYGRlYnVnYCwgYGluZm9gLCBgd2FybmAsIGBlcnJvcmAuXG4gKiBBIGNhbGwgYmVsb3cgdGhlIGFjdGl2ZSB0aHJlc2hvbGQgaXMgZGlzY2FyZGVkIGJlZm9yZSBhbnkgc3RyaW5nIHdvcmsgb3JcbiAqIHNpbmsgSS9PLlxuICpcbiAqIFRoZSB0aHJlc2hvbGQgY29tZXMgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCBvbiBldmVyeSBjYWxsXG4gKiAoY2FzZS1pbnNlbnNpdGl2ZSwgZGVmYXVsdCBgaW5mb2Agd2hlbiB1bnNldCwgZW1wdHksIG9yIHVua25vd24pIHNvIHRlc3RcbiAqIHJ1bm5lcnMgYW5kIGVtYmVkZGVycyBjYW4gY2hhbmdlIHZlcmJvc2l0eSBhZnRlciBpbXBvcnQgd2l0aG91dCByZXN0YXJ0aW5nXG4gKiB0aGUgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAodHlwZW9mIExPR19MRVZFTFMpW251bWJlcl07XG5cbmV4cG9ydCB0eXBlIExvZ2dlciA9IHtcbiAgW0sgaW4gTG9nTGV2ZWxdOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59ICYge1xuICAvKiogU3VjY2VzcyBtZXNzYWdlIChjb25zb2xhIGBzdWNjZXNzYDsgZmFsbHMgYmFjayB0byBgaW5mb2AtbGV2ZWwgb3V0cHV0KS4gKi9cbiAgc3VjY2VzczogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xuICAvKiogU3RhcnQgLyBpbi1wcm9ncmVzcyBtZXNzYWdlIChjb25zb2xhIGBzdGFydGA7IGZhbGxzIGJhY2sgdG8gYGluZm9gLWxldmVsIG91dHB1dCkuICovXG4gIHN0YXJ0OiAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG59O1xuXG4vKiogYChuYW1lPykgPT4gTG9nZ2VyYCBzaW5rIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoZSBpbml0LXRpbWUgZmFjdG9yeSBjaGFpbi4gKi9cbnR5cGUgTG9nZ2VyRmFjdG9yeSA9IChuYW1lPzogc3RyaW5nKSA9PiBMb2dnZXI7XG5cbi8qKlxuICogQ29uc29sYS1iYWNrZWQge0BsaW5rIExvZ2dlckZhY3Rvcnl9LCBvciBgdW5kZWZpbmVkYCB3aGVuIGNvbnNvbGEgaXNcbiAqIGRpc2FibGVkLCBmYWlscyB0byBpbXBvcnQsIG9yIHRocm93cyBkdXJpbmcgc2V0dXAuXG4gKlxuICogQnVpbGRzIG9uZSBgY3JlYXRlQ29uc29sYWAgaW5zdGFuY2UgKGJhZGdlIG9mZiwgbGV2ZWwgYHZlcmJvc2VgKSB3aG9zZVxuICogcmVwb3J0ZXIgY2FsbHMge0BsaW5rIHNob3VsZEVtaXR9IG9uIGBsb2dPYmoudHlwZWAgYmVmb3JlIGRlbGVnYXRpbmcgdG9cbiAqIGNvbnNvbGEncyBkZWZhdWx0IHJlcG9ydGVycy4gSW4gTm9kZSwgd2hlbiBgZ2xvYmFsUHJvY2Vzc1N0ZEVycmAgaXMgc2V0LFxuICogcmVjb2duaXplZCB7QGxpbmsgTG9nTGV2ZWx9IHR5cGVzIGFyZSByZWRpcmVjdGVkIHRvIHN0ZGVyciBmb3IgdGhhdCB3cml0ZS5cbiAqIFRhZ3MgdXNlIGB3aXRoVGFnYCAocmVuZGVyZWQgYFtuYW1lXWAsIG5vdCBtZXJnZWQgaW50byBhcmdzKS5cbiAqXG4gKiBNZW1vaXplZDogdGhlIGR5bmFtaWMgYGNvbnNvbGFgIGltcG9ydCwgZW52IGNoZWNrcywgYW5kIGBjcmVhdGVDb25zb2xhYFxuICogc2V0dXAgKHBsdXMgdGhlIGltcG9ydC90aHJvdyBmYWxsYmFjaykgcnVuIG9uY2U7IGxhdGVyIGNhbGxzIHNoYXJlIHRoZSBvbmVcbiAqIHJlc29sdmVkIGZhY3RvcnkgKG9yIHRoZSBvbmUgcmVzb2x2ZWQgYHVuZGVmaW5lZGApLiBBIHJlamVjdGlvbiBpcyBldmljdGVkXG4gKiBieSB7QGxpbmsgbWVtb2l6ZX0gc28gYSBsYXRlciBjYWxsIHJldHJpZXMuXG4gKi9cbmNvbnN0IGNyZWF0ZUNvbnNvbGFMb2dnZXJGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5IHwgdW5kZWZpbmVkPiA9PiB7XG4gIGNvbnN0IGNvbnNvbGFEaXNhYmxlZCA9IHRvQm9vbGVhbihnbG9iYWxQcm9jZXNzPy5lbnY/LkxPR19DT05TT0xBX0RJU0FCTEVEKTtcbiAgaWYgKCFjb25zb2xhRGlzYWJsZWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBjb25zb2xhLCBjcmVhdGVDb25zb2xhLCBMb2dMZXZlbHMgfSA9IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gXCJjb25zb2xhXCIpO1xuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBjb25zb2xhLm9wdGlvbnM7XG4gICAgICBjb25zdCBjcmVhdGVDb25zb2xhT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uY29uc29sYS5vcHRpb25zLFxuICAgICAgICBkZWZhdWx0czogeyBiYWRnZTogZmFsc2UgfSxcbiAgICAgICAgLy8gYExPR19MRVZFTGAgaXMgZW5mb3JjZWQgaW4ge0BsaW5rIHNob3VsZEVtaXR9OyBrZWVwIGNvbnNvbGEgcGVybWlzc2l2ZVxuICAgICAgICAvLyBzbyBhIHRocmVzaG9sZCBjaGFuZ2UgYWZ0ZXIgaW1wb3J0IGlzIG5vdCBibG9ja2VkIGJ5IGl0cyBvd24gZmlsdGVyLlxuICAgICAgICBsZXZlbDogTG9nTGV2ZWxzLnZlcmJvc2UsXG4gICAgICAgIHJlcG9ydGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxvZzogKGxvZ09iaiwgY3R4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGxvZ0xldmVsID0gcGFyc2VMb2dMZXZlbChsb2dPYmoudHlwZSk7XG4gICAgICAgICAgICAgIGlmICghc2hvdWxkRW1pdChsb2dMZXZlbCwgdHJ1ZSkpIHJldHVybjtcbiAgICAgICAgICAgICAgY29uc3QgY3R4U3Rkb3V0ID0gY3R4Lm9wdGlvbnMuc3Rkb3V0O1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQgJiYgbG9nTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY3R4Lm9wdGlvbnMuc3Rkb3V0ID0gZ2xvYmFsUHJvY2Vzc1N0ZEVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMucmVwb3J0ZXJzLmZvckVhY2goKHJlcG9ydGVyKSA9PiByZXBvcnRlci5sb2cobG9nT2JqLCBjdHgpKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjdHgub3B0aW9ucy5zdGRvdXQgPSBjdHhTdGRvdXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0gYXMgTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgY3JlYXRlQ29uc29sYT5bMF0+O1xuICAgICAgY29uc3QgY29uc29sYUxvZ2dlciA9IGNyZWF0ZUNvbnNvbGEoY3JlYXRlQ29uc29sYU9wdGlvbnMpO1xuICAgICAgcmV0dXJuIChuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBuYW1lID8gY29uc29sYUxvZ2dlci53aXRoVGFnKG5hbWUpIDogY29uc29sYUxvZ2dlcjtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGNvbnNvbGEgaXMgYW4gT1BUSU9OQUwgcGVlciAtIG5vdCBoYXZpbmcgaXQgaW5zdGFsbGVkIGlzIHRoZSBFWFBFQ1RFRFxuICAgICAgLy8gcGF0aCAodGhlIG1vZHVsZSBkZWdyYWRlcyB0byB0aGUgY29uc29sZSBmYWxsYmFjayksIHNvIHRoaXMgaXMgbm90IGFuXG4gICAgICAvLyBlcnJvci4gTm90ZSBpdCBvbmx5IGF0IGRlYnVnIGxldmVsLCBhbmQgd2l0aG91dCBhIHN0YWNrIHRyYWNlICh0aGVcbiAgICAgIC8vIG1lc3NhZ2UsIG5vdCBgY29uc29sZS50cmFjZWAsIHNvIGEgbWlzc2luZyBvcHRpb25hbCBkZXAgc3RheXMgcXVpZXQpLlxuICAgICAgaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcImNvbnNvbGEgbm90IGF2YWlsYWJsZTsgdXNpbmcgY29uc29sZSBmYWxsYmFjazpcIiwgU3RyaW5nKGVycm9yKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59KTtcblxuLyoqXG4gKiBDb25zb2xlIHtAbGluayBMb2dnZXJGYWN0b3J5fTsgYWx3YXlzIHN1Y2NlZWRzLlxuICpcbiAqIFdoZW4gYHByb2Nlc3Muc3RkZXJyYCBpcyBhdmFpbGFibGUsIGZvcm1hdHMgZWFjaCBsaW5lIGFuZCB3cml0ZXMgb25seSB0b1xuICogc3RkZXJyLiBCdW4gYGluc3BlY3RgIGZvcm1hdHMgZWFjaCBhcmd1bWVudCB3aGVuIGVuYWJsZWQ7IG90aGVyd2lzZVxuICogYHV0aWwuaW5zcGVjdGAgd2hlbiBgbm9kZTp1dGlsYCBsb2Fkcywgb3IgYSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrIHdoZW5cbiAqIGl0IGRvZXMgbm90LiBXaGVuIHN0ZGVyciBpcyB1bmF2YWlsYWJsZSAoZXZlcnkgYnJvd3NlciksIGJpbmRzXG4gKiB7QGxpbmsgY3JlYXRlRm9ybWF0dGVyfSBwcmVmaXhlcyBpbnRvIGdsb2JhbCBgY29uc29sZS4qYCBjYWxscyBhbmQgc2tpcHMgdGhlXG4gKiBgbm9kZTp1dGlsYCBpbXBvcnQgZW50aXJlbHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5KGdsb2JhbFByb2Nlc3NTdGRFcnI6IGFueSk6IFByb21pc2U8TG9nZ2VyRmFjdG9yeT4ge1xuICAvLyBJbmRpcmVjdCBzcGVjaWZpZXIgc28gdGhpcyBicm93c2VyLXNhZmUgbW9kdWxlIGRvZXNuJ3Qgc3RhdGljYWxseSBwdWxsIGluXG4gIC8vIG5vZGUgdHlwZXM6IGBub2RlOnV0aWxgIGlzIG9wdGlvbmFsICh0aGUgSlNPTiBmYWxsYmFjayBjb3ZlcnMgaXRzIGFic2VuY2UpLlxuICBjb25zdCBub2RlVXRpbCA9IFwibm9kZTp1dGlsXCI7XG4gIC8vIEdhdGVkLCBub3QganVzdCBjYXVnaHQ6IHRoZSBpbmRpcmVjdCBzcGVjaWZpZXIgZGVmZWF0cyBidW5kbGVyIGFuYWx5c2lzIGJ5XG4gIC8vIGRlc2lnbiwgc28gYSBjbGllbnQgYnVpbGQgZW1pdHMgYSBsaXRlcmFsIGBpbXBvcnQoXCJub2RlOnV0aWxcIilgIHRoYXQgbm9cbiAgLy8gYnJvd3NlciBjYW4gcmVzb2x2ZSwgYW5kIHRoZSBjYXVnaHQgcmVqZWN0aW9uIHN0aWxsIHN1cmZhY2VkIGFzIGEgY29uc29sZVxuICAvLyBlcnJvci4gYHV0aWxzYCBvbmx5IGZlZWRzIHRoZSBzdGRlcnIgYnJhbmNoIG9mIHRoZSBlbWl0dGVyIGJlbG93LCBzbyBub1xuICAvLyBzdGRlcnIgbWVhbnMgdGhlIGltcG9ydCBoYXMgbm90aGluZyB0byBzZXJ2ZSBhbmQgaXMgc2tpcHBlZCBvdXRyaWdodC5cbiAgY29uc3QgdXRpbHM6IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkID1cbiAgICBnbG9iYWxQcm9jZXNzU3RkRXJyID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gbm9kZVV0aWwpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBnbG9iYWxQcm9jZXNzU3RkRXJyLCByZXNldENvbG9yc1ByZWZpeCk7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb2xvcnMsIHJlc2V0Q29sb3JzIH0gPSBwcmVmaXhGb3JtYXR0ZXIobGV2ZWwpO1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaG91bGRFbWl0KGxldmVsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHByZWZpeCA/IFtwcmVmaXhdIDogW107XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaCguLi5hcmdzLm1hcCgoYXJnKSA9PiBpbnNwZWN0KGFyZywgY29sb3JzKSkpO1xuICAgICAgICAgICAgaWYgKHJlc2V0Q29sb3JzKSBtZXNzYWdlUGFydHMucHVzaChMT0dfTEVWRUxfQ09MT1JfUkVTRVQpO1xuICAgICAgICAgICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyci53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIGNvbnNvbGEgc3VnYXIgdGhlIGNvbnNvbGUgZmFsbGJhY2sgZG9lc24ndCBoYXZlIG5hdGl2ZWx5IC0gcm91dGUgdG8gaW5mby5cbiAgICBsb2dnZXIuc3VjY2VzcyA9IGxvZ2dlci5pbmZvO1xuICAgIGxvZ2dlci5zdGFydCA9IGxvZ2dlci5pbmZvO1xuICAgIHJldHVybiBsb2dnZXI7XG4gIH07XG4gIGNvbnN0IGRlZmF1bHRGYWN0b3J5ID0gbWVtb2l6ZShmYWN0b3J5KTtcbiAgcmV0dXJuIChuYW1lPzogc3RyaW5nKSA9PiAobmFtZSA/IGZhY3RvcnkobmFtZSkgOiBkZWZhdWx0RmFjdG9yeSgpKTtcbn1cblxuLyoqXG4gKiBNb2R1bGUtc2NvcGVkIHtAbGluayBMb2dnZXJGYWN0b3J5fSwgaW5pdGlhbGl6ZWQgb25jZSB2aWEgdG9wLWxldmVsIGBhd2FpdGAuXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIGNyZWF0ZUNvbnNvbGFMb2dnZXJGYWN0b3J5fSwgdGhlblxuICoge0BsaW5rIGNyZWF0ZUNvbnNvbGVMb2dnZXJGYWN0b3J5fS4gRWFjaCB7QGxpbmsgbG9nZ2VyfSBjYWxsIGludm9rZXMgdGhlXG4gKiBjaG9zZW4gZmFjdG9yeSB3aXRoIGEgcmVzb2x2ZWQgdGFnLiBFbnYgdG9nZ2xlcyBhcmUgcmVhZCBvbmx5IGR1cmluZyBpbml0LlxuICovXG5jb25zdCBjcmVhdGVMb2dnZXI6IExvZ2dlckZhY3RvcnkgPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIChhd2FpdCBjcmVhdGVDb25zb2xhTG9nZ2VyRmFjdG9yeSgpKSA/PyAoYXdhaXQgY3JlYXRlQ29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVycikpXG4gICk7XG59KSgpO1xuXG4vKipcbiAqIEJ1aWxkIGEgbGluZSBwcmVmaXggb2YgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMsIG9yIGBbbmFtZV1gIGFsb25lXG4gKiBpbiBicm93c2VycyAoZWl0aGVyIHBhcnQgb21pdHRlZCB3aGVuIGFic2VudCkuIEFwcGxpZXMgcGVyLWxldmVsIEFOU0kgY29sb3JcbiAqIHdoZW4gYHN0cmVhbVN1cHBvcnRzQ29sb3JgIGlzIHRydWUgZm9yIHRoZSBnaXZlbiBzdGRlcnIgc3RyZWFtLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXR0ZXIoXG4gIG5hbWU6IGFueSxcbiAgc3RyZWFtOiBhbnksXG4gIHJlc2V0Q29sb3JzUHJlZml4PzogYm9vbGVhbixcbik6IChsZXZlbD86IExvZ0xldmVsKSA9PiB7IHByZWZpeDogc3RyaW5nOyBjb2xvcnM6IGJvb2xlYW47IHJlc2V0Q29sb3JzOiBib29sZWFuIH0ge1xuICBjb25zdCBnbG9iID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHVua25vd247IGRvY3VtZW50PzogdW5rbm93biB9O1xuICBjb25zdCBpc0Jyb3dzZXIgPSBnbG9iLndpbmRvdyAhPT0gdW5kZWZpbmVkICYmIGdsb2IuZG9jdW1lbnQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VwcG9ydHNDb2xvciA9ICFpc0Jyb3dzZXIgPyBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbSkgOiBmYWxzZTtcbiAgY29uc3QgbmFtZVByZWZpeCA9IG5hbWUgPyBcIltcIiArIG5hbWUgKyBcIl1cIiA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChsZXZlbD86IExvZ0xldmVsKSA9PiB7XG4gICAgY29uc3QgY29sb3IgPSBzdXBwb3J0c0NvbG9yICYmIGxldmVsICE9PSB1bmRlZmluZWQgPyBMT0dfTEVWRUxfQ09MT1JTW2xldmVsXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlZml4ID0gWyFpc0Jyb3dzZXIgJiYgbGV2ZWwgPyBsZXZlbC50b1VwcGVyQ2FzZSgpIDogdW5kZWZpbmVkLCBuYW1lUHJlZml4XVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGxldCByZXNldENvbG9ycyA9IGZhbHNlO1xuICAgIGlmIChjb2xvcikge1xuICAgICAgY29uc3QgYXBwbHlSZXNldENvbG9yc1ByZWZpeCA9IHJlc2V0Q29sb3JzUHJlZml4IHx8IFwiaW5mb1wiID09PSBsZXZlbDtcbiAgICAgIGlmICghYXBwbHlSZXNldENvbG9yc1ByZWZpeCkgcmVzZXRDb2xvcnMgPSB0cnVlO1xuICAgICAgcHJlZml4ID0gYXBwbHlSZXNldENvbG9yc1ByZWZpeCA/IGNvbG9yICsgcHJlZml4ICsgTE9HX0xFVkVMX0NPTE9SX1JFU0VUIDogY29sb3IgKyBwcmVmaXg7XG4gICAgfVxuICAgIHJldHVybiB7IHByZWZpeCwgY29sb3JzOiBjb2xvciA/IHRydWUgOiBmYWxzZSwgcmVzZXRDb2xvcnMgfTtcbiAgfTtcbn1cblxuLyoqIFRydWUgd2hlbiBgc3RyZWFtYCBpcyBhIFRUWSBhbmQgdGhlIHRlcm1pbmFsIGlzIG5vdCBgZHVtYmAuICovXG5mdW5jdGlvbiBzdHJlYW1TdXBwb3J0c0NvbG9yKHN0cmVhbT86IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGdsb2JhbFByb2Nlc3MgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygc3RyZWFtICE9PSBcIm9iamVjdFwiIHx8IHN0cmVhbSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB7IGlzVFRZIH0gPSBzdHJlYW0gYXMgeyBpc1RUWT86IHVua25vd24gfTtcbiAgaWYgKGlzVFRZICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHRlcm0gPSBnbG9iYWxQcm9jZXNzLmVudj8uVEVSTT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKFwiZHVtYlwiID09IHRlcm0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBQYXJzZSBhIHJhdyB2YWx1ZSBhcyB7QGxpbmsgTG9nTGV2ZWx9ICh0cmltbWVkLCBjYXNlLWluc2Vuc2l0aXZlKS4gKi9cbmZ1bmN0aW9uIHBhcnNlTG9nTGV2ZWwocmF3OiB1bmtub3duKTogTG9nTGV2ZWwgfCB1bmRlZmluZWQge1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgdGV4dCA9IHR5cGVvZiByYXcgPT09IFwic3RyaW5nXCIgPyByYXcgOiBTdHJpbmcocmF3KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHRleHQgPT09IG5vcm1hbGl6ZWQpIGJyZWFrO1xuICAgICAgdGV4dCA9IG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIGlmICghdGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh0ZXh0IGluIExPR19MRVZFTF9SQU5LKSB7XG4gICAgICByZXR1cm4gdGV4dCBhcyBMb2dMZXZlbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEFjdGl2ZSB0aHJlc2hvbGQgZnJvbSBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCwgZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRVZFTH0uICovXG5mdW5jdGlvbiBhY3RpdmVMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBwYXJzZUxvZ0xldmVsKGdsb2JhbFByb2Nlc3M/LmVudj8uTE9HX0xFVkVMKSA/PyBERUZBVUxUX0xFVkVMO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYHJhd2AgbWVldHMgdGhlIGN1cnJlbnQgYExPR19MRVZFTGAgdGhyZXNob2xkLlxuICpcbiAqIFBhcnNlcyBgcmF3YCBhcyBhIHtAbGluayBMb2dMZXZlbH07IHdoZW4gcGFyc2luZyBmYWlscywgcmV0dXJuc1xuICogYGRlZmF1bHRSZXN1bHRgIGlmIHN1cHBsaWVkLCBvdGhlcndpc2UgYGZhbHNlYC4gVXNlZCBmb3IgY29uc29sYSByZXBvcnRlclxuICogbGluZXMgd2hlcmUgdW5rbm93biBgbG9nT2JqLnR5cGVgIHZhbHVlcyBzaG91bGQgcGFzcyB0aHJvdWdoIHdoZW5cbiAqIGBkZWZhdWx0UmVzdWx0YCBpcyBgdHJ1ZWAuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZEVtaXQocmF3OiB1bmtub3duLCBkZWZhdWx0UmVzdWx0PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBsZXZlbCA9IHBhcnNlTG9nTGV2ZWwocmF3KTtcbiAgaWYgKGxldmVsID09PSB1bmRlZmluZWQpIHJldHVybiBkZWZhdWx0UmVzdWx0ID8/IGZhbHNlO1xuICByZXR1cm4gTE9HX0xFVkVMX1JBTktbbGV2ZWxdID49IExPR19MRVZFTF9SQU5LW2FjdGl2ZUxldmVsKCldO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBjYWxsIGF0IGBsZXZlbGAgd291bGQgYmUgZW1pdHRlZCBhdCB0aGUgY3VycmVudFxuICogYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgdGhyZXNob2xkLiBVc2UgYmVmb3JlIGJ1aWxkaW5nIGV4cGVuc2l2ZSBkZWJ1Z1xuICogcGF5bG9hZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGlmIChpc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSB7XG4gKiAgIGxvZy5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlclwiLCB7IGNvbnRyaWJ1dGlvbjogYXdhaXQgaGVhdnlTbmFwc2hvdCgpIH0pO1xuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMZXZlbEVuYWJsZWQobGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBzaG91bGRFbWl0KGxldmVsKTtcbn1cblxuY29uc3QgTE9HR0VSX05BTUVfUkVHRVggPSAvXig/OlthLXpdW2EtejAtOSsuLV0qOlxcL1xcLyk/LipcXC8oW14vLl0rKSg/OlxcLlteL10rKT8kL2k7XG5cbi8qKlxuICogRGVyaXZlIHRoZSB0YWcgc3RyaW5nIGZyb20gYSBsb2dnZXIgbmFtZSwgcGx1Z2luLCBvciBwYXRoLiBTbGFzaC0gYW5kXG4gKiBVUkwtc2hhcGVkIHN0cmluZ3MgdXNlIHRoZSBsYXN0IHBhdGggc2VnbWVudCAoZXh0ZW5zaW9uIHN0cmlwcGVkKTsgcGxhaW5cbiAqIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC4gRW1wdHkgb3IgbWlzc2luZyBuYW1lcyAtPiBgdW5kZWZpbmVkYFxuICogKHVudGFnZ2VkIHNpbmspLlxuICovXG5mdW5jdGlvbiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lOiBOYW1lTGlrZSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghbG9nZ2VyTmFtZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBsb2dnZXJOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsb2dnZXJOYW1lLm1hdGNoKExPR0dFUl9OQU1FX1JFR0VYKTtcbiAgICByZXR1cm4gbWF0Y2g/LlsxXSA/PyBsb2dnZXJOYW1lO1xuICB9XG4gIHJldHVybiBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lLm5hbWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgdGFnZ2VkIGxvZ2dlciBmb3IgYSBwbHVnaW4gb3IgbW9kdWxlLlxuICpcbiAqIFRoZSB0YWcgaXMgYFtuYW1lXWAgd2hlbiBgbG9nZ2VyTmFtZWAgaXMgYSBub24tZW1wdHkgc3RyaW5nLCBhXG4gKiB7QGxpbmsgTmFtZUxpa2V9IHdpdGggYG5hbWVgLCBvciBhIGZpbGUgLyBVUkwgcGF0aCAodGhlIGJhc2VuYW1lIHdpdGhvdXRcbiAqIGV4dGVuc2lvbiBpcyB1c2VkKS4gQ29uc29sYSBhcHBsaWVzIHRoZSB0YWcgdmlhIGB3aXRoVGFnYCAocmVuZGVyLXRpbWUpLlxuICogVGhlIGBjb25zb2xlYCBmYWxsYmFja3MgcHJlcGVuZCBgTEVWRUwgW25hbWVdYCBvbiBOb2RlL0J1biBob3N0cyBvciBgW25hbWVdYFxuICogYWxvbmUgaW4gYnJvd3NlcnMgdmlhIHtAbGluayBjcmVhdGVGb3JtYXR0ZXJ9LlxuICpcbiAqIENhbGxzIGJlbG93IGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgIGFyZSBkcm9wcGVkIGJ5IHtAbGluayBzaG91bGRFbWl0fSBiZWZvcmVcbiAqIHRoZSBzaW5rIGZvcm1hdHMgb3Igd3JpdGVzIHRoZSBsaW5lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuICpcbiAqIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJnZW5pZS9jaGF0XCIpO1xuICogbG9nZ2VyLmluZm8oXCJzdGFydGluZ1wiKTtcbiAqIGxvZ2dlci53YXJuKFwibWlzc2luZyBvcHRpb25hbCBjb25maWdcIiwgeyByZWFzb246IFwibm8gZW52IHZhclwiIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nZ2VyKGxvZ2dlck5hbWU6IE5hbWVMaWtlIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogTG9nZ2VyIHtcbiAgY29uc3QgbmFtZSA9IGV4dHJhY3RMb2dnZXJOYW1lKGxvZ2dlck5hbWUpO1xuICByZXR1cm4gY3JlYXRlTG9nZ2VyKG5hbWUpO1xufVxuIl19
410
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0NHOzs7Ozs7Ozs7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBY3ZELE1BQU0sYUFBYSxHQUFJLFVBQXdDLENBQUMsT0FBTyxDQUFDO0FBQ3hFLE1BQU0sU0FBUyxHQUFJLFVBQWdDLENBQUMsR0FBRyxDQUFDO0FBRXhEOzs7Ozs7R0FNRztBQUNILDhEQUE4RDtBQUM5RCxNQUFNLG1CQUFtQixHQUN2QixhQUFhLElBQUksT0FBTyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssS0FBSyxVQUFVO0lBQ2hFLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTTtJQUN0QixDQUFDLENBQUMsU0FBUyxDQUFDO0FBRWhCLE1BQU0sVUFBVSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFVLENBQUM7QUFDL0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDdkMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ3JCLENBQUM7QUFDOUIsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUN6QyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDdkIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsT0FBTztJQUMvQixRQUFRLEtBQUssRUFBRSxDQUFDO1FBQ2QsS0FBSyxNQUFNO1lBQ1QsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLE9BQU87WUFDM0IsTUFBTTtR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QU0sVUFBVSxjQUFjLENBQUMsS0FBZTtJQUM1QyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyx3REFBd0QsQ0FBQztBQUVuRjs7Ozs7R0FLRztBQUNILFNBQVMsaUJBQWlCLENBQUMsVUFBeUM7SUFDbEUsSUFBSSxDQUFDLFVBQVU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNsQyxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNsRCxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFVBQXlDO0lBQzlELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRhZ2dlZCwgbGV2ZWxlZCBsb2dnaW5nIGZvciBldmVyeSBydW50aW1lIC0gdGhlIG9uZSBsb2dnZXIgdGhlIHdob2xlXG4gKiBtb25vcmVwbyBzaGFyZXMuXG4gKlxuICoge0BsaW5rIGxvZ2dlcn0gcmVzb2x2ZXMgYSB0YWdnZWQge0BsaW5rIExvZ2dlcn0gdmlhIGEge0BsaW5rIExvZ2dlckZhY3Rvcnl9LlxuICogVGhlIGZhY3Rvcnkgc3RhcnRzIGFzIGEgc3luY2hyb25vdXMgY29uc29sZSBzaW5rIHNvIHRoaXMgbW9kdWxlIG5ldmVyIHVzZXNcbiAqIHRvcC1sZXZlbCBgYXdhaXRgICh0aGF0IGxlZnQgaW1wb3J0ZXJzIHdpdGggYSBudWxsIG5hbWVzcGFjZSBtaWQtbG9hZCBpblxuICogYnJvd3NlciBidW5kbGVzKS4gQSBtZW1vaXplZCBhc3luYyBjaGFpbiB0aGVuIHVwZ3JhZGVzIHRvIGNvbnNvbGEgd2hlbiBpdFxuICogaXMgYXZhaWxhYmxlLiB7QGxpbmsgTG9nTGV2ZWx9IGZpbHRlcmluZyBydW5zIHRocm91Z2gge0BsaW5rIHNob3VsZEVtaXR9IGluXG4gKiB0aGUgY29uc29sYSByZXBvcnRlciBvciBpbiBwZXItbGV2ZWwgd3JhcHBlcnMgb24gdGhlIGBjb25zb2xlYCBmYWxsYmFja3MuXG4gKlxuICogU2luayBzZWxlY3Rpb24gY2hhaW5zIHR3byBmYWN0b3JpZXMgd2l0aCBudWxsaXNoIGNvYWxlc2NpbmcgKGZpcnN0IG1hdGNoXG4gKiB3aW5zKTpcbiAqXG4gKiAxLiB7QGxpbmsgY3JlYXRlQ29uc29sYUxvZ2dlckZhY3Rvcnl9IHdoZW4gY29uc29sYSByZXNvbHZlcyBhbmRcbiAqICAgIGBMT0dfQ09OU09MQV9ESVNBQkxFRGAgaXMgbm90IHRydXRoeS5cbiAqIDIuIHtAbGluayBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeX0gZXZlcnl3aGVyZSBlbHNlIChhbHNvIHRoZSBzeW5jXG4gKiAgICBib290c3RyYXAgYmVmb3JlIHRoYXQgcHJvbWlzZSBzZXR0bGVzKS5cbiAqXG4gKiBUaGUgY29uc29sZSBmYWxsYmFjayB3cml0ZXMgZm9ybWF0dGVkIGxpbmVzIHRvIGBwcm9jZXNzLnN0ZGVycmAgd2hlbiBpdCBpc1xuICogYXZhaWxhYmxlIChCdW4gYGluc3BlY3RgIHBlciBhcmd1bWVudCB3aGVuIGBMT0dfQlVOX0NPTlNPTEVfRElTQUJMRURgIGlzXG4gKiB1bnNldCwgb3RoZXJ3aXNlIGBub2RlOnV0aWxgIGBmb3JtYXRXaXRoT3B0aW9uc2ApLCBvciBkZWxlZ2F0ZXMgdG8gZ2xvYmFsXG4gKiBgY29uc29sZS4qYCB3aGVuIHN0ZGVyciBvciBgbm9kZTp1dGlsYCBpcyB1bmF2YWlsYWJsZS4gQnJvd3NlciBob3N0cyBvbWl0XG4gKiB0aGUgYExFVkVMYCB0ZXh0IHByZWZpeCAoZGV2dG9vbHMgc2hvdyBzZXZlcml0eSkgYW5kIGtlZXAgb25seSB0aGUgYFtuYW1lXWBcbiAqIHRhZy5cbiAqXG4gKiBFbnYgdG9nZ2xlczogYExPR19MRVZFTGAgKHJlYWQgcGVyIGNhbGwpLCBgTE9HX0NPTlNPTEFfRElTQUJMRURgIC9cbiAqIGBMT0dfQlVOX0NPTlNPTEVfRElTQUJMRURgIChyZWFkIG9uY2UgZHVyaW5nIGZhY3RvcnkgaW5pdCkuXG4gKlxuICogQnJvd3Nlci1zYWZlOiBgcHJvY2Vzc2AgLyBgQnVuYCAvIGB3aW5kb3dgIC8gYGRvY3VtZW50YCBhcmUgYWxsIHJlYWNoZWRcbiAqIHRocm91Z2ggYGdsb2JhbFRoaXNgIGFuZCBndWFyZGVkLCBjb25zb2xhIGxvYWRzIGxhemlseSwgYW5kIGBub2RlOnV0aWxgIGlzXG4gKiBpbXBvcnRlZCBPTkxZIG9uIGEgaG9zdCB0aGF0IGhhcyBgcHJvY2Vzcy5zdGRlcnJgIC0gbmV2ZXIgaW4gYSBicm93c2VyLFxuICogd2hlcmUgdGhlIHNwZWNpZmllciBpcyB1bnJlc29sdmFibGUgLSBzbyB0aGUgbW9kdWxlIHdvcmtzIGluIGFueSBydW50aW1lLlxuICogQ29uc29sYSBpcyBhbiBvcHRpb25hbCBwZWVyOyB0aGUgbW9kdWxlIGxvYWRzIGZpbmUgd2l0aG91dCBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWVtb2l6ZSB9IGZyb20gXCIuL2Z1bmN0aW9uLnRzXCI7XG5pbXBvcnQgeyB0eXBlIE5hbWVMaWtlLCB0b0Jvb2xlYW4gfSBmcm9tIFwiLi9vYmplY3QudHNcIjtcblxuLyoqIGBwcm9jZXNzYC1zaGFwZWQgdmlldyBvZmYgYGdsb2JhbFRoaXNgLCBzbyBubyBub2RlIHR5cGVzIGFyZSBuZWVkZWQuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xpa2Uge1xuICBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBzdGRlcnI/OiB7IHdyaXRlPzogKGNodW5rOiBzdHJpbmcpID0+IHZvaWQ7IGlzVFRZPzogdW5rbm93biB9O1xufVxuXG4vKiogYEJ1bmAtc2hhcGVkIHZpZXcgb2ZmIGBnbG9iYWxUaGlzYCwgc28gbm8gYEB0eXBlcy9idW5gIGlzIG5lZWRlZC4gKi9cbmludGVyZmFjZSBCdW5MaWtlIHtcbiAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgaW5zcGVjdD86ICh2YWx1ZTogdW5rbm93biwgb3B0aW9ucz86IHsgY29sb3JzPzogYm9vbGVhbjsgZGVwdGg/OiBudW1iZXIgfSkgPT4gc3RyaW5nO1xufVxuXG5jb25zdCBnbG9iYWxQcm9jZXNzID0gKGdsb2JhbFRoaXMgYXMgeyBwcm9jZXNzPzogUHJvY2Vzc0xpa2UgfSkucHJvY2VzcztcbmNvbnN0IGdsb2JhbEJ1biA9IChnbG9iYWxUaGlzIGFzIHsgQnVuPzogQnVuTGlrZSB9KS5CdW47XG5cbi8qKlxuICogTm9kZSBgcHJvY2Vzcy5zdGRlcnJgIHdoZW4gd3JpdGFibGUsIGVsc2UgYHVuZGVmaW5lZGAgKHN0YWJsZSBmb3IgdGhlXG4gKiBwcm9jZXNzKS4gVHlwZWQgbG9vc2VseSAoYGFueWApIGJlY2F1c2UgaXQgaXMgaGFuZGVkIHRvIGNvbnNvbGEnc1xuICogYGN0eC5vcHRpb25zLnN0ZG91dGAgKGEgYFdyaXRlU3RyZWFtYCkgYW5kIHRvIHRoZSBjb25zb2xlIGZhbGxiYWNrJ3NcbiAqIGAud3JpdGVgLCBuZWl0aGVyIG9mIHdoaWNoIG91ciBzdHJ1Y3R1cmFsIHtAbGluayBQcm9jZXNzTGlrZX0gc2hhcGUgc2F0aXNmaWVzXG4gKiBub21pbmFsbHkuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5jb25zdCBnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkgPVxuICBnbG9iYWxQcm9jZXNzICYmIHR5cGVvZiBnbG9iYWxQcm9jZXNzLnN0ZGVycj8ud3JpdGUgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gZ2xvYmFsUHJvY2Vzcy5zdGRlcnJcbiAgICA6IHVuZGVmaW5lZDtcblxuY29uc3QgTE9HX0xFVkVMUyA9IFtcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXSBhcyBjb25zdDtcbmNvbnN0IExPR19MRVZFTF9SQU5LID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICBMT0dfTEVWRUxTLm1hcCgobGV2ZWwsIGluZGV4KSA9PiBbbGV2ZWwsIGluZGV4XSksXG4pIGFzIFJlY29yZDxMb2dMZXZlbCwgbnVtYmVyPjtcbmNvbnN0IExPR19MRVZFTF9DT0xPUlMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIExPR19MRVZFTFMubWFwKChsZXZlbCkgPT4ge1xuICAgIGxldCBjb2xvciA9IFwiXFx4MWJbOTBtXCI7IC8vIGdyYXlcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIFwiaW5mb1wiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzRtXCI7IC8vIGJsdWVcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwid2FyblwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzNtXCI7IC8vIHllbGxvd1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgICBjb2xvciA9IFwiXFx4MWJbMzFtXCI7IC8vIHJlZFxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIFtsZXZlbCwgY29sb3JdO1xuICB9KSxcbikgYXMgUmVjb3JkPExvZ0xldmVsLCBzdHJpbmc+O1xuY29uc3QgTE9HX0xFVkVMX0NPTE9SX1JFU0VUID0gXCJcXHgxYlswbVwiO1xuY29uc3QgREVGQVVMVF9MRVZFTDogTG9nTGV2ZWwgPSBcImluZm9cIjtcblxuLyoqXG4gKiBTdXBwb3J0ZWQgc2V2ZXJpdGllcywgbG93ZXN0IHRvIGhpZ2hlc3Q6IGBkZWJ1Z2AsIGBpbmZvYCwgYHdhcm5gLCBgZXJyb3JgLlxuICogQSBjYWxsIGJlbG93IHRoZSBhY3RpdmUgdGhyZXNob2xkIGlzIGRpc2NhcmRlZCBiZWZvcmUgYW55IHN0cmluZyB3b3JrIG9yXG4gKiBzaW5rIEkvTy5cbiAqXG4gKiBUaGUgdGhyZXNob2xkIGNvbWVzIGZyb20gYHByb2Nlc3MuZW52LkxPR19MRVZFTGAgb24gZXZlcnkgY2FsbFxuICogKGNhc2UtaW5zZW5zaXRpdmUsIGRlZmF1bHQgYGluZm9gIHdoZW4gdW5zZXQsIGVtcHR5LCBvciB1bmtub3duKSBzbyB0ZXN0XG4gKiBydW5uZXJzIGFuZCBlbWJlZGRlcnMgY2FuIGNoYW5nZSB2ZXJib3NpdHkgYWZ0ZXIgaW1wb3J0IHdpdGhvdXQgcmVzdGFydGluZ1xuICogdGhlIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gKHR5cGVvZiBMT0dfTEVWRUxTKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBMb2dnZXIgPSB7XG4gIFtLIGluIExvZ0xldmVsXTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufSAmIHtcbiAgLyoqIFN1Y2Nlc3MgbWVzc2FnZSAoY29uc29sYSBgc3VjY2Vzc2A7IGZhbGxzIGJhY2sgdG8gYGluZm9gLWxldmVsIG91dHB1dCkuICovXG4gIHN1Y2Nlc3M6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbiAgLyoqIFN0YXJ0IC8gaW4tcHJvZ3Jlc3MgbWVzc2FnZSAoY29uc29sYSBgc3RhcnRgOyBmYWxscyBiYWNrIHRvIGBpbmZvYC1sZXZlbCBvdXRwdXQpLiAqL1xuICBzdGFydDogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xufTtcblxuLyoqIGAobmFtZT8pID0+IExvZ2dlcmAgc2luayBjb25zdHJ1Y3RvciByZXR1cm5lZCBieSB0aGUgaW5pdC10aW1lIGZhY3RvcnkgY2hhaW4uICovXG50eXBlIExvZ2dlckZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4gTG9nZ2VyO1xuXG4vKipcbiAqIENvbnNvbGEtYmFja2VkIHtAbGluayBMb2dnZXJGYWN0b3J5fSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBjb25zb2xhIGlzXG4gKiBkaXNhYmxlZCwgZmFpbHMgdG8gaW1wb3J0LCBvciB0aHJvd3MgZHVyaW5nIHNldHVwLlxuICpcbiAqIEJ1aWxkcyBvbmUgYGNyZWF0ZUNvbnNvbGFgIGluc3RhbmNlIChiYWRnZSBvZmYsIGxldmVsIGB2ZXJib3NlYCkgd2hvc2VcbiAqIHJlcG9ydGVyIGNhbGxzIHtAbGluayBzaG91bGRFbWl0fSBvbiBgbG9nT2JqLnR5cGVgIGJlZm9yZSBkZWxlZ2F0aW5nIHRvXG4gKiBjb25zb2xhJ3MgZGVmYXVsdCByZXBvcnRlcnMuIEluIE5vZGUsIHdoZW4gYGdsb2JhbFByb2Nlc3NTdGRFcnJgIGlzIHNldCxcbiAqIHJlY29nbml6ZWQge0BsaW5rIExvZ0xldmVsfSB0eXBlcyBhcmUgcmVkaXJlY3RlZCB0byBzdGRlcnIgZm9yIHRoYXQgd3JpdGUuXG4gKiBUYWdzIHVzZSBgd2l0aFRhZ2AgKHJlbmRlcmVkIGBbbmFtZV1gLCBub3QgbWVyZ2VkIGludG8gYXJncykuXG4gKlxuICogTWVtb2l6ZWQ6IHRoZSBkeW5hbWljIGBjb25zb2xhYCBpbXBvcnQsIGVudiBjaGVja3MsIGFuZCBgY3JlYXRlQ29uc29sYWBcbiAqIHNldHVwIChwbHVzIHRoZSBpbXBvcnQvdGhyb3cgZmFsbGJhY2spIHJ1biBvbmNlOyBsYXRlciBjYWxscyBzaGFyZSB0aGUgb25lXG4gKiByZXNvbHZlZCBmYWN0b3J5IChvciB0aGUgb25lIHJlc29sdmVkIGB1bmRlZmluZWRgKS4gQSByZWplY3Rpb24gaXMgZXZpY3RlZFxuICogYnkge0BsaW5rIG1lbW9pemV9IHNvIGEgbGF0ZXIgY2FsbCByZXRyaWVzLlxuICovXG5jb25zdCBjcmVhdGVDb25zb2xhTG9nZ2VyRmFjdG9yeSA9IG1lbW9pemUoYXN5bmMgKCk6IFByb21pc2U8TG9nZ2VyRmFjdG9yeSB8IHVuZGVmaW5lZD4gPT4ge1xuICBjb25zdCBjb25zb2xhRGlzYWJsZWQgPSB0b0Jvb2xlYW4oZ2xvYmFsUHJvY2Vzcz8uZW52Py5MT0dfQ09OU09MQV9ESVNBQkxFRCk7XG4gIGlmICghY29uc29sYURpc2FibGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgY29uc29sYSwgY3JlYXRlQ29uc29sYSwgTG9nTGV2ZWxzIH0gPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIFwiY29uc29sYVwiKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gY29uc29sYS5vcHRpb25zO1xuICAgICAgY29uc3QgY3JlYXRlQ29uc29sYU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmNvbnNvbGEub3B0aW9ucyxcbiAgICAgICAgZGVmYXVsdHM6IHsgYmFkZ2U6IGZhbHNlIH0sXG4gICAgICAgIC8vIGBMT0dfTEVWRUxgIGlzIGVuZm9yY2VkIGluIHtAbGluayBzaG91bGRFbWl0fTsga2VlcCBjb25zb2xhIHBlcm1pc3NpdmVcbiAgICAgICAgLy8gc28gYSB0aHJlc2hvbGQgY2hhbmdlIGFmdGVyIGltcG9ydCBpcyBub3QgYmxvY2tlZCBieSBpdHMgb3duIGZpbHRlci5cbiAgICAgICAgbGV2ZWw6IExvZ0xldmVscy52ZXJib3NlLFxuICAgICAgICByZXBvcnRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBsb2c6IChsb2dPYmosIGN0eCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBsb2dMZXZlbCA9IHBhcnNlTG9nTGV2ZWwobG9nT2JqLnR5cGUpO1xuICAgICAgICAgICAgICBpZiAoIXNob3VsZEVtaXQobG9nTGV2ZWwsIHRydWUpKSByZXR1cm47XG4gICAgICAgICAgICAgIGNvbnN0IGN0eFN0ZG91dCA9IGN0eC5vcHRpb25zLnN0ZG91dDtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsUHJvY2Vzc1N0ZEVyciAhPT0gdW5kZWZpbmVkICYmIGxvZ0xldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGN0eC5vcHRpb25zLnN0ZG91dCA9IGdsb2JhbFByb2Nlc3NTdGRFcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHRPcHRpb25zLnJlcG9ydGVycy5mb3JFYWNoKChyZXBvcnRlcikgPT4gcmVwb3J0ZXIubG9nKGxvZ09iaiwgY3R4KSk7XG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY3R4Lm9wdGlvbnMuc3Rkb3V0ID0gY3R4U3Rkb3V0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9IGFzIE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGNyZWF0ZUNvbnNvbGE+WzBdPjtcbiAgICAgIGNvbnN0IGNvbnNvbGFMb2dnZXIgPSBjcmVhdGVDb25zb2xhKGNyZWF0ZUNvbnNvbGFPcHRpb25zKTtcbiAgICAgIHJldHVybiAobmFtZT86IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gbmFtZSA/IGNvbnNvbGFMb2dnZXIud2l0aFRhZyhuYW1lKSA6IGNvbnNvbGFMb2dnZXI7XG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBjb25zb2xhIGlzIGFuIE9QVElPTkFMIHBlZXIgLSBub3QgaGF2aW5nIGl0IGluc3RhbGxlZCBpcyB0aGUgRVhQRUNURURcbiAgICAgIC8vIHBhdGggKHRoZSBtb2R1bGUgZGVncmFkZXMgdG8gdGhlIGNvbnNvbGUgZmFsbGJhY2spLCBzbyB0aGlzIGlzIG5vdCBhblxuICAgICAgLy8gZXJyb3IuIE5vdGUgaXQgb25seSBhdCBkZWJ1ZyBsZXZlbCwgYW5kIHdpdGhvdXQgYSBzdGFjayB0cmFjZSAodGhlXG4gICAgICAvLyBtZXNzYWdlLCBub3QgYGNvbnNvbGUudHJhY2VgLCBzbyBhIG1pc3Npbmcgb3B0aW9uYWwgZGVwIHN0YXlzIHF1aWV0KS5cbiAgICAgIGlmIChpc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJjb25zb2xhIG5vdCBhdmFpbGFibGU7IHVzaW5nIGNvbnNvbGUgZmFsbGJhY2s6XCIsIFN0cmluZyhlcnJvcikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufSk7XG5cbi8qKlxuICogQ29uc29sZSB7QGxpbmsgTG9nZ2VyRmFjdG9yeX07IGFsd2F5cyBzdWNjZWVkcy5cbiAqXG4gKiBXaGVuIGBwcm9jZXNzLnN0ZGVycmAgaXMgYXZhaWxhYmxlLCBmb3JtYXRzIGVhY2ggbGluZSBhbmQgd3JpdGVzIG9ubHkgdG9cbiAqIHN0ZGVyci4gQnVuIGBpbnNwZWN0YCBmb3JtYXRzIGVhY2ggYXJndW1lbnQgd2hlbiBlbmFibGVkOyBvdGhlcndpc2VcbiAqIGB1dGlsLmluc3BlY3RgIHdoZW4gYG5vZGU6dXRpbGAgbG9hZHMsIG9yIGEgYEpTT04uc3RyaW5naWZ5YCBmYWxsYmFjayB3aGVuXG4gKiBpdCBkb2VzIG5vdC4gV2hlbiBzdGRlcnIgaXMgdW5hdmFpbGFibGUgKGV2ZXJ5IGJyb3dzZXIpLCBiaW5kc1xuICoge0BsaW5rIGNyZWF0ZUZvcm1hdHRlcn0gcHJlZml4ZXMgaW50byBnbG9iYWwgYGNvbnNvbGUuKmAgY2FsbHMgYW5kIHNraXBzIHRoZVxuICogYG5vZGU6dXRpbGAgaW1wb3J0IGVudGlyZWx5LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyOiBhbnkpOiBQcm9taXNlPExvZ2dlckZhY3Rvcnk+IHtcbiAgLy8gSW5kaXJlY3Qgc3BlY2lmaWVyIHNvIHRoaXMgYnJvd3Nlci1zYWZlIG1vZHVsZSBkb2Vzbid0IHN0YXRpY2FsbHkgcHVsbCBpblxuICAvLyBub2RlIHR5cGVzOiBgbm9kZTp1dGlsYCBpcyBvcHRpb25hbCAodGhlIEpTT04gZmFsbGJhY2sgY292ZXJzIGl0cyBhYnNlbmNlKS5cbiAgY29uc3Qgbm9kZVV0aWwgPSBcIm5vZGU6dXRpbFwiO1xuICAvLyBHYXRlZCwgbm90IGp1c3QgY2F1Z2h0OiB0aGUgaW5kaXJlY3Qgc3BlY2lmaWVyIGRlZmVhdHMgYnVuZGxlciBhbmFseXNpcyBieVxuICAvLyBkZXNpZ24sIHNvIGEgY2xpZW50IGJ1aWxkIGVtaXRzIGEgbGl0ZXJhbCBgaW1wb3J0KFwibm9kZTp1dGlsXCIpYCB0aGF0IG5vXG4gIC8vIGJyb3dzZXIgY2FuIHJlc29sdmUsIGFuZCB0aGUgY2F1Z2h0IHJlamVjdGlvbiBzdGlsbCBzdXJmYWNlZCBhcyBhIGNvbnNvbGVcbiAgLy8gZXJyb3IuIGB1dGlsc2Agb25seSBmZWVkcyB0aGUgc3RkZXJyIGJyYW5jaCBvZiB0aGUgZW1pdHRlciBiZWxvdywgc28gbm9cbiAgLy8gc3RkZXJyIG1lYW5zIHRoZSBpbXBvcnQgaGFzIG5vdGhpbmcgdG8gc2VydmUgYW5kIGlzIHNraXBwZWQgb3V0cmlnaHQuXG4gIGNvbnN0IHV0aWxzOiB7IGluc3BlY3Q/OiBhbnkgfSB8IHVuZGVmaW5lZCA9XG4gICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyciA9PT0gdW5kZWZpbmVkXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIG5vZGVVdGlsKS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICByZXR1cm4gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVyciwgdXRpbHMpO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeX0sIHNwbGl0IG91dCBzbyB0aGVcbiAqIHNhbWUgZW1pdHRlciBhbHNvIHNlcnZlcyBhcyB0aGUgYm9vdHN0cmFwIHNpbmsgYmVmb3JlIGFueSBhc3luYyBmYWN0b3J5IGhhc1xuICogcmVzb2x2ZWQuIGB1dGlsc2AgaXMgYG5vZGU6dXRpbGAgd2hlbiBpdCBsb2FkZWQ7IHdpdGhvdXQgaXQsIG9iamVjdCBhcmd1bWVudHNcbiAqIGZvcm1hdCB0aHJvdWdoIHRoZSBgSlNPTi5zdHJpbmdpZnlgIGZhbGxiYWNrLlxuICovXG5mdW5jdGlvbiBjb25zb2xlTG9nZ2VyRmFjdG9yeShcbiAgZ2xvYmFsUHJvY2Vzc1N0ZEVycjogYW55LFxuICB1dGlscz86IHsgaW5zcGVjdD86IGFueSB9IHwgdW5kZWZpbmVkLFxuKTogTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0IGJ1bkluc3BlY3QgPVxuICAgIGdsb2JhbEJ1biAhPT0gdW5kZWZpbmVkICYmICF0b0Jvb2xlYW4oZ2xvYmFsQnVuLmVudj8uTE9HX0JVTl9DT05TT0xFX0RJU0FCTEVEKVxuICAgICAgPyBnbG9iYWxCdW4uaW5zcGVjdFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc2V0Q29sb3JzUHJlZml4ID0gYnVuSW5zcGVjdCAhPT0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGluc3BlY3QgPSAoYXJnOiBhbnksIGNvbG9ycz86IGJvb2xlYW4pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpIHx8ICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkpIHtcbiAgICAgIGlmIChidW5JbnNwZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGJ1bkluc3BlY3QoYXJnLCB7XG4gICAgICAgICAgY29sb3JzOiBjb2xvcnMsXG4gICAgICAgICAgZGVwdGg6IHV0aWxzPy5pbnNwZWN0Py5kZWZhdWx0T3B0aW9ucz8uZGVwdGggPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodXRpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdXRpbHMuaW5zcGVjdChhcmcsIHtcbiAgICAgICAgICAuLi51dGlscz8uaW5zcGVjdD8uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgY29sb3JzOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzZWVuID0gbmV3IFdlYWtTZXQoKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZywgKF8sIHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuICAgICAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGFyZyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnkgPSAobmFtZT86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHByZWZpeEZvcm1hdHRlciA9IGNyZWF0ZUZvcm1hdHRlcihuYW1lLCBnbG9iYWxQcm9jZXNzU3RkRXJyLCByZXNldENvbG9yc1ByZWZpeCk7XG4gICAgY29uc3QgbG9nZ2VyID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgTE9HX0xFVkVMUy5tYXAoKGxldmVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBjb2xvcnMsIHJlc2V0Q29sb3JzIH0gPSBwcmVmaXhGb3JtYXR0ZXIobGV2ZWwpO1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgaWYgKCFzaG91bGRFbWl0KGxldmVsLCB0cnVlKSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9jZXNzU3RkRXJyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IHByZWZpeCA/IFtwcmVmaXhdIDogW107XG4gICAgICAgICAgICBtZXNzYWdlUGFydHMucHVzaCguLi5hcmdzLm1hcCgoYXJnKSA9PiBpbnNwZWN0KGFyZywgY29sb3JzKSkpO1xuICAgICAgICAgICAgaWYgKHJlc2V0Q29sb3JzKSBtZXNzYWdlUGFydHMucHVzaChMT0dfTEVWRUxfQ09MT1JfUkVTRVQpO1xuICAgICAgICAgICAgZ2xvYmFsUHJvY2Vzc1N0ZEVyci53cml0ZShtZXNzYWdlUGFydHMuam9pbihcIiBcIikgKyBcIlxcblwiKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxldmVsRm4gPSBjb25zb2xlW2xldmVsXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWxGbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgIGxldmVsRm4gPSBjb25zb2xlLmxvZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcmVmaXgpIGxldmVsRm4gPSBsZXZlbEZuLmJpbmQoY29uc29sZSwgcHJlZml4KTtcbiAgICAgICAgICAgIGxldmVsRm4oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gW2xldmVsLCBlbWl0dGVyXTtcbiAgICAgIH0pLFxuICAgICkgYXMgTG9nZ2VyO1xuICAgIC8vIGNvbnNvbGEgc3VnYXIgdGhlIGNvbnNvbGUgZmFsbGJhY2sgZG9lc24ndCBoYXZlIG5hdGl2ZWx5IC0gcm91dGUgdG8gaW5mby5cbiAgICBsb2dnZXIuc3VjY2VzcyA9IGxvZ2dlci5pbmZvO1xuICAgIGxvZ2dlci5zdGFydCA9IGxvZ2dlci5pbmZvO1xuICAgIHJldHVybiBsb2dnZXI7XG4gIH07XG4gIGNvbnN0IGRlZmF1bHRGYWN0b3J5ID0gbWVtb2l6ZShmYWN0b3J5KTtcbiAgcmV0dXJuIChuYW1lPzogc3RyaW5nKSA9PiAobmFtZSA/IGZhY3RvcnkobmFtZSkgOiBkZWZhdWx0RmFjdG9yeSgpKTtcbn1cblxuLyoqXG4gKiBQcmVmZXJyZWQgZmFjdG9yeTogY29uc29sYSB3aGVuIGl0IGxvYWRzLCBlbHNlIHRoZSBmdWxsIGNvbnNvbGUgc2luayAod2l0aFxuICogb3B0aW9uYWwgYG5vZGU6dXRpbGAgaW5zcGVjdCkuIE1lbW9pemVkIHNvIGNvbmN1cnJlbnQgLyByZXBlYXQgY2FsbGVycyBzaGFyZVxuICogb25lIGluLWZsaWdodCBwcm9taXNlIGFuZCBvbmUgc2V0dGxlZCByZXN1bHQuXG4gKi9cbmNvbnN0IHJlc29sdmVGYWN0b3J5ID0gbWVtb2l6ZShhc3luYyAoKTogUHJvbWlzZTxMb2dnZXJGYWN0b3J5PiA9PiB7XG4gIHJldHVybiAoXG4gICAgKGF3YWl0IGNyZWF0ZUNvbnNvbGFMb2dnZXJGYWN0b3J5KCkpID8/IChhd2FpdCBjcmVhdGVDb25zb2xlTG9nZ2VyRmFjdG9yeShnbG9iYWxQcm9jZXNzU3RkRXJyKSlcbiAgKTtcbn0pO1xuXG4vKipcbiAqIEFjdGl2ZSBmYWN0b3J5IHN0YXJ0cyBhcyBhIHN5bmMgY29uc29sZSBzaW5rIChubyBgYXdhaXRgLCBzbyB0aGlzIG1vZHVsZVxuICogZmluaXNoZXMgZXZhbHVhdGluZyBpbW1lZGlhdGVseSkgYW5kIHN3YXBzIHRvIHtAbGluayByZXNvbHZlRmFjdG9yeX0nc1xuICogcmVzdWx0IHdoZW4gdGhhdCBsYW5kcy4gS2ljayB0aGUgcmVzb2x2ZSBvZmYgYXQgbG9hZCBzbyBjb25zb2xhIGlzIHVzdWFsbHlcbiAqIHJlYWR5IGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgbG9nIGxpbmUuXG4gKi9cbmxldCBhY3RpdmVGYWN0b3J5OiBMb2dnZXJGYWN0b3J5ID0gY29uc29sZUxvZ2dlckZhY3RvcnkoZ2xvYmFsUHJvY2Vzc1N0ZEVycik7XG52b2lkIHJlc29sdmVGYWN0b3J5KCkudGhlbihcbiAgKGZhY3RvcnkpID0+IHtcbiAgICBhY3RpdmVGYWN0b3J5ID0gZmFjdG9yeTtcbiAgfSxcbiAgKCkgPT4ge1xuICAgIC8vIEtlZXAgdGhlIHN5bmMgY29uc29sZSBzaW5rOyBuZXZlciBsZWF2ZSBpbXBvcnRlcnMgd2l0aG91dCBhIGZhY3RvcnkuXG4gIH0sXG4pO1xuXG4vKipcbiAqIEJ1aWxkIGEgbG9nZ2VyIHRoYXQgcmViaW5kcyB3aGVuIHtAbGluayBhY3RpdmVGYWN0b3J5fSB1cGdyYWRlcy4gQ2FsbGVycyB0aGF0XG4gKiBjYXB0dXJlIGBjb25zdCBsb2cgPSBsb2dnZXIoXCJ4XCIpYCBhdCBtb2R1bGUgc2NvcGUgc3RpbGwgZ2V0IGNvbnNvbGEgb25jZSBpdFxuICogYXJyaXZlcywgd2l0aG91dCBldmVyeSBjYWxsIHNpdGUgd2FpdGluZyBvbiBhIHByb21pc2UuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcihuYW1lPzogc3RyaW5nKTogTG9nZ2VyIHtcbiAgbGV0IGJvdW5kOiB7IGZhY3Rvcnk6IExvZ2dlckZhY3Rvcnk7IGxvZ2dlcjogTG9nZ2VyIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpbmsgPSAoKTogTG9nZ2VyID0+IHtcbiAgICBpZiAoYm91bmQ/LmZhY3RvcnkgIT09IGFjdGl2ZUZhY3RvcnkpIHtcbiAgICAgIGJvdW5kID0geyBmYWN0b3J5OiBhY3RpdmVGYWN0b3J5LCBsb2dnZXI6IGFjdGl2ZUZhY3RvcnkobmFtZSkgfTtcbiAgICB9XG4gICAgcmV0dXJuIGJvdW5kLmxvZ2dlcjtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBbLi4uTE9HX0xFVkVMUywgXCJzdWNjZXNzXCIsIFwic3RhcnRcIl0ubWFwKChsZXZlbCkgPT4gW1xuICAgICAgbGV2ZWwsXG4gICAgICAoLi4uYXJnczogYW55W10pID0+IHNpbmsoKVtsZXZlbCBhcyBrZXlvZiBMb2dnZXJdKC4uLmFyZ3MpLFxuICAgIF0pLFxuICApIGFzIExvZ2dlcjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGxpbmUgcHJlZml4IG9mIGBMRVZFTCBbbmFtZV1gIG9uIE5vZGUvQnVuIGhvc3RzLCBvciBgW25hbWVdYCBhbG9uZVxuICogaW4gYnJvd3NlcnMgKGVpdGhlciBwYXJ0IG9taXR0ZWQgd2hlbiBhYnNlbnQpLiBBcHBsaWVzIHBlci1sZXZlbCBBTlNJIGNvbG9yXG4gKiB3aGVuIGBzdHJlYW1TdXBwb3J0c0NvbG9yYCBpcyB0cnVlIGZvciB0aGUgZ2l2ZW4gc3RkZXJyIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRm9ybWF0dGVyKFxuICBuYW1lOiBhbnksXG4gIHN0cmVhbTogYW55LFxuICByZXNldENvbG9yc1ByZWZpeD86IGJvb2xlYW4sXG4pOiAobGV2ZWw/OiBMb2dMZXZlbCkgPT4geyBwcmVmaXg6IHN0cmluZzsgY29sb3JzOiBib29sZWFuOyByZXNldENvbG9yczogYm9vbGVhbiB9IHtcbiAgY29uc3QgZ2xvYiA9IGdsb2JhbFRoaXMgYXMgeyB3aW5kb3c/OiB1bmtub3duOyBkb2N1bWVudD86IHVua25vd24gfTtcbiAgY29uc3QgaXNCcm93c2VyID0gZ2xvYi53aW5kb3cgIT09IHVuZGVmaW5lZCAmJiBnbG9iLmRvY3VtZW50ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1cHBvcnRzQ29sb3IgPSAhaXNCcm93c2VyID8gc3RyZWFtU3VwcG9ydHNDb2xvcihzdHJlYW0pIDogZmFsc2U7XG4gIGNvbnN0IG5hbWVQcmVmaXggPSBuYW1lID8gXCJbXCIgKyBuYW1lICsgXCJdXCIgOiB1bmRlZmluZWQ7XG4gIHJldHVybiAobGV2ZWw/OiBMb2dMZXZlbCkgPT4ge1xuICAgIGNvbnN0IGNvbG9yID0gc3VwcG9ydHNDb2xvciAmJiBsZXZlbCAhPT0gdW5kZWZpbmVkID8gTE9HX0xFVkVMX0NPTE9SU1tsZXZlbF0gOiB1bmRlZmluZWQ7XG4gICAgbGV0IHByZWZpeCA9IFshaXNCcm93c2VyICYmIGxldmVsID8gbGV2ZWwudG9VcHBlckNhc2UoKSA6IHVuZGVmaW5lZCwgbmFtZVByZWZpeF1cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBsZXQgcmVzZXRDb2xvcnMgPSBmYWxzZTtcbiAgICBpZiAoY29sb3IpIHtcbiAgICAgIGNvbnN0IGFwcGx5UmVzZXRDb2xvcnNQcmVmaXggPSByZXNldENvbG9yc1ByZWZpeCB8fCBcImluZm9cIiA9PT0gbGV2ZWw7XG4gICAgICBpZiAoIWFwcGx5UmVzZXRDb2xvcnNQcmVmaXgpIHJlc2V0Q29sb3JzID0gdHJ1ZTtcbiAgICAgIHByZWZpeCA9IGFwcGx5UmVzZXRDb2xvcnNQcmVmaXggPyBjb2xvciArIHByZWZpeCArIExPR19MRVZFTF9DT0xPUl9SRVNFVCA6IGNvbG9yICsgcHJlZml4O1xuICAgIH1cbiAgICByZXR1cm4geyBwcmVmaXgsIGNvbG9yczogY29sb3IgPyB0cnVlIDogZmFsc2UsIHJlc2V0Q29sb3JzIH07XG4gIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gYHN0cmVhbWAgaXMgYSBUVFkgYW5kIHRoZSB0ZXJtaW5hbCBpcyBub3QgYGR1bWJgLiAqL1xuZnVuY3Rpb24gc3RyZWFtU3VwcG9ydHNDb2xvcihzdHJlYW0/OiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmIChnbG9iYWxQcm9jZXNzID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHN0cmVhbSAhPT0gXCJvYmplY3RcIiB8fCBzdHJlYW0gPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeyBpc1RUWSB9ID0gc3RyZWFtIGFzIHsgaXNUVFk/OiB1bmtub3duIH07XG4gIGlmIChpc1RUWSAhPT0gdHJ1ZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB0ZXJtID0gZ2xvYmFsUHJvY2Vzcy5lbnY/LlRFUk0/LnRvTG93ZXJDYXNlKCk7XG4gIGlmIChcImR1bWJcIiA9PSB0ZXJtKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUGFyc2UgYSByYXcgdmFsdWUgYXMge0BsaW5rIExvZ0xldmVsfSAodHJpbW1lZCwgY2FzZS1pbnNlbnNpdGl2ZSkuICovXG5mdW5jdGlvbiBwYXJzZUxvZ0xldmVsKHJhdzogdW5rbm93bik6IExvZ0xldmVsIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHRleHQgPSB0eXBlb2YgcmF3ID09PSBcInN0cmluZ1wiID8gcmF3IDogU3RyaW5nKHJhdyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gdGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmICh0ZXh0ID09PSBub3JtYWxpemVkKSBicmVhaztcbiAgICAgIHRleHQgPSBub3JtYWxpemVkO1xuICAgIH1cbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAodGV4dCBpbiBMT0dfTEVWRUxfUkFOSykge1xuICAgICAgcmV0dXJuIHRleHQgYXMgTG9nTGV2ZWw7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBY3RpdmUgdGhyZXNob2xkIGZyb20gYHByb2Nlc3MuZW52LkxPR19MRVZFTGAsIGRlZmF1bHQge0BsaW5rIERFRkFVTFRfTEVWRUx9LiAqL1xuZnVuY3Rpb24gYWN0aXZlTGV2ZWwoKTogTG9nTGV2ZWwge1xuICByZXR1cm4gcGFyc2VMb2dMZXZlbChnbG9iYWxQcm9jZXNzPy5lbnY/LkxPR19MRVZFTCkgPz8gREVGQVVMVF9MRVZFTDtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGByYXdgIG1lZXRzIHRoZSBjdXJyZW50IGBMT0dfTEVWRUxgIHRocmVzaG9sZC5cbiAqXG4gKiBQYXJzZXMgYHJhd2AgYXMgYSB7QGxpbmsgTG9nTGV2ZWx9OyB3aGVuIHBhcnNpbmcgZmFpbHMsIHJldHVybnNcbiAqIGBkZWZhdWx0UmVzdWx0YCBpZiBzdXBwbGllZCwgb3RoZXJ3aXNlIGBmYWxzZWAuIFVzZWQgZm9yIGNvbnNvbGEgcmVwb3J0ZXJcbiAqIGxpbmVzIHdoZXJlIHVua25vd24gYGxvZ09iai50eXBlYCB2YWx1ZXMgc2hvdWxkIHBhc3MgdGhyb3VnaCB3aGVuXG4gKiBgZGVmYXVsdFJlc3VsdGAgaXMgYHRydWVgLlxuICovXG5mdW5jdGlvbiBzaG91bGRFbWl0KHJhdzogdW5rbm93biwgZGVmYXVsdFJlc3VsdD86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgY29uc3QgbGV2ZWwgPSBwYXJzZUxvZ0xldmVsKHJhdyk7XG4gIGlmIChsZXZlbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFJlc3VsdCA/PyBmYWxzZTtcbiAgcmV0dXJuIExPR19MRVZFTF9SQU5LW2xldmVsXSA+PSBMT0dfTEVWRUxfUkFOS1thY3RpdmVMZXZlbCgpXTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY2FsbCBhdCBgbGV2ZWxgIHdvdWxkIGJlIGVtaXR0ZWQgYXQgdGhlIGN1cnJlbnRcbiAqIGBwcm9jZXNzLmVudi5MT0dfTEVWRUxgIHRocmVzaG9sZC4gVXNlIGJlZm9yZSBidWlsZGluZyBleHBlbnNpdmUgZGVidWdcbiAqIHBheWxvYWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpZiAoaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKSkge1xuICogICBsb2cuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwgeyBjb250cmlidXRpb246IGF3YWl0IGhlYXZ5U25hcHNob3QoKSB9KTtcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGV2ZWxFbmFibGVkKGxldmVsOiBMb2dMZXZlbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gc2hvdWxkRW1pdChsZXZlbCk7XG59XG5cbmNvbnN0IExPR0dFUl9OQU1FX1JFR0VYID0gL14oPzpbYS16XVthLXowLTkrLi1dKjpcXC9cXC8pPy4qXFwvKFteLy5dKykoPzpcXC5bXi9dKyk/JC9pO1xuXG4vKipcbiAqIERlcml2ZSB0aGUgdGFnIHN0cmluZyBmcm9tIGEgbG9nZ2VyIG5hbWUsIHBsdWdpbiwgb3IgcGF0aC4gU2xhc2gtIGFuZFxuICogVVJMLXNoYXBlZCBzdHJpbmdzIHVzZSB0aGUgbGFzdCBwYXRoIHNlZ21lbnQgKGV4dGVuc2lvbiBzdHJpcHBlZCk7IHBsYWluXG4gKiBzdHJpbmdzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuIEVtcHR5IG9yIG1pc3NpbmcgbmFtZXMgLT4gYHVuZGVmaW5lZGBcbiAqICh1bnRhZ2dlZCBzaW5rKS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZTogTmFtZUxpa2UgfCBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWxvZ2dlck5hbWUpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgbG9nZ2VyTmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gbG9nZ2VyTmFtZS5tYXRjaChMT0dHRVJfTkFNRV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoPy5bMV0gPz8gbG9nZ2VyTmFtZTtcbiAgfVxuICByZXR1cm4gZXh0cmFjdExvZ2dlck5hbWUobG9nZ2VyTmFtZS5uYW1lKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHRhZ2dlZCBsb2dnZXIgZm9yIGEgcGx1Z2luIG9yIG1vZHVsZS5cbiAqXG4gKiBUaGUgdGFnIGlzIGBbbmFtZV1gIHdoZW4gYGxvZ2dlck5hbWVgIGlzIGEgbm9uLWVtcHR5IHN0cmluZywgYVxuICoge0BsaW5rIE5hbWVMaWtlfSB3aXRoIGBuYW1lYCwgb3IgYSBmaWxlIC8gVVJMIHBhdGggKHRoZSBiYXNlbmFtZSB3aXRob3V0XG4gKiBleHRlbnNpb24gaXMgdXNlZCkuIENvbnNvbGEgYXBwbGllcyB0aGUgdGFnIHZpYSBgd2l0aFRhZ2AgKHJlbmRlci10aW1lKS5cbiAqIFRoZSBgY29uc29sZWAgZmFsbGJhY2tzIHByZXBlbmQgYExFVkVMIFtuYW1lXWAgb24gTm9kZS9CdW4gaG9zdHMgb3IgYFtuYW1lXWBcbiAqIGFsb25lIGluIGJyb3dzZXJzIHZpYSB7QGxpbmsgY3JlYXRlRm9ybWF0dGVyfS5cbiAqXG4gKiBDYWxscyBiZWxvdyBgcHJvY2Vzcy5lbnYuTE9HX0xFVkVMYCBhcmUgZHJvcHBlZCBieSB7QGxpbmsgc2hvdWxkRW1pdH0gYmVmb3JlXG4gKiB0aGUgc2luayBmb3JtYXRzIG9yIHdyaXRlcyB0aGUgbGluZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbiAqXG4gKiBjb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiZ2VuaWUvY2hhdFwiKTtcbiAqIGxvZ2dlci5pbmZvKFwic3RhcnRpbmdcIik7XG4gKiBsb2dnZXIud2FybihcIm1pc3Npbmcgb3B0aW9uYWwgY29uZmlnXCIsIHsgcmVhc29uOiBcIm5vIGVudiB2YXJcIiB9KTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2dlcihsb2dnZXJOYW1lOiBOYW1lTGlrZSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IExvZ2dlciB7XG4gIGNvbnN0IG5hbWUgPSBleHRyYWN0TG9nZ2VyTmFtZShsb2dnZXJOYW1lKTtcbiAgcmV0dXJuIGNyZWF0ZUxvZ2dlcihuYW1lKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -43,7 +43,7 @@
43
43
  "./package.json": "./package.json"
44
44
  }
45
45
  },
46
- "version": "0.6.69",
46
+ "version": "0.6.70",
47
47
  "types": "./lib/index.d.ts",
48
48
  "type": "module",
49
49
  "exports": {
package/src/log.ts CHANGED
@@ -2,17 +2,20 @@
2
2
  * Tagged, leveled logging for every runtime - the one logger the whole
3
3
  * monorepo shares.
4
4
  *
5
- * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}
6
- * chosen once at module load. {@link LogLevel} filtering runs through
7
- * {@link shouldEmit} in the consola reporter or in per-level wrappers on the
8
- * `console` fallbacks.
5
+ * {@link logger} resolves a tagged {@link Logger} via a {@link LoggerFactory}.
6
+ * The factory starts as a synchronous console sink so this module never uses
7
+ * top-level `await` (that left importers with a null namespace mid-load in
8
+ * browser bundles). A memoized async chain then upgrades to consola when it
9
+ * is available. {@link LogLevel} filtering runs through {@link shouldEmit} in
10
+ * the consola reporter or in per-level wrappers on the `console` fallbacks.
9
11
  *
10
12
  * Sink selection chains two factories with nullish coalescing (first match
11
13
  * wins):
12
14
  *
13
15
  * 1. {@link createConsolaLoggerFactory} when consola resolves and
14
16
  * `LOG_CONSOLA_DISABLED` is not truthy.
15
- * 2. {@link createConsoleLoggerFactory} everywhere else.
17
+ * 2. {@link createConsoleLoggerFactory} everywhere else (also the sync
18
+ * bootstrap before that promise settles).
16
19
  *
17
20
  * The console fallback writes formatted lines to `process.stderr` when it is
18
21
  * available (Bun `inspect` per argument when `LOG_BUN_CONSOLE_DISABLED` is
@@ -21,8 +24,8 @@
21
24
  * the `LEVEL` text prefix (devtools show severity) and keep only the `[name]`
22
25
  * tag.
23
26
  *
24
- * Env toggles (read once at init): `LOG_LEVEL`, `LOG_CONSOLA_DISABLED`,
25
- * `LOG_BUN_CONSOLE_DISABLED`.
27
+ * Env toggles: `LOG_LEVEL` (read per call), `LOG_CONSOLA_DISABLED` /
28
+ * `LOG_BUN_CONSOLE_DISABLED` (read once during factory init).
26
29
  *
27
30
  * Browser-safe: `process` / `Bun` / `window` / `document` are all reached
28
31
  * through `globalThis` and guarded, consola loads lazily, and `node:util` is
@@ -197,6 +200,19 @@ async function createConsoleLoggerFactory(globalProcessStdErr: any): Promise<Log
197
200
  globalProcessStdErr === undefined
198
201
  ? undefined
199
202
  : await import(/* @vite-ignore */ nodeUtil).catch(() => undefined);
203
+ return consoleLoggerFactory(globalProcessStdErr, utils);
204
+ }
205
+
206
+ /**
207
+ * The synchronous core of {@link createConsoleLoggerFactory}, split out so the
208
+ * same emitter also serves as the bootstrap sink before any async factory has
209
+ * resolved. `utils` is `node:util` when it loaded; without it, object arguments
210
+ * format through the `JSON.stringify` fallback.
211
+ */
212
+ function consoleLoggerFactory(
213
+ globalProcessStdErr: any,
214
+ utils?: { inspect?: any } | undefined,
215
+ ): LoggerFactory {
200
216
  const bunInspect =
201
217
  globalBun !== undefined && !toBoolean(globalBun.env?.LOG_BUN_CONSOLE_DISABLED)
202
218
  ? globalBun.inspect
@@ -264,16 +280,52 @@ async function createConsoleLoggerFactory(globalProcessStdErr: any): Promise<Log
264
280
  }
265
281
 
266
282
  /**
267
- * Module-scoped {@link LoggerFactory}, initialized once via top-level `await`.
268
- * Delegates to {@link createConsolaLoggerFactory}, then
269
- * {@link createConsoleLoggerFactory}. Each {@link logger} call invokes the
270
- * chosen factory with a resolved tag. Env toggles are read only during init.
283
+ * Preferred factory: consola when it loads, else the full console sink (with
284
+ * optional `node:util` inspect). Memoized so concurrent / repeat callers share
285
+ * one in-flight promise and one settled result.
271
286
  */
272
- const createLogger: LoggerFactory = await (async () => {
287
+ const resolveFactory = memoize(async (): Promise<LoggerFactory> => {
273
288
  return (
274
289
  (await createConsolaLoggerFactory()) ?? (await createConsoleLoggerFactory(globalProcessStdErr))
275
290
  );
276
- })();
291
+ });
292
+
293
+ /**
294
+ * Active factory starts as a sync console sink (no `await`, so this module
295
+ * finishes evaluating immediately) and swaps to {@link resolveFactory}'s
296
+ * result when that lands. Kick the resolve off at load so consola is usually
297
+ * ready before the first interesting log line.
298
+ */
299
+ let activeFactory: LoggerFactory = consoleLoggerFactory(globalProcessStdErr);
300
+ void resolveFactory().then(
301
+ (factory) => {
302
+ activeFactory = factory;
303
+ },
304
+ () => {
305
+ // Keep the sync console sink; never leave importers without a factory.
306
+ },
307
+ );
308
+
309
+ /**
310
+ * Build a logger that rebinds when {@link activeFactory} upgrades. Callers that
311
+ * capture `const log = logger("x")` at module scope still get consola once it
312
+ * arrives, without every call site waiting on a promise.
313
+ */
314
+ function createLogger(name?: string): Logger {
315
+ let bound: { factory: LoggerFactory; logger: Logger } | undefined;
316
+ const sink = (): Logger => {
317
+ if (bound?.factory !== activeFactory) {
318
+ bound = { factory: activeFactory, logger: activeFactory(name) };
319
+ }
320
+ return bound.logger;
321
+ };
322
+ return Object.fromEntries(
323
+ [...LOG_LEVELS, "success", "start"].map((level) => [
324
+ level,
325
+ (...args: any[]) => sink()[level as keyof Logger](...args),
326
+ ]),
327
+ ) as Logger;
328
+ }
277
329
 
278
330
  /**
279
331
  * Build a line prefix of `LEVEL [name]` on Node/Bun hosts, or `[name]` alone