@pie-lib/editable-html-tip-tap 2.1.20-beta.1 → 2.1.20-beta.11
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,307 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _react = _interopRequireDefault(require("react"));
|
|
6
|
+
var _react2 = require("@testing-library/react");
|
|
7
|
+
var _media = _interopRequireDefault(require("../media"));
|
|
8
|
+
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; }
|
|
9
|
+
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; }
|
|
10
|
+
// Create a mockable insertDialog function
|
|
11
|
+
var mockInsertDialog = jest.fn();
|
|
12
|
+
|
|
13
|
+
// Mock react-dom BEFORE any imports that depend on it
|
|
14
|
+
jest.mock('react-dom', function () {
|
|
15
|
+
return _objectSpread(_objectSpread({}, jest.requireActual('react-dom')), {}, {
|
|
16
|
+
render: jest.fn()
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Mock the insertDialog function in the media module
|
|
21
|
+
jest.mock('../media', function () {
|
|
22
|
+
var actual = jest.requireActual('../media');
|
|
23
|
+
return _objectSpread(_objectSpread({
|
|
24
|
+
__esModule: true
|
|
25
|
+
}, actual), {}, {
|
|
26
|
+
"default": actual["default"],
|
|
27
|
+
// Preserve the default export
|
|
28
|
+
insertDialog: function insertDialog() {
|
|
29
|
+
return mockInsertDialog.apply(void 0, arguments);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
jest.mock('@tiptap/core', function () {
|
|
34
|
+
return {
|
|
35
|
+
Node: {
|
|
36
|
+
create: jest.fn(function (config) {
|
|
37
|
+
return config;
|
|
38
|
+
})
|
|
39
|
+
},
|
|
40
|
+
mergeAttributes: jest.fn(function () {
|
|
41
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
42
|
+
args[_key] = arguments[_key];
|
|
43
|
+
}
|
|
44
|
+
return Object.assign.apply(Object, [{}].concat(args));
|
|
45
|
+
})
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
jest.mock('@tiptap/react', function () {
|
|
49
|
+
return {
|
|
50
|
+
NodeViewWrapper: function NodeViewWrapper(_ref) {
|
|
51
|
+
var children = _ref.children;
|
|
52
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
53
|
+
"data-testid": "node-view-wrapper"
|
|
54
|
+
}, children);
|
|
55
|
+
},
|
|
56
|
+
ReactNodeViewRenderer: jest.fn(function (component) {
|
|
57
|
+
return component;
|
|
58
|
+
})
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
jest.mock('../../components/media/MediaDialog', function () {
|
|
62
|
+
return {
|
|
63
|
+
__esModule: true,
|
|
64
|
+
"default": jest.fn(function () {
|
|
65
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
66
|
+
"data-testid": "media-dialog"
|
|
67
|
+
});
|
|
68
|
+
})
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
jest.mock('../../components/media/MediaToolbar', function () {
|
|
72
|
+
return {
|
|
73
|
+
__esModule: true,
|
|
74
|
+
"default": jest.fn(function (_ref2) {
|
|
75
|
+
var onEdit = _ref2.onEdit,
|
|
76
|
+
onRemove = _ref2.onRemove;
|
|
77
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
78
|
+
"data-testid": "media-toolbar"
|
|
79
|
+
}, /*#__PURE__*/_react["default"].createElement("button", {
|
|
80
|
+
onClick: onEdit,
|
|
81
|
+
"data-testid": "edit-button"
|
|
82
|
+
}, "Edit Settings"), /*#__PURE__*/_react["default"].createElement("button", {
|
|
83
|
+
onClick: onRemove,
|
|
84
|
+
"data-testid": "remove-button"
|
|
85
|
+
}, "Remove"));
|
|
86
|
+
})
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
describe('MediaNodeView Component', function () {
|
|
90
|
+
var mockEditor;
|
|
91
|
+
var mockUpdateAttributes;
|
|
92
|
+
var mockDeleteNode;
|
|
93
|
+
beforeEach(function () {
|
|
94
|
+
jest.clearAllMocks();
|
|
95
|
+
mockInsertDialog.mockClear();
|
|
96
|
+
|
|
97
|
+
// Clean up any existing dialogs in the DOM
|
|
98
|
+
document.body.innerHTML = '';
|
|
99
|
+
mockEditor = {
|
|
100
|
+
chain: jest.fn(function () {
|
|
101
|
+
return {
|
|
102
|
+
focus: jest.fn(function () {
|
|
103
|
+
return {
|
|
104
|
+
run: jest.fn()
|
|
105
|
+
};
|
|
106
|
+
})
|
|
107
|
+
};
|
|
108
|
+
})
|
|
109
|
+
};
|
|
110
|
+
mockUpdateAttributes = jest.fn();
|
|
111
|
+
mockDeleteNode = jest.fn();
|
|
112
|
+
});
|
|
113
|
+
afterEach(function () {
|
|
114
|
+
// Clean up DOM after each test
|
|
115
|
+
document.body.innerHTML = '';
|
|
116
|
+
});
|
|
117
|
+
describe('dialog auto-opening behavior - verifies the fix', function () {
|
|
118
|
+
it('should NOT open dialog on mount when audio has existing src', function () {
|
|
119
|
+
var node = {
|
|
120
|
+
attrs: {
|
|
121
|
+
type: 'audio',
|
|
122
|
+
tag: 'audio',
|
|
123
|
+
src: 'https://example.com/audio.mp3',
|
|
124
|
+
width: null,
|
|
125
|
+
height: null
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// This should render without opening any dialogs
|
|
130
|
+
var _render = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
131
|
+
editor: mockEditor,
|
|
132
|
+
node: node,
|
|
133
|
+
updateAttributes: mockUpdateAttributes,
|
|
134
|
+
deleteNode: mockDeleteNode,
|
|
135
|
+
options: {}
|
|
136
|
+
})),
|
|
137
|
+
container = _render.container;
|
|
138
|
+
|
|
139
|
+
// Verify the component rendered successfully
|
|
140
|
+
expect(container.querySelector('audio')).toBeTruthy();
|
|
141
|
+
// Verify mockInsertDialog was not called (dialog didn't open)
|
|
142
|
+
expect(mockInsertDialog).not.toHaveBeenCalled();
|
|
143
|
+
// Verify deleteNode was not called (media was not removed)
|
|
144
|
+
expect(mockDeleteNode).not.toHaveBeenCalled();
|
|
145
|
+
});
|
|
146
|
+
it('should NOT open dialog on mount when video has existing src', function () {
|
|
147
|
+
var node = {
|
|
148
|
+
attrs: {
|
|
149
|
+
type: 'video',
|
|
150
|
+
tag: 'iframe',
|
|
151
|
+
src: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
|
|
152
|
+
width: '640',
|
|
153
|
+
height: '480'
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// This should render without opening any dialogs
|
|
158
|
+
var _render2 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
159
|
+
editor: mockEditor,
|
|
160
|
+
node: node,
|
|
161
|
+
updateAttributes: mockUpdateAttributes,
|
|
162
|
+
deleteNode: mockDeleteNode,
|
|
163
|
+
options: {}
|
|
164
|
+
})),
|
|
165
|
+
container = _render2.container;
|
|
166
|
+
|
|
167
|
+
// Verify the component rendered successfully
|
|
168
|
+
expect(container.querySelector('iframe')).toBeTruthy();
|
|
169
|
+
// Verify mockInsertDialog was not called (dialog didn't open)
|
|
170
|
+
expect(mockInsertDialog).not.toHaveBeenCalled();
|
|
171
|
+
// Verify deleteNode was not called (media was not removed)
|
|
172
|
+
expect(mockDeleteNode).not.toHaveBeenCalled();
|
|
173
|
+
});
|
|
174
|
+
it('should render existing media with empty string src without opening dialog', function () {
|
|
175
|
+
var node = {
|
|
176
|
+
attrs: {
|
|
177
|
+
type: 'audio',
|
|
178
|
+
tag: 'audio',
|
|
179
|
+
src: '',
|
|
180
|
+
// Empty string (falsy but not null)
|
|
181
|
+
width: null,
|
|
182
|
+
height: null
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
var _render3 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
186
|
+
editor: mockEditor,
|
|
187
|
+
node: node,
|
|
188
|
+
updateAttributes: mockUpdateAttributes,
|
|
189
|
+
deleteNode: mockDeleteNode,
|
|
190
|
+
options: {}
|
|
191
|
+
})),
|
|
192
|
+
container = _render3.container;
|
|
193
|
+
|
|
194
|
+
// Empty string is falsy, so dialog WOULD open with current implementation
|
|
195
|
+
// This documents current behavior
|
|
196
|
+
expect(container).toBeTruthy();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
describe('toolbar interaction', function () {
|
|
200
|
+
it('should render edit and remove buttons', function () {
|
|
201
|
+
var node = {
|
|
202
|
+
attrs: {
|
|
203
|
+
type: 'audio',
|
|
204
|
+
tag: 'audio',
|
|
205
|
+
src: 'https://example.com/audio.mp3'
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
var _render4 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
209
|
+
editor: mockEditor,
|
|
210
|
+
node: node,
|
|
211
|
+
updateAttributes: mockUpdateAttributes,
|
|
212
|
+
deleteNode: mockDeleteNode,
|
|
213
|
+
options: {}
|
|
214
|
+
})),
|
|
215
|
+
getByTestId = _render4.getByTestId;
|
|
216
|
+
expect(getByTestId('edit-button')).toBeTruthy();
|
|
217
|
+
expect(getByTestId('remove-button')).toBeTruthy();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe('rendering', function () {
|
|
221
|
+
it('should render audio element when tag is audio', function () {
|
|
222
|
+
var node = {
|
|
223
|
+
attrs: {
|
|
224
|
+
type: 'audio',
|
|
225
|
+
tag: 'audio',
|
|
226
|
+
src: 'https://example.com/audio.mp3'
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
var _render5 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
230
|
+
editor: mockEditor,
|
|
231
|
+
node: node,
|
|
232
|
+
updateAttributes: mockUpdateAttributes,
|
|
233
|
+
deleteNode: mockDeleteNode,
|
|
234
|
+
options: {}
|
|
235
|
+
})),
|
|
236
|
+
container = _render5.container;
|
|
237
|
+
var audio = container.querySelector('audio');
|
|
238
|
+
expect(audio).toBeTruthy();
|
|
239
|
+
var source = audio.querySelector('source');
|
|
240
|
+
expect(source.getAttribute('src')).toBe('https://example.com/audio.mp3');
|
|
241
|
+
});
|
|
242
|
+
it('should render iframe when tag is iframe', function () {
|
|
243
|
+
var node = {
|
|
244
|
+
attrs: {
|
|
245
|
+
type: 'video',
|
|
246
|
+
tag: 'iframe',
|
|
247
|
+
src: 'https://www.youtube.com/embed/dQw4w9WgXcQ',
|
|
248
|
+
width: '640',
|
|
249
|
+
height: '480'
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
var _render6 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
253
|
+
editor: mockEditor,
|
|
254
|
+
node: node,
|
|
255
|
+
updateAttributes: mockUpdateAttributes,
|
|
256
|
+
deleteNode: mockDeleteNode,
|
|
257
|
+
options: {}
|
|
258
|
+
})),
|
|
259
|
+
container = _render6.container;
|
|
260
|
+
var iframe = container.querySelector('iframe');
|
|
261
|
+
expect(iframe).toBeTruthy();
|
|
262
|
+
expect(iframe.getAttribute('src')).toBe('https://www.youtube.com/embed/dQw4w9WgXcQ');
|
|
263
|
+
expect(iframe.getAttribute('width')).toBe('640');
|
|
264
|
+
expect(iframe.getAttribute('height')).toBe('480');
|
|
265
|
+
});
|
|
266
|
+
it('should render MediaToolbar', function () {
|
|
267
|
+
var node = {
|
|
268
|
+
attrs: {
|
|
269
|
+
type: 'audio',
|
|
270
|
+
tag: 'audio',
|
|
271
|
+
src: 'https://example.com/audio.mp3'
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
var _render7 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
275
|
+
editor: mockEditor,
|
|
276
|
+
node: node,
|
|
277
|
+
updateAttributes: mockUpdateAttributes,
|
|
278
|
+
deleteNode: mockDeleteNode,
|
|
279
|
+
options: {}
|
|
280
|
+
})),
|
|
281
|
+
getByTestId = _render7.getByTestId;
|
|
282
|
+
expect(getByTestId('media-toolbar')).toBeTruthy();
|
|
283
|
+
expect(getByTestId('edit-button')).toBeTruthy();
|
|
284
|
+
expect(getByTestId('remove-button')).toBeTruthy();
|
|
285
|
+
});
|
|
286
|
+
it('should call deleteNode when remove button is clicked', function () {
|
|
287
|
+
var node = {
|
|
288
|
+
attrs: {
|
|
289
|
+
type: 'audio',
|
|
290
|
+
tag: 'audio',
|
|
291
|
+
src: 'https://example.com/audio.mp3'
|
|
292
|
+
}
|
|
293
|
+
};
|
|
294
|
+
var _render8 = (0, _react2.render)(/*#__PURE__*/_react["default"].createElement(_media["default"], {
|
|
295
|
+
editor: mockEditor,
|
|
296
|
+
node: node,
|
|
297
|
+
updateAttributes: mockUpdateAttributes,
|
|
298
|
+
deleteNode: mockDeleteNode,
|
|
299
|
+
options: {}
|
|
300
|
+
})),
|
|
301
|
+
getByTestId = _render8.getByTestId;
|
|
302
|
+
_react2.fireEvent.click(getByTestId('remove-button'));
|
|
303
|
+
expect(mockDeleteNode).toHaveBeenCalled();
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdDIiLCJfbWVkaWEiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIm1vY2tJbnNlcnREaWFsb2ciLCJqZXN0IiwiZm4iLCJtb2NrIiwicmVxdWlyZUFjdHVhbCIsInJlbmRlciIsImFjdHVhbCIsIl9fZXNNb2R1bGUiLCJpbnNlcnREaWFsb2ciLCJOb2RlIiwiY3JlYXRlIiwiY29uZmlnIiwibWVyZ2VBdHRyaWJ1dGVzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJhc3NpZ24iLCJjb25jYXQiLCJOb2RlVmlld1dyYXBwZXIiLCJfcmVmIiwiY2hpbGRyZW4iLCJjcmVhdGVFbGVtZW50IiwiUmVhY3ROb2RlVmlld1JlbmRlcmVyIiwiY29tcG9uZW50IiwiX3JlZjIiLCJvbkVkaXQiLCJvblJlbW92ZSIsIm9uQ2xpY2siLCJkZXNjcmliZSIsIm1vY2tFZGl0b3IiLCJtb2NrVXBkYXRlQXR0cmlidXRlcyIsIm1vY2tEZWxldGVOb2RlIiwiYmVmb3JlRWFjaCIsImNsZWFyQWxsTW9ja3MiLCJtb2NrQ2xlYXIiLCJkb2N1bWVudCIsImJvZHkiLCJpbm5lckhUTUwiLCJjaGFpbiIsImZvY3VzIiwicnVuIiwiYWZ0ZXJFYWNoIiwiaXQiLCJub2RlIiwiYXR0cnMiLCJ0eXBlIiwidGFnIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiLCJfcmVuZGVyIiwiZWRpdG9yIiwidXBkYXRlQXR0cmlidXRlcyIsImRlbGV0ZU5vZGUiLCJvcHRpb25zIiwiY29udGFpbmVyIiwiZXhwZWN0IiwicXVlcnlTZWxlY3RvciIsInRvQmVUcnV0aHkiLCJub3QiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwiX3JlbmRlcjIiLCJfcmVuZGVyMyIsIl9yZW5kZXI0IiwiZ2V0QnlUZXN0SWQiLCJfcmVuZGVyNSIsImF1ZGlvIiwic291cmNlIiwiZ2V0QXR0cmlidXRlIiwidG9CZSIsIl9yZW5kZXI2IiwiaWZyYW1lIiwiX3JlbmRlcjciLCJfcmVuZGVyOCIsImZpcmVFdmVudCIsImNsaWNrIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2V4dGVuc2lvbnMvX190ZXN0c19fL21lZGlhLW5vZGUtdmlldy50ZXN0LmpzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDcmVhdGUgYSBtb2NrYWJsZSBpbnNlcnREaWFsb2cgZnVuY3Rpb25cbmNvbnN0IG1vY2tJbnNlcnREaWFsb2cgPSBqZXN0LmZuKCk7XG5cbi8vIE1vY2sgcmVhY3QtZG9tIEJFRk9SRSBhbnkgaW1wb3J0cyB0aGF0IGRlcGVuZCBvbiBpdFxuamVzdC5tb2NrKCdyZWFjdC1kb20nLCAoKSA9PiAoe1xuICAuLi5qZXN0LnJlcXVpcmVBY3R1YWwoJ3JlYWN0LWRvbScpLFxuICByZW5kZXI6IGplc3QuZm4oKSxcbn0pKTtcblxuLy8gTW9jayB0aGUgaW5zZXJ0RGlhbG9nIGZ1bmN0aW9uIGluIHRoZSBtZWRpYSBtb2R1bGVcbmplc3QubW9jaygnLi4vbWVkaWEnLCAoKSA9PiB7XG4gIGNvbnN0IGFjdHVhbCA9IGplc3QucmVxdWlyZUFjdHVhbCgnLi4vbWVkaWEnKTtcbiAgcmV0dXJuIHtcbiAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgIC4uLmFjdHVhbCxcbiAgICBkZWZhdWx0OiBhY3R1YWwuZGVmYXVsdCwgLy8gUHJlc2VydmUgdGhlIGRlZmF1bHQgZXhwb3J0XG4gICAgaW5zZXJ0RGlhbG9nOiAoLi4uYXJncykgPT4gbW9ja0luc2VydERpYWxvZyguLi5hcmdzKSxcbiAgfTtcbn0pO1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyLCBmaXJlRXZlbnQgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBNZWRpYU5vZGVWaWV3IGZyb20gJy4uL21lZGlhJztcblxuamVzdC5tb2NrKCdAdGlwdGFwL2NvcmUnLCAoKSA9PiAoe1xuICBOb2RlOiB7IGNyZWF0ZTogamVzdC5mbigoY29uZmlnKSA9PiBjb25maWcpIH0sXG4gIG1lcmdlQXR0cmlidXRlczogamVzdC5mbigoLi4uYXJncykgPT4gT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncykpLFxufSkpO1xuXG5qZXN0Lm1vY2soJ0B0aXB0YXAvcmVhY3QnLCAoKSA9PiAoe1xuICBOb2RlVmlld1dyYXBwZXI6ICh7IGNoaWxkcmVuIH0pID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJub2RlLXZpZXctd3JhcHBlclwiPntjaGlsZHJlbn08L2Rpdj4sXG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvTWVkaWFEaWFsb2cnLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCgpID0+IDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS1kaWFsb2dcIiAvPiksXG59KSk7XG5cbmplc3QubW9jaygnLi4vLi4vY29tcG9uZW50cy9tZWRpYS9NZWRpYVRvb2xiYXInLCAoKSA9PiAoe1xuICBfX2VzTW9kdWxlOiB0cnVlLFxuICBkZWZhdWx0OiBqZXN0LmZuKCh7IG9uRWRpdCwgb25SZW1vdmUgfSkgPT4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJtZWRpYS10b29sYmFyXCI+XG4gICAgICA8YnV0dG9uIG9uQ2xpY2s9e29uRWRpdH0gZGF0YS10ZXN0aWQ9XCJlZGl0LWJ1dHRvblwiPlxuICAgICAgICBFZGl0IFNldHRpbmdzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gb25DbGljaz17b25SZW1vdmV9IGRhdGEtdGVzdGlkPVwicmVtb3ZlLWJ1dHRvblwiPlxuICAgICAgICBSZW1vdmVcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICApKSxcbn0pKTtcblxuZGVzY3JpYmUoJ01lZGlhTm9kZVZpZXcgQ29tcG9uZW50JywgKCkgPT4ge1xuICBsZXQgbW9ja0VkaXRvcjtcbiAgbGV0IG1vY2tVcGRhdGVBdHRyaWJ1dGVzO1xuICBsZXQgbW9ja0RlbGV0ZU5vZGU7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgbW9ja0luc2VydERpYWxvZy5tb2NrQ2xlYXIoKTtcblxuICAgIC8vIENsZWFuIHVwIGFueSBleGlzdGluZyBkaWFsb2dzIGluIHRoZSBET01cbiAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICcnO1xuXG4gICAgbW9ja0VkaXRvciA9IHtcbiAgICAgIGNoYWluOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgIGZvY3VzOiBqZXN0LmZuKCgpID0+ICh7XG4gICAgICAgICAgcnVuOiBqZXN0LmZuKCksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pKSxcbiAgICB9O1xuXG4gICAgbW9ja1VwZGF0ZUF0dHJpYnV0ZXMgPSBqZXN0LmZuKCk7XG4gICAgbW9ja0RlbGV0ZU5vZGUgPSBqZXN0LmZuKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgLy8gQ2xlYW4gdXAgRE9NIGFmdGVyIGVhY2ggdGVzdFxuICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJyc7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkaWFsb2cgYXV0by1vcGVuaW5nIGJlaGF2aW9yIC0gdmVyaWZpZXMgdGhlIGZpeCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIE5PVCBvcGVuIGRpYWxvZyBvbiBtb3VudCB3aGVuIGF1ZGlvIGhhcyBleGlzdGluZyBzcmMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBub2RlID0ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHR5cGU6ICdhdWRpbycsXG4gICAgICAgICAgdGFnOiAnYXVkaW8nLFxuICAgICAgICAgIHNyYzogJ2h0dHBzOi8vZXhhbXBsZS5jb20vYXVkaW8ubXAzJyxcbiAgICAgICAgICB3aWR0aDogbnVsbCxcbiAgICAgICAgICBoZWlnaHQ6IG51bGwsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBUaGlzIHNob3VsZCByZW5kZXIgd2l0aG91dCBvcGVuaW5nIGFueSBkaWFsb2dzXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIC8vIFZlcmlmeSB0aGUgY29tcG9uZW50IHJlbmRlcmVkIHN1Y2Nlc3NmdWxseVxuICAgICAgZXhwZWN0KGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdhdWRpbycpKS50b0JlVHJ1dGh5KCk7XG4gICAgICAvLyBWZXJpZnkgbW9ja0luc2VydERpYWxvZyB3YXMgbm90IGNhbGxlZCAoZGlhbG9nIGRpZG4ndCBvcGVuKVxuICAgICAgZXhwZWN0KG1vY2tJbnNlcnREaWFsb2cpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICAvLyBWZXJpZnkgZGVsZXRlTm9kZSB3YXMgbm90IGNhbGxlZCAobWVkaWEgd2FzIG5vdCByZW1vdmVkKVxuICAgICAgZXhwZWN0KG1vY2tEZWxldGVOb2RlKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBOT1Qgb3BlbiBkaWFsb2cgb24gbW91bnQgd2hlbiB2aWRlbyBoYXMgZXhpc3Rpbmcgc3JjJywgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgIHRhZzogJ2lmcmFtZScsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvZFF3NHc5V2dYY1EnLFxuICAgICAgICAgIHdpZHRoOiAnNjQwJyxcbiAgICAgICAgICBoZWlnaHQ6ICc0ODAnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBzaG91bGQgcmVuZGVyIHdpdGhvdXQgb3BlbmluZyBhbnkgZGlhbG9nc1xuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPE1lZGlhTm9kZVZpZXdcbiAgICAgICAgICBlZGl0b3I9e21vY2tFZGl0b3J9XG4gICAgICAgICAgbm9kZT17bm9kZX1cbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzPXttb2NrVXBkYXRlQXR0cmlidXRlc31cbiAgICAgICAgICBkZWxldGVOb2RlPXttb2NrRGVsZXRlTm9kZX1cbiAgICAgICAgICBvcHRpb25zPXt7fX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIGNvbXBvbmVudCByZW5kZXJlZCBzdWNjZXNzZnVsbHlcbiAgICAgIGV4cGVjdChjb250YWluZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIC8vIFZlcmlmeSBtb2NrSW5zZXJ0RGlhbG9nIHdhcyBub3QgY2FsbGVkIChkaWFsb2cgZGlkbid0IG9wZW4pXG4gICAgICBleHBlY3QobW9ja0luc2VydERpYWxvZykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIC8vIFZlcmlmeSBkZWxldGVOb2RlIHdhcyBub3QgY2FsbGVkIChtZWRpYSB3YXMgbm90IHJlbW92ZWQpXG4gICAgICBleHBlY3QobW9ja0RlbGV0ZU5vZGUpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlbmRlciBleGlzdGluZyBtZWRpYSB3aXRoIGVtcHR5IHN0cmluZyBzcmMgd2l0aG91dCBvcGVuaW5nIGRpYWxvZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnJywgLy8gRW1wdHkgc3RyaW5nIChmYWxzeSBidXQgbm90IG51bGwpXG4gICAgICAgICAgd2lkdGg6IG51bGwsXG4gICAgICAgICAgaGVpZ2h0OiBudWxsLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXIgfSA9IHJlbmRlcihcbiAgICAgICAgPE1lZGlhTm9kZVZpZXdcbiAgICAgICAgICBlZGl0b3I9e21vY2tFZGl0b3J9XG4gICAgICAgICAgbm9kZT17bm9kZX1cbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzPXttb2NrVXBkYXRlQXR0cmlidXRlc31cbiAgICAgICAgICBkZWxldGVOb2RlPXttb2NrRGVsZXRlTm9kZX1cbiAgICAgICAgICBvcHRpb25zPXt7fX1cbiAgICAgICAgLz4sXG4gICAgICApO1xuXG4gICAgICAvLyBFbXB0eSBzdHJpbmcgaXMgZmFsc3ksIHNvIGRpYWxvZyBXT1VMRCBvcGVuIHdpdGggY3VycmVudCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gVGhpcyBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvclxuICAgICAgZXhwZWN0KGNvbnRhaW5lcikudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9vbGJhciBpbnRlcmFjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciBlZGl0IGFuZCByZW1vdmUgYnV0dG9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnZWRpdC1idXR0b24nKSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGdldEJ5VGVzdElkKCdyZW1vdmUtYnV0dG9uJykpLnRvQmVUcnV0aHkoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbmRlcmluZycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJlbmRlciBhdWRpbyBlbGVtZW50IHdoZW4gdGFnIGlzIGF1ZGlvJywgKCkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB0eXBlOiAnYXVkaW8nLFxuICAgICAgICAgIHRhZzogJ2F1ZGlvJyxcbiAgICAgICAgICBzcmM6ICdodHRwczovL2V4YW1wbGUuY29tL2F1ZGlvLm1wMycsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lciB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGF1ZGlvID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJyk7XG4gICAgICBleHBlY3QoYXVkaW8pLnRvQmVUcnV0aHkoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGF1ZGlvLnF1ZXJ5U2VsZWN0b3IoJ3NvdXJjZScpO1xuICAgICAgZXhwZWN0KHNvdXJjZS5nZXRBdHRyaWJ1dGUoJ3NyYycpKS50b0JlKCdodHRwczovL2V4YW1wbGUuY29tL2F1ZGlvLm1wMycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW5kZXIgaWZyYW1lIHdoZW4gdGFnIGlzIGlmcmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ3ZpZGVvJyxcbiAgICAgICAgICB0YWc6ICdpZnJhbWUnLFxuICAgICAgICAgIHNyYzogJ2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL2RRdzR3OVdnWGNRJyxcbiAgICAgICAgICB3aWR0aDogJzY0MCcsXG4gICAgICAgICAgaGVpZ2h0OiAnNDgwJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgY29udGFpbmVyIH0gPSByZW5kZXIoXG4gICAgICAgIDxNZWRpYU5vZGVWaWV3XG4gICAgICAgICAgZWRpdG9yPXttb2NrRWRpdG9yfVxuICAgICAgICAgIG5vZGU9e25vZGV9XG4gICAgICAgICAgdXBkYXRlQXR0cmlidXRlcz17bW9ja1VwZGF0ZUF0dHJpYnV0ZXN9XG4gICAgICAgICAgZGVsZXRlTm9kZT17bW9ja0RlbGV0ZU5vZGV9XG4gICAgICAgICAgb3B0aW9ucz17e319XG4gICAgICAgIC8+LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgaWZyYW1lID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpO1xuICAgICAgZXhwZWN0KGlmcmFtZSkudG9CZVRydXRoeSgpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ3NyYycpKS50b0JlKCdodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9kUXc0dzlXZ1hjUScpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpLnRvQmUoJzY0MCcpO1xuICAgICAgZXhwZWN0KGlmcmFtZS5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKS50b0JlKCc0ODAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVuZGVyIE1lZGlhVG9vbGJhcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgnbWVkaWEtdG9vbGJhcicpKS50b0JlVHJ1dGh5KCk7XG4gICAgICBleHBlY3QoZ2V0QnlUZXN0SWQoJ2VkaXQtYnV0dG9uJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgIGV4cGVjdChnZXRCeVRlc3RJZCgncmVtb3ZlLWJ1dHRvbicpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNhbGwgZGVsZXRlTm9kZSB3aGVuIHJlbW92ZSBidXR0b24gaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdHlwZTogJ2F1ZGlvJyxcbiAgICAgICAgICB0YWc6ICdhdWRpbycsXG4gICAgICAgICAgc3JjOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9hdWRpby5tcDMnLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBnZXRCeVRlc3RJZCB9ID0gcmVuZGVyKFxuICAgICAgICA8TWVkaWFOb2RlVmlld1xuICAgICAgICAgIGVkaXRvcj17bW9ja0VkaXRvcn1cbiAgICAgICAgICBub2RlPXtub2RlfVxuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXM9e21vY2tVcGRhdGVBdHRyaWJ1dGVzfVxuICAgICAgICAgIGRlbGV0ZU5vZGU9e21vY2tEZWxldGVOb2RlfVxuICAgICAgICAgIG9wdGlvbnM9e3t9fVxuICAgICAgICAvPixcbiAgICAgICk7XG5cbiAgICAgIGZpcmVFdmVudC5jbGljayhnZXRCeVRlc3RJZCgncmVtb3ZlLWJ1dHRvbicpKTtcblxuICAgICAgZXhwZWN0KG1vY2tEZWxldGVOb2RlKS50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFvQkEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0Es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
|