obsidian-dev-utils 96.5.4 → 97.0.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/integration-test-plugin/main.js +4603 -6986
  3. package/dist/lib/cjs/__merged.cjs +9 -1
  4. package/dist/lib/cjs/__merged.d.cts +2 -0
  5. package/dist/lib/cjs/desktop-zip-extractor.cjs +276 -0
  6. package/dist/lib/cjs/desktop-zip-extractor.d.cts +94 -0
  7. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  8. package/dist/lib/cjs/index.cjs +4 -1
  9. package/dist/lib/cjs/index.d.cts +1 -0
  10. package/dist/lib/cjs/obsidian/css-class.cjs +7 -1
  11. package/dist/lib/cjs/obsidian/css-class.d.cts +27 -0
  12. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -18
  13. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +11 -8
  14. package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
  15. package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
  16. package/dist/lib/cjs/obsidian/modals/modal-command-builder.cjs +460 -0
  17. package/dist/lib/cjs/obsidian/modals/modal-command-builder.d.cts +281 -0
  18. package/dist/lib/cjs/obsidian/modals/prompt.cjs +7 -1
  19. package/dist/lib/cjs/obsidian/modals/prompt.d.cts +15 -0
  20. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +3 -137
  21. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +23 -159
  22. package/dist/lib/esm/__merged.d.mts +2 -0
  23. package/dist/lib/esm/__merged.mjs +9 -1
  24. package/dist/lib/esm/desktop-zip-extractor.d.mts +94 -0
  25. package/dist/lib/esm/desktop-zip-extractor.mjs +174 -0
  26. package/dist/lib/esm/generated-during-build.mjs +2 -2
  27. package/dist/lib/esm/index.d.mts +1 -0
  28. package/dist/lib/esm/index.mjs +3 -1
  29. package/dist/lib/esm/obsidian/css-class.d.mts +27 -0
  30. package/dist/lib/esm/obsidian/css-class.mjs +7 -1
  31. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +11 -8
  32. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +11 -8
  33. package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
  34. package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
  35. package/dist/lib/esm/obsidian/modals/modal-command-builder.d.mts +281 -0
  36. package/dist/lib/esm/obsidian/modals/modal-command-builder.mjs +357 -0
  37. package/dist/lib/esm/obsidian/modals/prompt.d.mts +15 -0
  38. package/dist/lib/esm/obsidian/modals/prompt.mjs +7 -1
  39. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +23 -159
  40. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +3 -140
  41. package/dist/styles.css +44 -1
  42. package/obsidian/modals/modal-command-builder/package.json +6 -0
  43. package/package.json +1 -1
@@ -0,0 +1,281 @@
1
+ /// <reference path="../../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A builder for a modal's control strip.
6
+ *
7
+ * {@link ModalCommandBuilder} assembles the strip of controls shown at the bottom of a modal:
8
+ * keyboard-command hints ({@link ModalCommandBuilder.addKeyboardCommand}), interactive checkboxes bound to
9
+ * a modifier+key shortcut ({@link ModalCommandBuilder.addCheckbox}), and dropdowns bound to a modifier+key
10
+ * shortcut ({@link ModalCommandBuilder.addDropDown}). Chain the `add*` calls, then apply everything to a
11
+ * modal with {@link ModalCommandBuilder.build}:
12
+ *
13
+ * ```ts
14
+ * new ModalCommandBuilder()
15
+ * .addKeyboardCommand({ key: 'Enter', modifiers: ['Mod'], onKey, purpose: 'to create' })
16
+ * .addCheckbox({ key: '1', modifiers: ['Alt'], onChange, onInit, purpose: 'Fix footnotes' })
17
+ * .build(modal);
18
+ * ```
19
+ *
20
+ * The strip is described by two independent axes:
21
+ *
22
+ * - **Where it is hosted.** A {@link SuggestModal} in {@link ModalCommandsRenderMode.Instructions} mode
23
+ * keeps Obsidian's own instruction bar (`setInstructions` + `instructionsEl`). Every other target — a
24
+ * plain {@link Modal}, or a bare {@link ModalCommandsHost} of an element plus a `Scope` — gets a strip
25
+ * element the builder creates itself.
26
+ * - **How each control looks.** {@link ModalCommandsRenderMode.Instructions} renders the purpose text with
27
+ * an inline checkbox or dropdown; {@link ModalCommandsRenderMode.Buttons} renders one clickable button
28
+ * per control, carrying its pressed and disabled state.
29
+ *
30
+ * The axes are independent because a button strip inside a {@link SuggestModal} is a real combination.
31
+ *
32
+ * {@link ModalCommandBuilder.build} always registers the essential navigation/action key handlers, but
33
+ * only renders the control UI and registers the option-toggle shortcuts when
34
+ * {@link ModalCommandBuilderBuildOptions.shouldShowInstructions} is `true` (the default).
35
+ */
36
+ import type { KeymapContext, Modal, Modifier, Scope, SuggestModal } from 'obsidian' with { 'resolution-mode': 'import' };
37
+ import { DropdownComponent } from 'obsidian';
38
+ /**
39
+ * The way {@link ModalCommandBuilder.build} renders each control.
40
+ */
41
+ export declare enum ModalCommandsRenderMode {
42
+ /**
43
+ * One clickable button per control, carrying its pressed (`aria-pressed`) and disabled state.
44
+ *
45
+ * Only controls reachable by pointer are rendered — checkboxes, and keyboard commands that supply
46
+ * {@link KeyboardCommand.onActivate}. A hint-only or keyboard-only command still registers its handler
47
+ * but renders no button, because a button nobody can press is worse than no button. A dropdown throws:
48
+ * a control that CYCLES has no button form.
49
+ */
50
+ Buttons = "buttons",
51
+ /**
52
+ * Obsidian's instruction-bar look: the shortcut, then the purpose text with an inline checkbox or
53
+ * dropdown.
54
+ */
55
+ Instructions = "instructions"
56
+ }
57
+ /**
58
+ * A checkbox command shown in a modal's control strip and bound to a modifier+key shortcut that toggles
59
+ * it.
60
+ */
61
+ export interface CheckboxCommand extends CommandBase {
62
+ /**
63
+ * Called when the checkbox value changes.
64
+ *
65
+ * @param isChecked - The new checked state.
66
+ */
67
+ onChange(isChecked: boolean): void;
68
+ /**
69
+ * Called once with the created checkbox element, to initialize its state.
70
+ *
71
+ * In {@link ModalCommandsRenderMode.Buttons} mode the element is created but never appended — the
72
+ * button is a view of it — so the same initialization code serves both render modes.
73
+ *
74
+ * @param checkboxEl - The created checkbox element.
75
+ */
76
+ onInit(checkboxEl: HTMLInputElement): void;
77
+ }
78
+ /**
79
+ * The members every command shares.
80
+ */
81
+ export interface CommandBase {
82
+ /**
83
+ * Whether the control can be used right now. When it returns `false` the control is rendered
84
+ * **disabled rather than removed**, so the strip does not reflow under the pointer as modes change —
85
+ * which on a phone means a mis-tap.
86
+ *
87
+ * Re-read by {@link ModalCommands.refresh}. When omitted, the builder never touches the control's
88
+ * disabled state, leaving whatever {@link CheckboxCommand.onInit} / {@link DropDownCommand.onInit} set.
89
+ *
90
+ * @returns Whether the control can be used right now.
91
+ */
92
+ checkIsAvailable?(this: void): boolean;
93
+ /**
94
+ * The key that activates the command.
95
+ */
96
+ key: string;
97
+ /**
98
+ * The modifiers combined with {@link CommandBase.key}. When omitted, no modifiers are required.
99
+ */
100
+ modifiers?: Modifier[];
101
+ /**
102
+ * The human-readable description shown next to the control.
103
+ */
104
+ purpose: string;
105
+ }
106
+ /**
107
+ * A dropdown command shown in a modal's control strip and bound to a modifier+key shortcut that cycles
108
+ * through its options.
109
+ *
110
+ * Supported in {@link ModalCommandsRenderMode.Instructions} mode only.
111
+ */
112
+ export interface DropDownCommand extends CommandBase {
113
+ /**
114
+ * Called when the dropdown value changes.
115
+ *
116
+ * @param value - The newly selected value.
117
+ */
118
+ onChange(value: string): void;
119
+ /**
120
+ * Called once with the created dropdown component, to initialize its options and state.
121
+ *
122
+ * @param dropdownComponent - The created dropdown component.
123
+ */
124
+ onInit(dropdownComponent: DropdownComponent): void;
125
+ }
126
+ /**
127
+ * A keyboard command shown in a modal's control strip and optionally bound to a modifier+key handler.
128
+ */
129
+ export interface KeyboardCommand extends CommandBase {
130
+ /**
131
+ * Whether the command reads as ON. Supply it for a toggle whose state lives outside the strip; omit it
132
+ * for an action, which does something and is done. A {@link CheckboxCommand} needs no equivalent — its
133
+ * checkbox element is the state.
134
+ *
135
+ * Re-read by {@link ModalCommands.refresh}.
136
+ *
137
+ * @returns Whether the command reads as ON.
138
+ */
139
+ checkIsOn?(this: void): boolean;
140
+ /**
141
+ * The pointer route into the same handler the shortcut runs. Required for the command to render a
142
+ * button in {@link ModalCommandsRenderMode.Buttons} mode — on a phone there is no modifier key to
143
+ * press, so this is the only way in.
144
+ *
145
+ * @param $event - The click event, so a command that picks something has one to hand on.
146
+ */
147
+ onActivate?(this: void, $event: MouseEvent): void;
148
+ /**
149
+ * The handler invoked when the shortcut is pressed. When omitted, the command is a hint only and no
150
+ * scope handler is registered.
151
+ *
152
+ * @param $event - The keyboard event.
153
+ * @param context - The keymap context.
154
+ * @returns `false` to prevent Obsidian's default handling, or `void`/`true` otherwise.
155
+ */
156
+ onKey?($event: KeyboardEvent, context: KeymapContext): boolean;
157
+ }
158
+ /**
159
+ * Options for {@link ModalCommandBuilder.build}.
160
+ */
161
+ export interface ModalCommandBuilderBuildOptions {
162
+ /**
163
+ * The way each control is rendered.
164
+ *
165
+ * @default {@link ModalCommandsRenderMode.Instructions}
166
+ */
167
+ readonly renderMode?: ModalCommandsRenderMode;
168
+ /**
169
+ * Whether to render the control strip (checkboxes, dropdowns, keyboard hints) and register the
170
+ * option-toggle keyboard shortcuts. When `false`, no control UI is shown and the option-toggle
171
+ * shortcuts are not registered; only the essential navigation key handlers remain active.
172
+ *
173
+ * @default `true`
174
+ */
175
+ readonly shouldShowInstructions?: boolean;
176
+ }
177
+ /**
178
+ * The handle returned by {@link ModalCommandBuilder.build}.
179
+ */
180
+ export interface ModalCommands {
181
+ /**
182
+ * Brings every rendered control's disabled and pressed state up to date, by re-reading
183
+ * {@link CommandBase.checkIsAvailable} and {@link KeyboardCommand.checkIsOn}.
184
+ *
185
+ * The strip is built once and only re-stated afterwards, because rebuilding it would replace an element
186
+ * the pointer may be about to click.
187
+ */
188
+ refresh(): void;
189
+ }
190
+ /**
191
+ * A bare host for a control strip: the element to render into, plus the scope to register shortcuts with.
192
+ */
193
+ export interface ModalCommandsHost {
194
+ /**
195
+ * The element the control strip is appended to.
196
+ */
197
+ readonly containerEl: HTMLElement;
198
+ /**
199
+ * The scope the shortcuts are registered with.
200
+ */
201
+ readonly scope: Scope;
202
+ }
203
+ /**
204
+ * Every target {@link ModalCommandBuilder.build} accepts.
205
+ */
206
+ export type ModalCommandsTarget = Modal | ModalCommandsHost | SuggestModal<unknown>;
207
+ /**
208
+ * Builds a modal's control strip from keyboard commands, interactive checkboxes, and dropdowns, then
209
+ * applies them to a modal via {@link ModalCommandBuilder.build}.
210
+ */
211
+ export declare class ModalCommandBuilder {
212
+ private readonly entries;
213
+ /**
214
+ * Adds an interactive checkbox to the control strip, bound to a modifier+key shortcut that toggles it.
215
+ *
216
+ * @param command - The checkbox command to add.
217
+ * @returns The builder instance for chaining.
218
+ */
219
+ addCheckbox(command: CheckboxCommand): this;
220
+ /**
221
+ * Adds a dropdown to the control strip, bound to a modifier+key shortcut that cycles through its
222
+ * options.
223
+ *
224
+ * @param command - The dropdown command to add.
225
+ * @returns The builder instance for chaining.
226
+ */
227
+ addDropDown(command: DropDownCommand): this;
228
+ /**
229
+ * Adds a keyboard command to the control strip. When {@link KeyboardCommand.onKey} is provided, its
230
+ * handler is registered with the modal scope; otherwise the command is a hint only.
231
+ *
232
+ * @param command - The keyboard command to add.
233
+ * @returns The builder instance for chaining.
234
+ */
235
+ addKeyboardCommand(command: KeyboardCommand): this;
236
+ /**
237
+ * Applies the accumulated commands to a modal. Always registers the essential navigation/action key
238
+ * handlers; only renders the control strip and registers the option-toggle shortcuts when
239
+ * {@link ModalCommandBuilderBuildOptions.shouldShowInstructions} is `true`.
240
+ *
241
+ * @param target - The modal, or the bare element + scope, to apply the commands to.
242
+ * @param options - The build options.
243
+ * @returns A handle whose {@link ModalCommands.refresh} re-states every rendered control.
244
+ */
245
+ build(target: ModalCommandsTarget, options?: ModalCommandBuilderBuildOptions): ModalCommands;
246
+ private buildCommandText;
247
+ private getModifierString;
248
+ /**
249
+ * Resolves the element a self-created strip is appended to.
250
+ *
251
+ * A {@link Modal} carries both `modalEl` and a `containerEl` that is the OUTER `.modal-container`, so
252
+ * `modalEl` has to win — otherwise the strip lands outside the modal frame. Discriminated with `in`
253
+ * rather than a property read, because tests hand `build` a `strictProxy` mock whose `get` trap throws
254
+ * on unmocked members.
255
+ *
256
+ * @param target - The build target.
257
+ * @returns The element to append the strip to.
258
+ */
259
+ private getStripContainerEl;
260
+ private renderButtons;
261
+ private renderInstructions;
262
+ /**
263
+ * Renders through Obsidian's own instruction bar, the way every {@link SuggestModal} consumer has always
264
+ * had it.
265
+ *
266
+ * @param modal - The suggest modal.
267
+ * @param instructions - The instructions to render.
268
+ * @returns The purpose element of each rendered instruction.
269
+ */
270
+ private renderNativeInstructions;
271
+ /**
272
+ * Renders an instruction bar of the builder's own, for a host that has none.
273
+ *
274
+ * The markup mirrors what `setInstructions` produces, so Obsidian's own styling applies unchanged.
275
+ *
276
+ * @param containerEl - The element to append the bar to.
277
+ * @param instructions - The instructions to render.
278
+ * @returns The purpose element of each rendered instruction.
279
+ */
280
+ private renderOwnInstructions;
281
+ }
@@ -148,12 +148,15 @@ module.exports = __toCommonJS(prompt_exports);
148
148
  var import_obsidian = require('obsidian');
149
149
  var import_async = require('../../async.cjs');
150
150
  var import_function = require('../../function.cjs');
151
+ var import_object_utils = require('../../object-utils.cjs');
151
152
  var import_css_class = require('../css-class.cjs');
152
153
  var import_i18n = require('../i18n/i18n.cjs');
153
154
  var import_obsidian_settings = require('../obsidian-settings.cjs');
154
155
  var import_modal = require('./modal.cjs');
155
156
  class PromptModal extends import_modal.ModalBase {
156
157
  cancelButtonText;
158
+ commandBuilder;
159
+ commandsRenderMode;
157
160
  isOkClicked = false;
158
161
  isTouched = false;
159
162
  okButtonText;
@@ -165,6 +168,8 @@ class PromptModal extends import_modal.ModalBase {
165
168
  super(params);
166
169
  this.addCssClasses(import_css_class.CssClass.PromptModal);
167
170
  this.cancelButtonText = params.cancelButtonText ?? (0, import_i18n.t)(($) => $.obsidianDevUtils.buttons.cancel);
171
+ this.commandBuilder = params.commandBuilder ?? null;
172
+ this.commandsRenderMode = params.commandsRenderMode;
168
173
  this.okButtonText = params.okButtonText ?? (0, import_i18n.t)(($) => $.obsidianDevUtils.buttons.ok);
169
174
  this.placeholder = params.placeholder ?? "";
170
175
  this.title = params.title ?? "";
@@ -222,6 +227,7 @@ class PromptModal extends import_modal.ModalBase {
222
227
  cancelButton.setButtonText(this.cancelButtonText);
223
228
  cancelButton.onClick(this.close.bind(this));
224
229
  cancelButton.setClass(import_css_class.CssClass.CancelButton);
230
+ this.commandBuilder?.build(this, (0, import_object_utils.normalizeOptionalProperties)({ renderMode: this.commandsRenderMode }));
225
231
  }
226
232
  handleOk(event, textComponent) {
227
233
  event.preventDefault();
@@ -250,4 +256,4 @@ async function prompt(params) {
250
256
  0 && (module.exports = {
251
257
  prompt
252
258
  });
253
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9wcm9tcHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVdGlsaXR5IGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IG1vZGFsIGluIE9ic2lkaWFuLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgYSBmdW5jdGlvbiB0byBkaXNwbGF5IGEgbW9kYWwgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIGZvciBpbnB1dC4gVGhlIG1vZGFsIGluY2x1ZGVzIFwiT0tcIiBhbmQgXCJDYW5jZWxcIiBidXR0b25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgVGV4dENvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTW9kYWxCYXNlQ29uc3RydWN0b3JQYXJhbXMsXG4gIE1vZGFsUGFyYW1zQmFzZVxufSBmcm9tICcuL21vZGFsLnRzJztcblxuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBpc1NwZWxsY2hlY2tFbmFibGVkIH0gZnJvbSAnLi4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgTW9kYWxCYXNlLFxuICBzaG93TW9kYWxcbn0gZnJvbSAnLi9tb2RhbC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHByb21wdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UGFyYW1zIGV4dGVuZHMgTW9kYWxQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgdGV4dCBmb3IgdGhlIFwiQ2FuY2VsXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBkZWZhdWx0IHZhbHVlIHRvIHByZS1maWxsIHRoZSBpbnB1dCBmaWVsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgZm9yIHRoZSBcIk9LXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2tCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dCBmaWVsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIG1vZGFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5wdXQgdmFsdWUgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIG9yIGBudWxsYCBpZiB0aGUgdmFsdWUgaXMgdmFsaWQuXG4gICAqL1xuICB2YWx1ZVZhbGlkYXRvcj8odGhpczogdm9pZCwgdmFsdWU6IHN0cmluZyk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG59XG5cbnR5cGUgUHJvbXB0TW9kYWxDb25zdHJ1Y3RvclBhcmFtcyA9IE1vZGFsQmFzZUNvbnN0cnVjdG9yUGFyYW1zPG51bGwgfCBzdHJpbmc+ICYgUHJvbXB0UGFyYW1zO1xuXG5jbGFzcyBQcm9tcHRNb2RhbCBleHRlbmRzIE1vZGFsQmFzZTxudWxsIHwgc3RyaW5nPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIGlzT2tDbGlja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNUb3VjaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2tCdXR0b25UZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcHJpdmF0ZSB2YWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlVmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQcm9tcHRNb2RhbENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICB0aGlzLmFkZENzc0NsYXNzZXMoQ3NzQ2xhc3MuUHJvbXB0TW9kYWwpO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uVGV4dCA9IHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCk7XG4gICAgdGhpcy5va0J1dHRvblRleHQgPSBwYXJhbXMub2tCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLm9rKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gcGFyYW1zLnBsYWNlaG9sZGVyID8/ICcnO1xuICAgIHRoaXMudGl0bGUgPSBwYXJhbXMudGl0bGUgPz8gJyc7XG4gICAgdGhpcy52YWx1ZVZhbGlkYXRvciA9IHBhcmFtcy52YWx1ZVZhbGlkYXRvciA/PyBub29wO1xuICAgIHRoaXMudmFsdWUgPSBwYXJhbXMuZGVmYXVsdFZhbHVlID8/ICcnO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9taXNlUmVzb2x2ZSh0aGlzLmlzT2tDbGlja2VkID8gdGhpcy52YWx1ZSA6IG51bGwpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uT3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCh0aGlzLnRpdGxlKTtcbiAgICBjb25zdCB0ZXh0Q29tcG9uZW50ID0gbmV3IFRleHRDb21wb25lbnQodGhpcy5jb250ZW50RWwpO1xuICAgIGNvbnN0IGlucHV0RWwgPSB0ZXh0Q29tcG9uZW50LmlucHV0RWw7XG4gICAgLy8gYEFic3RyYWN0VGV4dENvbXBvbmVudGAgZm9yY2VzIGBzcGVsbGNoZWNrPVwiZmFsc2VcImAgb24gZXZlcnkgdGV4dCBjb21wb25lbnQsIHNvIHRoZSB2YXVsdCBzZXR0aW5nIGhhcyB0byBiZSByZS1hcHBsaWVkIGhlcmUuXG4gICAgLy8gT2JzaWRpYW4ncyBvd24gZmlsZSBleHBsb3JlciByZWFkcyB0aGUgc2FtZSBjb25maWcgd2hlbiBpdCBzdGFydHMgYW4gaW5saW5lIHJlbmFtZS5cbiAgICBpbnB1dEVsLnNldEF0dHJpYnV0ZSgnc3BlbGxjaGVjaycsIFN0cmluZyhpc1NwZWxsY2hlY2tFbmFibGVkKHRoaXMuYXBwKSkpO1xuXG4gICAgY29uc3QgdmFsaWRhdGUgPSBhc3luYyAoc2hvdWxkUmVwb3J0OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBhd2FpdCB0aGlzLnZhbHVlVmFsaWRhdG9yKGlucHV0RWwudmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlucHV0RWwuc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3JNZXNzYWdlID8/ICcnKTtcbiAgICAgIGlmIChzaG91bGRSZXBvcnQpIHtcbiAgICAgICAgaW5wdXRFbC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIHRoaXMubWFya1RvdWNoZWQoaW5wdXRFbCk7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSh0cnVlKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSh0aGlzLmlzVG91Y2hlZCk7XG4gICAgfTtcblxuICAgIHRleHRDb21wb25lbnQuc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgdGV4dENvbXBvbmVudC5pbnB1dEVsLnNlbGVjdCgpO1xuICAgIHRleHRDb21wb25lbnQuc2V0UGxhY2Vob2xkZXIodGhpcy5wbGFjZWhvbGRlcik7XG4gICAgaW5wdXRFbC5hZGRDbGFzcyhDc3NDbGFzcy5UZXh0Qm94KTtcbiAgICAvLyBUaGUgbW9kYWwgb3BlbnMgaW52YWxpZCBieSBkZXNpZ24gKHNlZSBiZWxvdyksIHNvIHRoZSBpbnZhbGlkIHN0eWxpbmcgaXMgZGVmZXJyZWQgdW50aWwgdG91Y2hlZC5cbiAgICBpbnB1dEVsLmFkZENsYXNzKENzc0NsYXNzLlVudG91Y2hlZCk7XG4gICAgdGV4dENvbXBvbmVudC5vbkNoYW5nZSgobmV3VmFsdWUpID0+IHtcbiAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9KTtcbiAgICBpbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVPayhldmVudCwgdGV4dENvbXBvbmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBjb252ZXJ0QXN5bmNUb1N5bmMoaGFuZGxlSW5wdXQpKTtcbiAgICBpbnB1dEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgY29udmVydEFzeW5jVG9TeW5jKGhhbmRsZUZvY3VzKSk7XG4gICAgLy8gVGhlIG1vZGFsIG11c3Qgc3RhcnQgb3V0IGludmFsaWQgc28gT0sgcmVmdXNlcywgYnV0IHRoZSB2YWxpZGl0eSBpcyBub3QgcmVwb3J0ZWQgdW50aWwgdGhlIHVzZXIgdHlwZXMgb3Igc3VibWl0cy5cbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB2YWxpZGF0ZShmYWxzZSkpO1xuICAgIGNvbnN0IG9rQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudCh0aGlzLmNvbnRlbnRFbCk7XG4gICAgb2tCdXR0b24uc2V0QnV0dG9uVGV4dCh0aGlzLm9rQnV0dG9uVGV4dCk7XG4gICAgb2tCdXR0b24uc2V0Q3RhKCk7XG4gICAgb2tCdXR0b24ub25DbGljaygoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlT2soZXZlbnQsIHRleHRDb21wb25lbnQpO1xuICAgIH0pO1xuICAgIG9rQnV0dG9uLnNldENsYXNzKENzc0NsYXNzLk9rQnV0dG9uKTtcbiAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KHRoaXMuY29udGVudEVsKTtcbiAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dCh0aGlzLmNhbmNlbEJ1dHRvblRleHQpO1xuICAgIGNhbmNlbEJ1dHRvbi5vbkNsaWNrKHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7XG4gICAgY2FuY2VsQnV0dG9uLnNldENsYXNzKENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9rKGV2ZW50OiBFdmVudCwgdGV4dENvbXBvbmVudDogVGV4dENvbXBvbmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0ZXh0Q29tcG9uZW50LmlucHV0RWwuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICB0aGlzLm1hcmtUb3VjaGVkKHRleHRDb21wb25lbnQuaW5wdXRFbCk7XG4gICAgICB0ZXh0Q29tcG9uZW50LmlucHV0RWwucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzT2tDbGlja2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtUb3VjaGVkKGlucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWU7XG4gICAgaW5wdXRFbC5yZW1vdmVDbGFzcyhDc3NDbGFzcy5VbnRvdWNoZWQpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheXMgYSBwcm9tcHQgbW9kYWwgaW4gT2JzaWRpYW4gdG8gZ2V0IHVzZXIgaW5wdXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvbXB0IG1vZGFsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1c2VyIGlucHV0IG9yIGBudWxsYCBpZiB0aGUgcHJvbXB0IHdhcyBjYW5jZWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9tcHQocGFyYW1zOiBQcm9tcHRQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IHNob3dNb2RhbDxudWxsIHwgc3RyaW5nPigocHJvbWlzZVJlc29sdmUpID0+XG4gICAgbmV3IFByb21wdE1vZGFsKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHByb21pc2VSZXNvbHZlXG4gICAgfSlcbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsc0JBR087QUFRUCxtQkFHTztBQUNQLHNCQUFxQjtBQUNyQix1QkFBeUI7QUFDekIsa0JBQWtCO0FBQ2xCLCtCQUFvQztBQUNwQyxtQkFHTztBQWdEUCxNQUFNLG9CQUFvQix1QkFBeUI7QUFBQSxFQUNoQztBQUFBLEVBQ1QsY0FBYztBQUFBLEVBQ2QsWUFBWTtBQUFBLEVBQ0g7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ1Q7QUFBQSxFQUNTO0FBQUEsRUFFVixZQUFZLFFBQXNDO0FBQ3ZELFVBQU0sTUFBTTtBQUNaLFNBQUssY0FBYywwQkFBUyxXQUFXO0FBQ3ZDLFNBQUssbUJBQW1CLE9BQU8sd0JBQW9CLGVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLFFBQVEsTUFBTTtBQUM3RixTQUFLLGVBQWUsT0FBTyxvQkFBZ0IsZUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsUUFBUSxFQUFFO0FBQ2pGLFNBQUssY0FBYyxPQUFPLGVBQWU7QUFDekMsU0FBSyxRQUFRLE9BQU8sU0FBUztBQUM3QixTQUFLLGlCQUFpQixPQUFPLGtCQUFrQjtBQUMvQyxTQUFLLFFBQVEsT0FBTyxnQkFBZ0I7QUFBQSxFQUN0QztBQUFBLEVBRWdCLFVBQWdCO0FBQzlCLFNBQUssZUFBZSxLQUFLLGNBQWMsS0FBSyxRQUFRLElBQUk7QUFBQSxFQUMxRDtBQUFBLEVBRWdCLFNBQWU7QUFDN0IsU0FBSyxRQUFRLFFBQVEsS0FBSyxLQUFLO0FBQy9CLFVB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
259
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9wcm9tcHQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVdGlsaXR5IGZvciBkaXNwbGF5aW5nIGEgcHJvbXB0IG1vZGFsIGluIE9ic2lkaWFuLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgYSBmdW5jdGlvbiB0byBkaXNwbGF5IGEgbW9kYWwgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIGZvciBpbnB1dC4gVGhlIG1vZGFsIGluY2x1ZGVzIFwiT0tcIiBhbmQgXCJDYW5jZWxcIiBidXR0b25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgVGV4dENvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgTW9kYWxDb21tYW5kQnVpbGRlcixcbiAgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyxcbiAgTW9kYWxDb21tYW5kc1JlbmRlck1vZGVcbn0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNb2RhbEJhc2VDb25zdHJ1Y3RvclBhcmFtcyxcbiAgTW9kYWxQYXJhbXNCYXNlXG59IGZyb20gJy4vbW9kYWwudHMnO1xuXG5pbXBvcnQge1xuICBjb252ZXJ0QXN5bmNUb1N5bmMsXG4gIGludm9rZUFzeW5jU2FmZWx5XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi8uLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyBpc1NwZWxsY2hlY2tFbmFibGVkIH0gZnJvbSAnLi4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgTW9kYWxCYXNlLFxuICBzaG93TW9kYWxcbn0gZnJvbSAnLi9tb2RhbC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHByb21wdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvbXB0UGFyYW1zIGV4dGVuZHMgTW9kYWxQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgdGV4dCBmb3IgdGhlIFwiQ2FuY2VsXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogRXh0cmEgY29udHJvbHMgXHUyMDE0IGNoZWNrYm94ZXMsIGRyb3Bkb3ducyBhbmQga2V5Ym9hcmQgc2hvcnRjdXRzIFx1MjAxNCByZW5kZXJlZCBhcyBhIHN0cmlwIGFsb25nIHRoZSBib3R0b21cbiAgICogb2YgdGhlIG1vZGFsLCBzbyBhIGNhbGxlciBnZXRzIGEgdGV4dCBpbnB1dCBwbHVzIG9wdGlvbnMgd2l0aCBubyBiZXNwb2tlIG1vZGFsIG9mIGl0cyBvd24uXG4gICAqXG4gICAqIEhhbmQgaXQgYSBjb25maWd1cmVkIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyfTsgdGhlIG1vZGFsIGJ1aWxkcyBpdC4gVGhlIHN0cmlwIGlzIHJlbmRlcmVkIGFmdGVyXG4gICAqIHRoZSBidXR0b25zLCBzbyBpdCBzaXRzIGFsb25nIHRoZSBib3R0b20gZWRnZSB3aGVyZSBhIGBTdWdnZXN0TW9kYWxgJ3MgaW5zdHJ1Y3Rpb24gYmFyIHNpdHMuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kQnVpbGRlcj86IE1vZGFsQ29tbWFuZEJ1aWxkZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3YXkge0BsaW5rIFByb21wdFBhcmFtcy5jb21tYW5kQnVpbGRlcn0ncyBjb250cm9scyBhcmUgcmVuZGVyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnNgXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kc1JlbmRlck1vZGU/OiBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZTtcblxuICAvKipcbiAgICogQSBkZWZhdWx0IHZhbHVlIHRvIHByZS1maWxsIHRoZSBpbnB1dCBmaWVsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRleHQgZm9yIHRoZSBcIk9LXCIgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgb2tCdXR0b25UZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dCBmaWVsZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIG1vZGFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5wdXQgdmFsdWUgdG8gdmFsaWRhdGUuXG4gICAqIEByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIG9yIGBudWxsYCBpZiB0aGUgdmFsdWUgaXMgdmFsaWQuXG4gICAqL1xuICB2YWx1ZVZhbGlkYXRvcj8odGhpczogdm9pZCwgdmFsdWU6IHN0cmluZyk6IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG59XG5cbnR5cGUgUHJvbXB0TW9kYWxDb25zdHJ1Y3RvclBhcmFtcyA9IE1vZGFsQmFzZUNvbnN0cnVjdG9yUGFyYW1zPG51bGwgfCBzdHJpbmc+ICYgUHJvbXB0UGFyYW1zO1xuXG5jbGFzcyBQcm9tcHRNb2RhbCBleHRlbmRzIE1vZGFsQmFzZTxudWxsIHwgc3RyaW5nPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1hbmRCdWlsZGVyOiBNb2RhbENvbW1hbmRCdWlsZGVyIHwgbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21tYW5kc1JlbmRlck1vZGU6IE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGlzT2tDbGlja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNUb3VjaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2tCdXR0b25UZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcHJpdmF0ZSB2YWx1ZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlVmFsaWRhdG9yOiAodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQcm9tcHRNb2RhbENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICB0aGlzLmFkZENzc0NsYXNzZXMoQ3NzQ2xhc3MuUHJvbXB0TW9kYWwpO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uVGV4dCA9IHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0ID8/IHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5idXR0b25zLmNhbmNlbCk7XG4gICAgdGhpcy5jb21tYW5kQnVpbGRlciA9IHBhcmFtcy5jb21tYW5kQnVpbGRlciA/PyBudWxsO1xuICAgIHRoaXMuY29tbWFuZHNSZW5kZXJNb2RlID0gcGFyYW1zLmNvbW1hbmRzUmVuZGVyTW9kZTtcbiAgICB0aGlzLm9rQnV0dG9uVGV4dCA9IHBhcmFtcy5va0J1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLmJ1dHRvbnMub2spO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBwYXJhbXMucGxhY2Vob2xkZXIgPz8gJyc7XG4gICAgdGhpcy50aXRsZSA9IHBhcmFtcy50aXRsZSA/PyAnJztcbiAgICB0aGlzLnZhbHVlVmFsaWRhdG9yID0gcGFyYW1zLnZhbHVlVmFsaWRhdG9yID8/IG5vb3A7XG4gICAgdGhpcy52YWx1ZSA9IHBhcmFtcy5kZWZhdWx0VmFsdWUgPz8gJyc7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnByb21pc2VSZXNvbHZlKHRoaXMuaXNPa0NsaWNrZWQgPyB0aGlzLnZhbHVlIDogbnVsbCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25PcGVuKCk6IHZvaWQge1xuICAgIHRoaXMudGl0bGVFbC5zZXRUZXh0KHRoaXMudGl0bGUpO1xuICAgIGNvbnN0IHRleHRDb21wb25lbnQgPSBuZXcgVGV4dENvbXBvbmVudCh0aGlzLmNvbnRlbnRFbCk7XG4gICAgY29uc3QgaW5wdXRFbCA9IHRleHRDb21wb25lbnQuaW5wdXRFbDtcbiAgICAvLyBgQWJzdHJhY3RUZXh0Q29tcG9uZW50YCBmb3JjZXMgYHNwZWxsY2hlY2s9XCJmYWxzZVwiYCBvbiBldmVyeSB0ZXh0IGNvbXBvbmVudCwgc28gdGhlIHZhdWx0IHNldHRpbmcgaGFzIHRvIGJlIHJlLWFwcGxpZWQgaGVyZS5cbiAgICAvLyBPYnNpZGlhbidzIG93biBmaWxlIGV4cGxvcmVyIHJlYWRzIHRoZSBzYW1lIGNvbmZpZyB3aGVuIGl0IHN0YXJ0cyBhbiBpbmxpbmUgcmVuYW1lLlxuICAgIGlucHV0RWwuc2V0QXR0cmlidXRlKCdzcGVsbGNoZWNrJywgU3RyaW5nKGlzU3BlbGxjaGVja0VuYWJsZWQodGhpcy5hcHApKSk7XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChzaG91bGRSZXBvcnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGF3YWl0IHRoaXMudmFsdWVWYWxpZGF0b3IoaW5wdXRFbC52YWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaW5wdXRFbC5zZXRDdXN0b21WYWxpZGl0eShlcnJvck1lc3NhZ2UgPz8gJycpO1xuICAgICAgaWYgKHNob3VsZFJlcG9ydCkge1xuICAgICAgICBpbnB1dEVsLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUlucHV0ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgdGhpcy5tYXJrVG91Y2hlZChpbnB1dEVsKTtcbiAgICAgIGF3YWl0IHZhbGlkYXRlKHRydWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgIGF3YWl0IHZhbGlkYXRlKHRoaXMuaXNUb3VjaGVkKTtcbiAgICB9O1xuXG4gICAgdGV4dENvbXBvbmVudC5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB0ZXh0Q29tcG9uZW50LmlucHV0RWwuc2VsZWN0KCk7XG4gICAgdGV4dENvbXBvbmVudC5zZXRQbGFjZWhvbGRlcih0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICBpbnB1dEVsLmFkZENsYXNzKENzc0NsYXNzLlRleHRCb3gpO1xuICAgIC8vIFRoZSBtb2RhbCBvcGVucyBpbnZhbGlkIGJ5IGRlc2lnbiAoc2VlIGJlbG93KSwgc28gdGhlIGludmFsaWQgc3R5bGluZyBpcyBkZWZlcnJlZCB1bnRpbCB0b3VjaGVkLlxuICAgIGlucHV0RWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuVW50b3VjaGVkKTtcbiAgICB0ZXh0Q29tcG9uZW50Lm9uQ2hhbmdlKChuZXdWYWx1ZSkgPT4ge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH0pO1xuICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICB0aGlzLmhhbmRsZU9rKGV2ZW50LCB0ZXh0Q29tcG9uZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGNvbnZlcnRBc3luY1RvU3luYyhoYW5kbGVJbnB1dCkpO1xuICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBjb252ZXJ0QXN5bmNUb1N5bmMoaGFuZGxlRm9jdXMpKTtcbiAgICAvLyBUaGUgbW9kYWwgbXVzdCBzdGFydCBvdXQgaW52YWxpZCBzbyBPSyByZWZ1c2VzLCBidXQgdGhlIHZhbGlkaXR5IGlzIG5vdCByZXBvcnRlZCB1bnRpbCB0aGUgdXNlciB0eXBlcyBvciBzdWJtaXRzLlxuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHZhbGlkYXRlKGZhbHNlKSk7XG4gICAgY29uc3Qgb2tCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KHRoaXMuY29udGVudEVsKTtcbiAgICBva0J1dHRvbi5zZXRCdXR0b25UZXh0KHRoaXMub2tCdXR0b25UZXh0KTtcbiAgICBva0J1dHRvbi5zZXRDdGEoKTtcbiAgICBva0J1dHRvbi5vbkNsaWNrKChldmVudCkgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVPayhldmVudCwgdGV4dENvbXBvbmVudCk7XG4gICAgfSk7XG4gICAgb2tCdXR0b24uc2V0Q2xhc3MoQ3NzQ2xhc3MuT2tCdXR0b24pO1xuICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQodGhpcy5jb250ZW50RWwpO1xuICAgIGNhbmNlbEJ1dHRvbi5zZXRCdXR0b25UZXh0KHRoaXMuY2FuY2VsQnV0dG9uVGV4dCk7XG4gICAgY2FuY2VsQnV0dG9uLm9uQ2xpY2sodGhpcy5jbG9zZS5iaW5kKHRoaXMpKTtcbiAgICBjYW5jZWxCdXR0b24uc2V0Q2xhc3MoQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcblxuICAgIC8vIEJ1aWx0IGxhc3Qgc28gdGhlIHN0cmlwIGxhbmRzIGFsb25nIHRoZSBtb2RhbCdzIGJvdHRvbSBlZGdlLCB3aGVyZSBhIGBTdWdnZXN0TW9kYWxgJ3MgaW5zdHJ1Y3Rpb25cbiAgICAvLyBCYXIgc2l0cy5cbiAgICB0aGlzLmNvbW1hbmRCdWlsZGVyPy5idWlsZCh0aGlzLCBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8TW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucz4oeyByZW5kZXJNb2RlOiB0aGlzLmNvbW1hbmRzUmVuZGVyTW9kZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9rKGV2ZW50OiBFdmVudCwgdGV4dENvbXBvbmVudDogVGV4dENvbXBvbmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCF0ZXh0Q29tcG9uZW50LmlucHV0RWwuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICB0aGlzLm1hcmtUb3VjaGVkKHRleHRDb21wb25lbnQuaW5wdXRFbCk7XG4gICAgICB0ZXh0Q29tcG9uZW50LmlucHV0RWwucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzT2tDbGlja2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIG1hcmtUb3VjaGVkKGlucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzVG91Y2hlZCA9IHRydWU7XG4gICAgaW5wdXRFbC5yZW1vdmVDbGFzcyhDc3NDbGFzcy5VbnRvdWNoZWQpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheXMgYSBwcm9tcHQgbW9kYWwgaW4gT2JzaWRpYW4gdG8gZ2V0IHVzZXIgaW5wdXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgcHJvbXB0IG1vZGFsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB1c2VyIGlucHV0IG9yIGBudWxsYCBpZiB0aGUgcHJvbXB0IHdhcyBjYW5jZWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9tcHQocGFyYW1zOiBQcm9tcHRQYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgcmV0dXJuIGF3YWl0IHNob3dNb2RhbDxudWxsIHwgc3RyaW5nPigocHJvbWlzZVJlc29sdmUpID0+XG4gICAgbmV3IFByb21wdE1vZGFsKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHByb21pc2VSZXNvbHZlXG4gICAgfSlcbiAgKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBVUEsc0JBR087QUFhUCxtQkFHTztBQUNQLHNCQUFxQjtBQUNyQiwwQkFBNEM7QUFDNUMsdUJBQXlCO0FBQ3pCLGtCQUFrQjtBQUNsQiwrQkFBb0M7QUFDcEMsbUJBR087QUFnRVAsTUFB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
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { Promisable } from 'type-fest' with { 'resolution-mode': 'import' };
10
10
  import type { MaybeReturn } from '../../type.cjs';
11
+ import type { ModalCommandBuilder, ModalCommandsRenderMode } from './modal-command-builder.cjs';
11
12
  import type { ModalParamsBase } from './modal.cjs';
12
13
  /**
13
14
  * Options for {@link prompt}.
@@ -17,6 +18,20 @@ export interface PromptParams extends ModalParamsBase {
17
18
  * A text for the "Cancel" button.
18
19
  */
19
20
  readonly cancelButtonText?: string;
21
+ /**
22
+ * Extra controls — checkboxes, dropdowns and keyboard shortcuts — rendered as a strip along the bottom
23
+ * of the modal, so a caller gets a text input plus options with no bespoke modal of its own.
24
+ *
25
+ * Hand it a configured {@link ModalCommandBuilder}; the modal builds it. The strip is rendered after
26
+ * the buttons, so it sits along the bottom edge where a `SuggestModal`'s instruction bar sits.
27
+ */
28
+ readonly commandBuilder?: ModalCommandBuilder;
29
+ /**
30
+ * The way {@link PromptParams.commandBuilder}'s controls are rendered.
31
+ *
32
+ * @default `ModalCommandsRenderMode.Instructions`
33
+ */
34
+ readonly commandsRenderMode?: ModalCommandsRenderMode;
20
35
  /**
21
36
  * A default value to pre-fill the input field.
22
37
  *
@@ -145,144 +145,10 @@ __export(suggest_modal_command_builder_exports, {
145
145
  SuggestModalCommandBuilder: () => SuggestModalCommandBuilder
146
146
  });
147
147
  module.exports = __toCommonJS(suggest_modal_command_builder_exports);
148
- var import_obsidian = require('obsidian');
149
- const KEYS_MAP = /* @__PURE__ */ new Map([
150
- ["Enter", "\u21B5"],
151
- ["UpDown", "\u2191\u2193"]
152
- ]);
153
- class SuggestModalCommandBuilder {
154
- instructions = [];
155
- /**
156
- * Adds an interactive checkbox to the instruction bar, bound to a modifier+key shortcut that toggles
157
- * it.
158
- *
159
- * @param command - The checkbox command to add.
160
- * @returns The builder instance for chaining.
161
- */
162
- addCheckbox(command) {
163
- this.instructions.push({
164
- command: this.buildCommand(command),
165
- init: (purposeEl, scope) => {
166
- const checkboxEl = purposeEl.createEl("input", { type: "checkbox" });
167
- command.onInit(checkboxEl);
168
- checkboxEl.addEventListener("change", () => {
169
- command.onChange(checkboxEl.checked);
170
- });
171
- scope.register(command.modifiers ?? [], command.key, () => {
172
- if (checkboxEl.disabled) {
173
- return;
174
- }
175
- checkboxEl.checked = !checkboxEl.checked;
176
- checkboxEl.trigger("change");
177
- });
178
- },
179
- purpose: command.purpose
180
- });
181
- return this;
182
- }
183
- /**
184
- * Adds a dropdown to the instruction bar, bound to a modifier+key shortcut that cycles through its
185
- * options.
186
- *
187
- * @param command - The dropdown command to add.
188
- * @returns The builder instance for chaining.
189
- */
190
- addDropDown(command) {
191
- this.instructions.push({
192
- command: this.buildCommand(command),
193
- init: (purposeEl, scope) => {
194
- purposeEl.appendText(" ");
195
- const dropdownComponent = new import_obsidian.DropdownComponent(purposeEl);
196
- command.onInit(dropdownComponent);
197
- dropdownComponent.onChange((value) => {
198
- command.onChange(value);
199
- });
200
- scope.register(command.modifiers ?? [], command.key, () => {
201
- if (dropdownComponent.disabled) {
202
- return;
203
- }
204
- const selectEl = dropdownComponent.selectEl;
205
- selectEl.selectedIndex = (selectEl.selectedIndex + 1) % selectEl.options.length;
206
- selectEl.trigger("change");
207
- });
208
- },
209
- purpose: command.purpose
210
- });
211
- return this;
212
- }
213
- /**
214
- * Adds a keyboard command to the instruction bar. When {@link KeyboardCommand.onKey} is provided, its
215
- * handler is registered with the modal scope; otherwise the command is a hint only.
216
- *
217
- * @param command - The keyboard command to add.
218
- * @returns The builder instance for chaining.
219
- */
220
- addKeyboardCommand(command) {
221
- this.instructions.push({
222
- command: this.buildCommand(command),
223
- purpose: command.purpose,
224
- registerScope: (scope) => {
225
- if (command.onKey) {
226
- scope.register(command.modifiers ?? [], command.key, command.onKey.bind(command));
227
- }
228
- }
229
- });
230
- return this;
231
- }
232
- /**
233
- * Applies the accumulated commands to a modal. Always registers the essential navigation/action key
234
- * handlers; only renders the instruction UI and registers the option-toggle shortcuts when
235
- * {@link SuggestModalCommandBuilderBuildOptions.shouldShowInstructions} is `true`.
236
- *
237
- * @param modal - The modal to apply the commands to.
238
- * @param options - The build options.
239
- */
240
- build(modal, options = {}) {
241
- const { shouldShowInstructions = true } = options;
242
- for (const instruction of this.instructions) {
243
- instruction.registerScope?.(modal.scope);
244
- }
245
- if (!shouldShowInstructions) {
246
- return;
247
- }
248
- modal.setInstructions(this.instructions);
249
- const purposeEls = [...modal.instructionsEl.findAll(".prompt-instruction > span:nth-child(2)")];
250
- for (const [index, purposeEl] of purposeEls.entries()) {
251
- this.instructions[index]?.init?.(purposeEl, modal.scope);
252
- }
253
- }
254
- buildCommand(entry) {
255
- let command = KEYS_MAP.get(entry.key) ?? entry.key;
256
- for (const modifier of entry.modifiers ?? []) {
257
- command = `${this.getModifierString(modifier)} ${command}`;
258
- }
259
- return command;
260
- }
261
- getModifierString(modifier) {
262
- switch (modifier) {
263
- case "Alt": {
264
- return "alt";
265
- }
266
- case "Ctrl": {
267
- return "ctrl";
268
- }
269
- case "Meta": {
270
- return import_obsidian.Platform.isMacOS ? "cmd" : "win";
271
- }
272
- case "Mod": {
273
- return import_obsidian.Platform.isMacOS ? "cmd" : "ctrl";
274
- }
275
- case "Shift": {
276
- return "shift";
277
- }
278
- default: {
279
- return modifier;
280
- }
281
- }
282
- }
283
- }
148
+ var import_modal_command_builder = require('./modal-command-builder.cjs');
149
+ const SuggestModalCommandBuilder = import_modal_command_builder.ModalCommandBuilder;
284
150
  // Annotate the CommonJS export names for ESM import in node:
285
151
  0 && (module.exports = {
286
152
  SuggestModalCommandBuilder
287
153
  });
288
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgYnVpbGRlciBmb3IgYSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGFzc2VtYmxlcyB0aGUgaW5zdHJ1Y3Rpb24gYmFyIHNob3duIGF0IHRoZSBib3R0b20gb2YgYVxuICoge0BsaW5rIFN1Z2dlc3RNb2RhbH06IGtleWJvYXJkLWNvbW1hbmQgaGludHMgKHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5hZGRLZXlib2FyZENvbW1hbmR9KSxcbiAqIGludGVyYWN0aXZlIGNoZWNrYm94ZXMgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXRcbiAqICh7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIuYWRkQ2hlY2tib3h9KSwgYW5kIGRyb3Bkb3ducyBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dFxuICogKHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5hZGREcm9wRG93bn0pLiBDaGFpbiB0aGUgYGFkZCpgIGNhbGxzLCB0aGVuIGFwcGx5IGV2ZXJ5dGhpbmcgdG8gYVxuICogbW9kYWwgd2l0aCB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9OlxuICpcbiAqIGBgYHRzXG4gKiBuZXcgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIoKVxuICogICAuYWRkS2V5Ym9hcmRDb21tYW5kKHsga2V5OiAnRW50ZXInLCBtb2RpZmllcnM6IFsnTW9kJ10sIG9uS2V5LCBwdXJwb3NlOiAndG8gY3JlYXRlJyB9KVxuICogICAuYWRkQ2hlY2tib3goeyBrZXk6ICcxJywgbW9kaWZpZXJzOiBbJ0FsdCddLCBvbkNoYW5nZSwgb25Jbml0LCBwdXJwb3NlOiAnRml4IGZvb3Rub3RlcycgfSlcbiAqICAgLmJ1aWxkKG1vZGFsKTtcbiAqIGBgYFxuICpcbiAqIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0gYWx3YXlzIHJlZ2lzdGVycyB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24vYWN0aW9uIGtleVxuICogaGFuZGxlcnMsIGJ1dCBvbmx5IHJlbmRlcnMgdGhlIGluc3RydWN0aW9uIFVJIGFuZCByZWdpc3RlcnMgdGhlIG9wdGlvbi10b2dnbGUgc2hvcnRjdXRzIHdoZW5cbiAqIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEluc3RydWN0aW9uLFxuICBLZXltYXBDb250ZXh0LFxuICBNb2RpZmllcixcbiAgU2NvcGUsXG4gIFN1Z2dlc3RNb2RhbFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIERyb3Bkb3duQ29tcG9uZW50LFxuICBQbGF0Zm9ybVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmNvbnN0IEtFWVNfTUFQID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICBbJ0VudGVyJywgJ1x1MjFCNSddLFxuICBbJ1VwRG93bicsICdcdTIxOTFcdTIxOTMnXVxuXSk7XG5cbi8qKlxuICogQSBjaGVja2JveCBjb21tYW5kIHNob3duIGluIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0ncyBpbnN0cnVjdGlvbiBiYXIgYW5kIGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5XG4gKiBzaG9ydGN1dCB0aGF0IHRvZ2dsZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tib3hDb21tYW5kIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdGhhdCB0b2dnbGVzIHRoZSBjaGVja2JveC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIENoZWNrYm94Q29tbWFuZC5rZXl9IHRvIHRvZ2dsZSB0aGUgY2hlY2tib3guIFdoZW4gb21pdHRlZCwgbm9cbiAgICogbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjaGVja2JveCB2YWx1ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gaXNDaGVja2VkIC0gVGhlIG5ldyBjaGVja2VkIHN0YXRlLlxuICAgKi9cbiAgb25DaGFuZ2UoaXNDaGVja2VkOiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uY2Ugd2l0aCB0aGUgY3JlYXRlZCBjaGVja2JveCBlbGVtZW50LCB0byBpbml0aWFsaXplIGl0cyBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGNoZWNrYm94RWwgLSBUaGUgY3JlYXRlZCBjaGVja2JveCBlbGVtZW50LlxuICAgKi9cbiAgb25Jbml0KGNoZWNrYm94RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc2hvd24gbmV4dCB0byB0aGUgY2hlY2tib3ggaW4gdGhlIGluc3RydWN0aW9uIGJhci5cbiAgICovXG4gIHB1cnBvc2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGRyb3Bkb3duIGNvbW1hbmQgc2hvd24gaW4gYSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSdzIGluc3RydWN0aW9uIGJhciBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXlcbiAqIHNob3J0Y3V0IHRoYXQgY3ljbGVzIHRocm91Z2ggaXRzIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcERvd25Db21tYW5kIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdGhhdCBjeWNsZXMgdGhlIGRyb3Bkb3duIHRvIGl0cyBuZXh0IG9wdGlvbi5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIERyb3BEb3duQ29tbWFuZC5rZXl9IHRvIGN5Y2xlIHRoZSBkcm9wZG93bi4gV2hlbiBvbWl0dGVkLCBub1xuICAgKiBtb2RpZmllcnMgYXJlIHJlcXVpcmVkLlxuICAgKi9cbiAgbW9kaWZpZXJzPzogTW9kaWZpZXJbXTtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGRyb3Bkb3duIHZhbHVlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBuZXdseSBzZWxlY3RlZCB2YWx1ZS5cbiAgICovXG4gIG9uQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSB3aXRoIHRoZSBjcmVhdGVkIGRyb3Bkb3duIGNvbXBvbmVudCwgdG8gaW5pdGlhbGl6ZSBpdHMgb3B0aW9ucyBhbmQgc3RhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBkcm9wZG93bkNvbXBvbmVudCAtIFRoZSBjcmVhdGVkIGRyb3Bkb3duIGNvbXBvbmVudC5cbiAgICovXG4gIG9uSW5pdChkcm9wZG93bkNvbXBvbmVudDogRHJvcGRvd25Db21wb25lbnQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc2hvd24gbmV4dCB0byB0aGUgZHJvcGRvd24gaW4gdGhlIGluc3RydWN0aW9uIGJhci5cbiAgICovXG4gIHB1cnBvc2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGtleWJvYXJkIGNvbW1hbmQgc2hvd24gaW4gYSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSdzIGluc3RydWN0aW9uIGJhciBhbmQgb3B0aW9uYWxseSBib3VuZCB0byBhXG4gKiBtb2RpZmllcitrZXkgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlib2FyZENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIGtleSBzaG93biBpbiB0aGUgaW5zdHJ1Y3Rpb24gYmFyIChhbmQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBtb2RhbCBzY29wZSB3aGVuXG4gICAqIHtAbGluayBLZXlib2FyZENvbW1hbmQub25LZXl9IGlzIHByb3ZpZGVkKS5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIEtleWJvYXJkQ29tbWFuZC5rZXl9LiBXaGVuIG9taXR0ZWQsIG5vIG1vZGlmaWVycyBhcmUgcmVxdWlyZWQuXG4gICAqL1xuICBtb2RpZmllcnM/OiBNb2RpZmllcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlciBpbnZva2VkIHdoZW4gdGhlIHNob3J0Y3V0IGlzIHByZXNzZWQuIFdoZW4gb21pdHRlZCwgdGhlIGNvbW1hbmQgaXMgYSBoaW50IG9ubHkgYW5kIG5vXG4gICAqIHNjb3BlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBrZXlib2FyZCBldmVudC5cbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUga2V5bWFwIGNvbnRleHQuXG4gICAqIEByZXR1cm5zIGBmYWxzZWAgdG8gcHJldmVudCBPYnNpZGlhbidzIGRlZmF1bHQgaGFuZGxpbmcsIG9yIGB2b2lkYC9gdHJ1ZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgb25LZXk/KCRldmVudDogS2V5Ym9hcmRFdmVudCwgY29udGV4dDogS2V5bWFwQ29udGV4dCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biBuZXh0IHRvIHRoZSBrZXkgaW4gdGhlIGluc3RydWN0aW9uIGJhci5cbiAgICovXG4gIHB1cnBvc2U6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVuZGVyIHRoZSBpbnN0cnVjdGlvbiBiYXIgKGNoZWNrYm94ZXMsIGRyb3Bkb3ducywga2V5Ym9hcmQgaGludHMpIGFuZCByZWdpc3RlciB0aGVcbiAgICogb3B0aW9uLXRvZ2dsZSBrZXlib2FyZCBzaG9ydGN1dHMuIFdoZW4gYGZhbHNlYCwgbm8gaW5zdHJ1Y3Rpb24gVUkgaXMgc2hvd24gYW5kIHRoZSBvcHRpb24tdG9nZ2xlXG4gICAqIHNob3J0Y3V0cyBhcmUgbm90IHJlZ2lzdGVyZWQ7IG9ubHkgdGhlIGVzc2VudGlhbCBuYXZpZ2F0aW9uIGtleSBoYW5kbGVycyByZW1haW4gYWN0aXZlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dJbnN0cnVjdGlvbnM/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSW5zdHJ1Y3Rpb25FeCBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgaW5pdD8ocHVycG9zZUVsOiBIVE1MU3BhbkVsZW1lbnQsIHNjb3BlOiBTY29wZSk6IHZvaWQ7XG4gIHJlZ2lzdGVyU2NvcGU/KHNjb3BlOiBTY29wZSk6IHZvaWQ7XG59XG5cbi8qKlxuICogQnVpbGRzIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0ncyBpbnN0cnVjdGlvbiBiYXIgZnJvbSBrZXlib2FyZCBjb21tYW5kcywgaW50ZXJhY3RpdmUgY2hlY2tib3hlcywgYW5kXG4gKiBkcm9wZG93bnMsIHRoZW4gYXBwbGllcyB0aGVtIHRvIGEgbW9kYWwgdmlhIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbnRlcmFjdGl2ZSBjaGVja2JveCB0byB0aGUgaW5zdHJ1Y3Rpb24gYmFyLCBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCB0aGF0IHRvZ2dsZXNcbiAgICogaXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNoZWNrYm94IGNvbW1hbmQgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWRkQ2hlY2tib3goY29tbWFuZDogQ2hlY2tib3hDb21tYW5kKTogdGhpcyB7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh7XG4gICAgICBjb21tYW5kOiB0aGlzLmJ1aWxkQ29tbWFuZChjb21tYW5kKSxcbiAgICAgIGluaXQ6IChwdXJwb3NlRWwsIHNjb3BlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94RWwgPSBwdXJwb3NlRWwuY3JlYXRlRWwoJ2lucHV0JywgeyB0eXBlOiAnY2hlY2tib3gnIH0pO1xuICAgICAgICBjb21tYW5kLm9uSW5pdChjaGVja2JveEVsKTtcbiAgICAgICAgY2hlY2tib3hFbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgY29tbWFuZC5vbkNoYW5nZShjaGVja2JveEVsLmNoZWNrZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzY29wZS5yZWdpc3Rlcihjb21tYW5kLm1vZGlmaWVycyA/PyBbXSwgY29tbWFuZC5rZXksICgpID0+IHtcbiAgICAgICAgICBpZiAoY2hlY2tib3hFbC5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGVja2JveEVsLmNoZWNrZWQgPSAhY2hlY2tib3hFbC5jaGVja2VkO1xuICAgICAgICAgIGNoZWNrYm94RWwudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkcm9wZG93biB0byB0aGUgaW5zdHJ1Y3Rpb24gYmFyLCBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCB0aGF0IGN5Y2xlcyB0aHJvdWdoIGl0c1xuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBkcm9wZG93biBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZERyb3BEb3duKGNvbW1hbmQ6IERyb3BEb3duQ29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgY29tbWFuZDogdGhpcy5idWlsZENvbW1hbmQoY29tbWFuZCksXG4gICAgICBpbml0OiAocHVycG9zZUVsLCBzY29wZSkgPT4ge1xuICAgICAgICBwdXJwb3NlRWwuYXBwZW5kVGV4dCgnICcpO1xuICAgICAgICBjb25zdCBkcm9wZG93bkNvbXBvbmVudCA9IG5ldyBEcm9wZG93bkNvbXBvbmVudChwdXJwb3NlRWwpO1xuICAgICAgICBjb21tYW5kLm9uSW5pdChkcm9wZG93bkNvbXBvbmVudCk7XG4gICAgICAgIGRyb3Bkb3duQ29tcG9uZW50Lm9uQ2hhbmdlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGNvbW1hbmQub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZGVmZW5zaXZlID8/IG9uIG9wdGlvbmFsIG1vZGlmaWVycy4gKi9cbiAgICAgICAgc2NvcGUucmVnaXN0ZXIoY29tbWFuZC5tb2RpZmllcnMgPz8gW10sIGNvbW1hbmQua2V5LCAoKSA9PiB7XG4gICAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgICBpZiAoZHJvcGRvd25Db21wb25lbnQuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc2VsZWN0RWwgPSBkcm9wZG93bkNvbXBvbmVudC5zZWxlY3RFbDtcbiAgICAgICAgICBzZWxlY3RFbC5zZWxlY3RlZEluZGV4ID0gKHNlbGVjdEVsLnNlbGVjdGVkSW5kZXggKyAxKSAlIHNlbGVjdEVsLm9wdGlvbnMubGVuZ3RoO1xuICAgICAgICAgIHNlbGVjdEVsLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwdXJwb3NlOiBjb21tYW5kLnB1cnBvc2VcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEga2V5Ym9hcmQgY29tbWFuZCB0byB0aGUgaW5zdHJ1Y3Rpb24gYmFyLiBXaGVuIHtAbGluayBLZXlib2FyZENvbW1hbmQub25LZXl9IGlzIHByb3ZpZGVkLCBpdHNcbiAgICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIG1vZGFsIHNjb3BlOyBvdGhlcndpc2UgdGhlIGNvbW1hbmQgaXMgYSBoaW50IG9ubHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGtleWJvYXJkIGNvbW1hbmQgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWRkS2V5Ym9hcmRDb21tYW5kKGNvbW1hbmQ6IEtleWJvYXJkQ29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgY29tbWFuZDogdGhpcy5idWlsZENvbW1hbmQoY29tbWFuZCksXG4gICAgICBwdXJwb3NlOiBjb21tYW5kLnB1cnBvc2UsXG4gICAgICByZWdpc3RlclNjb3BlOiAoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQub25LZXkpIHtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gZGVmZW5zaXZlID8/IG9uIG9wdGlvbmFsIG1vZGlmaWVycy4gKi9cbiAgICAgICAgICBzY29wZS5yZWdpc3Rlcihjb21tYW5kLm1vZGlmaWVycyA/PyBbXSwgY29tbWFuZC5rZXksIGNvbW1hbmQub25LZXkuYmluZChjb21tYW5kKSk7XG4gICAgICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGFjY3VtdWxhdGVkIGNvbW1hbmRzIHRvIGEgbW9kYWwuIEFsd2F5cyByZWdpc3RlcnMgdGhlIGVzc2VudGlhbCBuYXZpZ2F0aW9uL2FjdGlvbiBrZXlcbiAgICogaGFuZGxlcnM7IG9ubHkgcmVuZGVycyB0aGUgaW5zdHJ1Y3Rpb24gVUkgYW5kIHJlZ2lzdGVycyB0aGUgb3B0aW9uLXRvZ2dsZSBzaG9ydGN1dHMgd2hlblxuICAgKiB7QGxpbmsgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnMuc2hvdWxkU2hvd0luc3RydWN0aW9uc30gaXMgYHRydWVgLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kYWwgLSBUaGUgbW9kYWwgdG8gYXBwbHkgdGhlIGNvbW1hbmRzIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGJ1aWxkKG1vZGFsOiBTdWdnZXN0TW9kYWw8dW5rbm93bj4sIG9wdGlvbnM6IFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCB7IHNob3VsZFNob3dJbnN0cnVjdGlvbnMgPSB0cnVlIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gRXNzZW50aWFsIG5hdmlnYXRpb24vYWN0aW9uIGtleSBoYW5kbGVycyBtdXN0IHN0YXkgYWN0aXZlIGV2ZW4gd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gYmFyIGlzIGhpZGRlbi5cbiAgICBmb3IgKGNvbnN0IGluc3RydWN0aW9uIG9mIHRoaXMuaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBpbnN0cnVjdGlvbi5yZWdpc3RlclNjb3BlPy4obW9kYWwuc2NvcGUpO1xuICAgIH1cblxuICAgIGlmICghc2hvdWxkU2hvd0luc3RydWN0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1vZGFsLnNldEluc3RydWN0aW9ucyh0aGlzLmluc3RydWN0aW9ucyk7XG4gICAgY29uc3QgcHVycG9zZUVscyA9IFsuLi5tb2RhbC5pbnN0cnVjdGlvbnNFbC5maW5kQWxsKCcucHJvbXB0LWluc3RydWN0aW9uID4gc3BhbjpudGgtY2hpbGQoMiknKV0gYXMgSFRNTFNwYW5FbGVtZW50W107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHB1cnBvc2VFbF0gb2YgcHVycG9zZUVscy5lbnRyaWVzKCkpIHtcbiAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25zW2luZGV4XT8uaW5pdD8uKHB1cnBvc2VFbCwgbW9kYWwuc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb21tYW5kKGVudHJ5OiBLZXlib2FyZENvbW1hbmQpOiBzdHJpbmcge1xuICAgIGxldCBjb21tYW5kID0gS0VZU19NQVAuZ2V0KGVudHJ5LmtleSkgPz8gZW50cnkua2V5O1xuXG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBlbnRyeS5tb2RpZmllcnMgPz8gW10pIHtcbiAgICAgIGNvbW1hbmQgPSBgJHt0aGlzLmdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyKX0gJHtjb21tYW5kfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbW1hbmQ7XG4gIH1cblxuICBwcml2YXRlIGdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyOiBNb2RpZmllcik6IHN0cmluZyB7XG4gICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICByZXR1cm4gJ2FsdCc7XG4gICAgICB9XG4gICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICByZXR1cm4gJ2N0cmwnO1xuICAgICAgfVxuICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmlzTWFjT1MgPyAnY21kJyA6ICd3aW4nO1xuICAgICAgfVxuICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICByZXR1cm4gUGxhdGZvcm0uaXNNYWNPUyA/ICdjbWQnIDogJ2N0cmwnO1xuICAgICAgfVxuICAgICAgY2FzZSAnU2hpZnQnOiB7XG4gICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gbW9kaWZpZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdDQSxzQkFHTztBQUVQLE1BQU0sV0FBVyxvQkFBSSxJQUFvQjtBQUFBLEVBQ3ZDLENBQUMsU0FBUyxRQUFHO0FBQUEsRUFDYixDQUFDLFVBQVUsY0FBSTtBQUNqQixDQUFDO0FBaUlNLE1BQU0sMkJBQTJCO0FBQUEsRUFDckIsZUFBZ0MsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTM0MsWUFBWSxTQUFnQztBQUNqRCxTQUFLLGFBQWEsS0FBSztBQUFBLE1BQ3JCLFNBQVMsS0FBSyxhQUFhLE9BQU87QUFBQSxNQUNsQyxNQUFNLENBQUMs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
154
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBmb3JtZXIgaG9tZSBvZiB0aGUgYFN1Z2dlc3RNb2RhbGAgaW5zdHJ1Y3Rpb24tYmFyIGJ1aWxkZXIuXG4gKlxuICogVGhlIGJ1aWxkZXIgaXMgbm8gbG9uZ2VyIHRpZWQgdG8gYFN1Z2dlc3RNb2RhbGAgXHUyMDE0IGl0IHJlbmRlcnMgaW50byBhIHBsYWluIGBNb2RhbGAgYW5kIGludG8gYSBiYXJlXG4gKiBlbGVtZW50ICsgYFNjb3BlYCB0b28gXHUyMDE0IHNvIGl0IG1vdmVkIHRvIGBtb2RhbC1jb21tYW5kLWJ1aWxkZXIudHNgIHVuZGVyIHRoZSBob25lc3QgbmFtZVxuICoge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9LiBUaGlzIG1vZHVsZSBzdGF5cyBhcyBhIGRlcHJlY2F0ZWQgYWxpYXMgc28gZXhpc3RpbmcgaW1wb3J0ZXJzIGtlZXAgd29ya2luZ1xuICogdW5jaGFuZ2VkOyBpdCByZS1leHBvcnRzIHRoZSB2ZXJ5IHNhbWUgY2xhc3MsIG5vdCBhIGNvcHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5pbXBvcnQgeyBNb2RhbENvbW1hbmRCdWlsZGVyIH0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG5leHBvcnQgdHlwZSB7XG4gIENoZWNrYm94Q29tbWFuZCxcbiAgRHJvcERvd25Db21tYW5kLFxuICBLZXlib2FyZENvbW1hbmRcbn0gZnJvbSAnLi9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTdWdnZXN0TW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zfSBmcm9tXG4gKiBgb2JzaWRpYW4tZGV2LXV0aWxzL29ic2lkaWFuL21vZGFscy9tb2RhbC1jb21tYW5kLWJ1aWxkZXJgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCB0eXBlIFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyQnVpbGRPcHRpb25zID0gTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucztcblxuLyoqXG4gKiBCdWlsZHMgYSBgU3VnZ2VzdE1vZGFsYCdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbW9kYWxzL21vZGFsLWNvbW1hbmQtYnVpbGRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFN1Z2dlc3RNb2RhbENvbW1hbmRCdWlsZGVyID0gTW9kYWxDb21tYW5kQnVpbGRlcjtcblxuLyoqXG4gKiBCdWlsZHMgYSBgU3VnZ2VzdE1vZGFsYCdzIGluc3RydWN0aW9uIGJhci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXJ9IGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbW9kYWxzL21vZGFsLWNvbW1hbmQtYnVpbGRlcmAgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdE1vZGFsQ29tbWFuZEJ1aWxkZXIgPSBNb2RhbENvbW1hbmRCdWlsZGVyO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSxtQ0FBb0M7QUFzQjdCLE1BQU0sNkJBQTZCOyIsCiAgIm5hbWVzIjogW10KfQo=