@workflow/world-local 5.0.0-beta.1 → 5.0.0-beta.11
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/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -1
- package/dist/fs.d.ts +57 -2
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +124 -10
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -4
- package/dist/init.js +1 -1
- package/dist/instrumentObject.js +1 -1
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +32 -2
- package/dist/storage/events-storage.d.ts.map +1 -1
- package/dist/storage/events-storage.js +754 -600
- package/dist/storage/filters.js +1 -1
- package/dist/storage/helpers.js +1 -1
- package/dist/storage/hooks-storage.d.ts.map +1 -1
- package/dist/storage/hooks-storage.js +3 -2
- package/dist/storage/index.d.ts +10 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +9 -11
- package/dist/storage/legacy.d.ts.map +1 -1
- package/dist/storage/legacy.js +10 -5
- package/dist/storage/runs-storage.d.ts +29 -3
- package/dist/storage/runs-storage.d.ts.map +1 -1
- package/dist/storage/runs-storage.js +76 -4
- package/dist/storage/steps-storage.d.ts.map +1 -1
- package/dist/storage/steps-storage.js +5 -2
- package/dist/storage.js +1 -1
- package/dist/streamer.d.ts.map +1 -1
- package/dist/streamer.js +133 -34
- package/dist/telemetry.js +1 -1
- package/dist/test-helpers.js +1 -1
- package/dist/util.js +1 -1
- package/package.json +5 -5
- package/dist/config.js.map +0 -1
- package/dist/fs.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init.js.map +0 -1
- package/dist/instrumentObject.js.map +0 -1
- package/dist/queue.js.map +0 -1
- package/dist/storage/events-storage.js.map +0 -1
- package/dist/storage/filters.js.map +0 -1
- package/dist/storage/helpers.js.map +0 -1
- package/dist/storage/hooks-storage.js.map +0 -1
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/legacy.js.map +0 -1
- package/dist/storage/runs-storage.js.map +0 -1
- package/dist/storage/steps-storage.js.map +0 -1
- package/dist/storage.js.map +0 -1
- package/dist/streamer.js.map +0 -1
- package/dist/telemetry.js.map +0 -1
- package/dist/test-helpers.js.map +0 -1
- package/dist/util.js.map +0 -1
package/dist/config.d.ts
CHANGED
|
@@ -3,6 +3,12 @@ export type Config = {
|
|
|
3
3
|
dataDir: string;
|
|
4
4
|
port?: number;
|
|
5
5
|
baseUrl?: string;
|
|
6
|
+
/**
|
|
7
|
+
* Whether start() should re-enqueue pending/running runs from storage.
|
|
8
|
+
* Defaults to true. Test harnesses that always start from a clean slate can
|
|
9
|
+
* disable recovery to avoid replaying stale runs.
|
|
10
|
+
*/
|
|
11
|
+
recoverActiveRuns?: boolean;
|
|
6
12
|
/**
|
|
7
13
|
* Optional tag to scope filesystem operations.
|
|
8
14
|
* When set, files are written as `{id}.{tag}.json` and `clear()` only deletes
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAMjD,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,MAAM;;CAKjB,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB7E"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AAMjD,MAAM,MAAM,MAAM,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,MAAM;;CAKjB,CAAC;AAEH;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB7E"}
|
package/dist/config.js
CHANGED
|
@@ -41,4 +41,4 @@ export async function resolveBaseUrl(config) {
|
|
|
41
41
|
}
|
|
42
42
|
throw new Error('Unable to resolve base URL for workflow queue.');
|
|
43
43
|
}
|
|
44
|
-
//# sourceMappingURL=
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsRUFBRTtJQUM3QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksZ0JBQWdCLENBQUM7QUFDakUsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsS0FBSyxDQUFDO0FBRWpELE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztBQUM3QyxDQUFDLENBQUM7QUEwQkYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBUyxHQUFHLEVBQUU7SUFDdEMsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO0lBRXBDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsTUFBdUI7SUFDMUQsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDcEMsT0FBTyxvQkFBb0IsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsT0FBTyxvQkFBb0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxlQUFlLEVBQUUsQ0FBQztJQUM3QyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sb0JBQW9CLFlBQVksRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7QUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFdvcmtmbG93UG9ydCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9nZXQtcG9ydCc7XG5pbXBvcnQgeyBvbmNlIH0gZnJvbSAnLi91dGlsLmpzJztcblxuY29uc3QgZ2V0RGF0YURpckZyb21FbnYgPSAoKSA9PiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9EQVRBX0RJUiB8fCAnLndvcmtmbG93LWRhdGEnO1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVTT0xWRV9EQVRBX09QVElPTiA9ICdhbGwnO1xuXG5jb25zdCBnZXRCYXNlVXJsRnJvbUVudiA9ICgpID0+IHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0JBU0VfVVJMO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uZmlnID0ge1xuICBkYXRhRGlyOiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHN0YXJ0KCkgc2hvdWxkIHJlLWVucXVldWUgcGVuZGluZy9ydW5uaW5nIHJ1bnMgZnJvbSBzdG9yYWdlLlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLiBUZXN0IGhhcm5lc3NlcyB0aGF0IGFsd2F5cyBzdGFydCBmcm9tIGEgY2xlYW4gc2xhdGUgY2FuXG4gICAqIGRpc2FibGUgcmVjb3ZlcnkgdG8gYXZvaWQgcmVwbGF5aW5nIHN0YWxlIHJ1bnMuXG4gICAqL1xuICByZWNvdmVyQWN0aXZlUnVucz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBPcHRpb25hbCB0YWcgdG8gc2NvcGUgZmlsZXN5c3RlbSBvcGVyYXRpb25zLlxuICAgKiBXaGVuIHNldCwgZmlsZXMgYXJlIHdyaXR0ZW4gYXMgYHtpZH0ue3RhZ30uanNvbmAgYW5kIGBjbGVhcigpYCBvbmx5IGRlbGV0ZXNcbiAgICogZmlsZXMgbWF0Y2hpbmcgdGhpcyB0YWcuIFVzZWQgYnkgdml0ZXN0IHRvIGlzb2xhdGUgdGVzdCBkYXRhIGluIHRoZSBzaGFyZWRcbiAgICogYC53b3JrZmxvdy1kYXRhYCBkaXJlY3RvcnkuXG4gICAqL1xuICB0YWc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZmx1c2ggaW50ZXJ2YWwgKGluIG1zKSBmb3IgYnVmZmVyZWQgc3RyZWFtIHdyaXRlcy5cbiAgICogRGVmYXVsdCBpcyAxMG1zLiBTZXQgdG8gMCBmb3IgaW1tZWRpYXRlIGZsdXNoaW5nLlxuICAgKi9cbiAgc3RyZWFtRmx1c2hJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbmZpZyA9IG9uY2U8Q29uZmlnPigoKSA9PiB7XG4gIGNvbnN0IGRhdGFEaXIgPSBnZXREYXRhRGlyRnJvbUVudigpO1xuICBjb25zdCBiYXNlVXJsID0gZ2V0QmFzZVVybEZyb21FbnYoKTtcblxuICByZXR1cm4geyBkYXRhRGlyLCBiYXNlVXJsIH07XG59KTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYmFzZSBVUkwgZm9yIHF1ZXVlIHJlcXVlc3RzIGZvbGxvd2luZyB0aGUgcHJpb3JpdHkgb3JkZXI6XG4gKiAxLiBjb25maWcuYmFzZVVybCAoaGlnaGVzdCBwcmlvcml0eSAtIGZ1bGwgb3ZlcnJpZGUgZnJvbSBhcmdzKVxuICogMi4gV09SS0ZMT1dfTE9DQUxfQkFTRV9VUkwgZW52IHZhciAoY2hlY2tlZCBkaXJlY3RseSB0byBoYW5kbGUgbGF0ZSBlbnYgdmFyIHNldHRpbmcpXG4gKiAzLiBjb25maWcucG9ydCAoZXhwbGljaXQgcG9ydCBvdmVycmlkZSBmcm9tIGFyZ3MpXG4gKiA0LiBQT1JUIGVudiB2YXIgKGV4cGxpY2l0IGNvbmZpZ3VyYXRpb24pXG4gKiA1LiBBdXRvLWRldGVjdGVkIHBvcnQgdmlhIGdldFBvcnQgKGRldGVjdCBhY3R1YWwgbGlzdGVuaW5nIHBvcnQpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQmFzZVVybChjb25maWc6IFBhcnRpYWw8Q29uZmlnPik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChjb25maWcuYmFzZVVybCkge1xuICAgIHJldHVybiBjb25maWcuYmFzZVVybDtcbiAgfVxuXG4gIC8vIENoZWNrIGVudiB2YXIgZGlyZWN0bHkgaW4gY2FzZSBpdCB3YXMgc2V0IGFmdGVyIHRoZSBjb25maWcgd2FzIGNhY2hlZFxuICAvLyBUaGlzIGlzIGltcG9ydGFudCBmb3IgQ0xJIHRvb2xzIHRoYXQgc2V0IHRoZSBlbnYgdmFyIGFmdGVyIG1vZHVsZSBpbXBvcnRcbiAgaWYgKHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0JBU0VfVVJMKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0JBU0VfVVJMO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb25maWcucG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtjb25maWcucG9ydH1gO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52LlBPUlQpIHtcbiAgICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9jZXNzLmVudi5QT1JUfWA7XG4gIH1cblxuICBjb25zdCBkZXRlY3RlZFBvcnQgPSBhd2FpdCBnZXRXb3JrZmxvd1BvcnQoKTtcbiAgaWYgKGRldGVjdGVkUG9ydCkge1xuICAgIHJldHVybiBgaHR0cDovL2xvY2FsaG9zdDoke2RldGVjdGVkUG9ydH1gO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBiYXNlIFVSTCBmb3Igd29ya2Zsb3cgcXVldWUuJyk7XG59XG4iXX0=
|
package/dist/fs.d.ts
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
|
+
import { WorkflowWorldError } from '@workflow/errors';
|
|
1
2
|
import type { PaginatedResponse } from '@workflow/world';
|
|
2
3
|
import { z } from 'zod';
|
|
4
|
+
/**
|
|
5
|
+
* Thrown when a caller-supplied entity ID contains characters that would
|
|
6
|
+
* escape the storage root (path traversal) or otherwise produce an unsafe
|
|
7
|
+
* filename. Extends {@link WorkflowWorldError} so the platform's standard
|
|
8
|
+
* error-to-HTTP mapping handles it alongside other world-layer errors.
|
|
9
|
+
*/
|
|
10
|
+
export declare class UnsafeEntityIdError extends WorkflowWorldError {
|
|
11
|
+
constructor(kind: string, value: string);
|
|
12
|
+
static is(value: unknown): value is UnsafeEntityIdError;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validate that a string is safe to embed in a filesystem path as a single
|
|
16
|
+
* path component. Rejects values that are:
|
|
17
|
+
* - empty
|
|
18
|
+
* - starting with `.` (blocks `.`, `..`, `.locks`, `.tmp`, and other
|
|
19
|
+
* hidden or reserved filenames)
|
|
20
|
+
* - containing `.` (would collide with the `.tag` / `.json` suffix the
|
|
21
|
+
* tagging logic strips from filenames; see {@link stripTag} /
|
|
22
|
+
* {@link getObjectCreatedAt})
|
|
23
|
+
* - containing `/`, `\`, or a NUL byte
|
|
24
|
+
*
|
|
25
|
+
* This is the primary defense against path-traversal attacks where a
|
|
26
|
+
* request body supplies a `runId` / `stepId` / `correlationId` containing
|
|
27
|
+
* `../` sequences to read or write files outside the storage root.
|
|
28
|
+
* {@link resolveWithinBase} provides a belt-and-suspenders containment
|
|
29
|
+
* check at the point of `path.join` for defense in depth.
|
|
30
|
+
*
|
|
31
|
+
* @param kind - Human-readable label used in the error message (e.g. "runId")
|
|
32
|
+
* @param value - The value to validate; throws {@link UnsafeEntityIdError}
|
|
33
|
+
* if the value is not safe.
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertSafeEntityId(kind: string, value: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* Join `basedir` with an entity-relative path and assert the result stays
|
|
38
|
+
* inside `basedir`. Complements {@link assertSafeEntityId}: per-entry-point
|
|
39
|
+
* validation is the primary defense, and this final check catches any path
|
|
40
|
+
* escape that slipped past (e.g. a new call site that forgot to validate,
|
|
41
|
+
* or an unusual character combination on a future filesystem). Throws
|
|
42
|
+
* {@link UnsafeEntityIdError} if the joined path escapes `basedir`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveWithinBase(basedir: string, ...segments: string[]): string;
|
|
3
45
|
/**
|
|
4
46
|
* Clear the created files cache. Useful for testing or when files are deleted externally.
|
|
5
47
|
*/
|
|
@@ -11,10 +53,21 @@ export { ulidToDate } from '@workflow/world';
|
|
|
11
53
|
* `wrun_ABC` → `wrun_ABC` (no-op if no tag)
|
|
12
54
|
*/
|
|
13
55
|
export declare function stripTag(fileId: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Check whether a fileId belongs to a specific tag.
|
|
58
|
+
* `wrun_ABC.vitest-0` belongs to `vitest-0`.
|
|
59
|
+
* Untagged fileIds never match a tag-scoped lookup.
|
|
60
|
+
*/
|
|
61
|
+
export declare function hasTag(fileId: string, tag: string): boolean;
|
|
14
62
|
/**
|
|
15
63
|
* Build the file path for an entity, with optional tag embedded in the filename.
|
|
16
|
-
* `taggedPath('runs', 'wrun_ABC', 'vitest-0')` →
|
|
17
|
-
* `taggedPath('runs', 'wrun_ABC')` →
|
|
64
|
+
* `taggedPath('/data', 'runs', 'wrun_ABC', 'vitest-0')` → `/data/runs/wrun_ABC.vitest-0.json`
|
|
65
|
+
* `taggedPath('/data', 'runs', 'wrun_ABC')` → `/data/runs/wrun_ABC.json`
|
|
66
|
+
*
|
|
67
|
+
* The `fileId` and `tag` are validated with {@link assertSafeEntityId} and
|
|
68
|
+
* the result is containment-checked with {@link resolveWithinBase} to
|
|
69
|
+
* prevent path-traversal attacks when values are derived from untrusted
|
|
70
|
+
* request input.
|
|
18
71
|
*/
|
|
19
72
|
export declare function taggedPath(basedir: string, entityDir: string, fileId: string, tag?: string): string;
|
|
20
73
|
/**
|
|
@@ -59,6 +112,7 @@ export declare function writeJSON(filePath: string, data: any, opts?: WriteOptio
|
|
|
59
112
|
export declare function write(filePath: string, data: string | Buffer, opts?: WriteOptions): Promise<void>;
|
|
60
113
|
export declare function readJSON<T>(filePath: string, decoder: z.ZodType<T>): Promise<T | null>;
|
|
61
114
|
export declare function readBuffer(filePath: string): Promise<Buffer>;
|
|
115
|
+
export declare function readFirstByte(filePath: string): Promise<number | undefined>;
|
|
62
116
|
export declare function deleteJSON(filePath: string): Promise<void>;
|
|
63
117
|
/**
|
|
64
118
|
* Atomically create a file using O_CREAT | O_EXCL flags.
|
|
@@ -72,6 +126,7 @@ interface PaginatedFileSystemQueryConfig<T> {
|
|
|
72
126
|
directory: string;
|
|
73
127
|
schema: z.ZodType<T>;
|
|
74
128
|
filePrefix?: string;
|
|
129
|
+
fileIdFilter?: (fileId: string) => boolean;
|
|
75
130
|
filter?: (item: T) => boolean;
|
|
76
131
|
sortOrder?: 'asc' | 'desc';
|
|
77
132
|
limit?: number;
|
package/dist/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
|
package/dist/fs.js
CHANGED
|
@@ -1,9 +1,82 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import { EntityConflictError } from '@workflow/errors';
|
|
3
|
+
import { EntityConflictError, WorkflowWorldError } from '@workflow/errors';
|
|
4
4
|
import { monotonicFactory } from 'ulid';
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
const ulid = monotonicFactory(() => Math.random());
|
|
7
|
+
/**
|
|
8
|
+
* Truncate a possibly-untrusted value for inclusion in an error message.
|
|
9
|
+
* Keeps error output actionable for developers in dev mode while limiting
|
|
10
|
+
* the amount of attacker-controlled data reflected back if a `world-local`
|
|
11
|
+
* backend is ever run in a context that surfaces these messages to clients.
|
|
12
|
+
*/
|
|
13
|
+
function truncateForError(value) {
|
|
14
|
+
const s = typeof value === 'string' ? value : String(value);
|
|
15
|
+
const MAX = 48;
|
|
16
|
+
return s.length > MAX ? `${s.slice(0, MAX)}…` : s;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Thrown when a caller-supplied entity ID contains characters that would
|
|
20
|
+
* escape the storage root (path traversal) or otherwise produce an unsafe
|
|
21
|
+
* filename. Extends {@link WorkflowWorldError} so the platform's standard
|
|
22
|
+
* error-to-HTTP mapping handles it alongside other world-layer errors.
|
|
23
|
+
*/
|
|
24
|
+
export class UnsafeEntityIdError extends WorkflowWorldError {
|
|
25
|
+
constructor(kind, value) {
|
|
26
|
+
super(`Unsafe ${kind} "${truncateForError(value)}": must not be empty, contain ".", "/", "\\", or null bytes`);
|
|
27
|
+
this.name = 'UnsafeEntityIdError';
|
|
28
|
+
}
|
|
29
|
+
static is(value) {
|
|
30
|
+
return value instanceof Error && value.name === 'UnsafeEntityIdError';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Validate that a string is safe to embed in a filesystem path as a single
|
|
35
|
+
* path component. Rejects values that are:
|
|
36
|
+
* - empty
|
|
37
|
+
* - starting with `.` (blocks `.`, `..`, `.locks`, `.tmp`, and other
|
|
38
|
+
* hidden or reserved filenames)
|
|
39
|
+
* - containing `.` (would collide with the `.tag` / `.json` suffix the
|
|
40
|
+
* tagging logic strips from filenames; see {@link stripTag} /
|
|
41
|
+
* {@link getObjectCreatedAt})
|
|
42
|
+
* - containing `/`, `\`, or a NUL byte
|
|
43
|
+
*
|
|
44
|
+
* This is the primary defense against path-traversal attacks where a
|
|
45
|
+
* request body supplies a `runId` / `stepId` / `correlationId` containing
|
|
46
|
+
* `../` sequences to read or write files outside the storage root.
|
|
47
|
+
* {@link resolveWithinBase} provides a belt-and-suspenders containment
|
|
48
|
+
* check at the point of `path.join` for defense in depth.
|
|
49
|
+
*
|
|
50
|
+
* @param kind - Human-readable label used in the error message (e.g. "runId")
|
|
51
|
+
* @param value - The value to validate; throws {@link UnsafeEntityIdError}
|
|
52
|
+
* if the value is not safe.
|
|
53
|
+
*/
|
|
54
|
+
export function assertSafeEntityId(kind, value) {
|
|
55
|
+
if (value.length === 0 ||
|
|
56
|
+
value.startsWith('.') ||
|
|
57
|
+
value.includes('/') ||
|
|
58
|
+
value.includes('\\') ||
|
|
59
|
+
value.includes('\0') ||
|
|
60
|
+
value.includes('.')) {
|
|
61
|
+
throw new UnsafeEntityIdError(kind, value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Join `basedir` with an entity-relative path and assert the result stays
|
|
66
|
+
* inside `basedir`. Complements {@link assertSafeEntityId}: per-entry-point
|
|
67
|
+
* validation is the primary defense, and this final check catches any path
|
|
68
|
+
* escape that slipped past (e.g. a new call site that forgot to validate,
|
|
69
|
+
* or an unusual character combination on a future filesystem). Throws
|
|
70
|
+
* {@link UnsafeEntityIdError} if the joined path escapes `basedir`.
|
|
71
|
+
*/
|
|
72
|
+
export function resolveWithinBase(basedir, ...segments) {
|
|
73
|
+
const resolvedBase = path.resolve(basedir);
|
|
74
|
+
const joined = path.resolve(basedir, ...segments);
|
|
75
|
+
if (joined !== resolvedBase && !joined.startsWith(resolvedBase + path.sep)) {
|
|
76
|
+
throw new UnsafeEntityIdError('path', segments.join('/'));
|
|
77
|
+
}
|
|
78
|
+
return joined;
|
|
79
|
+
}
|
|
7
80
|
const isWindows = process.platform === 'win32';
|
|
8
81
|
/**
|
|
9
82
|
* Execute a filesystem operation with retry logic on Windows.
|
|
@@ -58,14 +131,30 @@ const TAG_PATTERN = /\.[a-zA-Z][a-zA-Z0-9-]*$/;
|
|
|
58
131
|
export function stripTag(fileId) {
|
|
59
132
|
return fileId.replace(TAG_PATTERN, '');
|
|
60
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Check whether a fileId belongs to a specific tag.
|
|
136
|
+
* `wrun_ABC.vitest-0` belongs to `vitest-0`.
|
|
137
|
+
* Untagged fileIds never match a tag-scoped lookup.
|
|
138
|
+
*/
|
|
139
|
+
export function hasTag(fileId, tag) {
|
|
140
|
+
return fileId.endsWith(`.${tag}`);
|
|
141
|
+
}
|
|
61
142
|
/**
|
|
62
143
|
* Build the file path for an entity, with optional tag embedded in the filename.
|
|
63
|
-
* `taggedPath('runs', 'wrun_ABC', 'vitest-0')` →
|
|
64
|
-
* `taggedPath('runs', 'wrun_ABC')` →
|
|
144
|
+
* `taggedPath('/data', 'runs', 'wrun_ABC', 'vitest-0')` → `/data/runs/wrun_ABC.vitest-0.json`
|
|
145
|
+
* `taggedPath('/data', 'runs', 'wrun_ABC')` → `/data/runs/wrun_ABC.json`
|
|
146
|
+
*
|
|
147
|
+
* The `fileId` and `tag` are validated with {@link assertSafeEntityId} and
|
|
148
|
+
* the result is containment-checked with {@link resolveWithinBase} to
|
|
149
|
+
* prevent path-traversal attacks when values are derived from untrusted
|
|
150
|
+
* request input.
|
|
65
151
|
*/
|
|
66
152
|
export function taggedPath(basedir, entityDir, fileId, tag) {
|
|
153
|
+
assertSafeEntityId('fileId', fileId);
|
|
154
|
+
if (tag !== undefined)
|
|
155
|
+
assertSafeEntityId('tag', tag);
|
|
67
156
|
const filename = tag ? `${fileId}.${tag}.json` : `${fileId}.json`;
|
|
68
|
-
return
|
|
157
|
+
return resolveWithinBase(basedir, entityDir, filename);
|
|
69
158
|
}
|
|
70
159
|
/**
|
|
71
160
|
* Read a JSON entity with tagged fallback.
|
|
@@ -73,12 +162,15 @@ export function taggedPath(basedir, entityDir, fileId, tag) {
|
|
|
73
162
|
* untagged path (so a tagged world can read entities written without a tag).
|
|
74
163
|
*/
|
|
75
164
|
export async function readJSONWithFallback(basedir, entityDir, fileId, schema, tag) {
|
|
165
|
+
assertSafeEntityId('fileId', fileId);
|
|
166
|
+
if (tag !== undefined)
|
|
167
|
+
assertSafeEntityId('tag', tag);
|
|
76
168
|
if (tag) {
|
|
77
|
-
const result = await readJSON(
|
|
169
|
+
const result = await readJSON(resolveWithinBase(basedir, entityDir, `${fileId}.${tag}.json`), schema);
|
|
78
170
|
if (result !== null)
|
|
79
171
|
return result;
|
|
80
172
|
}
|
|
81
|
-
return readJSON(
|
|
173
|
+
return readJSON(resolveWithinBase(basedir, entityDir, `${fileId}.json`), schema);
|
|
82
174
|
}
|
|
83
175
|
/**
|
|
84
176
|
* List all filenames in a directory that have a specific tag.
|
|
@@ -211,6 +303,17 @@ export async function readBuffer(filePath) {
|
|
|
211
303
|
const content = await fs.readFile(filePath);
|
|
212
304
|
return content;
|
|
213
305
|
}
|
|
306
|
+
export async function readFirstByte(filePath) {
|
|
307
|
+
const file = await fs.open(filePath, 'r');
|
|
308
|
+
try {
|
|
309
|
+
const byte = Buffer.allocUnsafe(1);
|
|
310
|
+
const { bytesRead } = await file.read(byte, 0, 1, 0);
|
|
311
|
+
return bytesRead === 0 ? undefined : byte[0];
|
|
312
|
+
}
|
|
313
|
+
finally {
|
|
314
|
+
await file.close();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
214
317
|
export async function deleteJSON(filePath) {
|
|
215
318
|
try {
|
|
216
319
|
await fs.unlink(filePath);
|
|
@@ -267,18 +370,29 @@ function createCursor(timestamp, id) {
|
|
|
267
370
|
return id ? `${timestamp.toISOString()}|${id}` : timestamp.toISOString();
|
|
268
371
|
}
|
|
269
372
|
export async function paginatedFileSystemQuery(config) {
|
|
270
|
-
const { directory, schema, filePrefix, filter, sortOrder = 'desc', limit = 20, cursor, getCreatedAt, getId, } = config;
|
|
373
|
+
const { directory, schema, filePrefix, fileIdFilter, filter, sortOrder = 'desc', limit = 20, cursor, getCreatedAt, getId, } = config;
|
|
374
|
+
// Validate filePrefix (typically `${runId}-`) so request-derived prefixes
|
|
375
|
+
// consistently reject unsafe characters. filePrefix is only used below to
|
|
376
|
+
// filter readdir() results by prefix — it doesn't participate in path
|
|
377
|
+
// construction — but keeping the validation rule uniform across the
|
|
378
|
+
// storage layer avoids special cases and catches bad values earlier.
|
|
379
|
+
if (filePrefix !== undefined) {
|
|
380
|
+
assertSafeEntityId('filePrefix', filePrefix);
|
|
381
|
+
}
|
|
271
382
|
// 1. Get all JSON files in directory
|
|
272
383
|
const fileIds = await listJSONFiles(directory);
|
|
273
384
|
// 2. Filter by prefix if provided
|
|
274
385
|
const relevantFileIds = filePrefix
|
|
275
386
|
? fileIds.filter((fileId) => fileId.startsWith(filePrefix))
|
|
276
387
|
: fileIds;
|
|
388
|
+
const filteredFileIds = fileIdFilter
|
|
389
|
+
? relevantFileIds.filter(fileIdFilter)
|
|
390
|
+
: relevantFileIds;
|
|
277
391
|
// 3. ULID Optimization: Filter by cursor using filename timestamps before loading JSON
|
|
278
392
|
const parsedCursor = parseCursor(cursor);
|
|
279
|
-
let candidateFileIds =
|
|
393
|
+
let candidateFileIds = filteredFileIds;
|
|
280
394
|
if (parsedCursor) {
|
|
281
|
-
candidateFileIds =
|
|
395
|
+
candidateFileIds = filteredFileIds.filter((fileId) => {
|
|
282
396
|
const filenameDate = getCreatedAt(`${fileId}.json`);
|
|
283
397
|
if (filenameDate) {
|
|
284
398
|
// Use filename timestamp for cursor filtering
|
|
@@ -386,4 +500,4 @@ export async function paginatedFileSystemQuery(config) {
|
|
|
386
500
|
hasMore,
|
|
387
501
|
};
|
|
388
502
|
}
|
|
389
|
-
//# sourceMappingURL=fs.js.map
|
|
503
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhCLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBRW5EOzs7OztHQUtHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFjO0lBQ3RDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUN6RCxZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FDSCxVQUFVLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsNkRBQTZELENBQ3hHLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7SUFF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QUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRTNFLHVFQUF1RTtRQUN2RSxJQUFJLGNBQWMsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbEMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixPQUFPLFNBQVMsS0FBSyxLQUFLO2dCQUN4QixDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hCLENBQUMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFFRCxPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILHNCQUFzQjtJQUN0QixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUMxQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2QsQ0FBQyxDQUFDLFlBQVksQ0FDVixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQ2pDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2pDO1FBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVYLE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgRW50aXR5Q29uZmxpY3RFcnJvciwgV29ya2Zsb3dXb3JsZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZFJlc3BvbnNlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiBNYXRoLnJhbmRvbSgpKTtcblxuLyoqXG4gKiBUcnVuY2F0ZSBhIHBvc3NpYmx5LXVudHJ1c3RlZCB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGFuIGVycm9yIG1lc3NhZ2UuXG4gKiBLZWVwcyBlcnJvciBvdXRwdXQgYWN0aW9uYWJsZSBmb3IgZGV2ZWxvcGVycyBpbiBkZXYgbW9kZSB3aGlsZSBsaW1pdGluZ1xuICogdGhlIGFtb3VudCBvZiBhdHRhY2tlci1jb250cm9sbGVkIGRhdGEgcmVmbGVjdGVkIGJhY2sgaWYgYSBgd29ybGQtbG9jYWxgXG4gKiBiYWNrZW5kIGlzIGV2ZXIgcnVuIGluIGEgY29udGV4dCB0aGF0IHN1cmZhY2VzIHRoZXNlIG1lc3NhZ2VzIHRvIGNsaWVudHMuXG4gKi9cbmZ1bmN0aW9uIHRydW5jYXRlRm9yRXJyb3IodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbiAgY29uc3QgTUFYID0gNDg7XG4gIHJldHVybiBzLmxlbmd0aCA+IE1BWCA/IGAke3Muc2xpY2UoMCwgTUFYKX3igKZgIDogcztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGNhbGxlci1zdXBwbGllZCBlbnRpdHkgSUQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHdvdWxkXG4gKiBlc2NhcGUgdGhlIHN0b3JhZ2Ugcm9vdCAocGF0aCB0cmF2ZXJzYWwpIG9yIG90aGVyd2lzZSBwcm9kdWNlIGFuIHVuc2FmZVxuICogZmlsZW5hbWUuIEV4dGVuZHMge0BsaW5rIFdvcmtmbG93V29ybGRFcnJvcn0gc28gdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmRcbiAqIGVycm9yLXRvLUhUVFAgbWFwcGluZyBoYW5kbGVzIGl0IGFsb25nc2lkZSBvdGhlciB3b3JsZC1sYXllciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbnNhZmVFbnRpdHlJZEVycm9yIGV4dGVuZHMgV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgY29uc3RydWN0b3Ioa2luZDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVW5zYWZlICR7a2luZH0gXCIke3RydW5jYXRlRm9yRXJyb3IodmFsdWUpfVwiOiBtdXN0IG5vdCBiZSBlbXB0eSwgY29udGFpbiBcIi5cIiwgXCIvXCIsIFwiXFxcXFwiLCBvciBudWxsIGJ5dGVzYFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG5cbiAgc3RhdGljIGlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVW5zYWZlRW50aXR5SWRFcnJvciB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdmFsdWUubmFtZSA9PT0gJ1Vuc2FmZUVudGl0eUlkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIHN0cmluZyBpcyBzYWZlIHRvIGVtYmVkIGluIGEgZmlsZXN5c3RlbSBwYXRoIGFzIGEgc2luZ2xlXG4gKiBwYXRoIGNvbXBvbmVudC4gUmVqZWN0cyB2YWx1ZXMgdGhhdCBhcmU6XG4gKiAgIC0gZW1wdHlcbiAqICAgLSBzdGFydGluZyB3aXRoIGAuYCAoYmxvY2tzIGAuYCwgYC4uYCwgYC5sb2Nrc2AsIGAudG1wYCwgYW5kIG90aGVyXG4gKiAgICAgaGlkZGVuIG9yIHJlc2VydmVkIGZpbGVuYW1lcylcbiAqICAgLSBjb250YWluaW5nIGAuYCAod291bGQgY29sbGlkZSB3aXRoIHRoZSBgLnRhZ2AgLyBgLmpzb25gIHN1ZmZpeCB0aGVcbiAqICAgICB0YWdnaW5nIGxvZ2ljIHN0cmlwcyBmcm9tIGZpbGVuYW1lczsgc2VlIHtAbGluayBzdHJpcFRhZ30gL1xuICogICAgIHtAbGluayBnZXRPYmplY3RDcmVhdGVkQXR9KVxuICogICAtIGNvbnRhaW5pbmcgYC9gLCBgXFxgLCBvciBhIE5VTCBieXRlXG4gKlxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlIGFnYWluc3QgcGF0aC10cmF2ZXJzYWwgYXR0YWNrcyB3aGVyZSBhXG4gKiByZXF1ZXN0IGJvZHkgc3VwcGxpZXMgYSBgcnVuSWRgIC8gYHN0ZXBJZGAgLyBgY29ycmVsYXRpb25JZGAgY29udGFpbmluZ1xuICogYC4uL2Agc2VxdWVuY2VzIHRvIHJlYWQgb3Igd3JpdGUgZmlsZXMgb3V0c2lkZSB0aGUgc3RvcmFnZSByb290LlxuICoge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSBwcm92aWRlcyBhIGJlbHQtYW5kLXN1c3BlbmRlcnMgY29udGFpbm1lbnRcbiAqIGNoZWNrIGF0IHRoZSBwb2ludCBvZiBgcGF0aC5qb2luYCBmb3IgZGVmZW5zZSBpbiBkZXB0aC5cbiAqXG4gKiBAcGFyYW0ga2luZCAtIEh1bWFuLXJlYWRhYmxlIGxhYmVsIHVzZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2UgKGUuZy4gXCJydW5JZFwiKVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlOyB0aHJvd3Mge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9XG4gKiAgIGlmIHRoZSB2YWx1ZSBpcyBub3Qgc2FmZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNhZmVFbnRpdHlJZChraW5kOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKFxuICAgIHZhbHVlLmxlbmd0aCA9PT0gMCB8fFxuICAgIHZhbHVlLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgIHZhbHVlLmluY2x1ZGVzKCcvJykgfHxcbiAgICB2YWx1ZS5pbmNsdWRlcygnXFxcXCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJ1xcMCcpIHx8XG4gICAgdmFsdWUuaW5jbHVkZXMoJy4nKVxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zYWZlRW50aXR5SWRFcnJvcihraW5kLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBKb2luIGBiYXNlZGlyYCB3aXRoIGFuIGVudGl0eS1yZWxhdGl2ZSBwYXRoIGFuZCBhc3NlcnQgdGhlIHJlc3VsdCBzdGF5c1xuICogaW5zaWRlIGBiYXNlZGlyYC4gQ29tcGxlbWVudHMge0BsaW5rIGFzc2VydFNhZmVFbnRpdHlJZH06IHBlci1lbnRyeS1wb2ludFxuICogdmFsaWRhdGlvbiBpcyB0aGUgcHJpbWFyeSBkZWZlbnNlLCBhbmQgdGhpcyBmaW5hbCBjaGVjayBjYXRjaGVzIGFueSBwYXRoXG4gKiBlc2NhcGUgdGhhdCBzbGlwcGVkIHBhc3QgKGUuZy4gYSBuZXcgY2FsbCBzaXRlIHRoYXQgZm9yZ290IHRvIHZhbGlkYXRlLFxuICogb3IgYW4gdW51c3VhbCBjaGFyYWN0ZXIgY29tYmluYXRpb24gb24gYSBmdXR1cmUgZmlsZXN5c3RlbSkuIFRocm93c1xuICoge0BsaW5rIFVuc2FmZUVudGl0eUlkRXJyb3J9IGlmIHRoZSBqb2luZWQgcGF0aCBlc2NhcGVzIGBiYXNlZGlyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXaXRoaW5CYXNlKFxuICBiYXNlZGlyOiBzdHJpbmcsXG4gIC4uLnNlZ21lbnRzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VkaXIpO1xuICBjb25zdCBqb2luZWQgPSBwYXRoLnJlc29sdmUoYmFzZWRpciwgLi4uc2VnbWVudHMpO1xuICBpZiAoam9pbmVkICE9PSByZXNvbHZlZEJhc2UgJiYgIWpvaW5lZC5zdGFydHNXaXRoKHJlc29sdmVkQmFzZSArIHBhdGguc2VwKSkge1xuICAgIHRocm93IG5ldyBVbnNhZmVFbnRpdHlJZEVycm9yKCdwYXRoJywgc2VnbWVudHMuam9pbignLycpKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuXG5jb25zdCBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vKipcbiAqIEV4ZWN1dGUgYSBmaWxlc3lzdGVtIG9wZXJhdGlvbiB3aXRoIHJldHJ5IGxvZ2ljIG9uIFdpbmRvd3MuXG4gKiBPbiBXaW5kb3dzLCBmaWxlIG9wZXJhdGlvbnMgY2FuIGZhaWwgd2l0aCBFUEVSTS9FQlVTWS9FQUNDRVMgd2hlbiBmaWxlc1xuICogYXJlIGJyaWVmbHkgbG9ja2VkIGJ5IGFub3RoZXIgcHJvY2VzcyBvciBhbnRpdmlydXMuIFRoaXMgd3JhcHBlciBhZGRzXG4gKiBleHBvbmVudGlhbCBiYWNrb2ZmIHJldHJ5IGxvZ2ljLiBPbiBub24tV2luZG93cyBwbGF0Zm9ybXMsIGV4ZWN1dGVzIGRpcmVjdGx5LlxuICovXG5hc3luYyBmdW5jdGlvbiB3aXRoV2luZG93c1JldHJ5PFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgbWF4UmV0cmllcyA9IDVcbik6IFByb21pc2U8VD4ge1xuICBpZiAoIWlzV2luZG93cykgcmV0dXJuIGZuKCk7XG5cbiAgY29uc3QgcmV0cnlhYmxlRXJyb3JzID0gWydFUEVSTScsICdFQlVTWScsICdFQUNDRVMnXTtcbiAgY29uc3QgYmFzZURlbGF5TXMgPSAxMDtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBtYXhSZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc3QgaXNSZXRyeWFibGUgPVxuICAgICAgICBhdHRlbXB0IDwgbWF4UmV0cmllcyAmJiByZXRyeWFibGVFcnJvcnMuaW5jbHVkZXMoZXJyb3IuY29kZSk7XG4gICAgICBpZiAoIWlzUmV0cnlhYmxlKSB0aHJvdyBlcnJvcjtcbiAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBqaXR0ZXJcbiAgICAgIGNvbnN0IGRlbGF5ID0gYmFzZURlbGF5TXMgKiAyICoqIGF0dGVtcHQgKyBNYXRoLnJhbmRvbSgpICogYmFzZURlbGF5TXM7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgIH1cbiAgfVxuICAvLyBUeXBlU2NyaXB0OiB1bnJlYWNoYWJsZSwgYnV0IHNhdGlzZmllcyByZXR1cm4gdHlwZVxuICB0aHJvdyBuZXcgRXJyb3IoJ1JldHJ5IGxvb3AgZXhpdGVkIHVuZXhwZWN0ZWRseScpO1xufVxuXG4vLyBJbi1tZW1vcnkgY2FjaGUgb2YgY3JlYXRlZCBmaWxlcyB0byBhdm9pZCBleHBlbnNpdmUgZnMuYWNjZXNzKCkgY2FsbHNcbi8vIFRoaXMgaXMgc2FmZSBiZWNhdXNlIHdlIG9ubHkgd3JpdGUgb25jZSBwZXIgZmlsZSBwYXRoIChubyBvdmVyd3JpdGVzIHdpdGhvdXQgZXhwbGljaXQgZmxhZylcbmNvbnN0IGNyZWF0ZWRGaWxlc0NhY2hlID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKlxuICogQ2xlYXIgdGhlIGNyZWF0ZWQgZmlsZXMgY2FjaGUuIFVzZWZ1bCBmb3IgdGVzdGluZyBvciB3aGVuIGZpbGVzIGFyZSBkZWxldGVkIGV4dGVybmFsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlKCk6IHZvaWQge1xuICBjcmVhdGVkRmlsZXNDYWNoZS5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB1bGlkVG9EYXRlIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBSZWdleCBtYXRjaGluZyBhIHRhZyBzdWZmaXggb24gYSBmaWxlSWQgKGFmdGVyIGAuanNvbmAgaGFzIGJlZW4gc3RyaXBwZWQpLlxuICogRS5nLiwgYHdydW5fQUJDLnZpdGVzdC0wYCDihpIgdGhlIGAudml0ZXN0LTBgIHBhcnQuXG4gKiBUYWdzIHN0YXJ0IHdpdGggYSBsZXR0ZXIgYW5kIGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJzIGFuZCBoeXBoZW5zLlxuICogRW50aXR5IElEcyAoVUxJRHMsIHN0ZXBfTiwgZXRjLikgbmV2ZXIgY29udGFpbiBkb3RzLCBzbyB0aGUgZmlyc3QgZG90XG4gKiBhbHdheXMgbWFya3MgdGhlIHRhZyBib3VuZGFyeS5cbiAqL1xuY29uc3QgVEFHX1BBVFRFUk4gPSAvXFwuW2EtekEtWl1bYS16QS1aMC05LV0qJC87XG5cbi8qKlxuICogU3RyaXAgYSB0YWcgc3VmZml4IGZyb20gYSBmaWxlSWQuXG4gKiBgd3J1bl9BQkMudml0ZXN0LTBgIOKGkiBgd3J1bl9BQkNgXG4gKiBgd3J1bl9BQkNgIOKGkiBgd3J1bl9BQkNgIChuby1vcCBpZiBubyB0YWcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFRhZyhmaWxlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlSWQucmVwbGFjZShUQUdfUEFUVEVSTiwgJycpO1xufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYSBmaWxlSWQgYmVsb25ncyB0byBhIHNwZWNpZmljIHRhZy5cbiAqIGB3cnVuX0FCQy52aXRlc3QtMGAgYmVsb25ncyB0byBgdml0ZXN0LTBgLlxuICogVW50YWdnZWQgZmlsZUlkcyBuZXZlciBtYXRjaCBhIHRhZy1zY29wZWQgbG9va3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVGFnKGZpbGVJZDogc3RyaW5nLCB0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZUlkLmVuZHNXaXRoKGAuJHt0YWd9YCk7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZpbGUgcGF0aCBmb3IgYW4gZW50aXR5LCB3aXRoIG9wdGlvbmFsIHRhZyBlbWJlZGRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gKiBgdGFnZ2VkUGF0aCgnL2RhdGEnLCAncnVucycsICd3cnVuX0FCQycsICd2aXRlc3QtMCcpYCDihpIgYC9kYXRhL3J1bnMvd3J1bl9BQkMudml0ZXN0LTAuanNvbmBcbiAqIGB0YWdnZWRQYXRoKCcvZGF0YScsICdydW5zJywgJ3dydW5fQUJDJylgIOKGkiBgL2RhdGEvcnVucy93cnVuX0FCQy5qc29uYFxuICpcbiAqIFRoZSBgZmlsZUlkYCBhbmQgYHRhZ2AgYXJlIHZhbGlkYXRlZCB3aXRoIHtAbGluayBhc3NlcnRTYWZlRW50aXR5SWR9IGFuZFxuICogdGhlIHJlc3VsdCBpcyBjb250YWlubWVudC1jaGVja2VkIHdpdGgge0BsaW5rIHJlc29sdmVXaXRoaW5CYXNlfSB0b1xuICogcHJldmVudCBwYXRoLXRyYXZlcnNhbCBhdHRhY2tzIHdoZW4gdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdW50cnVzdGVkXG4gKiByZXF1ZXN0IGlucHV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGFnZ2VkUGF0aChcbiAgYmFzZWRpcjogc3RyaW5nLFxuICBlbnRpdHlEaXI6IHN0cmluZyxcbiAgZmlsZUlkOiBzdHJpbmcsXG4gIHRhZz86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgYXNzZXJ0U2FmZUVudGl0eUlkKCdmaWxlSWQnLCBmaWxlSWQpO1xuICBpZiAodGFnICE9PSB1bmRlZmluZWQpIGFzc2VydFNhZmVFbnRpdHlJZCgndGFnJywgdGFnKTtcbiAgY29uc3QgZmlsZW5hbWUgPSB0YWcgPyBgJHtmaWxlSWR9LiR7dGFnfS5qc29uYCA6IGAke2ZpbGVJZH0uanNvbmA7XG4gIHJldHVybiByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGZpbGVuYW1lKTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgSlNPTiBlbnRpdHkgd2l0aCB0YWdnZWQgZmFsbGJhY2suXG4gKiBXaGVuIGEgdGFnIGlzIHNldCwgdHJpZXMgdGhlIHRhZ2dlZCBwYXRoIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gdGhlXG4gKiB1bnRhZ2dlZCBwYXRoIChzbyBhIHRhZ2dlZCB3b3JsZCBjYW4gcmVhZCBlbnRpdGllcyB3cml0dGVuIHdpdGhvdXQgYSB0YWcpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEpTT05XaXRoRmFsbGJhY2s8VD4oXG4gIGJhc2VkaXI6IHN0cmluZyxcbiAgZW50aXR5RGlyOiBzdHJpbmcsXG4gIGZpbGVJZDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgdGFnPzogc3RyaW5nXG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIGFzc2VydFNhZmVFbnRpdHlJZCgnZmlsZUlkJywgZmlsZUlkKTtcbiAgaWYgKHRhZyAhPT0gdW5kZWZpbmVkKSBhc3NlcnRTYWZlRW50aXR5SWQoJ3RhZycsIHRhZyk7XG4gIGlmICh0YWcpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkSlNPTihcbiAgICAgIHJlc29sdmVXaXRoaW5CYXNlKGJhc2VkaXIsIGVudGl0eURpciwgYCR7ZmlsZUlkfS4ke3RhZ30uanNvbmApLFxuICAgICAgc2NoZW1hXG4gICAgKTtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHJldHVybiByZWFkSlNPTihcbiAgICByZXNvbHZlV2l0aGluQmFzZShiYXNlZGlyLCBlbnRpdHlEaXIsIGAke2ZpbGVJZH0uanNvbmApLFxuICAgIHNjaGVtYVxuICApO1xufVxuXG4vKipcbiAqIExpc3QgYWxsIGZpbGVuYW1lcyBpbiBhIGRpcmVjdG9yeSB0aGF0IGhhdmUgYSBzcGVjaWZpYyB0YWcuXG4gKiBSZXR1cm5zIGZ1bGwgZmlsZW5hbWVzIChlLmcuLCBgd3J1bl9BQkMudml0ZXN0LTAuanNvbmApLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFRhZ2dlZEZpbGVzKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHN1ZmZpeCA9IGAuJHt0YWd9Lmpzb25gO1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKChmKSA9PiBmLmVuZHNXaXRoKHN1ZmZpeCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogTGlzdCBhbGwgZmlsZW5hbWVzIGluIGEgZGlyZWN0b3J5IHRoYXQgaGF2ZSBhIHNwZWNpZmljIHRhZyBhbmQgZXh0ZW5zaW9uLlxuICogUmV0dXJucyBmdWxsIGZpbGVuYW1lcyAoZS5nLiwgYHN0cmVhbS1jaG5rX0FCQy52aXRlc3QtMC5iaW5gKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RUYWdnZWRGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBleHRlbnNpb246IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzdWZmaXggPSBgLiR7dGFnfSR7ZXh0ZW5zaW9ufWA7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoc3VmZml4KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gW107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZURpcihkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgLy8gSWdub3JlIGlmIGFscmVhZHkgZXhpc3RzXG4gIH1cbn1cblxuaW50ZXJmYWNlIFdyaXRlT3B0aW9ucyB7XG4gIG92ZXJ3cml0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmVwbGFjZXIgdGhhdCBlbmNvZGVzIFVpbnQ4QXJyYXkgYXMgYmFzZTY0IHN0cmluZ3MuXG4gKiBGb3JtYXQ6IHsgX190eXBlOiAnVWludDhBcnJheScsIGRhdGE6ICc8YmFzZTY0PicgfVxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJlcGxhY2VyKF9rZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6ICdVaW50OEFycmF5JyxcbiAgICAgIGRhdGE6IEJ1ZmZlci5mcm9tKHZhbHVlKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3VzdG9tIEpTT04gcmV2aXZlciB0aGF0IGRlY29kZXMgYmFzZTY0IHN0cmluZ3MgYmFjayB0byBVaW50OEFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvblJldml2ZXIoX2tleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHZhbHVlIGFzIGFueSkuX190eXBlID09PSAnVWludDhBcnJheScgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIGFueSkuZGF0YSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKCh2YWx1ZSBhcyBhbnkpLmRhdGEsICdiYXNlNjQnKSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVKU09OKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBhbnksXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd3JpdGUoZmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGRhdGEsIGpzb25SZXBsYWNlciwgMiksIG9wdHMpO1xufVxuXG4vKipcbiAqIFdyaXRlcyBkYXRhIHRvIGEgZmlsZSB1c2luZyBhdG9taWMgd3JpdGUtcmVuYW1lIHBhdHRlcm4uXG4gKlxuICogTm90ZTogV2hpbGUgdGhpcyBmdW5jdGlvbiB1c2VzIHRlbXAgZmlsZXMgdG8gYXZvaWQgcGFydGlhbCB3cml0ZXMsXG4gKiBpdCBkb2VzIG5vdCBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBjb25jdXJyZW50IHdyaXRlcyBmcm9tIG11bHRpcGxlXG4gKiBwcm9jZXNzZXMuIEluIGEgbXVsdGktd3JpdGVyIHNjZW5hcmlvLCB0aGUgbGFzdCB3cml0ZXIgd2lucy5cbiAqIEZvciBwcm9kdWN0aW9uIHVzZSB3aXRoIG11bHRpcGxlIHdyaXRlcnMsIGNvbnNpZGVyIHVzaW5nIGEgcHJvcGVyXG4gKiBkYXRhYmFzZSBvciBsb2NraW5nIG1lY2hhbmlzbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBkYXRhOiBzdHJpbmcgfCBCdWZmZXIsXG4gIG9wdHM/OiBXcml0ZU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIW9wdHM/Lm92ZXJ3cml0ZSkge1xuICAgIC8vIEZhc3QgcGF0aDogY2hlY2sgaW4tbWVtb3J5IGNhY2hlIGZpcnN0IHRvIGF2b2lkIGV4cGVuc2l2ZSBmcy5hY2Nlc3MoKSBjYWxsc1xuICAgIC8vIFRoaXMgcHJvdmlkZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2hlbiBjcmVhdGluZyBtYW55IGZpbGVzXG4gICAgaWYgKGNyZWF0ZWRGaWxlc0NhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNsb3cgcGF0aDogY2hlY2sgZmlsZXN5c3RlbSBmb3IgZmlsZXMgY3JlYXRlZCBiZWZvcmUgdGhpcyBwcm9jZXNzIHN0YXJ0ZWRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIC8vIEZpbGUgZXhpc3RzIG9uIGRpc2ssIGFkZCB0byBjYWNoZSBmb3IgZnV0dXJlIGNoZWNrc1xuICAgICAgY3JlYXRlZEZpbGVzQ2FjaGUuYWRkKGZpbGVQYXRoKTtcbiAgICAgIHRocm93IG5ldyBFbnRpdHlDb25mbGljdEVycm9yKFxuICAgICAgICBgRmlsZSAke2ZpbGVQYXRofSBhbHJlYWR5IGV4aXN0cyBhbmQgJ292ZXJ3cml0ZScgaXMgZmFsc2VgXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIElmIGZpbGUgZG9lc24ndCBleGlzdCAoRU5PRU5UKSwgY29udGludWUgd2l0aCB3cml0ZVxuICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRlbXBQYXRoID0gYCR7ZmlsZVBhdGh9LnRtcC4ke3VsaWQoKX1gO1xuICBsZXQgdGVtcEZpbGVDcmVhdGVkID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgYXdhaXQgZW5zdXJlRGlyKHBhdGguZGlybmFtZShmaWxlUGF0aCkpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0ZW1wUGF0aCwgZGF0YSk7XG4gICAgdGVtcEZpbGVDcmVhdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCB3aXRoV2luZG93c1JldHJ5KCgpID0+IGZzLnJlbmFtZSh0ZW1wUGF0aCwgZmlsZVBhdGgpKTtcbiAgICAvLyBUcmFjayB0aGlzIGZpbGUgaW4gY2FjaGUgc28gZnV0dXJlIHdyaXRlcyBrbm93IGl0IGV4aXN0c1xuICAgIGNyZWF0ZWRGaWxlc0NhY2hlLmFkZChmaWxlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gT25seSB0cnkgdG8gY2xlYW4gdXAgdGVtcCBmaWxlIGlmIGl0IHdhcyBhY3R1YWxseSBjcmVhdGVkXG4gICAgaWYgKHRlbXBGaWxlQ3JlYXRlZCkge1xuICAgICAgYXdhaXQgd2l0aFdpbmRvd3NSZXRyeSgoKSA9PiBmcy51bmxpbmsodGVtcFBhdGgpLCAzKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSlNPTjxUPihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgZGVjb2Rlcjogei5ab2RUeXBlPFQ+XG4pOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gZGVjb2Rlci5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnQsIGpzb25SZXZpdmVyKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZEJ1ZmZlcihmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkRmlyc3RCeXRlKFxuICBmaWxlUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmaWxlID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBieXRlID0gQnVmZmVyLmFsbG9jVW5zYWZlKDEpO1xuICAgIGNvbnN0IHsgYnl0ZXNSZWFkIH0gPSBhd2FpdCBmaWxlLnJlYWQoYnl0ZSwgMCwgMSwgMCk7XG4gICAgcmV0dXJuIGJ5dGVzUmVhZCA9PT0gMCA/IHVuZGVmaW5lZCA6IGJ5dGVbMF07XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgZmlsZS5jbG9zZSgpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVKU09OKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBBdG9taWNhbGx5IGNyZWF0ZSBhIGZpbGUgdXNpbmcgT19DUkVBVCB8IE9fRVhDTCBmbGFncy5cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgY3JlYXRlZCwgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gKiBUaGlzIGlzIGF0b21pYyBhdCB0aGUgT1MgbGV2ZWwsIHNhZmUgZm9yIGNvbmN1cnJlbnQgYWNjZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVFeGNsdXNpdmUoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGRhdGE6IHN0cmluZ1xuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGF3YWl0IGVuc3VyZURpcihwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoZmlsZVBhdGgsIGRhdGEsIHsgZmxhZzogJ3d4JyB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnRUVYSVNUJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdEpTT05GaWxlcyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHJldHVybiBsaXN0RmlsZXNCeUV4dGVuc2lvbihkaXJQYXRoLCAnLmpzb24nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RGaWxlc0J5RXh0ZW5zaW9uKFxuICBkaXJQYXRoOiBzdHJpbmcsXG4gIGV4dGVuc2lvbjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgIHJldHVybiBmaWxlc1xuICAgICAgLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aChleHRlbnNpb24pKVxuICAgICAgLm1hcCgoZikgPT4gZi5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIFtdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmludGVyZmFjZSBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD4ge1xuICBkaXJlY3Rvcnk6IHN0cmluZztcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD47XG4gIGZpbGVQcmVmaXg/OiBzdHJpbmc7XG4gIGZpbGVJZEZpbHRlcj86IChmaWxlSWQ6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgZmlsdGVyPzogKGl0ZW06IFQpID0+IGJvb2xlYW47XG4gIHNvcnRPcmRlcj86ICdhc2MnIHwgJ2Rlc2MnO1xuICBsaW1pdD86IG51bWJlcjtcbiAgY3Vyc29yPzogc3RyaW5nO1xuICBnZXRDcmVhdGVkQXQoZmlsZW5hbWU6IHN0cmluZyk6IERhdGUgfCBudWxsO1xuICBnZXRJZD8oaXRlbTogVCk6IHN0cmluZztcbn1cbi8vIEN1cnNvciBmb3JtYXQ6IFwidGltZXN0YW1wfGlkXCIgZm9yIHRpZS1icmVha2luZ1xuaW50ZXJmYWNlIFBhcnNlZEN1cnNvciB7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgaWQ6IHN0cmluZyB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ3Vyc29yKGN1cnNvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUGFyc2VkQ3Vyc29yIHwgbnVsbCB7XG4gIGlmICghY3Vyc29yKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCBwYXJ0cyA9IGN1cnNvci5zcGxpdCgnfCcpO1xuICByZXR1cm4ge1xuICAgIHRpbWVzdGFtcDogbmV3IERhdGUocGFydHNbMF0pLFxuICAgIGlkOiBwYXJ0c1sxXSB8fCBudWxsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDdXJzb3IodGltZXN0YW1wOiBEYXRlLCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlkID8gYCR7dGltZXN0YW1wLnRvSVNPU3RyaW5nKCl9fCR7aWR9YCA6IHRpbWVzdGFtcC50b0lTT1N0cmluZygpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGVkRmlsZVN5c3RlbVF1ZXJ5PFQgZXh0ZW5kcyB7IGNyZWF0ZWRBdDogRGF0ZSB9PihcbiAgY29uZmlnOiBQYWdpbmF0ZWRGaWxlU3lzdGVtUXVlcnlDb25maWc8VD5cbik6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8VD4+IHtcbiAgY29uc3Qge1xuICAgIGRpcmVjdG9yeSxcbiAgICBzY2hlbWEsXG4gICAgZmlsZVByZWZpeCxcbiAgICBmaWxlSWRGaWx0ZXIsXG4gICAgZmlsdGVyLFxuICAgIHNvcnRPcmRlciA9ICdkZXNjJyxcbiAgICBsaW1pdCA9IDIwLFxuICAgIGN1cnNvcixcbiAgICBnZXRDcmVhdGVkQXQsXG4gICAgZ2V0SWQsXG4gIH0gPSBjb25maWc7XG5cbiAgLy8gVmFsaWRhdGUgZmlsZVByZWZpeCAodHlwaWNhbGx5IGAke3J1bklkfS1gKSBzbyByZXF1ZXN0LWRlcml2ZWQgcHJlZml4ZXNcbiAgLy8gY29uc2lzdGVudGx5IHJlamVjdCB1bnNhZmUgY2hhcmFjdGVycy4gZmlsZVByZWZpeCBpcyBvbmx5IHVzZWQgYmVsb3cgdG9cbiAgLy8gZmlsdGVyIHJlYWRkaXIoKSByZXN1bHRzIGJ5IHByZWZpeCDigJQgaXQgZG9lc24ndCBwYXJ0aWNpcGF0ZSBpbiBwYXRoXG4gIC8vIGNvbnN0cnVjdGlvbiDigJQgYnV0IGtlZXBpbmcgdGhlIHZhbGlkYXRpb24gcnVsZSB1bmlmb3JtIGFjcm9zcyB0aGVcbiAgLy8gc3RvcmFnZSBsYXllciBhdm9pZHMgc3BlY2lhbCBjYXNlcyBhbmQgY2F0Y2hlcyBiYWQgdmFsdWVzIGVhcmxpZXIuXG4gIGlmIChmaWxlUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRTYWZlRW50aXR5SWQoJ2ZpbGVQcmVmaXgnLCBmaWxlUHJlZml4KTtcbiAgfVxuXG4gIC8vIDEuIEdldCBhbGwgSlNPTiBmaWxlcyBpbiBkaXJlY3RvcnlcbiAgY29uc3QgZmlsZUlkcyA9IGF3YWl0IGxpc3RKU09ORmlsZXMoZGlyZWN0b3J5KTtcblxuICAvLyAyLiBGaWx0ZXIgYnkgcHJlZml4IGlmIHByb3ZpZGVkXG4gIGNvbnN0IHJlbGV2YW50RmlsZUlkcyA9IGZpbGVQcmVmaXhcbiAgICA/IGZpbGVJZHMuZmlsdGVyKChmaWxlSWQpID0+IGZpbGVJZC5zdGFydHNXaXRoKGZpbGVQcmVmaXgpKVxuICAgIDogZmlsZUlkcztcbiAgY29uc3QgZmlsdGVyZWRGaWxlSWRzID0gZmlsZUlkRmlsdGVyXG4gICAgPyByZWxldmFudEZpbGVJZHMuZmlsdGVyKGZpbGVJZEZpbHRlcilcbiAgICA6IHJlbGV2YW50RmlsZUlkcztcblxuICAvLyAzLiBVTElEIE9wdGltaXphdGlvbjogRmlsdGVyIGJ5IGN1cnNvciB1c2luZyBmaWxlbmFtZSB0aW1lc3RhbXBzIGJlZm9yZSBsb2FkaW5nIEpTT05cbiAgY29uc3QgcGFyc2VkQ3Vyc29yID0gcGFyc2VDdXJzb3IoY3Vyc29yKTtcbiAgbGV0IGNhbmRpZGF0ZUZpbGVJZHMgPSBmaWx0ZXJlZEZpbGVJZHM7XG5cbiAgaWYgKHBhcnNlZEN1cnNvcikge1xuICAgIGNhbmRpZGF0ZUZpbGVJZHMgPSBmaWx0ZXJlZEZpbGVJZHMuZmlsdGVyKChmaWxlSWQpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVuYW1lRGF0ZSA9IGdldENyZWF0ZWRBdChgJHtmaWxlSWR9Lmpzb25gKTtcbiAgICAgIGlmIChmaWxlbmFtZURhdGUpIHtcbiAgICAgICAgLy8gVXNlIGZpbGVuYW1lIHRpbWVzdGFtcCBmb3IgY3Vyc29yIGZpbHRlcmluZ1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZTogaWYgcGFyc2VkQ3Vyc29yIGhhcyBhbiBJRCAoZm9yIHRpZS1icmVha2luZyksXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gaW5jbHVkZSBpdGVtcyB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgbGF0ZXIgSUQtYmFzZWQgZmlsdGVyaW5nLlxuICAgICAgICAvLyBJZiBubyBJRCwgd2UgY2FuIHVzZSBzdHJpY3QgaW5lcXVhbGl0eSBmb3Igb3B0aW1pemF0aW9uLlxuICAgICAgICBjb25zdCBjdXJzb3JUaW1lID0gcGFyc2VkQ3Vyc29yLnRpbWVzdGFtcC5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGZpbGVUaW1lID0gZmlsZW5hbWVEYXRlLmdldFRpbWUoKTtcblxuICAgICAgICBpZiAocGFyc2VkQ3Vyc29yLmlkKSB7XG4gICAgICAgICAgLy8gVGllLWJyZWFraW5nIG1vZGU6IGluY2x1ZGUgaXRlbXMgYXQgb3IgbmVhciBjdXJzb3IgdGltZXN0YW1wXG4gICAgICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICA/IGZpbGVUaW1lIDw9IGN1cnNvclRpbWVcbiAgICAgICAgICAgIDogZmlsZVRpbWUgPj0gY3Vyc29yVGltZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyB0aWUtYnJlYWtpbmc6IHN0cmljdCBpbmVxdWFsaXR5XG4gICAgICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnXG4gICAgICAgICAgICA/IGZpbGVUaW1lIDwgY3Vyc29yVGltZVxuICAgICAgICAgICAgOiBmaWxlVGltZSA+IGN1cnNvclRpbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENhbid0IGV4dHJhY3QgdGltZXN0YW1wIGZyb20gZmlsZW5hbWUgKGUuZy4sIHN0ZXBzIHVzZSBzZXF1ZW50aWFsIElEcykuXG4gICAgICAvLyBJbmNsdWRlIHRoZSBmaWxlIGFuZCBkZWZlciB0byBKU09OLWJhc2VkIGZpbHRlcmluZyBiZWxvdy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gNC4gTG9hZCBmaWxlcyBpbmRpdmlkdWFsbHkgYW5kIGNvbGxlY3QgdmFsaWQgaXRlbXNcbiAgY29uc3QgdmFsaWRJdGVtczogVFtdID0gW107XG5cbiAgZm9yIChjb25zdCBmaWxlSWQgb2YgY2FuZGlkYXRlRmlsZUlkcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgYCR7ZmlsZUlkfS5qc29uYCk7XG4gICAgbGV0IGl0ZW06IFQgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgaXRlbSA9IGF3YWl0IHJlYWRKU09OKGZpbGVQYXRoLCBzY2hlbWEpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBXZSBkb24ndCBleHBlY3Qgem9kIGVycm9ycyB0byBoYXBwZW4sIGJ1dCBpZiB0aGUgSlNPTiBkb2VzIGdldCBtYWxmb3JtZWQsXG4gICAgICAvLyB3ZSBza2lwIHRoZSBpdGVtLiBQcmVmZXJhYmx5LCB3ZSdkIGhhdmUgYSB3YXkgdG8gbWFyayBpdGVtcyBhcyBtYWxmb3JtZWQsXG4gICAgICAvLyBzbyB0aGF0IHRoZSBVSSBjYW4gZGlzcGxheSB0aGVtIGFzIHN1Y2gsIHdpdGggcmljaGVyIG1lc3NhZ2luZy4gSW4gdGhlIG1lYW50aW1lLFxuICAgICAgLy8gd2UganVzdCBsb2cgYSB3YXJuaW5nIGFuZCBza2lwIHRoZSBpdGVtLlxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygei5ab2RFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFNraXBwaW5nIGl0ZW0gJHtmaWxlSWR9IGR1ZSB0byBtYWxmb3JtZWQgSlNPTjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gQXBwbHkgY3VzdG9tIGZpbHRlciBlYXJseSBpZiBwcm92aWRlZFxuICAgICAgaWYgKGZpbHRlciAmJiAhZmlsdGVyKGl0ZW0pKSBjb250aW51ZTtcblxuICAgICAgLy8gRG91YmxlLWNoZWNrIGN1cnNvciBmaWx0ZXJpbmcgd2l0aCBhY3R1YWwgY3JlYXRlZEF0IGZyb20gSlNPTlxuICAgICAgLy8gKGluIGNhc2UgVUxJRCB0aW1lc3RhbXAgZGlmZmVycyBmcm9tIHN0b3JlZCBjcmVhdGVkQXQpXG4gICAgICBpZiAocGFyc2VkQ3Vyc29yKSB7XG4gICAgICAgIGNvbnN0IGl0ZW1UaW1lID0gaXRlbS5jcmVhdGVkQXQuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBjdXJzb3JUaW1lID0gcGFyc2VkQ3Vyc29yLnRpbWVzdGFtcC5nZXRUaW1lKCk7XG5cbiAgICAgICAgaWYgKHNvcnRPcmRlciA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgICAgLy8gRm9yIGRlc2NlbmRpbmcgb3JkZXIsIHNraXAgaXRlbXMgPj0gY3Vyc29yXG4gICAgICAgICAgaWYgKGl0ZW1UaW1lID4gY3Vyc29yVGltZSkgY29udGludWU7XG4gICAgICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXF1YWwsIHVzZSBJRCBmb3IgdGllLWJyZWFraW5nIChza2lwIGlmIElEID49IGN1cnNvcklkKVxuICAgICAgICAgIGlmIChpdGVtVGltZSA9PT0gY3Vyc29yVGltZSAmJiBwYXJzZWRDdXJzb3IuaWQgJiYgZ2V0SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldElkKGl0ZW0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1JZCA+PSBwYXJzZWRDdXJzb3IuaWQpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNjZW5kaW5nIG9yZGVyLCBza2lwIGl0ZW1zIDw9IGN1cnNvclxuICAgICAgICAgIGlmIChpdGVtVGltZSA8IGN1cnNvclRpbWUpIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGVxdWFsLCB1c2UgSUQgZm9yIHRpZS1icmVha2luZyAoc2tpcCBpZiBJRCA8PSBjdXJzb3JJZClcbiAgICAgICAgICBpZiAoaXRlbVRpbWUgPT09IGN1cnNvclRpbWUgJiYgcGFyc2VkQ3Vyc29yLmlkICYmIGdldElkKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBnZXRJZChpdGVtKTtcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPD0gcGFyc2VkQ3Vyc29yLmlkKSBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFsaWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIDUuIFNvcnQgYnkgY3JlYXRlZEF0IChhbmQgYnkgSUQgZm9yIHRpZS1icmVha2luZyBpZiBnZXRJZCBpcyBwcm92aWRlZClcbiAgdmFsaWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVRpbWUgPSBhLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgYlRpbWUgPSBiLmNyZWF0ZWRBdC5nZXRUaW1lKCk7XG4gICAgY29uc3QgdGltZUNvbXBhcmlzb24gPSBzb3J0T3JkZXIgPT09ICdhc2MnID8gYVRpbWUgLSBiVGltZSA6IGJUaW1lIC0gYVRpbWU7XG5cbiAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBlcXVhbCBhbmQgd2UgaGF2ZSBnZXRJZCwgdXNlIElEIGZvciBzdGFibGUgc29ydGluZ1xuICAgIGlmICh0aW1lQ29tcGFyaXNvbiA9PT0gMCAmJiBnZXRJZCkge1xuICAgICAgY29uc3QgYUlkID0gZ2V0SWQoYSk7XG4gICAgICBjb25zdCBiSWQgPSBnZXRJZChiKTtcbiAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdhc2MnXG4gICAgICAgID8gYUlkLmxvY2FsZUNvbXBhcmUoYklkKVxuICAgICAgICA6IGJJZC5sb2NhbGVDb21wYXJlKGFJZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVDb21wYXJpc29uO1xuICB9KTtcblxuICAvLyA2LiBBcHBseSBwYWdpbmF0aW9uXG4gIGNvbnN0IGhhc01vcmUgPSB2YWxpZEl0ZW1zLmxlbmd0aCA+IGxpbWl0O1xuICBjb25zdCBpdGVtcyA9IGhhc01vcmUgPyB2YWxpZEl0ZW1zLnNsaWNlKDAsIGxpbWl0KSA6IHZhbGlkSXRlbXM7XG4gIGNvbnN0IG5leHRDdXJzb3IgPVxuICAgIGl0ZW1zLmxlbmd0aCA+IDBcbiAgICAgID8gY3JlYXRlQ3Vyc29yKFxuICAgICAgICAgIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmNyZWF0ZWRBdCxcbiAgICAgICAgICBnZXRJZD8uKGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdKVxuICAgICAgICApXG4gICAgICA6IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBpdGVtcyxcbiAgICBjdXJzb3I6IG5leHRDdXJzb3IsXG4gICAgaGFzTW9yZSxcbiAgfTtcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export type LocalWorld = World & {
|
|
|
16
16
|
* @param args.dataDir - Directory for storing workflow data (default: `.workflow-data/`)
|
|
17
17
|
* @param args.port - Port override for queue transport (default: auto-detected)
|
|
18
18
|
* @param args.baseUrl - Full base URL override for queue transport (default: `http://localhost:{port}`)
|
|
19
|
+
* @param args.recoverActiveRuns - Whether `start()` should re-enqueue pending/running runs from storage (default: `true`)
|
|
19
20
|
* @param args.tag - Optional tag to scope files (e.g., `vitest-0`). When set, files are written
|
|
20
21
|
* as `{id}.{tag}.json` and `clear()` only deletes files matching this tag.
|
|
21
22
|
* @throws {DataDirAccessError} If the data directory cannot be created or accessed
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAY1C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAM7D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,KAAK,aAAa,EAClB,YAAY,GACb,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,+EAA+E;IAC/E,eAAe,CACb,MAAM,EAAE,aAAa,GAAG,iBAAiB,EACzC,OAAO,EAAE,aAAa,GACrB,IAAI,CAAC;IACR,qEAAqE;IACrE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CA6GnE"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ import { rm } from 'node:fs/promises';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { reenqueueActiveRuns, SPEC_VERSION_CURRENT } from '@workflow/world';
|
|
5
5
|
import { config } from './config.js';
|
|
6
|
-
import { clearCreatedFilesCache, deleteJSON, listTaggedFiles, listTaggedFilesByExtension, readJSON, } from './fs.js';
|
|
6
|
+
import { clearCreatedFilesCache, deleteJSON, hasTag, listTaggedFiles, listTaggedFilesByExtension, readJSON, } from './fs.js';
|
|
7
7
|
import { initDataDir } from './init.js';
|
|
8
8
|
import { instrumentObject } from './instrumentObject.js';
|
|
9
9
|
import { createQueue } from './queue.js';
|
|
@@ -19,6 +19,7 @@ export { DataDirAccessError, DataDirVersionError, ensureDataDir, initDataDir, pa
|
|
|
19
19
|
* @param args.dataDir - Directory for storing workflow data (default: `.workflow-data/`)
|
|
20
20
|
* @param args.port - Port override for queue transport (default: auto-detected)
|
|
21
21
|
* @param args.baseUrl - Full base URL override for queue transport (default: `http://localhost:{port}`)
|
|
22
|
+
* @param args.recoverActiveRuns - Whether `start()` should re-enqueue pending/running runs from storage (default: `true`)
|
|
22
23
|
* @param args.tag - Optional tag to scope files (e.g., `vitest-0`). When set, files are written
|
|
23
24
|
* as `{id}.{tag}.json` and `clear()` only deletes files matching this tag.
|
|
24
25
|
* @throws {DataDirAccessError} If the data directory cannot be created or accessed
|
|
@@ -32,10 +33,11 @@ export function createLocalWorld(args) {
|
|
|
32
33
|
const tag = mergedConfig.tag;
|
|
33
34
|
const queue = createQueue(mergedConfig);
|
|
34
35
|
const storage = createStorage(mergedConfig.dataDir, tag);
|
|
36
|
+
const recoverActiveRuns = mergedConfig.recoverActiveRuns ?? true;
|
|
35
37
|
return {
|
|
36
38
|
specVersion: SPEC_VERSION_CURRENT,
|
|
37
39
|
...queue,
|
|
38
|
-
...
|
|
40
|
+
...storage,
|
|
39
41
|
...instrumentObject('world.streams', {
|
|
40
42
|
...createStreamer(mergedConfig.dataDir, tag),
|
|
41
43
|
...(mergedConfig.streamFlushIntervalMs !== undefined && {
|
|
@@ -44,7 +46,19 @@ export function createLocalWorld(args) {
|
|
|
44
46
|
}),
|
|
45
47
|
async start() {
|
|
46
48
|
await initDataDir(mergedConfig.dataDir);
|
|
47
|
-
|
|
49
|
+
if (!recoverActiveRuns) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const recoveryRuns = tag
|
|
53
|
+
? {
|
|
54
|
+
...storage.runs,
|
|
55
|
+
list: ((params) => storage.runs.list({
|
|
56
|
+
...params,
|
|
57
|
+
fileIdFilter: (fileId) => hasTag(fileId, tag),
|
|
58
|
+
})),
|
|
59
|
+
}
|
|
60
|
+
: storage.runs;
|
|
61
|
+
await reenqueueActiveRuns(recoveryRuns, queue.queue, 'world-local');
|
|
48
62
|
},
|
|
49
63
|
async close() {
|
|
50
64
|
await queue.close();
|
|
@@ -98,4 +112,4 @@ export function createLocalWorld(args) {
|
|
|
98
112
|
},
|
|
99
113
|
};
|
|
100
114
|
}
|
|
101
|
-
//# sourceMappingURL=index.js.map
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUU3QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLFFBQVEsR0FDVCxNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0sWUFBWSxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0MsbURBQW1EO0FBQ25ELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixXQUFXLEVBRVgsWUFBWSxHQUNiLE1BQU0sV0FBVyxDQUFDO0FBY25COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFzQjtJQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJO1FBQ3RCLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUNoQixNQUFNLENBQUMs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QztnQkFDMUQsTUFBTSxjQUFjLEdBQUcsTUFBTSwwQkFBMEIsQ0FDckQsU0FBUyxFQUNULEdBQUcsRUFDSCxNQUFNLENBQ1AsQ0FBQztnQkFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3ZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQ25ELENBQ0YsQ0FBQztnQkFDRixpRUFBaUU7Z0JBQ2pFLHNCQUFzQixFQUFFLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBybSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcmVlbnF1ZXVlQWN0aXZlUnVucywgU1BFQ19WRVJTSU9OX0NVUlJFTlQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBjbGVhckNyZWF0ZWRGaWxlc0NhY2hlLFxuICBkZWxldGVKU09OLFxuICBoYXNUYWcsXG4gIGxpc3RUYWdnZWRGaWxlcyxcbiAgbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24sXG4gIHJlYWRKU09OLFxufSBmcm9tICcuL2ZzLmpzJztcbmltcG9ydCB7IGluaXREYXRhRGlyIH0gZnJvbSAnLi9pbml0LmpzJztcbmltcG9ydCB7IGluc3RydW1lbnRPYmplY3QgfSBmcm9tICcuL2luc3RydW1lbnRPYmplY3QuanMnO1xuaW1wb3J0IHsgY3JlYXRlUXVldWUsIHR5cGUgRGlyZWN0SGFuZGxlciB9IGZyb20gJy4vcXVldWUuanMnO1xuaW1wb3J0IHsgaGFzaFRva2VuIH0gZnJvbSAnLi9zdG9yYWdlL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTdHJlYW1lciB9IGZyb20gJy4vc3RyZWFtZXIuanMnO1xuXG4vLyBSZS1leHBvcnQgaW5pdCB0eXBlcyBhbmQgdXRpbGl0aWVzIGZvciBjb25zdW1lcnNcbmV4cG9ydCB7XG4gIERhdGFEaXJBY2Nlc3NFcnJvcixcbiAgRGF0YURpclZlcnNpb25FcnJvcixcbiAgZW5zdXJlRGF0YURpcixcbiAgaW5pdERhdGFEaXIsXG4gIHR5cGUgUGFyc2VkVmVyc2lvbixcbiAgcGFyc2VWZXJzaW9uLFxufSBmcm9tICcuL2luaXQuanMnO1xuXG5leHBvcnQgdHlwZSB7IERpcmVjdEhhbmRsZXIgfSBmcm9tICcuL3F1ZXVlLmpzJztcblxuZXhwb3J0IHR5cGUgTG9jYWxXb3JsZCA9IFdvcmxkICYge1xuICAvKiogUmVnaXN0ZXIgYSBkaXJlY3QgaW4tcHJvY2VzcyBoYW5kbGVyIGZvciBhIHF1ZXVlIHByZWZpeCwgYnlwYXNzaW5nIEhUVFAuICovXG4gIHJlZ2lzdGVySGFuZGxlcihcbiAgICBwcmVmaXg6ICdfX3drZl9zdGVwXycgfCAnX193a2Zfd29ya2Zsb3dfJyxcbiAgICBoYW5kbGVyOiBEaXJlY3RIYW5kbGVyXG4gICk6IHZvaWQ7XG4gIC8qKiBDbGVhciBhbGwgd29ya2Zsb3cgZGF0YSAocnVucywgc3RlcHMsIGV2ZW50cywgaG9va3MsIHN0cmVhbXMpLiAqL1xuICBjbGVhcigpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbG9jYWwgd29ybGQgaW5zdGFuY2UgdGhhdCBjb21iaW5lcyBxdWV1ZSwgc3RvcmFnZSwgYW5kIHN0cmVhbWVyIGZ1bmN0aW9uYWxpdGllcy5cbiAqXG4gKiBAcGFyYW0gYXJncyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0gYXJncy5kYXRhRGlyIC0gRGlyZWN0b3J5IGZvciBzdG9yaW5nIHdvcmtmbG93IGRhdGEgKGRlZmF1bHQ6IGAud29ya2Zsb3ctZGF0YS9gKVxuICogQHBhcmFtIGFyZ3MucG9ydCAtIFBvcnQgb3ZlcnJpZGUgZm9yIHF1ZXVlIHRyYW5zcG9ydCAoZGVmYXVsdDogYXV0by1kZXRlY3RlZClcbiAqIEBwYXJhbSBhcmdzLmJhc2VVcmwgLSBGdWxsIGJhc2UgVVJMIG92ZXJyaWRlIGZvciBxdWV1ZSB0cmFuc3BvcnQgKGRlZmF1bHQ6IGBodHRwOi8vbG9jYWxob3N0Ontwb3J0fWApXG4gKiBAcGFyYW0gYXJncy5yZWNvdmVyQWN0aXZlUnVucyAtIFdoZXRoZXIgYHN0YXJ0KClgIHNob3VsZCByZS1lbnF1ZXVlIHBlbmRpbmcvcnVubmluZyBydW5zIGZyb20gc3RvcmFnZSAoZGVmYXVsdDogYHRydWVgKVxuICogQHBhcmFtIGFyZ3MudGFnIC0gT3B0aW9uYWwgdGFnIHRvIHNjb3BlIGZpbGVzIChlLmcuLCBgdml0ZXN0LTBgKS4gV2hlbiBzZXQsIGZpbGVzIGFyZSB3cml0dGVuXG4gKiAgIGFzIGB7aWR9Lnt0YWd9Lmpzb25gIGFuZCBgY2xlYXIoKWAgb25seSBkZWxldGVzIGZpbGVzIG1hdGNoaW5nIHRoaXMgdGFnLlxuICogQHRocm93cyB7RGF0YURpckFjY2Vzc0Vycm9yfSBJZiB0aGUgZGF0YSBkaXJlY3RvcnkgY2Fubm90IGJlIGNyZWF0ZWQgb3IgYWNjZXNzZWRcbiAqIEB0aHJvd3Mge0RhdGFEaXJWZXJzaW9uRXJyb3J9IElmIHRoZSBkYXRhIGRpcmVjdG9yeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9jYWxXb3JsZChhcmdzPzogUGFydGlhbDxDb25maWc+KTogTG9jYWxXb3JsZCB7XG4gIGNvbnN0IGRlZmluZWRBcmdzID0gYXJnc1xuICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhhcmdzKS5maWx0ZXIoKFssIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIClcbiAgICA6IHt9O1xuICBjb25zdCBtZXJnZWRDb25maWcgPSB7IC4uLmNvbmZpZy52YWx1ZSwgLi4uZGVmaW5lZEFyZ3MgfTtcbiAgY29uc3QgdGFnID0gbWVyZ2VkQ29uZmlnLnRhZztcbiAgY29uc3QgcXVldWUgPSBjcmVhdGVRdWV1ZShtZXJnZWRDb25maWcpO1xuICBjb25zdCBzdG9yYWdlID0gY3JlYXRlU3RvcmFnZShtZXJnZWRDb25maWcuZGF0YURpciwgdGFnKTtcbiAgY29uc3QgcmVjb3ZlckFjdGl2ZVJ1bnMgPSBtZXJnZWRDb25maWcucmVjb3ZlckFjdGl2ZVJ1bnMgPz8gdHJ1ZTtcbiAgcmV0dXJuIHtcbiAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgLi4ucXVldWUsXG4gICAgLi4uc3RvcmFnZSxcbiAgICAuLi5pbnN0cnVtZW50T2JqZWN0KCd3b3JsZC5zdHJlYW1zJywge1xuICAgICAgLi4uY3JlYXRlU3RyZWFtZXIobWVyZ2VkQ29uZmlnLmRhdGFEaXIsIHRhZyksXG4gICAgICAuLi4obWVyZ2VkQ29uZmlnLnN0cmVhbUZsdXNoSW50ZXJ2YWxNcyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc3RyZWFtRmx1c2hJbnRlcnZhbE1zOiBtZXJnZWRDb25maWcuc3RyZWFtRmx1c2hJbnRlcnZhbE1zLFxuICAgICAgfSksXG4gICAgfSksXG4gICAgYXN5bmMgc3RhcnQoKSB7XG4gICAgICBhd2FpdCBpbml0RGF0YURpcihtZXJnZWRDb25maWcuZGF0YURpcik7XG4gICAgICBpZiAoIXJlY292ZXJBY3RpdmVSdW5zKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY292ZXJ5UnVucyA9IHRhZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnN0b3JhZ2UucnVucyxcbiAgICAgICAgICAgIGxpc3Q6ICgocGFyYW1zKSA9PlxuICAgICAgICAgICAgICBzdG9yYWdlLnJ1bnMubGlzdCh7XG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgICAgIGZpbGVJZEZpbHRlcjogKGZpbGVJZCkgPT4gaGFzVGFnKGZpbGVJZCwgdGFnKSxcbiAgICAgICAgICAgICAgfSkpIGFzIHR5cGVvZiBzdG9yYWdlLnJ1bnMubGlzdCxcbiAgICAgICAgICB9XG4gICAgICAgIDogc3RvcmFnZS5ydW5zO1xuICAgICAgYXdhaXQgcmVlbnF1ZXVlQWN0aXZlUnVucyhyZWNvdmVyeVJ1bnMsIHF1ZXVlLnF1ZXVlLCAnd29ybGQtbG9jYWwnKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgcXVldWUuY2xvc2UoKTtcbiAgICB9LFxuICAgIGFzeW5jIGNsZWFyKCkge1xuICAgICAgaWYgKHRhZykge1xuICAgICAgICAvLyBTZWxlY3RpdmVseSBkZWxldGUgb25seSBmaWxlcyBtYXRjaGluZyB0aGlzIHRhZ1xuICAgICAgICBjb25zdCBiYXNlZGlyID0gbWVyZ2VkQ29uZmlnLmRhdGFEaXI7XG5cbiAgICAgICAgLy8gRGVsZXRlIGhvb2sgdG9rZW4gY29uc3RyYWludCBmaWxlcyBCRUZPUkUgZGVsZXRpbmcgdGhlIGhvb2tzLFxuICAgICAgICAvLyBzaW5jZSB3ZSBuZWVkIHRvIHJlYWQgZWFjaCBob29rIHRvIGV4dHJhY3QgaXRzIHRva2VuIGhhc2guXG4gICAgICAgIC8vIENvbnN0cmFpbnQgZmlsZXMgYXJlIHVudGFnZ2VkICh7c2hhMjU2fS5qc29uKSBzbyBsaXN0VGFnZ2VkRmlsZXNcbiAgICAgICAgLy8gd29uJ3QgZmluZCB0aGVtIOKAlCB3ZSBtdXN0IHJlc29sdmUgdGhlbSB2aWEgdGhlIGhvb2sgZGF0YS5cbiAgICAgICAgY29uc3QgaG9va3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ2hvb2tzJyk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEhvb2tGaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhob29rc0RpciwgdGFnKTtcbiAgICAgICAgY29uc3QgeyBIb29rU2NoZW1hIH0gPSBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy93b3JsZCcpO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0YWdnZWRIb29rRmlsZXMubWFwKGFzeW5jIChob29rRmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaG9vayA9IGF3YWl0IHJlYWRKU09OKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oaG9va3NEaXIsIGhvb2tGaWxlKSxcbiAgICAgICAgICAgICAgSG9va1NjaGVtYVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChob29rPy50b2tlbikge1xuICAgICAgICAgICAgICBhd2FpdCBkZWxldGVKU09OKFxuICAgICAgICAgICAgICAgIHBhdGguam9pbihob29rc0RpciwgJ3Rva2VucycsIGAke2hhc2hUb2tlbihob29rLnRva2VuKX0uanNvbmApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBEZWxldGUgdGFnZ2VkIGVudGl0eSBmaWxlcyBhY3Jvc3MgYWxsIGRpcmVjdG9yaWVzXG4gICAgICAgIGNvbnN0IGVudGl0eURpcnMgPSBbXG4gICAgICAgICAgJ3J1bnMnLFxuICAgICAgICAgICdzdGVwcycsXG4gICAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICAgJ2hvb2tzJyxcbiAgICAgICAgICAnd2FpdHMnLFxuICAgICAgICAgICdzdHJlYW1zL3J1bnMnLFxuICAgICAgICBdO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBlbnRpdHlEaXJzLm1hcChhc3luYyAoZGlyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmdWxsRGlyID0gcGF0aC5qb2luKGJhc2VkaXIsIGRpcik7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RUYWdnZWRGaWxlcyhmdWxsRGlyLCB0YWcpO1xuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGZpbGVzLm1hcCgoZikgPT4gZGVsZXRlSlNPTihwYXRoLmpvaW4oZnVsbERpciwgZikpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICAvLyBDbGVhbiB1cCBsb2NrIGZpbGVzIHVzZWQgZm9yIGF0b21pYyB0ZXJtaW5hbC1zdGF0ZSBndWFyZHNcbiAgICAgICAgYXdhaXQgZnNcbiAgICAgICAgICAucm0ocGF0aC5qb2luKGJhc2VkaXIsICcubG9ja3MnKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gICAgICAgICAgLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgLy8gRGVsZXRlIHRhZ2dlZCBzdHJlYW0gY2h1bmtzICgue3RhZ30uYmluIGZpbGVzKVxuICAgICAgICBjb25zdCBjaHVua3NEaXIgPSBwYXRoLmpvaW4oYmFzZWRpciwgJ3N0cmVhbXMnLCAnY2h1bmtzJyk7XG4gICAgICAgIGNvbnN0IHRhZ2dlZEJpbkZpbGVzID0gYXdhaXQgbGlzdFRhZ2dlZEZpbGVzQnlFeHRlbnNpb24oXG4gICAgICAgICAgY2h1bmtzRGlyLFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgICAnLmJpbidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFnZ2VkQmluRmlsZXMubWFwKChmKSA9PlxuICAgICAgICAgICAgZnMudW5saW5rKHBhdGguam9pbihjaHVua3NEaXIsIGYpKS5jYXRjaCgoKSA9PiB7fSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBpbi1tZW1vcnkgd3JpdGUgY2FjaGUgc28gZGVsZXRlZCBwYXRocyBhcmUgZm9yZ290dGVuXG4gICAgICAgIGNsZWFyQ3JlYXRlZEZpbGVzQ2FjaGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHJtKG1lcmdlZENvbmZpZy5kYXRhRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IGluaXREYXRhRGlyKG1lcmdlZENvbmZpZy5kYXRhRGlyKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIl19
|
package/dist/init.js
CHANGED
|
@@ -265,4 +265,4 @@ export async function initDataDir(dataDir) {
|
|
|
265
265
|
throw error;
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
|
-
//# sourceMappingURL=init.js.map
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLHVEQUF1RDtBQUN2RCxNQUFNLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztBQU83QyxJQUFJLGlCQUFpQixHQUF1QixJQUFJLENBQUM7QUFFakQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZO0lBQ25CLHFFQUFxRTtJQUNyRSxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYztJQUNsQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDdEIsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxFQUFFLENBQUM7SUFDakMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxFQUN2QyxPQUFPLENBQ1IsQ0FBQztZQUNGLGlCQUFpQixHQUFHLElBQUks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Q0FDakIsQ0FBQztRQUVGLE9BQU8sQ0FBQyxLQUFLLENBQ1gsK0RBQStELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFDL0gsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUMvQyxDQUFDO1FBQ0YsT0FBTyxDQUFDLEtBQUssQ0FDWCxpRUFBaUU7WUFDL0QsdUJBQXVCLFdBQVcsQ0FBQyxJQUFJLElBQUksZUFBZSxFQUFFLENBQy9ELENBQUM7UUFFRixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBjb25zdGFudHMsXG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGUsXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHBhdGggZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5cbi8qKiBQYWNrYWdlIG5hbWUgLSBoYXJkY29kZWQgc2luY2UgaXQgZG9lc24ndCBjaGFuZ2UgKi9cbmNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAd29ya2Zsb3cvd29ybGQtbG9jYWwnO1xuXG5pbnRlcmZhY2UgUGFja2FnZUluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxubGV0IGNhY2hlZFBhY2thZ2VJbmZvOiBQYWNrYWdlSW5mbyB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIEdldCB0aGUgZGlyZWN0b3J5IHBhdGggZm9yIHRoaXMgbW9kdWxlLlxuICogV29ya3MgaW4gRVNNIGFuZCBmYWxscyBiYWNrIHRvIGEgY29uc3RhbnQgaW4gQ0pTIGNvbnRleHRzICh3aGljaCBzaG91bGRuJ3QgaGFwcGVuKVxuICovXG5mdW5jdGlvbiBnZXRNb2R1bGVEaXIoKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIEluIGJ1bmRsZWQgQ0pTIGNvbnRleHRzLCBpbXBvcnQubWV0YS51cmwgbWF5IGJlIHVuZGVmaW5lZCBvciBlbXB0eVxuICBpZiAodHlwZW9mIGltcG9ydC5tZXRhLnVybCA9PT0gJ3N0cmluZycgJiYgaW1wb3J0Lm1ldGEudXJsKSB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBhY2thZ2UgbmFtZSBhbmQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIFRoZSByZXN1bHQgaXMgY2FjaGVkIGFmdGVyIHRoZSBmaXJzdCByZWFkLlxuICpcbiAqIEluIGJ1bmRsZWQgY29udGV4dHMgd2hlcmUgcGFja2FnZS5qc29uIGNhbm5vdCBiZSByZWFkLFxuICogcmV0dXJucyAnYnVuZGxlZCcgYXMgdGhlIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWNrYWdlSW5mbygpOiBQcm9taXNlPFBhY2thZ2VJbmZvPiB7XG4gIGlmIChjYWNoZWRQYWNrYWdlSW5mbykge1xuICAgIHJldHVybiBjYWNoZWRQYWNrYWdlSW5mbztcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZURpciA9IGdldE1vZHVsZURpcigpO1xuICBpZiAobW9kdWxlRGlyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShcbiAgICAgICAgcGF0aC5qb2luKG1vZHVsZURpciwgJy4uL3BhY2thZ2UuanNvbicpLFxuICAgICAgICAndXRmLTgnXG4gICAgICApO1xuICAgICAgY2FjaGVkUGFja2FnZUluZm8gPSBKU09OLnBhcnNlKGNvbnRlbnQpIGFzIFBhY2thZ2VJbmZvO1xuICAgICAgcmV0dXJuIGNhY2hlZFBhY2thZ2VJbmZvO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvIGJ1bmRsZWQgZmFsbGJhY2tcbiAgICB9XG4gIH1cblxuICAvLyBCdW5kbGVkIGNvbnRleHQgLSBwYWNrYWdlLmpzb24gbm90IGFjY2Vzc2libGVcbiAgY2FjaGVkUGFja2FnZUluZm8gPSB7XG4gICAgbmFtZTogUEFDS0FHRV9OQU1FLFxuICAgIHZlcnNpb246ICdidW5kbGVkJyxcbiAgfTtcbiAgcmV0dXJuIGNhY2hlZFBhY2thZ2VJbmZvO1xufVxuXG4vKiogRmlsZW5hbWUgZm9yIHN0b3JpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiB0aGUgZGF0YSBkaXJlY3RvcnkgKi9cbmNvbnN0IFZFUlNJT05fRklMRU5BTUUgPSAndmVyc2lvbi50eHQnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBwYXJzZWQgc2VtYW50aWMgdmVyc2lvbiB3aXRoIG9wdGlvbmFsIHByZXJlbGVhc2UgdGFnLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFZlcnNpb24ge1xuICBtYWpvcjogbnVtYmVyO1xuICBtaW5vcjogbnVtYmVyO1xuICBwYXRjaDogbnVtYmVyO1xuICBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICByYXc6IHN0cmluZztcbn1cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gd2hlbiB0aGUgZGF0YSBkaXJlY3RvcnkgY2Fubm90IGJlIGFjY2Vzc2VkIG9yIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhRGlyQWNjZXNzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IGRhdGFEaXI6IHN0cmluZztcbiAgcmVhZG9ubHkgY29kZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGFEaXI6IHN0cmluZywgY29kZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdEYXRhRGlyQWNjZXNzRXJyb3InO1xuICAgIHRoaXMuZGF0YURpciA9IGRhdGFEaXI7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGRhdGEgZGlyZWN0b3J5IHZlcnNpb24gaXMgaW5jb21wYXRpYmxlLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YURpclZlcnNpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgb2xkVmVyc2lvbjogUGFyc2VkVmVyc2lvbjtcbiAgcmVhZG9ubHkgbmV3VmVyc2lvbjogUGFyc2VkVmVyc2lvbjtcbiAgcmVhZG9ubHkgc3VnZ2VzdGVkVmVyc2lvbj86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb2xkVmVyc2lvbjogUGFyc2VkVmVyc2lvbixcbiAgICBuZXdWZXJzaW9uOiBQYXJzZWRWZXJzaW9uLFxuICAgIHN1Z2dlc3RlZFZlcnNpb24/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0RhdGFEaXJWZXJzaW9uRXJyb3InO1xuICAgIHRoaXMub2xkVmVyc2lvbiA9IG9sZFZlcnNpb247XG4gICAgdGhpcy5uZXdWZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICB0aGlzLnN1Z2dlc3RlZFZlcnNpb24gPSBzdWdnZXN0ZWRWZXJzaW9uO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIGEgdmVyc2lvbiBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblN0cmluZyAtIFZlcnNpb24gc3RyaW5nIGxpa2UgXCI0LjAuMVwiIG9yIFwiNC4wLjEtYmV0YS4yMFwiXG4gKiBAcmV0dXJucyBQYXJzZWQgdmVyc2lvbiBvYmplY3Qgd2l0aCBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgb3B0aW9uYWwgcHJlcmVsZWFzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWZXJzaW9uKHZlcnNpb25TdHJpbmc6IHN0cmluZyk6IFBhcnNlZFZlcnNpb24ge1xuICAvLyBNYXRjaDogbWFqb3IubWlub3IucGF0Y2ggd2l0aCBvcHRpb25hbCBwcmVyZWxlYXNlXG4gIGNvbnN0IG1hdGNoID0gdmVyc2lvblN0cmluZy5tYXRjaCgvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSg/Oi0oLispKT8kLyk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2ZXJzaW9uIHN0cmluZzogXCIke3ZlcnNpb25TdHJpbmd9XCJgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFqb3I6IHBhcnNlSW50KG1hdGNoWzFdLCAxMCksXG4gICAgbWlub3I6IHBhcnNlSW50KG1hdGNoWzJdLCAxMCksXG4gICAgcGF0Y2g6IHBhcnNlSW50KG1hdGNoWzNdLCAxMCksXG4gICAgcHJlcmVsZWFzZTogbWF0Y2hbNF0sXG4gICAgcmF3OiB2ZXJzaW9uU3RyaW5nLFxuICB9O1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBwYXJzZWQgdmVyc2lvbiBiYWNrIHRvIGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VmVyc2lvbih2ZXJzaW9uOiBQYXJzZWRWZXJzaW9uKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke3ZlcnNpb24ubWFqb3J9LiR7dmVyc2lvbi5taW5vcn0uJHt2ZXJzaW9uLnBhdGNofWA7XG4gIHJldHVybiB2ZXJzaW9uLnByZXJlbGVhc2UgPyBgJHtiYXNlfS0ke3ZlcnNpb24ucHJlcmVsZWFzZX1gIDogYmFzZTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIHZlcnNpb24gZmlsZSBjb250ZW50IHRvIGV4dHJhY3QgcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IC0gQ29udGVudCBsaWtlIFwiQHdvcmtmbG93L3dvcmxkLWxvY2FsQDQuMC4xLWJldGEuMjBcIlxuICogQHJldHVybnMgT2JqZWN0IHdpdGggcGFja2FnZU5hbWUgYW5kIHZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkZpbGUoY29udGVudDogc3RyaW5nKToge1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICB2ZXJzaW9uOiBQYXJzZWRWZXJzaW9uO1xufSB7XG4gIGNvbnN0IHRyaW1tZWQgPSBjb250ZW50LnRyaW0oKTtcbiAgY29uc3QgbGFzdEF0SW5kZXggPSB0cmltbWVkLmxhc3RJbmRleE9mKCdAJyk7XG5cbiAgaWYgKGxhc3RBdEluZGV4IDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmVyc2lvbiBmaWxlIGNvbnRlbnQ6IFwiJHtjb250ZW50fVwiYCk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlTmFtZSA9IHRyaW1tZWQuc3Vic3RyaW5nKDAsIGxhc3RBdEluZGV4KTtcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHRyaW1tZWQuc3Vic3RyaW5nKGxhc3RBdEluZGV4ICsgMSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZSxcbiAgICB2ZXJzaW9uOiBwYXJzZVZlcnNpb24odmVyc2lvblN0cmluZyksXG4gIH07XG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgdmVyc2lvbiBmaWxlIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJzaW9uRmlsZShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgdmVyc2lvbjogUGFyc2VkVmVyc2lvblxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3BhY2thZ2VOYW1lfUAke2Zvcm1hdFZlcnNpb24odmVyc2lvbil9YDtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHZlcnNpb24gdXBncmFkZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyB2ZXJzaW9ucy5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRhdGEgZGlyZWN0b3J5IHdhcyBjcmVhdGVkIHdpdGggYSBkaWZmZXJlbnQgdmVyc2lvbi5cbiAqXG4gKiBAcGFyYW0gb2xkVmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHRoYXQgY3JlYXRlZCB0aGUgZGF0YSBkaXJlY3RvcnlcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAdGhyb3dzIHtEYXRhRGlyVmVyc2lvbkVycm9yfSBJZiB0aGUgdmVyc2lvbnMgYXJlIGluY29tcGF0aWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBncmFkZVZlcnNpb24oXG4gIG9sZFZlcnNpb246IFBhcnNlZFZlcnNpb24sXG4gIG5ld1ZlcnNpb246IFBhcnNlZFZlcnNpb25cbik6IHZvaWQge1xuICBjb25zb2xlLmxvZyhcbiAgICBgW3dvcmxkLWxvY2FsXSBVcGdyYWRpbmcgZnJvbSB2ZXJzaW9uICR7Zm9ybWF0VmVyc2lvbihvbGRWZXJzaW9uKX0gdG8gJHtmb3JtYXRWZXJzaW9uKG5ld1ZlcnNpb24pfWBcbiAgKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBkYXRhIGRpcmVjdG9yeSBleGlzdHMgYW5kIGlzIHdyaXRhYmxlLlxuICogQ3JlYXRlcyB0aGUgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gKlxuICogQHBhcmFtIGRhdGFEaXIgLSBUaGUgcGF0aCB0byB0aGUgZGF0YSBkaXJlY3RvcnlcbiAqIEB0aHJvd3Mge0RhdGFEaXJBY2Nlc3NFcnJvcn0gSWYgdGhlIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZCBvciBhY2Nlc3NlZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGF0YURpcihkYXRhRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5yZXNvbHZlKGRhdGFEaXIpO1xuXG4gIC8vIFRyeSB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gIHRyeSB7XG4gICAgYXdhaXQgbWtkaXIoYWJzb2x1dGVQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBub2RlRXJyb3IgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgLy8gRUVYSVNUIGlzIGZpbmUgLSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHNcbiAgICBpZiAobm9kZUVycm9yLmNvZGUgIT09ICdFRVhJU1QnKSB7XG4gICAgICB0aHJvdyBuZXcgRGF0YURpckFjY2Vzc0Vycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBkYXRhIGRpcmVjdG9yeSBcIiR7YWJzb2x1dGVQYXRofVwiOiAke25vZGVFcnJvci5tZXNzYWdlfWAsXG4gICAgICAgIGFic29sdXRlUGF0aCxcbiAgICAgICAgbm9kZUVycm9yLmNvZGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVmVyaWZ5IHRoZSBkaXJlY3RvcnkgaXMgYWNjZXNzaWJsZSAocmVhZGFibGUpXG4gIHRyeSB7XG4gICAgYXdhaXQgYWNjZXNzKGFic29sdXRlUGF0aCwgY29uc3RhbnRzLlJfT0spO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG5vZGVFcnJvciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICB0aHJvdyBuZXcgRGF0YURpckFjY2Vzc0Vycm9yKFxuICAgICAgYERhdGEgZGlyZWN0b3J5IFwiJHthYnNvbHV0ZVBhdGh9XCIgaXMgbm90IHJlYWRhYmxlOiAke25vZGVFcnJvci5tZXNzYWdlfWAsXG4gICAgICBhYnNvbHV0ZVBhdGgsXG4gICAgICBub2RlRXJyb3IuY29kZVxuICAgICk7XG4gIH1cblxuICAvLyBWZXJpZnkgdGhlIGRpcmVjdG9yeSBpcyB3cml0YWJsZSBieSBhdHRlbXB0aW5nIHRvIHdyaXRlIGEgdGVtcCBmaWxlXG4gIGNvbnN0IHRlc3RGaWxlID0gcGF0aC5qb2luKFxuICAgIGFic29sdXRlUGF0aCxcbiAgICBgLndvcmtmbG93LXdyaXRlLXRlc3QtJHtEYXRlLm5vdygpfWBcbiAgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVzdEZpbGUsICcnKTtcbiAgICAvLyBDbGVhbiB1cCB0ZXN0IGZpbGUg4oCUIEVOT0VOVCBkdXJpbmcgY2xlYW51cCBpcyBoYXJtbGVzcyAobWF5IHJhY2VcbiAgICAvLyB3aXRoIGFub3RoZXIgcHJvY2VzcyBwZXJmb3JtaW5nIHRoZSBzYW1lIGNoZWNrIGNvbmN1cnJlbnRseSlcbiAgICBhd2FpdCB1bmxpbmsodGVzdEZpbGUpLmNhdGNoKChlOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlLmNvZGUgIT09ICdFTk9FTlQnKSB0aHJvdyBlO1xuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGNvbnN0IG5vZGVFcnJvciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICB0aHJvdyBuZXcgRGF0YURpckFjY2Vzc0Vycm9yKFxuICAgICAgYERhdGEgZGlyZWN0b3J5IFwiJHthYnNvbHV0ZVBhdGh9XCIgaXMgbm90IHdyaXRhYmxlOiAke25vZGVFcnJvci5tZXNzYWdlfWAsXG4gICAgICBhYnNvbHV0ZVBhdGgsXG4gICAgICBub2RlRXJyb3IuY29kZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmVyc2lvbiBmcm9tIHRoZSBkYXRhIGRpcmVjdG9yeSdzIHZlcnNpb24gZmlsZS5cbiAqXG4gKiBAcGFyYW0gZGF0YURpciAtIFBhdGggdG8gdGhlIGRhdGEgZGlyZWN0b3J5XG4gKiBAcmV0dXJucyBUaGUgcGFyc2VkIHZlcnNpb24gaW5mbywgb3IgbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRWZXJzaW9uRmlsZShkYXRhRGlyOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogUGFyc2VkVmVyc2lvbjtcbn0gfCBudWxsPiB7XG4gIGNvbnN0IHZlcnNpb25GaWxlUGF0aCA9IHBhdGguam9pbihwYXRoLnJlc29sdmUoZGF0YURpciksIFZFUlNJT05fRklMRU5BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHZlcnNpb25GaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIHBhcnNlVmVyc2lvbkZpbGUoY29udGVudCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgY29uc3Qgbm9kZUVycm9yID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgIGlmIChub2RlRXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgY3VycmVudCB2ZXJzaW9uIHRvIHRoZSBkYXRhIGRpcmVjdG9yeSdzIHZlcnNpb24gZmlsZS5cbiAqXG4gKiBAcGFyYW0gZGF0YURpciAtIFBhdGggdG8gdGhlIGRhdGEgZGlyZWN0b3J5XG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHRvIHdyaXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlVmVyc2lvbkZpbGUoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgdmVyc2lvbjogUGFyc2VkVmVyc2lvblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcnNpb25GaWxlUGF0aCA9IHBhdGguam9pbihwYXRoLnJlc29sdmUoZGF0YURpciksIFZFUlNJT05fRklMRU5BTUUpO1xuICBjb25zdCBwYWNrYWdlSW5mbyA9IGF3YWl0IGdldFBhY2thZ2VJbmZvKCk7XG4gIGNvbnN0IGNvbnRlbnQgPSBmb3JtYXRWZXJzaW9uRmlsZShwYWNrYWdlSW5mby5uYW1lLCB2ZXJzaW9uKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHZlcnNpb25GaWxlUGF0aCwgY29udGVudCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc3VnZ2VzdGVkIGRvd25ncmFkZSB2ZXJzaW9uIGJhc2VkIG9uIHRoZSBvbGQgdmVyc2lvbi5cbiAqIElmIGEgc3BlY2lmaWMgdmVyc2lvbiBpcyBzdWdnZXN0ZWQgaW4gdGhlIGVycm9yLCB1c2UgdGhhdC5cbiAqIE90aGVyd2lzZSwgc3VnZ2VzdCB0aGUgcHJldmlvdXMgbWlub3IgdmVyc2lvbiBpZiBwYXRjaCBpcyAwLFxuICogb3IgcHJldmlvdXMgbWFqb3IgdmVyc2lvbiBpZiBtaW5vciBpcyBhbHNvIDAuXG4gKi9cbmZ1bmN0aW9uIGdldFN1Z2dlc3RlZERvd25ncmFkZVZlcnNpb24oXG4gIG9sZFZlcnNpb246IFBhcnNlZFZlcnNpb24sXG4gIHN1Z2dlc3RlZFZlcnNpb24/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmIChzdWdnZXN0ZWRWZXJzaW9uKSB7XG4gICAgcmV0dXJuIHN1Z2dlc3RlZFZlcnNpb247XG4gIH1cblxuICAvLyBTdWdnZXN0IHRoZSBvbGQgdmVyc2lvbiBhcyB0aGUgZG93bmdyYWRlIHRhcmdldFxuICByZXR1cm4gZm9ybWF0VmVyc2lvbihvbGRWZXJzaW9uKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgZGF0YSBkaXJlY3RvcnksIGVuc3VyaW5nIGl0IGV4aXN0cywgaXMgYWNjZXNzaWJsZSxcbiAqIGFuZCBoYW5kbGVzIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbiAqXG4gKiBAcGFyYW0gZGF0YURpciAtIFRoZSBwYXRoIHRvIHRoZSBkYXRhIGRpcmVjdG9yeVxuICogQHRocm93cyB7RGF0YURpckFjY2Vzc0Vycm9yfSBJZiB0aGUgZGlyZWN0b3J5IGNhbm5vdCBiZSBjcmVhdGVkIG9yIGFjY2Vzc2VkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGF0YURpcihkYXRhRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRmlyc3QgZW5zdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBhY2Nlc3NpYmxlXG4gIGF3YWl0IGVuc3VyZURhdGFEaXIoZGF0YURpcik7XG5cbiAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBnZXRQYWNrYWdlSW5mbygpO1xuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBhcnNlVmVyc2lvbihwYWNrYWdlSW5mby52ZXJzaW9uKTtcblxuICAvLyBSZWFkIGV4aXN0aW5nIHZlcnNpb24gZmlsZVxuICBjb25zdCBleGlzdGluZ1ZlcnNpb25JbmZvID0gYXdhaXQgcmVhZFZlcnNpb25GaWxlKGRhdGFEaXIpO1xuXG4gIGlmIChleGlzdGluZ1ZlcnNpb25JbmZvID09PSBudWxsKSB7XG4gICAgLy8gTmV3IGRhdGEgZGlyZWN0b3J5IC0gd3JpdGUgdGhlIGN1cnJlbnQgdmVyc2lvblxuICAgIGF3YWl0IHdyaXRlVmVyc2lvbkZpbGUoZGF0YURpciwgY3VycmVudFZlcnNpb24pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgdmVyc2lvbjogb2xkVmVyc2lvbiB9ID0gZXhpc3RpbmdWZXJzaW9uSW5mbztcblxuICAvLyBDaGVjayBpZiB2ZXJzaW9ucyBhcmUgdGhlIHNhbWUgKG5vIHVwZ3JhZGUgbmVlZGVkKVxuICBpZiAoZm9ybWF0VmVyc2lvbihvbGRWZXJzaW9uKSA9PT0gZm9ybWF0VmVyc2lvbihjdXJyZW50VmVyc2lvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBdHRlbXB0IHVwZ3JhZGVcbiAgdHJ5IHtcbiAgICB1cGdyYWRlVmVyc2lvbihvbGRWZXJzaW9uLCBjdXJyZW50VmVyc2lvbik7XG4gICAgLy8gVXBncmFkZSBzdWNjZWVkZWQgLSB3cml0ZSB0aGUgbmV3IHZlcnNpb25cbiAgICBhd2FpdCB3cml0ZVZlcnNpb25GaWxlKGRhdGFEaXIsIGN1cnJlbnRWZXJzaW9uKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBjb25zdCBzdWdnZXN0ZWRWZXJzaW9uID1cbiAgICAgIGVycm9yIGluc3RhbmNlb2YgRGF0YURpclZlcnNpb25FcnJvciA/IGVycm9yLnN1Z2dlc3RlZFZlcnNpb24gOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkb3duZ3JhZGVUYXJnZXQgPSBnZXRTdWdnZXN0ZWREb3duZ3JhZGVWZXJzaW9uKFxuICAgICAgb2xkVmVyc2lvbixcbiAgICAgIHN1Z2dlc3RlZFZlcnNpb25cbiAgICApO1xuXG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIGBbd29ybGQtbG9jYWxdIEZhaWxlZCB0byB1cGdyYWRlIGRhdGEgZGlyZWN0b3J5IGZyb20gdmVyc2lvbiAke2Zvcm1hdFZlcnNpb24ob2xkVmVyc2lvbil9IHRvICR7Zm9ybWF0VmVyc2lvbihjdXJyZW50VmVyc2lvbil9OmAsXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgKTtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFt3b3JsZC1sb2NhbF0gRGF0YSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24uIGAgK1xuICAgICAgICBgUGxlYXNlIGRvd25ncmFkZSB0byAke3BhY2thZ2VJbmZvLm5hbWV9QCR7ZG93bmdyYWRlVGFyZ2V0fWBcbiAgICApO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdfQ==
|
package/dist/instrumentObject.js
CHANGED
|
@@ -63,4 +63,4 @@ export function instrumentObject(prefix, o) {
|
|
|
63
63
|
}
|
|
64
64
|
return handlers;
|
|
65
65
|
}
|
|
66
|
-
//# sourceMappingURL=
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudE9iamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnN0cnVtZW50T2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLFdBQVcsRUFDWCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLGlEQUFpRDtBQUNqRCxNQUFNLG1CQUFtQixHQUFHO0lBQzFCLFdBQVcsRUFBRSxhQUFhO0lBQzFCLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLElBQWU7SUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQTRCLENBQUM7UUFDaEQsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFtQixNQUFjLEVBQUUsQ0FBSTtJQUNyRSxNQUFNLFFBQVEsR0FBRyxFQUFPLENBQUM7SUFDekIsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDakMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsK0NBQStDO1lBQy9DLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRTtnQkFDM0MsOERBQThEO2dCQUM5RCxJQUFJLFFBQVEsR0FBRyxHQUFHLE1BQU0sSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxNQUFNLEtBQUssY0FBYyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDekQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3pDLElBQUksU0FBUyxFQUFFLENBQUM7d0JBQ2QsUUFBUSxHQUFHLEdBQUcsTUFBTSxJQUFJLFVBQVUsSUFBSSxTQUFTLEVBQUUsQ0FBQztvQkFDcEQsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE9BQU8sS0FBSyxDQUNWLFFBQVEsRUFDUixFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUN2QyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7b0JBQ2IsK0NBQStDO29CQUMvQyxzRUFBc0U7b0JBQ3RFLElBQUksRUFBRSxhQUFhLENBQUM7d0JBQ2xCLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQzt3QkFDL0MsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDO3dCQUMzQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7d0JBQzdDLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQztxQkFDdkIsQ0FBQyxDQUFDO29CQUNILE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXR5IHRvIGluc3RydW1lbnQgb2JqZWN0IG1ldGhvZHMgd2l0aCB0cmFjaW5nLlxuICogVGhpcyBtaXJyb3JzIHdvcmxkLXZlcmNlbCdzIGltcGxlbWVudGF0aW9uIGZvciBjb25zaXN0ZW50IG9ic2VydmFiaWxpdHkuXG4gKi9cbmltcG9ydCB7XG4gIHRyYWNlLFxuICBnZXRTcGFuS2luZCxcbiAgUGVlclNlcnZpY2UsXG4gIFJwY1N5c3RlbSxcbiAgUnBjU2VydmljZSxcbiAgUnBjTWV0aG9kLFxufSBmcm9tICcuL3RlbGVtZXRyeS5qcyc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBwZWVyIHNlcnZpY2UgYXR0cmlidXRpb24gKi9cbmNvbnN0IFdPUkxEX0xPQ0FMX1NFUlZJQ0UgPSB7XG4gIHBlZXJTZXJ2aWNlOiAnd29ybGQtbG9jYWwnLFxuICBycGNTeXN0ZW06ICdsb2NhbCcsXG4gIHJwY1NlcnZpY2U6ICd3b3JsZC1sb2NhbCcsXG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBldmVudCB0eXBlIGZyb20gYXJndW1lbnRzIGZvciBldmVudHMuY3JlYXRlIGNhbGxzLlxuICogVGhlIGV2ZW50IGRhdGEgaXMgdGhlIHNlY29uZCBhcmd1bWVudCBhbmQgY29udGFpbnMgZXZlbnRUeXBlLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRUeXBlKGFyZ3M6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChhcmdzLmxlbmd0aCA+PSAyICYmIHR5cGVvZiBhcmdzWzFdID09PSAnb2JqZWN0JyAmJiBhcmdzWzFdICE9PSBudWxsKSB7XG4gICAgY29uc3QgZGF0YSA9IGFyZ3NbMV0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBkYXRhLmV2ZW50VHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhLmV2ZW50VHlwZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwcyBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3Qgd2l0aCB0cmFjaW5nIHNwYW5zLlxuICogQHBhcmFtIHByZWZpeCAtIFByZWZpeCBmb3Igc3BhbiBuYW1lcyAoZS5nLiwgXCJ3b3JsZC5ydW5zXCIpXG4gKiBAcGFyYW0gbyAtIE9iamVjdCB3aXRoIG1ldGhvZHMgdG8gaW5zdHJ1bWVudFxuICogQHJldHVybnMgSW5zdHJ1bWVudGVkIG9iamVjdCB3aXRoIHNhbWUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0cnVtZW50T2JqZWN0PFQgZXh0ZW5kcyBvYmplY3Q+KHByZWZpeDogc3RyaW5nLCBvOiBUKTogVCB7XG4gIGNvbnN0IGhhbmRsZXJzID0ge30gYXMgVDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobykgYXMgKGtleW9mIFQpW10pIHtcbiAgICBpZiAodHlwZW9mIG9ba2V5XSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaGFuZGxlcnNba2V5XSA9IG9ba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZiA9IG9ba2V5XTtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBTdHJpbmcoa2V5KTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBkeW5hbWljIGZ1bmN0aW9uIHdyYXBwaW5nXG4gICAgICBoYW5kbGVyc1trZXldID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAvLyBCdWlsZCBzcGFuIG5hbWUgLSBmb3IgZXZlbnRzLmNyZWF0ZSwgaW5jbHVkZSB0aGUgZXZlbnQgdHlwZVxuICAgICAgICBsZXQgc3Bhbk5hbWUgPSBgJHtwcmVmaXh9LiR7bWV0aG9kTmFtZX1gO1xuICAgICAgICBpZiAocHJlZml4ID09PSAnd29ybGQuZXZlbnRzJyAmJiBtZXRob2ROYW1lID09PSAnY3JlYXRlJykge1xuICAgICAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV4dHJhY3RFdmVudFR5cGUoYXJncyk7XG4gICAgICAgICAgaWYgKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgc3Bhbk5hbWUgPSBgJHtwcmVmaXh9LiR7bWV0aG9kTmFtZX0gJHtldmVudFR5cGV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgc3Bhbk5hbWUsXG4gICAgICAgICAgeyBraW5kOiBhd2FpdCBnZXRTcGFuS2luZCgnSU5URVJOQUwnKSB9LFxuICAgICAgICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICAgICAgICAvLyBBZGQgcGVlciBzZXJ2aWNlIGF0dHJpYnV0ZXMgZm9yIHNlcnZpY2UgbWFwc1xuICAgICAgICAgICAgLy8gVXNlIHNwYW5OYW1lIGZvciBycGMubWV0aG9kIHNvIERhdGFkb2cgc2hvd3MgZXZlbnQgdHlwZSBpbiByZXNvdXJjZVxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLlBlZXJTZXJ2aWNlKFdPUkxEX0xPQ0FMX1NFUlZJQ0UucGVlclNlcnZpY2UpLFxuICAgICAgICAgICAgICAuLi5ScGNTeXN0ZW0oV09STERfTE9DQUxfU0VSVklDRS5ycGNTeXN0ZW0pLFxuICAgICAgICAgICAgICAuLi5ScGNTZXJ2aWNlKFdPUkxEX0xPQ0FMX1NFUlZJQ0UucnBjU2VydmljZSksXG4gICAgICAgICAgICAgIC4uLlJwY01ldGhvZChzcGFuTmFtZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBmKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBoYW5kbGVycztcbn1cbiJdfQ==
|
package/dist/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,KAAK,EAAkB,MAAM,iBAAiB,CAAC;AAKxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiD1C,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,kDAAkD;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,+EAA+E;IAC/E,eAAe,CACb,MAAM,EAAE,aAAa,GAAG,iBAAiB,EACzC,OAAO,EAAE,aAAa,GACrB,IAAI,CAAC;CACT,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,KAAK,EAAkB,MAAM,iBAAiB,CAAC;AAKxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiD1C,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG;IAC/B,kDAAkD;IAClD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,+EAA+E;IAC/E,eAAe,CACb,MAAM,EAAE,aAAa,GAAG,iBAAiB,EACzC,OAAO,EAAE,aAAa,GACrB,IAAI,CAAC;CACT,CAAC;AAuCF,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,UAAU,CAoQ/D"}
|