@flogeez/angular-tiptap-editor 3.8.0 → 3.9.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.
@@ -1,5 +1,61 @@
1
1
  import { Extension } from "@tiptap/core";
2
- import { Plugin, PluginKey } from "@tiptap/pm/state";
2
+ import { NodeSelection, Plugin, PluginKey, TextSelection } from "@tiptap/pm/state";
3
+ import { Decoration, DecorationSet } from "@tiptap/pm/view";
4
+ export const ATE_BLOCK_DRAG_MIME = "application/x-ate-block-drag";
5
+ const DRAGGING_CLASS = "ate-block-dragging";
6
+ const DROP_BEFORE_CLASS = "ate-block-drop-before";
7
+ const DROP_AFTER_CLASS = "ate-block-drop-after";
8
+ const blockDragKey = new PluginKey("ateBlockDrag");
9
+ const blockDragResetters = new WeakMap();
10
+ export function endAteBlockDrag(view) {
11
+ blockDragResetters.get(view)?.();
12
+ }
13
+ export function ateMultiBlockSelection(state, blockPos) {
14
+ const covered = coveredTopLevelRange(state.doc, state.selection);
15
+ return covered && blockPos >= covered.from && blockPos < covered.to ? covered : null;
16
+ }
17
+ function coveredTopLevelRange(doc, selection) {
18
+ const blocks = [];
19
+ doc.forEach((node, offset) => {
20
+ const end = offset + node.nodeSize;
21
+ if (offset < selection.to && end > selection.from) {
22
+ blocks.push({ from: offset, to: end });
23
+ }
24
+ });
25
+ const last = blocks.at(-1);
26
+ if (blocks.length < 2 || !last) {
27
+ return null;
28
+ }
29
+ return { from: blocks[0].from, to: last.to };
30
+ }
31
+ function topLevelDropPos(view, point) {
32
+ const hit = view.posAtCoords({ left: point.clientX, top: point.clientY });
33
+ if (!hit) {
34
+ return null;
35
+ }
36
+ const $pos = view.state.doc.resolve(hit.pos);
37
+ if ($pos.depth === 0) {
38
+ return hit.pos;
39
+ }
40
+ const start = $pos.before(1);
41
+ const dom = view.nodeDOM(start);
42
+ if (!(dom instanceof Element)) {
43
+ return $pos.after(1);
44
+ }
45
+ const rect = dom.getBoundingClientRect();
46
+ return point.clientY < rect.top + (rect.bottom - rect.top) / 2 ? start : $pos.after(1);
47
+ }
48
+ function dropIndicatorDecoration(doc, pos) {
49
+ if (pos > doc.content.size || doc.resolve(pos).depth !== 0) {
50
+ return null;
51
+ }
52
+ if (pos < doc.content.size) {
53
+ const next = doc.nodeAt(pos);
54
+ return next ? Decoration.node(pos, pos + next.nodeSize, { class: DROP_BEFORE_CLASS }) : null;
55
+ }
56
+ const last = doc.lastChild;
57
+ return last ? Decoration.node(pos - last.nodeSize, pos, { class: DROP_AFTER_CLASS }) : null;
58
+ }
3
59
  // Helper to get the DOM element properly
4
60
  function getDomElement(view, pos) {
5
61
  const dom = view.nodeDOM(pos);
@@ -70,6 +126,157 @@ function resolveBlockData(view, y, targetElement) {
70
126
  }
71
127
  return null;
72
128
  }
129
+ function createBlockDragPlugin() {
130
+ let active = null;
131
+ let marked = null;
132
+ let stopListening = null;
133
+ const setIndicator = (view, pos) => {
134
+ if (blockDragKey.getState(view.state)?.pos !== pos) {
135
+ view.dispatch(view.state.tr.setMeta(blockDragKey, pos));
136
+ }
137
+ };
138
+ const reset = (view) => {
139
+ if (active && view.dragging?.slice === active.slice) {
140
+ view.dragging = null;
141
+ }
142
+ active = null;
143
+ stopListening?.();
144
+ stopListening = null;
145
+ marked?.classList.remove(DRAGGING_CLASS);
146
+ marked = null;
147
+ if (!view.isDestroyed) {
148
+ setIndicator(view, null);
149
+ }
150
+ };
151
+ const listenForDragEnd = (view) => {
152
+ stopListening?.();
153
+ const onEnd = () => reset(view);
154
+ const events = ["dragend", "drop"];
155
+ events.forEach(name => window.addEventListener(name, onEnd));
156
+ stopListening = () => events.forEach(name => window.removeEventListener(name, onEnd));
157
+ };
158
+ const resetOnForeignDrag = (view, event) => {
159
+ if (active && !Array.from(event.dataTransfer?.types ?? []).includes(ATE_BLOCK_DRAG_MIME)) {
160
+ reset(view);
161
+ }
162
+ };
163
+ return new Plugin({
164
+ key: blockDragKey,
165
+ state: {
166
+ init: () => ({ pos: null }),
167
+ apply: (tr, value) => {
168
+ const meta = tr.getMeta(blockDragKey);
169
+ if (meta !== undefined) {
170
+ return { pos: meta };
171
+ }
172
+ return tr.docChanged ? { pos: null } : value;
173
+ },
174
+ },
175
+ view: view => {
176
+ blockDragResetters.set(view, () => reset(view));
177
+ return {
178
+ destroy: () => {
179
+ reset(view);
180
+ blockDragResetters.delete(view);
181
+ },
182
+ };
183
+ },
184
+ props: {
185
+ decorations: state => {
186
+ const pos = blockDragKey.getState(state)?.pos;
187
+ if (pos === null || pos === undefined) {
188
+ return null;
189
+ }
190
+ const decoration = dropIndicatorDecoration(state.doc, pos);
191
+ return decoration ? DecorationSet.create(state.doc, [decoration]) : null;
192
+ },
193
+ handleDOMEvents: {
194
+ dragstart: (view, event) => {
195
+ const transfer = event.dataTransfer;
196
+ if (!view.editable ||
197
+ !transfer ||
198
+ !Array.from(transfer.types).includes(ATE_BLOCK_DRAG_MIME)) {
199
+ return false;
200
+ }
201
+ reset(view);
202
+ const { selection, doc } = view.state;
203
+ const range = coveredTopLevelRange(doc, selection) ?? {
204
+ from: selection.from,
205
+ to: selection.to,
206
+ };
207
+ if (range.from === range.to) {
208
+ return false;
209
+ }
210
+ const slice = doc.slice(range.from, range.to);
211
+ active = { ...range, doc, slice };
212
+ view.dragging = { slice, move: true };
213
+ marked =
214
+ view.dom.offsetParent instanceof HTMLElement
215
+ ? view.dom.offsetParent
216
+ : view.dom.parentElement;
217
+ marked?.classList.add(DRAGGING_CLASS);
218
+ listenForDragEnd(view);
219
+ const { dom, text } = view.serializeForClipboard(slice);
220
+ transfer.clearData();
221
+ transfer.setData("text/html", dom.innerHTML);
222
+ transfer.setData("text/plain", text);
223
+ transfer.setData(ATE_BLOCK_DRAG_MIME, "1");
224
+ return true;
225
+ },
226
+ dragleave: (view, event) => {
227
+ const related = event.relatedTarget;
228
+ if (active && !(related instanceof globalThis.Node && view.dom.contains(related))) {
229
+ setIndicator(view, null);
230
+ }
231
+ return false;
232
+ },
233
+ dragenter: (view, event) => {
234
+ resetOnForeignDrag(view, event);
235
+ return false;
236
+ },
237
+ dragover: (view, event) => {
238
+ resetOnForeignDrag(view, event);
239
+ if (active && !event.dataTransfer?.files?.length) {
240
+ setIndicator(view, topLevelDropPos(view, event));
241
+ }
242
+ return false;
243
+ },
244
+ },
245
+ handleDrop: (view, event) => {
246
+ const drag = active;
247
+ if (!drag || event.dataTransfer?.files?.length) {
248
+ return false;
249
+ }
250
+ if (drag.doc !== view.state.doc) {
251
+ event.preventDefault();
252
+ reset(view);
253
+ return true;
254
+ }
255
+ const target = topLevelDropPos(view, event);
256
+ if (target === null) {
257
+ return false;
258
+ }
259
+ event.preventDefault();
260
+ if (target >= drag.from && target <= drag.to) {
261
+ reset(view);
262
+ return true;
263
+ }
264
+ const tr = view.state.tr.delete(drag.from, drag.to);
265
+ const at = tr.mapping.map(target);
266
+ tr.insert(at, drag.slice.content);
267
+ const { content } = drag.slice;
268
+ const only = content.childCount === 1 ? content.firstChild : null;
269
+ tr.setSelection(only && NodeSelection.isSelectable(only)
270
+ ? NodeSelection.create(tr.doc, at)
271
+ : TextSelection.between(tr.doc.resolve(at), tr.doc.resolve(at + content.size)));
272
+ tr.setMeta(blockDragKey, null).setMeta("uiEvent", "drop");
273
+ view.dispatch(tr.scrollIntoView());
274
+ reset(view);
275
+ return true;
276
+ },
277
+ },
278
+ });
279
+ }
73
280
  export const AteBlockControlsExtension = Extension.create({
74
281
  name: "ateBlockControls",
75
282
  addOptions() {
@@ -81,7 +288,8 @@ export const AteBlockControlsExtension = Extension.create({
81
288
  let rafId = null;
82
289
  let lastMouseX = 0;
83
290
  let lastMouseY = 0;
84
- const update = (view) => {
291
+ // `force` re-resolves the hovered block even if the pointer is still over the last one (after a document change)
292
+ const update = (view, force = false) => {
85
293
  if (!this.editor.isEditable) {
86
294
  return;
87
295
  }
@@ -99,7 +307,7 @@ export const AteBlockControlsExtension = Extension.create({
99
307
  }
100
308
  // STICKY ANTI-FLICKER
101
309
  // On garde le bloc tant qu'on est dans sa hauteur
102
- if (lastHoveredElement && lastHoveredElement.isConnected) {
310
+ if (!force && lastHoveredElement && lastHoveredElement.isConnected) {
103
311
  const rect = lastHoveredElement.getBoundingClientRect();
104
312
  if (lastMouseY >= rect.top && lastMouseY <= rect.bottom) {
105
313
  return;
@@ -126,6 +334,15 @@ export const AteBlockControlsExtension = Extension.create({
126
334
  return [
127
335
  new Plugin({
128
336
  key: new PluginKey("ateBlockControls"),
337
+ // The hovered block can be removed, replaced or moved by an edit while the pointer stays still:
338
+ // resolve it again so the controls never point at a detached element or a stale position
339
+ view: () => ({
340
+ update: (view, prevState) => {
341
+ if (lastHoveredElement && !view.state.doc.eq(prevState.doc)) {
342
+ update(view, true);
343
+ }
344
+ },
345
+ }),
129
346
  props: {
130
347
  handleDOMEvents: {
131
348
  mousemove: (view, event) => {
@@ -150,7 +367,8 @@ export const AteBlockControlsExtension = Extension.create({
150
367
  },
151
368
  },
152
369
  }),
370
+ createBlockDragPlugin(),
153
371
  ];
154
372
  },
155
373
  });
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWJsb2NrLWNvbnRyb2xzLmV4dGVuc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2V4dGVuc2lvbnMvYXRlLWJsb2NrLWNvbnRyb2xzLmV4dGVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFRckQseUNBQXlDO0FBQ3pDLFNBQVMsYUFBYSxDQUFDLElBQWdCLEVBQUUsR0FBVztJQUNsRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNULE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksR0FBRyxZQUFZLFdBQVcsRUFBRSxDQUFDO1FBQy9CLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLGFBQWEsQ0FBQztBQUMzQixDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLFNBQVMsbUJBQW1CLENBQUMsSUFBZ0IsRUFBRSxDQUFTO0lBQ3RELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFrQixDQUFDO0lBQzFDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBa0IsQ0FBQztJQUVqRSxrRkFBa0Y7SUFDbEYsT0FBTyxDQUNMLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxJ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SUFBSSxDQUFDLENBQUM7b0NBQ2IsS0FBSyxHQUFHLElBQUksQ0FBQztnQ0FDZixDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsVUFBVSxFQUFFLEdBQUcsRUFBRTs0QkFDZixJQUFJLEtBQUssRUFBRSxDQUFDO2dDQUNWLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUM1QixLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNmLENBQUM7NEJBQ0QsS0FBSyxFQUFFLENBQUM7NEJBQ1IsT0FBTyxLQUFLLENBQUM7d0JBQ2YsQ0FBQztxQkFDRjtpQkFDRjthQUNGLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5IH0gZnJvbSBcIkB0aXB0YXAvcG0vc3RhdGVcIjtcbmltcG9ydCB7IEVkaXRvclZpZXcgfSBmcm9tIFwiQHRpcHRhcC9wbS92aWV3XCI7XG5pbXBvcnQgeyBOb2RlIH0gZnJvbSBcIkB0aXB0YXAvcG0vbW9kZWxcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdGVCbG9ja0NvbnRyb2xzT3B0aW9ucyB7XG4gIG9uSG92ZXI/OiAoZGF0YTogeyBub2RlOiBOb2RlOyBlbGVtZW50OiBIVE1MRWxlbWVudDsgcG9zOiBudW1iZXIgfSB8IG51bGwpID0+IHZvaWQ7XG59XG5cbi8vIEhlbHBlciB0byBnZXQgdGhlIERPTSBlbGVtZW50IHByb3Blcmx5XG5mdW5jdGlvbiBnZXREb21FbGVtZW50KHZpZXc6IEVkaXRvclZpZXcsIHBvczogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgZG9tID0gdmlldy5ub2RlRE9NKHBvcyk7XG4gIGlmICghZG9tKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGRvbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgcmV0dXJuIGRvbTtcbiAgfVxuICByZXR1cm4gZG9tLnBhcmVudEVsZW1lbnQ7XG59XG5cbi8vIFZFUlRJQ0FMIFNDQU4gKEZvciB0aGUgZW1wdHkgbWFyZ2luKVxuZnVuY3Rpb24gZmluZEJsb2NrRWxlbWVudEF0WSh2aWV3OiBFZGl0b3JWaWV3LCB5OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBlZGl0b3JEb20gPSB2aWV3LmRvbSBhcyBIVE1MRWxlbWVudDtcbiAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVkaXRvckRvbS5jaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXTtcblxuICAvLyBXZSBsb29rIGZvciB0aGUgZGlyZWN0IGNoaWxkIG9mIHRoZSBlZGl0b3IgKExldmVsIDEpIHRoYXQgaW50ZXJjZXB0cyB0aGUgWSBsaW5lXG4gIHJldHVybiAoXG4gICAgY2hpbGRyZW4uZmluZChjaGlsZCA9PiB7XG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShjaGlsZCkucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCByZWN0ID0gY2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAvLyBUb2zDqXJhbmNlIGRlIDVweFxuICAgICAgcmV0dXJuIHkgPj0gcmVjdC50b3AgLSA1ICYmIHkgPD0gcmVjdC5ib3R0b20gKyA1O1xuICAgIH0pIHx8IG51bGxcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUJsb2NrRGF0YShcbiAgdmlldzogRWRpdG9yVmlldyxcbiAgeTogbnVtYmVyLFxuICB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGxcbik6IHsgbm9kZTogTm9kZTsgZWxlbWVudDogSFRNTEVsZW1lbnQ7IHBvczogbnVtYmVyIH0gfCBudWxsIHtcbiAgbGV0IGJsb2NrRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gMS4gRkFTVCBQQVRIIDogRGlyZWN0IHRhcmdldFxuICAvLyBMRVZFTCAxOiBXZSBsb29rIGZvciB0aGUgZmlyc3QgcGFyZW50IGVsZW1lbnQgdGhhdCBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZWRpdG9yXG4gIGlmICh0YXJnZXRFbGVtZW50ICYmICF0YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcIlByb3NlTWlycm9yXCIpKSB7XG4gICAgYmxvY2tFbCA9IHRhcmdldEVsZW1lbnQuY2xvc2VzdChcIi5Qcm9zZU1pcnJvciA+ICpcIikgYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICAvLyAyLiBHVVRURVIgUEFUSCA6IFZlcnRpY2FsIHNjYW5cbiAgaWYgKCFibG9ja0VsKSB7XG4gICAgYmxvY2tFbCA9IGZpbmRCbG9ja0VsZW1lbnRBdFkodmlldywgeSk7XG4gIH1cblxuICBpZiAoIWJsb2NrRWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIDMuIFBST1NFTUlSUk9SIE5PREUgUkVTT0xVVElPTlxuICB0cnkge1xuICAgIC8vIFdlIGFzayBmb3IgdGhlIHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyByb290IGJsb2NrXG4gICAgY29uc3QgcG9zID0gdmlldy5wb3NBdERPTShibG9ja0VsLCAwKTtcbiAgICBjb25zdCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShwb3MpO1xuXG4gICAgLy8gQ0FTRSBBIDogU1RBTkRBUkQgQkxPQ0tTIChIMSwgUCwgTGlzdHMsIEJsb2NrcXVvdGVzLi4uKVxuICAgIC8vIFdlIG1ha2Ugc3VyZSB0byB0YWtlIHRoZSBub2RlIG9mIGRlcHRoIDEgKERpcmVjdCBjaGlsZCBvZiB0aGUgRG9jKVxuICAgIGlmICgkcG9zLmRlcHRoID49IDEpIHtcbiAgICAgIGNvbnN0IHJvb3ROb2RlID0gJHBvcy5ub2RlKDEpO1xuICAgICAgY29uc3Qgcm9vdFBvcyA9ICRwb3MuYmVmb3JlKDEpO1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBnZXREb21FbGVtZW50KHZpZXcsIHJvb3RQb3MpO1xuXG4gICAgICAvLyBTw6ljdXJpdMOpIDogb24gdsOpcmlmaWUgcXVlIGwnw6lsw6ltZW50IERPTSBjb3JyZXNwb25kIGJpZW5cbiAgICAgIGlmIChyb290Tm9kZSAmJiAocm9vdEVsZW1lbnQgfHwgYmxvY2tFbCkpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogcm9vdE5vZGUsIGVsZW1lbnQ6IHJvb3RFbGVtZW50IHx8IGJsb2NrRWwsIHBvczogcm9vdFBvcyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENBU0UgQiA6IElNQUdFUyAvIEFUT01TIChEZXB0aCAwKVxuICAgIC8vIFNvbWV0aW1lcyBhIHJvb3QgaW1hZ2UgaXMgc2VlbiBhcyBEZXB0aCAwIGJ5IHJlc29sdmUoKVxuICAgIC8vIFdlIGxvb2sgYXQgdGhlIG5vZGUgcmlnaHQgYWZ0ZXIgdGhlIHBvc2l0aW9uXG4gICAgaWYgKCRwb3MuZGVwdGggPT09IDApIHtcbiAgICAgIGNvbnN0IG5vZGVBZnRlciA9ICRwb3Mubm9kZUFmdGVyO1xuICAgICAgaWYgKG5vZGVBZnRlciAmJiAobm9kZUFmdGVyLmlzQmxvY2sgfHwgbm9kZUFmdGVyLmlzQXRvbSkpIHtcbiAgICAgICAgcmV0dXJuIHsgbm9kZTogbm9kZUFmdGVyLCBlbGVtZW50OiBibG9ja0VsLCBwb3M6IHBvcyB9O1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoX2UpIHtcbiAgICAvLyBjb25zb2xlLndhcm4oX2UpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjb25zdCBBdGVCbG9ja0NvbnRyb2xzRXh0ZW5zaW9uID0gRXh0ZW5zaW9uLmNyZWF0ZTxBdGVCbG9ja0NvbnRyb2xzT3B0aW9ucz4oe1xuICBuYW1lOiBcImF0ZUJsb2NrQ29udHJvbHNcIixcblxuICBhZGRPcHRpb25zKCkge1xuICAgIHJldHVybiB7IG9uSG92ZXI6IHVuZGVmaW5lZCB9O1xuICB9LFxuXG4gIGFkZFByb3NlTWlycm9yUGx1Z2lucygpIHtcbiAgICBsZXQgbGFzdEhvdmVyZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBsYXN0SG92ZXJlZFBvczogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHJhZklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdE1vdXNlWCA9IDA7XG4gICAgbGV0IGxhc3RNb3VzZVkgPSAwO1xuXG4gICAgY29uc3QgdXBkYXRlID0gKHZpZXc6IEVkaXRvclZpZXcpID0+IHtcbiAgICAgIGlmICghdGhpcy5lZGl0b3IuaXNFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGd1dHRlcldpZHRoID0gODA7XG5cbiAgICAgIC8vIENoZWNrIExpbWl0ZXMgKE1hcmdlIEdhdWNoZSArIEVkaXRldXIpXG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RNb3VzZVkgPCBlZGl0b3JSZWN0LnRvcCB8fFxuICAgICAgICBsYXN0TW91c2VZID4gZWRpdG9yUmVjdC5ib3R0b20gfHxcbiAgICAgICAgbGFzdE1vdXNlWCA+IGVkaXRvclJlY3QucmlnaHQgfHxcbiAgICAgICAgbGFzdE1vdXNlWCA8IGVkaXRvclJlY3QubGVmdCAtIGd1dHRlcldpZHRoXG4gICAgICApIHtcbiAgICAgICAgaWYgKGxhc3RIb3ZlcmVkRWxlbWVudCkge1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTVElDS1kgQU5USS1GTElDS0VSXG4gICAgICAvLyBPbiBnYXJkZSBsZSBibG9jIHRhbnQgcXUnb24gZXN0IGRhbnMgc2EgaGF1dGV1clxuICAgICAgaWYgKGxhc3RIb3ZlcmVkRWxlbWVudCAmJiBsYXN0SG92ZXJlZEVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgcmVjdCA9IGxhc3RIb3ZlcmVkRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGxhc3RNb3VzZVkgPj0gcmVjdC50b3AgJiYgbGFzdE1vdXNlWSA8PSByZWN0LmJvdHRvbSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGxhc3RNb3VzZVgsIGxhc3RNb3VzZVkpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICBjb25zdCBkYXRhID0gcmVzb2x2ZUJsb2NrRGF0YSh2aWV3LCBsYXN0TW91c2VZLCB0YXJnZXQpO1xuXG4gICAgICBpZiAoZGF0YSAmJiAoZGF0YS5lbGVtZW50ICE9PSBsYXN0SG92ZXJlZEVsZW1lbnQgfHwgZGF0YS5wb3MgIT09IGxhc3RIb3ZlcmVkUG9zKSkge1xuICAgICAgICBsYXN0SG92ZXJlZEVsZW1lbnQgPSBkYXRhLmVsZW1lbnQ7XG4gICAgICAgIGxhc3RIb3ZlcmVkUG9zID0gZGF0YS5wb3M7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkhvdmVyPy4oZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKCFkYXRhKSB7XG4gICAgICAgIGlmICghbGFzdEhvdmVyZWRFbGVtZW50IHx8ICFsYXN0SG92ZXJlZEVsZW1lbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICByZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLm9uSG92ZXI/LihudWxsKTtcbiAgICAgIGxhc3RIb3ZlcmVkRWxlbWVudCA9IG51bGw7XG4gICAgICBsYXN0SG92ZXJlZFBvcyA9IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiBbXG4gICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAga2V5OiBuZXcgUGx1Z2luS2V5KFwiYXRlQmxvY2tDb250cm9sc1wiKSxcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICBoYW5kbGVET01FdmVudHM6IHtcbiAgICAgICAgICAgIG1vdXNlbW92ZTogKHZpZXc6IEVkaXRvclZpZXcsIGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGxhc3RNb3VzZVggPSBldmVudC5jbGllbnRYO1xuICAgICAgICAgICAgICBsYXN0TW91c2VZID0gZXZlbnQuY2xpZW50WTtcblxuICAgICAgICAgICAgICBpZiAocmFmSWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB1cGRhdGUodmlldyk7XG4gICAgICAgICAgICAgICAgICByYWZJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdXNlbGVhdmU6ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHJhZklkKSB7XG4gICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpO1xuICAgICAgICAgICAgICAgIHJhZklkID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNldCgpO1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICBdO1xuICB9LFxufSk7XG4iXX0=
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWJsb2NrLWNvbnRyb2xzLmV4dGVuc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2V4dGVuc2lvbnMvYXRlLWJsb2NrLWNvbnRyb2xzLmV4dGVuc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBZSxhQUFhLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBR3hFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLDhCQUE4QixDQUFDO0FBRWxFLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDO0FBQzVDLE1BQU0saUJBQWlCLEdBQUcsdUJBQXVCLENBQUM7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQztBQWdCaEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxTQUFTLENBQXFCLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQTBCLENBQUM7QUFFakUsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFnQjtJQUM5QyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsS0FBa0IsRUFBRSxRQUFnQjtJQUN6RSxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRSxPQUFPLE9BQU8sSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxRQUFRLEdBQUcsT0FBTyxD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RixLQUFLLEVBQUU7b0JBQ0wsZUFBZSxFQUFFO3dCQUNmLFNBQVMsRUFBRSxDQUFDLElBQWdCLEVBQUUsS0FBaUIsRUFBRSxFQUFFOzRCQUNqRCxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQzs0QkFDM0IsVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7NEJBRTNCLElBQUksS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO2dDQUNuQixLQUFLLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFO29DQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0NBQ2IsS0FBSyxHQUFHLElBQUksQ0FBQztnQ0FDZixDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDOzRCQUNELE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7d0JBQ0QsVUFBVSxFQUFFLEdBQUcsRUFBRTs0QkFDZixJQUFJLEtBQUssRUFBRSxDQUFDO2dDQUNWLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dDQUM1QixLQUFLLEdBQUcsSUFBSSxDQUFDOzRCQUNmLENBQUM7NEJBQ0QsS0FBSyxFQUFFLENBQUM7NEJBQ1IsT0FBTyxLQUFLLENBQUM7d0JBQ2YsQ0FBQztxQkFDRjtpQkFDRjthQUNGLENBQUM7WUFDRixxQkFBcUIsRUFBRTtTQUN4QixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4dGVuc2lvbiB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IEVkaXRvclN0YXRlLCBOb2RlU2VsZWN0aW9uLCBQbHVnaW4sIFBsdWdpbktleSwgVGV4dFNlbGVjdGlvbiB9IGZyb20gXCJAdGlwdGFwL3BtL3N0YXRlXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uU2V0LCBFZGl0b3JWaWV3IH0gZnJvbSBcIkB0aXB0YXAvcG0vdmlld1wiO1xuaW1wb3J0IHsgTm9kZSwgU2xpY2UgfSBmcm9tIFwiQHRpcHRhcC9wbS9tb2RlbFwiO1xuXG5leHBvcnQgY29uc3QgQVRFX0JMT0NLX0RSQUdfTUlNRSA9IFwiYXBwbGljYXRpb24veC1hdGUtYmxvY2stZHJhZ1wiO1xuXG5jb25zdCBEUkFHR0lOR19DTEFTUyA9IFwiYXRlLWJsb2NrLWRyYWdnaW5nXCI7XG5jb25zdCBEUk9QX0JFRk9SRV9DTEFTUyA9IFwiYXRlLWJsb2NrLWRyb3AtYmVmb3JlXCI7XG5jb25zdCBEUk9QX0FGVEVSX0NMQVNTID0gXCJhdGUtYmxvY2stZHJvcC1hZnRlclwiO1xuXG5pbnRlcmZhY2UgUG9zUmFuZ2Uge1xuICBmcm9tOiBudW1iZXI7XG4gIHRvOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBBY3RpdmVCbG9ja0RyYWcgZXh0ZW5kcyBQb3NSYW5nZSB7XG4gIGRvYzogTm9kZTtcbiAgc2xpY2U6IFNsaWNlO1xufVxuXG5pbnRlcmZhY2UgRHJvcEluZGljYXRvclN0YXRlIHtcbiAgcG9zOiBudW1iZXIgfCBudWxsO1xufVxuXG5jb25zdCBibG9ja0RyYWdLZXkgPSBuZXcgUGx1Z2luS2V5PERyb3BJbmRpY2F0b3JTdGF0ZT4oXCJhdGVCbG9ja0RyYWdcIik7XG5jb25zdCBibG9ja0RyYWdSZXNldHRlcnMgPSBuZXcgV2Vha01hcDxFZGl0b3JWaWV3LCAoKSA9PiB2b2lkPigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5kQXRlQmxvY2tEcmFnKHZpZXc6IEVkaXRvclZpZXcpOiB2b2lkIHtcbiAgYmxvY2tEcmFnUmVzZXR0ZXJzLmdldCh2aWV3KT8uKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdGVNdWx0aUJsb2NrU2VsZWN0aW9uKHN0YXRlOiBFZGl0b3JTdGF0ZSwgYmxvY2tQb3M6IG51bWJlcik6IFBvc1JhbmdlIHwgbnVsbCB7XG4gIGNvbnN0IGNvdmVyZWQgPSBjb3ZlcmVkVG9wTGV2ZWxSYW5nZShzdGF0ZS5kb2MsIHN0YXRlLnNlbGVjdGlvbik7XG4gIHJldHVybiBjb3ZlcmVkICYmIGJsb2NrUG9zID49IGNvdmVyZWQuZnJvbSAmJiBibG9ja1BvcyA8IGNvdmVyZWQudG8gPyBjb3ZlcmVkIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gY292ZXJlZFRvcExldmVsUmFuZ2UoZG9jOiBOb2RlLCBzZWxlY3Rpb246IFBvc1JhbmdlKTogUG9zUmFuZ2UgfCBudWxsIHtcbiAgY29uc3QgYmxvY2tzOiBQb3NSYW5nZVtdID0gW107XG4gIGRvYy5mb3JFYWNoKChub2RlLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBlbmQgPSBvZmZzZXQgKyBub2RlLm5vZGVTaXplO1xuICAgIGlmIChvZmZzZXQgPCBzZWxlY3Rpb24udG8gJiYgZW5kID4gc2VsZWN0aW9uLmZyb20pIHtcbiAgICAgIGJsb2Nrcy5wdXNoKHsgZnJvbTogb2Zmc2V0LCB0bzogZW5kIH0pO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IGxhc3QgPSBibG9ja3MuYXQoLTEpO1xuICBpZiAoYmxvY2tzLmxlbmd0aCA8IDIgfHwgIWxhc3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4geyBmcm9tOiBibG9ja3NbMF0uZnJvbSwgdG86IGxhc3QudG8gfTtcbn1cblxuZnVuY3Rpb24gdG9wTGV2ZWxEcm9wUG9zKFxuICB2aWV3OiBFZGl0b3JWaWV3LFxuICBwb2ludDogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9XG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgaGl0ID0gdmlldy5wb3NBdENvb3Jkcyh7IGxlZnQ6IHBvaW50LmNsaWVudFgsIHRvcDogcG9pbnQuY2xpZW50WSB9KTtcbiAgaWYgKCFoaXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCAkcG9zID0gdmlldy5zdGF0ZS5kb2MucmVzb2x2ZShoaXQucG9zKTtcbiAgaWYgKCRwb3MuZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gaGl0LnBvcztcbiAgfVxuICBjb25zdCBzdGFydCA9ICRwb3MuYmVmb3JlKDEpO1xuICBjb25zdCBkb20gPSB2aWV3Lm5vZGVET00oc3RhcnQpO1xuICBpZiAoIShkb20gaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgIHJldHVybiAkcG9zLmFmdGVyKDEpO1xuICB9XG4gIGNvbnN0IHJlY3QgPSBkb20uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiBwb2ludC5jbGllbnRZIDwgcmVjdC50b3AgKyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkgLyAyID8gc3RhcnQgOiAkcG9zLmFmdGVyKDEpO1xufVxuXG5mdW5jdGlvbiBkcm9wSW5kaWNhdG9yRGVjb3JhdGlvbihkb2M6IE5vZGUsIHBvczogbnVtYmVyKTogRGVjb3JhdGlvbiB8IG51bGwge1xuICBpZiAocG9zID4gZG9jLmNvbnRlbnQuc2l6ZSB8fCBkb2MucmVzb2x2ZShwb3MpLmRlcHRoICE9PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHBvcyA8IGRvYy5jb250ZW50LnNpemUpIHtcbiAgICBjb25zdCBuZXh0ID0gZG9jLm5vZGVBdChwb3MpO1xuICAgIHJldHVybiBuZXh0ID8gRGVjb3JhdGlvbi5ub2RlKHBvcywgcG9zICsgbmV4dC5ub2RlU2l6ZSwgeyBjbGFzczogRFJPUF9CRUZPUkVfQ0xBU1MgfSkgOiBudWxsO1xuICB9XG4gIGNvbnN0IGxhc3QgPSBkb2MubGFzdENoaWxkO1xuICByZXR1cm4gbGFzdCA/IERlY29yYXRpb24ubm9kZShwb3MgLSBsYXN0Lm5vZGVTaXplLCBwb3MsIHsgY2xhc3M6IERST1BfQUZURVJfQ0xBU1MgfSkgOiBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0ZUJsb2NrQ29udHJvbHNPcHRpb25zIHtcbiAgb25Ib3Zlcj86IChkYXRhOiB7IG5vZGU6IE5vZGU7IGVsZW1lbnQ6IEhUTUxFbGVtZW50OyBwb3M6IG51bWJlciB9IHwgbnVsbCkgPT4gdm9pZDtcbn1cblxuLy8gSGVscGVyIHRvIGdldCB0aGUgRE9NIGVsZW1lbnQgcHJvcGVybHlcbmZ1bmN0aW9uIGdldERvbUVsZW1lbnQodmlldzogRWRpdG9yVmlldywgcG9zOiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICBjb25zdCBkb20gPSB2aWV3Lm5vZGVET00ocG9zKTtcbiAgaWYgKCFkb20pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZG9tIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZG9tO1xuICB9XG4gIHJldHVybiBkb20ucGFyZW50RWxlbWVudDtcbn1cblxuLy8gVkVSVElDQUwgU0NBTiAoRm9yIHRoZSBlbXB0eSBtYXJnaW4pXG5mdW5jdGlvbiBmaW5kQmxvY2tFbGVtZW50QXRZKHZpZXc6IEVkaXRvclZpZXcsIHk6IG51bWJlcik6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVkaXRvckRvbSA9IHZpZXcuZG9tIGFzIEhUTUxFbGVtZW50O1xuICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWRpdG9yRG9tLmNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gIC8vIFdlIGxvb2sgZm9yIHRoZSBkaXJlY3QgY2hpbGQgb2YgdGhlIGVkaXRvciAoTGV2ZWwgMSkgdGhhdCBpbnRlcmNlcHRzIHRoZSBZIGxpbmVcbiAgcmV0dXJuIChcbiAgICBjaGlsZHJlbi5maW5kKGNoaWxkID0+IHtcbiAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGNoaWxkKS5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlY3QgPSBjaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIFRvbMOpcmFuY2UgZGUgNXB4XG4gICAgICByZXR1cm4geSA+PSByZWN0LnRvcCAtIDUgJiYgeSA8PSByZWN0LmJvdHRvbSArIDU7XG4gICAgfSkgfHwgbnVsbFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQmxvY2tEYXRhKFxuICB2aWV3OiBFZGl0b3JWaWV3LFxuICB5OiBudW1iZXIsXG4gIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbFxuKTogeyBub2RlOiBOb2RlOyBlbGVtZW50OiBIVE1MRWxlbWVudDsgcG9zOiBudW1iZXIgfSB8IG51bGwge1xuICBsZXQgYmxvY2tFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAvLyAxLiBGQVNUIFBBVEggOiBEaXJlY3QgdGFyZ2V0XG4gIC8vIExFVkVMIDE6IFdlIGxvb2sgZm9yIHRoZSBmaXJzdCBwYXJlbnQgZWxlbWVudCB0aGF0IGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBlZGl0b3JcbiAgaWYgKHRhcmdldEVsZW1lbnQgJiYgIXRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiUHJvc2VNaXJyb3JcIikpIHtcbiAgICBibG9ja0VsID0gdGFyZ2V0RWxlbWVudC5jbG9zZXN0KFwiLlByb3NlTWlycm9yID4gKlwiKSBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIC8vIDIuIEdVVFRFUiBQQVRIIDogVmVydGljYWwgc2NhblxuICBpZiAoIWJsb2NrRWwpIHtcbiAgICBibG9ja0VsID0gZmluZEJsb2NrRWxlbWVudEF0WSh2aWV3LCB5KTtcbiAgfVxuXG4gIGlmICghYmxvY2tFbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gMy4gUFJPU0VNSVJST1IgTk9ERSBSRVNPTFVUSU9OXG4gIHRyeSB7XG4gICAgLy8gV2UgYXNrIGZvciB0aGUgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHJvb3QgYmxvY2tcbiAgICBjb25zdCBwb3MgPSB2aWV3LnBvc0F0RE9NKGJsb2NrRWwsIDApO1xuICAgIGNvbnN0ICRwb3MgPSB2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKHBvcyk7XG5cbiAgICAvLyBDQVNFIEEgOiBTVEFOREFSRCBCTE9DS1MgKEgxLCBQLCBMaXN0cywgQmxvY2txdW90ZXMuLi4pXG4gICAgLy8gV2UgbWFrZSBzdXJlIHRvIHRha2UgdGhlIG5vZGUgb2YgZGVwdGggMSAoRGlyZWN0IGNoaWxkIG9mIHRoZSBEb2MpXG4gICAgaWYgKCRwb3MuZGVwdGggPj0gMSkge1xuICAgICAgY29uc3Qgcm9vdE5vZGUgPSAkcG9zLm5vZGUoMSk7XG4gICAgICBjb25zdCByb290UG9zID0gJHBvcy5iZWZvcmUoMSk7XG4gICAgICBjb25zdCByb290RWxlbWVudCA9IGdldERvbUVsZW1lbnQodmlldywgcm9vdFBvcyk7XG5cbiAgICAgIC8vIFPDqWN1cml0w6kgOiBvbiB2w6lyaWZpZSBxdWUgbCfDqWzDqW1lbnQgRE9NIGNvcnJlc3BvbmQgYmllblxuICAgICAgaWYgKHJvb3ROb2RlICYmIChyb290RWxlbWVudCB8fCBibG9ja0VsKSkge1xuICAgICAgICByZXR1cm4geyBub2RlOiByb290Tm9kZSwgZWxlbWVudDogcm9vdEVsZW1lbnQgfHwgYmxvY2tFbCwgcG9zOiByb290UG9zIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ0FTRSBCIDogSU1BR0VTIC8gQVRPTVMgKERlcHRoIDApXG4gICAgLy8gU29tZXRpbWVzIGEgcm9vdCBpbWFnZSBpcyBzZWVuIGFzIERlcHRoIDAgYnkgcmVzb2x2ZSgpXG4gICAgLy8gV2UgbG9vayBhdCB0aGUgbm9kZSByaWdodCBhZnRlciB0aGUgcG9zaXRpb25cbiAgICBpZiAoJHBvcy5kZXB0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgbm9kZUFmdGVyID0gJHBvcy5ub2RlQWZ0ZXI7XG4gICAgICBpZiAobm9kZUFmdGVyICYmIChub2RlQWZ0ZXIuaXNCbG9jayB8fCBub2RlQWZ0ZXIuaXNBdG9tKSkge1xuICAgICAgICByZXR1cm4geyBub2RlOiBub2RlQWZ0ZXIsIGVsZW1lbnQ6IGJsb2NrRWwsIHBvczogcG9zIH07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChfZSkge1xuICAgIC8vIGNvbnNvbGUud2FybihfZSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQmxvY2tEcmFnUGx1Z2luKCk6IFBsdWdpbjxEcm9wSW5kaWNhdG9yU3RhdGU+IHtcbiAgbGV0IGFjdGl2ZTogQWN0aXZlQmxvY2tEcmFnIHwgbnVsbCA9IG51bGw7XG4gIGxldCBtYXJrZWQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdG9wTGlzdGVuaW5nOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzZXRJbmRpY2F0b3IgPSAodmlldzogRWRpdG9yVmlldywgcG9zOiBudW1iZXIgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgaWYgKGJsb2NrRHJhZ0tleS5nZXRTdGF0ZSh2aWV3LnN0YXRlKT8ucG9zICE9PSBwb3MpIHtcbiAgICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5zZXRNZXRhKGJsb2NrRHJhZ0tleSwgcG9zKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlc2V0ID0gKHZpZXc6IEVkaXRvclZpZXcpOiB2b2lkID0+IHtcbiAgICBpZiAoYWN0aXZlICYmIHZpZXcuZHJhZ2dpbmc/LnNsaWNlID09PSBhY3RpdmUuc2xpY2UpIHtcbiAgICAgIHZpZXcuZHJhZ2dpbmcgPSBudWxsO1xuICAgIH1cbiAgICBhY3RpdmUgPSBudWxsO1xuICAgIHN0b3BMaXN0ZW5pbmc/LigpO1xuICAgIHN0b3BMaXN0ZW5pbmcgPSBudWxsO1xuICAgIG1hcmtlZD8uY2xhc3NMaXN0LnJlbW92ZShEUkFHR0lOR19DTEFTUyk7XG4gICAgbWFya2VkID0gbnVsbDtcbiAgICBpZiAoIXZpZXcuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHNldEluZGljYXRvcih2aWV3LCBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbGlzdGVuRm9yRHJhZ0VuZCA9ICh2aWV3OiBFZGl0b3JWaWV3KTogdm9pZCA9PiB7XG4gICAgc3RvcExpc3RlbmluZz8uKCk7XG4gICAgY29uc3Qgb25FbmQgPSAoKTogdm9pZCA9PiByZXNldCh2aWV3KTtcbiAgICBjb25zdCBldmVudHMgPSBbXCJkcmFnZW5kXCIsIFwiZHJvcFwiXTtcbiAgICBldmVudHMuZm9yRWFjaChuYW1lID0+IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKG5hbWUsIG9uRW5kKSk7XG4gICAgc3RvcExpc3RlbmluZyA9ICgpID0+IGV2ZW50cy5mb3JFYWNoKG5hbWUgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb25FbmQpKTtcbiAgfTtcblxuICBjb25zdCByZXNldE9uRm9yZWlnbkRyYWcgPSAodmlldzogRWRpdG9yVmlldywgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmIChhY3RpdmUgJiYgIUFycmF5LmZyb20oZXZlbnQuZGF0YVRyYW5zZmVyPy50eXBlcyA/PyBbXSkuaW5jbHVkZXMoQVRFX0JMT0NLX0RSQUdfTUlNRSkpIHtcbiAgICAgIHJlc2V0KHZpZXcpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFBsdWdpbjxEcm9wSW5kaWNhdG9yU3RhdGU+KHtcbiAgICBrZXk6IGJsb2NrRHJhZ0tleSxcbiAgICBzdGF0ZToge1xuICAgICAgaW5pdDogKCkgPT4gKHsgcG9zOiBudWxsIH0pLFxuICAgICAgYXBwbHk6ICh0ciwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgbWV0YSA9IHRyLmdldE1ldGEoYmxvY2tEcmFnS2V5KSBhcyBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAobWV0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcG9zOiBtZXRhIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyLmRvY0NoYW5nZWQgPyB7IHBvczogbnVsbCB9IDogdmFsdWU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgdmlldzogdmlldyA9PiB7XG4gICAgICBibG9ja0RyYWdSZXNldHRlcnMuc2V0KHZpZXcsICgpID0+IHJlc2V0KHZpZXcpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgICByZXNldCh2aWV3KTtcbiAgICAgICAgICBibG9ja0RyYWdSZXNldHRlcnMuZGVsZXRlKHZpZXcpO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIHByb3BzOiB7XG4gICAgICBkZWNvcmF0aW9uczogc3RhdGUgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSBibG9ja0RyYWdLZXkuZ2V0U3RhdGUoc3RhdGUpPy5wb3M7XG4gICAgICAgIGlmIChwb3MgPT09IG51bGwgfHwgcG9zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWNvcmF0aW9uID0gZHJvcEluZGljYXRvckRlY29yYXRpb24oc3RhdGUuZG9jLCBwb3MpO1xuICAgICAgICByZXR1cm4gZGVjb3JhdGlvbiA/IERlY29yYXRpb25TZXQuY3JlYXRlKHN0YXRlLmRvYywgW2RlY29yYXRpb25dKSA6IG51bGw7XG4gICAgICB9LFxuICAgICAgaGFuZGxlRE9NRXZlbnRzOiB7XG4gICAgICAgIGRyYWdzdGFydDogKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXIgPSBldmVudC5kYXRhVHJhbnNmZXI7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXZpZXcuZWRpdGFibGUgfHxcbiAgICAgICAgICAgICF0cmFuc2ZlciB8fFxuICAgICAgICAgICAgIUFycmF5LmZyb20odHJhbnNmZXIudHlwZXMpLmluY2x1ZGVzKEFURV9CTE9DS19EUkFHX01JTUUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc2V0KHZpZXcpO1xuICAgICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uLCBkb2MgfSA9IHZpZXcuc3RhdGU7XG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSBjb3ZlcmVkVG9wTGV2ZWxSYW5nZShkb2MsIHNlbGVjdGlvbikgPz8ge1xuICAgICAgICAgICAgZnJvbTogc2VsZWN0aW9uLmZyb20sXG4gICAgICAgICAgICB0bzogc2VsZWN0aW9uLnRvLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJhbmdlLmZyb20gPT09IHJhbmdlLnRvKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNsaWNlID0gZG9jLnNsaWNlKHJhbmdlLmZyb20sIHJhbmdlLnRvKTtcbiAgICAgICAgICBhY3RpdmUgPSB7IC4uLnJhbmdlLCBkb2MsIHNsaWNlIH07XG4gICAgICAgICAgdmlldy5kcmFnZ2luZyA9IHsgc2xpY2UsIG1vdmU6IHRydWUgfTtcbiAgICAgICAgICBtYXJrZWQgPVxuICAgICAgICAgICAgdmlldy5kb20ub2Zmc2V0UGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgPyB2aWV3LmRvbS5vZmZzZXRQYXJlbnRcbiAgICAgICAgICAgICAgOiB2aWV3LmRvbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgIG1hcmtlZD8uY2xhc3NMaXN0LmFkZChEUkFHR0lOR19DTEFTUyk7XG4gICAgICAgICAgbGlzdGVuRm9yRHJhZ0VuZCh2aWV3KTtcbiAgICAgICAgICBjb25zdCB7IGRvbSwgdGV4dCB9ID0gdmlldy5zZXJpYWxpemVGb3JDbGlwYm9hcmQoc2xpY2UpO1xuICAgICAgICAgIHRyYW5zZmVyLmNsZWFyRGF0YSgpO1xuICAgICAgICAgIHRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0L2h0bWxcIiwgZG9tLmlubmVySFRNTCk7XG4gICAgICAgICAgdHJhbnNmZXIuc2V0RGF0YShcInRleHQvcGxhaW5cIiwgdGV4dCk7XG4gICAgICAgICAgdHJhbnNmZXIuc2V0RGF0YShBVEVfQkxPQ0tfRFJBR19NSU1FLCBcIjFcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIGRyYWdsZWF2ZTogKHZpZXcsIGV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICAgaWYgKGFjdGl2ZSAmJiAhKHJlbGF0ZWQgaW5zdGFuY2VvZiBnbG9iYWxUaGlzLk5vZGUgJiYgdmlldy5kb20uY29udGFpbnMocmVsYXRlZCkpKSB7XG4gICAgICAgICAgICBzZXRJbmRpY2F0b3IodmlldywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2VudGVyOiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgICByZXNldE9uRm9yZWlnbkRyYWcodmlldywgZXZlbnQpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ292ZXI6ICh2aWV3LCBldmVudCkgPT4ge1xuICAgICAgICAgIHJlc2V0T25Gb3JlaWduRHJhZyh2aWV3LCBldmVudCk7XG4gICAgICAgICAgaWYgKGFjdGl2ZSAmJiAhZXZlbnQuZGF0YVRyYW5zZmVyPy5maWxlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXRJbmRpY2F0b3IodmlldywgdG9wTGV2ZWxEcm9wUG9zKHZpZXcsIGV2ZW50KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVEcm9wOiAodmlldywgZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZHJhZyA9IGFjdGl2ZTtcbiAgICAgICAgaWYgKCFkcmFnIHx8IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJhZy5kb2MgIT09IHZpZXcuc3RhdGUuZG9jKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXNldCh2aWV3KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0b3BMZXZlbERyb3BQb3ModmlldywgZXZlbnQpO1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0YXJnZXQgPj0gZHJhZy5mcm9tICYmIHRhcmdldCA8PSBkcmFnLnRvKSB7XG4gICAgICAgICAgcmVzZXQodmlldyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHIgPSB2aWV3LnN0YXRlLnRyLmRlbGV0ZShkcmFnLmZyb20sIGRyYWcudG8pO1xuICAgICAgICBjb25zdCBhdCA9IHRyLm1hcHBpbmcubWFwKHRhcmdldCk7XG4gICAgICAgIHRyLmluc2VydChhdCwgZHJhZy5zbGljZS5jb250ZW50KTtcbiAgICAgICAgY29uc3QgeyBjb250ZW50IH0gPSBkcmFnLnNsaWNlO1xuICAgICAgICBjb25zdCBvbmx5ID0gY29udGVudC5jaGlsZENvdW50ID09PSAxID8gY29udGVudC5maXJzdENoaWxkIDogbnVsbDtcbiAgICAgICAgdHIuc2V0U2VsZWN0aW9uKFxuICAgICAgICAgIG9ubHkgJiYgTm9kZVNlbGVjdGlvbi5pc1NlbGVjdGFibGUob25seSlcbiAgICAgICAgICAgID8gTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBhdClcbiAgICAgICAgICAgIDogVGV4dFNlbGVjdGlvbi5iZXR3ZWVuKHRyLmRvYy5yZXNvbHZlKGF0KSwgdHIuZG9jLnJlc29sdmUoYXQgKyBjb250ZW50LnNpemUpKVxuICAgICAgICApO1xuICAgICAgICB0ci5zZXRNZXRhKGJsb2NrRHJhZ0tleSwgbnVsbCkuc2V0TWV0YShcInVpRXZlbnRcIiwgXCJkcm9wXCIpO1xuICAgICAgICB2aWV3LmRpc3BhdGNoKHRyLnNjcm9sbEludG9WaWV3KCkpO1xuICAgICAgICByZXNldCh2aWV3KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgQXRlQmxvY2tDb250cm9sc0V4dGVuc2lvbiA9IEV4dGVuc2lvbi5jcmVhdGU8QXRlQmxvY2tDb250cm9sc09wdGlvbnM+KHtcbiAgbmFtZTogXCJhdGVCbG9ja0NvbnRyb2xzXCIsXG5cbiAgYWRkT3B0aW9ucygpIHtcbiAgICByZXR1cm4geyBvbkhvdmVyOiB1bmRlZmluZWQgfTtcbiAgfSxcblxuICBhZGRQcm9zZU1pcnJvclBsdWdpbnMoKSB7XG4gICAgbGV0IGxhc3RIb3ZlcmVkRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdEhvdmVyZWRQb3M6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGxldCByYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RNb3VzZVggPSAwO1xuICAgIGxldCBsYXN0TW91c2VZID0gMDtcblxuICAgIC8vIGBmb3JjZWAgcmUtcmVzb2x2ZXMgdGhlIGhvdmVyZWQgYmxvY2sgZXZlbiBpZiB0aGUgcG9pbnRlciBpcyBzdGlsbCBvdmVyIHRoZSBsYXN0IG9uZSAoYWZ0ZXIgYSBkb2N1bWVudCBjaGFuZ2UpXG4gICAgY29uc3QgdXBkYXRlID0gKHZpZXc6IEVkaXRvclZpZXcsIGZvcmNlID0gZmFsc2UpID0+IHtcbiAgICAgIGlmICghdGhpcy5lZGl0b3IuaXNFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvclJlY3QgPSB2aWV3LmRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGd1dHRlcldpZHRoID0gODA7XG5cbiAgICAgIC8vIENoZWNrIExpbWl0ZXMgKE1hcmdlIEdhdWNoZSArIEVkaXRldXIpXG4gICAgICBpZiAoXG4gICAgICAgIGxhc3RNb3VzZVkgPCBlZGl0b3JSZWN0LnRvcCB8fFxuICAgICAgICBsYXN0TW91c2VZID4gZWRpdG9yUmVjdC5ib3R0b20gfHxcbiAgICAgICAgbGFzdE1vdXNlWCA+IGVkaXRvclJlY3QucmlnaHQgfHxcbiAgICAgICAgbGFzdE1vdXNlWCA8IGVkaXRvclJlY3QubGVmdCAtIGd1dHRlcldpZHRoXG4gICAgICApIHtcbiAgICAgICAgaWYgKGxhc3RIb3ZlcmVkRWxlbWVudCkge1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTVElDS1kgQU5USS1GTElDS0VSXG4gICAgICAvLyBPbiBnYXJkZSBsZSBibG9jIHRhbnQgcXUnb24gZXN0IGRhbnMgc2EgaGF1dGV1clxuICAgICAgaWYgKCFmb3JjZSAmJiBsYXN0SG92ZXJlZEVsZW1lbnQgJiYgbGFzdEhvdmVyZWRFbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIGNvbnN0IHJlY3QgPSBsYXN0SG92ZXJlZEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGlmIChsYXN0TW91c2VZID49IHJlY3QudG9wICYmIGxhc3RNb3VzZVkgPD0gcmVjdC5ib3R0b20pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChsYXN0TW91c2VYLCBsYXN0TW91c2VZKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgY29uc3QgZGF0YSA9IHJlc29sdmVCbG9ja0RhdGEodmlldywgbGFzdE1vdXNlWSwgdGFyZ2V0KTtcblxuICAgICAgaWYgKGRhdGEgJiYgKGRhdGEuZWxlbWVudCAhPT0gbGFzdEhvdmVyZWRFbGVtZW50IHx8IGRhdGEucG9zICE9PSBsYXN0SG92ZXJlZFBvcykpIHtcbiAgICAgICAgbGFzdEhvdmVyZWRFbGVtZW50ID0gZGF0YS5lbGVtZW50O1xuICAgICAgICBsYXN0SG92ZXJlZFBvcyA9IGRhdGEucG9zO1xuICAgICAgICB0aGlzLm9wdGlvbnMub25Ib3Zlcj8uKGRhdGEpO1xuICAgICAgfSBlbHNlIGlmICghZGF0YSkge1xuICAgICAgICBpZiAoIWxhc3RIb3ZlcmVkRWxlbWVudCB8fCAhbGFzdEhvdmVyZWRFbGVtZW50LmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCByZXNldCA9ICgpID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5vbkhvdmVyPy4obnVsbCk7XG4gICAgICBsYXN0SG92ZXJlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgbGFzdEhvdmVyZWRQb3MgPSBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gW1xuICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgIGtleTogbmV3IFBsdWdpbktleShcImF0ZUJsb2NrQ29udHJvbHNcIiksXG4gICAgICAgIC8vIFRoZSBob3ZlcmVkIGJsb2NrIGNhbiBiZSByZW1vdmVkLCByZXBsYWNlZCBvciBtb3ZlZCBieSBhbiBlZGl0IHdoaWxlIHRoZSBwb2ludGVyIHN0YXlzIHN0aWxsOlxuICAgICAgICAvLyByZXNvbHZlIGl0IGFnYWluIHNvIHRoZSBjb250cm9scyBuZXZlciBwb2ludCBhdCBhIGRldGFjaGVkIGVsZW1lbnQgb3IgYSBzdGFsZSBwb3NpdGlvblxuICAgICAgICB2aWV3OiAoKSA9PiAoe1xuICAgICAgICAgIHVwZGF0ZTogKHZpZXcsIHByZXZTdGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGxhc3RIb3ZlcmVkRWxlbWVudCAmJiAhdmlldy5zdGF0ZS5kb2MuZXEocHJldlN0YXRlLmRvYykpIHtcbiAgICAgICAgICAgICAgdXBkYXRlKHZpZXcsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGhhbmRsZURPTUV2ZW50czoge1xuICAgICAgICAgICAgbW91c2Vtb3ZlOiAodmlldzogRWRpdG9yVmlldywgZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgbGFzdE1vdXNlWCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICAgICAgICAgIGxhc3RNb3VzZVkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAgICAgICAgIGlmIChyYWZJZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZSh2aWV3KTtcbiAgICAgICAgICAgICAgICAgIHJhZklkID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91c2VsZWF2ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmFmSWQpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZCk7XG4gICAgICAgICAgICAgICAgcmFmSWQgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgY3JlYXRlQmxvY2tEcmFnUGx1Z2luKCksXG4gICAgXTtcbiAgfSxcbn0pO1xuIl19