obsidian-dev-utils 96.5.4 → 96.6.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.
- package/CHANGELOG.md +4 -0
- package/dist/integration-test-plugin/main.js +335 -142
- package/dist/lib/cjs/__merged.cjs +6 -1
- package/dist/lib/cjs/__merged.d.cts +1 -0
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/obsidian/css-class.cjs +7 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +27 -0
- package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/modals/modal-command-builder.cjs +460 -0
- package/dist/lib/cjs/obsidian/modals/modal-command-builder.d.cts +281 -0
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +7 -1
- package/dist/lib/cjs/obsidian/modals/prompt.d.cts +15 -0
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +3 -137
- package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +23 -159
- package/dist/lib/esm/__merged.d.mts +1 -0
- package/dist/lib/esm/__merged.mjs +7 -1
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/obsidian/css-class.d.mts +27 -0
- package/dist/lib/esm/obsidian/css-class.mjs +7 -1
- package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
- package/dist/lib/esm/obsidian/modals/modal-command-builder.d.mts +281 -0
- package/dist/lib/esm/obsidian/modals/modal-command-builder.mjs +357 -0
- package/dist/lib/esm/obsidian/modals/prompt.d.mts +15 -0
- package/dist/lib/esm/obsidian/modals/prompt.mjs +7 -1
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +23 -159
- package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +3 -140
- package/dist/styles.css +44 -1
- package/obsidian/modals/modal-command-builder/package.json +6 -0
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export * as 'alert' from './alert.cjs';
|
|
3
3
|
export * as 'confirm' from './confirm.cjs';
|
|
4
4
|
export * as 'minimizable-modal' from './minimizable-modal.cjs';
|
|
5
|
+
export * as 'modal-command-builder' from './modal-command-builder.cjs';
|
|
5
6
|
export * as 'modal' from './modal.cjs';
|
|
6
7
|
export * as 'prompt' from './prompt.cjs';
|
|
7
8
|
export * as 'select-item' from './select-item.cjs';
|
|
@@ -0,0 +1,460 @@
|
|
|
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
|
+
(function () {
|
|
7
|
+
function ensureBrowserProcess() {
|
|
8
|
+
const browserProcess = {
|
|
9
|
+
browser: true,
|
|
10
|
+
cwd() {
|
|
11
|
+
return '/';
|
|
12
|
+
},
|
|
13
|
+
env: {},
|
|
14
|
+
platform: 'android'
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
18
|
+
const existingProcess = globalThis.process;
|
|
19
|
+
|
|
20
|
+
if (!existingProcess) {
|
|
21
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
22
|
+
globalThis.process = browserProcess;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (existingProcess.versions?.node) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const existingProcessRecord = existingProcess;
|
|
31
|
+
|
|
32
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
33
|
+
existingProcessRecord[key] ??= value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
existingProcessRecord['browser'] = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function keepName($unknown) {
|
|
40
|
+
return $unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function initCjs() {
|
|
44
|
+
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
45
|
+
const globalThisRecord = globalThis;
|
|
46
|
+
globalThisRecord['__name'] ??= keepName;
|
|
47
|
+
const originalRequire = require;
|
|
48
|
+
if (originalRequire && !originalRequire.__isPatched) {
|
|
49
|
+
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
50
|
+
require = Object.assign(
|
|
51
|
+
(id) => requirePatched(id),
|
|
52
|
+
originalRequire,
|
|
53
|
+
{
|
|
54
|
+
__isPatched: true
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
60
|
+
|
|
61
|
+
ensureBrowserProcess();
|
|
62
|
+
|
|
63
|
+
function extractDefault(module) {
|
|
64
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
68
|
+
'@codemirror/autocomplete',
|
|
69
|
+
'@codemirror/collab',
|
|
70
|
+
'@codemirror/commands',
|
|
71
|
+
'@codemirror/language',
|
|
72
|
+
'@codemirror/lint',
|
|
73
|
+
'@codemirror/search',
|
|
74
|
+
'@codemirror/state',
|
|
75
|
+
'@codemirror/text',
|
|
76
|
+
'@codemirror/view',
|
|
77
|
+
'@lezer/common',
|
|
78
|
+
'@lezer/highlight',
|
|
79
|
+
'@lezer/lr',
|
|
80
|
+
'obsidian']
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
84
|
+
'@codemirror/closebrackets',
|
|
85
|
+
'@codemirror/comment',
|
|
86
|
+
'@codemirror/fold',
|
|
87
|
+
'@codemirror/gutter',
|
|
88
|
+
'@codemirror/highlight',
|
|
89
|
+
'@codemirror/history',
|
|
90
|
+
'@codemirror/matchbrackets',
|
|
91
|
+
'@codemirror/panel',
|
|
92
|
+
'@codemirror/rangeset',
|
|
93
|
+
'@codemirror/rectangular-selection',
|
|
94
|
+
'@codemirror/stream-parser',
|
|
95
|
+
'@codemirror/tooltip']
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
function requirePatched(id) {
|
|
99
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
100
|
+
return originalRequire?.(id);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
104
|
+
if (globalThis.app.isMobile) {
|
|
105
|
+
if (id === 'process' || id === 'node:process') {
|
|
106
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
107
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
108
|
+
|
|
109
|
+
return process;
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
const module = originalRequire?.(id);
|
|
113
|
+
if (module) {
|
|
114
|
+
return extractDefault(module);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
119
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
120
|
+
return {};
|
|
121
|
+
}
|
|
122
|
+
})();
|
|
123
|
+
})();
|
|
124
|
+
|
|
125
|
+
"use strict";
|
|
126
|
+
var __defProp = Object.defineProperty;
|
|
127
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
128
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
129
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
130
|
+
var __export = (target, all) => {
|
|
131
|
+
for (var name in all)
|
|
132
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
133
|
+
};
|
|
134
|
+
var __copyProps = (to, from, except, desc) => {
|
|
135
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
136
|
+
for (let key of __getOwnPropNames(from))
|
|
137
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
138
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
139
|
+
}
|
|
140
|
+
return to;
|
|
141
|
+
};
|
|
142
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
143
|
+
var modal_command_builder_exports = {};
|
|
144
|
+
__export(modal_command_builder_exports, {
|
|
145
|
+
ModalCommandBuilder: () => ModalCommandBuilder,
|
|
146
|
+
ModalCommandsRenderMode: () => ModalCommandsRenderMode
|
|
147
|
+
});
|
|
148
|
+
module.exports = __toCommonJS(modal_command_builder_exports);
|
|
149
|
+
var import_obsidian = require('obsidian');
|
|
150
|
+
var import_css_class = require('../css-class.cjs');
|
|
151
|
+
var import_plugin_context = require('../plugin/plugin-context.cjs');
|
|
152
|
+
const KEYS_MAP = /* @__PURE__ */ new Map([
|
|
153
|
+
["Enter", "\u21B5"],
|
|
154
|
+
["UpDown", "\u2191\u2193"]
|
|
155
|
+
]);
|
|
156
|
+
var ModalCommandsRenderMode = /* @__PURE__ */ ((ModalCommandsRenderMode2) => {
|
|
157
|
+
ModalCommandsRenderMode2["Buttons"] = "buttons";
|
|
158
|
+
ModalCommandsRenderMode2["Instructions"] = "instructions";
|
|
159
|
+
return ModalCommandsRenderMode2;
|
|
160
|
+
})(ModalCommandsRenderMode || {});
|
|
161
|
+
const NOOP_MODAL_COMMANDS = {
|
|
162
|
+
refresh: () => {
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
class ModalCommandBuilder {
|
|
166
|
+
entries = [];
|
|
167
|
+
/**
|
|
168
|
+
* Adds an interactive checkbox to the control strip, bound to a modifier+key shortcut that toggles it.
|
|
169
|
+
*
|
|
170
|
+
* @param command - The checkbox command to add.
|
|
171
|
+
* @returns The builder instance for chaining.
|
|
172
|
+
*/
|
|
173
|
+
addCheckbox(command) {
|
|
174
|
+
this.entries.push({
|
|
175
|
+
checkIsAvailable: command.checkIsAvailable ?? null,
|
|
176
|
+
commandText: this.buildCommandText(command),
|
|
177
|
+
initButton: (buttonEl, scope) => {
|
|
178
|
+
const checkboxEl = createEl("input", { type: "checkbox" });
|
|
179
|
+
initCheckbox(checkboxEl, scope);
|
|
180
|
+
buttonEl.addEventListener("click", () => {
|
|
181
|
+
toggleCheckbox(checkboxEl);
|
|
182
|
+
});
|
|
183
|
+
return {
|
|
184
|
+
checkIsOn: () => checkboxEl.checked,
|
|
185
|
+
setDisabled: (isDisabled) => {
|
|
186
|
+
checkboxEl.disabled = isDisabled;
|
|
187
|
+
buttonEl.disabled = isDisabled;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
},
|
|
191
|
+
initInstruction: (purposeEl, scope) => initCheckbox(purposeEl.createEl("input", { type: "checkbox" }), scope),
|
|
192
|
+
isDropDown: false,
|
|
193
|
+
purpose: command.purpose,
|
|
194
|
+
registerScope: null
|
|
195
|
+
});
|
|
196
|
+
return this;
|
|
197
|
+
function initCheckbox(checkboxEl, scope) {
|
|
198
|
+
command.onInit(checkboxEl);
|
|
199
|
+
checkboxEl.addEventListener("change", () => {
|
|
200
|
+
command.onChange(checkboxEl.checked);
|
|
201
|
+
});
|
|
202
|
+
scope.register(command.modifiers ?? [], command.key, () => {
|
|
203
|
+
toggleCheckbox(checkboxEl);
|
|
204
|
+
});
|
|
205
|
+
return {
|
|
206
|
+
setDisabled: (isDisabled) => {
|
|
207
|
+
checkboxEl.disabled = isDisabled;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Adds a dropdown to the control strip, bound to a modifier+key shortcut that cycles through its
|
|
214
|
+
* options.
|
|
215
|
+
*
|
|
216
|
+
* @param command - The dropdown command to add.
|
|
217
|
+
* @returns The builder instance for chaining.
|
|
218
|
+
*/
|
|
219
|
+
addDropDown(command) {
|
|
220
|
+
this.entries.push({
|
|
221
|
+
checkIsAvailable: command.checkIsAvailable ?? null,
|
|
222
|
+
commandText: this.buildCommandText(command),
|
|
223
|
+
initButton: null,
|
|
224
|
+
initInstruction: (purposeEl, scope) => {
|
|
225
|
+
purposeEl.appendText(" ");
|
|
226
|
+
const dropdownComponent = new import_obsidian.DropdownComponent(purposeEl);
|
|
227
|
+
command.onInit(dropdownComponent);
|
|
228
|
+
dropdownComponent.onChange((value) => {
|
|
229
|
+
command.onChange(value);
|
|
230
|
+
});
|
|
231
|
+
scope.register(command.modifiers ?? [], command.key, () => {
|
|
232
|
+
if (dropdownComponent.disabled) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const selectEl = dropdownComponent.selectEl;
|
|
236
|
+
selectEl.selectedIndex = (selectEl.selectedIndex + 1) % selectEl.options.length;
|
|
237
|
+
selectEl.trigger("change");
|
|
238
|
+
});
|
|
239
|
+
return {
|
|
240
|
+
setDisabled: (isDisabled) => {
|
|
241
|
+
dropdownComponent.setDisabled(isDisabled);
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
},
|
|
245
|
+
isDropDown: true,
|
|
246
|
+
purpose: command.purpose,
|
|
247
|
+
registerScope: null
|
|
248
|
+
});
|
|
249
|
+
return this;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Adds a keyboard command to the control strip. When {@link KeyboardCommand.onKey} is provided, its
|
|
253
|
+
* handler is registered with the modal scope; otherwise the command is a hint only.
|
|
254
|
+
*
|
|
255
|
+
* @param command - The keyboard command to add.
|
|
256
|
+
* @returns The builder instance for chaining.
|
|
257
|
+
*/
|
|
258
|
+
addKeyboardCommand(command) {
|
|
259
|
+
const checkIsOn = command.checkIsOn ?? (() => false);
|
|
260
|
+
const onActivate = command.onActivate ?? null;
|
|
261
|
+
const onKey = command.onKey?.bind(command) ?? null;
|
|
262
|
+
this.entries.push({
|
|
263
|
+
checkIsAvailable: command.checkIsAvailable ?? null,
|
|
264
|
+
commandText: this.buildCommandText(command),
|
|
265
|
+
initButton: onActivate ? (buttonEl) => {
|
|
266
|
+
buttonEl.addEventListener("click", ($event) => {
|
|
267
|
+
onActivate($event);
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
checkIsOn,
|
|
271
|
+
setDisabled: (isDisabled) => {
|
|
272
|
+
buttonEl.disabled = isDisabled;
|
|
273
|
+
}
|
|
274
|
+
};
|
|
275
|
+
} : null,
|
|
276
|
+
initInstruction: null,
|
|
277
|
+
isDropDown: false,
|
|
278
|
+
purpose: command.purpose,
|
|
279
|
+
registerScope: onKey ? (scope) => {
|
|
280
|
+
scope.register(command.modifiers ?? [], command.key, onKey);
|
|
281
|
+
} : null
|
|
282
|
+
});
|
|
283
|
+
return this;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Applies the accumulated commands to a modal. Always registers the essential navigation/action key
|
|
287
|
+
* handlers; only renders the control strip and registers the option-toggle shortcuts when
|
|
288
|
+
* {@link ModalCommandBuilderBuildOptions.shouldShowInstructions} is `true`.
|
|
289
|
+
*
|
|
290
|
+
* @param target - The modal, or the bare element + scope, to apply the commands to.
|
|
291
|
+
* @param options - The build options.
|
|
292
|
+
* @returns A handle whose {@link ModalCommands.refresh} re-states every rendered control.
|
|
293
|
+
*/
|
|
294
|
+
build(target, options = {}) {
|
|
295
|
+
const {
|
|
296
|
+
renderMode = "instructions" /* Instructions */,
|
|
297
|
+
shouldShowInstructions = true
|
|
298
|
+
} = options;
|
|
299
|
+
const scope = target.scope;
|
|
300
|
+
for (const entry of this.entries) {
|
|
301
|
+
entry.registerScope?.(scope);
|
|
302
|
+
}
|
|
303
|
+
if (!shouldShowInstructions) {
|
|
304
|
+
return NOOP_MODAL_COMMANDS;
|
|
305
|
+
}
|
|
306
|
+
const refreshers = renderMode === "buttons" /* Buttons */ ? this.renderButtons(target, scope) : this.renderInstructions(target, scope);
|
|
307
|
+
const modalCommands = {
|
|
308
|
+
refresh: () => {
|
|
309
|
+
for (const refreshControl of refreshers) {
|
|
310
|
+
refreshControl();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
};
|
|
314
|
+
modalCommands.refresh();
|
|
315
|
+
return modalCommands;
|
|
316
|
+
}
|
|
317
|
+
buildCommandText(command) {
|
|
318
|
+
let commandText = KEYS_MAP.get(command.key) ?? command.key;
|
|
319
|
+
for (const modifier of command.modifiers ?? []) {
|
|
320
|
+
commandText = `${this.getModifierString(modifier)} ${commandText}`;
|
|
321
|
+
}
|
|
322
|
+
return commandText;
|
|
323
|
+
}
|
|
324
|
+
getModifierString(modifier) {
|
|
325
|
+
switch (modifier) {
|
|
326
|
+
case "Alt": {
|
|
327
|
+
return "alt";
|
|
328
|
+
}
|
|
329
|
+
case "Ctrl": {
|
|
330
|
+
return "ctrl";
|
|
331
|
+
}
|
|
332
|
+
case "Meta": {
|
|
333
|
+
return import_obsidian.Platform.isMacOS ? "cmd" : "win";
|
|
334
|
+
}
|
|
335
|
+
case "Mod": {
|
|
336
|
+
return import_obsidian.Platform.isMacOS ? "cmd" : "ctrl";
|
|
337
|
+
}
|
|
338
|
+
case "Shift": {
|
|
339
|
+
return "shift";
|
|
340
|
+
}
|
|
341
|
+
default: {
|
|
342
|
+
return modifier;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Resolves the element a self-created strip is appended to.
|
|
348
|
+
*
|
|
349
|
+
* A {@link Modal} carries both `modalEl` and a `containerEl` that is the OUTER `.modal-container`, so
|
|
350
|
+
* `modalEl` has to win — otherwise the strip lands outside the modal frame. Discriminated with `in`
|
|
351
|
+
* rather than a property read, because tests hand `build` a `strictProxy` mock whose `get` trap throws
|
|
352
|
+
* on unmocked members.
|
|
353
|
+
*
|
|
354
|
+
* @param target - The build target.
|
|
355
|
+
* @returns The element to append the strip to.
|
|
356
|
+
*/
|
|
357
|
+
getStripContainerEl(target) {
|
|
358
|
+
return "modalEl" in target ? target.modalEl : target.containerEl;
|
|
359
|
+
}
|
|
360
|
+
renderButtons(target, scope) {
|
|
361
|
+
const stripEl = this.getStripContainerEl(target).createDiv();
|
|
362
|
+
(0, import_plugin_context.addPluginCssClasses)(stripEl, import_css_class.CssClass.ModalCommands);
|
|
363
|
+
const refreshers = [];
|
|
364
|
+
for (const entry of this.entries) {
|
|
365
|
+
if (entry.isDropDown) {
|
|
366
|
+
throw new Error(`Cannot render dropdown command "${entry.purpose}" as a button: a control that cycles has no button form.`);
|
|
367
|
+
}
|
|
368
|
+
if (!entry.initButton) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
371
|
+
const buttonEl = stripEl.createEl("button", { type: "button" });
|
|
372
|
+
(0, import_plugin_context.addPluginCssClasses)(buttonEl, import_css_class.CssClass.ModalCommand);
|
|
373
|
+
buttonEl.createSpan({ text: entry.purpose });
|
|
374
|
+
if (!import_obsidian.Platform.isMobile) {
|
|
375
|
+
const hotkeyEl = buttonEl.createSpan({ text: entry.commandText });
|
|
376
|
+
(0, import_plugin_context.addPluginCssClasses)(hotkeyEl, import_css_class.CssClass.ModalCommandHotkey);
|
|
377
|
+
}
|
|
378
|
+
buttonEl.addEventListener("mousedown", ($event) => {
|
|
379
|
+
$event.preventDefault();
|
|
380
|
+
});
|
|
381
|
+
const buttonControl = entry.initButton(buttonEl, scope);
|
|
382
|
+
const checkIsAvailable = entry.checkIsAvailable;
|
|
383
|
+
refreshers.push(() => {
|
|
384
|
+
if (checkIsAvailable) {
|
|
385
|
+
buttonControl.setDisabled(!checkIsAvailable());
|
|
386
|
+
}
|
|
387
|
+
const isOn = buttonControl.checkIsOn();
|
|
388
|
+
buttonEl.toggleClass(import_css_class.CssClass.IsActive, isOn);
|
|
389
|
+
buttonEl.setAttribute("aria-pressed", String(isOn));
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
return refreshers;
|
|
393
|
+
}
|
|
394
|
+
renderInstructions(target, scope) {
|
|
395
|
+
const instructions = this.entries.map((entry) => ({
|
|
396
|
+
command: entry.commandText,
|
|
397
|
+
entry,
|
|
398
|
+
purpose: entry.purpose
|
|
399
|
+
}));
|
|
400
|
+
const purposeEls = "setInstructions" in target ? this.renderNativeInstructions(target, instructions) : this.renderOwnInstructions(this.getStripContainerEl(target), instructions);
|
|
401
|
+
const refreshers = [];
|
|
402
|
+
for (const [index, instruction] of instructions.entries()) {
|
|
403
|
+
const purposeEl = purposeEls[index];
|
|
404
|
+
if (!purposeEl) {
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const instructionControl = instruction.entry.initInstruction?.(purposeEl, scope);
|
|
408
|
+
const checkIsAvailable = instruction.entry.checkIsAvailable;
|
|
409
|
+
if (instructionControl && checkIsAvailable) {
|
|
410
|
+
refreshers.push(() => {
|
|
411
|
+
instructionControl.setDisabled(!checkIsAvailable());
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return refreshers;
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Renders through Obsidian's own instruction bar, the way every {@link SuggestModal} consumer has always
|
|
419
|
+
* had it.
|
|
420
|
+
*
|
|
421
|
+
* @param modal - The suggest modal.
|
|
422
|
+
* @param instructions - The instructions to render.
|
|
423
|
+
* @returns The purpose element of each rendered instruction.
|
|
424
|
+
*/
|
|
425
|
+
renderNativeInstructions(modal, instructions) {
|
|
426
|
+
modal.setInstructions(instructions);
|
|
427
|
+
return [...modal.instructionsEl.findAll(".prompt-instruction > span:nth-child(2)")];
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Renders an instruction bar of the builder's own, for a host that has none.
|
|
431
|
+
*
|
|
432
|
+
* The markup mirrors what `setInstructions` produces, so Obsidian's own styling applies unchanged.
|
|
433
|
+
*
|
|
434
|
+
* @param containerEl - The element to append the bar to.
|
|
435
|
+
* @param instructions - The instructions to render.
|
|
436
|
+
* @returns The purpose element of each rendered instruction.
|
|
437
|
+
*/
|
|
438
|
+
renderOwnInstructions(containerEl, instructions) {
|
|
439
|
+
const instructionsEl = containerEl.createDiv(import_css_class.CssClass.PromptInstructions);
|
|
440
|
+
(0, import_plugin_context.addPluginCssClasses)(instructionsEl, import_css_class.CssClass.ModalCommands);
|
|
441
|
+
return instructions.map((instruction) => {
|
|
442
|
+
const instructionEl = instructionsEl.createDiv(import_css_class.CssClass.PromptInstruction);
|
|
443
|
+
instructionEl.createSpan({ text: instruction.command });
|
|
444
|
+
return instructionEl.createSpan({ text: instruction.purpose });
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function toggleCheckbox(checkboxEl) {
|
|
449
|
+
if (checkboxEl.disabled) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
checkboxEl.checked = !checkboxEl.checked;
|
|
453
|
+
checkboxEl.trigger("change");
|
|
454
|
+
}
|
|
455
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
456
|
+
0 && (module.exports = {
|
|
457
|
+
ModalCommandBuilder,
|
|
458
|
+
ModalCommandsRenderMode
|
|
459
|
+
});
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9tb2RhbC1jb21tYW5kLWJ1aWxkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIGJ1aWxkZXIgZm9yIGEgbW9kYWwncyBjb250cm9sIHN0cmlwLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyfSBhc3NlbWJsZXMgdGhlIHN0cmlwIG9mIGNvbnRyb2xzIHNob3duIGF0IHRoZSBib3R0b20gb2YgYSBtb2RhbDpcbiAqIGtleWJvYXJkLWNvbW1hbmQgaGludHMgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZEtleWJvYXJkQ29tbWFuZH0pLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzIGJvdW5kIHRvXG4gKiBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCAoe0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYWRkQ2hlY2tib3h9KSwgYW5kIGRyb3Bkb3ducyBib3VuZCB0byBhIG1vZGlmaWVyK2tleVxuICogc2hvcnRjdXQgKHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmFkZERyb3BEb3dufSkuIENoYWluIHRoZSBgYWRkKmAgY2FsbHMsIHRoZW4gYXBwbHkgZXZlcnl0aGluZyB0byBhXG4gKiBtb2RhbCB3aXRoIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfTpcbiAqXG4gKiBgYGB0c1xuICogbmV3IE1vZGFsQ29tbWFuZEJ1aWxkZXIoKVxuICogICAuYWRkS2V5Ym9hcmRDb21tYW5kKHsga2V5OiAnRW50ZXInLCBtb2RpZmllcnM6IFsnTW9kJ10sIG9uS2V5LCBwdXJwb3NlOiAndG8gY3JlYXRlJyB9KVxuICogICAuYWRkQ2hlY2tib3goeyBrZXk6ICcxJywgbW9kaWZpZXJzOiBbJ0FsdCddLCBvbkNoYW5nZSwgb25Jbml0LCBwdXJwb3NlOiAnRml4IGZvb3Rub3RlcycgfSlcbiAqICAgLmJ1aWxkKG1vZGFsKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBzdHJpcCBpcyBkZXNjcmliZWQgYnkgdHdvIGluZGVwZW5kZW50IGF4ZXM6XG4gKlxuICogLSAqKldoZXJlIGl0IGlzIGhvc3RlZC4qKiBBIHtAbGluayBTdWdnZXN0TW9kYWx9IGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGVcbiAqICAga2VlcHMgT2JzaWRpYW4ncyBvd24gaW5zdHJ1Y3Rpb24gYmFyIChgc2V0SW5zdHJ1Y3Rpb25zYCArIGBpbnN0cnVjdGlvbnNFbGApLiBFdmVyeSBvdGhlciB0YXJnZXQgXHUyMDE0IGFcbiAqICAgcGxhaW4ge0BsaW5rIE1vZGFsfSwgb3IgYSBiYXJlIHtAbGluayBNb2RhbENvbW1hbmRzSG9zdH0gb2YgYW4gZWxlbWVudCBwbHVzIGEgYFNjb3BlYCBcdTIwMTQgZ2V0cyBhIHN0cmlwXG4gKiAgIGVsZW1lbnQgdGhlIGJ1aWxkZXIgY3JlYXRlcyBpdHNlbGYuXG4gKiAtICoqSG93IGVhY2ggY29udHJvbCBsb29rcy4qKiB7QGxpbmsgTW9kYWxDb21tYW5kc1JlbmRlck1vZGUuSW5zdHJ1Y3Rpb25zfSByZW5kZXJzIHRoZSBwdXJwb3NlIHRleHQgd2l0aFxuICogICBhbiBpbmxpbmUgY2hlY2tib3ggb3IgZHJvcGRvd247IHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSByZW5kZXJzIG9uZSBjbGlja2FibGUgYnV0dG9uXG4gKiAgIHBlciBjb250cm9sLCBjYXJyeWluZyBpdHMgcHJlc3NlZCBhbmQgZGlzYWJsZWQgc3RhdGUuXG4gKlxuICogVGhlIGF4ZXMgYXJlIGluZGVwZW5kZW50IGJlY2F1c2UgYSBidXR0b24gc3RyaXAgaW5zaWRlIGEge0BsaW5rIFN1Z2dlc3RNb2RhbH0gaXMgYSByZWFsIGNvbWJpbmF0aW9uLlxuICpcbiAqIHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhbHdheXMgcmVnaXN0ZXJzIHRoZSBlc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzLCBidXRcbiAqIG9ubHkgcmVuZGVycyB0aGUgY29udHJvbCBVSSBhbmQgcmVnaXN0ZXJzIHRoZSBvcHRpb24tdG9nZ2xlIHNob3J0Y3V0cyB3aGVuXG4gKiB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAgKHRoZSBkZWZhdWx0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEluc3RydWN0aW9uLFxuICBLZXltYXBDb250ZXh0LFxuICBNb2RhbCxcbiAgTW9kaWZpZXIsXG4gIFNjb3BlLFxuICBTdWdnZXN0TW9kYWxcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBEcm9wZG93bkNvbXBvbmVudCxcbiAgUGxhdGZvcm1cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcblxuY29uc3QgS0VZU19NQVAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gIFsnRW50ZXInLCAnXHUyMUI1J10sXG4gIFsnVXBEb3duJywgJ1x1MjE5MVx1MjE5MyddXG5dKTtcblxuLyoqXG4gKiBUaGUgd2F5IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSByZW5kZXJzIGVhY2ggY29udHJvbC5cbiAqL1xuZXhwb3J0IGVudW0gTW9kYWxDb21tYW5kc1JlbmRlck1vZGUge1xuICAvKipcbiAgICogT25lIGNsaWNrYWJsZSBidXR0b24gcGVyIGNvbnRyb2wsIGNhcnJ5aW5nIGl0cyBwcmVzc2VkIChgYXJpYS1wcmVzc2VkYCkgYW5kIGRpc2FibGVkIHN0YXRlLlxuICAgKlxuICAgKiBPbmx5IGNvbnRyb2xzIHJlYWNoYWJsZSBieSBwb2ludGVyIGFyZSByZW5kZXJlZCBcdTIwMTQgY2hlY2tib3hlcywgYW5kIGtleWJvYXJkIGNvbW1hbmRzIHRoYXQgc3VwcGx5XG4gICAqIHtAbGluayBLZXlib2FyZENvbW1hbmQub25BY3RpdmF0ZX0uIEEgaGludC1vbmx5IG9yIGtleWJvYXJkLW9ubHkgY29tbWFuZCBzdGlsbCByZWdpc3RlcnMgaXRzIGhhbmRsZXJcbiAgICogYnV0IHJlbmRlcnMgbm8gYnV0dG9uLCBiZWNhdXNlIGEgYnV0dG9uIG5vYm9keSBjYW4gcHJlc3MgaXMgd29yc2UgdGhhbiBubyBidXR0b24uIEEgZHJvcGRvd24gdGhyb3dzOlxuICAgKiBhIGNvbnRyb2wgdGhhdCBDWUNMRVMgaGFzIG5vIGJ1dHRvbiBmb3JtLlxuICAgKi9cbiAgQnV0dG9ucyA9ICdidXR0b25zJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBpbnN0cnVjdGlvbi1iYXIgbG9vazogdGhlIHNob3J0Y3V0LCB0aGVuIHRoZSBwdXJwb3NlIHRleHQgd2l0aCBhbiBpbmxpbmUgY2hlY2tib3ggb3JcbiAgICogZHJvcGRvd24uXG4gICAqL1xuICBJbnN0cnVjdGlvbnMgPSAnaW5zdHJ1Y3Rpb25zJ1xufVxuXG4vKipcbiAqIEEgY2hlY2tib3ggY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzXG4gKiBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja2JveENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hlY2tib3ggdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGlzQ2hlY2tlZCAtIFRoZSBuZXcgY2hlY2tlZCBzdGF0ZS5cbiAgICovXG4gIG9uQ2hhbmdlKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudCwgdG8gaW5pdGlhbGl6ZSBpdHMgc3RhdGUuXG4gICAqXG4gICAqIEluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zfSBtb2RlIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgYnV0IG5ldmVyIGFwcGVuZGVkIFx1MjAxNCB0aGVcbiAgICogYnV0dG9uIGlzIGEgdmlldyBvZiBpdCBcdTIwMTQgc28gdGhlIHNhbWUgaW5pdGlhbGl6YXRpb24gY29kZSBzZXJ2ZXMgYm90aCByZW5kZXIgbW9kZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjaGVja2JveEVsIC0gVGhlIGNyZWF0ZWQgY2hlY2tib3ggZWxlbWVudC5cbiAgICovXG4gIG9uSW5pdChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgbWVtYmVycyBldmVyeSBjb21tYW5kIHNoYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb250cm9sIGNhbiBiZSB1c2VkIHJpZ2h0IG5vdy4gV2hlbiBpdCByZXR1cm5zIGBmYWxzZWAgdGhlIGNvbnRyb2wgaXMgcmVuZGVyZWRcbiAgICogKipkaXNhYmxlZCByYXRoZXIgdGhhbiByZW1vdmVkKiosIHNvIHRoZSBzdHJpcCBkb2VzIG5vdCByZWZsb3cgdW5kZXIgdGhlIHBvaW50ZXIgYXMgbW9kZXMgY2hhbmdlIFx1MjAxNFxuICAgKiB3aGljaCBvbiBhIHBob25lIG1lYW5zIGEgbWlzLXRhcC5cbiAgICpcbiAgICogUmUtcmVhZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kcy5yZWZyZXNofS4gV2hlbiBvbWl0dGVkLCB0aGUgYnVpbGRlciBuZXZlciB0b3VjaGVzIHRoZSBjb250cm9sJ3NcbiAgICogZGlzYWJsZWQgc3RhdGUsIGxlYXZpbmcgd2hhdGV2ZXIge0BsaW5rIENoZWNrYm94Q29tbWFuZC5vbkluaXR9IC8ge0BsaW5rIERyb3BEb3duQ29tbWFuZC5vbkluaXR9IHNldC5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29udHJvbCBjYW4gYmUgdXNlZCByaWdodCBub3cuXG4gICAqL1xuICBjaGVja0lzQXZhaWxhYmxlPyh0aGlzOiB2b2lkKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGtleSB0aGF0IGFjdGl2YXRlcyB0aGUgY29tbWFuZC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXJzIGNvbWJpbmVkIHdpdGgge0BsaW5rIENvbW1hbmRCYXNlLmtleX0uIFdoZW4gb21pdHRlZCwgbm8gbW9kaWZpZXJzIGFyZSByZXF1aXJlZC5cbiAgICovXG4gIG1vZGlmaWVycz86IE1vZGlmaWVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biBuZXh0IHRvIHRoZSBjb250cm9sLlxuICAgKi9cbiAgcHVycG9zZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgZHJvcGRvd24gY29tbWFuZCBzaG93biBpbiBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBhbmQgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCBjeWNsZXNcbiAqIHRocm91Z2ggaXRzIG9wdGlvbnMuXG4gKlxuICogU3VwcG9ydGVkIGluIHtAbGluayBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnN9IG1vZGUgb25seS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEcm9wRG93bkNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kQmFzZSB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZHJvcGRvd24gdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG5ld2x5IHNlbGVjdGVkIHZhbHVlLlxuICAgKi9cbiAgb25DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbmNlIHdpdGggdGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LCB0byBpbml0aWFsaXplIGl0cyBvcHRpb25zIGFuZCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIGRyb3Bkb3duQ29tcG9uZW50IC0gVGhlIGNyZWF0ZWQgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgb25Jbml0KGRyb3Bkb3duQ29tcG9uZW50OiBEcm9wZG93bkNvbXBvbmVudCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQSBrZXlib2FyZCBjb21tYW5kIHNob3duIGluIGEgbW9kYWwncyBjb250cm9sIHN0cmlwIGFuZCBvcHRpb25hbGx5IGJvdW5kIHRvIGEgbW9kaWZpZXIra2V5IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Ym9hcmRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZEJhc2Uge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgY29tbWFuZCByZWFkcyBhcyBPTi4gU3VwcGx5IGl0IGZvciBhIHRvZ2dsZSB3aG9zZSBzdGF0ZSBsaXZlcyBvdXRzaWRlIHRoZSBzdHJpcDsgb21pdCBpdFxuICAgKiBmb3IgYW4gYWN0aW9uLCB3aGljaCBkb2VzIHNvbWV0aGluZyBhbmQgaXMgZG9uZS4gQSB7QGxpbmsgQ2hlY2tib3hDb21tYW5kfSBuZWVkcyBubyBlcXVpdmFsZW50IFx1MjAxNCBpdHNcbiAgICogY2hlY2tib3ggZWxlbWVudCBpcyB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFJlLXJlYWQgYnkge0BsaW5rIE1vZGFsQ29tbWFuZHMucmVmcmVzaH0uXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgcmVhZHMgYXMgT04uXG4gICAqL1xuICBjaGVja0lzT24/KHRoaXM6IHZvaWQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciByb3V0ZSBpbnRvIHRoZSBzYW1lIGhhbmRsZXIgdGhlIHNob3J0Y3V0IHJ1bnMuIFJlcXVpcmVkIGZvciB0aGUgY29tbWFuZCB0byByZW5kZXIgYVxuICAgKiBidXR0b24gaW4ge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkJ1dHRvbnN9IG1vZGUgXHUyMDE0IG9uIGEgcGhvbmUgdGhlcmUgaXMgbm8gbW9kaWZpZXIga2V5IHRvXG4gICAqIHByZXNzLCBzbyB0aGlzIGlzIHRoZSBvbmx5IHdheSBpbi5cbiAgICpcbiAgICogQHBhcmFtICRldmVudCAtIFRoZSBjbGljayBldmVudCwgc28gYSBjb21tYW5kIHRoYXQgcGlja3Mgc29tZXRoaW5nIGhhcyBvbmUgdG8gaGFuZCBvbi5cbiAgICovXG4gIG9uQWN0aXZhdGU/KHRoaXM6IHZvaWQsICRldmVudDogTW91c2VFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGVyIGludm9rZWQgd2hlbiB0aGUgc2hvcnRjdXQgaXMgcHJlc3NlZC4gV2hlbiBvbWl0dGVkLCB0aGUgY29tbWFuZCBpcyBhIGhpbnQgb25seSBhbmQgbm9cbiAgICogc2NvcGUgaGFuZGxlciBpcyByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gJGV2ZW50IC0gVGhlIGtleWJvYXJkIGV2ZW50LlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBrZXltYXAgY29udGV4dC5cbiAgICogQHJldHVybnMgYGZhbHNlYCB0byBwcmV2ZW50IE9ic2lkaWFuJ3MgZGVmYXVsdCBoYW5kbGluZywgb3IgYHZvaWRgL2B0cnVlYCBvdGhlcndpc2UuXG4gICAqL1xuICBvbktleT8oJGV2ZW50OiBLZXlib2FyZEV2ZW50LCBjb250ZXh0OiBLZXltYXBDb250ZXh0KTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgd2F5IGVhY2ggY29udHJvbCBpcyByZW5kZXJlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE1vZGFsQ29tbWFuZHNSZW5kZXJNb2RlLkluc3RydWN0aW9uc31cbiAgICovXG4gIHJlYWRvbmx5IHJlbmRlck1vZGU/OiBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNvbnRyb2wgc3RyaXAgKGNoZWNrYm94ZXMsIGRyb3Bkb3ducywga2V5Ym9hcmQgaGludHMpIGFuZCByZWdpc3RlciB0aGVcbiAgICogb3B0aW9uLXRvZ2dsZSBrZXlib2FyZCBzaG9ydGN1dHMuIFdoZW4gYGZhbHNlYCwgbm8gY29udHJvbCBVSSBpcyBzaG93biBhbmQgdGhlIG9wdGlvbi10b2dnbGVcbiAgICogc2hvcnRjdXRzIGFyZSBub3QgcmVnaXN0ZXJlZDsgb25seSB0aGUgZXNzZW50aWFsIG5hdmlnYXRpb24ga2V5IGhhbmRsZXJzIHJlbWFpbiBhY3RpdmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0luc3RydWN0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGhhbmRsZSByZXR1cm5lZCBieSB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlci5idWlsZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kcyB7XG4gIC8qKlxuICAgKiBCcmluZ3MgZXZlcnkgcmVuZGVyZWQgY29udHJvbCdzIGRpc2FibGVkIGFuZCBwcmVzc2VkIHN0YXRlIHVwIHRvIGRhdGUsIGJ5IHJlLXJlYWRpbmdcbiAgICoge0BsaW5rIENvbW1hbmRCYXNlLmNoZWNrSXNBdmFpbGFibGV9IGFuZCB7QGxpbmsgS2V5Ym9hcmRDb21tYW5kLmNoZWNrSXNPbn0uXG4gICAqXG4gICAqIFRoZSBzdHJpcCBpcyBidWlsdCBvbmNlIGFuZCBvbmx5IHJlLXN0YXRlZCBhZnRlcndhcmRzLCBiZWNhdXNlIHJlYnVpbGRpbmcgaXQgd291bGQgcmVwbGFjZSBhbiBlbGVtZW50XG4gICAqIHRoZSBwb2ludGVyIG1heSBiZSBhYm91dCB0byBjbGljay5cbiAgICovXG4gIHJlZnJlc2goKTogdm9pZDtcbn1cblxuLyoqXG4gKiBBIGJhcmUgaG9zdCBmb3IgYSBjb250cm9sIHN0cmlwOiB0aGUgZWxlbWVudCB0byByZW5kZXIgaW50bywgcGx1cyB0aGUgc2NvcGUgdG8gcmVnaXN0ZXIgc2hvcnRjdXRzIHdpdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kYWxDb21tYW5kc0hvc3Qge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdGhlIGNvbnRyb2wgc3RyaXAgaXMgYXBwZW5kZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzY29wZSB0aGUgc2hvcnRjdXRzIGFyZSByZWdpc3RlcmVkIHdpdGguXG4gICAqL1xuICByZWFkb25seSBzY29wZTogU2NvcGU7XG59XG5cbi8qKlxuICogRXZlcnkgdGFyZ2V0IHtAbGluayBNb2RhbENvbW1hbmRCdWlsZGVyLmJ1aWxkfSBhY2NlcHRzLlxuICovXG5leHBvcnQgdHlwZSBNb2RhbENvbW1hbmRzVGFyZ2V0ID0gTW9kYWwgfCBNb2RhbENvbW1hbmRzSG9zdCB8IFN1Z2dlc3RNb2RhbDx1bmtub3duPjtcblxuLyoqXG4gKiBPbmUgYWNjdW11bGF0ZWQgY29tbWFuZCwgcmVkdWNlZCB0byB0aGUgaGFuZGZ1bCBvZiB0aGluZ3MgYm90aCByZW5kZXJlcnMgbmVlZC5cbiAqXG4gKiBPcHRpb25hbCBjb2xsYWJvcmF0b3JzIGFyZSBgbnVsbCB8IFhgIHJlcXVpcmVkIGZpZWxkcyByYXRoZXIgdGhhbiBgP2AsIHNvIGV2ZXJ5IGNvbnN0cnVjdGlvbiBzaXRlIGhhcyB0b1xuICogc2F5IHdoaWNoIG9uZXMgaXQgaGFzLlxuICovXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGFzIGEgQlVUVE9OLlxuICpcbiAqIEl0IHJlcG9ydHMgaXRzIG93biBwcmVzc2VkIHN0YXRlLCBiZWNhdXNlIG9ubHkgdGhlIGJ1dHRvbiByZW5kZXJlciBoYXMgYW55d2hlcmUgdG8gc2hvdyBvbmUuXG4gKi9cbmludGVyZmFjZSBCdXR0b25Db250cm9sIHtcbiAgY2hlY2tJc09uKHRoaXM6IHZvaWQpOiBib29sZWFuO1xuICBzZXREaXNhYmxlZCh0aGlzOiB2b2lkLCBpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIENvbW1hbmRFbnRyeSB7XG4gIHJlYWRvbmx5IGNoZWNrSXNBdmFpbGFibGU6ICgodGhpczogdm9pZCkgPT4gYm9vbGVhbikgfCBudWxsO1xuICByZWFkb25seSBjb21tYW5kVGV4dDogc3RyaW5nO1xuICByZWFkb25seSBpbml0QnV0dG9uOiAoKGJ1dHRvbkVsOiBIVE1MQnV0dG9uRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBCdXR0b25Db250cm9sKSB8IG51bGw7XG4gIHJlYWRvbmx5IGluaXRJbnN0cnVjdGlvbjogKChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKSA9PiBJbnN0cnVjdGlvbkNvbnRyb2wpIHwgbnVsbDtcbiAgcmVhZG9ubHkgaXNEcm9wRG93bjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcHVycG9zZTogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RlclNjb3BlOiAoKHNjb3BlOiBTY29wZSkgPT4gdm9pZCkgfCBudWxsO1xufVxuXG4vKipcbiAqIE9uZSBjb250cm9sIHJlbmRlcmVkIGludG8gYW4gSU5TVFJVQ1RJT04gYmFyLlxuICpcbiAqIFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBwcmVzc2VkIHN0YXRlIGhlcmU6IHRoZSBjb250cm9sIFx1MjAxNCBhIGNoZWNrYm94LCBhIGRyb3Bkb3duIFx1MjAxNCBzaG93cyBpdHMgb3duLFxuICogc28gYSBzZWNvbmQgY29weSB3b3VsZCBvbmx5IGJlIGEgc2Vjb25kIHRoaW5nIHRvIGtlZXAgaW4gc3luYy5cbiAqL1xuaW50ZXJmYWNlIEluc3RydWN0aW9uQ29udHJvbCB7XG4gIHNldERpc2FibGVkKHRoaXM6IHZvaWQsIGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSW5zdHJ1Y3Rpb25FeCBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgcmVhZG9ubHkgZW50cnk6IENvbW1hbmRFbnRyeTtcbn1cblxuLyoqXG4gKiBSZS1zdGF0ZXMgb25lIHJlbmRlcmVkIGNvbnRyb2wsIGFscmVhZHkgYm91bmQgdG8gaXRzIG93biBlbGVtZW50cy5cbiAqL1xudHlwZSBSZWZyZXNoQ29udHJvbCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG5jb25zdCBOT09QX01PREFMX0NPTU1BTkRTOiBNb2RhbENvbW1hbmRzID0ge1xuICByZWZyZXNoOiAoKTogdm9pZCA9PiB7XG4gICAgLy8gTm90aGluZyB3YXMgcmVuZGVyZWQsIHNvIHRoZXJlIGlzIG5vIHN0YXRlIHRvIHJlLXN0YXRlLlxuICB9XG59O1xuXG4vKipcbiAqIEJ1aWxkcyBhIG1vZGFsJ3MgY29udHJvbCBzdHJpcCBmcm9tIGtleWJvYXJkIGNvbW1hbmRzLCBpbnRlcmFjdGl2ZSBjaGVja2JveGVzLCBhbmQgZHJvcGRvd25zLCB0aGVuXG4gKiBhcHBsaWVzIHRoZW0gdG8gYSBtb2RhbCB2aWEge0BsaW5rIE1vZGFsQ29tbWFuZEJ1aWxkZXIuYnVpbGR9LlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cmllczogQ29tbWFuZEVudHJ5W10gPSBbXTtcblxuICAvKipcbiAgICogQWRkcyBhbiBpbnRlcmFjdGl2ZSBjaGVja2JveCB0byB0aGUgY29udHJvbCBzdHJpcCwgYm91bmQgdG8gYSBtb2RpZmllcitrZXkgc2hvcnRjdXQgdGhhdCB0b2dnbGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjaGVja2JveCBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZENoZWNrYm94KGNvbW1hbmQ6IENoZWNrYm94Q29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IChidXR0b25FbDogSFRNTEJ1dHRvbkVsZW1lbnQsIHNjb3BlOiBTY29wZSk6IEJ1dHRvbkNvbnRyb2wgPT4ge1xuICAgICAgICAvLyBDcmVhdGVkIGJ1dCBuZXZlciBhcHBlbmRlZDogdGhlIGNoZWNrYm94IGhvbGRzIHRoZSBzdGF0ZSBhbmQgdGhlIGJ1dHRvbiBpcyBhIHZpZXcgb2YgaXQsIHNvXG4gICAgICAgIC8vIGBvbkluaXRgIC8gYG9uQ2hhbmdlYCBtZWFuIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgaW4gYm90aCByZW5kZXIgbW9kZXMuXG4gICAgICAgIGNvbnN0IGNoZWNrYm94RWwgPSBjcmVhdGVFbCgnaW5wdXQnLCB7IHR5cGU6ICdjaGVja2JveCcgfSk7XG4gICAgICAgIGluaXRDaGVja2JveChjaGVja2JveEVsLCBzY29wZSk7XG4gICAgICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjaGVja0lzT246ICgpOiBib29sZWFuID0+IGNoZWNrYm94RWwuY2hlY2tlZCxcbiAgICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNoZWNrYm94RWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgICAgYnV0dG9uRWwuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IGluaXRDaGVja2JveChwdXJwb3NlRWwuY3JlYXRlRWwoJ2lucHV0JywgeyB0eXBlOiAnY2hlY2tib3gnIH0pLCBzY29wZSksXG4gICAgICBpc0Ryb3BEb3duOiBmYWxzZSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcblxuICAgIGZ1bmN0aW9uIGluaXRDaGVja2JveChjaGVja2JveEVsOiBIVE1MSW5wdXRFbGVtZW50LCBzY29wZTogU2NvcGUpOiBJbnN0cnVjdGlvbkNvbnRyb2wge1xuICAgICAgY29tbWFuZC5vbkluaXQoY2hlY2tib3hFbCk7XG4gICAgICBjaGVja2JveEVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgY29tbWFuZC5vbkNoYW5nZShjaGVja2JveEVsLmNoZWNrZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICB0b2dnbGVDaGVja2JveChjaGVja2JveEVsKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICBjaGVja2JveEVsLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRyb3Bkb3duIHRvIHRoZSBjb250cm9sIHN0cmlwLCBib3VuZCB0byBhIG1vZGlmaWVyK2tleSBzaG9ydGN1dCB0aGF0IGN5Y2xlcyB0aHJvdWdoIGl0c1xuICAgKiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBkcm9wZG93biBjb21tYW5kIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZERyb3BEb3duKGNvbW1hbmQ6IERyb3BEb3duQ29tbWFuZCk6IHRoaXMge1xuICAgIHRoaXMuZW50cmllcy5wdXNoKHtcbiAgICAgIGNoZWNrSXNBdmFpbGFibGU6IGNvbW1hbmQuY2hlY2tJc0F2YWlsYWJsZSA/PyBudWxsLFxuICAgICAgY29tbWFuZFRleHQ6IHRoaXMuYnVpbGRDb21tYW5kVGV4dChjb21tYW5kKSxcbiAgICAgIGluaXRCdXR0b246IG51bGwsXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IChwdXJwb3NlRWw6IEhUTUxTcGFuRWxlbWVudCwgc2NvcGU6IFNjb3BlKTogSW5zdHJ1Y3Rpb25Db250cm9sID0+IHtcbiAgICAgICAgcHVycG9zZUVsLmFwcGVuZFRleHQoJyAnKTtcbiAgICAgICAgY29uc3QgZHJvcGRvd25Db21wb25lbnQgPSBuZXcgRHJvcGRvd25Db21wb25lbnQocHVycG9zZUVsKTtcbiAgICAgICAgY29tbWFuZC5vbkluaXQoZHJvcGRvd25Db21wb25lbnQpO1xuICAgICAgICBkcm9wZG93bkNvbXBvbmVudC5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICBjb21tYW5kLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGRlZmVuc2l2ZSA/PyBvbiBvcHRpb25hbCBtb2RpZmllcnMuICovXG4gICAgICAgIHNjb3BlLnJlZ2lzdGVyKGNvbW1hbmQubW9kaWZpZXJzID8/IFtdLCBjb21tYW5kLmtleSwgKCkgPT4ge1xuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdG9wICovXG4gICAgICAgICAgaWYgKGRyb3Bkb3duQ29tcG9uZW50LmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNlbGVjdEVsID0gZHJvcGRvd25Db21wb25lbnQuc2VsZWN0RWw7XG4gICAgICAgICAgc2VsZWN0RWwuc2VsZWN0ZWRJbmRleCA9IChzZWxlY3RFbC5zZWxlY3RlZEluZGV4ICsgMSkgJSBzZWxlY3RFbC5vcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICBzZWxlY3RFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZXREaXNhYmxlZDogKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGRyb3Bkb3duQ29tcG9uZW50LnNldERpc2FibGVkKGlzRGlzYWJsZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBpc0Ryb3BEb3duOiB0cnVlLFxuICAgICAgcHVycG9zZTogY29tbWFuZC5wdXJwb3NlLFxuICAgICAgcmVnaXN0ZXJTY29wZTogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBrZXlib2FyZCBjb21tYW5kIHRvIHRoZSBjb250cm9sIHN0cmlwLiBXaGVuIHtAbGluayBLZXlib2FyZENvbW1hbmQub25LZXl9IGlzIHByb3ZpZGVkLCBpdHNcbiAgICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIG1vZGFsIHNjb3BlOyBvdGhlcndpc2UgdGhlIGNvbW1hbmQgaXMgYSBoaW50IG9ubHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGtleWJvYXJkIGNvbW1hbmQgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBwdWJsaWMgYWRkS2V5Ym9hcmRDb21tYW5kKGNvbW1hbmQ6IEtleWJvYXJkQ29tbWFuZCk6IHRoaXMge1xuICAgIGNvbnN0IGNoZWNrSXNPbiA9IGNvbW1hbmQuY2hlY2tJc09uID8/ICgoKTogYm9vbGVhbiA9PiBmYWxzZSk7XG4gICAgY29uc3Qgb25BY3RpdmF0ZSA9IGNvbW1hbmQub25BY3RpdmF0ZSA/PyBudWxsO1xuICAgIGNvbnN0IG9uS2V5ID0gY29tbWFuZC5vbktleT8uYmluZChjb21tYW5kKSA/PyBudWxsO1xuXG4gICAgdGhpcy5lbnRyaWVzLnB1c2goe1xuICAgICAgY2hlY2tJc0F2YWlsYWJsZTogY29tbWFuZC5jaGVja0lzQXZhaWxhYmxlID8/IG51bGwsXG4gICAgICBjb21tYW5kVGV4dDogdGhpcy5idWlsZENvbW1hbmRUZXh0KGNvbW1hbmQpLFxuICAgICAgaW5pdEJ1dHRvbjogb25BY3RpdmF0ZVxuICAgICAgICAvLyBObyBkaXNhYmxlZCBndWFyZCBvbiB0aGUgbGlzdGVuZXI6IGEgZGlzYWJsZWQgYnV0dG9uIGZpcmVzIG5vIGNsaWNrIGF0IGFsbCwgc28gYHNldERpc2FibGVkYFxuICAgICAgICAvLyBCZWxvdyBpcyB0aGUgd2hvbGUgZ2F0ZS5cbiAgICAgICAgPyAoYnV0dG9uRWw6IEhUTUxCdXR0b25FbGVtZW50KTogQnV0dG9uQ29udHJvbCA9PiB7XG4gICAgICAgICAgYnV0dG9uRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBvbkFjdGl2YXRlKCRldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNoZWNrSXNPbixcbiAgICAgICAgICAgIHNldERpc2FibGVkOiAoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICBidXR0b25FbC5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICA6IG51bGwsXG4gICAgICBpbml0SW5zdHJ1Y3Rpb246IG51bGwsXG4gICAgICBpc0Ryb3BEb3duOiBmYWxzZSxcbiAgICAgIHB1cnBvc2U6IGNvbW1hbmQucHVycG9zZSxcbiAgICAgIHJlZ2lzdGVyU2NvcGU6IG9uS2V5XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBkZWZlbnNpdmUgPz8gb24gb3B0aW9uYWwgbW9kaWZpZXJzLiAqL1xuICAgICAgICA/IChzY29wZTogU2NvcGUpOiB2b2lkID0+IHtcbiAgICAgICAgICBzY29wZS5yZWdpc3Rlcihjb21tYW5kLm1vZGlmaWVycyA/PyBbXSwgY29tbWFuZC5rZXksIG9uS2V5KTtcbiAgICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICA6IG51bGxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBhY2N1bXVsYXRlZCBjb21tYW5kcyB0byBhIG1vZGFsLiBBbHdheXMgcmVnaXN0ZXJzIHRoZSBlc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5XG4gICAqIGhhbmRsZXJzOyBvbmx5IHJlbmRlcnMgdGhlIGNvbnRyb2wgc3RyaXAgYW5kIHJlZ2lzdGVycyB0aGUgb3B0aW9uLXRvZ2dsZSBzaG9ydGN1dHMgd2hlblxuICAgKiB7QGxpbmsgTW9kYWxDb21tYW5kQnVpbGRlckJ1aWxkT3B0aW9ucy5zaG91bGRTaG93SW5zdHJ1Y3Rpb25zfSBpcyBgdHJ1ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgbW9kYWwsIG9yIHRoZSBiYXJlIGVsZW1lbnQgKyBzY29wZSwgdG8gYXBwbHkgdGhlIGNvbW1hbmRzIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBidWlsZCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSB3aG9zZSB7QGxpbmsgTW9kYWxDb21tYW5kcy5yZWZyZXNofSByZS1zdGF0ZXMgZXZlcnkgcmVuZGVyZWQgY29udHJvbC5cbiAgICovXG4gIHB1YmxpYyBidWlsZCh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQsIG9wdGlvbnM6IE1vZGFsQ29tbWFuZEJ1aWxkZXJCdWlsZE9wdGlvbnMgPSB7fSk6IE1vZGFsQ29tbWFuZHMge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlbmRlck1vZGUgPSBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5JbnN0cnVjdGlvbnMsXG4gICAgICBzaG91bGRTaG93SW5zdHJ1Y3Rpb25zID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3Qgc2NvcGUgPSB0YXJnZXQuc2NvcGU7XG5cbiAgICAvLyBFc3NlbnRpYWwgbmF2aWdhdGlvbi9hY3Rpb24ga2V5IGhhbmRsZXJzIG11c3Qgc3RheSBhY3RpdmUgZXZlbiB3aGVuIHRoZSBjb250cm9sIHN0cmlwIGlzIGhpZGRlbi5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcykge1xuICAgICAgZW50cnkucmVnaXN0ZXJTY29wZT8uKHNjb3BlKTtcbiAgICB9XG5cbiAgICBpZiAoIXNob3VsZFNob3dJbnN0cnVjdGlvbnMpIHtcbiAgICAgIHJldHVybiBOT09QX01PREFMX0NPTU1BTkRTO1xuICAgIH1cblxuICAgIC8vIEVhY2ggcmVuZGVyZXIgaGFuZHMgYmFjayBvbmUgY2xvc3VyZSBwZXIgY29udHJvbCBpdCBhY3R1YWxseSBkcmV3LCBhbHJlYWR5IGJvdW5kIHRvIHRoYXQgY29udHJvbCdzXG4gICAgLy8gRWxlbWVudHMgXHUyMDE0IHNvIGByZWZyZXNoYCBuZXZlciBoYXMgdG8ga25vdyB3aGljaCBvZiB0aGUgdHdvIHNoYXBlcyBpdCBpcyByZS1zdGF0aW5nLlxuICAgIGNvbnN0IHJlZnJlc2hlcnMgPSByZW5kZXJNb2RlID09PSBNb2RhbENvbW1hbmRzUmVuZGVyTW9kZS5CdXR0b25zXG4gICAgICA/IHRoaXMucmVuZGVyQnV0dG9ucyh0YXJnZXQsIHNjb3BlKVxuICAgICAgOiB0aGlzLnJlbmRlckluc3RydWN0aW9ucyh0YXJnZXQsIHNjb3BlKTtcblxuICAgIGNvbnN0IG1vZGFsQ29tbWFuZHM6IE1vZGFsQ29tbWFuZHMgPSB7XG4gICAgICByZWZyZXNoOiAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgcmVmcmVzaENvbnRyb2wgb2YgcmVmcmVzaGVycykge1xuICAgICAgICAgIHJlZnJlc2hDb250cm9sKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIG1vZGFsQ29tbWFuZHMucmVmcmVzaCgpO1xuICAgIHJldHVybiBtb2RhbENvbW1hbmRzO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbW1hbmRUZXh0KGNvbW1hbmQ6IENvbW1hbmRCYXNlKTogc3RyaW5nIHtcbiAgICBsZXQgY29tbWFuZFRleHQgPSBLRVlTX01BUC5nZXQoY29tbWFuZC5rZXkpID8/IGNvbW1hbmQua2V5O1xuXG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBjb21tYW5kLm1vZGlmaWVycyA/PyBbXSkge1xuICAgICAgY29tbWFuZFRleHQgPSBgJHt0aGlzLmdldE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyKX0gJHtjb21tYW5kVGV4dH1gO1xuICAgIH1cblxuICAgIHJldHVybiBjb21tYW5kVGV4dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TW9kaWZpZXJTdHJpbmcobW9kaWZpZXI6IE1vZGlmaWVyKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgIHJldHVybiAnY3RybCc7XG4gICAgICB9XG4gICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICByZXR1cm4gUGxhdGZvcm0uaXNNYWNPUyA/ICdjbWQnIDogJ3dpbic7XG4gICAgICB9XG4gICAgICBjYXNlICdNb2QnOiB7XG4gICAgICAgIHJldHVybiBQbGF0Zm9ybS5pc01hY09TID8gJ2NtZCcgOiAnY3RybCc7XG4gICAgICB9XG4gICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBtb2RpZmllcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVsZW1lbnQgYSBzZWxmLWNyZWF0ZWQgc3RyaXAgaXMgYXBwZW5kZWQgdG8uXG4gICAqXG4gICAqIEEge0BsaW5rIE1vZGFsfSBjYXJyaWVzIGJvdGggYG1vZGFsRWxgIGFuZCBhIGBjb250YWluZXJFbGAgdGhhdCBpcyB0aGUgT1VURVIgYC5tb2RhbC1jb250YWluZXJgLCBzb1xuICAgKiBgbW9kYWxFbGAgaGFzIHRvIHdpbiBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBzdHJpcCBsYW5kcyBvdXRzaWRlIHRoZSBtb2RhbCBmcmFtZS4gRGlzY3JpbWluYXRlZCB3aXRoIGBpbmBcbiAgICogcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eSByZWFkLCBiZWNhdXNlIHRlc3RzIGhhbmQgYGJ1aWxkYCBhIGBzdHJpY3RQcm94eWAgbW9jayB3aG9zZSBgZ2V0YCB0cmFwIHRocm93c1xuICAgKiBvbiB1bm1vY2tlZCBtZW1iZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGJ1aWxkIHRhcmdldC5cbiAgICogQHJldHVybnMgVGhlIGVsZW1lbnQgdG8gYXBwZW5kIHRoZSBzdHJpcCB0by5cbiAgICovXG4gIHByaXZhdGUgZ2V0U3RyaXBDb250YWluZXJFbCh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuICdtb2RhbEVsJyBpbiB0YXJnZXQgPyB0YXJnZXQubW9kYWxFbCA6IHRhcmdldC5jb250YWluZXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQnV0dG9ucyh0YXJnZXQ6IE1vZGFsQ29tbWFuZHNUYXJnZXQsIHNjb3BlOiBTY29wZSk6IFJlZnJlc2hDb250cm9sW10ge1xuICAgIGNvbnN0IHN0cmlwRWwgPSB0aGlzLmdldFN0cmlwQ29udGFpbmVyRWwodGFyZ2V0KS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKHN0cmlwRWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZHMpO1xuXG4gICAgY29uc3QgcmVmcmVzaGVyczogUmVmcmVzaENvbnRyb2xbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0Ryb3BEb3duKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbmRlciBkcm9wZG93biBjb21tYW5kIFwiJHtlbnRyeS5wdXJwb3NlfVwiIGFzIGEgYnV0dG9uOiBhIGNvbnRyb2wgdGhhdCBjeWNsZXMgaGFzIG5vIGJ1dHRvbiBmb3JtLmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVudHJ5LmluaXRCdXR0b24pIHtcbiAgICAgICAgLy8gSGludC1vbmx5IGFuZCBrZXlib2FyZC1vbmx5IGNvbW1hbmRzIGhhdmUgbm8gcG9pbnRlciByb3V0ZSwgYW5kIGEgYnV0dG9uIG5vYm9keSBjYW4gcHJlc3MgaXNcbiAgICAgICAgLy8gV29yc2UgdGhhbiBubyBidXR0b24uIFRoZWlyIHNjb3BlIGhhbmRsZXJzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25FbCA9IHN0cmlwRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgdHlwZTogJ2J1dHRvbicgfSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJ1dHRvbkVsLCBDc3NDbGFzcy5Nb2RhbENvbW1hbmQpO1xuICAgICAgYnV0dG9uRWwuY3JlYXRlU3Bhbih7IHRleHQ6IGVudHJ5LnB1cnBvc2UgfSk7XG5cbiAgICAgIC8vIFRoZSBob3RrZXkgaXMgc2hvd24gb25seSB3aGVyZSBvbmUgY2FuIGJlIHByZXNzZWQuIE9uIGEgcGhvbmUgdGhlcmUgaXMgbm8gbW9kaWZpZXIga2V5IHRvIG9mZmVyLFxuICAgICAgLy8gQW5kIHRoZSBidXR0b24gSVMgdGhlIG9ubHkgd2F5IGluIFx1MjAxNCB3aGljaCBpcyB3aHkgdGhlIHN0cmlwIGV4aXN0cy5cbiAgICAgIGlmICghUGxhdGZvcm0uaXNNb2JpbGUpIHtcbiAgICAgICAgY29uc3QgaG90a2V5RWwgPSBidXR0b25FbC5jcmVhdGVTcGFuKHsgdGV4dDogZW50cnkuY29tbWFuZFRleHQgfSk7XG4gICAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoaG90a2V5RWwsIENzc0NsYXNzLk1vZGFsQ29tbWFuZEhvdGtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBpbnB1dCBrZWVwcyBmb2N1czogYSBtb2RhbCB0aGF0IGZpbHRlcnMgYXMgeW91IHR5cGUgd291bGQgZW5kIGl0cyBzZWFyY2ggbWlkLXdvcmQgaWYgYSBjbGlja1xuICAgICAgLy8gU3RvbGUgZm9jdXMuXG4gICAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJ1dHRvbkNvbnRyb2wgPSBlbnRyeS5pbml0QnV0dG9uKGJ1dHRvbkVsLCBzY29wZSk7XG4gICAgICBjb25zdCBjaGVja0lzQXZhaWxhYmxlID0gZW50cnkuY2hlY2tJc0F2YWlsYWJsZTtcbiAgICAgIHJlZnJlc2hlcnMucHVzaCgoKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0lzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgYnV0dG9uQ29udHJvbC5zZXREaXNhYmxlZCghY2hlY2tJc0F2YWlsYWJsZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc09uID0gYnV0dG9uQ29udHJvbC5jaGVja0lzT24oKTtcbiAgICAgICAgYnV0dG9uRWwudG9nZ2xlQ2xhc3MoQ3NzQ2xhc3MuSXNBY3RpdmUsIGlzT24pO1xuICAgICAgICBidXR0b25FbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtcHJlc3NlZCcsIFN0cmluZyhpc09uKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVmcmVzaGVycztcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVySW5zdHJ1Y3Rpb25zKHRhcmdldDogTW9kYWxDb21tYW5kc1RhcmdldCwgc2NvcGU6IFNjb3BlKTogUmVmcmVzaENvbnRyb2xbXSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10gPSB0aGlzLmVudHJpZXMubWFwKChlbnRyeSkgPT4gKHtcbiAgICAgIGNvbW1hbmQ6IGVudHJ5LmNvbW1hbmRUZXh0LFxuICAgICAgZW50cnksXG4gICAgICBwdXJwb3NlOiBlbnRyeS5wdXJwb3NlXG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHVycG9zZUVscyA9ICdzZXRJbnN0cnVjdGlvbnMnIGluIHRhcmdldFxuICAgICAgPyB0aGlzLnJlbmRlck5hdGl2ZUluc3RydWN0aW9ucyh0YXJnZXQsIGluc3RydWN0aW9ucylcbiAgICAgIDogdGhpcy5yZW5kZXJPd25JbnN0cnVjdGlvbnModGhpcy5nZXRTdHJpcENvbnRhaW5lckVsKHRhcmdldCksIGluc3RydWN0aW9ucyk7XG5cbiAgICBjb25zdCByZWZyZXNoZXJzOiBSZWZyZXNoQ29udHJvbFtdID0gW107XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGluc3RydWN0aW9uXSBvZiBpbnN0cnVjdGlvbnMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBwdXJwb3NlRWwgPSBwdXJwb3NlRWxzW2luZGV4XTtcbiAgICAgIC8vIEEgaG9zdCBtYXkgcmVuZGVyIGZld2VyIHB1cnBvc2UgZWxlbWVudHMgdGhhbiB0aGVyZSBhcmUgaW5zdHJ1Y3Rpb25zOyBza2lwIHJhdGhlciB0aGFuIHRocm93LlxuICAgICAgaWYgKCFwdXJwb3NlRWwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uQ29udHJvbCA9IGluc3RydWN0aW9uLmVudHJ5LmluaXRJbnN0cnVjdGlvbj8uKHB1cnBvc2VFbCwgc2NvcGUpO1xuICAgICAgY29uc3QgY2hlY2tJc0F2YWlsYWJsZSA9IGluc3RydWN0aW9uLmVudHJ5LmNoZWNrSXNBdmFpbGFibGU7XG4gICAgICAvLyBBIGNvbnRyb2wgc2hvd3MgaXRzIG93biBwcmVzc2VkIHN0YXRlIGhlcmUsIHNvIGF2YWlsYWJpbGl0eSBpcyB0aGUgb25seSB0aGluZyBsZWZ0IHRvIHJlLXN0YXRlIFx1MjAxNFxuICAgICAgLy8gQW5kIGEgY29tbWFuZCB0aGF0IGRlY2xhcmVzIG5vbmUgbmVlZHMgbm8gcmVmcmVzaGVyIGF0IGFsbC5cbiAgICAgIGlmIChpbnN0cnVjdGlvbkNvbnRyb2wgJiYgY2hlY2tJc0F2YWlsYWJsZSkge1xuICAgICAgICByZWZyZXNoZXJzLnB1c2goKCkgPT4ge1xuICAgICAgICAgIGluc3RydWN0aW9uQ29udHJvbC5zZXREaXNhYmxlZCghY2hlY2tJc0F2YWlsYWJsZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZnJlc2hlcnM7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aHJvdWdoIE9ic2lkaWFuJ3Mgb3duIGluc3RydWN0aW9uIGJhciwgdGhlIHdheSBldmVyeSB7QGxpbmsgU3VnZ2VzdE1vZGFsfSBjb25zdW1lciBoYXMgYWx3YXlzXG4gICAqIGhhZCBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIHN1Z2dlc3QgbW9kYWwuXG4gICAqIEBwYXJhbSBpbnN0cnVjdGlvbnMgLSBUaGUgaW5zdHJ1Y3Rpb25zIHRvIHJlbmRlci5cbiAgICogQHJldHVybnMgVGhlIHB1cnBvc2UgZWxlbWVudCBvZiBlYWNoIHJlbmRlcmVkIGluc3RydWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJOYXRpdmVJbnN0cnVjdGlvbnMobW9kYWw6IFN1Z2dlc3RNb2RhbDx1bmtub3duPiwgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10pOiBIVE1MU3BhbkVsZW1lbnRbXSB7XG4gICAgbW9kYWwuc2V0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIFsuLi5tb2RhbC5pbnN0cnVjdGlvbnNFbC5maW5kQWxsKCcucHJvbXB0LWluc3RydWN0aW9uID4gc3BhbjpudGgtY2hpbGQoMiknKV0gYXMgSFRNTFNwYW5FbGVtZW50W107XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhbiBpbnN0cnVjdGlvbiBiYXIgb2YgdGhlIGJ1aWxkZXIncyBvd24sIGZvciBhIGhvc3QgdGhhdCBoYXMgbm9uZS5cbiAgICpcbiAgICogVGhlIG1hcmt1cCBtaXJyb3JzIHdoYXQgYHNldEluc3RydWN0aW9uc2AgcHJvZHVjZXMsIHNvIE9ic2lkaWFuJ3Mgb3duIHN0eWxpbmcgYXBwbGllcyB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIGFwcGVuZCB0aGUgYmFyIHRvLlxuICAgKiBAcGFyYW0gaW5zdHJ1Y3Rpb25zIC0gVGhlIGluc3RydWN0aW9ucyB0byByZW5kZXIuXG4gICAqIEByZXR1cm5zIFRoZSBwdXJwb3NlIGVsZW1lbnQgb2YgZWFjaCByZW5kZXJlZCBpbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyT3duSW5zdHJ1Y3Rpb25zKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgaW5zdHJ1Y3Rpb25zOiBJbnN0cnVjdGlvbkV4W10pOiBIVE1MU3BhbkVsZW1lbnRbXSB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoQ3NzQ2xhc3MuUHJvbXB0SW5zdHJ1Y3Rpb25zKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGluc3RydWN0aW9uc0VsLCBDc3NDbGFzcy5Nb2RhbENvbW1hbmRzKTtcblxuICAgIHJldHVybiBpbnN0cnVjdGlvbnMubWFwKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25FbCA9IGluc3RydWN0aW9uc0VsLmNyZWF0ZURpdihDc3NDbGFzcy5Qcm9tcHRJbnN0cnVjdGlvbik7XG4gICAgICBpbnN0cnVjdGlvbkVsLmNyZWF0ZVNwYW4oeyB0ZXh0OiBpbnN0cnVjdGlvbi5jb21tYW5kIH0pO1xuICAgICAgcmV0dXJuIGluc3RydWN0aW9uRWwuY3JlYXRlU3Bhbih7IHRleHQ6IGluc3RydWN0aW9uLnB1cnBvc2UgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGbGlwcyBhIGNoZWNrYm94IGFuZCBhbm5vdW5jZXMgaXQsIHVubGVzcyBpdCBpcyBkaXNhYmxlZC5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIHNob3J0Y3V0IGFuZCB0aGUgYnV0dG9uIHNvIHRoZSB0d28gcm91dGVzIGNhbm5vdCBkcmlmdCBcdTIwMTQgaW5jbHVkaW5nIHRoZSBkaXNhYmxlZCBndWFyZCxcbiAqIHdoaWNoIGlzIHRoZSBoYWxmIG1vc3QgZWFzaWx5IGZvcmdvdHRlbiBvbiBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAcGFyYW0gY2hlY2tib3hFbCAtIFRoZSBjaGVja2JveCB0byB0b2dnbGUuXG4gKi9cbmZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94KGNoZWNrYm94RWw6IEhUTUxJbnB1dEVsZW1lbnQpOiB2b2lkIHtcbiAgaWYgKGNoZWNrYm94RWwuZGlzYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY2hlY2tib3hFbC5jaGVja2VkID0gIWNoZWNrYm94RWwuY2hlY2tlZDtcbiAgY2hlY2tib3hFbC50cmlnZ2VyKCdjaGFuZ2UnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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UyxVQUFVLElBQUk7QUFDNUMsaUJBQVMsYUFBYSxnQkFBZ0IsT0FBTyxJQUFJLENBQUM7QUFBQSxNQUNwRCxDQUFDO0FBQUEsSUFDSDtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUEsRUFFUSxtQkFBbUIsUUFBNkIsT0FBZ0M7QUFDdEYsVUFBTSxlQUFnQyxLQUFLLFFBQVEsSUFBSSxDQUFDLFdBQVc7QUFBQSxNQUNqRSxTQUFTLE1BQU07QUFBQSxNQUNmO0FBQUEsTUFDQSxTQUFTLE1BQU07QUFBQSxJQUNqQixFQUFFO0FBRUYsVUFBTSxhQUFhLHFCQUFxQixTQUNwQyxLQUFLLHlCQUF5QixRQUFRLFlBQVksSUFDbEQsS0FBSyxzQkFBc0IsS0FBSyxvQkFBb0IsTUFBTSxHQUFHLFlBQVk7QUFFN0UsVUFBTSxhQUErQixDQUFDO0FBQ3RDLGVBQVcsQ0FBQyxPQUFPLFdBQVcsS0FBSyxhQUFhLFFBQVEsR0FBRztBQUN6RCxZQUFNLFlBQVksV0FBVyxLQUFLO0FBRWxDLFVBQUksQ0FBQyxXQUFXO0FBQ2Q7QUFBQSxNQUNGO0FBRUEsWUFBTSxxQkFBcUIsWUFBWSxNQUFNLGtCQUFrQixXQUFXLEtBQUs7QUFDL0UsWUFBTSxtQkFBbUIsWUFBWSxNQUFNO0FBRzNDLFVBQUksc0JBQXNCLGtCQUFrQjtBQUMxQyxtQkFBVyxLQUFLLE1BQU07QUFDcEIsNkJBQW1CLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztBQUFBLFFBQ3BELENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVVEseUJBQXlCLE9BQThCLGNBQWtEO0FBQy9HLFVBQU0sZ0JBQWdCLFlBQVk7QUFDbEMsV0FBTyxDQUFDLEdBQUcsTUFBTSxlQUFlLFFBQVEseUNBQXlDLENBQUM7QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1Esc0JBQXNCLGFBQTBCLGNBQWtEO0FBQ3hHLFVBQU0saUJBQWlCLFlBQVksVUFBVSwwQkFBUyxrQkFBa0I7QUFDeEUsbURBQW9CLGdCQUFnQiwwQkFBUyxhQUFhO0FBRTFELFdBQU8sYUFBYSxJQUFJLENBQUMsZ0JBQWdCO0FBQ3ZDLFlBQU0sZ0JBQWdCLGVBQWUsVUFBVSwwQkFBUyxpQkFBaUI7QUFDekUsb0JBQWMsV0FBVyxFQUFFLE1BQU0sWUFBWSxRQUFRLENBQUM7QUFDdEQsYUFBTyxjQUFjLFdBQVcsRUFBRSxNQUFNLFlBQVksUUFBUSxDQUFDO0FBQUEsSUFDL0QsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVVBLFNBQVMsZUFBZSxZQUFvQztBQUMxRCxNQUFJLFdBQVcsVUFBVTtBQUN2QjtBQUFBLEVBQ0Y7QUFDQSxhQUFXLFVBQVUsQ0FBQyxXQUFXO0FBQ2pDLGFBQVcsUUFBUSxRQUFRO0FBQzdCOyIsCiAgIm5hbWVzIjogWyJNb2RhbENvbW1hbmRzUmVuZGVyTW9kZSJdCn0K
|