@mnaoumov/typescript-lib 1.2.0 → 1.4.0

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.
@@ -0,0 +1,124 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A registry of debug switches: named, app-wide booleans that change behavior while debugging.
6
+ *
7
+ * A debug namespace (see `debug.ts`) controls logging only. Behavior that should differ while debugging, such as
8
+ * not terminating an operation paused on a breakpoint, is a debug switch instead, so turning logging on never
9
+ * changes what the code does.
10
+ *
11
+ * The definitions, the values and the change listeners all live in the shared state bag (`typescript-lib-state.ts`)
12
+ * as plain data, so every copy of this library loaded in one realm, such as the copy each Obsidian plugin bundles,
13
+ * sees one value per switch. A tool such as a debug-settings UI lists every registered switch with
14
+ * {@link getDebugSwitches} and needs no change when a library or plugin adds one.
15
+ */
16
+ import type { DisposableEx } from './disposable.mjs';
17
+ /**
18
+ * A handle to a registered debug switch.
19
+ */
20
+ export interface DebugSwitch extends DebugSwitchDefinition {
21
+ /**
22
+ * Gets the current value.
23
+ *
24
+ * @returns `true` if the switch is on.
25
+ */
26
+ isEnabled: () => boolean;
27
+ /**
28
+ * Sets the value, notifying the {@link onDebugSwitchChanged} listeners if it changed.
29
+ *
30
+ * @param isEnabled - The new value.
31
+ */
32
+ setEnabled: (isEnabled: boolean) => void;
33
+ }
34
+ /**
35
+ * A change of a debug switch's value, passed to an {@link onDebugSwitchChanged} listener.
36
+ */
37
+ export interface DebugSwitchChange {
38
+ /**
39
+ * The id of the switch that changed.
40
+ */
41
+ readonly id: string;
42
+ /**
43
+ * The new value.
44
+ */
45
+ readonly isEnabled: boolean;
46
+ }
47
+ /**
48
+ * The listener of {@link onDebugSwitchChanged}.
49
+ */
50
+ export type DebugSwitchChangeListener = (change: DebugSwitchChange) => void;
51
+ /**
52
+ * The definition of a debug switch.
53
+ */
54
+ export interface DebugSwitchDefinition {
55
+ /**
56
+ * What the switch does, for a settings UI.
57
+ */
58
+ readonly description: string;
59
+ /**
60
+ * The unique id, namespaced by the library or plugin that owns the switch, e.g.
61
+ * `typescript-lib:terminate-on-timeout`.
62
+ */
63
+ readonly id: string;
64
+ /**
65
+ * The value the switch has until something sets it.
66
+ */
67
+ readonly isEnabledByDefault: boolean;
68
+ /**
69
+ * The human-readable name, for a settings UI.
70
+ */
71
+ readonly name: string;
72
+ }
73
+ /**
74
+ * Gets a registered debug switch.
75
+ *
76
+ * @param id - The id of the switch.
77
+ * @returns The switch, or `undefined` if no switch with that id is registered.
78
+ */
79
+ export declare function getDebugSwitch(id: string): DebugSwitch | undefined;
80
+ /**
81
+ * Gets every registered debug switch, sorted by id.
82
+ *
83
+ * @returns The registered switches.
84
+ */
85
+ export declare function getDebugSwitches(): DebugSwitch[];
86
+ /**
87
+ * Gets the debug switch that decides whether a `runWithTimeout` call without its own `onTimeout` terminates the
88
+ * operation when it times out.
89
+ *
90
+ * Its id is `typescript-lib:terminate-on-timeout` and it is on by default. Switch it off while debugging, so an
91
+ * operation paused on a breakpoint is not terminated under the debugger. The timeout is still logged through the
92
+ * `Async:runWithTimeout` debugger.
93
+ *
94
+ * @returns The debug switch.
95
+ */
96
+ export declare function getTerminateOnTimeoutDebugSwitch(): DebugSwitch;
97
+ /**
98
+ * Adds a listener called whenever a debug switch's value changes, in any loaded copy of this library.
99
+ *
100
+ * @param listener - The listener.
101
+ * @returns A disposable that removes the listener.
102
+ */
103
+ export declare function onDebugSwitchChanged(listener: DebugSwitchChangeListener): DisposableEx;
104
+ /**
105
+ * Registers a debug switch.
106
+ *
107
+ * Registering an id again is idempotent: the first definition is kept, and the returned handle reads the same
108
+ * value. A value set with {@link setDebugSwitch} before the switch was registered is kept, not reset to the
109
+ * default.
110
+ *
111
+ * @param definition - The definition of the switch.
112
+ * @returns The handle to the switch.
113
+ */
114
+ export declare function registerDebugSwitch(definition: DebugSwitchDefinition): DebugSwitch;
115
+ /**
116
+ * Sets the value of a debug switch, notifying the {@link onDebugSwitchChanged} listeners if it changed.
117
+ *
118
+ * The switch does not have to be registered yet: the value is kept, and the switch takes it when it registers. That
119
+ * lets a settings store re-apply saved values before every library or plugin that owns a switch has loaded.
120
+ *
121
+ * @param id - The id of the switch.
122
+ * @param isEnabled - The new value.
123
+ */
124
+ export declare function setDebugSwitch(id: string, isEnabled: boolean): void;
@@ -0,0 +1,96 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { CallbackDisposable } from "./disposable.mjs";
7
+ import { getTypescriptLibState } from "./typescript-lib-state.mjs";
8
+ const LEGACY_STATE_KEYS = {
9
+ "typescript-lib:terminate-on-timeout": "isTerminationOnTimeoutEnabled"
10
+ };
11
+ const TERMINATE_ON_TIMEOUT_DEFINITION = {
12
+ description: "Terminate an operation that times out. Switch it off so an operation paused on a breakpoint keeps running.",
13
+ id: "typescript-lib:terminate-on-timeout",
14
+ isEnabledByDefault: true,
15
+ name: "Terminate operations on timeout"
16
+ };
17
+ const BUILT_IN_DEFINITIONS = [TERMINATE_ON_TIMEOUT_DEFINITION];
18
+ function getDebugSwitch(id) {
19
+ const definition = getDefinitions().get(id);
20
+ return definition ? createHandle(definition) : void 0;
21
+ }
22
+ function getDebugSwitches() {
23
+ return [...getDefinitions().values()].sort((a, b) => a.id.localeCompare(b.id)).map((definition) => createHandle(definition));
24
+ }
25
+ function getTerminateOnTimeoutDebugSwitch() {
26
+ return registerDebugSwitch(TERMINATE_ON_TIMEOUT_DEFINITION);
27
+ }
28
+ function onDebugSwitchChanged(listener) {
29
+ const listeners = getListeners();
30
+ listeners.add(listener);
31
+ return new CallbackDisposable({
32
+ callback() {
33
+ listeners.delete(listener);
34
+ }
35
+ });
36
+ }
37
+ function registerDebugSwitch(definition) {
38
+ const definitions = getDefinitions();
39
+ let registeredDefinition = definitions.get(definition.id);
40
+ if (!registeredDefinition) {
41
+ registeredDefinition = {
42
+ description: definition.description,
43
+ id: definition.id,
44
+ isEnabledByDefault: definition.isEnabledByDefault,
45
+ name: definition.name
46
+ };
47
+ definitions.set(definition.id, registeredDefinition);
48
+ }
49
+ return createHandle(registeredDefinition);
50
+ }
51
+ function setDebugSwitch(id, isEnabled) {
52
+ const definition = getDefinitions().get(id);
53
+ const wrapper = getValueWrapper(id, definition?.isEnabledByDefault ?? !isEnabled);
54
+ if (wrapper.value === isEnabled) {
55
+ return;
56
+ }
57
+ wrapper.value = isEnabled;
58
+ for (const listener of getListeners()) {
59
+ listener({ id, isEnabled });
60
+ }
61
+ }
62
+ function createHandle(definition) {
63
+ return {
64
+ ...definition,
65
+ isEnabled() {
66
+ return getValueWrapper(definition.id, definition.isEnabledByDefault).value;
67
+ },
68
+ setEnabled(isEnabled) {
69
+ setDebugSwitch(definition.id, isEnabled);
70
+ }
71
+ };
72
+ }
73
+ function getDefinitions() {
74
+ const definitions = getTypescriptLibState("debugSwitchDefinitions", /* @__PURE__ */ new Map()).value;
75
+ for (const definition of BUILT_IN_DEFINITIONS) {
76
+ if (!definitions.has(definition.id)) {
77
+ definitions.set(definition.id, definition);
78
+ }
79
+ }
80
+ return definitions;
81
+ }
82
+ function getListeners() {
83
+ return getTypescriptLibState("debugSwitchListeners", /* @__PURE__ */ new Set()).value;
84
+ }
85
+ function getValueWrapper(id, isEnabledByDefault) {
86
+ return getTypescriptLibState(LEGACY_STATE_KEYS[id] ?? `debugSwitch:${id}`, isEnabledByDefault);
87
+ }
88
+ export {
89
+ getDebugSwitch,
90
+ getDebugSwitches,
91
+ getTerminateOnTimeoutDebugSwitch,
92
+ onDebugSwitchChanged,
93
+ registerDebugSwitch,
94
+ setDebugSwitch
95
+ };
96
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlYnVnLXN3aXRjaGVzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSByZWdpc3RyeSBvZiBkZWJ1ZyBzd2l0Y2hlczogbmFtZWQsIGFwcC13aWRlIGJvb2xlYW5zIHRoYXQgY2hhbmdlIGJlaGF2aW9yIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBBIGRlYnVnIG5hbWVzcGFjZSAoc2VlIGBkZWJ1Zy50c2ApIGNvbnRyb2xzIGxvZ2dpbmcgb25seS4gQmVoYXZpb3IgdGhhdCBzaG91bGQgZGlmZmVyIHdoaWxlIGRlYnVnZ2luZywgc3VjaCBhc1xuICogbm90IHRlcm1pbmF0aW5nIGFuIG9wZXJhdGlvbiBwYXVzZWQgb24gYSBicmVha3BvaW50LCBpcyBhIGRlYnVnIHN3aXRjaCBpbnN0ZWFkLCBzbyB0dXJuaW5nIGxvZ2dpbmcgb24gbmV2ZXJcbiAqIGNoYW5nZXMgd2hhdCB0aGUgY29kZSBkb2VzLlxuICpcbiAqIFRoZSBkZWZpbml0aW9ucywgdGhlIHZhbHVlcyBhbmQgdGhlIGNoYW5nZSBsaXN0ZW5lcnMgYWxsIGxpdmUgaW4gdGhlIHNoYXJlZCBzdGF0ZSBiYWcgKGB0eXBlc2NyaXB0LWxpYi1zdGF0ZS50c2ApXG4gKiBhcyBwbGFpbiBkYXRhLCBzbyBldmVyeSBjb3B5IG9mIHRoaXMgbGlicmFyeSBsb2FkZWQgaW4gb25lIHJlYWxtLCBzdWNoIGFzIHRoZSBjb3B5IGVhY2ggT2JzaWRpYW4gcGx1Z2luIGJ1bmRsZXMsXG4gKiBzZWVzIG9uZSB2YWx1ZSBwZXIgc3dpdGNoLiBBIHRvb2wgc3VjaCBhcyBhIGRlYnVnLXNldHRpbmdzIFVJIGxpc3RzIGV2ZXJ5IHJlZ2lzdGVyZWQgc3dpdGNoIHdpdGhcbiAqIHtAbGluayBnZXREZWJ1Z1N3aXRjaGVzfSBhbmQgbmVlZHMgbm8gY2hhbmdlIHdoZW4gYSBsaWJyYXJ5IG9yIHBsdWdpbiBhZGRzIG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERpc3Bvc2FibGVFeCB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlV3JhcHBlciB9IGZyb20gJy4vdmFsdWUtd3JhcHBlci50cyc7XG5cbmltcG9ydCB7IENhbGxiYWNrRGlzcG9zYWJsZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5pbXBvcnQgeyBnZXRUeXBlc2NyaXB0TGliU3RhdGUgfSBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIHJlZ2lzdGVyZWQgZGVidWcgc3dpdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnU3dpdGNoIGV4dGVuZHMgRGVidWdTd2l0Y2hEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgc3dpdGNoIGlzIG9uLlxuICAgKi9cbiAgaXNFbmFibGVkOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSwgbm90aWZ5aW5nIHRoZSB7QGxpbmsgb25EZWJ1Z1N3aXRjaENoYW5nZWR9IGxpc3RlbmVycyBpZiBpdCBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0gaXNFbmFibGVkIC0gVGhlIG5ldyB2YWx1ZS5cbiAgICovXG4gIHNldEVuYWJsZWQ6IChpc0VuYWJsZWQ6IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBjaGFuZ2Ugb2YgYSBkZWJ1ZyBzd2l0Y2gncyB2YWx1ZSwgcGFzc2VkIHRvIGFuIHtAbGluayBvbkRlYnVnU3dpdGNoQ2hhbmdlZH0gbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdTd2l0Y2hDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBzd2l0Y2ggdGhhdCBjaGFuZ2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5ldyB2YWx1ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW5hYmxlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgbGlzdGVuZXIgb2Yge0BsaW5rIG9uRGVidWdTd2l0Y2hDaGFuZ2VkfS5cbiAqL1xuZXhwb3J0IHR5cGUgRGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lciA9IChjaGFuZ2U6IERlYnVnU3dpdGNoQ2hhbmdlKSA9PiB2b2lkO1xuXG4vKipcbiAqIFRoZSBkZWZpbml0aW9uIG9mIGEgZGVidWcgc3dpdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnU3dpdGNoRGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBzd2l0Y2ggZG9lcywgZm9yIGEgc2V0dGluZ3MgVUkuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIGlkLCBuYW1lc3BhY2VkIGJ5IHRoZSBsaWJyYXJ5IG9yIHBsdWdpbiB0aGF0IG93bnMgdGhlIHN3aXRjaCwgZS5nLlxuICAgKiBgdHlwZXNjcmlwdC1saWI6dGVybWluYXRlLW9uLXRpbWVvdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIHRoZSBzd2l0Y2ggaGFzIHVudGlsIHNvbWV0aGluZyBzZXRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbmFibGVkQnlEZWZhdWx0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSwgZm9yIGEgc2V0dGluZ3MgVUkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8vIEEgc3dpdGNoIHdob3NlIHZhbHVlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIGxpYnJhcnkga2VwdCB1bmRlciBpdHMgb3duIHNoYXJlZC1zdGF0ZSBrZXkga2VlcHMgdGhhdCBrZXksIHNvIGFcbi8vIGNvcHkgb2YgdGhhdCB2ZXJzaW9uIGxvYWRlZCBiZXNpZGUgdGhpcyBvbmUgc3RpbGwgcmVhZHMgYW5kIHdyaXRlcyB0aGUgc2FtZSB2YWx1ZS5cbmNvbnN0IExFR0FDWV9TVEFURV9LRVlTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiA9IHtcbiAgJ3R5cGVzY3JpcHQtbGliOnRlcm1pbmF0ZS1vbi10aW1lb3V0JzogJ2lzVGVybWluYXRpb25PblRpbWVvdXRFbmFibGVkJ1xufTtcblxuY29uc3QgVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTjogRGVidWdTd2l0Y2hEZWZpbml0aW9uID0ge1xuICBkZXNjcmlwdGlvbjogJ1Rlcm1pbmF0ZSBhbiBvcGVyYXRpb24gdGhhdCB0aW1lcyBvdXQuIFN3aXRjaCBpdCBvZmYgc28gYW4gb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQga2VlcHMgcnVubmluZy4nLFxuICBpZDogJ3R5cGVzY3JpcHQtbGliOnRlcm1pbmF0ZS1vbi10aW1lb3V0JyxcbiAgaXNFbmFibGVkQnlEZWZhdWx0OiB0cnVlLFxuICBuYW1lOiAnVGVybWluYXRlIG9wZXJhdGlvbnMgb24gdGltZW91dCdcbn07XG5cbi8vIFRoaXMgbGlicmFyeSdzIG93biBzd2l0Y2hlcywgYWx3YXlzIHJlZ2lzdGVyZWQsIHNvIGEgc2V0dGluZ3MgVUkgbGlzdHMgdGhlbSBiZWZvcmUgYW55IGNvZGUgdGhhdCByZWFkcyB0aGVtIHJ1bnMuXG5jb25zdCBCVUlMVF9JTl9ERUZJTklUSU9OUzogcmVhZG9ubHkgRGVidWdTd2l0Y2hEZWZpbml0aW9uW10gPSBbVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTl07XG5cbi8qKlxuICogR2V0cyBhIHJlZ2lzdGVyZWQgZGVidWcgc3dpdGNoLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3dpdGNoLlxuICogQHJldHVybnMgVGhlIHN3aXRjaCwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gc3dpdGNoIHdpdGggdGhhdCBpZCBpcyByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdTd2l0Y2goaWQ6IHN0cmluZyk6IERlYnVnU3dpdGNoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb25zKCkuZ2V0KGlkKTtcbiAgcmV0dXJuIGRlZmluaXRpb24gPyBjcmVhdGVIYW5kbGUoZGVmaW5pdGlvbikgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0cyBldmVyeSByZWdpc3RlcmVkIGRlYnVnIHN3aXRjaCwgc29ydGVkIGJ5IGlkLlxuICpcbiAqIEByZXR1cm5zIFRoZSByZWdpc3RlcmVkIHN3aXRjaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdTd2l0Y2hlcygpOiBEZWJ1Z1N3aXRjaFtdIHtcbiAgcmV0dXJuIFsuLi5nZXREZWZpbml0aW9ucygpLnZhbHVlcygpXVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmlkLmxvY2FsZUNvbXBhcmUoYi5pZCkpXG4gICAgLm1hcCgoZGVmaW5pdGlvbikgPT4gY3JlYXRlSGFuZGxlKGRlZmluaXRpb24pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBkZWJ1ZyBzd2l0Y2ggdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBgcnVuV2l0aFRpbWVvdXRgIGNhbGwgd2l0aG91dCBpdHMgb3duIGBvblRpbWVvdXRgIHRlcm1pbmF0ZXMgdGhlXG4gKiBvcGVyYXRpb24gd2hlbiBpdCB0aW1lcyBvdXQuXG4gKlxuICogSXRzIGlkIGlzIGB0eXBlc2NyaXB0LWxpYjp0ZXJtaW5hdGUtb24tdGltZW91dGAgYW5kIGl0IGlzIG9uIGJ5IGRlZmF1bHQuIFN3aXRjaCBpdCBvZmYgd2hpbGUgZGVidWdnaW5nLCBzbyBhblxuICogb3BlcmF0aW9uIHBhdXNlZCBvbiBhIGJyZWFrcG9pbnQgaXMgbm90IHRlcm1pbmF0ZWQgdW5kZXIgdGhlIGRlYnVnZ2VyLiBUaGUgdGltZW91dCBpcyBzdGlsbCBsb2dnZWQgdGhyb3VnaCB0aGVcbiAqIGBBc3luYzpydW5XaXRoVGltZW91dGAgZGVidWdnZXIuXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnIHN3aXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlcm1pbmF0ZU9uVGltZW91dERlYnVnU3dpdGNoKCk6IERlYnVnU3dpdGNoIHtcbiAgcmV0dXJuIHJlZ2lzdGVyRGVidWdTd2l0Y2goVEVSTUlOQVRFX09OX1RJTUVPVVRfREVGSU5JVElPTik7XG59XG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIGNhbGxlZCB3aGVuZXZlciBhIGRlYnVnIHN3aXRjaCdzIHZhbHVlIGNoYW5nZXMsIGluIGFueSBsb2FkZWQgY29weSBvZiB0aGlzIGxpYnJhcnkuXG4gKlxuICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyLlxuICogQHJldHVybnMgQSBkaXNwb3NhYmxlIHRoYXQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlYnVnU3dpdGNoQ2hhbmdlZChsaXN0ZW5lcjogRGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcik6IERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IGdldExpc3RlbmVycygpO1xuICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgIGNhbGxiYWNrKCk6IHZvaWQge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBkZWJ1ZyBzd2l0Y2guXG4gKlxuICogUmVnaXN0ZXJpbmcgYW4gaWQgYWdhaW4gaXMgaWRlbXBvdGVudDogdGhlIGZpcnN0IGRlZmluaXRpb24gaXMga2VwdCwgYW5kIHRoZSByZXR1cm5lZCBoYW5kbGUgcmVhZHMgdGhlIHNhbWVcbiAqIHZhbHVlLiBBIHZhbHVlIHNldCB3aXRoIHtAbGluayBzZXREZWJ1Z1N3aXRjaH0gYmVmb3JlIHRoZSBzd2l0Y2ggd2FzIHJlZ2lzdGVyZWQgaXMga2VwdCwgbm90IHJlc2V0IHRvIHRoZVxuICogZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0gZGVmaW5pdGlvbiAtIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBzd2l0Y2guXG4gKiBAcmV0dXJucyBUaGUgaGFuZGxlIHRvIHRoZSBzd2l0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlYnVnU3dpdGNoKGRlZmluaXRpb246IERlYnVnU3dpdGNoRGVmaW5pdGlvbik6IERlYnVnU3dpdGNoIHtcbiAgY29uc3QgZGVmaW5pdGlvbnMgPSBnZXREZWZpbml0aW9ucygpO1xuICBsZXQgcmVnaXN0ZXJlZERlZmluaXRpb24gPSBkZWZpbml0aW9ucy5nZXQoZGVmaW5pdGlvbi5pZCk7XG4gIGlmICghcmVnaXN0ZXJlZERlZmluaXRpb24pIHtcbiAgICByZWdpc3RlcmVkRGVmaW5pdGlvbiA9IHtcbiAgICAgIGRlc2NyaXB0aW9uOiBkZWZpbml0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgaWQ6IGRlZmluaXRpb24uaWQsXG4gICAgICBpc0VuYWJsZWRCeURlZmF1bHQ6IGRlZmluaXRpb24uaXNFbmFibGVkQnlEZWZhdWx0LFxuICAgICAgbmFtZTogZGVmaW5pdGlvbi5uYW1lXG4gICAgfTtcbiAgICBkZWZpbml0aW9ucy5zZXQoZGVmaW5pdGlvbi5pZCwgcmVnaXN0ZXJlZERlZmluaXRpb24pO1xuICB9XG4gIHJldHVybiBjcmVhdGVIYW5kbGUocmVnaXN0ZXJlZERlZmluaXRpb24pO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9mIGEgZGVidWcgc3dpdGNoLCBub3RpZnlpbmcgdGhlIHtAbGluayBvbkRlYnVnU3dpdGNoQ2hhbmdlZH0gbGlzdGVuZXJzIGlmIGl0IGNoYW5nZWQuXG4gKlxuICogVGhlIHN3aXRjaCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgeWV0OiB0aGUgdmFsdWUgaXMga2VwdCwgYW5kIHRoZSBzd2l0Y2ggdGFrZXMgaXQgd2hlbiBpdCByZWdpc3RlcnMuIFRoYXRcbiAqIGxldHMgYSBzZXR0aW5ncyBzdG9yZSByZS1hcHBseSBzYXZlZCB2YWx1ZXMgYmVmb3JlIGV2ZXJ5IGxpYnJhcnkgb3IgcGx1Z2luIHRoYXQgb3ducyBhIHN3aXRjaCBoYXMgbG9hZGVkLlxuICpcbiAqIEBwYXJhbSBpZCAtIFRoZSBpZCBvZiB0aGUgc3dpdGNoLlxuICogQHBhcmFtIGlzRW5hYmxlZCAtIFRoZSBuZXcgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWJ1Z1N3aXRjaChpZDogc3RyaW5nLCBpc0VuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgY29uc3QgZGVmaW5pdGlvbiA9IGdldERlZmluaXRpb25zKCkuZ2V0KGlkKTtcbiAgLy8gQW4gdW5yZWdpc3RlcmVkIHN3aXRjaCB3aXRoIG5vIHZhbHVlIHlldCBoYXMgbm8gcHJldmlvdXMgdmFsdWUsIHNvIGl0cyBmaXJzdCBzZXQgY291bnRzIGFzIGEgY2hhbmdlLlxuICBjb25zdCB3cmFwcGVyID0gZ2V0VmFsdWVXcmFwcGVyKGlkLCBkZWZpbml0aW9uPy5pc0VuYWJsZWRCeURlZmF1bHQgPz8gIWlzRW5hYmxlZCk7XG4gIGlmICh3cmFwcGVyLnZhbHVlID09PSBpc0VuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd3JhcHBlci52YWx1ZSA9IGlzRW5hYmxlZDtcbiAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBnZXRMaXN0ZW5lcnMoKSkge1xuICAgIGxpc3RlbmVyKHsgaWQsIGlzRW5hYmxlZCB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIYW5kbGUoZGVmaW5pdGlvbjogRGVidWdTd2l0Y2hEZWZpbml0aW9uKTogRGVidWdTd2l0Y2gge1xuICByZXR1cm4ge1xuICAgIC4uLmRlZmluaXRpb24sXG4gICAgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGdldFZhbHVlV3JhcHBlcihkZWZpbml0aW9uLmlkLCBkZWZpbml0aW9uLmlzRW5hYmxlZEJ5RGVmYXVsdCkudmFsdWU7XG4gICAgfSxcbiAgICBzZXRFbmFibGVkKGlzRW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgc2V0RGVidWdTd2l0Y2goZGVmaW5pdGlvbi5pZCwgaXNFbmFibGVkKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldERlZmluaXRpb25zKCk6IE1hcDxzdHJpbmcsIERlYnVnU3dpdGNoRGVmaW5pdGlvbj4ge1xuICBjb25zdCBkZWZpbml0aW9ucyA9IGdldFR5cGVzY3JpcHRMaWJTdGF0ZSgnZGVidWdTd2l0Y2hEZWZpbml0aW9ucycsIG5ldyBNYXA8c3RyaW5nLCBEZWJ1Z1N3aXRjaERlZmluaXRpb24+KCkpLnZhbHVlO1xuICAvLyBDaGVja2VkIG9uIGV2ZXJ5IHJlYWQsIGJlY2F1c2UgdGhlIG1hcCBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYSBjb3B5IG9mIHRoaXMgbGlicmFyeSB0aGF0IHByZWRhdGVzIGEgc3dpdGNoLlxuICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgQlVJTFRfSU5fREVGSU5JVElPTlMpIHtcbiAgICBpZiAoIWRlZmluaXRpb25zLmhhcyhkZWZpbml0aW9uLmlkKSkge1xuICAgICAgZGVmaW5pdGlvbnMuc2V0KGRlZmluaXRpb24uaWQsIGRlZmluaXRpb24pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmaW5pdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGdldExpc3RlbmVycygpOiBTZXQ8RGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcj4ge1xuICByZXR1cm4gZ2V0VHlwZXNjcmlwdExpYlN0YXRlKCdkZWJ1Z1N3aXRjaExpc3RlbmVycycsIG5ldyBTZXQ8RGVidWdTd2l0Y2hDaGFuZ2VMaXN0ZW5lcj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlV3JhcHBlcihpZDogc3RyaW5nLCBpc0VuYWJsZWRCeURlZmF1bHQ6IGJvb2xlYW4pOiBWYWx1ZVdyYXBwZXI8Ym9vbGVhbj4ge1xuICByZXR1cm4gZ2V0VHlwZXNjcmlwdExpYlN0YXRlKExFR0FDWV9TVEFURV9LRVlTW2lkXSA/PyBgZGVidWdTd2l0Y2g6JHtpZH1gLCBpc0VuYWJsZWRCeURlZmF1bHQpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFrQkEsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyw2QkFBNkI7QUFxRXRDLE1BQU0sb0JBQXNEO0FBQUEsRUFDMUQsdUNBQXVDO0FBQ3pDO0FBRUEsTUFBTSxrQ0FBeUQ7QUFBQSxFQUM3RCxhQUFhO0FBQUEsRUFDYixJQUFJO0FBQUEsRUFDSixvQkFBb0I7QUFBQSxFQUNwQixNQUFNO0FBQ1I7QUFHQSxNQUFNLHVCQUF5RCxDQUFDLCtCQUErQjtBQVF4RixTQUFTLGVBQWUsSUFBcUM7QUFDbEUsUUFBTSxhQUFhLGVBQWUsRUFBRSxJQUFJLEVBQUU7QUFDMUMsU0FBTyxhQUFhLGFBQWEsVUFBVSxJQUFJO0FBQ2pEO0FBT08sU0FBUyxtQkFBa0M7QUFDaEQsU0FBTyxDQUFDLEdBQUcsZUFBZSxFQUFFLE9BQU8sQ0FBQyxFQUNqQyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQ3ZDLElBQUksQ0FBQyxlQUFlLGFBQWEsVUFBVSxDQUFDO0FBQ2pEO0FBWU8sU0FBUyxtQ0FBZ0Q7QUFDOUQsU0FBTyxvQkFBb0IsK0JBQStCO0FBQzVEO0FBUU8sU0FBUyxxQkFBcUIsVUFBbUQ7QUFDdEYsUUFBTSxZQUFZLGFBQWE7QUFDL0IsWUFBVSxJQUFJLFFBQVE7QUFDdEIsU0FBTyxJQUFJLG1CQUFtQjtBQUFBLElBQzVCLFdBQWlCO0FBQ2YsZ0JBQVUsT0FBTyxRQUFRO0FBQUEsSUFDM0I7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVlPLFNBQVMsb0JBQW9CLFlBQWdEO0FBQ2xGLFFBQU0sY0FBYyxlQUFlO0FBQ25DLE1BQUksdUJBQXVCLFlBQVksSUFBSSxXQUFXLEVBQUU7QUFDeEQsTUFBSSxDQUFDLHNCQUFzQjtBQUN6QiwyQkFBdUI7QUFBQSxNQUNyQixhQUFhLFdBQVc7QUFBQSxNQUN4QixJQUFJLFdBQVc7QUFBQSxNQUNmLG9CQUFvQixXQUFXO0FBQUEsTUFDL0IsTUFBTSxXQUFXO0FBQUEsSUFDbkI7QUFDQSxnQkFBWSxJQUFJLFdBQVcsSUFBSSxvQkFBb0I7QUFBQSxFQUNyRDtBQUNBLFNBQU8sYUFBYSxvQkFBb0I7QUFDMUM7QUFXTyxTQUFTLGVBQWUsSUFBWSxXQUEwQjtBQUNuRSxRQUFNLGFBQWEsZUFBZSxFQUFFLElBQUksRUFBRTtBQUUxQyxRQUFNLFVBQVUsZ0JBQWdCLElBQUksWUFBWSxzQkFBc0IsQ0FBQyxTQUFTO0FBQ2hGLE1BQUksUUFBUSxVQUFVLFdBQVc7QUFDL0I7QUFBQSxFQUNGO0FBQ0EsVUFBUSxRQUFRO0FBQ2hCLGFBQVcsWUFBWSxhQUFhLEdBQUc7QUFDckMsYUFBUyxFQUFFLElBQUksVUFBVSxDQUFDO0FBQUEsRUFDNUI7QUFDRjtBQUVBLFNBQVMsYUFBYSxZQUFnRDtBQUNwRSxTQUFPO0FBQUEsSUFDTCxHQUFHO0FBQUEsSUFDSCxZQUFxQjtBQUNuQixhQUFPLGdCQUFnQixXQUFXLElBQUksV0FBVyxrQkFBa0IsRUFBRTtBQUFBLElBQ3ZFO0FBQUEsSUFDQSxXQUFXLFdBQTBCO0FBQ25DLHFCQUFlLFdBQVcsSUFBSSxTQUFTO0FBQUEsSUFDekM7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGlCQUFxRDtBQUM1RCxRQUFNLGNBQWMsc0JBQXNCLDBCQUEwQixvQkFBSSxJQUFtQyxDQUFDLEVBQUU7QUFFOUcsYUFBVyxjQUFjLHNCQUFzQjtBQUM3QyxRQUFJLENBQUMsWUFBWSxJQUFJLFdBQVcsRUFBRSxHQUFHO0FBQ25DLGtCQUFZLElBQUksV0FBVyxJQUFJLFVBQVU7QUFBQSxJQUMzQztBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGVBQStDO0FBQ3RELFNBQU8sc0JBQXNCLHdCQUF3QixvQkFBSSxJQUErQixDQUFDLEVBQUU7QUFDN0Y7QUFFQSxTQUFTLGdCQUFnQixJQUFZLG9CQUFvRDtBQUN2RixTQUFPLHNCQUFzQixrQkFBa0IsRUFBRSxLQUFLLGVBQWUsRUFBRSxJQUFJLGtCQUFrQjtBQUMvRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -11,6 +11,7 @@ export * as 'beeper' from './beeper.mjs';
11
11
  export * as 'blob' from './blob.mjs';
12
12
  export * as 'bytes' from './bytes.mjs';
13
13
  export * as 'debug-controller' from './debug-controller.mjs';
14
+ export * as 'debug-switches' from './debug-switches.mjs';
14
15
  export * as 'debug' from './debug.mjs';
15
16
  export * as 'desktop-zip-extractor' from './desktop-zip-extractor.mjs';
16
17
  export * as 'disposable' from './disposable.mjs';
@@ -15,6 +15,7 @@ import * as beeper from "./beeper.mjs";
15
15
  import * as blob from "./blob.mjs";
16
16
  import * as bytes from "./bytes.mjs";
17
17
  import * as debug_controller from "./debug-controller.mjs";
18
+ import * as debug_switches from "./debug-switches.mjs";
18
19
  import * as debug from "./debug.mjs";
19
20
  import * as desktop_zip_extractor from "./desktop-zip-extractor.mjs";
20
21
  import * as disposable from "./disposable.mjs";
@@ -50,6 +51,7 @@ export {
50
51
  bytes,
51
52
  debug,
52
53
  debug_controller as "debug-controller",
54
+ debug_switches as "debug-switches",
53
55
  desktop_zip_extractor as "desktop-zip-extractor",
54
56
  disposable,
55
57
  enum2 as enum,
@@ -71,4 +73,4 @@ export {
71
73
  value_provider as "value-provider",
72
74
  value_wrapper as "value-wrapper"
73
75
  };
74
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1ZycgZnJvbSAnLi9kZWJ1Zy50cyc7XG5leHBvcnQgKiBhcyAnZGVza3RvcC16aXAtZXh0cmFjdG9yJyBmcm9tICcuL2Rlc2t0b3AtemlwLWV4dHJhY3Rvci50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZScgZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmV4cG9ydCAqIGFzICdlbnVtJyBmcm9tICcuL2VudW0udHMnO1xuZXhwb3J0ICogYXMgJ2Vycm9yJyBmcm9tICcuL2Vycm9yLnRzJztcbmV4cG9ydCAqIGFzICdmdW5jdGlvbicgZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5leHBvcnQgKiBhcyAnaHRtbC1lbGVtZW50JyBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5leHBvcnQgKiBhcyAnanBlZy1tZXRhZGF0YScgZnJvbSAnLi9qcGVnLW1ldGFkYXRhLnRzJztcbmV4cG9ydCAqIGFzICdsaWJyYXJ5JyBmcm9tICcuL2xpYnJhcnkudHMnO1xuZXhwb3J0ICogYXMgJ29iamVjdC11dGlscycgZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ3BhdGgnIGZyb20gJy4vcGF0aC50cyc7XG5leHBvcnQgKiBhcyAncmVnLWV4cCcgZnJvbSAnLi9yZWctZXhwLnRzJztcbmV4cG9ydCAqIGFzICdzdHJpbmcnIGZyb20gJy4vc3RyaW5nLnRzJztcbmV4cG9ydCAqIGFzICd0cmFuc2Zvcm1lcnMnIGZyb20gJy4vdHJhbnNmb3JtZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICd0d28td2F5LW1hcCcgZnJvbSAnLi90d28td2F5LW1hcC50cyc7XG5leHBvcnQgKiBhcyAndHlwZS1ndWFyZHMnIGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUnIGZyb20gJy4vdHlwZS50cyc7XG5leHBvcnQgKiBhcyAndHlwZXNjcmlwdC1saWItc3RhdGUnIGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuZXhwb3J0ICogYXMgJ3VybCcgZnJvbSAnLi91cmwudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbHVlLXByb3ZpZGVyJyBmcm9tICcuL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS13cmFwcGVyJyBmcm9tICcuL3ZhbHVlLXdyYXBwZXIudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWSxXQUFhO0FBQ3pCLFlBQVksWUFBYztBQUMxQixZQUFZLFVBQVk7QUFDeEIsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLHNCQUF3QjtBQUNwQyxZQUFZLFdBQWE7QUFDekIsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksZ0JBQWtCO0FBQzlCLFlBQVlDLFdBQVk7QUFDeEIsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGVBQWdCO0FBQzVCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxtQkFBcUI7QUFDakMsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFVBQVk7QUFDeEIsWUFBWUMsYUFBZTtBQUMzQixZQUFZLFlBQWM7QUFDMUIsWUFBWSxrQkFBb0I7QUFDaEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVksU0FBVztBQUN2QixZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWUMsbUJBQXFCOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1jb250cm9sbGVyIiwgImFnZ3JlZ2F0ZS1lcnJvciIsICJhcGktY29udHJhY3QiLCAiYXJyYXktYnVmZmVyIiwgImFzeW5jLWV2ZW50cyIsICJhc3luYy1vcGVyYXRpb24taG9vayIsICJkZWJ1Zy1jb250cm9sbGVyIiwgImRlc2t0b3AtemlwLWV4dHJhY3RvciIsICJlbnVtIiwgImZ1bmN0aW9uIiwgImh0bWwtZWxlbWVudCIsICJqcGVnLW1ldGFkYXRhIiwgIm9iamVjdC11dGlscyIsICJyZWctZXhwIiwgInR3by13YXktbWFwIiwgInR5cGUtZ3VhcmRzIiwgInR5cGVzY3JpcHQtbGliLXN0YXRlIiwgInZhbHVlLXByb3ZpZGVyIiwgInZhbHVlLXdyYXBwZXIiXQp9Cg==
76
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1Zy1zd2l0Y2hlcycgZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWcnIGZyb20gJy4vZGVidWcudHMnO1xuZXhwb3J0ICogYXMgJ2Rlc2t0b3AtemlwLWV4dHJhY3RvcicgZnJvbSAnLi9kZXNrdG9wLXppcC1leHRyYWN0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUnIGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5leHBvcnQgKiBhcyAnZW51bScgZnJvbSAnLi9lbnVtLnRzJztcbmV4cG9ydCAqIGFzICdlcnJvcicgZnJvbSAnLi9lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnZnVuY3Rpb24nIGZyb20gJy4vZnVuY3Rpb24udHMnO1xuZXhwb3J0ICogYXMgJ2h0bWwtZWxlbWVudCcgZnJvbSAnLi9odG1sLWVsZW1lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2pwZWctbWV0YWRhdGEnIGZyb20gJy4vanBlZy1tZXRhZGF0YS50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeScgZnJvbSAnLi9saWJyYXJ5LnRzJztcbmV4cG9ydCAqIGFzICdvYmplY3QtdXRpbHMnIGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGVzY3JpcHQtbGliLXN0YXRlJyBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICd1cmwnIGZyb20gJy4vdXJsLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS1wcm92aWRlcicgZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5leHBvcnQgKiBhcyAndmFsdWUtd3JhcHBlcicgZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsc0JBQXdCO0FBQ3BDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVksV0FBYTtBQUN6QixZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVksV0FBYTtBQUN6QixZQUFZLFlBQWM7QUFDMUIsWUFBWSxVQUFZO0FBQ3hCLFlBQVksV0FBYTtBQUN6QixZQUFZQyxzQkFBd0I7QUFDcEMsWUFBWUMsb0JBQXNCO0FBQ2xDLFlBQVksV0FBYTtBQUN6QixZQUFZQywyQkFBNkI7QUFDekMsWUFBWSxnQkFBa0I7QUFDOUIsWUFBWUMsV0FBWTtBQUN4QixZQUFZLFdBQWE7QUFDekIsWUFBWUMsZUFBZ0I7QUFDNUIsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVksVUFBWTtBQUN4QixZQUFZQyxhQUFlO0FBQzNCLFlBQVksWUFBYztBQUMxQixZQUFZLGtCQUFvQjtBQUNoQyxZQUFZQyxpQkFBbUI7QUFDL0IsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVksVUFBWTtBQUN4QixZQUFZQywwQkFBNEI7QUFDeEMsWUFBWSxTQUFXO0FBQ3ZCLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyxtQkFBcUI7IiwKICAibmFtZXMiOiBbImFib3J0LWNvbnRyb2xsZXIiLCAiYWdncmVnYXRlLWVycm9yIiwgImFwaS1jb250cmFjdCIsICJhcnJheS1idWZmZXIiLCAiYXN5bmMtZXZlbnRzIiwgImFzeW5jLW9wZXJhdGlvbi1ob29rIiwgImRlYnVnLWNvbnRyb2xsZXIiLCAiZGVidWctc3dpdGNoZXMiLCAiZGVza3RvcC16aXAtZXh0cmFjdG9yIiwgImVudW0iLCAiZnVuY3Rpb24iLCAiaHRtbC1lbGVtZW50IiwgImpwZWctbWV0YWRhdGEiLCAib2JqZWN0LXV0aWxzIiwgInJlZy1leHAiLCAidHdvLXdheS1tYXAiLCAidHlwZS1ndWFyZHMiLCAidHlwZXNjcmlwdC1saWItc3RhdGUiLCAidmFsdWUtcHJvdmlkZXIiLCAidmFsdWUtd3JhcHBlciJdCn0K
@@ -2,15 +2,66 @@
2
2
  /**
3
3
  * @file
4
4
  *
5
- * Contains utility functions for type guards.
5
+ * Contains utility functions for type guards, and combinators that build a {@link TypeGuard} out of others.
6
+ *
7
+ * The combinators here work on bare type guards. Their `api-contract` counterparts (`arrayGuard`, `optionalGuard`,
8
+ * ...) work on an `ExpectedTypeGuard`, a type guard paired with the text an issue message reports, and their names
9
+ * drop the `Type` this layer's names carry.
6
10
  */
11
+ import type { GenericFunction } from './function.mjs';
7
12
  /**
8
13
  * A type that represents a generic object.
9
14
  *
10
15
  * @typeParam T - The base type to intersect with.
11
16
  */
12
17
  export type GenericObject<T = unknown> = Record<string | symbol, unknown> & T;
18
+ /**
19
+ * The type a {@link TypeGuard} narrows to. Distributes over a union of guards.
20
+ *
21
+ * @typeParam TTypeGuard - The type guard.
22
+ */
23
+ export type GuardedType<TTypeGuard> = TTypeGuard extends (value: unknown) => value is infer T ? T : never;
24
+ /**
25
+ * A value {@link literalTypeGuard} can compare against.
26
+ */
27
+ export type Literal = bigint | boolean | null | number | string | symbol | undefined;
28
+ /**
29
+ * Options for {@link objectTypeGuard}.
30
+ */
31
+ export interface ObjectTypeGuardOptions {
32
+ /**
33
+ * Whether a value carrying an own enumerable string key that no property guard names is refused.
34
+ *
35
+ * @default `false`
36
+ */
37
+ readonly shouldRejectUnknownKeys?: boolean;
38
+ }
39
+ /**
40
+ * One type guard per property of an object type, as {@link objectTypeGuard} takes them. Every key of `T` must be
41
+ * listed. The guard of an optional property is typed to narrow to `undefined` as well, but a guard that refuses
42
+ * `undefined` still compiles there, so widen it with {@link optionalTypeGuard}: an absent property reads as
43
+ * `undefined`, and a guard refusing it refuses the object.
44
+ *
45
+ * @typeParam T - The object type.
46
+ */
47
+ export type PropertyTypeGuards<T extends object> = {
48
+ readonly [TKey in keyof T]-?: TypeGuard<Partial<Pick<T, TKey>> extends Pick<T, TKey> ? T[TKey] | undefined : T[TKey]>;
49
+ };
50
+ /**
51
+ * A function deciding whether a value is a `T`.
52
+ *
53
+ * @typeParam T - The type the guard narrows to.
54
+ */
55
+ export type TypeGuard<T> = (value: unknown) => value is T;
13
56
  type NullableConstraint<T> = null extends T ? unknown : undefined extends T ? unknown : never;
57
+ /**
58
+ * Builds a guard accepting an array whose every item the item guard accepts.
59
+ *
60
+ * @typeParam T - The type of an item.
61
+ * @param isItem - The guard for one item.
62
+ * @returns The guard.
63
+ */
64
+ export declare function arrayTypeGuard<T>(isItem: TypeGuard<T>): TypeGuard<T[]>;
14
65
  /**
15
66
  * Asserts that a condition is `true`. Throws if it is not.
16
67
  *
@@ -81,6 +132,22 @@ export declare function ensureGenericObject<T>($object: T): GenericObject<T>;
81
132
  * @throws If the value is `null` or `undefined`.
82
133
  */
83
134
  export declare function ensureNonNullable<T extends NullableConstraint<T>>(value: T, errorOrMessage?: Error | string): NonNullable<T>;
135
+ /**
136
+ * Builds a guard accepting any function, narrowed to the signature `TFunction`. Only that the value is a function
137
+ * is checked: a signature cannot be checked at runtime, so the guard trusts it.
138
+ *
139
+ * @typeParam TFunction - The signature the guard narrows to.
140
+ * @returns The guard.
141
+ */
142
+ export declare function functionTypeGuard<TFunction extends GenericFunction>(): TypeGuard<TFunction>;
143
+ /**
144
+ * Builds a guard accepting an instance of a class, or of a class derived from it.
145
+ *
146
+ * @typeParam T - The type of an instance.
147
+ * @param constructor - The class.
148
+ * @returns The guard.
149
+ */
150
+ export declare function instanceOfTypeGuard<T>(constructor: abstract new (...arguments_: never[]) => T): TypeGuard<T>;
84
151
  /**
85
152
  * Checks whether a value is a boolean.
86
153
  *
@@ -88,6 +155,20 @@ export declare function ensureNonNullable<T extends NullableConstraint<T>>(value
88
155
  * @returns Whether the value is a boolean.
89
156
  */
90
157
  export declare function isBoolean(value: unknown): value is boolean;
158
+ /**
159
+ * Checks whether a value is a function.
160
+ *
161
+ * @param value - The value to check.
162
+ * @returns Whether the value is a function.
163
+ */
164
+ export declare function isFunction(value: unknown): value is GenericFunction;
165
+ /**
166
+ * Checks whether a value is `null`.
167
+ *
168
+ * @param value - The value to check.
169
+ * @returns Whether the value is `null`.
170
+ */
171
+ export declare function isNull(value: unknown): value is null;
91
172
  /**
92
173
  * Checks whether a value is a number.
93
174
  *
@@ -95,6 +176,13 @@ export declare function isBoolean(value: unknown): value is boolean;
95
176
  * @returns Whether the value is a number.
96
177
  */
97
178
  export declare function isNumber(value: unknown): value is number;
179
+ /**
180
+ * Checks whether a value is an object: not `null`, and not a primitive or a function.
181
+ *
182
+ * @param value - The value to check.
183
+ * @returns Whether the value is an object.
184
+ */
185
+ export declare function isObject(value: unknown): value is object;
98
186
  /**
99
187
  * Checks whether a value is a string.
100
188
  *
@@ -116,4 +204,57 @@ export declare function isStringArray(value: unknown): value is string[];
116
204
  * @returns Whether the value is `undefined`.
117
205
  */
118
206
  export declare function isUndefined(value: unknown): value is undefined;
207
+ /**
208
+ * Builds a guard accepting exactly the keys of a record. Typing the record over a union, as
209
+ * `literalTypeGuard<Mode>({ A: true, B: true })`, makes a member later added to the union fail to compile until
210
+ * it is listed.
211
+ *
212
+ * @typeParam T - The accepted strings.
213
+ * @param literals - A record whose keys are the accepted strings.
214
+ * @returns The guard.
215
+ */
216
+ export declare function literalTypeGuard<T extends string>(literals: Readonly<Record<T, true>>): TypeGuard<T>;
217
+ /**
218
+ * Builds a guard accepting exactly the listed values, compared as `Array.prototype.includes` compares them.
219
+ *
220
+ * @typeParam T - The accepted values.
221
+ * @param literals - The accepted values.
222
+ * @returns The guard.
223
+ */
224
+ export declare function literalTypeGuard<T extends Literal>(literals: readonly T[]): TypeGuard<T>;
225
+ /**
226
+ * Widens a guard to also accept `null`.
227
+ *
228
+ * @typeParam T - The type the guard narrows to.
229
+ * @param isValue - The guard to widen.
230
+ * @returns A guard accepting what `isValue` accepts, or `null`.
231
+ */
232
+ export declare function nullableTypeGuard<T>(isValue: TypeGuard<T>): TypeGuard<null | T>;
233
+ /**
234
+ * Builds a guard accepting an object whose every listed property its guard accepts. A property is read with
235
+ * `Reflect.get`, so an inherited one counts and an absent one reads as `undefined`.
236
+ *
237
+ * @typeParam T - The object type.
238
+ * @param propertyTypeGuards - One guard per property of `T`.
239
+ * @param options - The options for the guard.
240
+ * @returns The guard.
241
+ */
242
+ export declare function objectTypeGuard<T extends object>(propertyTypeGuards: PropertyTypeGuards<T>, options?: ObjectTypeGuardOptions): TypeGuard<T>;
243
+ /**
244
+ * Widens a guard to also accept `undefined`, which is what an optional property or parameter reads as when it is
245
+ * left out.
246
+ *
247
+ * @typeParam T - The type the guard narrows to.
248
+ * @param isValue - The guard to widen.
249
+ * @returns A guard accepting what `isValue` accepts, or `undefined`.
250
+ */
251
+ export declare function optionalTypeGuard<T>(isValue: TypeGuard<T>): TypeGuard<T | undefined>;
252
+ /**
253
+ * Builds a guard accepting what any of the given guards accepts.
254
+ *
255
+ * @typeParam TTypeGuards - The guards.
256
+ * @param typeGuards - The guards, tried in order.
257
+ * @returns The guard.
258
+ */
259
+ export declare function unionTypeGuard<const TTypeGuards extends readonly TypeGuard<unknown>[]>(...typeGuards: TTypeGuards): TypeGuard<GuardedType<TTypeGuards[number]>>;
119
260
  export {};
@@ -4,6 +4,9 @@ if you want to view the source, please visit the github repository of this plugi
4
4
  */
5
5
 
6
6
  import { noop } from "./function.mjs";
7
+ function arrayTypeGuard(isItem) {
8
+ return (value) => Array.isArray(value) && value.every((item) => isItem(item));
9
+ }
7
10
  function assert(isTrue, errorOrMessage) {
8
11
  if (!isTrue) {
9
12
  throw typeof errorOrMessage === "string" ? new Error(errorOrMessage) : errorOrMessage;
@@ -30,12 +33,27 @@ function ensureNonNullable(value, errorOrMessage) {
30
33
  assertNonNullable(value, errorOrMessage);
31
34
  return value;
32
35
  }
36
+ function functionTypeGuard() {
37
+ return (value) => isFunction(value);
38
+ }
39
+ function instanceOfTypeGuard(constructor) {
40
+ return (value) => value instanceof constructor;
41
+ }
33
42
  function isBoolean(value) {
34
43
  return typeof value === "boolean";
35
44
  }
45
+ function isFunction(value) {
46
+ return typeof value === "function";
47
+ }
48
+ function isNull(value) {
49
+ return value === null;
50
+ }
36
51
  function isNumber(value) {
37
52
  return typeof value === "number";
38
53
  }
54
+ function isObject(value) {
55
+ return typeof value === "object" && value !== null;
56
+ }
39
57
  function isString(value) {
40
58
  return typeof value === "string";
41
59
  }
@@ -45,17 +63,64 @@ function isStringArray(value) {
45
63
  function isUndefined(value) {
46
64
  return value === void 0;
47
65
  }
66
+ function literalTypeGuard(literals) {
67
+ if (isReadonlyArray(literals)) {
68
+ const literalList = literals;
69
+ return (value) => literalList.includes(value);
70
+ }
71
+ return (value) => isString(value) && Object.hasOwn(literals, value);
72
+ }
73
+ function nullableTypeGuard(isValue) {
74
+ return unionTypeGuard(isNull, isValue);
75
+ }
76
+ function objectTypeGuard(propertyTypeGuards, options) {
77
+ const shouldRejectUnknownKeys = options?.shouldRejectUnknownKeys ?? false;
78
+ return (value) => {
79
+ if (!isObject(value)) {
80
+ return false;
81
+ }
82
+ if (shouldRejectUnknownKeys && Object.keys(value).some((key) => !Object.hasOwn(propertyTypeGuards, key))) {
83
+ return false;
84
+ }
85
+ for (const key in propertyTypeGuards) {
86
+ if (!propertyTypeGuards[key](Reflect.get(value, key))) {
87
+ return false;
88
+ }
89
+ }
90
+ return true;
91
+ };
92
+ }
93
+ function optionalTypeGuard(isValue) {
94
+ return unionTypeGuard(isUndefined, isValue);
95
+ }
96
+ function unionTypeGuard(...typeGuards) {
97
+ return (value) => typeGuards.some((typeGuard) => typeGuard(value));
98
+ }
99
+ function isReadonlyArray(value) {
100
+ return Array.isArray(value);
101
+ }
48
102
  export {
103
+ arrayTypeGuard,
49
104
  assert,
50
105
  assertGenericObject,
51
106
  assertNever,
52
107
  assertNonNullable,
53
108
  ensureGenericObject,
54
109
  ensureNonNullable,
110
+ functionTypeGuard,
111
+ instanceOfTypeGuard,
55
112
  isBoolean,
113
+ isFunction,
114
+ isNull,
56
115
  isNumber,
116
+ isObject,
57
117
  isString,
58
118
  isStringArray,
59
- isUndefined
119
+ isUndefined,
120
+ literalTypeGuard,
121
+ nullableTypeGuard,
122
+ objectTypeGuard,
123
+ optionalTypeGuard,
124
+ unionTypeGuard
60
125
  };
61
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3R5cGUtZ3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHR5cGUgZ3VhcmRzLlxuICovXG5cbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL2Z1bmN0aW9uLnRzJztcblxuLyoqXG4gKiBBIHR5cGUgdGhhdCByZXByZXNlbnRzIGEgZ2VuZXJpYyBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGJhc2UgdHlwZSB0byBpbnRlcnNlY3Qgd2l0aC5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdDxUID0gdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCB1bmtub3duPiAmIFQ7XG5cbnR5cGUgTnVsbGFibGVDb25zdHJhaW50PFQ+ID0gbnVsbCBleHRlbmRzIFQgPyB1bmtub3duIDogdW5kZWZpbmVkIGV4dGVuZHMgVCA/IHVua25vd24gOiBuZXZlcjtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSBjb25kaXRpb24gaXMgYHRydWVgLiBUaHJvd3MgaWYgaXQgaXMgbm90LlxuICpcbiAqIFVzZSBpbiBwbGFjZSBvZiBgLyogdjggaWdub3JlICpcXC9gIGZvciBkZWZlbnNpdmUgZ3VhcmRzIHRoYXQgc2hvdWxkXG4gKiBuZXZlciB0cmlnZ2VyIGF0IHJ1bnRpbWUgYnV0IHdvdWxkIG90aGVyd2lzZSBjcmVhdGUgdW5jb3ZlcmVkIGJyYW5jaGVzLlxuICpcbiAqIEBwYXJhbSBpc1RydWUgLSBUaGUgY29uZGl0aW9uIHRvIGFzc2VydC5cbiAqIEBwYXJhbSBlcnJvck9yTWVzc2FnZSAtIFRoZSBlcnJvciBvciBtZXNzYWdlIHRvIHRocm93IGlmIHRoZSBjb25kaXRpb24gaXMgYGZhbHNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChpc1RydWU6IGJvb2xlYW4sIGVycm9yT3JNZXNzYWdlOiBFcnJvciB8IHN0cmluZyk6IGFzc2VydHMgaXNUcnVlIHtcbiAgaWYgKCFpc1RydWUpIHtcbiAgICB0aHJvdyB0eXBlb2YgZXJyb3JPck1lc3NhZ2UgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGVycm9yT3JNZXNzYWdlKSA6IGVycm9yT3JNZXNzYWdlO1xuICB9XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGEgdmFsdWUgaXMgYSBnZW5lcmljIG9iamVjdCwgbmFycm93aW5nIGl0cyB0eXBlIGluIHBsYWNlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSBfb2JqZWN0IC0gVGhlIHZhbHVlIHRvIGFzc2VydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEdlbmVyaWNPYmplY3Q8VD4oX29iamVjdDogVCk6IGFzc2VydHMgX29iamVjdCBpcyBHZW5lcmljT2JqZWN0PFQ+IHtcbiAgbm9vcCgpO1xufVxuXG4vKipcbiAqIEFzc2VydHMgYXQgY29tcGlsZSB0aW1lIHRoYXQgZXZlcnkgY2FzZSBvZiBhIGRpc2NyaW1pbmF0ZWQgdW5pb24gaGFzIGJlZW5cbiAqIGhhbmRsZWQuIFBsYWNlIGF0IHRoZSBgZGVmYXVsdGAgYnJhbmNoIG9mIGEgYHN3aXRjaGAgb3ZlciBhIHVuaW9uIG9yIGVudW0uXG4gKlxuICogSWYgYSBuZXcgdmFyaWFudCBpcyBhZGRlZCB0byB0aGUgdW5pb24gd2l0aG91dCBhIG1hdGNoaW5nIGBjYXNlYCwgdGhlIGNhbGxcbiAqIHRvIHtAbGluayBhc3NlcnROZXZlcn0gZmFpbHMgdG8gY29tcGlsZSBiZWNhdXNlIGB2YWx1ZWAgaXMgbm8gbG9uZ2VyIGBuZXZlcmAuXG4gKiBJZiByZWFjaGVkIGF0IHJ1bnRpbWUgKGUuZy4gYmVjYXVzZSB0aGUgdmFsdWUgd2FzIGJ5cGFzc2VkIHZpYSBKU09OIG9yIGFcbiAqIHR5cGUgYXNzZXJ0aW9uKSwgaXQgdGhyb3dzIGEgZGVzY3JpcHRpdmUgYEVycm9yYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIHN3aXRjaCAobW9kZSkge1xuICogICBjYXNlICdhJzogcmV0dXJuIGRvQSgpO1xuICogICBjYXNlICdiJzogcmV0dXJuIGRvQigpO1xuICogICBkZWZhdWx0OiBhc3NlcnROZXZlcihtb2RlKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBleGhhdXN0aXZlbHktaGFuZGxlZCB2YWx1ZSwgbmFycm93ZWQgdG8gYG5ldmVyYCBieSBjb250cm9sIGZsb3cuXG4gKiBAdGhyb3dzIEFsd2F5cywgaWYgcmVhY2hlZCBhdCBydW50aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWU6IG5ldmVyKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCB2YWx1ZTogJHtTdHJpbmcodmFsdWUpfWApO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBhIHZhbHVlIGlzIG5vdCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIG5hcnJvd2luZyBpdHMgdHlwZSBpbiBwbGFjZS5cbiAqXG4gKiBPbmx5IGNhbGxhYmxlIHdoZW4gYFRgIGluY2x1ZGVzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4gUGFzc2luZyBhbiBhbHJlYWR5IG5vbi1udWxsYWJsZSB0eXBlIGlzIGEgY29tcGlsZSBlcnJvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0gZXJyb3JPck1lc3NhZ2UgLSBPcHRpb25hbCB7QGxpbmsgRXJyb3J9IG9yIGVycm9yIG1lc3NhZ2Ugc3RyaW5nLlxuICogQHRocm93cyBJZiB0aGUgdmFsdWUgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9uTnVsbGFibGU8VCBleHRlbmRzIE51bGxhYmxlQ29uc3RyYWludDxUPj4odmFsdWU6IFQsIGVycm9yT3JNZXNzYWdlPzogRXJyb3IgfCBzdHJpbmcpOiBhc3NlcnRzIHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlcnJvck9yTWVzc2FnZSA/Pz0gdmFsdWUgPT09IG51bGwgPyAnVmFsdWUgaXMgbnVsbCcgOiAnVmFsdWUgaXMgdW5kZWZpbmVkJztcbiAgY29uc3QgZXJyb3IgPSB0eXBlb2YgZXJyb3JPck1lc3NhZ2UgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGVycm9yT3JNZXNzYWdlKSA6IGVycm9yT3JNZXNzYWdlO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSB2YWx1ZSBpcyBhIGdlbmVyaWMgb2JqZWN0LCByZXR1cm5pbmcgaXQgd2l0aCBuYXJyb3dlZCB0eXBlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSAkb2JqZWN0IC0gVGhlIHZhbHVlIHRvIGVuc3VyZS5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSBhcyBhIGdlbmVyaWMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlR2VuZXJpY09iamVjdDxUPigkb2JqZWN0OiBUKTogR2VuZXJpY09iamVjdDxUPiB7XG4gIHJldHVybiAkb2JqZWN0IGFzIEdlbmVyaWNPYmplY3Q8VD47XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGEgdmFsdWUgaXMgbm90IGBudWxsYCBvciBgdW5kZWZpbmVkYCBhbmQgcmV0dXJucyBpdCB3aXRoIG5hcnJvd2VkIHR5cGUuXG4gKlxuICogT25seSBjYWxsYWJsZSB3aGVuIGBUYCBpbmNsdWRlcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuIFBhc3NpbmcgYW4gYWxyZWFkeSBub24tbnVsbGFibGUgdHlwZSBpcyBhIGNvbXBpbGUgZXJyb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIGVycm9yT3JNZXNzYWdlIC0gT3B0aW9uYWwge0BsaW5rIEVycm9yfSBvciBlcnJvciBtZXNzYWdlIHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSB2YWx1ZSB3aXRoIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgZXhjbHVkZWQgZnJvbSBpdHMgdHlwZS5cbiAqIEB0aHJvd3MgSWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU5vbk51bGxhYmxlPFQgZXh0ZW5kcyBOdWxsYWJsZUNvbnN0cmFpbnQ8VD4+KHZhbHVlOiBULCBlcnJvck9yTWVzc2FnZT86IEVycm9yIHwgc3RyaW5nKTogTm9uTnVsbGFibGU8VD4ge1xuICBhc3NlcnROb25OdWxsYWJsZSh2YWx1ZSwgZXJyb3JPck1lc3NhZ2UpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhIGJvb2xlYW4uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBib29sZWFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgd2hvc2UgZXZlcnkgaXRlbSBpcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShpc1N0cmluZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQU1BLFNBQVMsWUFBWTtBQW9CZCxTQUFTLE9BQU8sUUFBaUIsZ0JBQWdEO0FBQ3RGLE1BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxPQUFPLG1CQUFtQixXQUFXLElBQUksTUFBTSxjQUFjLElBQUk7QUFBQSxFQUN6RTtBQUNGO0FBUU8sU0FBUyxvQkFBdUIsU0FBaUQ7QUFDdEYsT0FBSztBQUNQO0FBdUJPLFNBQVMsWUFBWSxPQUFxQjtBQUMvQyxRQUFNLElBQUksTUFBTSxvQkFBb0IsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUNyRDtBQVlPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWtFO0FBQzdJLE1BQUksVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN6QztBQUFBLEVBQ0Y7QUFFQSxxQkFBbUIsVUFBVSxPQUFPLGtCQUFrQjtBQUN0RCxRQUFNLFFBQVEsT0FBTyxtQkFBbUIsV0FBVyxJQUFJLE1BQU0sY0FBYyxJQUFJO0FBQy9FLFFBQU07QUFDUjtBQVNPLFNBQVMsb0JBQXVCLFNBQThCO0FBQ25FLFNBQU87QUFDVDtBQWFPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWlEO0FBQzVILG9CQUFrQixPQUFPLGNBQWM7QUFDdkMsU0FBTztBQUNUO0FBUU8sU0FBUyxVQUFVLE9BQWtDO0FBQzFELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBUU8sU0FBUyxTQUFTLE9BQWlDO0FBQ3hELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBUU8sU0FBUyxTQUFTLE9BQWlDO0FBQ3hELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBUU8sU0FBUyxjQUFjLE9BQW1DO0FBQy9ELFNBQU8sTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sUUFBUTtBQUNyRDtBQVFPLFNBQVMsWUFBWSxPQUFvQztBQUM5RCxTQUFPLFVBQVU7QUFDbkI7IiwKICAibmFtZXMiOiBbXQp9Cg==
126
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3R5cGUtZ3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHR5cGUgZ3VhcmRzLCBhbmQgY29tYmluYXRvcnMgdGhhdCBidWlsZCBhIHtAbGluayBUeXBlR3VhcmR9IG91dCBvZiBvdGhlcnMuXG4gKlxuICogVGhlIGNvbWJpbmF0b3JzIGhlcmUgd29yayBvbiBiYXJlIHR5cGUgZ3VhcmRzLiBUaGVpciBgYXBpLWNvbnRyYWN0YCBjb3VudGVycGFydHMgKGBhcnJheUd1YXJkYCwgYG9wdGlvbmFsR3VhcmRgLFxuICogLi4uKSB3b3JrIG9uIGFuIGBFeHBlY3RlZFR5cGVHdWFyZGAsIGEgdHlwZSBndWFyZCBwYWlyZWQgd2l0aCB0aGUgdGV4dCBhbiBpc3N1ZSBtZXNzYWdlIHJlcG9ydHMsIGFuZCB0aGVpciBuYW1lc1xuICogZHJvcCB0aGUgYFR5cGVgIHRoaXMgbGF5ZXIncyBuYW1lcyBjYXJyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuXG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGdlbmVyaWMgb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBiYXNlIHR5cGUgdG8gaW50ZXJzZWN0IHdpdGguXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyaWNPYmplY3Q8VCA9IHVua25vd24+ID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gJiBUO1xuXG4vKipcbiAqIFRoZSB0eXBlIGEge0BsaW5rIFR5cGVHdWFyZH0gbmFycm93cyB0by4gRGlzdHJpYnV0ZXMgb3ZlciBhIHVuaW9uIG9mIGd1YXJkcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRUeXBlR3VhcmQgLSBUaGUgdHlwZSBndWFyZC5cbiAqL1xuZXhwb3J0IHR5cGUgR3VhcmRlZFR5cGU8VFR5cGVHdWFyZD4gPSBUVHlwZUd1YXJkIGV4dGVuZHMgKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBpbmZlciBUID8gVCA6IG5ldmVyO1xuXG4vKipcbiAqIEEgdmFsdWUge0BsaW5rIGxpdGVyYWxUeXBlR3VhcmR9IGNhbiBjb21wYXJlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCB0eXBlIExpdGVyYWwgPSBiaWdpbnQgfCBib29sZWFuIHwgbnVsbCB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgb2JqZWN0VHlwZUd1YXJkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYmplY3RUeXBlR3VhcmRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB2YWx1ZSBjYXJyeWluZyBhbiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5IHRoYXQgbm8gcHJvcGVydHkgZ3VhcmQgbmFtZXMgaXMgcmVmdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVqZWN0VW5rbm93bktleXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSB0eXBlIGd1YXJkIHBlciBwcm9wZXJ0eSBvZiBhbiBvYmplY3QgdHlwZSwgYXMge0BsaW5rIG9iamVjdFR5cGVHdWFyZH0gdGFrZXMgdGhlbS4gRXZlcnkga2V5IG9mIGBUYCBtdXN0IGJlXG4gKiBsaXN0ZWQuIFRoZSBndWFyZCBvZiBhbiBvcHRpb25hbCBwcm9wZXJ0eSBpcyB0eXBlZCB0byBuYXJyb3cgdG8gYHVuZGVmaW5lZGAgYXMgd2VsbCwgYnV0IGEgZ3VhcmQgdGhhdCByZWZ1c2VzXG4gKiBgdW5kZWZpbmVkYCBzdGlsbCBjb21waWxlcyB0aGVyZSwgc28gd2lkZW4gaXQgd2l0aCB7QGxpbmsgb3B0aW9uYWxUeXBlR3VhcmR9OiBhbiBhYnNlbnQgcHJvcGVydHkgcmVhZHMgYXNcbiAqIGB1bmRlZmluZWRgLCBhbmQgYSBndWFyZCByZWZ1c2luZyBpdCByZWZ1c2VzIHRoZSBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVR5cGVHdWFyZHM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIHJlYWRvbmx5IFtUS2V5IGluIGtleW9mIFRdLT86IFR5cGVHdWFyZDxQYXJ0aWFsPFBpY2s8VCwgVEtleT4+IGV4dGVuZHMgUGljazxULCBUS2V5PiA/IFRbVEtleV0gfCB1bmRlZmluZWQgOiBUW1RLZXldPjtcbn07XG5cbi8qKlxuICogQSBmdW5jdGlvbiBkZWNpZGluZyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBgVGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCB0eXBlIFR5cGVHdWFyZDxUPiA9ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVDtcblxudHlwZSBOdWxsYWJsZUNvbnN0cmFpbnQ8VD4gPSBudWxsIGV4dGVuZHMgVCA/IHVua25vd24gOiB1bmRlZmluZWQgZXh0ZW5kcyBUID8gdW5rbm93biA6IG5ldmVyO1xuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIHRoZSBpdGVtIGd1YXJkIGFjY2VwdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaXRlbS5cbiAqIEBwYXJhbSBpc0l0ZW0gLSBUaGUgZ3VhcmQgZm9yIG9uZSBpdGVtLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUeXBlR3VhcmQ8VD4oaXNJdGVtOiBUeXBlR3VhcmQ8VD4pOiBUeXBlR3VhcmQ8VFtdPiB7XG4gIHJldHVybiAodmFsdWUpOiB2YWx1ZSBpcyBUW10gPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IGlzSXRlbShpdGVtKSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIGB0cnVlYC4gVGhyb3dzIGlmIGl0IGlzIG5vdC5cbiAqXG4gKiBVc2UgaW4gcGxhY2Ugb2YgYC8qIHY4IGlnbm9yZSAqXFwvYCBmb3IgZGVmZW5zaXZlIGd1YXJkcyB0aGF0IHNob3VsZFxuICogbmV2ZXIgdHJpZ2dlciBhdCBydW50aW1lIGJ1dCB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIHVuY292ZXJlZCBicmFuY2hlcy5cbiAqXG4gKiBAcGFyYW0gaXNUcnVlIC0gVGhlIGNvbmRpdGlvbiB0byBhc3NlcnQuXG4gKiBAcGFyYW0gZXJyb3JPck1lc3NhZ2UgLSBUaGUgZXJyb3Igb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgY29uZGl0aW9uIGlzIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoaXNUcnVlOiBib29sZWFuLCBlcnJvck9yTWVzc2FnZTogRXJyb3IgfCBzdHJpbmcpOiBhc3NlcnRzIGlzVHJ1ZSB7XG4gIGlmICghaXNUcnVlKSB7XG4gICAgdGhyb3cgdHlwZW9mIGVycm9yT3JNZXNzYWdlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlcnJvck9yTWVzc2FnZSkgOiBlcnJvck9yTWVzc2FnZTtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBhIHZhbHVlIGlzIGEgZ2VuZXJpYyBvYmplY3QsIG5hcnJvd2luZyBpdHMgdHlwZSBpbiBwbGFjZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gX29iamVjdCAtIFRoZSB2YWx1ZSB0byBhc3NlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRHZW5lcmljT2JqZWN0PFQ+KF9vYmplY3Q6IFQpOiBhc3NlcnRzIF9vYmplY3QgaXMgR2VuZXJpY09iamVjdDxUPiB7XG4gIG5vb3AoKTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIGF0IGNvbXBpbGUgdGltZSB0aGF0IGV2ZXJ5IGNhc2Ugb2YgYSBkaXNjcmltaW5hdGVkIHVuaW9uIGhhcyBiZWVuXG4gKiBoYW5kbGVkLiBQbGFjZSBhdCB0aGUgYGRlZmF1bHRgIGJyYW5jaCBvZiBhIGBzd2l0Y2hgIG92ZXIgYSB1bmlvbiBvciBlbnVtLlxuICpcbiAqIElmIGEgbmV3IHZhcmlhbnQgaXMgYWRkZWQgdG8gdGhlIHVuaW9uIHdpdGhvdXQgYSBtYXRjaGluZyBgY2FzZWAsIHRoZSBjYWxsXG4gKiB0byB7QGxpbmsgYXNzZXJ0TmV2ZXJ9IGZhaWxzIHRvIGNvbXBpbGUgYmVjYXVzZSBgdmFsdWVgIGlzIG5vIGxvbmdlciBgbmV2ZXJgLlxuICogSWYgcmVhY2hlZCBhdCBydW50aW1lIChlLmcuIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBieXBhc3NlZCB2aWEgSlNPTiBvciBhXG4gKiB0eXBlIGFzc2VydGlvbiksIGl0IHRocm93cyBhIGRlc2NyaXB0aXZlIGBFcnJvcmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBzd2l0Y2ggKG1vZGUpIHtcbiAqICAgY2FzZSAnYSc6IHJldHVybiBkb0EoKTtcbiAqICAgY2FzZSAnYic6IHJldHVybiBkb0IoKTtcbiAqICAgZGVmYXVsdDogYXNzZXJ0TmV2ZXIobW9kZSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgZXhoYXVzdGl2ZWx5LWhhbmRsZWQgdmFsdWUsIG5hcnJvd2VkIHRvIGBuZXZlcmAgYnkgY29udHJvbCBmbG93LlxuICogQHRocm93cyBBbHdheXMsIGlmIHJlYWNoZWQgYXQgcnVudGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlOiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgdmFsdWU6ICR7U3RyaW5nKHZhbHVlKX1gKTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBub3QgYG51bGxgIG9yIGB1bmRlZmluZWRgLCBuYXJyb3dpbmcgaXRzIHR5cGUgaW4gcGxhY2UuXG4gKlxuICogT25seSBjYWxsYWJsZSB3aGVuIGBUYCBpbmNsdWRlcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuIFBhc3NpbmcgYW4gYWxyZWFkeSBub24tbnVsbGFibGUgdHlwZSBpcyBhIGNvbXBpbGUgZXJyb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIGVycm9yT3JNZXNzYWdlIC0gT3B0aW9uYWwge0BsaW5rIEVycm9yfSBvciBlcnJvciBtZXNzYWdlIHN0cmluZy5cbiAqIEB0aHJvd3MgSWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk51bGxhYmxlPFQgZXh0ZW5kcyBOdWxsYWJsZUNvbnN0cmFpbnQ8VD4+KHZhbHVlOiBULCBlcnJvck9yTWVzc2FnZT86IEVycm9yIHwgc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZXJyb3JPck1lc3NhZ2UgPz89IHZhbHVlID09PSBudWxsID8gJ1ZhbHVlIGlzIG51bGwnIDogJ1ZhbHVlIGlzIHVuZGVmaW5lZCc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIGVycm9yT3JNZXNzYWdlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlcnJvck9yTWVzc2FnZSkgOiBlcnJvck9yTWVzc2FnZTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGEgdmFsdWUgaXMgYSBnZW5lcmljIG9iamVjdCwgcmV0dXJuaW5nIGl0IHdpdGggbmFycm93ZWQgdHlwZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSB2YWx1ZSB0byBlbnN1cmUuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgYXMgYSBnZW5lcmljIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUdlbmVyaWNPYmplY3Q8VD4oJG9iamVjdDogVCk6IEdlbmVyaWNPYmplY3Q8VD4ge1xuICByZXR1cm4gJG9iamVjdCBhcyBHZW5lcmljT2JqZWN0PFQ+O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIG5vdCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYW5kIHJldHVybnMgaXQgd2l0aCBuYXJyb3dlZCB0eXBlLlxuICpcbiAqIE9ubHkgY2FsbGFibGUgd2hlbiBgVGAgaW5jbHVkZXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLiBQYXNzaW5nIGFuIGFscmVhZHkgbm9uLW51bGxhYmxlIHR5cGUgaXMgYSBjb21waWxlIGVycm9yLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBlcnJvck9yTWVzc2FnZSAtIE9wdGlvbmFsIHtAbGluayBFcnJvcn0gb3IgZXJyb3IgbWVzc2FnZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgd2l0aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGV4Y2x1ZGVkIGZyb20gaXRzIHR5cGUuXG4gKiBAdGhyb3dzIElmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVOb25OdWxsYWJsZTxUIGV4dGVuZHMgTnVsbGFibGVDb25zdHJhaW50PFQ+Pih2YWx1ZTogVCwgZXJyb3JPck1lc3NhZ2U/OiBFcnJvciB8IHN0cmluZyk6IE5vbk51bGxhYmxlPFQ+IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUodmFsdWUsIGVycm9yT3JNZXNzYWdlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbnkgZnVuY3Rpb24sIG5hcnJvd2VkIHRvIHRoZSBzaWduYXR1cmUgYFRGdW5jdGlvbmAuIE9ubHkgdGhhdCB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogaXMgY2hlY2tlZDogYSBzaWduYXR1cmUgY2Fubm90IGJlIGNoZWNrZWQgYXQgcnVudGltZSwgc28gdGhlIGd1YXJkIHRydXN0cyBpdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRGdW5jdGlvbiAtIFRoZSBzaWduYXR1cmUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVHdWFyZDxURnVuY3Rpb24gZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24+KCk6IFR5cGVHdWFyZDxURnVuY3Rpb24+IHtcbiAgcmV0dXJuICh2YWx1ZSk6IHZhbHVlIGlzIFRGdW5jdGlvbiA9PiBpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcywgb3Igb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mVHlwZUd1YXJkPFQ+KGNvbnN0cnVjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3VtZW50c186IG5ldmVyW10pID0+IFQpOiBUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgVCA9PiB2YWx1ZSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBib29sZWFuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgR2VuZXJpY0Z1bmN0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBudW1iZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYW4gb2JqZWN0OiBub3QgYG51bGxgLCBhbmQgbm90IGEgcHJpbWl0aXZlIG9yIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgd2hvc2UgZXZlcnkgaXRlbSBpcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShpc1N0cmluZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGtleXMgb2YgYSByZWNvcmQuIFR5cGluZyB0aGUgcmVjb3JkIG92ZXIgYSB1bmlvbiwgYXNcbiAqIGBsaXRlcmFsVHlwZUd1YXJkPE1vZGU+KHsgQTogdHJ1ZSwgQjogdHJ1ZSB9KWAsIG1ha2VzIGEgbWVtYmVyIGxhdGVyIGFkZGVkIHRvIHRoZSB1bmlvbiBmYWlsIHRvIGNvbXBpbGUgdW50aWxcbiAqIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbFR5cGVHdWFyZDxUIGV4dGVuZHMgc3RyaW5nPihsaXRlcmFsczogUmVhZG9ubHk8UmVjb3JkPFQsIHRydWU+Pik6IFR5cGVHdWFyZDxUPjtcbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGxpc3RlZCB2YWx1ZXMsIGNvbXBhcmVkIGFzIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIGNvbXBhcmVzIHRoZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIFRoZSBhY2NlcHRlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsVHlwZUd1YXJkPFQgZXh0ZW5kcyBMaXRlcmFsPihsaXRlcmFsczogcmVhZG9ubHkgVFtdKTogVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsVHlwZUd1YXJkKGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB0cnVlPj4gfCByZWFkb25seSBMaXRlcmFsW10pOiBUeXBlR3VhcmQ8TGl0ZXJhbD4ge1xuICBpZiAoaXNSZWFkb25seUFycmF5KGxpdGVyYWxzKSkge1xuICAgIGNvbnN0IGxpdGVyYWxMaXN0OiByZWFkb25seSB1bmtub3duW10gPSBsaXRlcmFscztcbiAgICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgTGl0ZXJhbCA9PiBsaXRlcmFsTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgTGl0ZXJhbCA9PiBpc1N0cmluZyh2YWx1ZSkgJiYgT2JqZWN0Lmhhc093bihsaXRlcmFscywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBpc1ZhbHVlIC0gVGhlIGd1YXJkIHRvIHdpZGVuLlxuICogQHJldHVybnMgQSBndWFyZCBhY2NlcHRpbmcgd2hhdCBgaXNWYWx1ZWAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVUeXBlR3VhcmQ8VD4oaXNWYWx1ZTogVHlwZUd1YXJkPFQ+KTogVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB1bmlvblR5cGVHdWFyZChpc051bGwsIGlzVmFsdWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBvYmplY3Qgd2hvc2UgZXZlcnkgbGlzdGVkIHByb3BlcnR5IGl0cyBndWFyZCBhY2NlcHRzLiBBIHByb3BlcnR5IGlzIHJlYWQgd2l0aFxuICogYFJlZmxlY3QuZ2V0YCwgc28gYW4gaW5oZXJpdGVkIG9uZSBjb3VudHMgYW5kIGFuIGFic2VudCBvbmUgcmVhZHMgYXMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlLlxuICogQHBhcmFtIHByb3BlcnR5VHlwZUd1YXJkcyAtIE9uZSBndWFyZCBwZXIgcHJvcGVydHkgb2YgYFRgLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIGd1YXJkLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0VHlwZUd1YXJkPFQgZXh0ZW5kcyBvYmplY3Q+KHByb3BlcnR5VHlwZUd1YXJkczogUHJvcGVydHlUeXBlR3VhcmRzPFQ+LCBvcHRpb25zPzogT2JqZWN0VHlwZUd1YXJkT3B0aW9ucyk6IFR5cGVHdWFyZDxUPiB7XG4gIGNvbnN0IHNob3VsZFJlamVjdFVua25vd25LZXlzID0gb3B0aW9ucz8uc2hvdWxkUmVqZWN0VW5rbm93bktleXMgPz8gZmFsc2U7XG4gIHJldHVybiAodmFsdWUpOiB2YWx1ZSBpcyBUID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWplY3RVbmtub3duS2V5cyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkuc29tZSgoa2V5KSA9PiAhT2JqZWN0Lmhhc093bihwcm9wZXJ0eVR5cGVHdWFyZHMsIGtleSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcGVydHlUeXBlR3VhcmRzKSB7XG4gICAgICBpZiAoIXByb3BlcnR5VHlwZUd1YXJkc1trZXldKFJlZmxlY3QuZ2V0KHZhbHVlLCBrZXkpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcHJvcGVydHkgb3IgcGFyYW1ldGVyIHJlYWRzIGFzIHdoZW4gaXQgaXNcbiAqIGxlZnQgb3V0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIGlzVmFsdWUgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBpc1ZhbHVlYCBhY2NlcHRzLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsVHlwZUd1YXJkPFQ+KGlzVmFsdWU6IFR5cGVHdWFyZDxUPik6IFR5cGVHdWFyZDxUIHwgdW5kZWZpbmVkPiB7XG4gIHJldHVybiB1bmlvblR5cGVHdWFyZChpc1VuZGVmaW5lZCwgaXNWYWx1ZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYW55IG9mIHRoZSBnaXZlbiBndWFyZHMgYWNjZXB0cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRUeXBlR3VhcmRzIC0gVGhlIGd1YXJkcy5cbiAqIEBwYXJhbSB0eXBlR3VhcmRzIC0gVGhlIGd1YXJkcywgdHJpZWQgaW4gb3JkZXIuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlvblR5cGVHdWFyZDxjb25zdCBUVHlwZUd1YXJkcyBleHRlbmRzIHJlYWRvbmx5IFR5cGVHdWFyZDx1bmtub3duPltdPihcbiAgLi4udHlwZUd1YXJkczogVFR5cGVHdWFyZHNcbik6IFR5cGVHdWFyZDxHdWFyZGVkVHlwZTxUVHlwZUd1YXJkc1tudW1iZXJdPj4ge1xuICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgR3VhcmRlZFR5cGU8VFR5cGVHdWFyZHNbbnVtYmVyXT4gPT4gdHlwZUd1YXJkcy5zb21lKCh0eXBlR3VhcmQpID0+IHR5cGVHdWFyZCh2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBpc1JlYWRvbmx5QXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyByZWFkb25seSB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVlBLFNBQVMsWUFBWTtBQTZEZCxTQUFTLGVBQWtCLFFBQXNDO0FBQ3RFLFNBQU8sQ0FBQyxVQUF3QixNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLFNBQVMsT0FBTyxJQUFJLENBQUM7QUFDNUY7QUFXTyxTQUFTLE9BQU8sUUFBaUIsZ0JBQWdEO0FBQ3RGLE1BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxPQUFPLG1CQUFtQixXQUFXLElBQUksTUFBTSxjQUFjLElBQUk7QUFBQSxFQUN6RTtBQUNGO0FBUU8sU0FBUyxvQkFBdUIsU0FBaUQ7QUFDdEYsT0FBSztBQUNQO0FBdUJPLFNBQVMsWUFBWSxPQUFxQjtBQUMvQyxRQUFNLElBQUksTUFBTSxvQkFBb0IsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUNyRDtBQVlPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWtFO0FBQzdJLE1BQUksVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN6QztBQUFBLEVBQ0Y7QUFFQSxxQkFBbUIsVUFBVSxPQUFPLGtCQUFrQjtBQUN0RCxRQUFNLFFBQVEsT0FBTyxtQkFBbUIsV0FBVyxJQUFJLE1BQU0sY0FBYyxJQUFJO0FBQy9FLFFBQU07QUFDUjtBQVNPLFNBQVMsb0JBQXVCLFNBQThCO0FBQ25FLFNBQU87QUFDVDtBQWFPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWlEO0FBQzVILG9CQUFrQixPQUFPLGNBQWM7QUFDdkMsU0FBTztBQUNUO0FBU08sU0FBUyxvQkFBNkU7QUFDM0YsU0FBTyxDQUFDLFVBQThCLFdBQVcsS0FBSztBQUN4RDtBQVNPLFNBQVMsb0JBQXVCLGFBQXVFO0FBQzVHLFNBQU8sQ0FBQyxVQUFzQixpQkFBaUI7QUFDakQ7QUFRTyxTQUFTLFVBQVUsT0FBa0M7QUFDMUQsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFRTyxTQUFTLFdBQVcsT0FBMEM7QUFDbkUsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFRTyxTQUFTLE9BQU8sT0FBK0I7QUFDcEQsU0FBTyxVQUFVO0FBQ25CO0FBUU8sU0FBUyxTQUFTLE9BQWlDO0FBQ3hELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBUU8sU0FBUyxTQUFTLE9BQWlDO0FBQ3hELFNBQU8sT0FBTyxVQUFVLFlBQVksVUFBVTtBQUNoRDtBQVFPLFNBQVMsU0FBUyxPQUFpQztBQUN4RCxTQUFPLE9BQU8sVUFBVTtBQUMxQjtBQVFPLFNBQVMsY0FBYyxPQUFtQztBQUMvRCxTQUFPLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxNQUFNLFFBQVE7QUFDckQ7QUFRTyxTQUFTLFlBQVksT0FBb0M7QUFDOUQsU0FBTyxVQUFVO0FBQ25CO0FBMEJPLFNBQVMsaUJBQWlCLFVBQW1GO0FBQ2xILE1BQUksZ0JBQWdCLFFBQVEsR0FBRztBQUM3QixVQUFNLGNBQWtDO0FBQ3hDLFdBQU8sQ0FBQyxVQUE0QixZQUFZLFNBQVMsS0FBSztBQUFBLEVBQ2hFO0FBRUEsU0FBTyxDQUFDLFVBQTRCLFNBQVMsS0FBSyxLQUFLLE9BQU8sT0FBTyxVQUFVLEtBQUs7QUFDdEY7QUFTTyxTQUFTLGtCQUFxQixTQUE0QztBQUMvRSxTQUFPLGVBQWUsUUFBUSxPQUFPO0FBQ3ZDO0FBV08sU0FBUyxnQkFBa0Msb0JBQTJDLFNBQWdEO0FBQzNJLFFBQU0sMEJBQTBCLFNBQVMsMkJBQTJCO0FBQ3BFLFNBQU8sQ0FBQyxVQUFzQjtBQUM1QixRQUFJLENBQUMsU0FBUyxLQUFLLEdBQUc7QUFDcEIsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLDJCQUEyQixPQUFPLEtBQUssS0FBSyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxPQUFPLG9CQUFvQixHQUFHLENBQUMsR0FBRztBQUN4RyxhQUFPO0FBQUEsSUFDVDtBQUVBLGVBQVcsT0FBTyxvQkFBb0I7QUFDcEMsVUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQUc7QUFDckQsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVVPLFNBQVMsa0JBQXFCLFNBQWlEO0FBQ3BGLFNBQU8sZUFBZSxhQUFhLE9BQU87QUFDNUM7QUFTTyxTQUFTLGtCQUNYLFlBQzBDO0FBQzdDLFNBQU8sQ0FBQyxVQUFxRCxXQUFXLEtBQUssQ0FBQyxjQUFjLFVBQVUsS0FBSyxDQUFDO0FBQzlHO0FBRUEsU0FBUyxnQkFBZ0IsT0FBNkM7QUFDcEUsU0FBTyxNQUFNLFFBQVEsS0FBSztBQUM1QjsiLAogICJuYW1lcyI6IFtdCn0K