@mnaoumov/typescript-lib 1.3.0 → 1.5.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
@@ -1,6 +1,7 @@
1
1
  /// <reference path="./library-references.d.mts" />
2
2
  export * as 'abort-controller' from './abort-controller.mjs';
3
3
  export * as 'aggregate-error' from './aggregate-error.mjs';
4
+ export * as 'api-contract-verifier' from './api-contract-verifier.mjs';
4
5
  export * as 'api-contract' from './api-contract.mjs';
5
6
  export * as 'array-buffer' from './array-buffer.mjs';
6
7
  export * as 'array' from './array.mjs';
@@ -11,6 +12,7 @@ export * as 'beeper' from './beeper.mjs';
11
12
  export * as 'blob' from './blob.mjs';
12
13
  export * as 'bytes' from './bytes.mjs';
13
14
  export * as 'debug-controller' from './debug-controller.mjs';
15
+ export * as 'debug-switches' from './debug-switches.mjs';
14
16
  export * as 'debug' from './debug.mjs';
15
17
  export * as 'desktop-zip-extractor' from './desktop-zip-extractor.mjs';
16
18
  export * as 'disposable' from './disposable.mjs';
@@ -5,6 +5,7 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  import * as abort_controller from "./abort-controller.mjs";
7
7
  import * as aggregate_error from "./aggregate-error.mjs";
8
+ import * as api_contract_verifier from "./api-contract-verifier.mjs";
8
9
  import * as api_contract from "./api-contract.mjs";
9
10
  import * as array_buffer from "./array-buffer.mjs";
10
11
  import * as array from "./array.mjs";
@@ -15,6 +16,7 @@ import * as beeper from "./beeper.mjs";
15
16
  import * as blob from "./blob.mjs";
16
17
  import * as bytes from "./bytes.mjs";
17
18
  import * as debug_controller from "./debug-controller.mjs";
19
+ import * as debug_switches from "./debug-switches.mjs";
18
20
  import * as debug from "./debug.mjs";
19
21
  import * as desktop_zip_extractor from "./desktop-zip-extractor.mjs";
20
22
  import * as disposable from "./disposable.mjs";
@@ -40,6 +42,7 @@ export {
40
42
  abort_controller as "abort-controller",
41
43
  aggregate_error as "aggregate-error",
42
44
  api_contract as "api-contract",
45
+ api_contract_verifier as "api-contract-verifier",
43
46
  array,
44
47
  array_buffer as "array-buffer",
45
48
  async,
@@ -50,6 +53,7 @@ export {
50
53
  bytes,
51
54
  debug,
52
55
  debug_controller as "debug-controller",
56
+ debug_switches as "debug-switches",
53
57
  desktop_zip_extractor as "desktop-zip-extractor",
54
58
  disposable,
55
59
  enum2 as enum,
@@ -71,4 +75,4 @@ export {
71
75
  value_provider as "value-provider",
72
76
  value_wrapper as "value-wrapper"
73
77
  };
74
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1ZycgZnJvbSAnLi9kZWJ1Zy50cyc7XG5leHBvcnQgKiBhcyAnZGVza3RvcC16aXAtZXh0cmFjdG9yJyBmcm9tICcuL2Rlc2t0b3AtemlwLWV4dHJhY3Rvci50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZScgZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcbmV4cG9ydCAqIGFzICdlbnVtJyBmcm9tICcuL2VudW0udHMnO1xuZXhwb3J0ICogYXMgJ2Vycm9yJyBmcm9tICcuL2Vycm9yLnRzJztcbmV4cG9ydCAqIGFzICdmdW5jdGlvbicgZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5leHBvcnQgKiBhcyAnaHRtbC1lbGVtZW50JyBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5leHBvcnQgKiBhcyAnanBlZy1tZXRhZGF0YScgZnJvbSAnLi9qcGVnLW1ldGFkYXRhLnRzJztcbmV4cG9ydCAqIGFzICdsaWJyYXJ5JyBmcm9tICcuL2xpYnJhcnkudHMnO1xuZXhwb3J0ICogYXMgJ29iamVjdC11dGlscycgZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuZXhwb3J0ICogYXMgJ3BhdGgnIGZyb20gJy4vcGF0aC50cyc7XG5leHBvcnQgKiBhcyAncmVnLWV4cCcgZnJvbSAnLi9yZWctZXhwLnRzJztcbmV4cG9ydCAqIGFzICdzdHJpbmcnIGZyb20gJy4vc3RyaW5nLnRzJztcbmV4cG9ydCAqIGFzICd0cmFuc2Zvcm1lcnMnIGZyb20gJy4vdHJhbnNmb3JtZXJzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzICd0d28td2F5LW1hcCcgZnJvbSAnLi90d28td2F5LW1hcC50cyc7XG5leHBvcnQgKiBhcyAndHlwZS1ndWFyZHMnIGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUnIGZyb20gJy4vdHlwZS50cyc7XG5leHBvcnQgKiBhcyAndHlwZXNjcmlwdC1saWItc3RhdGUnIGZyb20gJy4vdHlwZXNjcmlwdC1saWItc3RhdGUudHMnO1xuZXhwb3J0ICogYXMgJ3VybCcgZnJvbSAnLi91cmwudHMnO1xuZXhwb3J0ICogYXMgJ3ZhbHVlLXByb3ZpZGVyJyBmcm9tICcuL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS13cmFwcGVyJyBmcm9tICcuL3ZhbHVlLXdyYXBwZXIudHMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFFQSxZQUFZQSxzQkFBd0I7QUFDcEMsWUFBWUMscUJBQXVCO0FBQ25DLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxrQkFBb0I7QUFDaEMsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQywwQkFBNEI7QUFDeEMsWUFBWSxXQUFhO0FBQ3pCLFlBQVksWUFBYztBQUMxQixZQUFZLFVBQVk7QUFDeEIsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLHNCQUF3QjtBQUNwQyxZQUFZLFdBQWE7QUFDekIsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksZ0JBQWtCO0FBQzlCLFlBQVlDLFdBQVk7QUFDeEIsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGVBQWdCO0FBQzVCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxtQkFBcUI7QUFDakMsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFVBQVk7QUFDeEIsWUFBWUMsYUFBZTtBQUMzQixZQUFZLFlBQWM7QUFDMUIsWUFBWSxrQkFBb0I7QUFDaEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVksU0FBVztBQUN2QixZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWUMsbUJBQXFCOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1jb250cm9sbGVyIiwgImFnZ3JlZ2F0ZS1lcnJvciIsICJhcGktY29udHJhY3QiLCAiYXJyYXktYnVmZmVyIiwgImFzeW5jLWV2ZW50cyIsICJhc3luYy1vcGVyYXRpb24taG9vayIsICJkZWJ1Zy1jb250cm9sbGVyIiwgImRlc2t0b3AtemlwLWV4dHJhY3RvciIsICJlbnVtIiwgImZ1bmN0aW9uIiwgImh0bWwtZWxlbWVudCIsICJqcGVnLW1ldGFkYXRhIiwgIm9iamVjdC11dGlscyIsICJyZWctZXhwIiwgInR3by13YXktbWFwIiwgInR5cGUtZ3VhcmRzIiwgInR5cGVzY3JpcHQtbGliLXN0YXRlIiwgInZhbHVlLXByb3ZpZGVyIiwgInZhbHVlLXdyYXBwZXIiXQp9Cg==
78
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0LXZlcmlmaWVyJyBmcm9tICcuL2FwaS1jb250cmFjdC12ZXJpZmllci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1Zy1zd2l0Y2hlcycgZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWcnIGZyb20gJy4vZGVidWcudHMnO1xuZXhwb3J0ICogYXMgJ2Rlc2t0b3AtemlwLWV4dHJhY3RvcicgZnJvbSAnLi9kZXNrdG9wLXppcC1leHRyYWN0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUnIGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5leHBvcnQgKiBhcyAnZW51bScgZnJvbSAnLi9lbnVtLnRzJztcbmV4cG9ydCAqIGFzICdlcnJvcicgZnJvbSAnLi9lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnZnVuY3Rpb24nIGZyb20gJy4vZnVuY3Rpb24udHMnO1xuZXhwb3J0ICogYXMgJ2h0bWwtZWxlbWVudCcgZnJvbSAnLi9odG1sLWVsZW1lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2pwZWctbWV0YWRhdGEnIGZyb20gJy4vanBlZy1tZXRhZGF0YS50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeScgZnJvbSAnLi9saWJyYXJ5LnRzJztcbmV4cG9ydCAqIGFzICdvYmplY3QtdXRpbHMnIGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGVzY3JpcHQtbGliLXN0YXRlJyBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICd1cmwnIGZyb20gJy4vdXJsLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS1wcm92aWRlcicgZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5leHBvcnQgKiBhcyAndmFsdWUtd3JhcHBlcicgZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsc0JBQXdCO0FBQ3BDLFlBQVlDLHFCQUF1QjtBQUNuQyxZQUFZQywyQkFBNkI7QUFDekMsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFdBQWE7QUFDekIsWUFBWUMsa0JBQW9CO0FBQ2hDLFlBQVlDLDBCQUE0QjtBQUN4QyxZQUFZLFdBQWE7QUFDekIsWUFBWSxZQUFjO0FBQzFCLFlBQVksVUFBWTtBQUN4QixZQUFZLFdBQWE7QUFDekIsWUFBWUMsc0JBQXdCO0FBQ3BDLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZLFdBQWE7QUFDekIsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksZ0JBQWtCO0FBQzlCLFlBQVlDLFdBQVk7QUFDeEIsWUFBWSxXQUFhO0FBQ3pCLFlBQVlDLGVBQWdCO0FBQzVCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZQyxtQkFBcUI7QUFDakMsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLGtCQUFvQjtBQUNoQyxZQUFZLFVBQVk7QUFDeEIsWUFBWUMsYUFBZTtBQUMzQixZQUFZLFlBQWM7QUFDMUIsWUFBWSxrQkFBb0I7QUFDaEMsWUFBWUMsaUJBQW1CO0FBQy9CLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZLFVBQVk7QUFDeEIsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVksU0FBVztBQUN2QixZQUFZQyxvQkFBc0I7QUFDbEMsWUFBWUMsbUJBQXFCOyIsCiAgIm5hbWVzIjogWyJhYm9ydC1jb250cm9sbGVyIiwgImFnZ3JlZ2F0ZS1lcnJvciIsICJhcGktY29udHJhY3QtdmVyaWZpZXIiLCAiYXBpLWNvbnRyYWN0IiwgImFycmF5LWJ1ZmZlciIsICJhc3luYy1ldmVudHMiLCAiYXN5bmMtb3BlcmF0aW9uLWhvb2siLCAiZGVidWctY29udHJvbGxlciIsICJkZWJ1Zy1zd2l0Y2hlcyIsICJkZXNrdG9wLXppcC1leHRyYWN0b3IiLCAiZW51bSIsICJmdW5jdGlvbiIsICJodG1sLWVsZW1lbnQiLCAianBlZy1tZXRhZGF0YSIsICJvYmplY3QtdXRpbHMiLCAicmVnLWV4cCIsICJ0d28td2F5LW1hcCIsICJ0eXBlLWd1YXJkcyIsICJ0eXBlc2NyaXB0LWxpYi1zdGF0ZSIsICJ2YWx1ZS1wcm92aWRlciIsICJ2YWx1ZS13cmFwcGVyIl0KfQo=
@@ -27,8 +27,22 @@ export type GuardedType<TTypeGuard> = TTypeGuard extends (value: unknown) => val
27
27
  export type Literal = bigint | boolean | null | number | string | symbol | undefined;
28
28
  /**
29
29
  * Options for {@link objectTypeGuard}.
30
+ *
31
+ * @typeParam T - The object type the guard narrows to.
30
32
  */
31
- export interface ObjectTypeGuardOptions {
33
+ export interface ObjectTypeGuardOptions<T extends object = object> {
34
+ /**
35
+ * Switches the guard to EXACT optional properties, reading only the value's OWN keys. Listing it is the switch,
36
+ * so pass `{}` for a type with no optional key.
37
+ *
38
+ * Every optional key of `T` must be listed, so an optional property later added to `T` fails to compile until it
39
+ * is. A listed key may then be absent, and its guard is not run; present, even as `undefined`, it must pass its
40
+ * guard. Any other key must be present. An inherited key counts as absent.
41
+ *
42
+ * Without it, a property is read with `Reflect.get`, so an inherited one counts and an absent one reads as
43
+ * `undefined`, which the guard of an optional property must then accept.
44
+ */
45
+ readonly exactOptionalKeys?: Readonly<Record<OptionalKeys<T>, true>>;
32
46
  /**
33
47
  * Whether a value carrying an own enumerable string key that no property guard names is refused.
34
48
  *
@@ -36,6 +50,12 @@ export interface ObjectTypeGuardOptions {
36
50
  */
37
51
  readonly shouldRejectUnknownKeys?: boolean;
38
52
  }
53
+ /**
54
+ * The keys of an object type that are optional.
55
+ *
56
+ * @typeParam T - The object type.
57
+ */
58
+ export type OptionalKeys<T extends object> = OptionalKeyMap<T>[keyof T];
39
59
  /**
40
60
  * One type guard per property of an object type, as {@link objectTypeGuard} takes them. Every key of `T` must be
41
61
  * listed. The guard of an optional property is typed to narrow to `undefined` as well, but a guard that refuses
@@ -54,6 +74,9 @@ export type PropertyTypeGuards<T extends object> = {
54
74
  */
55
75
  export type TypeGuard<T> = (value: unknown) => value is T;
56
76
  type NullableConstraint<T> = null extends T ? unknown : undefined extends T ? unknown : never;
77
+ type OptionalKeyMap<T extends object> = {
78
+ [TKey in keyof T]-?: Partial<Pick<T, TKey>> extends Pick<T, TKey> ? TKey : never;
79
+ };
57
80
  /**
58
81
  * Builds a guard accepting an array whose every item the item guard accepts.
59
82
  *
@@ -232,14 +255,15 @@ export declare function literalTypeGuard<T extends Literal>(literals: readonly T
232
255
  export declare function nullableTypeGuard<T>(isValue: TypeGuard<T>): TypeGuard<null | T>;
233
256
  /**
234
257
  * 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`.
258
+ * `Reflect.get`, so an inherited one counts and an absent one reads as `undefined`, unless
259
+ * {@link ObjectTypeGuardOptions.exactOptionalKeys} switches the guard to own keys and exact optional properties.
236
260
  *
237
261
  * @typeParam T - The object type.
238
262
  * @param propertyTypeGuards - One guard per property of `T`.
239
263
  * @param options - The options for the guard.
240
264
  * @returns The guard.
241
265
  */
242
- export declare function objectTypeGuard<T extends object>(propertyTypeGuards: PropertyTypeGuards<T>, options?: ObjectTypeGuardOptions): TypeGuard<T>;
266
+ export declare function objectTypeGuard<T extends object>(propertyTypeGuards: PropertyTypeGuards<T>, options?: ObjectTypeGuardOptions<T>): TypeGuard<T>;
243
267
  /**
244
268
  * Widens a guard to also accept `undefined`, which is what an optional property or parameter reads as when it is
245
269
  * left out.
@@ -75,6 +75,7 @@ function nullableTypeGuard(isValue) {
75
75
  }
76
76
  function objectTypeGuard(propertyTypeGuards, options) {
77
77
  const shouldRejectUnknownKeys = options?.shouldRejectUnknownKeys ?? false;
78
+ const exactOptionalKeys = options?.exactOptionalKeys;
78
79
  return (value) => {
79
80
  if (!isObject(value)) {
80
81
  return false;
@@ -82,8 +83,15 @@ function objectTypeGuard(propertyTypeGuards, options) {
82
83
  if (shouldRejectUnknownKeys && Object.keys(value).some((key) => !Object.hasOwn(propertyTypeGuards, key))) {
83
84
  return false;
84
85
  }
85
- for (const key in propertyTypeGuards) {
86
- if (!propertyTypeGuards[key](Reflect.get(value, key))) {
86
+ const typeGuards = propertyTypeGuards;
87
+ for (const [key, typeGuard] of Object.entries(typeGuards)) {
88
+ if (exactOptionalKeys && !Object.hasOwn(value, key)) {
89
+ if (Object.hasOwn(exactOptionalKeys, key)) {
90
+ continue;
91
+ }
92
+ return false;
93
+ }
94
+ if (!typeGuard(Reflect.get(value, key))) {
87
95
  return false;
88
96
  }
89
97
  }
@@ -123,4 +131,4 @@ export {
123
131
  optionalTypeGuard,
124
132
  unionTypeGuard
125
133
  };
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+IHR5cGVHdWFyZCh2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBpc1JlYWRvbmx5QXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyByZWFkb25seSB1bmtub3duW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVlBLFNBQVMsWUFBWTtBQTZEZCxTQUFTLGVBQWtCLFFBQXNDO0FBQ3RFLFNBQU8sQ0FBQyxVQUF3QixNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxDQUFDLFNBQVMsT0FBTyxJQUFJLENBQUM7QUFDNUY7QUFXTyxTQUFTLE9BQU8sUUFBaUIsZ0JBQWdEO0FBQ3RGLE1BQUksQ0FBQyxRQUFRO0FBQ1gsVUFBTSxPQUFPLG1CQUFtQixXQUFXLElBQUksTUFBTSxjQUFjLElBQUk7QUFBQSxFQUN6RTtBQUNGO0FBUU8sU0FBUyxvQkFBdUIsU0FBaUQ7QUFDdEYsT0FBSztBQUNQO0FBdUJPLFNBQVMsWUFBWSxPQUFxQjtBQUMvQyxRQUFNLElBQUksTUFBTSxvQkFBb0IsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUNyRDtBQVlPLFNBQVMsa0JBQW1ELE9BQVUsZ0JBQWtFO0FBQzdJLE1BQUksVUFBVSxRQUFRLFVBQVUsUUFBVztBQUN6QztBQUFBLEVBQ0Y7QUFFQSxxQkFBbUIs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
134
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3R5cGUtZ3VhcmRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHR5cGUgZ3VhcmRzLCBhbmQgY29tYmluYXRvcnMgdGhhdCBidWlsZCBhIHtAbGluayBUeXBlR3VhcmR9IG91dCBvZiBvdGhlcnMuXG4gKlxuICogVGhlIGNvbWJpbmF0b3JzIGhlcmUgd29yayBvbiBiYXJlIHR5cGUgZ3VhcmRzLiBUaGVpciBgYXBpLWNvbnRyYWN0YCBjb3VudGVycGFydHMgKGBhcnJheUd1YXJkYCwgYG9wdGlvbmFsR3VhcmRgLFxuICogLi4uKSB3b3JrIG9uIGFuIGBFeHBlY3RlZFR5cGVHdWFyZGAsIGEgdHlwZSBndWFyZCBwYWlyZWQgd2l0aCB0aGUgdGV4dCBhbiBpc3N1ZSBtZXNzYWdlIHJlcG9ydHMsIGFuZCB0aGVpciBuYW1lc1xuICogZHJvcCB0aGUgYFR5cGVgIHRoaXMgbGF5ZXIncyBuYW1lcyBjYXJyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuXG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5cbi8qKlxuICogQSB0eXBlIHRoYXQgcmVwcmVzZW50cyBhIGdlbmVyaWMgb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBiYXNlIHR5cGUgdG8gaW50ZXJzZWN0IHdpdGguXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmVyaWNPYmplY3Q8VCA9IHVua25vd24+ID0gUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4gJiBUO1xuXG4vKipcbiAqIFRoZSB0eXBlIGEge0BsaW5rIFR5cGVHdWFyZH0gbmFycm93cyB0by4gRGlzdHJpYnV0ZXMgb3ZlciBhIHVuaW9uIG9mIGd1YXJkcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRUeXBlR3VhcmQgLSBUaGUgdHlwZSBndWFyZC5cbiAqL1xuZXhwb3J0IHR5cGUgR3VhcmRlZFR5cGU8VFR5cGVHdWFyZD4gPSBUVHlwZUd1YXJkIGV4dGVuZHMgKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBpbmZlciBUID8gVCA6IG5ldmVyO1xuXG4vKipcbiAqIEEgdmFsdWUge0BsaW5rIGxpdGVyYWxUeXBlR3VhcmR9IGNhbiBjb21wYXJlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCB0eXBlIExpdGVyYWwgPSBiaWdpbnQgfCBib29sZWFuIHwgbnVsbCB8IG51bWJlciB8IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgb2JqZWN0VHlwZUd1YXJkfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0VHlwZUd1YXJkT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBTd2l0Y2hlcyB0aGUgZ3VhcmQgdG8gRVhBQ1Qgb3B0aW9uYWwgcHJvcGVydGllcywgcmVhZGluZyBvbmx5IHRoZSB2YWx1ZSdzIE9XTiBrZXlzLiBMaXN0aW5nIGl0IGlzIHRoZSBzd2l0Y2gsXG4gICAqIHNvIHBhc3MgYHt9YCBmb3IgYSB0eXBlIHdpdGggbm8gb3B0aW9uYWwga2V5LlxuICAgKlxuICAgKiBFdmVyeSBvcHRpb25hbCBrZXkgb2YgYFRgIG11c3QgYmUgbGlzdGVkLCBzbyBhbiBvcHRpb25hbCBwcm9wZXJ0eSBsYXRlciBhZGRlZCB0byBgVGAgZmFpbHMgdG8gY29tcGlsZSB1bnRpbCBpdFxuICAgKiBpcy4gQSBsaXN0ZWQga2V5IG1heSB0aGVuIGJlIGFic2VudCwgYW5kIGl0cyBndWFyZCBpcyBub3QgcnVuOyBwcmVzZW50LCBldmVuIGFzIGB1bmRlZmluZWRgLCBpdCBtdXN0IHBhc3MgaXRzXG4gICAqIGd1YXJkLiBBbnkgb3RoZXIga2V5IG11c3QgYmUgcHJlc2VudC4gQW4gaW5oZXJpdGVkIGtleSBjb3VudHMgYXMgYWJzZW50LlxuICAgKlxuICAgKiBXaXRob3V0IGl0LCBhIHByb3BlcnR5IGlzIHJlYWQgd2l0aCBgUmVmbGVjdC5nZXRgLCBzbyBhbiBpbmhlcml0ZWQgb25lIGNvdW50cyBhbmQgYW4gYWJzZW50IG9uZSByZWFkcyBhc1xuICAgKiBgdW5kZWZpbmVkYCwgd2hpY2ggdGhlIGd1YXJkIG9mIGFuIG9wdGlvbmFsIHByb3BlcnR5IG11c3QgdGhlbiBhY2NlcHQuXG4gICAqL1xuICByZWFkb25seSBleGFjdE9wdGlvbmFsS2V5cz86IFJlYWRvbmx5PFJlY29yZDxPcHRpb25hbEtleXM8VD4sIHRydWU+PjtcblxuICAvKipcbiAgICogV2hldGhlciBhIHZhbHVlIGNhcnJ5aW5nIGFuIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXkgdGhhdCBubyBwcm9wZXJ0eSBndWFyZCBuYW1lcyBpcyByZWZ1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWplY3RVbmtub3duS2V5cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGtleXMgb2YgYW4gb2JqZWN0IHR5cGUgdGhhdCBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlLlxuICovXG5leHBvcnQgdHlwZSBPcHRpb25hbEtleXM8VCBleHRlbmRzIG9iamVjdD4gPSBPcHRpb25hbEtleU1hcDxUPltrZXlvZiBUXTtcblxuLyoqXG4gKiBPbmUgdHlwZSBndWFyZCBwZXIgcHJvcGVydHkgb2YgYW4gb2JqZWN0IHR5cGUsIGFzIHtAbGluayBvYmplY3RUeXBlR3VhcmR9IHRha2VzIHRoZW0uIEV2ZXJ5IGtleSBvZiBgVGAgbXVzdCBiZVxuICogbGlzdGVkLiBUaGUgZ3VhcmQgb2YgYW4gb3B0aW9uYWwgcHJvcGVydHkgaXMgdHlwZWQgdG8gbmFycm93IHRvIGB1bmRlZmluZWRgIGFzIHdlbGwsIGJ1dCBhIGd1YXJkIHRoYXQgcmVmdXNlc1xuICogYHVuZGVmaW5lZGAgc3RpbGwgY29tcGlsZXMgdGhlcmUsIHNvIHdpZGVuIGl0IHdpdGgge0BsaW5rIG9wdGlvbmFsVHlwZUd1YXJkfTogYW4gYWJzZW50IHByb3BlcnR5IHJlYWRzIGFzXG4gKiBgdW5kZWZpbmVkYCwgYW5kIGEgZ3VhcmQgcmVmdXNpbmcgaXQgcmVmdXNlcyB0aGUgb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBvYmplY3QgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvcGVydHlUeXBlR3VhcmRzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBrZXlvZiBUXS0/OiBUeXBlR3VhcmQ8UGFydGlhbDxQaWNrPFQsIFRLZXk+PiBleHRlbmRzIFBpY2s8VCwgVEtleT4gPyBUW1RLZXldIHwgdW5kZWZpbmVkIDogVFtUS2V5XT47XG59O1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gZGVjaWRpbmcgd2hldGhlciBhIHZhbHVlIGlzIGEgYFRgLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgdHlwZSBUeXBlR3VhcmQ8VD4gPSAodmFsdWU6IHVua25vd24pID0+IHZhbHVlIGlzIFQ7XG5cbnR5cGUgTnVsbGFibGVDb25zdHJhaW50PFQ+ID0gbnVsbCBleHRlbmRzIFQgPyB1bmtub3duIDogdW5kZWZpbmVkIGV4dGVuZHMgVCA/IHVua25vd24gOiBuZXZlcjtcblxudHlwZSBPcHRpb25hbEtleU1hcDxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVF0tPzogUGFydGlhbDxQaWNrPFQsIFRLZXk+PiBleHRlbmRzIFBpY2s8VCwgVEtleT4gPyBUS2V5IDogbmV2ZXI7XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIHRoZSBpdGVtIGd1YXJkIGFjY2VwdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaXRlbS5cbiAqIEBwYXJhbSBpc0l0ZW0gLSBUaGUgZ3VhcmQgZm9yIG9uZSBpdGVtLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlUeXBlR3VhcmQ8VD4oaXNJdGVtOiBUeXBlR3VhcmQ8VD4pOiBUeXBlR3VhcmQ8VFtdPiB7XG4gIHJldHVybiAodmFsdWUpOiB2YWx1ZSBpcyBUW10gPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IGlzSXRlbShpdGVtKSk7XG59XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGEgY29uZGl0aW9uIGlzIGB0cnVlYC4gVGhyb3dzIGlmIGl0IGlzIG5vdC5cbiAqXG4gKiBVc2UgaW4gcGxhY2Ugb2YgYC8qIHY4IGlnbm9yZSAqXFwvYCBmb3IgZGVmZW5zaXZlIGd1YXJkcyB0aGF0IHNob3VsZFxuICogbmV2ZXIgdHJpZ2dlciBhdCBydW50aW1lIGJ1dCB3b3VsZCBvdGhlcndpc2UgY3JlYXRlIHVuY292ZXJlZCBicmFuY2hlcy5cbiAqXG4gKiBAcGFyYW0gaXNUcnVlIC0gVGhlIGNvbmRpdGlvbiB0byBhc3NlcnQuXG4gKiBAcGFyYW0gZXJyb3JPck1lc3NhZ2UgLSBUaGUgZXJyb3Igb3IgbWVzc2FnZSB0byB0aHJvdyBpZiB0aGUgY29uZGl0aW9uIGlzIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoaXNUcnVlOiBib29sZWFuLCBlcnJvck9yTWVzc2FnZTogRXJyb3IgfCBzdHJpbmcpOiBhc3NlcnRzIGlzVHJ1ZSB7XG4gIGlmICghaXNUcnVlKSB7XG4gICAgdGhyb3cgdHlwZW9mIGVycm9yT3JNZXNzYWdlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlcnJvck9yTWVzc2FnZSkgOiBlcnJvck9yTWVzc2FnZTtcbiAgfVxufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBhIHZhbHVlIGlzIGEgZ2VuZXJpYyBvYmplY3QsIG5hcnJvd2luZyBpdHMgdHlwZSBpbiBwbGFjZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gX29iamVjdCAtIFRoZSB2YWx1ZSB0byBhc3NlcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRHZW5lcmljT2JqZWN0PFQ+KF9vYmplY3Q6IFQpOiBhc3NlcnRzIF9vYmplY3QgaXMgR2VuZXJpY09iamVjdDxUPiB7XG4gIG5vb3AoKTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIGF0IGNvbXBpbGUgdGltZSB0aGF0IGV2ZXJ5IGNhc2Ugb2YgYSBkaXNjcmltaW5hdGVkIHVuaW9uIGhhcyBiZWVuXG4gKiBoYW5kbGVkLiBQbGFjZSBhdCB0aGUgYGRlZmF1bHRgIGJyYW5jaCBvZiBhIGBzd2l0Y2hgIG92ZXIgYSB1bmlvbiBvciBlbnVtLlxuICpcbiAqIElmIGEgbmV3IHZhcmlhbnQgaXMgYWRkZWQgdG8gdGhlIHVuaW9uIHdpdGhvdXQgYSBtYXRjaGluZyBgY2FzZWAsIHRoZSBjYWxsXG4gKiB0byB7QGxpbmsgYXNzZXJ0TmV2ZXJ9IGZhaWxzIHRvIGNvbXBpbGUgYmVjYXVzZSBgdmFsdWVgIGlzIG5vIGxvbmdlciBgbmV2ZXJgLlxuICogSWYgcmVhY2hlZCBhdCBydW50aW1lIChlLmcuIGJlY2F1c2UgdGhlIHZhbHVlIHdhcyBieXBhc3NlZCB2aWEgSlNPTiBvciBhXG4gKiB0eXBlIGFzc2VydGlvbiksIGl0IHRocm93cyBhIGRlc2NyaXB0aXZlIGBFcnJvcmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBzd2l0Y2ggKG1vZGUpIHtcbiAqICAgY2FzZSAnYSc6IHJldHVybiBkb0EoKTtcbiAqICAgY2FzZSAnYic6IHJldHVybiBkb0IoKTtcbiAqICAgZGVmYXVsdDogYXNzZXJ0TmV2ZXIobW9kZSk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgZXhoYXVzdGl2ZWx5LWhhbmRsZWQgdmFsdWUsIG5hcnJvd2VkIHRvIGBuZXZlcmAgYnkgY29udHJvbCBmbG93LlxuICogQHRocm93cyBBbHdheXMsIGlmIHJlYWNoZWQgYXQgcnVudGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5ldmVyKHZhbHVlOiBuZXZlcik6IG5ldmVyIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgdmFsdWU6ICR7U3RyaW5nKHZhbHVlKX1gKTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBub3QgYG51bGxgIG9yIGB1bmRlZmluZWRgLCBuYXJyb3dpbmcgaXRzIHR5cGUgaW4gcGxhY2UuXG4gKlxuICogT25seSBjYWxsYWJsZSB3aGVuIGBUYCBpbmNsdWRlcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuIFBhc3NpbmcgYW4gYWxyZWFkeSBub24tbnVsbGFibGUgdHlwZSBpcyBhIGNvbXBpbGUgZXJyb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIGVycm9yT3JNZXNzYWdlIC0gT3B0aW9uYWwge0BsaW5rIEVycm9yfSBvciBlcnJvciBtZXNzYWdlIHN0cmluZy5cbiAqIEB0aHJvd3MgSWYgdGhlIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydE5vbk51bGxhYmxlPFQgZXh0ZW5kcyBOdWxsYWJsZUNvbnN0cmFpbnQ8VD4+KHZhbHVlOiBULCBlcnJvck9yTWVzc2FnZT86IEVycm9yIHwgc3RyaW5nKTogYXNzZXJ0cyB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZXJyb3JPck1lc3NhZ2UgPz89IHZhbHVlID09PSBudWxsID8gJ1ZhbHVlIGlzIG51bGwnIDogJ1ZhbHVlIGlzIHVuZGVmaW5lZCc7XG4gIGNvbnN0IGVycm9yID0gdHlwZW9mIGVycm9yT3JNZXNzYWdlID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihlcnJvck9yTWVzc2FnZSkgOiBlcnJvck9yTWVzc2FnZTtcbiAgdGhyb3cgZXJyb3I7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGEgdmFsdWUgaXMgYSBnZW5lcmljIG9iamVjdCwgcmV0dXJuaW5nIGl0IHdpdGggbmFycm93ZWQgdHlwZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gJG9iamVjdCAtIFRoZSB2YWx1ZSB0byBlbnN1cmUuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgYXMgYSBnZW5lcmljIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUdlbmVyaWNPYmplY3Q8VD4oJG9iamVjdDogVCk6IEdlbmVyaWNPYmplY3Q8VD4ge1xuICByZXR1cm4gJG9iamVjdCBhcyBHZW5lcmljT2JqZWN0PFQ+O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIHZhbHVlIGlzIG5vdCBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgYW5kIHJldHVybnMgaXQgd2l0aCBuYXJyb3dlZCB0eXBlLlxuICpcbiAqIE9ubHkgY2FsbGFibGUgd2hlbiBgVGAgaW5jbHVkZXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLiBQYXNzaW5nIGFuIGFscmVhZHkgbm9uLW51bGxhYmxlIHR5cGUgaXMgYSBjb21waWxlIGVycm9yLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSBlcnJvck9yTWVzc2FnZSAtIE9wdGlvbmFsIHtAbGluayBFcnJvcn0gb3IgZXJyb3IgbWVzc2FnZSBzdHJpbmcuXG4gKiBAcmV0dXJucyBUaGUgdmFsdWUgd2l0aCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGV4Y2x1ZGVkIGZyb20gaXRzIHR5cGUuXG4gKiBAdGhyb3dzIElmIHRoZSB2YWx1ZSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVOb25OdWxsYWJsZTxUIGV4dGVuZHMgTnVsbGFibGVDb25zdHJhaW50PFQ+Pih2YWx1ZTogVCwgZXJyb3JPck1lc3NhZ2U/OiBFcnJvciB8IHN0cmluZyk6IE5vbk51bGxhYmxlPFQ+IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUodmFsdWUsIGVycm9yT3JNZXNzYWdlKTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbnkgZnVuY3Rpb24sIG5hcnJvd2VkIHRvIHRoZSBzaWduYXR1cmUgYFRGdW5jdGlvbmAuIE9ubHkgdGhhdCB0aGUgdmFsdWUgaXMgYSBmdW5jdGlvblxuICogaXMgY2hlY2tlZDogYSBzaWduYXR1cmUgY2Fubm90IGJlIGNoZWNrZWQgYXQgcnVudGltZSwgc28gdGhlIGd1YXJkIHRydXN0cyBpdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRGdW5jdGlvbiAtIFRoZSBzaWduYXR1cmUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvblR5cGVHdWFyZDxURnVuY3Rpb24gZXh0ZW5kcyBHZW5lcmljRnVuY3Rpb24+KCk6IFR5cGVHdWFyZDxURnVuY3Rpb24+IHtcbiAgcmV0dXJuICh2YWx1ZSk6IHZhbHVlIGlzIFRGdW5jdGlvbiA9PiBpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcywgb3Igb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mVHlwZUd1YXJkPFQ+KGNvbnN0cnVjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3VtZW50c186IG5ldmVyW10pID0+IFQpOiBUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgVCA9PiB2YWx1ZSBpbnN0YW5jZW9mIGNvbnN0cnVjdG9yO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBib29sZWFuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgR2VuZXJpY0Z1bmN0aW9uIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGBudWxsYC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bGwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYSBudW1iZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBudW1iZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmFsdWUgaXMgYW4gb2JqZWN0OiBub3QgYG51bGxgLCBhbmQgbm90IGEgcHJpbWl0aXZlIG9yIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBvYmplY3Qge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgd2hvc2UgZXZlcnkgaXRlbSBpcyBhIHN0cmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShpc1N0cmluZyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGtleXMgb2YgYSByZWNvcmQuIFR5cGluZyB0aGUgcmVjb3JkIG92ZXIgYSB1bmlvbiwgYXNcbiAqIGBsaXRlcmFsVHlwZUd1YXJkPE1vZGU+KHsgQTogdHJ1ZSwgQjogdHJ1ZSB9KWAsIG1ha2VzIGEgbWVtYmVyIGxhdGVyIGFkZGVkIHRvIHRoZSB1bmlvbiBmYWlsIHRvIGNvbXBpbGUgdW50aWxcbiAqIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbFR5cGVHdWFyZDxUIGV4dGVuZHMgc3RyaW5nPihsaXRlcmFsczogUmVhZG9ubHk8UmVjb3JkPFQsIHRydWU+Pik6IFR5cGVHdWFyZDxUPjtcbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGxpc3RlZCB2YWx1ZXMsIGNvbXBhcmVkIGFzIGBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXNgIGNvbXBhcmVzIHRoZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIFRoZSBhY2NlcHRlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsVHlwZUd1YXJkPFQgZXh0ZW5kcyBMaXRlcmFsPihsaXRlcmFsczogcmVhZG9ubHkgVFtdKTogVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsVHlwZUd1YXJkKGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB0cnVlPj4gfCByZWFkb25seSBMaXRlcmFsW10pOiBUeXBlR3VhcmQ8TGl0ZXJhbD4ge1xuICBpZiAoaXNSZWFkb25seUFycmF5KGxpdGVyYWxzKSkge1xuICAgIGNvbnN0IGxpdGVyYWxMaXN0OiByZWFkb25seSB1bmtub3duW10gPSBsaXRlcmFscztcbiAgICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgTGl0ZXJhbCA9PiBsaXRlcmFsTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gKHZhbHVlKTogdmFsdWUgaXMgTGl0ZXJhbCA9PiBpc1N0cmluZyh2YWx1ZSkgJiYgT2JqZWN0Lmhhc093bihsaXRlcmFscywgdmFsdWUpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBpc1ZhbHVlIC0gVGhlIGd1YXJkIHRvIHdpZGVuLlxuICogQHJldHVybnMgQSBndWFyZCBhY2NlcHRpbmcgd2hhdCBgaXNWYWx1ZWAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVUeXBlR3VhcmQ8VD4oaXNWYWx1ZTogVHlwZUd1YXJkPFQ+KTogVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB1bmlvblR5cGVHdWFyZChpc051bGwsIGlzVmFsdWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBvYmplY3Qgd2hvc2UgZXZlcnkgbGlzdGVkIHByb3BlcnR5IGl0cyBndWFyZCBhY2NlcHRzLiBBIHByb3BlcnR5IGlzIHJlYWQgd2l0aFxuICogYFJlZmxlY3QuZ2V0YCwgc28gYW4gaW5oZXJpdGVkIG9uZSBjb3VudHMgYW5kIGFuIGFic2VudCBvbmUgcmVhZHMgYXMgYHVuZGVmaW5lZGAsIHVubGVzc1xuICoge0BsaW5rIE9iamVjdFR5cGVHdWFyZE9wdGlvbnMuZXhhY3RPcHRpb25hbEtleXN9IHN3aXRjaGVzIHRoZSBndWFyZCB0byBvd24ga2V5cyBhbmQgZXhhY3Qgb3B0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHlUeXBlR3VhcmRzIC0gT25lIGd1YXJkIHBlciBwcm9wZXJ0eSBvZiBgVGAuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ3VhcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RUeXBlR3VhcmQ8VCBleHRlbmRzIG9iamVjdD4ocHJvcGVydHlUeXBlR3VhcmRzOiBQcm9wZXJ0eVR5cGVHdWFyZHM8VD4sIG9wdGlvbnM/OiBPYmplY3RUeXBlR3VhcmRPcHRpb25zPFQ+KTogVHlwZUd1YXJkPFQ+IHtcbiAgY29uc3Qgc2hvdWxkUmVqZWN0VW5rbm93bktleXMgPSBvcHRpb25zPy5zaG91bGRSZWplY3RVbmtub3duS2V5cyA/PyBmYWxzZTtcbiAgY29uc3QgZXhhY3RPcHRpb25hbEtleXMgPSBvcHRpb25zPy5leGFjdE9wdGlvbmFsS2V5cztcbiAgcmV0dXJuICh2YWx1ZSk6IHZhbHVlIGlzIFQgPT4ge1xuICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlamVjdFVua25vd25LZXlzICYmIE9iamVjdC5rZXlzKHZhbHVlKS5zb21lKChrZXkpID0+ICFPYmplY3QuaGFzT3duKHByb3BlcnR5VHlwZUd1YXJkcywga2V5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB0eXBlR3VhcmRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBUeXBlR3VhcmQ8dW5rbm93bj4+PiA9IHByb3BlcnR5VHlwZUd1YXJkcztcbiAgICBmb3IgKGNvbnN0IFtrZXksIHR5cGVHdWFyZF0gb2YgT2JqZWN0LmVudHJpZXModHlwZUd1YXJkcykpIHtcbiAgICAgIGlmIChleGFjdE9wdGlvbmFsS2V5cyAmJiAhT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihleGFjdE9wdGlvbmFsS2V5cywga2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXR5cGVHdWFyZChSZWZsZWN0LmdldCh2YWx1ZSwga2V5KSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGB1bmRlZmluZWRgLCB3aGljaCBpcyB3aGF0IGFuIG9wdGlvbmFsIHByb3BlcnR5IG9yIHBhcmFtZXRlciByZWFkcyBhcyB3aGVuIGl0IGlzXG4gKiBsZWZ0IG91dC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBpc1ZhbHVlIC0gVGhlIGd1YXJkIHRvIHdpZGVuLlxuICogQHJldHVybnMgQSBndWFyZCBhY2NlcHRpbmcgd2hhdCBgaXNWYWx1ZWAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFR5cGVHdWFyZDxUPihpc1ZhbHVlOiBUeXBlR3VhcmQ8VD4pOiBUeXBlR3VhcmQ8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gdW5pb25UeXBlR3VhcmQoaXNVbmRlZmluZWQsIGlzVmFsdWUpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyB3aGF0IGFueSBvZiB0aGUgZ2l2ZW4gZ3VhcmRzIGFjY2VwdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUVHlwZUd1YXJkcyAtIFRoZSBndWFyZHMuXG4gKiBAcGFyYW0gdHlwZUd1YXJkcyAtIFRoZSBndWFyZHMsIHRyaWVkIGluIG9yZGVyLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25UeXBlR3VhcmQ8Y29uc3QgVFR5cGVHdWFyZHMgZXh0ZW5kcyByZWFkb25seSBUeXBlR3VhcmQ8dW5rbm93bj5bXT4oXG4gIC4uLnR5cGVHdWFyZHM6IFRUeXBlR3VhcmRzXG4pOiBUeXBlR3VhcmQ8R3VhcmRlZFR5cGU8VFR5cGVHdWFyZHNbbnVtYmVyXT4+IHtcbiAgcmV0dXJuICh2YWx1ZSk6IHZhbHVlIGlzIEd1YXJkZWRUeXBlPFRUeXBlR3VhcmRzW251bWJlcl0+ID0+IHR5cGVHdWFyZHMuc29tZSgodHlwZUd1YXJkKSA9PiB0eXBlR3VhcmQodmFsdWUpKTtcbn1cblxuZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgcmVhZG9ubHkgdW5rbm93bltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFZQSxTQUFTLFlBQVk7QUF1RmQsU0FBUyxlQUFrQixRQUFzQztBQUN0RSxTQUFPLENBQUMsVUFBd0IsTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLE1BQU0sQ0FBQyxTQUFTLE9BQU8sSUFBSSxDQUFDO0FBQzVGO0FBV08sU0FBUyxPQUFPLFFBQWlCLGdCQUFnRDtBQUN0RixNQUFJLENBQUMsUUFBUTtBQUNYLFVBQU0sT0FBTyxtQkFBbUIsV0FBVyxJQUFJLE1BQU0sY0FBYyxJQUFJO0FBQUEsRUFDekU7QUFDRjtBQVFPLFNBQVMsb0JBQXVCLFNBQWlEO0FBQ3RGLE9BQUs7QUFDUDtBQXVCTyxTQUFTLFlBQVksT0FBcUI7QUFDL0MsUUFBTSxJQUFJLE1BQU0sb0JBQW9CLE9BQU8sS0FBSyxDQUFDLEVBQUU7QUFDckQ7QUFZTyxTQUFTLGtCQUFtRCxPQUFVLGdCQUFrRTtBQUM3SSxNQUFJLFVBQVUsUUFBUSxVQUFVLFFBQVc7QUFDekM7QUFBQSxFQUNGO0FBRUEscUJBQW1CLFVBQVUsT0FBTyxrQkFBa0I7QUFDdEQsUUFBTSxRQUFRLE9BQU8sbUJBQW1CLFdBQVcsSUFBSSxNQUFNLGNBQWMsSUFBSTtBQUMvRSxRQUFNO0FBQ1I7QUFTTyxTQUFTLG9CQUF1QixTQUE4QjtBQUNuRSxTQUFPO0FBQ1Q7QUFhTyxTQUFTLGtCQUFtRCxPQUFVLGdCQUFpRDtBQUM1SCxvQkFBa0IsT0FB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnaoumov/typescript-lib",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "Generic TypeScript utilities: async helpers, errors, disposables, strings, paths, debug logging and more, usable in any TypeScript project.",
5
5
  "keywords": [
6
6
  "typescript",