obsidian-dev-utils 84.6.0 → 84.6.1

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.
@@ -21,13 +21,13 @@ if you want to view the source, please visit the github repository of this plugi
21
21
  globalThis.process = browserProcess;
22
22
  })();
23
23
 
24
- import { around } from "monkey-around";
25
24
  import {
26
25
  Modal,
27
26
  setIcon
28
27
  } from "obsidian";
29
28
  import { Beeper } from "../../beeper.mjs";
30
- import { ensureNonNullable } from "../../type-guards.mjs";
29
+ import { AllWindowsEventComponent } from "../components/all-windows-event-component.mjs";
30
+ import { MonkeyAroundComponent } from "../components/monkey-around-component.mjs";
31
31
  import { CssClass } from "../css-class.mjs";
32
32
  import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
33
33
  const MINIMIZE_ICON_ID = "minus";
@@ -49,9 +49,55 @@ const MODIFIER_KEYS = /* @__PURE__ */ new Set([
49
49
  "Shift"
50
50
  ]);
51
51
  const peekLockEntries = /* @__PURE__ */ new Set();
52
- const documentsWithInputSuppressors = /* @__PURE__ */ new WeakSet();
53
52
  const beeper = new Beeper();
54
- let isModalOpenGuardInstalled = false;
53
+ class PeekLockComponent extends MonkeyAroundComponent {
54
+ /**
55
+ * Constructs a new instance.
56
+ *
57
+ * @param app - The app whose settings modal is guarded and whose windows suppress input while locked.
58
+ */
59
+ constructor(app) {
60
+ super();
61
+ this.app = app;
62
+ }
63
+ app;
64
+ /**
65
+ * Registers the `open` patches and the input suppressors.
66
+ */
67
+ onload() {
68
+ super.onload();
69
+ this.registerMethodPatch({
70
+ methodName: "open",
71
+ obj: Modal.prototype,
72
+ patchHandler: ({ fallback, originalThis }) => {
73
+ blockOrFallback(originalThis, fallback);
74
+ }
75
+ });
76
+ this.registerMethodPatch({
77
+ methodName: "open",
78
+ obj: this.app.setting,
79
+ patchHandler: ({ fallback, originalThis }) => {
80
+ blockOrFallback(originalThis, fallback);
81
+ }
82
+ });
83
+ const allWindowsEventComponent = this.addChild(new AllWindowsEventComponent(this.app));
84
+ allWindowsEventComponent.registerAllWindowsDomEvent({
85
+ callback: suppressKeydownWhilePeekLocked,
86
+ options: { capture: true },
87
+ type: "keydown"
88
+ });
89
+ allWindowsEventComponent.registerAllWindowsDomEvent({
90
+ callback: suppressWhilePeekLocked,
91
+ options: { capture: true },
92
+ type: "beforeinput"
93
+ });
94
+ allWindowsEventComponent.registerAllWindowsDomEvent({
95
+ callback: suppressWhilePeekLocked,
96
+ options: { capture: true },
97
+ type: "contextmenu"
98
+ });
99
+ }
100
+ }
55
101
  class MinimizableModal {
56
102
  /**
57
103
  * The wrapped modal. Open, close, and populate it as usual (e.g. `minimizable.modal.open()`).
@@ -65,9 +111,14 @@ class MinimizableModal {
65
111
  get isMinimized() {
66
112
  return this.isMinimizedValue;
67
113
  }
114
+ // Patches the wrapped modal's `onClose` to run cleanup. Persists for the wrapper's whole life (a
115
+ // Modal can be reopened, so the patch must survive each close), hence a dedicated component that is
116
+ // Never unloaded — distinct from `peekLockComponent`, whose patches live only while minimized.
117
+ closePatchComponent = new MonkeyAroundComponent();
68
118
  isMinimizedValue = false;
69
119
  minimizeButtonEl;
70
120
  minimizedBarEl = null;
121
+ peekLockComponent = null;
71
122
  peekLockEntry = null;
72
123
  /**
73
124
  * Wraps the given modal, adding a minimize button and wiring up cleanup on close.
@@ -78,6 +129,7 @@ class MinimizableModal {
78
129
  this.modal = modal;
79
130
  addPluginCssClasses(modal.containerEl, [CssClass.MinimizableModal]);
80
131
  this.minimizeButtonEl = this.createMinimizeButton();
132
+ this.closePatchComponent.load();
81
133
  this.patchOnClose(modal);
82
134
  }
83
135
  /**
@@ -141,6 +193,8 @@ class MinimizableModal {
141
193
  }
142
194
  peekLockEntries.delete(this.peekLockEntry);
143
195
  this.peekLockEntry = null;
196
+ this.peekLockComponent?.unload();
197
+ this.peekLockComponent = null;
144
198
  }
145
199
  enablePeekLock(barEl) {
146
200
  this.peekLockEntry = {
@@ -151,8 +205,8 @@ class MinimizableModal {
151
205
  innerModal: this.modal
152
206
  };
153
207
  peekLockEntries.add(this.peekLockEntry);
154
- installModalOpenGuardOnce();
155
- installInputSuppressorsOnce(this.modal.containerEl.ownerDocument);
208
+ this.peekLockComponent = new PeekLockComponent(this.modal.app);
209
+ this.peekLockComponent.load();
156
210
  }
157
211
  flashBar(barEl) {
158
212
  barEl.removeClass(CssClass.MinimizedModalBarAttention);
@@ -165,12 +219,12 @@ class MinimizableModal {
165
219
  this.isMinimizedValue = false;
166
220
  }
167
221
  patchOnClose(modal) {
168
- around(modal, {
169
- onClose: (next) => {
170
- return () => {
171
- next.call(modal);
172
- this.handleClose();
173
- };
222
+ this.closePatchComponent.registerMethodPatch({
223
+ methodName: "onClose",
224
+ obj: modal,
225
+ patchHandler: ({ fallback }) => {
226
+ fallback();
227
+ this.handleClose();
174
228
  }
175
229
  });
176
230
  }
@@ -184,37 +238,17 @@ function blockEvent(evt) {
184
238
  evt.stopImmediatePropagation();
185
239
  signalBlockedAttempt();
186
240
  }
187
- function flashMinimizedBars() {
188
- for (const entry of peekLockEntries) {
189
- entry.flash();
190
- }
191
- }
192
- function installInputSuppressorsOnce(doc) {
193
- if (documentsWithInputSuppressors.has(doc)) {
241
+ function blockOrFallback(modal, fallback) {
242
+ if (shouldBlockOpen(modal)) {
243
+ signalBlockedAttempt();
194
244
  return;
195
245
  }
196
- documentsWithInputSuppressors.add(doc);
197
- const win = ensureNonNullable(doc.defaultView);
198
- win.addEventListener("keydown", suppressKeydownWhilePeekLocked, { capture: true });
199
- win.addEventListener("beforeinput", suppressWhilePeekLocked, { capture: true });
200
- win.addEventListener("contextmenu", suppressWhilePeekLocked, { capture: true });
246
+ fallback();
201
247
  }
202
- function installModalOpenGuardOnce() {
203
- if (isModalOpenGuardInstalled) {
204
- return;
248
+ function flashMinimizedBars() {
249
+ for (const entry of peekLockEntries) {
250
+ entry.flash();
205
251
  }
206
- isModalOpenGuardInstalled = true;
207
- around(Modal.prototype, {
208
- open: (next) => {
209
- return function open() {
210
- if (isPeekLocked() && !isMinimizedInnerModal(this)) {
211
- signalBlockedAttempt();
212
- return;
213
- }
214
- next.call(this);
215
- };
216
- }
217
- });
218
252
  }
219
253
  function isMinimizedInnerModal(modal) {
220
254
  for (const entry of peekLockEntries) {
@@ -238,6 +272,9 @@ function isPeekLocked() {
238
272
  }
239
273
  return peekLockEntries.size > 0;
240
274
  }
275
+ function shouldBlockOpen(modal) {
276
+ return isPeekLocked() && !isMinimizedInnerModal(modal);
277
+ }
241
278
  function signalBlockedAttempt() {
242
279
  flashMinimizedBars();
243
280
  beeper.beep();
@@ -257,4 +294,4 @@ function suppressWhilePeekLocked(evt) {
257
294
  export {
258
295
  MinimizableModal
259
296
  };
260
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHsgYXJvdW5kIH0gZnJvbSAnbW9ua2V5LWFyb3VuZCc7XG5pbXBvcnQge1xuICBNb2RhbCxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uLy4uL2JlZXBlci50cyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG5jb25zdCBNSU5JTUlaRV9JQ09OX0lEID0gJ21pbnVzJztcbmNvbnN0IFJFU1RPUkVfSUNPTl9JRCA9ICdtYXhpbWl6ZS0yJztcblxuLy8gTmF2aWdhdGlvbiBrZXlzIHBhc3MgdGhyb3VnaCB3aGlsZSBtaW5pbWl6ZWQgc28gdGhlIHVzZXIgY2FuIG1vdmUgdGhlIGN1cnNvciBhbmQgc2Nyb2xsIHRvIHJlYWQuXG4vLyBOb25lIG9mIHRoZW0gbXV0YXRlIHRoZSBkb2N1bWVudCBcdTIwMTQgdGV4dCBjaGFuZ2VzIGFyZSBjYXVnaHQgc2VwYXJhdGVseSBieSB0aGUgYGJlZm9yZWlucHV0YCBndWFyZC5cbi8vIFNoaWZ0K25hdmlnYXRpb24gaXMgYmxvY2tlZCwgdGhvdWdoLCBzaW5jZSBpdCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdGhhdCBpbnNwZWN0aW9uIGRvZXMgbm90IG5lZWQuXG5jb25zdCBOQVZJR0FUSU9OX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQXJyb3dEb3duJyxcbiAgJ0Fycm93TGVmdCcsXG4gICdBcnJvd1JpZ2h0JyxcbiAgJ0Fycm93VXAnLFxuICAnRW5kJyxcbiAgJ0hvbWUnLFxuICAnUGFnZURvd24nLFxuICAnUGFnZVVwJ1xuXSk7XG5cbi8vIEEgYmFyZSBtb2RpZmllciBwcmVzcyBkb2VzIG5vdGhpbmcgb24gaXRzIG93biwgc28gaXQgcGFzc2VzIHRocm91Z2ggdGhlIGxvY2suXG4vLyBUaGlzIGF2b2lkcyBhIHNwdXJpb3VzIGZsYXNoL2JlZXAgd2hpbGUgY29tcG9zaW5nIGEgc2hvcnRjdXQ7IHRoZSBzaG9ydGN1dCdzIGNvbW1hbmQga2V5IGlzIGJsb2NrZWQuXG5jb25zdCBNT0RJRklFUl9LRVlTID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ0FsdCcsXG4gICdDb250cm9sJyxcbiAgJ01ldGEnLFxuICAnU2hpZnQnXG5dKTtcblxuLyoqXG4gKiBBIHJlZ2lzdGVyZWQgZW50cnkgZm9yIGEgY3VycmVudGx5LW1pbmltaXplZCBtb2RhbC4gVGhlIHNoYXJlZCBwZWVrLW9ubHkgbG9jayB1c2VzIGl0IHRvIGtub3cgYVxuICogbW9kYWwgaXMgbWluaW1pemVkLCB0byBsZWF2ZSB0aGF0IG1vZGFsJ3Mgb3duIHJlLW9wZW5zIGFsb25lLCBhbmQgdG8gZmxhc2ggaXRzIGJhciBvbiBhIGJsb2NrZWRcbiAqIGF0dGVtcHQuXG4gKi9cbmludGVyZmFjZSBQZWVrTG9ja0VudHJ5IHtcbiAgLyoqXG4gICAqIFRoZSBmbG9hdGluZyBiYXIgZWxlbWVudC4gVXNlZCB0byBkZXRlY3QgYSBzdGFsZSBlbnRyeSAoaXRzIGJhciBoYXMgbGVmdCB0aGUgRE9NKSBzbyBpdCBjYW4gYmVcbiAgICogcHJ1bmVkIGFuZCBuZXZlciBrZWVwIHRoZSBhcHAgbG9ja2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFyRWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBGbGFzaGVzIHRoZSBmbG9hdGluZyBiYXIgdG8gc2lnbmFsIGEgYmxvY2tlZCBhdHRlbXB0LlxuICAgKi9cbiAgZmxhc2goKTogdm9pZDtcblxuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwgaW5zdGFuY2UsIHNvIGl0cyBvd24gYG9wZW4oKWAgaXMgbmV2ZXIgYmxvY2tlZCBieSB0aGUgbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGlubmVyTW9kYWw6IE1vZGFsO1xufVxuXG5jb25zdCBwZWVrTG9ja0VudHJpZXMgPSBuZXcgU2V0PFBlZWtMb2NrRW50cnk+KCk7XG5jb25zdCBkb2N1bWVudHNXaXRoSW5wdXRTdXBwcmVzc29ycyA9IG5ldyBXZWFrU2V0PERvY3VtZW50PigpO1xuY29uc3QgYmVlcGVyID0gbmV3IEJlZXBlcigpO1xubGV0IGlzTW9kYWxPcGVuR3VhcmRJbnN0YWxsZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5pbWl6ZUJ1dHRvbkVsOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBtaW5pbWl6ZWRCYXJFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZWVrTG9ja0VudHJ5OiBudWxsIHwgUGVla0xvY2tFbnRyeSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFdyYXBzIHRoZSBnaXZlbiBtb2RhbCwgYWRkaW5nIGEgbWluaW1pemUgYnV0dG9uIGFuZCB3aXJpbmcgdXAgY2xlYW51cCBvbiBjbG9zZS5cbiAgICpcbiAgICogQHBhcmFtIG1vZGFsIC0gVGhlIG1vZGFsIGluc3RhbmNlIHRvIG1ha2UgbWluaW1pemFibGUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobW9kYWw6IFRNb2RhbCkge1xuICAgIHRoaXMubW9kYWwgPSBtb2RhbDtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG1vZGFsLmNvbnRhaW5lckVsLCBbQ3NzQ2xhc3MuTWluaW1pemFibGVNb2RhbF0pO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbCA9IHRoaXMuY3JlYXRlTWluaW1pemVCdXR0b24oKTtcbiAgICB0aGlzLnBhdGNoT25DbG9zZShtb2RhbCk7XG4gIH1cblxuICAvKipcbiAgICogTWluaW1pemVzIHRoZSBtb2RhbDogaGlkZXMgdGhlIG1vZGFsIGFuZCBpdHMgYmFja2Ryb3AsIHNob3dzIGEgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbixcbiAgICogYW5kIHB1dHMgdGhlIGFwcCBpbnRvIHRoZSBwZWVrLW9ubHkgbG9jay4gQSBuby1vcCBpZiB0aGUgbW9kYWwgaXMgYWxyZWFkeSBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgbWluaW1pemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IHRydWU7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsLmhpZGUoKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLmhpZGUoKTtcbiAgICAvLyBUaGUgbW9kYWwgc3RheXMgb3BlbiB3aGlsZSBtaW5pbWl6ZWQsIHNvIGl0cyBrZXltYXAgc2NvcGUgaXMgcG9wcGVkIHRvIHJlbGVhc2UgdGhlIGZvY3VzIHRyYXAuXG4gICAgLy8gUmVzdG9yaW5nIHJlLXB1c2hlcyBpdC4gQW4gYWN0aXZlIHRyYXAgd291bGQgc3RlYWwgZm9jdXMgYmFjayB0byB0aGUgaGlkZGVuIG1vZGFsLCBibG9ja2luZyB0aGVcbiAgICAvLyBNb3VzZS1kcml2ZW4gaW5zcGVjdGlvbiAoY2xpY2tpbmcgbm90ZXMsIHNjcm9sbGluZykgdGhhdCBtaW5pbWl6ZSBleGlzdHMgdG8gYWxsb3cuXG4gICAgLy8gS2V5Ym9hcmQgaW5wdXQgcmVtYWlucyBibG9ja2VkIGJ5IHRoZSBwZWVrLW9ubHkgbG9jaywgc28gcmVsZWFzaW5nIHRoZSB0cmFwIGtlZXBzIHRoZSBhcHAgaW5lcnQuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnBvcFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSB0aGlzLmNyZWF0ZU1pbmltaXplZEJhcigpO1xuICAgIHRoaXMuZW5hYmxlUGVla0xvY2sodGhpcy5taW5pbWl6ZWRCYXJFbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgdGhlIG1vZGFsIGZyb20gdGhlIG1pbmltaXplZCBzdGF0ZSwgcmVtb3ZpbmcgdGhlIGZsb2F0aW5nIGJhciBhbmQgbGlmdGluZyB0aGUgcGVlay1vbmx5XG4gICAqIGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIG5vdCBtaW5pbWl6ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICAvLyBSZS1wdXNoIHRoZSBzY29wZSBwb3BwZWQgaW4gbWluaW1pemUoKSBzbyB0aGUgcmVzdG9yZWQgbW9kYWwgYmxvY2tzIHRoZSBhcHAgYWdhaW4gKGZvY3VzIHRyYXBcbiAgICAvLyArIEVzY2FwZSBjYXB0dXJlKS5cbiAgICB0aGlzLm1vZGFsLmFwcC5rZXltYXAucHVzaFNjb3BlKHRoaXMubW9kYWwuc2NvcGUpO1xuICAgIHRoaXMubW9kYWwuY29udGFpbmVyRWwuc2hvdygpO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplQnV0dG9uKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBidXR0b25FbCA9IHRoaXMubW9kYWwubW9kYWxFbC5jcmVhdGVFbCgnYnV0dG9uJywgeyBjbHM6IENzc0NsYXNzLk1pbmltaXplQnV0dG9uIH0pO1xuICAgIHNldEljb24oYnV0dG9uRWwsIE1JTklNSVpFX0lDT05fSUQpO1xuICAgIGJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5taW5pbWl6ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBidXR0b25FbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTWluaW1pemVkQmFyKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBiYXJFbCA9IHRoaXMubW9kYWwuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoYmFyRWwsIFtDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhcl0pO1xuICAgIGJhckVsLmNyZWF0ZVNwYW4oe1xuICAgICAgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhclRpdGxlLFxuICAgICAgdGV4dDogdGhpcy5tb2RhbC50aXRsZUVsLnRleHRDb250ZW50XG4gICAgfSk7XG4gICAgY29uc3QgcmVzdG9yZUJ1dHRvbkVsID0gYmFyRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5SZXN0b3JlQnV0dG9uIH0pO1xuICAgIHNldEljb24ocmVzdG9yZUJ1dHRvbkVsLCBSRVNUT1JFX0lDT05fSUQpO1xuICAgIC8vIFRoZSB3aG9sZSBiYXIgcmVzdG9yZXMgb24gY2xpY2ssIG5vdCBqdXN0IHRoZSByZXN0b3JlIGJ1dHRvbiBcdTIwMTQgYSBsYXJnZXIsIGVhc2llciBjbGljayB0YXJnZXQuXG4gICAgLy8gYHJlc3RvcmUoKWAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUgaW52b2NhdGlvbiwgc28gdGhlIHJlc3RvcmUgYnV0dG9uJ3Mgb3duIGNsaWNrIGJ1YmJsaW5nIHVwXG4gICAgLy8gSGVyZSBpcyBhIG5vLW9wLiBUaGUgcmVzdG9yZSBidXR0b24gc3RheXMgcHVyZWx5IGFzIGEgdmlzdWFsIGFmZm9yZGFuY2UgZm9yIHRoZSBjbGljayB0YXJnZXQuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgICAvLyBEcm9wIHRoZSBvbmUtc2hvdCBhdHRlbnRpb24gZmxhc2ggb25jZSBpdCBmaW5pc2hlcyBzbyB0aGUgYmFyIHJldHVybnMgdG8gaXRzIGdlbnRsZSBpZGxlIHB1bHNlLlxuICAgIC8vIFRoZSBpZGxlIHB1bHNlIGlzIGFuIGluZmluaXRlIGFuaW1hdGlvbiwgd2hpY2ggbmV2ZXIgZmlyZXMgYGFuaW1hdGlvbmVuZGAuXG4gICAgYmFyRWwuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIH0pO1xuICAgIHJldHVybiBiYXJFbDtcbiAgfVxuXG4gIHByaXZhdGUgZGlzYWJsZVBlZWtMb2NrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wZWVrTG9ja0VudHJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZSh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIGluc3RhbGxNb2RhbE9wZW5HdWFyZE9uY2UoKTtcbiAgICBpbnN0YWxsSW5wdXRTdXBwcmVzc29yc09uY2UodGhpcy5tb2RhbC5jb250YWluZXJFbC5vd25lckRvY3VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgZmxhc2hCYXIoYmFyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgYmFyRWwucmVtb3ZlQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICAgIC8vIEZvcmNlIGEgcmVmbG93IHNvIHJlLWFkZGluZyB0aGUgY2xhc3MgcmVzdGFydHMgdGhlIG9uZS1zaG90IGZsYXNoIG9uIHJhcGlkIHJlcGVhdGVkIGJsb2Nrcy5cbiAgICBiYXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBiYXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5NaW5pbWl6ZWRNb2RhbEJhckF0dGVudGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZVBlZWtMb2NrKCk7XG4gICAgdGhpcy5yZW1vdmVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgcGF0Y2hPbkNsb3NlKG1vZGFsOiBNb2RhbCk6IHZvaWQge1xuICAgIGFyb3VuZChtb2RhbCwge1xuICAgICAgb25DbG9zZTogKG5leHQ6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkID0+IHtcbiAgICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICAgICAgICBuZXh0LmNhbGwobW9kYWwpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBmbGFzaE1pbmltaXplZEJhcnMoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgZW50cnkuZmxhc2goKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsSW5wdXRTdXBwcmVzc29yc09uY2UoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xuICBpZiAoZG9jdW1lbnRzV2l0aElucHV0U3VwcHJlc3NvcnMuaGFzKGRvYykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBkb2N1bWVudHNXaXRoSW5wdXRTdXBwcmVzc29ycy5hZGQoZG9jKTtcbiAgY29uc3Qgd2luID0gZW5zdXJlTm9uTnVsbGFibGUoZG9jLmRlZmF1bHRWaWV3KTtcbiAgLy8gQ2FwdHVyZS1waGFzZSB3aW5kb3cgbGlzdGVuZXJzIHJ1biBiZWZvcmUgT2JzaWRpYW4ncyBvd24gZG9jdW1lbnQvZWxlbWVudCBoYW5kbGVycyAoaW5jbHVkaW5nXG4gIC8vIENvZGVNaXJyb3IncykuIGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKWAgdGhlbiBwcmV2ZW50cyB0aG9zZSBoYW5kbGVycyBmcm9tIGV2ZXIgc2VlaW5nIGFcbiAgLy8gQmxvY2tlZCBldmVudC4gVGhlIGxpc3RlbmVycyBhcmUgcGVybWFuZW50IGJ1dCBpbmVydCB3aGVuZXZlciBub3RoaW5nIGlzIG1pbmltaXplZC5cbiAgLy8gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2ggKHNlZSBpc1BlZWtBbGxvd2VkS2V5KSBidXQgYmxvY2tzIGNvbW1hbmQgaG90a2V5cztcbiAgLy8gYGJlZm9yZWlucHV0YCBibG9ja3MgYWxsIGVkaXRvciBtdXRhdGlvbjsgYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIHdpbi5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLCB7IGNhcHR1cmU6IHRydWUgfSk7XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxNb2RhbE9wZW5HdWFyZE9uY2UoKTogdm9pZCB7XG4gIGlmIChpc01vZGFsT3Blbkd1YXJkSW5zdGFsbGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaXNNb2RhbE9wZW5HdWFyZEluc3RhbGxlZCA9IHRydWU7XG4gIC8vIE5ldmVyIHVuaW5zdGFsbGVkOiB0aGUgZ3VhcmQgaXMgaW5lcnQgd2hlbmV2ZXIgbm90aGluZyBpcyBtaW5pbWl6ZWQgKGBpc1BlZWtMb2NrZWQoKWAgaXMgZmFsc2UpLlxuICAvLyBPbmUgcGVybWFuZW50IHBhdGNoIGlzIGNoZWFwZXIgYW5kIGxlYWstZnJlZSB2ZXJzdXMgaW5zdGFsbGluZyBhbmQgdW5pbnN0YWxsaW5nIGl0IHBlciBtaW5pbWl6ZS5cbiAgYXJvdW5kKE1vZGFsLnByb3RvdHlwZSwge1xuICAgIG9wZW46IChuZXh0OiAoKSA9PiB2b2lkKTogKHRoaXM6IE1vZGFsKSA9PiB2b2lkID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBvcGVuKHRoaXM6IE1vZGFsKTogdm9pZCB7XG4gICAgICAgIGlmIChpc1BlZWtMb2NrZWQoKSAmJiAhaXNNaW5pbWl6ZWRJbm5lck1vZGFsKHRoaXMpKSB7XG4gICAgICAgICAgc2lnbmFsQmxvY2tlZEF0dGVtcHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBuZXh0LmNhbGwodGhpcyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTWluaW1pemVkSW5uZXJNb2RhbChtb2RhbDogTW9kYWwpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBwZWVrTG9ja0VudHJpZXMpIHtcbiAgICBpZiAoZW50cnkuaW5uZXJNb2RhbCA9PT0gbW9kYWwpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrQWxsb3dlZEtleShldnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gTmF2aWdhdGlvbiBtb3ZlcyB0aGUgY3Vyc29yL3Njcm9sbHMgKGFsbG93ZWQpLCBidXQgU2hpZnQrbmF2aWdhdGlvbiBleHRlbmRzIHRoZSBzZWxlY3Rpb24gKG5vdFxuICAvLyBOZWVkZWQgZm9yIGluc3BlY3Rpb24pLCBzbyBpdCBpcyBibG9ja2VkLiBCYXJlIG1vZGlmaWVyIHByZXNzZXMgcGFzcyB0aHJvdWdoIG9uIHRoZWlyIG93bi5cbiAgaWYgKE5BVklHQVRJT05fS0VZUy5oYXMoZXZ0LmtleSkpIHtcbiAgICByZXR1cm4gIWV2dC5zaGlmdEtleTtcbiAgfVxuXG4gIHJldHVybiBNT0RJRklFUl9LRVlTLmhhcyhldnQua2V5KTtcbn1cblxuZnVuY3Rpb24gaXNQZWVrTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAvLyBEcm9wIGVudHJpZXMgd2hvc2UgYmFyIGhhcyBsZWZ0IHRoZSBET00gd2l0aG91dCBhIHJlc3RvcmUoKSBvciBjbG9zZSgpLlxuICAvLyBBIHRlc3QgdGVhcmRvd24gdGhhdCBlbXB0aWVzIHRoZSBib2R5IGlzIHRoZSB0eXBpY2FsIGNhdXNlOyB0aGlzIGtlZXBzIGEgc3RhbGUgZW50cnkgZnJvbSBsb2NraW5nLlxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmICghZW50cnkuYmFyRWwuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUoZW50cnkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwZWVrTG9ja0VudHJpZXMuc2l6ZSA+IDA7XG59XG5cbmZ1bmN0aW9uIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk6IHZvaWQge1xuICBmbGFzaE1pbmltaXplZEJhcnMoKTtcbiAgYmVlcGVyLmJlZXAoKTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NLZXlkb3duV2hpbGVQZWVrTG9ja2VkKGV2dDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpIHx8IGlzUGVla0FsbG93ZWRLZXkoZXZ0KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoZXZ0KTtcbn1cblxuZnVuY3Rpb24gc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBpZiAoIWlzUGVla0xvY2tlZCgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYmxvY2tFdmVudChldnQpO1xufVxu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
297
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL21vZGFscy9taW5pbWl6YWJsZS1tb2RhbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgd3JhcHBlciB0aGF0IG1ha2VzIGFueSBPYnNpZGlhbiB7QGxpbmsgTW9kYWx9IG1pbmltaXphYmxlIHRvIGEgZmxvYXRpbmcgYmFyIFx1MjAxNCB3aXRob3V0IGJyZWFraW5nIHRoZVxuICogbW9kYWwncyBibG9ja2luZyBjb250cmFjdC5cbiAqXG4gKiBPYnNpZGlhbidzIHtAbGluayBNb2RhbH0gaXMgYmxvY2tpbmc6IHdoaWxlIGl0IGlzIG9wZW4gdGhlIHJlc3Qgb2YgdGhlIGFwcCBpcyBtZWFudCB0byBiZSBpbmVydCB1bnRpbFxuICogdGhlIG1vZGFsIGlzIGRpc21pc3NlZC4ge0BsaW5rIE1pbmltaXphYmxlTW9kYWx9IHdyYXBzIGFueSBtb2RhbCBpbnN0YW5jZSAocGxhaW4gYE1vZGFsYCxcbiAqIGBGdXp6eVN1Z2dlc3RNb2RhbGAsIHRoZSBsaWJyYXJ5J3MgYE1vZGFsQmFzZWAsIHlvdXIgb3duIHN1YmNsYXNzLCBcdTIwMjYgXHUyMDE0IGluY2x1ZGluZyBtb2RhbHMgeW91IGRvIG5vdFxuICogb3duKSBhbmQgYWRkcyBhIG1pbmltaXplIGJ1dHRvbi4gTWluaW1pemluZyBoaWRlcyB0aGUgbW9kYWwgYW5kIGl0cyBibG9ja2luZyBiYWNrZHJvcCBhbmQgc2hvd3MgYVxuICogc21hbGwgZmxvYXRpbmcgYmFyIHdpdGggYSByZXN0b3JlIGJ1dHRvbiwgc28gdGhlIHVzZXIgY2FuIHBlZWsgYXQgdGhlIG5vdGVzL2ZvbGRlcnMgdGhlIG9wZXJhdGlvblxuICogaW52b2x2ZXMgXHUyMDE0IGJ1dCB0aGUgbW9kYWwgaXMgTk9UIGRpc21pc3NlZCwgc28gaXRzIGJsb2NraW5nIGNvbnRyYWN0IG11c3QgYmUgcHJlc2VydmVkLlxuICpcbiAqIFRvIGtlZXAgdGhhdCBjb250cmFjdCB3aGlsZSBtaW5pbWl6ZWQsIHRoZSB3cmFwcGVyIHB1dHMgdGhlIGFwcCBpbnRvIGEgKipwZWVrLW9ubHkgbG9jayoqOiB0aGUgdXNlclxuICogbWF5IG1vdXNlLWNsaWNrIGFuZCBzY3JvbGwgdG8gaW5zcGVjdCBjb250ZW50LCBidXQgY2Fubm90IHN0YXJ0IGFueXRoaW5nIG5ldy4gV2hpbGUgYW55IG1vZGFsIGlzXG4gKiBtaW5pbWl6ZWQgdGhlIHdyYXBwZXI6XG4gKiAtIGJsb2NrcyB0aGUga2V5Ym9hcmQgKHR5cGluZywgaG90a2V5cywgdGhlIGNvbW1hbmQtcGFsZXR0ZSBzaG9ydGN1dCksXG4gKiAtIGJsb2NrcyB0aGUgcmlnaHQtY2xpY2sgY29udGV4dCBtZW51LCBhbmRcbiAqIC0gYmxvY2tzIG9wZW5pbmcgYW55IG90aGVyIG1vZGFsIChhIHJlLWZpcmVkIGNvbW1hbmQsIHRoZSBjb21tYW5kIHBhbGV0dGUsIHNldHRpbmdzLCBcdTIwMjYpLlxuICpcbiAqIEEgYmxvY2tlZCBhdHRlbXB0IGZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciBhbmQgYmVlcHMgc28gdGhlIHVzZXIgc2VlcyAoYW5kIGhlYXJzKSB3aHkgbm90aGluZ1xuICogaGFwcGVuZWQuIFJlc3RvcmluZyAob3IgdGhlIG1vZGFsIGNsb3NpbmcpIGxpZnRzIHRoZSBsb2NrLiBUaGlzIHByZXZlbnRzLCBmb3IgZXhhbXBsZSwgbWluaW1pemluZyBhXG4gKiBcIm1lcmdlIGZvbGRlclwiIHBpY2tlciBhbmQgdGhlbiBmaXJpbmcgdGhlIHNhbWUgY29tbWFuZCBhZ2FpbiB0byBzdGFjayBzZXZlcmFsIGNvbmN1cnJlbnQgbWVyZ2VzLlxuICpcbiAqIFRoZSB3cmFwcGVyIHJldXNlcyB0aGUgbW9kYWwncyBvd24gdGl0bGUgKGB0aXRsZUVsYCkgYXMgdGhlIG1pbmltaXplZCBiYXIgbGFiZWwsIHNvIHNldCB0aGUgdGl0bGVcbiAqIHRoZSB1c3VhbCB3YXkgKGBtb2RhbC5zZXRUaXRsZSguLi4pYCkuIFJlbmRlciBhcmJpdHJhcnkgY29udGVudCBpbnRvIHtAbGluayBNb2RhbC5jb250ZW50RWx9LFxuICogaW5jbHVkaW5nIGNsaWNrYWJsZSBub3RlIGxpbmtzIHByb2R1Y2VkIGJ5IGByZW5kZXJJbnRlcm5hbExpbmtgIGZyb21cbiAqIGBvYnNpZGlhbi1kZXYtdXRpbHMvb2JzaWRpYW4vbWFya2Rvd25gOlxuICpcbiAqIGBgYHRzXG4gKiBjb25zdCBtb2RhbCA9IG5ldyBNeU1vZGFsKGFwcCk7XG4gKiBtb2RhbC5zZXRUaXRsZSgnTWVyZ2luZyBub3RlcycpO1xuICogbW9kYWwuY29udGVudEVsLmFwcGVuZENoaWxkKGF3YWl0IHJlbmRlckludGVybmFsTGluayh7IGFwcCwgcGF0aE9yQWJzdHJhY3RGaWxlOiBmaWxlIH0pKTtcbiAqXG4gKiBjb25zdCBtaW5pbWl6YWJsZSA9IG5ldyBNaW5pbWl6YWJsZU1vZGFsKG1vZGFsKTtcbiAqIG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKTtcbiAqIG1pbmltaXphYmxlLm1pbmltaXplKCk7IC8vIGEgZmxvYXRpbmcgYmFyIG9mZmVycyBcInJlc3RvcmVcIjsgdGhlIGFwcCBpcyBwZWVrLW9ubHkgdW50aWwgcmVzdG9yZWRcbiAqIGBgYFxuICpcbiAqIFRoZSB3cmFwcGVkIG1vZGFsIGNhbiBzdGlsbCBiZSBjbG9zZWQgbm9ybWFsbHk7IHRoZSBmbG9hdGluZyBiYXIgaXMgY2xlYW5lZCB1cCBhdXRvbWF0aWNhbGx5IHdoZW5cbiAqIHRoZSBtb2RhbCBjbG9zZXMgKGV2ZW4gaWYgaXQgaXMgY2xvc2VkIHdoaWxlIG1pbmltaXplZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIE1vZGFsLFxuICBzZXRJY29uXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgQmVlcGVyIH0gZnJvbSAnLi4vLi4vYmVlcGVyLnRzJztcbmltcG9ydCB7IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5cbmNvbnN0IE1JTklNSVpFX0lDT05fSUQgPSAnbWludXMnO1xuY29uc3QgUkVTVE9SRV9JQ09OX0lEID0gJ21heGltaXplLTInO1xuXG4vLyBOYXZpZ2F0aW9uIGtleXMgcGFzcyB0aHJvdWdoIHdoaWxlIG1pbmltaXplZCBzbyB0aGUgdXNlciBjYW4gbW92ZSB0aGUgY3Vyc29yIGFuZCBzY3JvbGwgdG8gcmVhZC5cbi8vIE5vbmUgb2YgdGhlbSBtdXRhdGUgdGhlIGRvY3VtZW50IFx1MjAxNCB0ZXh0IGNoYW5nZXMgYXJlIGNhdWdodCBzZXBhcmF0ZWx5IGJ5IHRoZSBgYmVmb3JlaW5wdXRgIGd1YXJkLlxuLy8gU2hpZnQrbmF2aWdhdGlvbiBpcyBibG9ja2VkLCB0aG91Z2gsIHNpbmNlIGl0IGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0aGF0IGluc3BlY3Rpb24gZG9lcyBub3QgbmVlZC5cbmNvbnN0IE5BVklHQVRJT05fS0VZUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICdBcnJvd0Rvd24nLFxuICAnQXJyb3dMZWZ0JyxcbiAgJ0Fycm93UmlnaHQnLFxuICAnQXJyb3dVcCcsXG4gICdFbmQnLFxuICAnSG9tZScsXG4gICdQYWdlRG93bicsXG4gICdQYWdlVXAnXG5dKTtcblxuLy8gQSBiYXJlIG1vZGlmaWVyIHByZXNzIGRvZXMgbm90aGluZyBvbiBpdHMgb3duLCBzbyBpdCBwYXNzZXMgdGhyb3VnaCB0aGUgbG9jay5cbi8vIFRoaXMgYXZvaWRzIGEgc3B1cmlvdXMgZmxhc2gvYmVlcCB3aGlsZSBjb21wb3NpbmcgYSBzaG9ydGN1dDsgdGhlIHNob3J0Y3V0J3MgY29tbWFuZCBrZXkgaXMgYmxvY2tlZC5cbmNvbnN0IE1PRElGSUVSX0tFWVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnQWx0JyxcbiAgJ0NvbnRyb2wnLFxuICAnTWV0YScsXG4gICdTaGlmdCdcbl0pO1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBlbnRyeSBmb3IgYSBjdXJyZW50bHktbWluaW1pemVkIG1vZGFsLiBUaGUgc2hhcmVkIHBlZWstb25seSBsb2NrIHVzZXMgaXQgdG8ga25vdyBhXG4gKiBtb2RhbCBpcyBtaW5pbWl6ZWQsIHRvIGxlYXZlIHRoYXQgbW9kYWwncyBvd24gcmUtb3BlbnMgYWxvbmUsIGFuZCB0byBmbGFzaCBpdHMgYmFyIG9uIGEgYmxvY2tlZFxuICogYXR0ZW1wdC5cbiAqL1xuaW50ZXJmYWNlIFBlZWtMb2NrRW50cnkge1xuICAvKipcbiAgICogVGhlIGZsb2F0aW5nIGJhciBlbGVtZW50LiBVc2VkIHRvIGRldGVjdCBhIHN0YWxlIGVudHJ5IChpdHMgYmFyIGhhcyBsZWZ0IHRoZSBET00pIHNvIGl0IGNhbiBiZVxuICAgKiBwcnVuZWQgYW5kIG5ldmVyIGtlZXAgdGhlIGFwcCBsb2NrZWQuXG4gICAqL1xuICByZWFkb25seSBiYXJFbDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEZsYXNoZXMgdGhlIGZsb2F0aW5nIGJhciB0byBzaWduYWwgYSBibG9ja2VkIGF0dGVtcHQuXG4gICAqL1xuICBmbGFzaCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgd3JhcHBlZCBtb2RhbCBpbnN0YW5jZSwgc28gaXRzIG93biBgb3BlbigpYCBpcyBuZXZlciBibG9ja2VkIGJ5IHRoZSBsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJNb2RhbDogTW9kYWw7XG59XG5cbmNvbnN0IHBlZWtMb2NrRW50cmllcyA9IG5ldyBTZXQ8UGVla0xvY2tFbnRyeT4oKTtcbmNvbnN0IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgcGVlay1vbmx5IGxvY2sncyBgb3BlbmAgcGF0Y2hlcyB3aGlsZSBhdCBsZWFzdCBvbmUgbW9kYWwgaXMgbWluaW1pemVkLiBCZWluZyBhXG4gKiB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgYm90aCBwYXRjaGVzIGFyZSB0b3JuIGRvd24gYXV0b21hdGljYWxseSBvbiBgdW5sb2FkYCwgc28gdGhleSBleGlzdFxuICogb25seSB3aGlsZSB0aGUgbG9jayBpcyBhY3RpdmUuIEEgbWluaW1pemVkIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgYWx3YXlzIGFsbG93ZWQgKHNlZVxuICoge0BsaW5rIHNob3VsZEJsb2NrT3Blbn0pOyBldmVyeSBvdGhlciBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgYW5kIHNpZ25hbHMgYSBmbGFzaCArIGJlZXAuXG4gKi9cbmNsYXNzIFBlZWtMb2NrQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwIHdob3NlIHNldHRpbmdzIG1vZGFsIGlzIGd1YXJkZWQgYW5kIHdob3NlIHdpbmRvd3Mgc3VwcHJlc3MgaW5wdXQgd2hpbGUgbG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwOiBBcHApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgYG9wZW5gIHBhdGNoZXMgYW5kIHRoZSBpbnB1dCBzdXBwcmVzc29ycy5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICAvLyBCbG9jayBvcGVuaW5nIGFueSBPVEhFUiBtb2RhbCB3aGlsZSBhIG1vZGFsIGlzIG1pbmltaXplZCAodGhlIGNvbW1hbmQgcGFsZXR0ZSwgYSByZS1maXJlZFxuICAgIC8vIENvbW1hbmQsIGFub3RoZXIgcGx1Z2luIG1vZGFsLCBcdTIwMjYpLlxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29wZW4nPih7XG4gICAgICBtZXRob2ROYW1lOiAnb3BlbicsXG4gICAgICBvYmo6IE1vZGFsLnByb3RvdHlwZSxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsVGhpcyB9KTogdm9pZCA9PiB7XG4gICAgICAgIGJsb2NrT3JGYWxsYmFjayhvcmlnaW5hbFRoaXMsIGZhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE9ic2lkaWFuJ3MgU2V0dGluZ3MgaXMgYSAqcG9wb3V0KiBtb2RhbDogb24gZGVza3RvcCBpdHMgb3duIGBvcGVuKClgIGZpcnN0IGNyZWF0ZXMgYSBzZXBhcmF0ZSBPU1xuICAgIC8vIFdpbmRvdyAodmlhIGBzaG91bGRVc2VQb3BvdXQoKWAvYGdldFBvcG91dE9wdGlvbnMoKWApIGFuZCBvbmx5IFRIRU4gZGVsZWdhdGVzIHRvXG4gICAgLy8gYE1vZGFsLnByb3RvdHlwZS5vcGVuYCB0byByZW5kZXIgdGhlIGFjdGl2ZSB0YWIgaW50byBpdC4gR3VhcmRpbmcgb25seSBgTW9kYWwucHJvdG90eXBlLm9wZW5gXG4gICAgLy8gVGhlcmVmb3JlIGJsb2NrcyB0aGUgcmVuZGVyIGJ1dCBsZWF2ZXMgYW4gZW1wdHkgc2V0dGluZ3Mgd2luZG93IGJlaGluZCBcdTIwMTQgdGhlIHJlcG9ydGVkIGJhZCBVWC5cbiAgICAvLyBHdWFyZGluZyB0aGUgc2V0dGluZ3MgbW9kYWwncyBvd24gYG9wZW4oKWAgYmxvY2tzIGl0ICpiZWZvcmUqIHRoZSB3aW5kb3cgaXMgY3JlYXRlZC5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8QXBwWydzZXR0aW5nJ10sICdvcGVuJz4oe1xuICAgICAgbWV0aG9kTmFtZTogJ29wZW4nLFxuICAgICAgb2JqOiB0aGlzLmFwcC5zZXR0aW5nLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxUaGlzIH0pOiB2b2lkID0+IHtcbiAgICAgICAgYmxvY2tPckZhbGxiYWNrKG9yaWdpbmFsVGhpcywgZmFsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU3VwcHJlc3MgdGhlIGtleWJvYXJkLCBlZGl0b3IgbXV0YXRpb24sIGFuZCB0aGUgY29udGV4dCBtZW51IGFjcm9zcyBBTEwgd2luZG93cyBcdTIwMTQgdGhlIG1haW4gd2luZG93XG4gICAgLy8gQW5kIGV2ZXJ5IGV4aXN0aW5nL2Z1dHVyZSBwb3BvdXQgXHUyMDE0IHNvIHRoZSBsb2NrIGhvbGRzIHdoZXJldmVyIHRoZSB1c2VyJ3MgZm9jdXMgaXMsIG5vdCBvbmx5IGluXG4gICAgLy8gVGhlIHdpbmRvdyB0aGF0IG93bnMgdGhlIG1pbmltaXplZCBtb2RhbC4gQ2FwdHVyZS1waGFzZSBsaXN0ZW5lcnMgcnVuIGJlZm9yZSBPYnNpZGlhbidzIG93blxuICAgIC8vIERvY3VtZW50L2VsZW1lbnQgaGFuZGxlcnMgKGluY2x1ZGluZyBDb2RlTWlycm9yJ3MpLCBzbyBgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClgIGluIHRoZVxuICAgIC8vIFN1cHByZXNzb3JzIGtlZXBzIGEgYmxvY2tlZCBldmVudCBmcm9tIGV2ZXIgcmVhY2hpbmcgdGhlbS4gYGtleWRvd25gIGxldHMgbmF2aWdhdGlvbiBrZXlzIHRocm91Z2hcbiAgICAvLyAoc2VlIGBpc1BlZWtBbGxvd2VkS2V5YCkgYnV0IGJsb2NrcyBjb21tYW5kIGhvdGtleXM7IGBiZWZvcmVpbnB1dGAgYmxvY2tzIGFsbCBlZGl0b3IgbXV0YXRpb247XG4gICAgLy8gYGNvbnRleHRtZW51YCBibG9ja3MgdGhlIHJpZ2h0LWNsaWNrIG1lbnUuXG4gICAgY29uc3QgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50ID0gdGhpcy5hZGRDaGlsZChuZXcgQWxsV2luZG93c0V2ZW50Q29tcG9uZW50KHRoaXMuYXBwKSk7XG4gICAgYWxsV2luZG93c0V2ZW50Q29tcG9uZW50LnJlZ2lzdGVyQWxsV2luZG93c0RvbUV2ZW50KHtcbiAgICAgIGNhbGxiYWNrOiBzdXBwcmVzc0tleWRvd25XaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdrZXlkb3duJ1xuICAgIH0pO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NEb21FdmVudCh7XG4gICAgICBjYWxsYmFjazogc3VwcHJlc3NXaGlsZVBlZWtMb2NrZWQsXG4gICAgICBvcHRpb25zOiB7IGNhcHR1cmU6IHRydWUgfSxcbiAgICAgIHR5cGU6ICdiZWZvcmVpbnB1dCdcbiAgICB9KTtcbiAgICBhbGxXaW5kb3dzRXZlbnRDb21wb25lbnQucmVnaXN0ZXJBbGxXaW5kb3dzRG9tRXZlbnQoe1xuICAgICAgY2FsbGJhY2s6IHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkLFxuICAgICAgb3B0aW9uczogeyBjYXB0dXJlOiB0cnVlIH0sXG4gICAgICB0eXBlOiAnY29udGV4dG1lbnUnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBNb2RhbH0gaW5zdGFuY2UgdG8gbWFrZSBpdCBtaW5pbWl6YWJsZSB0byBhIHNtYWxsIGZsb2F0aW5nIGJhciBhbmQgcmVzdG9yYWJsZS4gV2hpbGVcbiAqIG1pbmltaXplZCB0aGUgYXBwIGlzIHB1dCBpbnRvIGEgcGVlay1vbmx5IGxvY2sgKGtleWJvYXJkLCBjb250ZXh0IG1lbnUsIGFuZCBvcGVuaW5nIG90aGVyIG1vZGFscyBhcmVcbiAqIGJsb2NrZWQpIHNvIHRoZSBtb2RhbCdzIGJsb2NraW5nIGNvbnRyYWN0IGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNb2RhbCAtIFRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG1vZGFsLlxuICovXG5leHBvcnQgY2xhc3MgTWluaW1pemFibGVNb2RhbDxUTW9kYWwgZXh0ZW5kcyBNb2RhbD4ge1xuICAvKipcbiAgICogVGhlIHdyYXBwZWQgbW9kYWwuIE9wZW4sIGNsb3NlLCBhbmQgcG9wdWxhdGUgaXQgYXMgdXN1YWwgKGUuZy4gYG1pbmltaXphYmxlLm1vZGFsLm9wZW4oKWApLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1vZGFsOiBUTW9kYWw7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1vZGFsIGlzIGN1cnJlbnRseSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9kYWwgaXMgY3VycmVudGx5IG1pbmltaXplZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzTWluaW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTWluaW1pemVkVmFsdWU7XG4gIH1cblxuICAvLyBQYXRjaGVzIHRoZSB3cmFwcGVkIG1vZGFsJ3MgYG9uQ2xvc2VgIHRvIHJ1biBjbGVhbnVwLiBQZXJzaXN0cyBmb3IgdGhlIHdyYXBwZXIncyB3aG9sZSBsaWZlIChhXG4gIC8vIE1vZGFsIGNhbiBiZSByZW9wZW5lZCwgc28gdGhlIHBhdGNoIG11c3Qgc3Vydml2ZSBlYWNoIGNsb3NlKSwgaGVuY2UgYSBkZWRpY2F0ZWQgY29tcG9uZW50IHRoYXQgaXNcbiAgLy8gTmV2ZXIgdW5sb2FkZWQgXHUyMDE0IGRpc3RpbmN0IGZyb20gYHBlZWtMb2NrQ29tcG9uZW50YCwgd2hvc2UgcGF0Y2hlcyBsaXZlIG9ubHkgd2hpbGUgbWluaW1pemVkLlxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlUGF0Y2hDb21wb25lbnQgPSBuZXcgTW9ua2V5QXJvdW5kQ29tcG9uZW50KCk7XG4gIHByaXZhdGUgaXNNaW5pbWl6ZWRWYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1pbmltaXplQnV0dG9uRWw6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIG1pbmltaXplZEJhckVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrQ29tcG9uZW50OiBudWxsIHwgUGVla0xvY2tDb21wb25lbnQgPSBudWxsO1xuICBwcml2YXRlIHBlZWtMb2NrRW50cnk6IG51bGwgfCBQZWVrTG9ja0VudHJ5ID0gbnVsbDtcblxuICAvKipcbiAgICogV3JhcHMgdGhlIGdpdmVuIG1vZGFsLCBhZGRpbmcgYSBtaW5pbWl6ZSBidXR0b24gYW5kIHdpcmluZyB1cCBjbGVhbnVwIG9uIGNsb3NlLlxuICAgKlxuICAgKiBAcGFyYW0gbW9kYWwgLSBUaGUgbW9kYWwgaW5zdGFuY2UgdG8gbWFrZSBtaW5pbWl6YWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2RhbDogVE1vZGFsKSB7XG4gICAgdGhpcy5tb2RhbCA9IG1vZGFsO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobW9kYWwuY29udGFpbmVyRWwsIFtDc3NDbGFzcy5NaW5pbWl6YWJsZU1vZGFsXSk7XG4gICAgdGhpcy5taW5pbWl6ZUJ1dHRvbkVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZUJ1dHRvbigpO1xuICAgIHRoaXMuY2xvc2VQYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgdGhpcy5wYXRjaE9uQ2xvc2UobW9kYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbmltaXplcyB0aGUgbW9kYWw6IGhpZGVzIHRoZSBtb2RhbCBhbmQgaXRzIGJhY2tkcm9wLCBzaG93cyBhIGZsb2F0aW5nIGJhciB3aXRoIGEgcmVzdG9yZSBidXR0b24sXG4gICAqIGFuZCBwdXRzIHRoZSBhcHAgaW50byB0aGUgcGVlay1vbmx5IGxvY2suIEEgbm8tb3AgaWYgdGhlIG1vZGFsIGlzIGFscmVhZHkgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSB0cnVlO1xuICAgIHRoaXMubWluaW1pemVCdXR0b25FbC5oaWRlKCk7XG4gICAgdGhpcy5tb2RhbC5jb250YWluZXJFbC5oaWRlKCk7XG4gICAgLy8gVGhlIG1vZGFsIHN0YXlzIG9wZW4gd2hpbGUgbWluaW1pemVkLCBzbyBpdHMga2V5bWFwIHNjb3BlIGlzIHBvcHBlZCB0byByZWxlYXNlIHRoZSBmb2N1cyB0cmFwLlxuICAgIC8vIFJlc3RvcmluZyByZS1wdXNoZXMgaXQuIEFuIGFjdGl2ZSB0cmFwIHdvdWxkIHN0ZWFsIGZvY3VzIGJhY2sgdG8gdGhlIGhpZGRlbiBtb2RhbCwgYmxvY2tpbmcgdGhlXG4gICAgLy8gTW91c2UtZHJpdmVuIGluc3BlY3Rpb24gKGNsaWNraW5nIG5vdGVzLCBzY3JvbGxpbmcpIHRoYXQgbWluaW1pemUgZXhpc3RzIHRvIGFsbG93LlxuICAgIC8vIEtleWJvYXJkIGlucHV0IHJlbWFpbnMgYmxvY2tlZCBieSB0aGUgcGVlay1vbmx5IGxvY2ssIHNvIHJlbGVhc2luZyB0aGUgdHJhcCBrZWVwcyB0aGUgYXBwIGluZXJ0LlxuICAgIHRoaXMubW9kYWwuYXBwLmtleW1hcC5wb3BTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1pbmltaXplZEJhckVsID0gdGhpcy5jcmVhdGVNaW5pbWl6ZWRCYXIoKTtcbiAgICB0aGlzLmVuYWJsZVBlZWtMb2NrKHRoaXMubWluaW1pemVkQmFyRWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmVzIHRoZSBtb2RhbCBmcm9tIHRoZSBtaW5pbWl6ZWQgc3RhdGUsIHJlbW92aW5nIHRoZSBmbG9hdGluZyBiYXIgYW5kIGxpZnRpbmcgdGhlIHBlZWstb25seVxuICAgKiBsb2NrLiBBIG5vLW9wIGlmIHRoZSBtb2RhbCBpcyBub3QgbWluaW1pemVkLlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTWluaW1pemVkVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzTWluaW1pemVkVmFsdWUgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgLy8gUmUtcHVzaCB0aGUgc2NvcGUgcG9wcGVkIGluIG1pbmltaXplKCkgc28gdGhlIHJlc3RvcmVkIG1vZGFsIGJsb2NrcyB0aGUgYXBwIGFnYWluIChmb2N1cyB0cmFwXG4gICAgLy8gKyBFc2NhcGUgY2FwdHVyZSkuXG4gICAgdGhpcy5tb2RhbC5hcHAua2V5bWFwLnB1c2hTY29wZSh0aGlzLm1vZGFsLnNjb3BlKTtcbiAgICB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLnNob3coKTtcbiAgICB0aGlzLm1pbmltaXplQnV0dG9uRWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNaW5pbWl6ZUJ1dHRvbigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYnV0dG9uRWwgPSB0aGlzLm1vZGFsLm1vZGFsRWwuY3JlYXRlRWwoJ2J1dHRvbicsIHsgY2xzOiBDc3NDbGFzcy5NaW5pbWl6ZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKGJ1dHRvbkVsLCBNSU5JTUlaRV9JQ09OX0lEKTtcbiAgICBidXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubWluaW1pemUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYnV0dG9uRWw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pbmltaXplZEJhcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgYmFyRWwgPSB0aGlzLm1vZGFsLmNvbnRhaW5lckVsLm93bmVyRG9jdW1lbnQuYm9keS5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGJhckVsLCBbQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJdKTtcbiAgICBiYXJFbC5jcmVhdGVTcGFuKHtcbiAgICAgIGNsczogQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJUaXRsZSxcbiAgICAgIHRleHQ6IHRoaXMubW9kYWwudGl0bGVFbC50ZXh0Q29udGVudFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3RvcmVCdXR0b25FbCA9IGJhckVsLmNyZWF0ZUVsKCdidXR0b24nLCB7IGNsczogQ3NzQ2xhc3MuUmVzdG9yZUJ1dHRvbiB9KTtcbiAgICBzZXRJY29uKHJlc3RvcmVCdXR0b25FbCwgUkVTVE9SRV9JQ09OX0lEKTtcbiAgICAvLyBUaGUgd2hvbGUgYmFyIHJlc3RvcmVzIG9uIGNsaWNrLCBub3QganVzdCB0aGUgcmVzdG9yZSBidXR0b24gXHUyMDE0IGEgbGFyZ2VyLCBlYXNpZXIgY2xpY2sgdGFyZ2V0LlxuICAgIC8vIGByZXN0b3JlKClgIGd1YXJkcyBhZ2FpbnN0IGEgZG91YmxlIGludm9jYXRpb24sIHNvIHRoZSByZXN0b3JlIGJ1dHRvbidzIG93biBjbGljayBidWJibGluZyB1cFxuICAgIC8vIEhlcmUgaXMgYSBuby1vcC4gVGhlIHJlc3RvcmUgYnV0dG9uIHN0YXlzIHB1cmVseSBhcyBhIHZpc3VhbCBhZmZvcmRhbmNlIGZvciB0aGUgY2xpY2sgdGFyZ2V0LlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgdGhpcy5yZXN0b3JlKCk7XG4gICAgfSk7XG4gICAgLy8gRHJvcCB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9uY2UgaXQgZmluaXNoZXMgc28gdGhlIGJhciByZXR1cm5zIHRvIGl0cyBnZW50bGUgaWRsZSBwdWxzZS5cbiAgICAvLyBUaGUgaWRsZSBwdWxzZSBpcyBhbiBpbmZpbml0ZSBhbmltYXRpb24sIHdoaWNoIG5ldmVyIGZpcmVzIGBhbmltYXRpb25lbmRgLlxuICAgIGJhckVsLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsICgpID0+IHtcbiAgICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYmFyRWw7XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVQZWVrTG9jaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGVla0xvY2tFbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHBlZWtMb2NrRW50cmllcy5kZWxldGUodGhpcy5wZWVrTG9ja0VudHJ5KTtcbiAgICB0aGlzLnBlZWtMb2NrRW50cnkgPSBudWxsO1xuICAgIC8vIFRlYXIgdGhlIGBvcGVuYCBwYXRjaGVzIGRvd24gd2l0aCB0aGUgY29tcG9uZW50LCBzbyB0aGV5IGV4aXN0IG9ubHkgd2hpbGUgdGhpcyBtb2RhbCBpcyBtaW5pbWl6ZWQuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZVBlZWtMb2NrKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGVla0xvY2tFbnRyeSA9IHtcbiAgICAgIGJhckVsLFxuICAgICAgZmxhc2g6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mbGFzaEJhcihiYXJFbCk7XG4gICAgICB9LFxuICAgICAgaW5uZXJNb2RhbDogdGhpcy5tb2RhbFxuICAgIH07XG4gICAgcGVla0xvY2tFbnRyaWVzLmFkZCh0aGlzLnBlZWtMb2NrRW50cnkpO1xuICAgIC8vIEluc3RhbGwgdGhlIGBvcGVuYCBwYXRjaGVzIGFuZCBpbnB1dCBzdXBwcmVzc29ycyBmb3IgYXMgbG9uZyBhcyB0aGlzIG1vZGFsIGlzIG1pbmltaXplZC4gVGhlXG4gICAgLy8gQmxvY2sgTE9HSUMgaXRzZWxmIGtleXMgb2ZmIHRoZSBzaGFyZWQgYHBlZWtMb2NrRW50cmllc2AgKHNlZSBgc2hvdWxkQmxvY2tPcGVuYCksIHNvIHdpdGggc2V2ZXJhbFxuICAgIC8vIE1vZGFscyBtaW5pbWl6ZWQgZXZlcnkgb25lJ3MgcGF0Y2ggcmVhY2hlcyB0aGUgc2FtZSB2ZXJkaWN0OyB0aGUgbG9jayBsaWZ0cyBvbmx5IG9uY2UgdGhlIGxhc3RcbiAgICAvLyBNb2RhbCByZXN0b3Jlcy9jbG9zZXMuXG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudCA9IG5ldyBQZWVrTG9ja0NvbXBvbmVudCh0aGlzLm1vZGFsLmFwcCk7XG4gICAgdGhpcy5wZWVrTG9ja0NvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoQmFyKGJhckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGJhckVsLnJlbW92ZUNsYXNzKENzc0NsYXNzLk1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uKTtcbiAgICAvLyBGb3JjZSBhIHJlZmxvdyBzbyByZS1hZGRpbmcgdGhlIGNsYXNzIHJlc3RhcnRzIHRoZSBvbmUtc2hvdCBmbGFzaCBvbiByYXBpZCByZXBlYXRlZCBibG9ja3MuXG4gICAgYmFyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYmFyRWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVQZWVrTG9jaygpO1xuICAgIHRoaXMucmVtb3ZlTWluaW1pemVkQmFyKCk7XG4gICAgdGhpcy5pc01pbmltaXplZFZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHBhdGNoT25DbG9zZShtb2RhbDogTW9kYWwpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlUGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaDxNb2RhbCwgJ29uQ2xvc2UnPih7XG4gICAgICBtZXRob2ROYW1lOiAnb25DbG9zZScsXG4gICAgICBvYmo6IG1vZGFsLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KTogdm9pZCA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTWluaW1pemVkQmFyKCk6IHZvaWQge1xuICAgIHRoaXMubWluaW1pemVkQmFyRWw/LnJlbW92ZSgpO1xuICAgIHRoaXMubWluaW1pemVkQmFyRWwgPSBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJsb2NrRXZlbnQoZXZ0OiBFdmVudCk6IHZvaWQge1xuICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpO1xufVxuXG5mdW5jdGlvbiBibG9ja09yRmFsbGJhY2sobW9kYWw6IE1vZGFsLCBmYWxsYmFjazogKCkgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoc2hvdWxkQmxvY2tPcGVuKG1vZGFsKSkge1xuICAgIHNpZ25hbEJsb2NrZWRBdHRlbXB0KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZmFsbGJhY2soKTtcbn1cblxuZnVuY3Rpb24gZmxhc2hNaW5pbWl6ZWRCYXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGVudHJ5LmZsYXNoKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNaW5pbWl6ZWRJbm5lck1vZGFsKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBlZWtMb2NrRW50cmllcykge1xuICAgIGlmIChlbnRyeS5pbm5lck1vZGFsID09PSBtb2RhbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtBbGxvd2VkS2V5KGV2dDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAvLyBOYXZpZ2F0aW9uIG1vdmVzIHRoZSBjdXJzb3Ivc2Nyb2xscyAoYWxsb3dlZCksIGJ1dCBTaGlmdCtuYXZpZ2F0aW9uIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiAobm90XG4gIC8vIE5lZWRlZCBmb3IgaW5zcGVjdGlvbiksIHNvIGl0IGlzIGJsb2NrZWQuIEJhcmUgbW9kaWZpZXIgcHJlc3NlcyBwYXNzIHRocm91Z2ggb24gdGhlaXIgb3duLlxuICBpZiAoTkFWSUdBVElPTl9LRVlTLmhhcyhldnQua2V5KSkge1xuICAgIHJldHVybiAhZXZ0LnNoaWZ0S2V5O1xuICB9XG5cbiAgcmV0dXJuIE1PRElGSUVSX0tFWVMuaGFzKGV2dC5rZXkpO1xufVxuXG5mdW5jdGlvbiBpc1BlZWtMb2NrZWQoKTogYm9vbGVhbiB7XG4gIC8vIERyb3AgZW50cmllcyB3aG9zZSBiYXIgaGFzIGxlZnQgdGhlIERPTSB3aXRob3V0IGEgcmVzdG9yZSgpIG9yIGNsb3NlKCkuXG4gIC8vIEEgdGVzdCB0ZWFyZG93biB0aGF0IGVtcHRpZXMgdGhlIGJvZHkgaXMgdGhlIHR5cGljYWwgY2F1c2U7IHRoaXMga2VlcHMgYSBzdGFsZSBlbnRyeSBmcm9tIGxvY2tpbmcuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcGVla0xvY2tFbnRyaWVzKSB7XG4gICAgaWYgKCFlbnRyeS5iYXJFbC5pc0Nvbm5lY3RlZCkge1xuICAgICAgcGVla0xvY2tFbnRyaWVzLmRlbGV0ZShlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBlZWtMb2NrRW50cmllcy5zaXplID4gMDtcbn1cblxuZnVuY3Rpb24gc2hvdWxkQmxvY2tPcGVuKG1vZGFsOiBNb2RhbCk6IGJvb2xlYW4ge1xuICAvLyBBIG1vZGFsJ3Mgb3duIHJlLW9wZW4gaXMgbmV2ZXIgYmxvY2tlZCBcdTIwMTQgb3RoZXJ3aXNlIGEgbWluaW1pemVkIG1vZGFsIGNvdWxkIG5vdCByZXN0b3JlL3JlLW9wZW5cbiAgLy8gSXRzZWxmLiBFdmVyeSBPVEhFUiBtb2RhbCBvcGVuIGlzIGJsb2NrZWQgd2hpbGUgYW55IG1vZGFsIGlzIG1pbmltaXplZCAodGhlIHBlZWstb25seSBsb2NrKS5cbiAgcmV0dXJuIGlzUGVla0xvY2tlZCgpICYmICFpc01pbmltaXplZElubmVyTW9kYWwobW9kYWwpO1xufVxuXG5mdW5jdGlvbiBzaWduYWxCbG9ja2VkQXR0ZW1wdCgpOiB2b2lkIHtcbiAgZmxhc2hNaW5pbWl6ZWRCYXJzKCk7XG4gIGJlZXBlci5iZWVwKCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzS2V5ZG93bldoaWxlUGVla0xvY2tlZChldnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSB8fCBpc1BlZWtBbGxvd2VkS2V5KGV2dCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBibG9ja0V2ZW50KGV2dCk7XG59XG5cbmZ1bmN0aW9uIHN1cHByZXNzV2hpbGVQZWVrTG9ja2VkKGV2dDogRXZlbnQpOiB2b2lkIHtcbiAgaWYgKCFpc1BlZWtMb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGJsb2NrRXZlbnQoZXZ0KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMkJBQTJCO0FBRXBDLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sa0JBQWtCO0FBS3hCLE1BQU0sa0JBQWtCLG9CQUFJLElBQVk7QUFBQSxFQUN0QztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBSUQsTUFBTSxnQkFBZ0Isb0JBQUksSUFBWTtBQUFBLEVBQ3BDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQXlCRCxNQUFNLGtCQUFrQixvQkFBSSxJQUFtQjtBQUMvQyxNQUFNLFNBQVMs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "84.6.0",
3
+ "version": "84.6.1",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development.",
5
5
  "keywords": [
6
6
  "obsidian"