@pie-lib/editable-html-tip-tap 2.1.20-beta.6 → 2.1.20-beta.8
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/lib/__tests__/EditableHtml.test.js +831 -0
- package/lib/__tests__/constants.test.js +21 -0
- package/lib/__tests__/div-to-paragraph-conversion.test.js +213 -0
- package/lib/__tests__/extensions.test.js +209 -0
- package/lib/__tests__/index.test.js +250 -0
- package/lib/__tests__/size-utils.test.js +57 -0
- package/lib/__tests__/spellcheck.test.js +142 -0
- package/lib/__tests__/theme.test.js +17 -0
- package/lib/components/__tests__/AltDialog.test.js +201 -0
- package/lib/components/__tests__/CharacterPicker.test.js +455 -0
- package/lib/components/__tests__/CssIcon.test.js +58 -0
- package/lib/components/__tests__/DragInTheBlank.test.js +295 -0
- package/lib/components/__tests__/ExplicitConstructedResponse.test.js +345 -0
- package/lib/components/__tests__/ImageToolbar.test.js +185 -0
- package/lib/components/__tests__/InlineDropdown.test.js +839 -0
- package/lib/components/__tests__/InsertImageHandler.test.js +171 -0
- package/lib/components/__tests__/MediaDialog.test.js +433 -0
- package/lib/components/__tests__/MediaToolbar.test.js +126 -0
- package/lib/components/__tests__/MediaWrapper.test.js +96 -0
- package/lib/components/__tests__/MenuBar.test.js +502 -0
- package/lib/components/__tests__/RespArea.test.js +171 -0
- package/lib/components/__tests__/TableIcons.test.js +153 -0
- package/lib/components/__tests__/TextAlign.test.js +209 -0
- package/lib/components/__tests__/TiptapContainer.test.js +196 -0
- package/lib/components/__tests__/characterUtils.test.js +178 -0
- package/lib/components/__tests__/choice.test.js +213 -0
- package/lib/components/__tests__/custom-popper.test.js +108 -0
- package/lib/components/__tests__/done-button.test.js +72 -0
- package/lib/components/__tests__/toolbar-buttons.test.js +277 -0
- package/lib/components/respArea/DragInTheBlank/__tests__/choice.test.js +90 -0
- package/lib/components/respArea/__tests__/MathTemplated.test.js +217 -0
- package/lib/extensions/__tests__/css.test.js +214 -0
- package/lib/extensions/__tests__/custom-toolbar-wrapper.test.js +175 -0
- package/lib/extensions/__tests__/divNode.test.js +108 -0
- package/lib/extensions/__tests__/ensure-empty-root-div.test.js +50 -0
- package/lib/extensions/__tests__/ensure-list-item-content-is-div.test.js +60 -0
- package/lib/extensions/__tests__/extended-list-item.test.js +13 -0
- package/lib/extensions/__tests__/extended-table-cell.test.js +15 -0
- package/lib/extensions/__tests__/extended-table.test.js +200 -0
- package/lib/extensions/__tests__/image-component.test.js +432 -0
- package/lib/extensions/__tests__/image.test.js +313 -0
- package/lib/extensions/__tests__/math.test.js +1411 -0
- package/lib/extensions/__tests__/media-node-view.test.js +307 -0
- package/lib/extensions/__tests__/media.test.js +292 -0
- package/lib/extensions/__tests__/responseArea.test.js +736 -0
- package/lib/utils/__tests__/helper.test.js +107 -0
- package/lib/utils/__tests__/toolbar.test.js +38 -0
- package/package.json +3 -3
- package/src/__tests__/EditableHtml.test.jsx +588 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +270 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +209 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +557 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/respArea/DragInTheBlank/__tests__/choice.test.jsx +72 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +346 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +900 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +655 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/__tests__/toolbar.test.js +43 -0
|
@@ -0,0 +1,1411 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof3 = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
6
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
7
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
11
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
12
|
+
var _react = _interopRequireDefault(require("react"));
|
|
13
|
+
var _react2 = require("@testing-library/react");
|
|
14
|
+
var _math = require("../math");
|
|
15
|
+
var toolbarUtils = _interopRequireWildcard(require("../../utils/toolbar"));
|
|
16
|
+
var _excluded = ["children"];
|
|
17
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
18
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
19
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
20
|
+
jest.mock('@tiptap/react', function () {
|
|
21
|
+
return {
|
|
22
|
+
NodeViewWrapper: function NodeViewWrapper(_ref) {
|
|
23
|
+
var children = _ref.children,
|
|
24
|
+
props = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
|
|
25
|
+
return /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
|
|
26
|
+
"data-testid": "node-view-wrapper"
|
|
27
|
+
}, props), children);
|
|
28
|
+
},
|
|
29
|
+
ReactNodeViewRenderer: jest.fn(function (component) {
|
|
30
|
+
return component;
|
|
31
|
+
})
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
var mockCreatePortal = jest.fn(function (node) {
|
|
35
|
+
return node;
|
|
36
|
+
});
|
|
37
|
+
jest.mock('react-dom', function () {
|
|
38
|
+
return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
|
|
39
|
+
createPortal: function createPortal() {
|
|
40
|
+
return mockCreatePortal.apply(void 0, arguments);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
jest.mock('@pie-lib/math-toolbar', function () {
|
|
45
|
+
var React = require('react');
|
|
46
|
+
return {
|
|
47
|
+
MathPreview: function MathPreview(_ref2) {
|
|
48
|
+
var latex = _ref2.latex;
|
|
49
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
50
|
+
"data-testid": "math-preview"
|
|
51
|
+
}, latex);
|
|
52
|
+
},
|
|
53
|
+
MathToolbar: function MathToolbar(_ref3) {
|
|
54
|
+
var latex = _ref3.latex,
|
|
55
|
+
_onChange = _ref3.onChange,
|
|
56
|
+
onDone = _ref3.onDone;
|
|
57
|
+
var _React$useState = React.useState(latex),
|
|
58
|
+
_React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
|
|
59
|
+
localLatex = _React$useState2[0],
|
|
60
|
+
setLocalLatex = _React$useState2[1];
|
|
61
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
62
|
+
"data-testid": "math-toolbar"
|
|
63
|
+
}, /*#__PURE__*/React.createElement("input", {
|
|
64
|
+
"data-testid": "math-input",
|
|
65
|
+
value: localLatex,
|
|
66
|
+
onChange: function onChange(e) {
|
|
67
|
+
setLocalLatex(e.target.value);
|
|
68
|
+
_onChange(e.target.value);
|
|
69
|
+
}
|
|
70
|
+
}), /*#__PURE__*/React.createElement("button", {
|
|
71
|
+
"data-testid": "done-button",
|
|
72
|
+
onClick: function onClick() {
|
|
73
|
+
return onDone(localLatex);
|
|
74
|
+
}
|
|
75
|
+
}, "Done"));
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
jest.mock('@pie-lib/math-rendering', function () {
|
|
80
|
+
return {
|
|
81
|
+
wrapMath: function wrapMath(latex, wrapper) {
|
|
82
|
+
return latex;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
jest.mock('@tiptap/core', function () {
|
|
87
|
+
return {
|
|
88
|
+
Node: {
|
|
89
|
+
create: jest.fn(function (config) {
|
|
90
|
+
return config;
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
jest.mock('prosemirror-state', function () {
|
|
96
|
+
return {
|
|
97
|
+
Plugin: jest.fn(function (config) {
|
|
98
|
+
return config;
|
|
99
|
+
}),
|
|
100
|
+
PluginKey: jest.fn(function (key) {
|
|
101
|
+
this.key = key;
|
|
102
|
+
}),
|
|
103
|
+
TextSelection: {
|
|
104
|
+
create: jest.fn(function (doc, pos) {
|
|
105
|
+
return {
|
|
106
|
+
type: 'text',
|
|
107
|
+
pos: pos
|
|
108
|
+
};
|
|
109
|
+
})
|
|
110
|
+
},
|
|
111
|
+
NodeSelection: {
|
|
112
|
+
create: jest.fn(function (doc, pos) {
|
|
113
|
+
return {
|
|
114
|
+
type: 'node',
|
|
115
|
+
pos: pos
|
|
116
|
+
};
|
|
117
|
+
})
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
describe('MathNode', function () {
|
|
122
|
+
describe('configuration', function () {
|
|
123
|
+
it('has correct name', function () {
|
|
124
|
+
expect(_math.MathNode.name).toBe('math');
|
|
125
|
+
});
|
|
126
|
+
it('is inline', function () {
|
|
127
|
+
expect(_math.MathNode.inline).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it('is in inline group', function () {
|
|
130
|
+
expect(_math.MathNode.group).toBe('inline');
|
|
131
|
+
});
|
|
132
|
+
it('is atomic', function () {
|
|
133
|
+
expect(_math.MathNode.atom).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('addAttributes', function () {
|
|
137
|
+
it('returns required attributes', function () {
|
|
138
|
+
var attributes = _math.MathNode.addAttributes();
|
|
139
|
+
expect(attributes).toHaveProperty('latex');
|
|
140
|
+
expect(attributes).toHaveProperty('wrapper');
|
|
141
|
+
expect(attributes).toHaveProperty('html');
|
|
142
|
+
expect(attributes.latex).toEqual({
|
|
143
|
+
"default": ''
|
|
144
|
+
});
|
|
145
|
+
expect(attributes.wrapper).toEqual({
|
|
146
|
+
"default": null
|
|
147
|
+
});
|
|
148
|
+
expect(attributes.html).toEqual({
|
|
149
|
+
"default": null
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('parseHTML', function () {
|
|
154
|
+
it('returns parsing rules for latex', function () {
|
|
155
|
+
var rules = _math.MathNode.parseHTML();
|
|
156
|
+
expect(Array.isArray(rules)).toBe(true);
|
|
157
|
+
expect(rules).toHaveLength(2);
|
|
158
|
+
expect(rules[0]).toHaveProperty('tag', 'span[data-latex]');
|
|
159
|
+
});
|
|
160
|
+
it('returns parsing rules for mathml', function () {
|
|
161
|
+
var rules = _math.MathNode.parseHTML();
|
|
162
|
+
expect(rules[1]).toHaveProperty('tag', 'span[data-type="mathml"]');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('renderHTML', function () {
|
|
166
|
+
it('renders mathml when html attribute is present', function () {
|
|
167
|
+
var result = _math.MathNode.renderHTML({
|
|
168
|
+
HTMLAttributes: {
|
|
169
|
+
html: '<math><mi>x</mi></math>'
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
expect(result[0]).toBe('span');
|
|
173
|
+
expect(result[1]).toHaveProperty('data-type', 'mathml');
|
|
174
|
+
});
|
|
175
|
+
it('renders latex when html attribute is not present', function () {
|
|
176
|
+
var result = _math.MathNode.renderHTML({
|
|
177
|
+
HTMLAttributes: {
|
|
178
|
+
latex: 'x^2'
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
expect(result[0]).toBe('span');
|
|
182
|
+
expect(result[1]).toHaveProperty('data-latex', '');
|
|
183
|
+
expect(result[1]).toHaveProperty('data-raw', 'x^2');
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
describe('addCommands', function () {
|
|
187
|
+
it('returns insertMath command', function () {
|
|
188
|
+
var commands = _math.MathNode.addCommands();
|
|
189
|
+
expect(commands).toHaveProperty('insertMath');
|
|
190
|
+
expect((0, _typeof2["default"])(commands.insertMath)).toBe('function');
|
|
191
|
+
});
|
|
192
|
+
it('insertMath opens the toolbar after inserting a math node', function () {
|
|
193
|
+
var setToolbarOpenedSpy = jest.spyOn(toolbarUtils, 'setToolbarOpened');
|
|
194
|
+
var mathNode = {
|
|
195
|
+
type: {
|
|
196
|
+
name: 'math'
|
|
197
|
+
},
|
|
198
|
+
nodeSize: 1
|
|
199
|
+
};
|
|
200
|
+
var tr = {
|
|
201
|
+
insert: jest.fn().mockReturnThis(),
|
|
202
|
+
setSelection: jest.fn().mockReturnThis(),
|
|
203
|
+
doc: {}
|
|
204
|
+
};
|
|
205
|
+
var editor = {
|
|
206
|
+
view: {
|
|
207
|
+
state: {
|
|
208
|
+
schema: {
|
|
209
|
+
nodes: {
|
|
210
|
+
math: {
|
|
211
|
+
create: jest.fn(function () {
|
|
212
|
+
return mathNode;
|
|
213
|
+
})
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
selection: {
|
|
218
|
+
$from: {
|
|
219
|
+
pos: 1
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
var dispatch = jest.fn();
|
|
226
|
+
var insertMath = _math.MathNode.addCommands().insertMath('x^2');
|
|
227
|
+
insertMath({
|
|
228
|
+
tr: tr,
|
|
229
|
+
editor: editor,
|
|
230
|
+
dispatch: dispatch
|
|
231
|
+
});
|
|
232
|
+
expect(tr.insert).toHaveBeenCalledWith(1, mathNode);
|
|
233
|
+
expect(tr.setSelection).toHaveBeenCalled();
|
|
234
|
+
expect(dispatch).toHaveBeenCalledWith(tr);
|
|
235
|
+
expect(setToolbarOpenedSpy).toHaveBeenCalledWith(editor, true);
|
|
236
|
+
setToolbarOpenedSpy.mockRestore();
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
describe('addNodeView', function () {
|
|
240
|
+
it('returns ReactNodeViewRenderer result', function () {
|
|
241
|
+
var result = _math.MathNode.addNodeView();
|
|
242
|
+
expect(result).toBeDefined();
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
describe('addProseMirrorPlugins', function () {
|
|
246
|
+
it('registers ensure-text-after-math and zero-width-space plugins', function () {
|
|
247
|
+
var plugins = _math.MathNode.addProseMirrorPlugins();
|
|
248
|
+
expect(plugins).toHaveLength(2);
|
|
249
|
+
expect(plugins[0].appendTransaction).toBeDefined();
|
|
250
|
+
expect(plugins[1].props.handleKeyDown).toBeDefined();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('EnsureTextAfterMathPlugin', function () {
|
|
255
|
+
it('inserts a zero-width space after a math node when no text follows', function () {
|
|
256
|
+
var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
|
|
257
|
+
var textNode = {
|
|
258
|
+
type: {
|
|
259
|
+
name: 'text'
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
var mathNode = {
|
|
263
|
+
type: {
|
|
264
|
+
name: 'math'
|
|
265
|
+
},
|
|
266
|
+
nodeSize: 3
|
|
267
|
+
};
|
|
268
|
+
var tr = {
|
|
269
|
+
insert: jest.fn()
|
|
270
|
+
};
|
|
271
|
+
var newState = {
|
|
272
|
+
schema: {
|
|
273
|
+
text: jest.fn(function (value) {
|
|
274
|
+
return {
|
|
275
|
+
type: textNode.type,
|
|
276
|
+
text: value
|
|
277
|
+
};
|
|
278
|
+
})
|
|
279
|
+
},
|
|
280
|
+
tr: tr,
|
|
281
|
+
doc: {
|
|
282
|
+
descendants: function descendants(cb) {
|
|
283
|
+
return cb(mathNode, 5);
|
|
284
|
+
},
|
|
285
|
+
nodeAt: jest.fn(function () {
|
|
286
|
+
return null;
|
|
287
|
+
})
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
var result = plugin.appendTransaction([{
|
|
291
|
+
docChanged: true
|
|
292
|
+
}], {}, newState);
|
|
293
|
+
expect(tr.insert).toHaveBeenCalledWith(8, expect.anything());
|
|
294
|
+
expect(result).toBe(tr);
|
|
295
|
+
});
|
|
296
|
+
it('does not insert when text already follows the math node', function () {
|
|
297
|
+
var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
|
|
298
|
+
var tr = {
|
|
299
|
+
insert: jest.fn()
|
|
300
|
+
};
|
|
301
|
+
var mathNode = {
|
|
302
|
+
type: {
|
|
303
|
+
name: 'math'
|
|
304
|
+
},
|
|
305
|
+
nodeSize: 3
|
|
306
|
+
};
|
|
307
|
+
var newState = {
|
|
308
|
+
schema: {
|
|
309
|
+
text: jest.fn()
|
|
310
|
+
},
|
|
311
|
+
tr: tr,
|
|
312
|
+
doc: {
|
|
313
|
+
descendants: function descendants(cb) {
|
|
314
|
+
return cb(mathNode, 5);
|
|
315
|
+
},
|
|
316
|
+
nodeAt: jest.fn(function () {
|
|
317
|
+
return {
|
|
318
|
+
type: {
|
|
319
|
+
name: 'text'
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
})
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
var result = plugin.appendTransaction([{
|
|
326
|
+
docChanged: true
|
|
327
|
+
}], {}, newState);
|
|
328
|
+
expect(tr.insert).not.toHaveBeenCalled();
|
|
329
|
+
expect(result).toBeNull();
|
|
330
|
+
});
|
|
331
|
+
it('returns null when the document did not change', function () {
|
|
332
|
+
var plugin = (0, _math.EnsureTextAfterMathPlugin)('math');
|
|
333
|
+
var result = plugin.appendTransaction([{
|
|
334
|
+
docChanged: false
|
|
335
|
+
}], {}, {});
|
|
336
|
+
expect(result).toBeNull();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
describe('ZeroWidthSpaceHandlingPlugin', function () {
|
|
340
|
+
var createDocWithMathAndZwsp = function createDocWithMathAndZwsp() {
|
|
341
|
+
var resolveOverrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
342
|
+
return {
|
|
343
|
+
resolve: jest.fn(function (pos) {
|
|
344
|
+
return _objectSpread({
|
|
345
|
+
nodeAfter: null,
|
|
346
|
+
nodeBefore: null,
|
|
347
|
+
pos: pos
|
|
348
|
+
}, resolveOverrides[pos]);
|
|
349
|
+
}),
|
|
350
|
+
nodeAt: jest.fn(function (pos) {
|
|
351
|
+
if (pos === 1) {
|
|
352
|
+
return {
|
|
353
|
+
type: {
|
|
354
|
+
name: 'text'
|
|
355
|
+
},
|
|
356
|
+
textContent: "\u200B"
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
if (pos === 0) {
|
|
360
|
+
return {
|
|
361
|
+
type: {
|
|
362
|
+
name: 'math'
|
|
363
|
+
},
|
|
364
|
+
nodeSize: 1
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
return null;
|
|
368
|
+
})
|
|
369
|
+
};
|
|
370
|
+
};
|
|
371
|
+
var createDocWithRegularTextBeforeCursor = function createDocWithRegularTextBeforeCursor() {
|
|
372
|
+
return {
|
|
373
|
+
resolve: jest.fn(function (pos) {
|
|
374
|
+
return {
|
|
375
|
+
nodeAfter: null,
|
|
376
|
+
nodeBefore: null,
|
|
377
|
+
pos: pos
|
|
378
|
+
};
|
|
379
|
+
}),
|
|
380
|
+
nodeAt: jest.fn(function (pos) {
|
|
381
|
+
if (pos === 1) {
|
|
382
|
+
return {
|
|
383
|
+
type: {
|
|
384
|
+
name: 'text'
|
|
385
|
+
},
|
|
386
|
+
textContent: 'a'
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return null;
|
|
390
|
+
})
|
|
391
|
+
};
|
|
392
|
+
};
|
|
393
|
+
var createView = function createView() {
|
|
394
|
+
var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
395
|
+
_ref4$state = _ref4.state,
|
|
396
|
+
stateOverrides = _ref4$state === void 0 ? {} : _ref4$state;
|
|
397
|
+
var dispatch = jest.fn();
|
|
398
|
+
var tr = {
|
|
399
|
+
"delete": jest.fn().mockReturnThis(),
|
|
400
|
+
setSelection: jest.fn().mockReturnThis()
|
|
401
|
+
};
|
|
402
|
+
return {
|
|
403
|
+
state: _objectSpread({
|
|
404
|
+
selection: {
|
|
405
|
+
from: 2,
|
|
406
|
+
empty: true
|
|
407
|
+
},
|
|
408
|
+
doc: createDocWithMathAndZwsp(),
|
|
409
|
+
tr: tr
|
|
410
|
+
}, stateOverrides),
|
|
411
|
+
dispatch: dispatch
|
|
412
|
+
};
|
|
413
|
+
};
|
|
414
|
+
describe('Backspace', function () {
|
|
415
|
+
it('deletes the inline node and zero-width space before the cursor', function () {
|
|
416
|
+
var view = createView();
|
|
417
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
418
|
+
key: 'Backspace'
|
|
419
|
+
});
|
|
420
|
+
expect(handled).toBe(true);
|
|
421
|
+
expect(view.state.tr["delete"]).toHaveBeenCalledWith(0, 2);
|
|
422
|
+
expect(view.dispatch).toHaveBeenCalledWith(view.state.tr);
|
|
423
|
+
});
|
|
424
|
+
it('returns false when regular text precedes the cursor', function () {
|
|
425
|
+
var view = createView({
|
|
426
|
+
state: {
|
|
427
|
+
doc: createDocWithRegularTextBeforeCursor()
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
431
|
+
key: 'Backspace'
|
|
432
|
+
});
|
|
433
|
+
expect(handled).toBe(false);
|
|
434
|
+
expect(view.state.tr["delete"]).not.toHaveBeenCalled();
|
|
435
|
+
expect(view.dispatch).not.toHaveBeenCalled();
|
|
436
|
+
});
|
|
437
|
+
});
|
|
438
|
+
describe('ArrowLeft', function () {
|
|
439
|
+
it('selects the inline node before a zero-width space', function () {
|
|
440
|
+
var mathNode = {
|
|
441
|
+
nodeSize: 3
|
|
442
|
+
};
|
|
443
|
+
var view = createView({
|
|
444
|
+
state: {
|
|
445
|
+
doc: createDocWithMathAndZwsp({
|
|
446
|
+
0: {
|
|
447
|
+
nodeAfter: mathNode,
|
|
448
|
+
nodeBefore: null,
|
|
449
|
+
pos: 0
|
|
450
|
+
}
|
|
451
|
+
})
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
var _require = require('prosemirror-state'),
|
|
455
|
+
NodeSelection = _require.NodeSelection;
|
|
456
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
457
|
+
key: 'ArrowLeft'
|
|
458
|
+
});
|
|
459
|
+
expect(handled).toBe(true);
|
|
460
|
+
expect(view.state.doc.resolve).toHaveBeenCalledWith(0);
|
|
461
|
+
expect(NodeSelection.create).toHaveBeenCalledWith(view.state.doc, 0);
|
|
462
|
+
expect(view.dispatch).toHaveBeenCalled();
|
|
463
|
+
});
|
|
464
|
+
it('moves the text cursor before the zero-width space when no inline node precedes it', function () {
|
|
465
|
+
var view = createView();
|
|
466
|
+
var _require2 = require('prosemirror-state'),
|
|
467
|
+
TextSelection = _require2.TextSelection;
|
|
468
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
469
|
+
key: 'ArrowLeft'
|
|
470
|
+
});
|
|
471
|
+
expect(handled).toBe(true);
|
|
472
|
+
expect(view.state.doc.resolve).toHaveBeenCalledWith(0);
|
|
473
|
+
expect(TextSelection.create).toHaveBeenCalledWith(view.state.doc, 0);
|
|
474
|
+
expect(view.dispatch).toHaveBeenCalled();
|
|
475
|
+
});
|
|
476
|
+
it('returns false when regular text precedes the cursor', function () {
|
|
477
|
+
var view = createView({
|
|
478
|
+
state: {
|
|
479
|
+
doc: createDocWithRegularTextBeforeCursor()
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
483
|
+
key: 'ArrowLeft'
|
|
484
|
+
});
|
|
485
|
+
expect(handled).toBe(false);
|
|
486
|
+
expect(view.state.tr.setSelection).not.toHaveBeenCalled();
|
|
487
|
+
expect(view.dispatch).not.toHaveBeenCalled();
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
it('returns false for unrelated keys', function () {
|
|
491
|
+
var view = createView();
|
|
492
|
+
var handled = _math.ZeroWidthSpaceHandlingPlugin.props.handleKeyDown(view, {
|
|
493
|
+
key: 'Enter'
|
|
494
|
+
});
|
|
495
|
+
expect(handled).toBe(false);
|
|
496
|
+
});
|
|
497
|
+
});
|
|
498
|
+
describe('MathNodeView', function () {
|
|
499
|
+
var createEditorElement = function createEditorElement() {
|
|
500
|
+
var rect = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
|
|
501
|
+
top: 0,
|
|
502
|
+
left: 0,
|
|
503
|
+
width: 600,
|
|
504
|
+
height: 400
|
|
505
|
+
};
|
|
506
|
+
var element = document.createElement('div');
|
|
507
|
+
Object.defineProperty(element, 'getBoundingClientRect', {
|
|
508
|
+
value: jest.fn(function () {
|
|
509
|
+
return rect;
|
|
510
|
+
}),
|
|
511
|
+
configurable: true
|
|
512
|
+
});
|
|
513
|
+
return element;
|
|
514
|
+
};
|
|
515
|
+
var createMockEditor = function createMockEditor() {
|
|
516
|
+
return {
|
|
517
|
+
state: {
|
|
518
|
+
selection: {
|
|
519
|
+
from: 0,
|
|
520
|
+
to: 1,
|
|
521
|
+
node: {
|
|
522
|
+
type: {
|
|
523
|
+
name: 'math'
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
},
|
|
527
|
+
tr: {
|
|
528
|
+
setSelection: jest.fn().mockReturnThis(),
|
|
529
|
+
setMeta: jest.fn().mockReturnThis()
|
|
530
|
+
},
|
|
531
|
+
doc: {}
|
|
532
|
+
},
|
|
533
|
+
view: {
|
|
534
|
+
coordsAtPos: jest.fn(function () {
|
|
535
|
+
return {
|
|
536
|
+
top: 100,
|
|
537
|
+
left: 50
|
|
538
|
+
};
|
|
539
|
+
}),
|
|
540
|
+
dispatch: jest.fn()
|
|
541
|
+
},
|
|
542
|
+
options: {
|
|
543
|
+
element: createEditorElement()
|
|
544
|
+
},
|
|
545
|
+
commands: {
|
|
546
|
+
focus: jest.fn()
|
|
547
|
+
},
|
|
548
|
+
instanceId: 'editor-123',
|
|
549
|
+
_toolbarOpened: false
|
|
550
|
+
};
|
|
551
|
+
};
|
|
552
|
+
var mockNode = {
|
|
553
|
+
attrs: {
|
|
554
|
+
latex: 'x^2'
|
|
555
|
+
},
|
|
556
|
+
nodeSize: 1
|
|
557
|
+
};
|
|
558
|
+
var defaultProps;
|
|
559
|
+
beforeEach(function () {
|
|
560
|
+
jest.clearAllMocks();
|
|
561
|
+
mockCreatePortal.mockImplementation(function (node) {
|
|
562
|
+
return node;
|
|
563
|
+
});
|
|
564
|
+
defaultProps = {
|
|
565
|
+
node: mockNode,
|
|
566
|
+
updateAttributes: jest.fn(),
|
|
567
|
+
editor: createMockEditor(),
|
|
568
|
+
selected: false,
|
|
569
|
+
options: {},
|
|
570
|
+
getPos: jest.fn(function () {
|
|
571
|
+
return 0;
|
|
572
|
+
})
|
|
573
|
+
};
|
|
574
|
+
});
|
|
575
|
+
it('renders without crashing', function () {
|
|
576
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
|
|
577
|
+
container = _render.container;
|
|
578
|
+
expect(container).toBeInTheDocument();
|
|
579
|
+
});
|
|
580
|
+
it('renders NodeViewWrapper', function () {
|
|
581
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
|
|
582
|
+
getByTestId = _render2.getByTestId;
|
|
583
|
+
expect(getByTestId('node-view-wrapper')).toBeInTheDocument();
|
|
584
|
+
});
|
|
585
|
+
it('displays math preview', function () {
|
|
586
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
|
|
587
|
+
getByTestId = _render3.getByTestId;
|
|
588
|
+
expect(getByTestId('math-preview')).toBeInTheDocument();
|
|
589
|
+
});
|
|
590
|
+
it('shows toolbar when selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
591
|
+
var _render4, getByTestId;
|
|
592
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
593
|
+
while (1) switch (_context.prev = _context.next) {
|
|
594
|
+
case 0:
|
|
595
|
+
_render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
596
|
+
selected: true
|
|
597
|
+
}))), getByTestId = _render4.getByTestId;
|
|
598
|
+
_context.next = 1;
|
|
599
|
+
return (0, _react2.waitFor)(function () {
|
|
600
|
+
expect(getByTestId('math-toolbar')).toBeInTheDocument();
|
|
601
|
+
});
|
|
602
|
+
case 1:
|
|
603
|
+
case "end":
|
|
604
|
+
return _context.stop();
|
|
605
|
+
}
|
|
606
|
+
}, _callee);
|
|
607
|
+
})));
|
|
608
|
+
it('does not show toolbar when not selected', function () {
|
|
609
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
610
|
+
selected: false
|
|
611
|
+
}))),
|
|
612
|
+
queryByTestId = _render5.queryByTestId;
|
|
613
|
+
expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
|
|
614
|
+
});
|
|
615
|
+
it('adds data-toolbar-for attribute with editor instanceId', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
616
|
+
var _render6, container;
|
|
617
|
+
return _regenerator["default"].wrap(function (_context2) {
|
|
618
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
619
|
+
case 0:
|
|
620
|
+
_render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
621
|
+
selected: true
|
|
622
|
+
}))), container = _render6.container;
|
|
623
|
+
_context2.next = 1;
|
|
624
|
+
return (0, _react2.waitFor)(function () {
|
|
625
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
626
|
+
expect(toolbar).toHaveAttribute('data-toolbar-for', 'editor-123');
|
|
627
|
+
});
|
|
628
|
+
case 1:
|
|
629
|
+
case "end":
|
|
630
|
+
return _context2.stop();
|
|
631
|
+
}
|
|
632
|
+
}, _callee2);
|
|
633
|
+
})));
|
|
634
|
+
describe('toolbar positioning', function () {
|
|
635
|
+
it('positions relative to portal container using coordsAtPos', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
636
|
+
var _render7, container;
|
|
637
|
+
return _regenerator["default"].wrap(function (_context3) {
|
|
638
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
639
|
+
case 0:
|
|
640
|
+
_render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
641
|
+
selected: true
|
|
642
|
+
}))), container = _render7.container;
|
|
643
|
+
_context3.next = 1;
|
|
644
|
+
return (0, _react2.waitFor)(function () {
|
|
645
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
646
|
+
expect(toolbar).toBeInTheDocument();
|
|
647
|
+
expect(toolbar.style.top).toBe('100px');
|
|
648
|
+
expect(toolbar.style.left).toBe('50px');
|
|
649
|
+
});
|
|
650
|
+
case 1:
|
|
651
|
+
case "end":
|
|
652
|
+
return _context3.stop();
|
|
653
|
+
}
|
|
654
|
+
}, _callee3);
|
|
655
|
+
})));
|
|
656
|
+
it('offsets position by portal container getBoundingClientRect', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
657
|
+
var containerEl, editor, _render8, container;
|
|
658
|
+
return _regenerator["default"].wrap(function (_context4) {
|
|
659
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
660
|
+
case 0:
|
|
661
|
+
containerEl = document.createElement('div');
|
|
662
|
+
containerEl.getBoundingClientRect = jest.fn(function () {
|
|
663
|
+
return {
|
|
664
|
+
top: 100,
|
|
665
|
+
left: 50,
|
|
666
|
+
width: 600,
|
|
667
|
+
height: 400
|
|
668
|
+
};
|
|
669
|
+
});
|
|
670
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
671
|
+
_tiptapContainerEl: containerEl
|
|
672
|
+
});
|
|
673
|
+
_render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
674
|
+
editor: editor,
|
|
675
|
+
selected: true
|
|
676
|
+
}))), container = _render8.container;
|
|
677
|
+
_context4.next = 1;
|
|
678
|
+
return (0, _react2.waitFor)(function () {
|
|
679
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
680
|
+
expect(toolbar).toBeInTheDocument();
|
|
681
|
+
expect(toolbar.style.top).toBe('0px');
|
|
682
|
+
expect(toolbar.style.left).toBe('0px');
|
|
683
|
+
});
|
|
684
|
+
case 1:
|
|
685
|
+
case "end":
|
|
686
|
+
return _context4.stop();
|
|
687
|
+
}
|
|
688
|
+
}, _callee4);
|
|
689
|
+
})));
|
|
690
|
+
it('applies absolute positioning style to toolbar', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5() {
|
|
691
|
+
var _render9, container;
|
|
692
|
+
return _regenerator["default"].wrap(function (_context5) {
|
|
693
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
694
|
+
case 0:
|
|
695
|
+
_render9 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
696
|
+
selected: true
|
|
697
|
+
}))), container = _render9.container;
|
|
698
|
+
_context5.next = 1;
|
|
699
|
+
return (0, _react2.waitFor)(function () {
|
|
700
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
701
|
+
expect(toolbar).toBeInTheDocument();
|
|
702
|
+
expect(toolbar.style.position).toBe('absolute');
|
|
703
|
+
});
|
|
704
|
+
case 1:
|
|
705
|
+
case "end":
|
|
706
|
+
return _context5.stop();
|
|
707
|
+
}
|
|
708
|
+
}, _callee5);
|
|
709
|
+
})));
|
|
710
|
+
it('renders above other editor overlays with a high z-index', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
711
|
+
var _render0, container;
|
|
712
|
+
return _regenerator["default"].wrap(function (_context6) {
|
|
713
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
714
|
+
case 0:
|
|
715
|
+
_render0 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
716
|
+
selected: true
|
|
717
|
+
}))), container = _render0.container;
|
|
718
|
+
_context6.next = 1;
|
|
719
|
+
return (0, _react2.waitFor)(function () {
|
|
720
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
721
|
+
expect(toolbar).toBeInTheDocument();
|
|
722
|
+
expect(toolbar.style.zIndex).toBe('1000');
|
|
723
|
+
});
|
|
724
|
+
case 1:
|
|
725
|
+
case "end":
|
|
726
|
+
return _context6.stop();
|
|
727
|
+
}
|
|
728
|
+
}, _callee6);
|
|
729
|
+
})));
|
|
730
|
+
it('updates position from coordsAtPos when selection changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
731
|
+
var editor, _render1, container;
|
|
732
|
+
return _regenerator["default"].wrap(function (_context7) {
|
|
733
|
+
while (1) switch (_context7.prev = _context7.next) {
|
|
734
|
+
case 0:
|
|
735
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
736
|
+
view: _objectSpread(_objectSpread({}, defaultProps.editor.view), {}, {
|
|
737
|
+
coordsAtPos: jest.fn(function () {
|
|
738
|
+
return {
|
|
739
|
+
top: 200,
|
|
740
|
+
left: 150
|
|
741
|
+
};
|
|
742
|
+
}),
|
|
743
|
+
dispatch: jest.fn()
|
|
744
|
+
})
|
|
745
|
+
});
|
|
746
|
+
_render1 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
747
|
+
editor: editor,
|
|
748
|
+
selected: true
|
|
749
|
+
}))), container = _render1.container;
|
|
750
|
+
_context7.next = 1;
|
|
751
|
+
return (0, _react2.waitFor)(function () {
|
|
752
|
+
var toolbar = container.querySelector('[data-toolbar-for]');
|
|
753
|
+
expect(toolbar).toBeInTheDocument();
|
|
754
|
+
expect(toolbar.style.top).toBe('200px');
|
|
755
|
+
expect(toolbar.style.left).toBe('150px');
|
|
756
|
+
});
|
|
757
|
+
case 1:
|
|
758
|
+
case "end":
|
|
759
|
+
return _context7.stop();
|
|
760
|
+
}
|
|
761
|
+
}, _callee7);
|
|
762
|
+
})));
|
|
763
|
+
it('clamps toolbar position to viewport margins', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
764
|
+
var originalInnerHeight, originalInnerWidth, editor, _render10, container, toolbar;
|
|
765
|
+
return _regenerator["default"].wrap(function (_context9) {
|
|
766
|
+
while (1) switch (_context9.prev = _context9.next) {
|
|
767
|
+
case 0:
|
|
768
|
+
originalInnerHeight = window.innerHeight;
|
|
769
|
+
originalInnerWidth = window.innerWidth;
|
|
770
|
+
Object.defineProperty(window, 'innerHeight', {
|
|
771
|
+
configurable: true,
|
|
772
|
+
writable: true,
|
|
773
|
+
value: 200
|
|
774
|
+
});
|
|
775
|
+
Object.defineProperty(window, 'innerWidth', {
|
|
776
|
+
configurable: true,
|
|
777
|
+
writable: true,
|
|
778
|
+
value: 300
|
|
779
|
+
});
|
|
780
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
781
|
+
view: _objectSpread(_objectSpread({}, defaultProps.editor.view), {}, {
|
|
782
|
+
coordsAtPos: jest.fn(function () {
|
|
783
|
+
return {
|
|
784
|
+
top: 190,
|
|
785
|
+
left: 280,
|
|
786
|
+
bottom: 195
|
|
787
|
+
};
|
|
788
|
+
}),
|
|
789
|
+
dispatch: jest.fn()
|
|
790
|
+
})
|
|
791
|
+
});
|
|
792
|
+
_render10 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
793
|
+
editor: editor,
|
|
794
|
+
selected: true
|
|
795
|
+
}))), container = _render10.container;
|
|
796
|
+
_context9.next = 1;
|
|
797
|
+
return (0, _react2.waitFor)(function () {
|
|
798
|
+
toolbar = container.querySelector('[data-toolbar-for]');
|
|
799
|
+
expect(toolbar).toBeInTheDocument();
|
|
800
|
+
});
|
|
801
|
+
case 1:
|
|
802
|
+
Object.defineProperty(toolbar, 'offsetHeight', {
|
|
803
|
+
configurable: true,
|
|
804
|
+
value: 100
|
|
805
|
+
});
|
|
806
|
+
Object.defineProperty(toolbar, 'offsetWidth', {
|
|
807
|
+
configurable: true,
|
|
808
|
+
value: 150
|
|
809
|
+
});
|
|
810
|
+
_context9.next = 2;
|
|
811
|
+
return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
|
|
812
|
+
return _regenerator["default"].wrap(function (_context8) {
|
|
813
|
+
while (1) switch (_context8.prev = _context8.next) {
|
|
814
|
+
case 0:
|
|
815
|
+
window.dispatchEvent(new Event('resize'));
|
|
816
|
+
_context8.next = 1;
|
|
817
|
+
return new Promise(function (resolve) {
|
|
818
|
+
return requestAnimationFrame(resolve);
|
|
819
|
+
});
|
|
820
|
+
case 1:
|
|
821
|
+
case "end":
|
|
822
|
+
return _context8.stop();
|
|
823
|
+
}
|
|
824
|
+
}, _callee8);
|
|
825
|
+
})));
|
|
826
|
+
case 2:
|
|
827
|
+
_context9.next = 3;
|
|
828
|
+
return (0, _react2.waitFor)(function () {
|
|
829
|
+
expect(parseInt(toolbar.style.top, 10)).toBeLessThanOrEqual(200 - 100 - 8);
|
|
830
|
+
expect(parseInt(toolbar.style.left, 10)).toBeLessThanOrEqual(300 - 150 - 8);
|
|
831
|
+
expect(parseInt(toolbar.style.top, 10)).toBeGreaterThanOrEqual(8);
|
|
832
|
+
expect(parseInt(toolbar.style.left, 10)).toBeGreaterThanOrEqual(8);
|
|
833
|
+
});
|
|
834
|
+
case 3:
|
|
835
|
+
Object.defineProperty(window, 'innerHeight', {
|
|
836
|
+
configurable: true,
|
|
837
|
+
writable: true,
|
|
838
|
+
value: originalInnerHeight
|
|
839
|
+
});
|
|
840
|
+
Object.defineProperty(window, 'innerWidth', {
|
|
841
|
+
configurable: true,
|
|
842
|
+
writable: true,
|
|
843
|
+
value: originalInnerWidth
|
|
844
|
+
});
|
|
845
|
+
case 4:
|
|
846
|
+
case "end":
|
|
847
|
+
return _context9.stop();
|
|
848
|
+
}
|
|
849
|
+
}, _callee9);
|
|
850
|
+
})));
|
|
851
|
+
it('attaches scroll and resize listeners while toolbar is open', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
|
|
852
|
+
var addSpy;
|
|
853
|
+
return _regenerator["default"].wrap(function (_context0) {
|
|
854
|
+
while (1) switch (_context0.prev = _context0.next) {
|
|
855
|
+
case 0:
|
|
856
|
+
addSpy = jest.spyOn(window, 'addEventListener');
|
|
857
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
858
|
+
selected: true
|
|
859
|
+
})));
|
|
860
|
+
_context0.next = 1;
|
|
861
|
+
return (0, _react2.waitFor)(function () {
|
|
862
|
+
expect(addSpy).toHaveBeenCalledWith('scroll', expect.any(Function), true);
|
|
863
|
+
expect(addSpy).toHaveBeenCalledWith('resize', expect.any(Function));
|
|
864
|
+
});
|
|
865
|
+
case 1:
|
|
866
|
+
addSpy.mockRestore();
|
|
867
|
+
case 2:
|
|
868
|
+
case "end":
|
|
869
|
+
return _context0.stop();
|
|
870
|
+
}
|
|
871
|
+
}, _callee0);
|
|
872
|
+
})));
|
|
873
|
+
it('portals toolbar into _tiptapContainerEl when available', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
|
|
874
|
+
var containerEl, editor;
|
|
875
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
876
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
877
|
+
case 0:
|
|
878
|
+
containerEl = document.createElement('div');
|
|
879
|
+
containerEl.getBoundingClientRect = jest.fn(function () {
|
|
880
|
+
return {
|
|
881
|
+
top: 0,
|
|
882
|
+
left: 0,
|
|
883
|
+
width: 600,
|
|
884
|
+
height: 400
|
|
885
|
+
};
|
|
886
|
+
});
|
|
887
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
888
|
+
_tiptapContainerEl: containerEl
|
|
889
|
+
});
|
|
890
|
+
mockCreatePortal.mockClear();
|
|
891
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
892
|
+
editor: editor,
|
|
893
|
+
selected: true
|
|
894
|
+
})));
|
|
895
|
+
_context1.next = 1;
|
|
896
|
+
return (0, _react2.waitFor)(function () {
|
|
897
|
+
expect(mockCreatePortal).toHaveBeenCalled();
|
|
898
|
+
var lastCall = mockCreatePortal.mock.calls[mockCreatePortal.mock.calls.length - 1];
|
|
899
|
+
expect(lastCall[1]).toBe(containerEl);
|
|
900
|
+
});
|
|
901
|
+
case 1:
|
|
902
|
+
case "end":
|
|
903
|
+
return _context1.stop();
|
|
904
|
+
}
|
|
905
|
+
}, _callee1);
|
|
906
|
+
})));
|
|
907
|
+
it('portals toolbar into document.body when _tiptapContainerEl is not set', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
908
|
+
var editor;
|
|
909
|
+
return _regenerator["default"].wrap(function (_context10) {
|
|
910
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
911
|
+
case 0:
|
|
912
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
913
|
+
_tiptapContainerEl: undefined
|
|
914
|
+
});
|
|
915
|
+
mockCreatePortal.mockClear();
|
|
916
|
+
(0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
917
|
+
editor: editor,
|
|
918
|
+
selected: true
|
|
919
|
+
})));
|
|
920
|
+
_context10.next = 1;
|
|
921
|
+
return (0, _react2.waitFor)(function () {
|
|
922
|
+
expect(mockCreatePortal).toHaveBeenCalled();
|
|
923
|
+
var lastCall = mockCreatePortal.mock.calls[mockCreatePortal.mock.calls.length - 1];
|
|
924
|
+
expect(lastCall[1]).toBe(document.body);
|
|
925
|
+
});
|
|
926
|
+
case 1:
|
|
927
|
+
case "end":
|
|
928
|
+
return _context10.stop();
|
|
929
|
+
}
|
|
930
|
+
}, _callee10);
|
|
931
|
+
})));
|
|
932
|
+
});
|
|
933
|
+
it('calls updateAttributes when latex changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11() {
|
|
934
|
+
var _render11, getByTestId;
|
|
935
|
+
return _regenerator["default"].wrap(function (_context11) {
|
|
936
|
+
while (1) switch (_context11.prev = _context11.next) {
|
|
937
|
+
case 0:
|
|
938
|
+
_render11 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
939
|
+
selected: true
|
|
940
|
+
}))), getByTestId = _render11.getByTestId;
|
|
941
|
+
_context11.next = 1;
|
|
942
|
+
return (0, _react2.waitFor)(function () {
|
|
943
|
+
var input = getByTestId('math-input');
|
|
944
|
+
_react2.fireEvent.change(input, {
|
|
945
|
+
target: {
|
|
946
|
+
value: 'y^2'
|
|
947
|
+
}
|
|
948
|
+
});
|
|
949
|
+
});
|
|
950
|
+
case 1:
|
|
951
|
+
expect(defaultProps.updateAttributes).toHaveBeenCalledWith({
|
|
952
|
+
latex: 'y^2'
|
|
953
|
+
});
|
|
954
|
+
case 2:
|
|
955
|
+
case "end":
|
|
956
|
+
return _context11.stop();
|
|
957
|
+
}
|
|
958
|
+
}, _callee11);
|
|
959
|
+
})));
|
|
960
|
+
it('closes toolbar and updates attributes when done', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12() {
|
|
961
|
+
var updateAttributes, _render12, getByTestId, doneButton;
|
|
962
|
+
return _regenerator["default"].wrap(function (_context12) {
|
|
963
|
+
while (1) switch (_context12.prev = _context12.next) {
|
|
964
|
+
case 0:
|
|
965
|
+
updateAttributes = jest.fn();
|
|
966
|
+
_render12 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
967
|
+
updateAttributes: updateAttributes,
|
|
968
|
+
selected: true
|
|
969
|
+
}))), getByTestId = _render12.getByTestId;
|
|
970
|
+
_context12.next = 1;
|
|
971
|
+
return (0, _react2.waitFor)(function () {
|
|
972
|
+
expect(getByTestId('done-button')).toBeInTheDocument();
|
|
973
|
+
});
|
|
974
|
+
case 1:
|
|
975
|
+
doneButton = getByTestId('done-button');
|
|
976
|
+
_react2.fireEvent.click(doneButton);
|
|
977
|
+
_context12.next = 2;
|
|
978
|
+
return (0, _react2.waitFor)(function () {
|
|
979
|
+
expect(updateAttributes).toHaveBeenCalledWith({
|
|
980
|
+
latex: 'x^2'
|
|
981
|
+
});
|
|
982
|
+
});
|
|
983
|
+
case 2:
|
|
984
|
+
case "end":
|
|
985
|
+
return _context12.stop();
|
|
986
|
+
}
|
|
987
|
+
}, _callee12);
|
|
988
|
+
})));
|
|
989
|
+
it('sets editor._toolbarOpened when toolbar is shown', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee13() {
|
|
990
|
+
var _render13, getByTestId;
|
|
991
|
+
return _regenerator["default"].wrap(function (_context13) {
|
|
992
|
+
while (1) switch (_context13.prev = _context13.next) {
|
|
993
|
+
case 0:
|
|
994
|
+
_render13 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
995
|
+
selected: true
|
|
996
|
+
}))), getByTestId = _render13.getByTestId;
|
|
997
|
+
_context13.next = 1;
|
|
998
|
+
return (0, _react2.waitFor)(function () {
|
|
999
|
+
expect(getByTestId('math-toolbar')).toBeInTheDocument();
|
|
1000
|
+
expect(defaultProps.editor._toolbarOpened).toBe(true);
|
|
1001
|
+
});
|
|
1002
|
+
case 1:
|
|
1003
|
+
case "end":
|
|
1004
|
+
return _context13.stop();
|
|
1005
|
+
}
|
|
1006
|
+
}, _callee13);
|
|
1007
|
+
})));
|
|
1008
|
+
it('unsets editor._toolbarOpened when toolbar is closed and node is not selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee14() {
|
|
1009
|
+
var _render14, getByTestId;
|
|
1010
|
+
return _regenerator["default"].wrap(function (_context14) {
|
|
1011
|
+
while (1) switch (_context14.prev = _context14.next) {
|
|
1012
|
+
case 0:
|
|
1013
|
+
_render14 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1014
|
+
selected: false
|
|
1015
|
+
}))), getByTestId = _render14.getByTestId;
|
|
1016
|
+
_react2.fireEvent.click(getByTestId('math-preview'));
|
|
1017
|
+
_context14.next = 1;
|
|
1018
|
+
return (0, _react2.waitFor)(function () {
|
|
1019
|
+
expect(getByTestId('math-toolbar')).toBeInTheDocument();
|
|
1020
|
+
expect(defaultProps.editor._toolbarOpened).toBe(true);
|
|
1021
|
+
});
|
|
1022
|
+
case 1:
|
|
1023
|
+
_react2.fireEvent.click(getByTestId('done-button'));
|
|
1024
|
+
_context14.next = 2;
|
|
1025
|
+
return (0, _react2.waitFor)(function () {
|
|
1026
|
+
expect(defaultProps.editor._toolbarOpened).toBe(false);
|
|
1027
|
+
});
|
|
1028
|
+
case 2:
|
|
1029
|
+
case "end":
|
|
1030
|
+
return _context14.stop();
|
|
1031
|
+
}
|
|
1032
|
+
}, _callee14);
|
|
1033
|
+
})));
|
|
1034
|
+
it('keeps editor._toolbarOpened true while the math node remains selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee15() {
|
|
1035
|
+
var _render15, getByTestId;
|
|
1036
|
+
return _regenerator["default"].wrap(function (_context15) {
|
|
1037
|
+
while (1) switch (_context15.prev = _context15.next) {
|
|
1038
|
+
case 0:
|
|
1039
|
+
_render15 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1040
|
+
selected: true
|
|
1041
|
+
}))), getByTestId = _render15.getByTestId;
|
|
1042
|
+
_context15.next = 1;
|
|
1043
|
+
return (0, _react2.waitFor)(function () {
|
|
1044
|
+
expect(getByTestId('done-button')).toBeInTheDocument();
|
|
1045
|
+
expect(defaultProps.editor._toolbarOpened).toBe(true);
|
|
1046
|
+
});
|
|
1047
|
+
case 1:
|
|
1048
|
+
_react2.fireEvent.click(getByTestId('done-button'));
|
|
1049
|
+
_context15.next = 2;
|
|
1050
|
+
return (0, _react2.waitFor)(function () {
|
|
1051
|
+
expect(defaultProps.editor._toolbarOpened).toBe(true);
|
|
1052
|
+
});
|
|
1053
|
+
case 2:
|
|
1054
|
+
case "end":
|
|
1055
|
+
return _context15.stop();
|
|
1056
|
+
}
|
|
1057
|
+
}, _callee15);
|
|
1058
|
+
})));
|
|
1059
|
+
it('closes toolbar on outside click and runs handleDone', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee16() {
|
|
1060
|
+
var updateAttributes, editor, _require3, TextSelection, _render16, queryByTestId;
|
|
1061
|
+
return _regenerator["default"].wrap(function (_context16) {
|
|
1062
|
+
while (1) switch (_context16.prev = _context16.next) {
|
|
1063
|
+
case 0:
|
|
1064
|
+
updateAttributes = jest.fn();
|
|
1065
|
+
editor = createMockEditor();
|
|
1066
|
+
_require3 = require('prosemirror-state'), TextSelection = _require3.TextSelection;
|
|
1067
|
+
_render16 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1068
|
+
editor: editor,
|
|
1069
|
+
updateAttributes: updateAttributes,
|
|
1070
|
+
selected: true
|
|
1071
|
+
}))), queryByTestId = _render16.queryByTestId;
|
|
1072
|
+
_context16.next = 1;
|
|
1073
|
+
return (0, _react2.waitFor)(function () {
|
|
1074
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1075
|
+
});
|
|
1076
|
+
case 1:
|
|
1077
|
+
_react2.fireEvent.click(document.body);
|
|
1078
|
+
_context16.next = 2;
|
|
1079
|
+
return (0, _react2.waitFor)(function () {
|
|
1080
|
+
expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
|
|
1081
|
+
expect(updateAttributes).toHaveBeenCalledWith({
|
|
1082
|
+
latex: 'x^2'
|
|
1083
|
+
});
|
|
1084
|
+
expect(TextSelection.create).toHaveBeenCalledWith(editor.state.doc, 1);
|
|
1085
|
+
expect(editor.state.tr.setSelection).toHaveBeenCalled();
|
|
1086
|
+
expect(editor.view.dispatch).toHaveBeenCalledWith(editor.state.tr);
|
|
1087
|
+
expect(editor.commands.focus).toHaveBeenCalled();
|
|
1088
|
+
expect(editor._toolbarOpened).toBe(true);
|
|
1089
|
+
});
|
|
1090
|
+
case 2:
|
|
1091
|
+
case "end":
|
|
1092
|
+
return _context16.stop();
|
|
1093
|
+
}
|
|
1094
|
+
}, _callee16);
|
|
1095
|
+
})));
|
|
1096
|
+
it('re-registers click listener when node changes', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee17() {
|
|
1097
|
+
var addEventListenerSpy, removeEventListenerSpy, nodeA, nodeB, _render17, rerender, initialCallCount;
|
|
1098
|
+
return _regenerator["default"].wrap(function (_context17) {
|
|
1099
|
+
while (1) switch (_context17.prev = _context17.next) {
|
|
1100
|
+
case 0:
|
|
1101
|
+
addEventListenerSpy = jest.spyOn(document, 'addEventListener');
|
|
1102
|
+
removeEventListenerSpy = jest.spyOn(document, 'removeEventListener');
|
|
1103
|
+
nodeA = {
|
|
1104
|
+
attrs: {
|
|
1105
|
+
latex: 'x^2'
|
|
1106
|
+
}
|
|
1107
|
+
};
|
|
1108
|
+
nodeB = {
|
|
1109
|
+
attrs: {
|
|
1110
|
+
latex: 'y^2'
|
|
1111
|
+
}
|
|
1112
|
+
};
|
|
1113
|
+
_render17 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1114
|
+
node: nodeA,
|
|
1115
|
+
selected: true
|
|
1116
|
+
}))), rerender = _render17.rerender;
|
|
1117
|
+
_context17.next = 1;
|
|
1118
|
+
return (0, _react2.waitFor)(function () {
|
|
1119
|
+
expect(addEventListenerSpy).toHaveBeenCalledWith('click', expect.any(Function));
|
|
1120
|
+
});
|
|
1121
|
+
case 1:
|
|
1122
|
+
initialCallCount = addEventListenerSpy.mock.calls.length;
|
|
1123
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1124
|
+
node: nodeB,
|
|
1125
|
+
selected: true
|
|
1126
|
+
})));
|
|
1127
|
+
_context17.next = 2;
|
|
1128
|
+
return (0, _react2.waitFor)(function () {
|
|
1129
|
+
expect(removeEventListenerSpy).toHaveBeenCalled();
|
|
1130
|
+
expect(addEventListenerSpy.mock.calls.length).toBeGreaterThan(initialCallCount);
|
|
1131
|
+
});
|
|
1132
|
+
case 2:
|
|
1133
|
+
addEventListenerSpy.mockRestore();
|
|
1134
|
+
removeEventListenerSpy.mockRestore();
|
|
1135
|
+
case 3:
|
|
1136
|
+
case "end":
|
|
1137
|
+
return _context17.stop();
|
|
1138
|
+
}
|
|
1139
|
+
}, _callee17);
|
|
1140
|
+
})));
|
|
1141
|
+
it('does not close toolbar when clicking the math node preview', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee18() {
|
|
1142
|
+
var _render18, getByTestId, queryByTestId;
|
|
1143
|
+
return _regenerator["default"].wrap(function (_context18) {
|
|
1144
|
+
while (1) switch (_context18.prev = _context18.next) {
|
|
1145
|
+
case 0:
|
|
1146
|
+
_render18 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1147
|
+
selected: true
|
|
1148
|
+
}))), getByTestId = _render18.getByTestId, queryByTestId = _render18.queryByTestId;
|
|
1149
|
+
_context18.next = 1;
|
|
1150
|
+
return (0, _react2.waitFor)(function () {
|
|
1151
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1152
|
+
});
|
|
1153
|
+
case 1:
|
|
1154
|
+
_react2.fireEvent.click(getByTestId('math-preview'));
|
|
1155
|
+
_context18.next = 2;
|
|
1156
|
+
return (0, _react2.waitFor)(function () {
|
|
1157
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1158
|
+
});
|
|
1159
|
+
case 2:
|
|
1160
|
+
case "end":
|
|
1161
|
+
return _context18.stop();
|
|
1162
|
+
}
|
|
1163
|
+
}, _callee18);
|
|
1164
|
+
})));
|
|
1165
|
+
describe('unique math-node class per instance', function () {
|
|
1166
|
+
var dateNowSpy;
|
|
1167
|
+
beforeEach(function () {
|
|
1168
|
+
var timestamp = 1000;
|
|
1169
|
+
dateNowSpy = jest.spyOn(Date, 'now').mockImplementation(function () {
|
|
1170
|
+
return timestamp++;
|
|
1171
|
+
});
|
|
1172
|
+
});
|
|
1173
|
+
afterEach(function () {
|
|
1174
|
+
dateNowSpy.mockRestore();
|
|
1175
|
+
});
|
|
1176
|
+
|
|
1177
|
+
// The wrapper is an emotion styled() component, so className also carries
|
|
1178
|
+
// emotion's generated class - assert on the math-node token, not equality.
|
|
1179
|
+
it('assigns a timestamp-based class to NodeViewWrapper', function () {
|
|
1180
|
+
var _render19 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
|
|
1181
|
+
getByTestId = _render19.getByTestId;
|
|
1182
|
+
var wrapper = getByTestId('node-view-wrapper');
|
|
1183
|
+
expect(Array.from(wrapper.classList).some(function (c) {
|
|
1184
|
+
return /^math-node-\d+$/.test(c);
|
|
1185
|
+
})).toBe(true);
|
|
1186
|
+
});
|
|
1187
|
+
it('assigns a different class to each MathNodeView instance', function () {
|
|
1188
|
+
var _render20 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps), /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1189
|
+
node: {
|
|
1190
|
+
attrs: {
|
|
1191
|
+
latex: 'y^2'
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
})))),
|
|
1195
|
+
getAllByTestId = _render20.getAllByTestId;
|
|
1196
|
+
var wrappers = getAllByTestId('node-view-wrapper');
|
|
1197
|
+
var mathNodeClass = function mathNodeClass(el) {
|
|
1198
|
+
return Array.from(el.classList).find(function (c) {
|
|
1199
|
+
return c.startsWith('math-node-');
|
|
1200
|
+
});
|
|
1201
|
+
};
|
|
1202
|
+
expect(mathNodeClass(wrappers[0])).toBe('math-node-1000');
|
|
1203
|
+
expect(mathNodeClass(wrappers[1])).toBe('math-node-1001');
|
|
1204
|
+
// and they must differ
|
|
1205
|
+
expect(mathNodeClass(wrappers[0])).not.toBe(mathNodeClass(wrappers[1]));
|
|
1206
|
+
});
|
|
1207
|
+
it('closes toolbar when clicking a different math node', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee19() {
|
|
1208
|
+
var updateAttributes, editorA, editorB, _render21, getAllByTestId, queryAllByTestId, secondPreview;
|
|
1209
|
+
return _regenerator["default"].wrap(function (_context19) {
|
|
1210
|
+
while (1) switch (_context19.prev = _context19.next) {
|
|
1211
|
+
case 0:
|
|
1212
|
+
updateAttributes = jest.fn();
|
|
1213
|
+
editorA = createMockEditor();
|
|
1214
|
+
editorB = createMockEditor();
|
|
1215
|
+
_render21 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1216
|
+
editor: editorA,
|
|
1217
|
+
updateAttributes: updateAttributes,
|
|
1218
|
+
selected: false
|
|
1219
|
+
})), /*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1220
|
+
editor: editorB,
|
|
1221
|
+
node: {
|
|
1222
|
+
attrs: {
|
|
1223
|
+
latex: 'y^2'
|
|
1224
|
+
}
|
|
1225
|
+
},
|
|
1226
|
+
selected: false
|
|
1227
|
+
})))), getAllByTestId = _render21.getAllByTestId, queryAllByTestId = _render21.queryAllByTestId;
|
|
1228
|
+
_react2.fireEvent.click(getAllByTestId('math-preview')[0]);
|
|
1229
|
+
_context19.next = 1;
|
|
1230
|
+
return (0, _react2.waitFor)(function () {
|
|
1231
|
+
expect(queryAllByTestId('math-toolbar')).toHaveLength(1);
|
|
1232
|
+
});
|
|
1233
|
+
case 1:
|
|
1234
|
+
secondPreview = getAllByTestId('math-preview')[1];
|
|
1235
|
+
_react2.fireEvent.click(secondPreview);
|
|
1236
|
+
_context19.next = 2;
|
|
1237
|
+
return (0, _react2.waitFor)(function () {
|
|
1238
|
+
expect(queryAllByTestId('math-toolbar')).toHaveLength(1);
|
|
1239
|
+
expect(updateAttributes).toHaveBeenCalledWith({
|
|
1240
|
+
latex: 'x^2'
|
|
1241
|
+
});
|
|
1242
|
+
expect(editorA._toolbarOpened).toBe(false);
|
|
1243
|
+
expect(getAllByTestId('math-input')[0]).toHaveValue('y^2');
|
|
1244
|
+
});
|
|
1245
|
+
case 2:
|
|
1246
|
+
case "end":
|
|
1247
|
+
return _context19.stop();
|
|
1248
|
+
}
|
|
1249
|
+
}, _callee19);
|
|
1250
|
+
})));
|
|
1251
|
+
});
|
|
1252
|
+
describe('selection-based toolbar guard', function () {
|
|
1253
|
+
it('opens toolbar when selected transitions to true and the editor has a NodeSelection on math', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee20() {
|
|
1254
|
+
var _render22, queryByTestId, rerender;
|
|
1255
|
+
return _regenerator["default"].wrap(function (_context20) {
|
|
1256
|
+
while (1) switch (_context20.prev = _context20.next) {
|
|
1257
|
+
case 0:
|
|
1258
|
+
_render22 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1259
|
+
selected: false
|
|
1260
|
+
}))), queryByTestId = _render22.queryByTestId, rerender = _render22.rerender;
|
|
1261
|
+
expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
|
|
1262
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1263
|
+
selected: true
|
|
1264
|
+
})));
|
|
1265
|
+
_context20.next = 1;
|
|
1266
|
+
return (0, _react2.waitFor)(function () {
|
|
1267
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1268
|
+
});
|
|
1269
|
+
case 1:
|
|
1270
|
+
case "end":
|
|
1271
|
+
return _context20.stop();
|
|
1272
|
+
}
|
|
1273
|
+
}, _callee20);
|
|
1274
|
+
})));
|
|
1275
|
+
it('does not open toolbar when selected briefly becomes true but editor selection has no node (Cmd+A / drag case)', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee22() {
|
|
1276
|
+
var editor, _render23, queryByTestId, rerender;
|
|
1277
|
+
return _regenerator["default"].wrap(function (_context22) {
|
|
1278
|
+
while (1) switch (_context22.prev = _context22.next) {
|
|
1279
|
+
case 0:
|
|
1280
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
1281
|
+
state: _objectSpread(_objectSpread({}, defaultProps.editor.state), {}, {
|
|
1282
|
+
selection: {
|
|
1283
|
+
from: 0,
|
|
1284
|
+
to: 100
|
|
1285
|
+
} // no .node — TextSelection / AllSelection shape
|
|
1286
|
+
})
|
|
1287
|
+
});
|
|
1288
|
+
_render23 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1289
|
+
editor: editor,
|
|
1290
|
+
selected: false
|
|
1291
|
+
}))), queryByTestId = _render23.queryByTestId, rerender = _render23.rerender;
|
|
1292
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1293
|
+
editor: editor,
|
|
1294
|
+
selected: true
|
|
1295
|
+
})));
|
|
1296
|
+
_context22.next = 1;
|
|
1297
|
+
return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee21() {
|
|
1298
|
+
return _regenerator["default"].wrap(function (_context21) {
|
|
1299
|
+
while (1) switch (_context21.prev = _context21.next) {
|
|
1300
|
+
case 0:
|
|
1301
|
+
case "end":
|
|
1302
|
+
return _context21.stop();
|
|
1303
|
+
}
|
|
1304
|
+
}, _callee21);
|
|
1305
|
+
})));
|
|
1306
|
+
case 1:
|
|
1307
|
+
expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
|
|
1308
|
+
case 2:
|
|
1309
|
+
case "end":
|
|
1310
|
+
return _context22.stop();
|
|
1311
|
+
}
|
|
1312
|
+
}, _callee22);
|
|
1313
|
+
})));
|
|
1314
|
+
it('does not open toolbar when selected briefly becomes true but NodeSelection targets a non-math node', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee24() {
|
|
1315
|
+
var editor, _render24, queryByTestId, rerender;
|
|
1316
|
+
return _regenerator["default"].wrap(function (_context24) {
|
|
1317
|
+
while (1) switch (_context24.prev = _context24.next) {
|
|
1318
|
+
case 0:
|
|
1319
|
+
editor = _objectSpread(_objectSpread({}, defaultProps.editor), {}, {
|
|
1320
|
+
state: _objectSpread(_objectSpread({}, defaultProps.editor.state), {}, {
|
|
1321
|
+
selection: {
|
|
1322
|
+
from: 0,
|
|
1323
|
+
to: 1,
|
|
1324
|
+
node: {
|
|
1325
|
+
type: {
|
|
1326
|
+
name: 'image'
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
})
|
|
1331
|
+
});
|
|
1332
|
+
_render24 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1333
|
+
editor: editor,
|
|
1334
|
+
selected: false
|
|
1335
|
+
}))), queryByTestId = _render24.queryByTestId, rerender = _render24.rerender;
|
|
1336
|
+
rerender(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1337
|
+
editor: editor,
|
|
1338
|
+
selected: true
|
|
1339
|
+
})));
|
|
1340
|
+
_context24.next = 1;
|
|
1341
|
+
return (0, _react2.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee23() {
|
|
1342
|
+
return _regenerator["default"].wrap(function (_context23) {
|
|
1343
|
+
while (1) switch (_context23.prev = _context23.next) {
|
|
1344
|
+
case 0:
|
|
1345
|
+
case "end":
|
|
1346
|
+
return _context23.stop();
|
|
1347
|
+
}
|
|
1348
|
+
}, _callee23);
|
|
1349
|
+
})));
|
|
1350
|
+
case 1:
|
|
1351
|
+
expect(queryByTestId('math-toolbar')).not.toBeInTheDocument();
|
|
1352
|
+
case 2:
|
|
1353
|
+
case "end":
|
|
1354
|
+
return _context24.stop();
|
|
1355
|
+
}
|
|
1356
|
+
}, _callee24);
|
|
1357
|
+
})));
|
|
1358
|
+
});
|
|
1359
|
+
it('does not close toolbar when clicking equation editor dropdown', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee25() {
|
|
1360
|
+
var _render25, queryByTestId, dropdown;
|
|
1361
|
+
return _regenerator["default"].wrap(function (_context25) {
|
|
1362
|
+
while (1) switch (_context25.prev = _context25.next) {
|
|
1363
|
+
case 0:
|
|
1364
|
+
_render25 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1365
|
+
selected: true
|
|
1366
|
+
}))), queryByTestId = _render25.queryByTestId;
|
|
1367
|
+
_context25.next = 1;
|
|
1368
|
+
return (0, _react2.waitFor)(function () {
|
|
1369
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1370
|
+
});
|
|
1371
|
+
case 1:
|
|
1372
|
+
// Simulate MUI Select's portal dropdown container.
|
|
1373
|
+
dropdown = document.createElement('div');
|
|
1374
|
+
dropdown.id = 'equation-editor-select-listbox';
|
|
1375
|
+
document.body.appendChild(dropdown);
|
|
1376
|
+
_react2.fireEvent.click(dropdown);
|
|
1377
|
+
_context25.next = 2;
|
|
1378
|
+
return (0, _react2.waitFor)(function () {
|
|
1379
|
+
expect(queryByTestId('math-toolbar')).toBeInTheDocument();
|
|
1380
|
+
});
|
|
1381
|
+
case 2:
|
|
1382
|
+
document.body.removeChild(dropdown);
|
|
1383
|
+
case 3:
|
|
1384
|
+
case "end":
|
|
1385
|
+
return _context25.stop();
|
|
1386
|
+
}
|
|
1387
|
+
}, _callee25);
|
|
1388
|
+
})));
|
|
1389
|
+
it('renders with empty latex', function () {
|
|
1390
|
+
var nodeWithEmptyLatex = {
|
|
1391
|
+
attrs: {
|
|
1392
|
+
latex: ''
|
|
1393
|
+
}
|
|
1394
|
+
};
|
|
1395
|
+
var _render26 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, (0, _extends2["default"])({}, defaultProps, {
|
|
1396
|
+
node: nodeWithEmptyLatex
|
|
1397
|
+
}))),
|
|
1398
|
+
getByTestId = _render26.getByTestId;
|
|
1399
|
+
expect(getByTestId('math-preview')).toBeInTheDocument();
|
|
1400
|
+
});
|
|
1401
|
+
it('has correct styling on NodeViewWrapper', function () {
|
|
1402
|
+
var _render27 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_math.MathNodeView, defaultProps)),
|
|
1403
|
+
getByTestId = _render27.getByTestId;
|
|
1404
|
+
var wrapper = getByTestId('node-view-wrapper');
|
|
1405
|
+
expect(wrapper).toHaveStyle({
|
|
1406
|
+
display: 'inline-flex',
|
|
1407
|
+
cursor: 'pointer'
|
|
1408
|
+
});
|
|
1409
|
+
});
|
|
1410
|
+
});
|
|
1411
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWF0aCIsInRvb2xiYXJVdGlscyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX2V4Y2x1ZGVkIiwiZSIsInQiLCJXZWFrTWFwIiwiciIsIm4iLCJfX2VzTW9kdWxlIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiX3R5cGVvZjMiLCJoYXMiLCJnZXQiLCJzZXQiLCJfdCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJqZXN0IiwibW9jayIsIk5vZGVWaWV3V3JhcHBlciIsIl9yZWYiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kczIiLCJSZWFjdE5vZGVWaWV3UmVuZGVyZXIiLCJmbiIsImNvbXBvbmVudCIsIm1vY2tDcmVhdGVQb3J0YWwiLCJub2RlIiwicmVxdWlyZUFjdHVhbCIsImNyZWF0ZVBvcnRhbCIsIlJlYWN0IiwiTWF0aFByZXZpZXciLCJfcmVmMiIsImxhdGV4IiwiTWF0aFRvb2xiYXIiLCJfcmVmMyIsIm9uQ2hhbmdlIiwib25Eb25lIiwiX1JlYWN0JHVzZVN0YXRlIiwidXNlU3RhdGUiLCJfUmVhY3QkdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwibG9jYWxMYXRleCIsInNldExvY2FsTGF0ZXgiLCJ2YWx1ZSIsInRhcmdldCIsIm9uQ2xpY2siLCJ3cmFwTWF0aCIsIndyYXBwZXIiLCJOb2RlIiwiY3JlYXRlIiwiY29uZmlnIiwiUGx1Z2luIiwiUGx1Z2luS2V5Iiwia2V5IiwiVGV4dFNlbGVjdGlvbiIsImRvYyIsInBvcyIsInR5cGUiLCJOb2RlU2VsZWN0aW9uIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsIk1hdGhOb2RlIiwibmFtZSIsInRvQmUiLCJpbmxpbmUiLCJncm91cCIsImF0b20iLCJhdHRyaWJ1dGVzIiwiYWRkQXR0cmlidXRlcyIsInRvSGF2ZVByb3BlcnR5IiwidG9FcXVhbCIsImh0bWwiLCJydWxlcyIsInBhcnNlSFRNTCIsIkFycmF5IiwiaXNBcnJheSIsInRvSGF2ZUxlbmd0aCIsInJlc3VsdCIsInJlbmRlckhUTUwiLCJIVE1MQXR0cmlidXRlcyIsImNvbW1hbmRzIiwiYWRkQ29tbWFuZHMiLCJfdHlwZW9mMiIsImluc2VydE1hdGgiLCJzZXRUb29sYmFyT3BlbmVkU3B5Iiwic3B5T24iLCJtYXRoTm9kZSIsIm5vZGVTaXplIiwidHIiLCJpbnNlcnQiLCJtb2NrUmV0dXJuVGhpcyIsInNldFNlbGVjdGlvbiIsImVkaXRvciIsInZpZXciLCJzdGF0ZSIsInNjaGVtYSIsIm5vZGVzIiwibWF0aCIsInNlbGVjdGlvbiIsIiRmcm9tIiwiZGlzcGF0Y2giLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJtb2NrUmVzdG9yZSIsImFkZE5vZGVWaWV3IiwidG9CZURlZmluZWQiLCJwbHVnaW5zIiwiYWRkUHJvc2VNaXJyb3JQbHVnaW5zIiwiYXBwZW5kVHJhbnNhY3Rpb24iLCJoYW5kbGVLZXlEb3duIiwicGx1Z2luIiwiRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbiIsInRleHROb2RlIiwibmV3U3RhdGUiLCJ0ZXh0IiwiZGVzY2VuZGFudHMiLCJjYiIsIm5vZGVBdCIsImRvY0NoYW5nZWQiLCJhbnl0aGluZyIsIm5vdCIsInRvQmVOdWxsIiwiY3JlYXRlRG9jV2l0aE1hdGhBbmRad3NwIiwicmVzb2x2ZU92ZXJyaWRlcyIsInVuZGVmaW5lZCIsInJlc29sdmUiLCJub2RlQWZ0ZXIiLCJub2RlQmVmb3JlIiwidGV4dENvbnRlbnQiLCJjcmVhdGVEb2NXaXRoUmVndWxhclRleHRCZWZvcmVDdXJzb3IiLCJjcmVhdGVWaWV3IiwiX3JlZjQiLCJfcmVmNCRzdGF0ZSIsInN0YXRlT3ZlcnJpZGVzIiwiZnJvbSIsImVtcHR5IiwiaGFuZGxlZCIsIlplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4iLCJfcmVxdWlyZSIsIl9yZXF1aXJlMiIsImNyZWF0ZUVkaXRvckVsZW1lbnQiLCJyZWN0IiwidG9wIiwibGVmdCIsIndpZHRoIiwiaGVpZ2h0IiwiZWxlbWVudCIsImRvY3VtZW50IiwiY29uZmlndXJhYmxlIiwiY3JlYXRlTW9ja0VkaXRvciIsInRvIiwic2V0TWV0YSIsImNvb3Jkc0F0UG9zIiwib3B0aW9ucyIsImZvY3VzIiwiaW5zdGFuY2VJZCIsIl90b29sYmFyT3BlbmVkIiwibW9ja05vZGUiLCJhdHRycyIsImRlZmF1bHRQcm9wcyIsImJlZm9yZUVhY2giLCJjbGVhckFsbE1vY2tzIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidXBkYXRlQXR0cmlidXRlcyIsInNlbGVjdGVkIiwiZ2V0UG9zIiwiX3JlbmRlciIsInJlbmRlciIsIk1hdGhOb2RlVmlldyIsImNvbnRhaW5lciIsInRvQmVJblRoZURvY3VtZW50IiwiX3JlbmRlcjIiLCJnZXRCeVRlc3RJZCIsIl9yZW5kZXIzIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfcmVuZGVyNCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0Iiwid2FpdEZvciIsInN0b3AiLCJfcmVuZGVyNSIsInF1ZXJ5QnlUZXN0SWQiLCJfY2FsbGVlMiIsIl9yZW5kZXI2IiwiX2NvbnRleHQyIiwidG9vbGJhciIsInF1ZXJ5U2VsZWN0b3IiLCJ0b0hhdmVBdHRyaWJ1dGUiLCJfY2FsbGVlMyIsIl9yZW5kZXI3IiwiX2NvbnRleHQzIiwic3R5bGUiLCJfY2FsbGVlNCIsImNvbnRhaW5lckVsIiwiX3JlbmRlcjgiLCJfY29udGV4dDQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfdGlwdGFwQ29udGFpbmVyRWwiLCJfY2FsbGVlNSIsIl9yZW5kZXI5IiwiX2NvbnRleHQ1IiwicG9zaXRpb24iLCJfY2FsbGVlNiIsIl9yZW5kZXIwIiwiX2NvbnRleHQ2IiwiekluZGV4IiwiX2NhbGxlZTciLCJfcmVuZGVyMSIsIl9jb250ZXh0NyIsIl9jYWxsZWU5Iiwib3JpZ2luYWxJbm5lckhlaWdodCIsIm9yaWdpbmFsSW5uZXJXaWR0aCIsIl9yZW5kZXIxMCIsIl9jb250ZXh0OSIsIndpbmRvdyIsImlubmVySGVpZ2h0IiwiaW5uZXJXaWR0aCIsIndyaXRhYmxlIiwiYm90dG9tIiwiYWN0IiwiX2NhbGxlZTgiLCJfY29udGV4dDgiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJQcm9taXNlIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwicGFyc2VJbnQiLCJ0b0JlTGVzc1RoYW5PckVxdWFsIiwidG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCIsIl9jYWxsZWUwIiwiYWRkU3B5IiwiX2NvbnRleHQwIiwiYW55IiwiRnVuY3Rpb24iLCJfY2FsbGVlMSIsIl9jb250ZXh0MSIsIm1vY2tDbGVhciIsImxhc3RDYWxsIiwiY2FsbHMiLCJfY2FsbGVlMTAiLCJfY29udGV4dDEwIiwiYm9keSIsIl9jYWxsZWUxMSIsIl9yZW5kZXIxMSIsIl9jb250ZXh0MTEiLCJpbnB1dCIsImZpcmVFdmVudCIsImNoYW5nZSIsIl9jYWxsZWUxMiIsIl9yZW5kZXIxMiIsImRvbmVCdXR0b24iLCJfY29udGV4dDEyIiwiY2xpY2siLCJfY2FsbGVlMTMiLCJfcmVuZGVyMTMiLCJfY29udGV4dDEzIiwiX2NhbGxlZTE0IiwiX3JlbmRlcjE0IiwiX2NvbnRleHQxNCIsIl9jYWxsZWUxNSIsIl9yZW5kZXIxNSIsIl9jb250ZXh0MTUiLCJfY2FsbGVlMTYiLCJfcmVxdWlyZTMiLCJfcmVuZGVyMTYiLCJfY29udGV4dDE2IiwiX2NhbGxlZTE3IiwiYWRkRXZlbnRMaXN0ZW5lclNweSIsInJlbW92ZUV2ZW50TGlzdGVuZXJTcHkiLCJub2RlQSIsIm5vZGVCIiwiX3JlbmRlcjE3IiwicmVyZW5kZXIiLCJpbml0aWFsQ2FsbENvdW50IiwiX2NvbnRleHQxNyIsInRvQmVHcmVhdGVyVGhhbiIsIl9jYWxsZWUxOCIsIl9yZW5kZXIxOCIsIl9jb250ZXh0MTgiLCJkYXRlTm93U3B5IiwidGltZXN0YW1wIiwiRGF0ZSIsImFmdGVyRWFjaCIsIl9yZW5kZXIxOSIsImNsYXNzTGlzdCIsInNvbWUiLCJjIiwidGVzdCIsIl9yZW5kZXIyMCIsIkZyYWdtZW50IiwiZ2V0QWxsQnlUZXN0SWQiLCJ3cmFwcGVycyIsIm1hdGhOb2RlQ2xhc3MiLCJlbCIsImZpbmQiLCJzdGFydHNXaXRoIiwiX2NhbGxlZTE5IiwiZWRpdG9yQSIsImVkaXRvckIiLCJfcmVuZGVyMjEiLCJxdWVyeUFsbEJ5VGVzdElkIiwic2Vjb25kUHJldmlldyIsIl9jb250ZXh0MTkiLCJ0b0hhdmVWYWx1ZSIsIl9jYWxsZWUyMCIsIl9yZW5kZXIyMiIsIl9jb250ZXh0MjAiLCJfY2FsbGVlMjIiLCJfcmVuZGVyMjMiLCJfY29udGV4dDIyIiwiX2NhbGxlZTIxIiwiX2NvbnRleHQyMSIsIl9jYWxsZWUyNCIsIl9yZW5kZXIyNCIsIl9jb250ZXh0MjQiLCJfY2FsbGVlMjMiLCJfY29udGV4dDIzIiwiX2NhbGxlZTI1IiwiX3JlbmRlcjI1IiwiZHJvcGRvd24iLCJfY29udGV4dDI1IiwiaWQiLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwibm9kZVdpdGhFbXB0eUxhdGV4IiwiX3JlbmRlcjI2IiwiX3JlbmRlcjI3IiwidG9IYXZlU3R5bGUiLCJkaXNwbGF5IiwiY3Vyc29yIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21hdGgudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyLCB3YWl0Rm9yLCBmaXJlRXZlbnQsIGFjdCB9IGZyb20gJ0B0ZXN0aW5nLWxpYnJhcnkvcmVhY3QnO1xuaW1wb3J0IHsgRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbiwgTWF0aE5vZGUsIE1hdGhOb2RlVmlldywgWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbiB9IGZyb20gJy4uL21hdGgnO1xuaW1wb3J0ICogYXMgdG9vbGJhclV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3Rvb2xiYXInO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgPGRpdiBkYXRhLXRlc3RpZD1cIm5vZGUtdmlldy13cmFwcGVyXCIgey4uLnByb3BzfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKSxcbiAgUmVhY3ROb2RlVmlld1JlbmRlcmVyOiBqZXN0LmZuKChjb21wb25lbnQpID0+IGNvbXBvbmVudCksXG59KSk7XG5cbmNvbnN0IG1vY2tDcmVhdGVQb3J0YWwgPSBqZXN0LmZuKChub2RlKSA9PiBub2RlKTtcbmplc3QubW9jaygncmVhY3QtZG9tJywgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKCdyZWFjdC1kb20nKSxcbiAgY3JlYXRlUG9ydGFsOiAoLi4uYXJncykgPT4gbW9ja0NyZWF0ZVBvcnRhbCguLi5hcmdzKSxcbn0pKTtcblxuamVzdC5tb2NrKCdAcGllLWxpYi9tYXRoLXRvb2xiYXInLCAoKSA9PiB7XG4gIGNvbnN0IFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbiAgcmV0dXJuIHtcbiAgICBNYXRoUHJldmlldzogKHsgbGF0ZXggfSkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cIm1hdGgtcHJldmlld1wiPntsYXRleH08L2Rpdj4sXG4gICAgTWF0aFRvb2xiYXI6ICh7IGxhdGV4LCBvbkNoYW5nZSwgb25Eb25lIH0pID0+IHtcbiAgICAgIGNvbnN0IFtsb2NhbExhdGV4LCBzZXRMb2NhbExhdGV4XSA9IFJlYWN0LnVzZVN0YXRlKGxhdGV4KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJtYXRoLXRvb2xiYXJcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibWF0aC1pbnB1dFwiXG4gICAgICAgICAgICB2YWx1ZT17bG9jYWxMYXRleH1cbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgICBzZXRMb2NhbExhdGV4KGUudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgb25DaGFuZ2UoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJkb25lLWJ1dHRvblwiIG9uQ2xpY2s9eygpID0+IG9uRG9uZShsb2NhbExhdGV4KX0+XG4gICAgICAgICAgICBEb25lXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKTtcbiAgICB9LFxuICB9O1xufSk7XG5cbmplc3QubW9jaygnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnLCAoKSA9PiAoe1xuICB3cmFwTWF0aDogKGxhdGV4LCB3cmFwcGVyKSA9PiBsYXRleCxcbn0pKTtcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7XG4gICAgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZyksXG4gIH0sXG59KSk7XG5cbmplc3QubW9jaygncHJvc2VtaXJyb3Itc3RhdGUnLCAoKSA9PiAoe1xuICBQbHVnaW46IGplc3QuZm4oZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIHJldHVybiBjb25maWc7XG4gIH0pLFxuICBQbHVnaW5LZXk6IGplc3QuZm4oZnVuY3Rpb24gKGtleSkge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICB9KSxcbiAgVGV4dFNlbGVjdGlvbjoge1xuICAgIGNyZWF0ZTogamVzdC5mbigoZG9jLCBwb3MpID0+ICh7IHR5cGU6ICd0ZXh0JywgcG9zIH0pKSxcbiAgfSxcbiAgTm9kZVNlbGVjdGlvbjoge1xuICAgIGNyZWF0ZTogamVzdC5mbigoZG9jLCBwb3MpID0+ICh7IHR5cGU6ICdub2RlJywgcG9zIH0pKSxcbiAgfSxcbn0pKTtcblxuZGVzY3JpYmUoJ01hdGhOb2RlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICBpdCgnaGFzIGNvcnJlY3QgbmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChNYXRoTm9kZS5uYW1lKS50b0JlKCdtYXRoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgaW5saW5lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KE1hdGhOb2RlLmlubGluZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBpbiBpbmxpbmUgZ3JvdXAnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoTWF0aE5vZGUuZ3JvdXApLnRvQmUoJ2lubGluZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGF0b21pYycsICgpID0+IHtcbiAgICAgIGV4cGVjdChNYXRoTm9kZS5hdG9tKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQXR0cmlidXRlcycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyByZXF1aXJlZCBhdHRyaWJ1dGVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IE1hdGhOb2RlLmFkZEF0dHJpYnV0ZXMoKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdsYXRleCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCd3cmFwcGVyJyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2h0bWwnKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMubGF0ZXgpLnRvRXF1YWwoeyBkZWZhdWx0OiAnJyB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLndyYXBwZXIpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaHRtbCkudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUhUTUwnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgcGFyc2luZyBydWxlcyBmb3IgbGF0ZXgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1hdGhOb2RlLnBhcnNlSFRNTCgpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuaXNBcnJheShydWxlcykpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QocnVsZXMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICAgIGV4cGVjdChydWxlc1swXSkudG9IYXZlUHJvcGVydHkoJ3RhZycsICdzcGFuW2RhdGEtbGF0ZXhdJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBwYXJzaW5nIHJ1bGVzIGZvciBtYXRobWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBydWxlcyA9IE1hdGhOb2RlLnBhcnNlSFRNTCgpO1xuICAgICAgZXhwZWN0KHJ1bGVzWzFdKS50b0hhdmVQcm9wZXJ0eSgndGFnJywgJ3NwYW5bZGF0YS10eXBlPVwibWF0aG1sXCJdJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZW5kZXJIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZW5kZXJzIG1hdGhtbCB3aGVuIGh0bWwgYXR0cmlidXRlIGlzIHByZXNlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBNYXRoTm9kZS5yZW5kZXJIVE1MKHtcbiAgICAgICAgSFRNTEF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICBodG1sOiAnPG1hdGg+PG1pPng8L21pPjwvbWF0aD4nLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdkYXRhLXR5cGUnLCAnbWF0aG1sJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBsYXRleCB3aGVuIGh0bWwgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWF0aE5vZGUucmVuZGVySFRNTCh7XG4gICAgICAgIEhUTUxBdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgbGF0ZXg6ICd4XjInLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyZXN1bHRbMF0pLnRvQmUoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0pLnRvSGF2ZVByb3BlcnR5KCdkYXRhLWxhdGV4JywgJycpO1xuICAgICAgZXhwZWN0KHJlc3VsdFsxXSkudG9IYXZlUHJvcGVydHkoJ2RhdGEtcmF3JywgJ3heMicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkQ29tbWFuZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgaW5zZXJ0TWF0aCBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBNYXRoTm9kZS5hZGRDb21tYW5kcygpO1xuXG4gICAgICBleHBlY3QoY29tbWFuZHMpLnRvSGF2ZVByb3BlcnR5KCdpbnNlcnRNYXRoJyk7XG4gICAgICBleHBlY3QodHlwZW9mIGNvbW1hbmRzLmluc2VydE1hdGgpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5zZXJ0TWF0aCBvcGVucyB0aGUgdG9vbGJhciBhZnRlciBpbnNlcnRpbmcgYSBtYXRoIG5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZXRUb29sYmFyT3BlbmVkU3B5ID0gamVzdC5zcHlPbih0b29sYmFyVXRpbHMsICdzZXRUb29sYmFyT3BlbmVkJyk7XG4gICAgICBjb25zdCBtYXRoTm9kZSA9IHsgdHlwZTogeyBuYW1lOiAnbWF0aCcgfSwgbm9kZVNpemU6IDEgfTtcbiAgICAgIGNvbnN0IHRyID0ge1xuICAgICAgICBpbnNlcnQ6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBzZXRTZWxlY3Rpb246IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgICBkb2M6IHt9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBzY2hlbWE6IHsgbm9kZXM6IHsgbWF0aDogeyBjcmVhdGU6IGplc3QuZm4oKCkgPT4gbWF0aE5vZGUpIH0gfSB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7ICRmcm9tOiB7IHBvczogMSB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkaXNwYXRjaCA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGluc2VydE1hdGggPSBNYXRoTm9kZS5hZGRDb21tYW5kcygpLmluc2VydE1hdGgoJ3heMicpO1xuXG4gICAgICBpbnNlcnRNYXRoKHsgdHIsIGVkaXRvciwgZGlzcGF0Y2ggfSk7XG5cbiAgICAgIGV4cGVjdCh0ci5pbnNlcnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDEsIG1hdGhOb2RlKTtcbiAgICAgIGV4cGVjdCh0ci5zZXRTZWxlY3Rpb24pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdChkaXNwYXRjaCkudG9IYXZlQmVlbkNhbGxlZFdpdGgodHIpO1xuICAgICAgZXhwZWN0KHNldFRvb2xiYXJPcGVuZWRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVkaXRvciwgdHJ1ZSk7XG5cbiAgICAgIHNldFRvb2xiYXJPcGVuZWRTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBNYXRoTm9kZS5hZGROb2RlVmlldygpO1xuXG4gICAgICBleHBlY3QocmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYWRkUHJvc2VNaXJyb3JQbHVnaW5zJywgKCkgPT4ge1xuICAgIGl0KCdyZWdpc3RlcnMgZW5zdXJlLXRleHQtYWZ0ZXItbWF0aCBhbmQgemVyby13aWR0aC1zcGFjZSBwbHVnaW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGx1Z2lucyA9IE1hdGhOb2RlLmFkZFByb3NlTWlycm9yUGx1Z2lucygpO1xuXG4gICAgICBleHBlY3QocGx1Z2lucykudG9IYXZlTGVuZ3RoKDIpO1xuICAgICAgZXhwZWN0KHBsdWdpbnNbMF0uYXBwZW5kVHJhbnNhY3Rpb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QocGx1Z2luc1sxXS5wcm9wcy5oYW5kbGVLZXlEb3duKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbicsICgpID0+IHtcbiAgaXQoJ2luc2VydHMgYSB6ZXJvLXdpZHRoIHNwYWNlIGFmdGVyIGEgbWF0aCBub2RlIHdoZW4gbm8gdGV4dCBmb2xsb3dzJywgKCkgPT4ge1xuICAgIGNvbnN0IHBsdWdpbiA9IEVuc3VyZVRleHRBZnRlck1hdGhQbHVnaW4oJ21hdGgnKTtcbiAgICBjb25zdCB0ZXh0Tm9kZSA9IHsgdHlwZTogeyBuYW1lOiAndGV4dCcgfSB9O1xuICAgIGNvbnN0IG1hdGhOb2RlID0geyB0eXBlOiB7IG5hbWU6ICdtYXRoJyB9LCBub2RlU2l6ZTogMyB9O1xuICAgIGNvbnN0IHRyID0geyBpbnNlcnQ6IGplc3QuZm4oKSB9O1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBzY2hlbWE6IHsgdGV4dDogamVzdC5mbigodmFsdWUpID0+ICh7IHR5cGU6IHRleHROb2RlLnR5cGUsIHRleHQ6IHZhbHVlIH0pKSB9LFxuICAgICAgdHIsXG4gICAgICBkb2M6IHtcbiAgICAgICAgZGVzY2VuZGFudHM6IChjYikgPT4gY2IobWF0aE5vZGUsIDUpLFxuICAgICAgICBub2RlQXQ6IGplc3QuZm4oKCkgPT4gbnVsbCksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBwbHVnaW4uYXBwZW5kVHJhbnNhY3Rpb24oW3sgZG9jQ2hhbmdlZDogdHJ1ZSB9XSwge30sIG5ld1N0YXRlKTtcblxuICAgIGV4cGVjdCh0ci5pbnNlcnQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKDgsIGV4cGVjdC5hbnl0aGluZygpKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlKHRyKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGluc2VydCB3aGVuIHRleHQgYWxyZWFkeSBmb2xsb3dzIHRoZSBtYXRoIG5vZGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcGx1Z2luID0gRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbignbWF0aCcpO1xuICAgIGNvbnN0IHRyID0geyBpbnNlcnQ6IGplc3QuZm4oKSB9O1xuICAgIGNvbnN0IG1hdGhOb2RlID0geyB0eXBlOiB7IG5hbWU6ICdtYXRoJyB9LCBub2RlU2l6ZTogMyB9O1xuXG4gICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICBzY2hlbWE6IHsgdGV4dDogamVzdC5mbigpIH0sXG4gICAgICB0cixcbiAgICAgIGRvYzoge1xuICAgICAgICBkZXNjZW5kYW50czogKGNiKSA9PiBjYihtYXRoTm9kZSwgNSksXG4gICAgICAgIG5vZGVBdDogamVzdC5mbigoKSA9PiAoeyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9IH0pKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHBsdWdpbi5hcHBlbmRUcmFuc2FjdGlvbihbeyBkb2NDaGFuZ2VkOiB0cnVlIH1dLCB7fSwgbmV3U3RhdGUpO1xuXG4gICAgZXhwZWN0KHRyLmluc2VydCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBudWxsIHdoZW4gdGhlIGRvY3VtZW50IGRpZCBub3QgY2hhbmdlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBsdWdpbiA9IEVuc3VyZVRleHRBZnRlck1hdGhQbHVnaW4oJ21hdGgnKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHBsdWdpbi5hcHBlbmRUcmFuc2FjdGlvbihbeyBkb2NDaGFuZ2VkOiBmYWxzZSB9XSwge30sIHt9KTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlTnVsbCgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbicsICgpID0+IHtcbiAgY29uc3QgY3JlYXRlRG9jV2l0aE1hdGhBbmRad3NwID0gKHJlc29sdmVPdmVycmlkZXMgPSB7fSkgPT4gKHtcbiAgICByZXNvbHZlOiBqZXN0LmZuKChwb3MpID0+ICh7XG4gICAgICBub2RlQWZ0ZXI6IG51bGwsXG4gICAgICBub2RlQmVmb3JlOiBudWxsLFxuICAgICAgcG9zLFxuICAgICAgLi4ucmVzb2x2ZU92ZXJyaWRlc1twb3NdLFxuICAgIH0pKSxcbiAgICBub2RlQXQ6IGplc3QuZm4oKHBvcykgPT4ge1xuICAgICAgaWYgKHBvcyA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9LCB0ZXh0Q29udGVudDogJ1xcdTIwMGInIH07XG4gICAgICB9XG4gICAgICBpZiAocG9zID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IHsgbmFtZTogJ21hdGgnIH0sIG5vZGVTaXplOiAxIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRlRG9jV2l0aFJlZ3VsYXJUZXh0QmVmb3JlQ3Vyc29yID0gKCkgPT4gKHtcbiAgICByZXNvbHZlOiBqZXN0LmZuKChwb3MpID0+ICh7IG5vZGVBZnRlcjogbnVsbCwgbm9kZUJlZm9yZTogbnVsbCwgcG9zIH0pKSxcbiAgICBub2RlQXQ6IGplc3QuZm4oKHBvcykgPT4ge1xuICAgICAgaWYgKHBvcyA9PT0gMSkge1xuICAgICAgICByZXR1cm4geyB0eXBlOiB7IG5hbWU6ICd0ZXh0JyB9LCB0ZXh0Q29udGVudDogJ2EnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgY3JlYXRlVmlldyA9ICh7IHN0YXRlOiBzdGF0ZU92ZXJyaWRlcyA9IHt9IH0gPSB7fSkgPT4ge1xuICAgIGNvbnN0IGRpc3BhdGNoID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHRyID0ge1xuICAgICAgZGVsZXRlOiBqZXN0LmZuKCkubW9ja1JldHVyblRoaXMoKSxcbiAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMiwgZW1wdHk6IHRydWUgfSxcbiAgICAgICAgZG9jOiBjcmVhdGVEb2NXaXRoTWF0aEFuZFp3c3AoKSxcbiAgICAgICAgdHIsXG4gICAgICAgIC4uLnN0YXRlT3ZlcnJpZGVzLFxuICAgICAgfSxcbiAgICAgIGRpc3BhdGNoLFxuICAgIH07XG4gIH07XG5cbiAgZGVzY3JpYmUoJ0JhY2tzcGFjZScsICgpID0+IHtcbiAgICBpdCgnZGVsZXRlcyB0aGUgaW5saW5lIG5vZGUgYW5kIHplcm8td2lkdGggc3BhY2UgYmVmb3JlIHRoZSBjdXJzb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldygpO1xuICAgICAgY29uc3QgaGFuZGxlZCA9IFplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4ucHJvcHMuaGFuZGxlS2V5RG93bih2aWV3LCB7IGtleTogJ0JhY2tzcGFjZScgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHZpZXcuc3RhdGUudHIuZGVsZXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgwLCAyKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh2aWV3LnN0YXRlLnRyKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGZhbHNlIHdoZW4gcmVndWxhciB0ZXh0IHByZWNlZGVzIHRoZSBjdXJzb3InLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldyh7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgZG9jOiBjcmVhdGVEb2NXaXRoUmVndWxhclRleHRCZWZvcmVDdXJzb3IoKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBoYW5kbGVkID0gWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbi5wcm9wcy5oYW5kbGVLZXlEb3duKHZpZXcsIHsga2V5OiAnQmFja3NwYWNlJyB9KTtcblxuICAgICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KHZpZXcuc3RhdGUudHIuZGVsZXRlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KHZpZXcuZGlzcGF0Y2gpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdBcnJvd0xlZnQnLCAoKSA9PiB7XG4gICAgaXQoJ3NlbGVjdHMgdGhlIGlubGluZSBub2RlIGJlZm9yZSBhIHplcm8td2lkdGggc3BhY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXRoTm9kZSA9IHsgbm9kZVNpemU6IDMgfTtcbiAgICAgIGNvbnN0IHZpZXcgPSBjcmVhdGVWaWV3KHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICBkb2M6IGNyZWF0ZURvY1dpdGhNYXRoQW5kWndzcCh7XG4gICAgICAgICAgICAwOiB7IG5vZGVBZnRlcjogbWF0aE5vZGUsIG5vZGVCZWZvcmU6IG51bGwsIHBvczogMCB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBjb25zdCB7IE5vZGVTZWxlY3Rpb24gfSA9IHJlcXVpcmUoJ3Byb3NlbWlycm9yLXN0YXRlJyk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZWQgPSBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luLnByb3BzLmhhbmRsZUtleURvd24odmlldywgeyBrZXk6ICdBcnJvd0xlZnQnIH0pO1xuXG4gICAgICBleHBlY3QoaGFuZGxlZCkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdCh2aWV3LnN0YXRlLmRvYy5yZXNvbHZlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgwKTtcbiAgICAgIGV4cGVjdChOb2RlU2VsZWN0aW9uLmNyZWF0ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgodmlldy5zdGF0ZS5kb2MsIDApO1xuICAgICAgZXhwZWN0KHZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KCdtb3ZlcyB0aGUgdGV4dCBjdXJzb3IgYmVmb3JlIHRoZSB6ZXJvLXdpZHRoIHNwYWNlIHdoZW4gbm8gaW5saW5lIG5vZGUgcHJlY2VkZXMgaXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3ID0gY3JlYXRlVmlldygpO1xuICAgICAgY29uc3QgeyBUZXh0U2VsZWN0aW9uIH0gPSByZXF1aXJlKCdwcm9zZW1pcnJvci1zdGF0ZScpO1xuXG4gICAgICBjb25zdCBoYW5kbGVkID0gWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbi5wcm9wcy5oYW5kbGVLZXlEb3duKHZpZXcsIHsga2V5OiAnQXJyb3dMZWZ0JyB9KTtcblxuICAgICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3Qodmlldy5zdGF0ZS5kb2MucmVzb2x2ZSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMCk7XG4gICAgICBleHBlY3QoVGV4dFNlbGVjdGlvbi5jcmVhdGUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHZpZXcuc3RhdGUuZG9jLCAwKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyBmYWxzZSB3aGVuIHJlZ3VsYXIgdGV4dCBwcmVjZWRlcyB0aGUgY3Vyc29yJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcoe1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRvYzogY3JlYXRlRG9jV2l0aFJlZ3VsYXJUZXh0QmVmb3JlQ3Vyc29yKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgaGFuZGxlZCA9IFplcm9XaWR0aFNwYWNlSGFuZGxpbmdQbHVnaW4ucHJvcHMuaGFuZGxlS2V5RG93bih2aWV3LCB7IGtleTogJ0Fycm93TGVmdCcgfSk7XG5cbiAgICAgIGV4cGVjdChoYW5kbGVkKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdCh2aWV3LnN0YXRlLnRyLnNldFNlbGVjdGlvbikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIGV4cGVjdCh2aWV3LmRpc3BhdGNoKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmV0dXJucyBmYWxzZSBmb3IgdW5yZWxhdGVkIGtleXMnLCAoKSA9PiB7XG4gICAgY29uc3QgdmlldyA9IGNyZWF0ZVZpZXcoKTtcblxuICAgIGNvbnN0IGhhbmRsZWQgPSBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luLnByb3BzLmhhbmRsZUtleURvd24odmlldywgeyBrZXk6ICdFbnRlcicgfSk7XG4gICAgZXhwZWN0KGhhbmRsZWQpLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWF0aE5vZGVWaWV3JywgKCkgPT4ge1xuICBjb25zdCBjcmVhdGVFZGl0b3JFbGVtZW50ID0gKHJlY3QgPSB7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IDYwMCwgaGVpZ2h0OiA0MDAgfSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcsIHtcbiAgICAgIHZhbHVlOiBqZXN0LmZuKCgpID0+IHJlY3QpLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9O1xuXG4gIGNvbnN0IGNyZWF0ZU1vY2tFZGl0b3IgPSAoKSA9PiAoe1xuICAgIHN0YXRlOiB7XG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgZnJvbTogMCxcbiAgICAgICAgdG86IDEsXG4gICAgICAgIG5vZGU6IHsgdHlwZTogeyBuYW1lOiAnbWF0aCcgfSB9LFxuICAgICAgfSxcbiAgICAgIHRyOiB7XG4gICAgICAgIHNldFNlbGVjdGlvbjogamVzdC5mbigpLm1vY2tSZXR1cm5UaGlzKCksXG4gICAgICAgIHNldE1ldGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVGhpcygpLFxuICAgICAgfSxcbiAgICAgIGRvYzoge30sXG4gICAgfSxcbiAgICB2aWV3OiB7XG4gICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDEwMCwgbGVmdDogNTAgfSkpLFxuICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICB9LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGVsZW1lbnQ6IGNyZWF0ZUVkaXRvckVsZW1lbnQoKSxcbiAgICB9LFxuICAgIGNvbW1hbmRzOiB7XG4gICAgICBmb2N1czogamVzdC5mbigpLFxuICAgIH0sXG4gICAgaW5zdGFuY2VJZDogJ2VkaXRvci0xMjMnLFxuICAgIF90b29sYmFyT3BlbmVkOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3QgbW9ja05vZGUgPSB7XG4gICAgYXR0cnM6IHtcbiAgICAgIGxhdGV4OiAneF4yJyxcbiAgICB9LFxuICAgIG5vZGVTaXplOiAxLFxuICB9O1xuXG4gIGxldCBkZWZhdWx0UHJvcHM7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgbW9ja0NyZWF0ZVBvcnRhbC5tb2NrSW1wbGVtZW50YXRpb24oKG5vZGUpID0+IG5vZGUpO1xuICAgIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgIG5vZGU6IG1vY2tOb2RlLFxuICAgICAgdXBkYXRlQXR0cmlidXRlczogamVzdC5mbigpLFxuICAgICAgZWRpdG9yOiBjcmVhdGVNb2NrRWRpdG9yKCksXG4gICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICBvcHRpb25zOiB7fSxcbiAgICAgIGdldFBvczogamVzdC5mbigoKSA9PiAwKSxcbiAgICB9O1xuICB9KTtcblxuICBpdCgncmVuZGVycyB3aXRob3V0IGNyYXNoaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlbmRlcnMgTm9kZVZpZXdXcmFwcGVyJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IC8+KTtcbiAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ25vZGUtdmlldy13cmFwcGVyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdkaXNwbGF5cyBtYXRoIHByZXZpZXcnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdzaG93cyB0b29sYmFyIHdoZW4gc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBzaG93IHRvb2xiYXIgd2hlbiBub3Qgc2VsZWN0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcbiAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICB9KTtcblxuICBpdCgnYWRkcyBkYXRhLXRvb2xiYXItZm9yIGF0dHJpYnV0ZSB3aXRoIGVkaXRvciBpbnN0YW5jZUlkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgIGV4cGVjdCh0b29sYmFyKS50b0hhdmVBdHRyaWJ1dGUoJ2RhdGEtdG9vbGJhci1mb3InLCAnZWRpdG9yLTEyMycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbGJhciBwb3NpdGlvbmluZycsICgpID0+IHtcbiAgICBpdCgncG9zaXRpb25zIHJlbGF0aXZlIHRvIHBvcnRhbCBjb250YWluZXIgdXNpbmcgY29vcmRzQXRQb3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcxMDBweCcpO1xuICAgICAgICBleHBlY3QodG9vbGJhci5zdHlsZS5sZWZ0KS50b0JlKCc1MHB4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdvZmZzZXRzIHBvc2l0aW9uIGJ5IHBvcnRhbCBjb250YWluZXIgZ2V0Qm91bmRpbmdDbGllbnRSZWN0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGNvbnRhaW5lckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9IGplc3QuZm4oKCkgPT4gKHsgdG9wOiAxMDAsIGxlZnQ6IDUwLCB3aWR0aDogNjAwLCBoZWlnaHQ6IDQwMCB9KSk7XG5cbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvcixcbiAgICAgICAgX3RpcHRhcENvbnRhaW5lckVsOiBjb250YWluZXJFbCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcwcHgnKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUubGVmdCkudG9CZSgnMHB4Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhcHBsaWVzIGFic29sdXRlIHBvc2l0aW9uaW5nIHN0eWxlIHRvIHRvb2xiYXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUucG9zaXRpb24pLnRvQmUoJ2Fic29sdXRlJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZW5kZXJzIGFib3ZlIG90aGVyIGVkaXRvciBvdmVybGF5cyB3aXRoIGEgaGlnaCB6LWluZGV4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgY29uc3QgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICAgIGV4cGVjdCh0b29sYmFyLnN0eWxlLnpJbmRleCkudG9CZSgnMTAwMCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXBkYXRlcyBwb3NpdGlvbiBmcm9tIGNvb3Jkc0F0UG9zIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHZpZXc6IHtcbiAgICAgICAgICAuLi5kZWZhdWx0UHJvcHMuZWRpdG9yLnZpZXcsXG4gICAgICAgICAgY29vcmRzQXRQb3M6IGplc3QuZm4oKCkgPT4gKHsgdG9wOiAyMDAsIGxlZnQ6IDE1MCB9KSksXG4gICAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b29sYmFyID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRvb2xiYXItZm9yXScpO1xuICAgICAgICBleHBlY3QodG9vbGJhcikudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIuc3R5bGUudG9wKS50b0JlKCcyMDBweCcpO1xuICAgICAgICBleHBlY3QodG9vbGJhci5zdHlsZS5sZWZ0KS50b0JlKCcxNTBweCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2xhbXBzIHRvb2xiYXIgcG9zaXRpb24gdG8gdmlld3BvcnQgbWFyZ2lucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW5uZXJIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgICBjb25zdCBvcmlnaW5hbElubmVyV2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2lubmVySGVpZ2h0JywgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogMjAwIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2lubmVyV2lkdGgnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlOiAzMDAgfSk7XG5cbiAgICAgIGNvbnN0IGVkaXRvciA9IHtcbiAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvcixcbiAgICAgICAgdmlldzoge1xuICAgICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IudmlldyxcbiAgICAgICAgICBjb29yZHNBdFBvczogamVzdC5mbigoKSA9PiAoeyB0b3A6IDE5MCwgbGVmdDogMjgwLCBib3R0b206IDE5NSB9KSksXG4gICAgICAgICAgZGlzcGF0Y2g6IGplc3QuZm4oKSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgbGV0IHRvb2xiYXI7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgdG9vbGJhciA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbZGF0YS10b29sYmFyLWZvcl0nKTtcbiAgICAgICAgZXhwZWN0KHRvb2xiYXIpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRvb2xiYXIsICdvZmZzZXRIZWlnaHQnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IDEwMCB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0b29sYmFyLCAnb2Zmc2V0V2lkdGgnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IDE1MCB9KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSkpO1xuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QocGFyc2VJbnQodG9vbGJhci5zdHlsZS50b3AsIDEwKSkudG9CZUxlc3NUaGFuT3JFcXVhbCgyMDAgLSAxMDAgLSA4KTtcbiAgICAgICAgZXhwZWN0KHBhcnNlSW50KHRvb2xiYXIuc3R5bGUubGVmdCwgMTApKS50b0JlTGVzc1RoYW5PckVxdWFsKDMwMCAtIDE1MCAtIDgpO1xuICAgICAgICBleHBlY3QocGFyc2VJbnQodG9vbGJhci5zdHlsZS50b3AsIDEwKSkudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbCg4KTtcbiAgICAgICAgZXhwZWN0KHBhcnNlSW50KHRvb2xiYXIuc3R5bGUubGVmdCwgMTApKS50b0JlR3JlYXRlclRoYW5PckVxdWFsKDgpO1xuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdpbm5lckhlaWdodCcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9yaWdpbmFsSW5uZXJIZWlnaHQgfSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnaW5uZXJXaWR0aCcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IG9yaWdpbmFsSW5uZXJXaWR0aCB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdhdHRhY2hlcyBzY3JvbGwgYW5kIHJlc2l6ZSBsaXN0ZW5lcnMgd2hpbGUgdG9vbGJhciBpcyBvcGVuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgYWRkU3B5ID0gamVzdC5zcHlPbih3aW5kb3csICdhZGRFdmVudExpc3RlbmVyJyk7XG4gICAgICByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzY3JvbGwnLCBleHBlY3QuYW55KEZ1bmN0aW9uKSwgdHJ1ZSk7XG4gICAgICAgIGV4cGVjdChhZGRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdyZXNpemUnLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgICB9KTtcbiAgICAgIGFkZFNweS5tb2NrUmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3BvcnRhbHMgdG9vbGJhciBpbnRvIF90aXB0YXBDb250YWluZXJFbCB3aGVuIGF2YWlsYWJsZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBjb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBqZXN0LmZuKCgpID0+ICh7IHRvcDogMCwgbGVmdDogMCwgd2lkdGg6IDYwMCwgaGVpZ2h0OiA0MDAgfSkpO1xuXG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIF90aXB0YXBDb250YWluZXJFbDogY29udGFpbmVyRWwsXG4gICAgICB9O1xuXG4gICAgICBtb2NrQ3JlYXRlUG9ydGFsLm1vY2tDbGVhcigpO1xuICAgICAgcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KG1vY2tDcmVhdGVQb3J0YWwpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgY29uc3QgbGFzdENhbGwgPSBtb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHNbbW9ja0NyZWF0ZVBvcnRhbC5tb2NrLmNhbGxzLmxlbmd0aCAtIDFdO1xuICAgICAgICBleHBlY3QobGFzdENhbGxbMV0pLnRvQmUoY29udGFpbmVyRWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgncG9ydGFscyB0b29sYmFyIGludG8gZG9jdW1lbnQuYm9keSB3aGVuIF90aXB0YXBDb250YWluZXJFbCBpcyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWRpdG9yID0ge1xuICAgICAgICAuLi5kZWZhdWx0UHJvcHMuZWRpdG9yLFxuICAgICAgICBfdGlwdGFwQ29udGFpbmVyRWw6IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIG1vY2tDcmVhdGVQb3J0YWwubW9ja0NsZWFyKCk7XG4gICAgICByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgICBleHBlY3QobW9ja0NyZWF0ZVBvcnRhbCkudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBjb25zdCBsYXN0Q2FsbCA9IG1vY2tDcmVhdGVQb3J0YWwubW9jay5jYWxsc1ttb2NrQ3JlYXRlUG9ydGFsLm1vY2suY2FsbHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGV4cGVjdChsYXN0Q2FsbFsxXSkudG9CZShkb2N1bWVudC5ib2R5KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnY2FsbHMgdXBkYXRlQXR0cmlidXRlcyB3aGVuIGxhdGV4IGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0QnlUZXN0SWQoJ21hdGgtaW5wdXQnKTtcbiAgICAgIGZpcmVFdmVudC5jaGFuZ2UoaW5wdXQsIHsgdGFyZ2V0OiB7IHZhbHVlOiAneV4yJyB9IH0pO1xuICAgIH0pO1xuICAgIGV4cGVjdChkZWZhdWx0UHJvcHMudXBkYXRlQXR0cmlidXRlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyBsYXRleDogJ3leMicgfSk7XG4gIH0pO1xuXG4gIGl0KCdjbG9zZXMgdG9vbGJhciBhbmQgdXBkYXRlcyBhdHRyaWJ1dGVzIHdoZW4gZG9uZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVBdHRyaWJ1dGVzID0gamVzdC5mbigpO1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcihcbiAgICAgIDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gdXBkYXRlQXR0cmlidXRlcz17dXBkYXRlQXR0cmlidXRlc30gc2VsZWN0ZWQ9e3RydWV9IC8+LFxuICAgICk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZG9uZS1idXR0b24nKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRvbmVCdXR0b24gPSBnZXRCeVRlc3RJZCgnZG9uZS1idXR0b24nKTtcbiAgICBmaXJlRXZlbnQuY2xpY2soZG9uZUJ1dHRvbik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdCh1cGRhdGVBdHRyaWJ1dGVzKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCh7IGxhdGV4OiAneF4yJyB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3NldHMgZWRpdG9yLl90b29sYmFyT3BlbmVkIHdoZW4gdG9vbGJhciBpcyBzaG93bicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIGV4cGVjdChkZWZhdWx0UHJvcHMuZWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgndW5zZXRzIGVkaXRvci5fdG9vbGJhck9wZW5lZCB3aGVuIHRvb2xiYXIgaXMgY2xvc2VkIGFuZCBub2RlIGlzIG5vdCBzZWxlY3RlZCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17ZmFsc2V9IC8+KTtcblxuICAgIGZpcmVFdmVudC5jbGljayhnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5lZGl0b3IuX3Rvb2xiYXJPcGVuZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQuY2xpY2soZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLmVkaXRvci5fdG9vbGJhck9wZW5lZCkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBlZGl0b3IuX3Rvb2xiYXJPcGVuZWQgdHJ1ZSB3aGlsZSB0aGUgbWF0aCBub2RlIHJlbWFpbnMgc2VsZWN0ZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdkb25lLWJ1dHRvbicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KGRlZmF1bHRQcm9wcy5lZGl0b3IuX3Rvb2xiYXJPcGVuZWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBmaXJlRXZlbnQuY2xpY2soZ2V0QnlUZXN0SWQoJ2RvbmUtYnV0dG9uJykpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QoZGVmYXVsdFByb3BzLmVkaXRvci5fdG9vbGJhck9wZW5lZCkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2Nsb3NlcyB0b29sYmFyIG9uIG91dHNpZGUgY2xpY2sgYW5kIHJ1bnMgaGFuZGxlRG9uZScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cGRhdGVBdHRyaWJ1dGVzID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGVkaXRvciA9IGNyZWF0ZU1vY2tFZGl0b3IoKTtcbiAgICBjb25zdCB7IFRleHRTZWxlY3Rpb24gfSA9IHJlcXVpcmUoJ3Byb3NlbWlycm9yLXN0YXRlJyk7XG4gICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICA8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IGVkaXRvcj17ZWRpdG9yfSB1cGRhdGVBdHRyaWJ1dGVzPXt1cGRhdGVBdHRyaWJ1dGVzfSBzZWxlY3RlZD17dHJ1ZX0gLz4sXG4gICAgKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICBleHBlY3QocXVlcnlCeVRlc3RJZCgnbWF0aC10b29sYmFyJykpLm5vdC50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgICAgZXhwZWN0KHVwZGF0ZUF0dHJpYnV0ZXMpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHsgbGF0ZXg6ICd4XjInIH0pO1xuICAgICAgZXhwZWN0KFRleHRTZWxlY3Rpb24uY3JlYXRlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChlZGl0b3Iuc3RhdGUuZG9jLCAxKTtcbiAgICAgIGV4cGVjdChlZGl0b3Iuc3RhdGUudHIuc2V0U2VsZWN0aW9uKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoZWRpdG9yLnZpZXcuZGlzcGF0Y2gpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGVkaXRvci5zdGF0ZS50cik7XG4gICAgICBleHBlY3QoZWRpdG9yLmNvbW1hbmRzLmZvY3VzKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoZWRpdG9yLl90b29sYmFyT3BlbmVkKS50b0JlKHRydWUpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgncmUtcmVnaXN0ZXJzIGNsaWNrIGxpc3RlbmVyIHdoZW4gbm9kZSBjaGFuZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGFkZEV2ZW50TGlzdGVuZXJTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAnYWRkRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJTcHkgPSBqZXN0LnNweU9uKGRvY3VtZW50LCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicpO1xuICAgIGNvbnN0IG5vZGVBID0geyBhdHRyczogeyBsYXRleDogJ3heMicgfSB9O1xuICAgIGNvbnN0IG5vZGVCID0geyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9O1xuXG4gICAgY29uc3QgeyByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm9kZUF9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChhZGRFdmVudExpc3RlbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2xpY2snLCBleHBlY3QuYW55KEZ1bmN0aW9uKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbml0aWFsQ2FsbENvdW50ID0gYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrLmNhbGxzLmxlbmd0aDtcblxuICAgIHJlcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17bm9kZUJ9IHNlbGVjdGVkPXt0cnVlfSAvPik7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChyZW1vdmVFdmVudExpc3RlbmVyU3B5KS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICBleHBlY3QoYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrLmNhbGxzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKGluaXRpYWxDYWxsQ291bnQpO1xuICAgIH0pO1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lclNweS5tb2NrUmVzdG9yZSgpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJTcHkubW9ja1Jlc3RvcmUoKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGNsb3NlIHRvb2xiYXIgd2hlbiBjbGlja2luZyB0aGUgbWF0aCBub2RlIHByZXZpZXcnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBnZXRCeVRlc3RJZCwgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGdldEJ5VGVzdElkKCdtYXRoLXByZXZpZXcnKSk7XG5cbiAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3VuaXF1ZSBtYXRoLW5vZGUgY2xhc3MgcGVyIGluc3RhbmNlJywgKCkgPT4ge1xuICAgIGxldCBkYXRlTm93U3B5O1xuXG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBsZXQgdGltZXN0YW1wID0gMTAwMDtcbiAgICAgIGRhdGVOb3dTcHkgPSBqZXN0LnNweU9uKERhdGUsICdub3cnKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gdGltZXN0YW1wKyspO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIGRhdGVOb3dTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSB3cmFwcGVyIGlzIGFuIGVtb3Rpb24gc3R5bGVkKCkgY29tcG9uZW50LCBzbyBjbGFzc05hbWUgYWxzbyBjYXJyaWVzXG4gICAgLy8gZW1vdGlvbidzIGdlbmVyYXRlZCBjbGFzcyAtIGFzc2VydCBvbiB0aGUgbWF0aC1ub2RlIHRva2VuLCBub3QgZXF1YWxpdHkuXG4gICAgaXQoJ2Fzc2lnbnMgYSB0aW1lc3RhbXAtYmFzZWQgY2xhc3MgdG8gTm9kZVZpZXdXcmFwcGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gLz4pO1xuICAgICAgY29uc3Qgd3JhcHBlciA9IGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuXG4gICAgICBleHBlY3QoQXJyYXkuZnJvbSh3cmFwcGVyLmNsYXNzTGlzdCkuc29tZSgoYykgPT4gL15tYXRoLW5vZGUtXFxkKyQvLnRlc3QoYykpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Fzc2lnbnMgYSBkaWZmZXJlbnQgY2xhc3MgdG8gZWFjaCBNYXRoTm9kZVZpZXcgaW5zdGFuY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICAgIDw+XG4gICAgICAgICAgPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPlxuICAgICAgICAgIDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gbm9kZT17eyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9fSAvPlxuICAgICAgICA8Lz4sXG4gICAgICApO1xuXG4gICAgICBjb25zdCB3cmFwcGVycyA9IGdldEFsbEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuICAgICAgY29uc3QgbWF0aE5vZGVDbGFzcyA9IChlbCkgPT4gQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QpLmZpbmQoKGMpID0+IGMuc3RhcnRzV2l0aCgnbWF0aC1ub2RlLScpKTtcblxuICAgICAgZXhwZWN0KG1hdGhOb2RlQ2xhc3Mod3JhcHBlcnNbMF0pKS50b0JlKCdtYXRoLW5vZGUtMTAwMCcpO1xuICAgICAgZXhwZWN0KG1hdGhOb2RlQ2xhc3Mod3JhcHBlcnNbMV0pKS50b0JlKCdtYXRoLW5vZGUtMTAwMScpO1xuICAgICAgLy8gYW5kIHRoZXkgbXVzdCBkaWZmZXJcbiAgICAgIGV4cGVjdChtYXRoTm9kZUNsYXNzKHdyYXBwZXJzWzBdKSkubm90LnRvQmUobWF0aE5vZGVDbGFzcyh3cmFwcGVyc1sxXSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Nsb3NlcyB0b29sYmFyIHdoZW4gY2xpY2tpbmcgYSBkaWZmZXJlbnQgbWF0aCBub2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlQXR0cmlidXRlcyA9IGplc3QuZm4oKTtcbiAgICAgIGNvbnN0IGVkaXRvckEgPSBjcmVhdGVNb2NrRWRpdG9yKCk7XG4gICAgICBjb25zdCBlZGl0b3JCID0gY3JlYXRlTW9ja0VkaXRvcigpO1xuXG4gICAgICBjb25zdCB7IGdldEFsbEJ5VGVzdElkLCBxdWVyeUFsbEJ5VGVzdElkIH0gPSByZW5kZXIoXG4gICAgICAgIDw+XG4gICAgICAgICAgPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvckF9IHVwZGF0ZUF0dHJpYnV0ZXM9e3VwZGF0ZUF0dHJpYnV0ZXN9IHNlbGVjdGVkPXtmYWxzZX0gLz5cbiAgICAgICAgICA8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IGVkaXRvcj17ZWRpdG9yQn0gbm9kZT17eyBhdHRyczogeyBsYXRleDogJ3leMicgfSB9fSBzZWxlY3RlZD17ZmFsc2V9IC8+XG4gICAgICAgIDwvPixcbiAgICAgICk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhnZXRBbGxCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JylbMF0pO1xuXG4gICAgICBhd2FpdCB3YWl0Rm9yKCgpID0+IHtcbiAgICAgICAgZXhwZWN0KHF1ZXJ5QWxsQnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2Vjb25kUHJldmlldyA9IGdldEFsbEJ5VGVzdElkKCdtYXRoLXByZXZpZXcnKVsxXTtcbiAgICAgIGZpcmVFdmVudC5jbGljayhzZWNvbmRQcmV2aWV3KTtcblxuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUFsbEJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgICBleHBlY3QodXBkYXRlQXR0cmlidXRlcykudG9IYXZlQmVlbkNhbGxlZFdpdGgoeyBsYXRleDogJ3heMicgfSk7XG4gICAgICAgIGV4cGVjdChlZGl0b3JBLl90b29sYmFyT3BlbmVkKS50b0JlKGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KGdldEFsbEJ5VGVzdElkKCdtYXRoLWlucHV0JylbMF0pLnRvSGF2ZVZhbHVlKCd5XjInKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2VsZWN0aW9uLWJhc2VkIHRvb2xiYXIgZ3VhcmQnLCAoKSA9PiB7XG4gICAgaXQoJ29wZW5zIHRvb2xiYXIgd2hlbiBzZWxlY3RlZCB0cmFuc2l0aW9ucyB0byB0cnVlIGFuZCB0aGUgZWRpdG9yIGhhcyBhIE5vZGVTZWxlY3Rpb24gb24gbWF0aCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCwgcmVyZW5kZXIgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS5ub3QudG9CZUluVGhlRG9jdW1lbnQoKTtcblxuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBzZWxlY3RlZD17dHJ1ZX0gLz4pO1xuICAgICAgYXdhaXQgd2FpdEZvcigoKSA9PiB7XG4gICAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkudG9CZUluVGhlRG9jdW1lbnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RvZXMgbm90IG9wZW4gdG9vbGJhciB3aGVuIHNlbGVjdGVkIGJyaWVmbHkgYmVjb21lcyB0cnVlIGJ1dCBlZGl0b3Igc2VsZWN0aW9uIGhhcyBubyBub2RlIChDbWQrQSAvIGRyYWcgY2FzZSknLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvci5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMCwgdG86IDEwMCB9LCAvLyBubyAubm9kZSDigJQgVGV4dFNlbGVjdGlvbiAvIEFsbFNlbGVjdGlvbiBzaGFwZVxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHt9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnZG9lcyBub3Qgb3BlbiB0b29sYmFyIHdoZW4gc2VsZWN0ZWQgYnJpZWZseSBiZWNvbWVzIHRydWUgYnV0IE5vZGVTZWxlY3Rpb24gdGFyZ2V0cyBhIG5vbi1tYXRoIG5vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRQcm9wcy5lZGl0b3IsXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uZGVmYXVsdFByb3BzLmVkaXRvci5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IHsgZnJvbTogMCwgdG86IDEsIG5vZGU6IHsgdHlwZTogeyBuYW1lOiAnaW1hZ2UnIH0gfSB9LFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBxdWVyeUJ5VGVzdElkLCByZXJlbmRlciB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gZWRpdG9yPXtlZGl0b3J9IHNlbGVjdGVkPXtmYWxzZX0gLz4pO1xuICAgICAgcmVyZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSBlZGl0b3I9e2VkaXRvcn0gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgICAgYXdhaXQgYWN0KGFzeW5jICgpID0+IHt9KTtcbiAgICAgIGV4cGVjdChxdWVyeUJ5VGVzdElkKCdtYXRoLXRvb2xiYXInKSkubm90LnRvQmVJblRoZURvY3VtZW50KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBjbG9zZSB0b29sYmFyIHdoZW4gY2xpY2tpbmcgZXF1YXRpb24gZWRpdG9yIGRyb3Bkb3duJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgcXVlcnlCeVRlc3RJZCB9ID0gcmVuZGVyKDxNYXRoTm9kZVZpZXcgey4uLmRlZmF1bHRQcm9wc30gc2VsZWN0ZWQ9e3RydWV9IC8+KTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgLy8gU2ltdWxhdGUgTVVJIFNlbGVjdCdzIHBvcnRhbCBkcm9wZG93biBjb250YWluZXIuXG4gICAgY29uc3QgZHJvcGRvd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkcm9wZG93bi5pZCA9ICdlcXVhdGlvbi1lZGl0b3Itc2VsZWN0LWxpc3Rib3gnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHJvcGRvd24pO1xuXG4gICAgZmlyZUV2ZW50LmNsaWNrKGRyb3Bkb3duKTtcblxuICAgIGF3YWl0IHdhaXRGb3IoKCkgPT4ge1xuICAgICAgZXhwZWN0KHF1ZXJ5QnlUZXN0SWQoJ21hdGgtdG9vbGJhcicpKS50b0JlSW5UaGVEb2N1bWVudCgpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkcm9wZG93bik7XG4gIH0pO1xuXG4gIGl0KCdyZW5kZXJzIHdpdGggZW1wdHkgbGF0ZXgnLCAoKSA9PiB7XG4gICAgY29uc3Qgbm9kZVdpdGhFbXB0eUxhdGV4ID0geyBhdHRyczogeyBsYXRleDogJycgfSB9O1xuICAgIGNvbnN0IHsgZ2V0QnlUZXN0SWQgfSA9IHJlbmRlcig8TWF0aE5vZGVWaWV3IHsuLi5kZWZhdWx0UHJvcHN9IG5vZGU9e25vZGVXaXRoRW1wdHlMYXRleH0gLz4pO1xuICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWF0aC1wcmV2aWV3JykpLnRvQmVJblRoZURvY3VtZW50KCk7XG4gIH0pO1xuXG4gIGl0KCdoYXMgY29ycmVjdCBzdHlsaW5nIG9uIE5vZGVWaWV3V3JhcHBlcicsICgpID0+IHtcbiAgICBjb25zdCB7IGdldEJ5VGVzdElkIH0gPSByZW5kZXIoPE1hdGhOb2RlVmlldyB7Li4uZGVmYXVsdFByb3BzfSAvPik7XG4gICAgY29uc3Qgd3JhcHBlciA9IGdldEJ5VGVzdElkKCdub2RlLXZpZXctd3JhcHBlcicpO1xuICAgIGV4cGVjdCh3cmFwcGVyKS50b0hhdmVTdHlsZSh7IGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsIGN1cnNvcjogJ3BvaW50ZXInIH0pO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLEtBQUEsR0FBQUYsT0FB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
|