@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,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
5
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
6
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
7
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
8
|
+
var _state = require("@tiptap/pm/state");
|
|
9
|
+
var _image = require("../image");
|
|
10
|
+
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; }
|
|
11
|
+
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; }
|
|
12
|
+
jest.mock('@tiptap/core', function () {
|
|
13
|
+
return {
|
|
14
|
+
Node: {
|
|
15
|
+
create: jest.fn(function (config) {
|
|
16
|
+
return config;
|
|
17
|
+
})
|
|
18
|
+
},
|
|
19
|
+
mergeAttributes: jest.fn(function () {
|
|
20
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
21
|
+
args[_key] = arguments[_key];
|
|
22
|
+
}
|
|
23
|
+
return Object.assign.apply(Object, [{}].concat(args));
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
jest.mock('@tiptap/pm/state', function () {
|
|
28
|
+
return {
|
|
29
|
+
Plugin: jest.fn(function MockPlugin(spec) {
|
|
30
|
+
this.spec = spec;
|
|
31
|
+
return {
|
|
32
|
+
spec: spec
|
|
33
|
+
};
|
|
34
|
+
})
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
jest.mock('@tiptap/react', function () {
|
|
38
|
+
return {
|
|
39
|
+
ReactNodeViewRenderer: jest.fn(function (component) {
|
|
40
|
+
return component;
|
|
41
|
+
})
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
jest.mock('../image-component', function () {
|
|
45
|
+
return {
|
|
46
|
+
__esModule: true,
|
|
47
|
+
"default": jest.fn(function () {
|
|
48
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
49
|
+
"data-testid": "image-component"
|
|
50
|
+
});
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
function setupPastePlugin() {
|
|
55
|
+
var insertContent = jest.fn();
|
|
56
|
+
var editor = {
|
|
57
|
+
commands: {
|
|
58
|
+
insertContent: insertContent
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
_state.Plugin.mockClear();
|
|
62
|
+
_image.ImageUploadNode.addProseMirrorPlugins.call({
|
|
63
|
+
editor: editor
|
|
64
|
+
});
|
|
65
|
+
expect(_state.Plugin).toHaveBeenCalledTimes(1);
|
|
66
|
+
var handlePaste = _state.Plugin.mock.calls[0][0].props.handlePaste;
|
|
67
|
+
return {
|
|
68
|
+
handlePaste: handlePaste,
|
|
69
|
+
insertContent: insertContent,
|
|
70
|
+
editor: editor
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
describe('ImageUploadNode', function () {
|
|
74
|
+
describe('configuration', function () {
|
|
75
|
+
it('has correct name', function () {
|
|
76
|
+
expect(_image.ImageUploadNode.name).toBe('imageUploadNode');
|
|
77
|
+
});
|
|
78
|
+
it('is in block group', function () {
|
|
79
|
+
expect(_image.ImageUploadNode.group).toBe('block');
|
|
80
|
+
});
|
|
81
|
+
it('is atomic', function () {
|
|
82
|
+
expect(_image.ImageUploadNode.atom).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('is selectable', function () {
|
|
85
|
+
expect(_image.ImageUploadNode.selectable).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('is draggable', function () {
|
|
88
|
+
expect(_image.ImageUploadNode.draggable).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('addAttributes', function () {
|
|
92
|
+
it('returns all required attributes with defaults', function () {
|
|
93
|
+
var attributes = _image.ImageUploadNode.addAttributes();
|
|
94
|
+
expect(attributes).toHaveProperty('loaded');
|
|
95
|
+
expect(attributes).toHaveProperty('deleteStatus');
|
|
96
|
+
expect(attributes).toHaveProperty('alignment');
|
|
97
|
+
expect(attributes).toHaveProperty('percent');
|
|
98
|
+
expect(attributes).toHaveProperty('width');
|
|
99
|
+
expect(attributes).toHaveProperty('height');
|
|
100
|
+
expect(attributes).toHaveProperty('src');
|
|
101
|
+
expect(attributes).toHaveProperty('alt');
|
|
102
|
+
expect(attributes.loaded).toEqual({
|
|
103
|
+
"default": false
|
|
104
|
+
});
|
|
105
|
+
expect(attributes.deleteStatus).toEqual({
|
|
106
|
+
"default": null
|
|
107
|
+
});
|
|
108
|
+
expect(attributes.alignment).toEqual({
|
|
109
|
+
"default": null
|
|
110
|
+
});
|
|
111
|
+
expect(attributes.percent).toEqual({
|
|
112
|
+
"default": null
|
|
113
|
+
});
|
|
114
|
+
expect(attributes.width).toEqual({
|
|
115
|
+
"default": null
|
|
116
|
+
});
|
|
117
|
+
expect(attributes.height).toEqual({
|
|
118
|
+
"default": null
|
|
119
|
+
});
|
|
120
|
+
expect(attributes.src).toEqual({
|
|
121
|
+
"default": null
|
|
122
|
+
});
|
|
123
|
+
expect(attributes.alt).toEqual({
|
|
124
|
+
"default": null
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
describe('parseHTML', function () {
|
|
129
|
+
it('returns array with div selector', function () {
|
|
130
|
+
var rules = _image.ImageUploadNode.parseHTML();
|
|
131
|
+
expect(Array.isArray(rules)).toBe(true);
|
|
132
|
+
expect(rules).toHaveLength(1);
|
|
133
|
+
expect(rules[0]).toHaveProperty('tag', 'img[data-type="image-upload-node"]');
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe('renderHTML', function () {
|
|
137
|
+
it('renders img tag with data-type attribute', function () {
|
|
138
|
+
var HTMLAttributes = {
|
|
139
|
+
src: 'test.jpg',
|
|
140
|
+
width: 100,
|
|
141
|
+
height: 100
|
|
142
|
+
};
|
|
143
|
+
var result = _image.ImageUploadNode.renderHTML({
|
|
144
|
+
HTMLAttributes: HTMLAttributes
|
|
145
|
+
});
|
|
146
|
+
expect(result[0]).toBe('img');
|
|
147
|
+
expect(result[1]).toEqual(_objectSpread(_objectSpread({}, HTMLAttributes), {}, {
|
|
148
|
+
'data-type': 'image-upload-node'
|
|
149
|
+
}));
|
|
150
|
+
});
|
|
151
|
+
it('merges attributes correctly', function () {
|
|
152
|
+
var HTMLAttributes = {
|
|
153
|
+
src: 'test.jpg',
|
|
154
|
+
alt: 'Test image'
|
|
155
|
+
};
|
|
156
|
+
var result = _image.ImageUploadNode.renderHTML({
|
|
157
|
+
HTMLAttributes: HTMLAttributes
|
|
158
|
+
});
|
|
159
|
+
expect(result[1].src).toBe('test.jpg');
|
|
160
|
+
expect(result[1].alt).toBe('Test image');
|
|
161
|
+
expect(result[1]['data-type']).toBe('image-upload-node');
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('addNodeView', function () {
|
|
165
|
+
it('returns ReactNodeViewRenderer result', function () {
|
|
166
|
+
var result = _image.ImageUploadNode.addNodeView();
|
|
167
|
+
expect(result).toBeDefined();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
describe('addCommands', function () {
|
|
171
|
+
it('returns setImageUploadNode command', function () {
|
|
172
|
+
var context = {
|
|
173
|
+
name: 'imageUploadNode'
|
|
174
|
+
};
|
|
175
|
+
var commands = _image.ImageUploadNode.addCommands.call(context);
|
|
176
|
+
expect(commands).toHaveProperty('setImageUploadNode');
|
|
177
|
+
expect((0, _typeof2["default"])(commands.setImageUploadNode)).toBe('function');
|
|
178
|
+
});
|
|
179
|
+
it('setImageUploadNode inserts content', function () {
|
|
180
|
+
var context = {
|
|
181
|
+
name: 'imageUploadNode'
|
|
182
|
+
};
|
|
183
|
+
var commands = _image.ImageUploadNode.addCommands.call(context);
|
|
184
|
+
var mockCommands = {
|
|
185
|
+
insertContent: jest.fn(function () {
|
|
186
|
+
return true;
|
|
187
|
+
})
|
|
188
|
+
};
|
|
189
|
+
var result = commands.setImageUploadNode()({
|
|
190
|
+
commands: mockCommands
|
|
191
|
+
});
|
|
192
|
+
expect(mockCommands.insertContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
193
|
+
type: 'imageUploadNode',
|
|
194
|
+
attrs: expect.objectContaining({
|
|
195
|
+
nodeKey: expect.any(String)
|
|
196
|
+
})
|
|
197
|
+
}));
|
|
198
|
+
expect(result).toBe(true);
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
describe('addProseMirrorPlugins', function () {
|
|
202
|
+
var mockView = {};
|
|
203
|
+
beforeEach(function () {
|
|
204
|
+
jest.spyOn(global, 'FileReader').mockImplementation(function MockFileReader() {
|
|
205
|
+
this.readAsDataURL = function readAsDataURL() {
|
|
206
|
+
var _this = this;
|
|
207
|
+
this.result = 'data:image/png;base64,Zm9v';
|
|
208
|
+
queueMicrotask(function () {
|
|
209
|
+
if (_this.onload) {
|
|
210
|
+
_this.onload();
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
afterEach(function () {
|
|
217
|
+
global.FileReader.mockRestore();
|
|
218
|
+
});
|
|
219
|
+
it('registers one paste plugin', function () {
|
|
220
|
+
var insertContent = jest.fn();
|
|
221
|
+
var editor = {
|
|
222
|
+
commands: {
|
|
223
|
+
insertContent: insertContent
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
_state.Plugin.mockClear();
|
|
227
|
+
var plugins = _image.ImageUploadNode.addProseMirrorPlugins.call({
|
|
228
|
+
editor: editor
|
|
229
|
+
});
|
|
230
|
+
expect(plugins).toHaveLength(1);
|
|
231
|
+
expect(_state.Plugin).toHaveBeenCalledTimes(1);
|
|
232
|
+
});
|
|
233
|
+
it('handlePaste returns false when clipboard has no image file', function () {
|
|
234
|
+
var _setupPastePlugin = setupPastePlugin(),
|
|
235
|
+
handlePaste = _setupPastePlugin.handlePaste;
|
|
236
|
+
var event = {
|
|
237
|
+
clipboardData: {
|
|
238
|
+
items: [{
|
|
239
|
+
kind: 'string',
|
|
240
|
+
type: 'text/plain',
|
|
241
|
+
getAsFile: function getAsFile() {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
}]
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
expect(handlePaste(mockView, event)).toBe(false);
|
|
248
|
+
});
|
|
249
|
+
it('handlePaste returns false when clipboardData is missing', function () {
|
|
250
|
+
var _setupPastePlugin2 = setupPastePlugin(),
|
|
251
|
+
handlePaste = _setupPastePlugin2.handlePaste;
|
|
252
|
+
var event = {};
|
|
253
|
+
expect(handlePaste(mockView, event)).toBe(false);
|
|
254
|
+
});
|
|
255
|
+
it('handlePaste returns false when the file item has no file', function () {
|
|
256
|
+
var _setupPastePlugin3 = setupPastePlugin(),
|
|
257
|
+
handlePaste = _setupPastePlugin3.handlePaste;
|
|
258
|
+
var event = {
|
|
259
|
+
clipboardData: {
|
|
260
|
+
items: [{
|
|
261
|
+
kind: 'file',
|
|
262
|
+
type: 'image/png',
|
|
263
|
+
getAsFile: function getAsFile() {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
}]
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
expect(handlePaste(mockView, event)).toBe(false);
|
|
270
|
+
});
|
|
271
|
+
it('handlePaste returns true and inserts imageUploadNode with data URL after read', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
272
|
+
var _setupPastePlugin4, handlePaste, insertContent, file, event;
|
|
273
|
+
return _regenerator["default"].wrap(function (_context) {
|
|
274
|
+
while (1) switch (_context.prev = _context.next) {
|
|
275
|
+
case 0:
|
|
276
|
+
_setupPastePlugin4 = setupPastePlugin(), handlePaste = _setupPastePlugin4.handlePaste, insertContent = _setupPastePlugin4.insertContent;
|
|
277
|
+
file = new File([new Uint8Array([1, 2, 3])], 'p.png', {
|
|
278
|
+
type: 'image/png'
|
|
279
|
+
});
|
|
280
|
+
event = {
|
|
281
|
+
clipboardData: {
|
|
282
|
+
items: [{
|
|
283
|
+
kind: 'file',
|
|
284
|
+
type: 'image/png',
|
|
285
|
+
getAsFile: function getAsFile() {
|
|
286
|
+
return file;
|
|
287
|
+
}
|
|
288
|
+
}]
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
expect(handlePaste(mockView, event)).toBe(true);
|
|
292
|
+
expect(insertContent).not.toHaveBeenCalled();
|
|
293
|
+
_context.next = 1;
|
|
294
|
+
return new Promise(function (resolve) {
|
|
295
|
+
return queueMicrotask(resolve);
|
|
296
|
+
});
|
|
297
|
+
case 1:
|
|
298
|
+
expect(insertContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
299
|
+
type: 'imageUploadNode',
|
|
300
|
+
attrs: expect.objectContaining({
|
|
301
|
+
src: 'data:image/png;base64,Zm9v',
|
|
302
|
+
loaded: true
|
|
303
|
+
})
|
|
304
|
+
}));
|
|
305
|
+
case 2:
|
|
306
|
+
case "end":
|
|
307
|
+
return _context.stop();
|
|
308
|
+
}
|
|
309
|
+
}, _callee);
|
|
310
|
+
})));
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc3RhdGUiLCJyZXF1aXJlIiwiX2ltYWdlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJqZXN0IiwibW9jayIsIk5vZGUiLCJjcmVhdGUiLCJmbiIsImNvbmZpZyIsIm1lcmdlQXR0cmlidXRlcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiYXNzaWduIiwiY29uY2F0IiwiUGx1Z2luIiwiTW9ja1BsdWdpbiIsInNwZWMiLCJSZWFjdE5vZGVWaWV3UmVuZGVyZXIiLCJjb21wb25lbnQiLCJfX2VzTW9kdWxlIiwiUmVhY3QiLCJjcmVhdGVFbGVtZW50Iiwic2V0dXBQYXN0ZVBsdWdpbiIsImluc2VydENvbnRlbnQiLCJlZGl0b3IiLCJjb21tYW5kcyIsIm1vY2tDbGVhciIsIkltYWdlVXBsb2FkTm9kZSIsImFkZFByb3NlTWlycm9yUGx1Z2lucyIsImNhbGwiLCJleHBlY3QiLCJ0b0hhdmVCZWVuQ2FsbGVkVGltZXMiLCJoYW5kbGVQYXN0ZSIsImNhbGxzIiwicHJvcHMiLCJkZXNjcmliZSIsIml0IiwibmFtZSIsInRvQmUiLCJncm91cCIsImF0b20iLCJzZWxlY3RhYmxlIiwiZHJhZ2dhYmxlIiwiYXR0cmlidXRlcyIsImFkZEF0dHJpYnV0ZXMiLCJ0b0hhdmVQcm9wZXJ0eSIsImxvYWRlZCIsInRvRXF1YWwiLCJkZWxldGVTdGF0dXMiLCJhbGlnbm1lbnQiLCJwZXJjZW50Iiwid2lkdGgiLCJoZWlnaHQiLCJzcmMiLCJhbHQiLCJydWxlcyIsInBhcnNlSFRNTCIsImlzQXJyYXkiLCJ0b0hhdmVMZW5ndGgiLCJIVE1MQXR0cmlidXRlcyIsInJlc3VsdCIsInJlbmRlckhUTUwiLCJhZGROb2RlVmlldyIsInRvQmVEZWZpbmVkIiwiY29udGV4dCIsImFkZENvbW1hbmRzIiwiX3R5cGVvZjIiLCJzZXRJbWFnZVVwbG9hZE5vZGUiLCJtb2NrQ29tbWFuZHMiLCJ0b0hhdmVCZWVuQ2FsbGVkV2l0aCIsIm9iamVjdENvbnRhaW5pbmciLCJ0eXBlIiwiYXR0cnMiLCJub2RlS2V5IiwiYW55IiwiU3RyaW5nIiwibW9ja1ZpZXciLCJiZWZvcmVFYWNoIiwic3B5T24iLCJnbG9iYWwiLCJtb2NrSW1wbGVtZW50YXRpb24iLCJNb2NrRmlsZVJlYWRlciIsInJlYWRBc0RhdGFVUkwiLCJfdGhpcyIsInF1ZXVlTWljcm90YXNrIiwib25sb2FkIiwiYWZ0ZXJFYWNoIiwiRmlsZVJlYWRlciIsIm1vY2tSZXN0b3JlIiwicGx1Z2lucyIsIl9zZXR1cFBhc3RlUGx1Z2luIiwiZXZlbnQiLCJjbGlwYm9hcmREYXRhIiwiaXRlbXMiLCJraW5kIiwiZ2V0QXNGaWxlIiwiX3NldHVwUGFzdGVQbHVnaW4yIiwiX3NldHVwUGFzdGVQbHVnaW4zIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfc2V0dXBQYXN0ZVBsdWdpbjQiLCJmaWxlIiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJGaWxlIiwiVWludDhBcnJheSIsIm5vdCIsInRvSGF2ZUJlZW5DYWxsZWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInN0b3AiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXh0ZW5zaW9ucy9fX3Rlc3RzX18vaW1hZ2UudGVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJqZXN0Lm1vY2soJ0B0aXB0YXAvY29yZScsICgpID0+ICh7XG4gIE5vZGU6IHsgY3JlYXRlOiBqZXN0LmZuKChjb25maWcpID0+IGNvbmZpZykgfSxcbiAgbWVyZ2VBdHRyaWJ1dGVzOiBqZXN0LmZuKCguLi5hcmdzKSA9PiBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSksXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9wbS9zdGF0ZScsICgpID0+ICh7XG4gIFBsdWdpbjogamVzdC5mbihmdW5jdGlvbiBNb2NrUGx1Z2luKHNwZWMpIHtcbiAgICB0aGlzLnNwZWMgPSBzcGVjO1xuICAgIHJldHVybiB7IHNwZWMgfTtcbiAgfSksXG59KSk7XG5cbmplc3QubW9jaygnQHRpcHRhcC9yZWFjdCcsICgpID0+ICh7XG4gIFJlYWN0Tm9kZVZpZXdSZW5kZXJlcjogamVzdC5mbigoY29tcG9uZW50KSA9PiBjb21wb25lbnQpLFxufSkpO1xuXG5qZXN0Lm1vY2soJy4uL2ltYWdlLWNvbXBvbmVudCcsICgpID0+ICh7XG4gIF9fZXNNb2R1bGU6IHRydWUsXG4gIGRlZmF1bHQ6IGplc3QuZm4oKCkgPT4gPGRpdiBkYXRhLXRlc3RpZD1cImltYWdlLWNvbXBvbmVudFwiIC8+KSxcbn0pKTtcblxuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnQHRpcHRhcC9wbS9zdGF0ZSc7XG5pbXBvcnQgeyBJbWFnZVVwbG9hZE5vZGUgfSBmcm9tICcuLi9pbWFnZSc7XG5cbmZ1bmN0aW9uIHNldHVwUGFzdGVQbHVnaW4oKSB7XG4gIGNvbnN0IGluc2VydENvbnRlbnQgPSBqZXN0LmZuKCk7XG4gIGNvbnN0IGVkaXRvciA9IHsgY29tbWFuZHM6IHsgaW5zZXJ0Q29udGVudCB9IH07XG4gIFBsdWdpbi5tb2NrQ2xlYXIoKTtcbiAgSW1hZ2VVcGxvYWROb2RlLmFkZFByb3NlTWlycm9yUGx1Z2lucy5jYWxsKHsgZWRpdG9yIH0pO1xuICBleHBlY3QoUGx1Z2luKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMSk7XG4gIGNvbnN0IGhhbmRsZVBhc3RlID0gUGx1Z2luLm1vY2suY2FsbHNbMF1bMF0ucHJvcHMuaGFuZGxlUGFzdGU7XG4gIHJldHVybiB7IGhhbmRsZVBhc3RlLCBpbnNlcnRDb250ZW50LCBlZGl0b3IgfTtcbn1cblxuZGVzY3JpYmUoJ0ltYWdlVXBsb2FkTm9kZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2NvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ2hhcyBjb3JyZWN0IG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLm5hbWUpLnRvQmUoJ2ltYWdlVXBsb2FkTm9kZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGluIGJsb2NrIGdyb3VwJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KEltYWdlVXBsb2FkTm9kZS5ncm91cCkudG9CZSgnYmxvY2snKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBhdG9taWMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLmF0b20pLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgc2VsZWN0YWJsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChJbWFnZVVwbG9hZE5vZGUuc2VsZWN0YWJsZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBkcmFnZ2FibGUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoSW1hZ2VVcGxvYWROb2RlLmRyYWdnYWJsZSkudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZEF0dHJpYnV0ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgYWxsIHJlcXVpcmVkIGF0dHJpYnV0ZXMgd2l0aCBkZWZhdWx0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBJbWFnZVVwbG9hZE5vZGUuYWRkQXR0cmlidXRlcygpO1xuXG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ2xvYWRlZCcpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdkZWxldGVTdGF0dXMnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnYWxpZ25tZW50Jyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3BlcmNlbnQnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzKS50b0hhdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcykudG9IYXZlUHJvcGVydHkoJ3NyYycpO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMpLnRvSGF2ZVByb3BlcnR5KCdhbHQnKTtcblxuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMubG9hZGVkKS50b0VxdWFsKHsgZGVmYXVsdDogZmFsc2UgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5kZWxldGVTdGF0dXMpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuYWxpZ25tZW50KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnBlcmNlbnQpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMud2lkdGgpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgICAgZXhwZWN0KGF0dHJpYnV0ZXMuaGVpZ2h0KS50b0VxdWFsKHsgZGVmYXVsdDogbnVsbCB9KTtcbiAgICAgIGV4cGVjdChhdHRyaWJ1dGVzLnNyYykudG9FcXVhbCh7IGRlZmF1bHQ6IG51bGwgfSk7XG4gICAgICBleHBlY3QoYXR0cmlidXRlcy5hbHQpLnRvRXF1YWwoeyBkZWZhdWx0OiBudWxsIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VIVE1MJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGFycmF5IHdpdGggZGl2IHNlbGVjdG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgcnVsZXMgPSBJbWFnZVVwbG9hZE5vZGUucGFyc2VIVE1MKCk7XG5cbiAgICAgIGV4cGVjdChBcnJheS5pc0FycmF5KHJ1bGVzKSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChydWxlcykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KHJ1bGVzWzBdKS50b0hhdmVQcm9wZXJ0eSgndGFnJywgJ2ltZ1tkYXRhLXR5cGU9XCJpbWFnZS11cGxvYWQtbm9kZVwiXScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVuZGVySFRNTCcsICgpID0+IHtcbiAgICBpdCgncmVuZGVycyBpbWcgdGFnIHdpdGggZGF0YS10eXBlIGF0dHJpYnV0ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IEhUTUxBdHRyaWJ1dGVzID0ge1xuICAgICAgICBzcmM6ICd0ZXN0LmpwZycsXG4gICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIGhlaWdodDogMTAwLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gSW1hZ2VVcGxvYWROb2RlLnJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KTtcblxuICAgICAgZXhwZWN0KHJlc3VsdFswXSkudG9CZSgnaW1nJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdKS50b0VxdWFsKHtcbiAgICAgICAgLi4uSFRNTEF0dHJpYnV0ZXMsXG4gICAgICAgICdkYXRhLXR5cGUnOiAnaW1hZ2UtdXBsb2FkLW5vZGUnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWVyZ2VzIGF0dHJpYnV0ZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgSFRNTEF0dHJpYnV0ZXMgPSB7XG4gICAgICAgIHNyYzogJ3Rlc3QuanBnJyxcbiAgICAgICAgYWx0OiAnVGVzdCBpbWFnZScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBJbWFnZVVwbG9hZE5vZGUucmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pO1xuXG4gICAgICBleHBlY3QocmVzdWx0WzFdLnNyYykudG9CZSgndGVzdC5qcGcnKTtcbiAgICAgIGV4cGVjdChyZXN1bHRbMV0uYWx0KS50b0JlKCdUZXN0IGltYWdlJyk7XG4gICAgICBleHBlY3QocmVzdWx0WzFdWydkYXRhLXR5cGUnXSkudG9CZSgnaW1hZ2UtdXBsb2FkLW5vZGUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZE5vZGVWaWV3JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciByZXN1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBJbWFnZVVwbG9hZE5vZGUuYWRkTm9kZVZpZXcoKTtcblxuICAgICAgZXhwZWN0KHJlc3VsdCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZENvbW1hbmRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIHNldEltYWdlVXBsb2FkTm9kZSBjb21tYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgbmFtZTogJ2ltYWdlVXBsb2FkTm9kZScgfTtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gSW1hZ2VVcGxvYWROb2RlLmFkZENvbW1hbmRzLmNhbGwoY29udGV4dCk7XG5cbiAgICAgIGV4cGVjdChjb21tYW5kcykudG9IYXZlUHJvcGVydHkoJ3NldEltYWdlVXBsb2FkTm9kZScpO1xuICAgICAgZXhwZWN0KHR5cGVvZiBjb21tYW5kcy5zZXRJbWFnZVVwbG9hZE5vZGUpLnRvQmUoJ2Z1bmN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2V0SW1hZ2VVcGxvYWROb2RlIGluc2VydHMgY29udGVudCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IG5hbWU6ICdpbWFnZVVwbG9hZE5vZGUnIH07XG4gICAgICBjb25zdCBjb21tYW5kcyA9IEltYWdlVXBsb2FkTm9kZS5hZGRDb21tYW5kcy5jYWxsKGNvbnRleHQpO1xuICAgICAgY29uc3QgbW9ja0NvbW1hbmRzID0ge1xuICAgICAgICBpbnNlcnRDb250ZW50OiBqZXN0LmZuKCgpID0+IHRydWUpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1hbmRzLnNldEltYWdlVXBsb2FkTm9kZSgpKHsgY29tbWFuZHM6IG1vY2tDb21tYW5kcyB9KTtcbiAgICAgIGV4cGVjdChtb2NrQ29tbWFuZHMuaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0eXBlOiAnaW1hZ2VVcGxvYWROb2RlJyxcbiAgICAgICAgICBhdHRyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBub2RlS2V5OiBleHBlY3QuYW55KFN0cmluZykgfSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhZGRQcm9zZU1pcnJvclBsdWdpbnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1ZpZXcgPSB7fTtcblxuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgamVzdC5zcHlPbihnbG9iYWwsICdGaWxlUmVhZGVyJykubW9ja0ltcGxlbWVudGF0aW9uKGZ1bmN0aW9uIE1vY2tGaWxlUmVhZGVyKCkge1xuICAgICAgICB0aGlzLnJlYWRBc0RhdGFVUkwgPSBmdW5jdGlvbiByZWFkQXNEYXRhVVJMKCkge1xuICAgICAgICAgIHRoaXMucmVzdWx0ID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxabTl2JztcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vbmxvYWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5vbmxvYWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgIGdsb2JhbC5GaWxlUmVhZGVyLm1vY2tSZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVnaXN0ZXJzIG9uZSBwYXN0ZSBwbHVnaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBpbnNlcnRDb250ZW50ID0gamVzdC5mbigpO1xuICAgICAgY29uc3QgZWRpdG9yID0geyBjb21tYW5kczogeyBpbnNlcnRDb250ZW50IH0gfTtcbiAgICAgIFBsdWdpbi5tb2NrQ2xlYXIoKTtcbiAgICAgIGNvbnN0IHBsdWdpbnMgPSBJbWFnZVVwbG9hZE5vZGUuYWRkUHJvc2VNaXJyb3JQbHVnaW5zLmNhbGwoeyBlZGl0b3IgfSk7XG4gICAgICBleHBlY3QocGx1Z2lucykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KFBsdWdpbikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiBjbGlwYm9hcmQgaGFzIG5vIGltYWdlIGZpbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhhbmRsZVBhc3RlIH0gPSBzZXR1cFBhc3RlUGx1Z2luKCk7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgY2xpcGJvYXJkRGF0YToge1xuICAgICAgICAgIGl0ZW1zOiBbeyBraW5kOiAnc3RyaW5nJywgdHlwZTogJ3RleHQvcGxhaW4nLCBnZXRBc0ZpbGU6ICgpID0+IG51bGwgfV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgZXhwZWN0KGhhbmRsZVBhc3RlKG1vY2tWaWV3LCBldmVudCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiBjbGlwYm9hcmREYXRhIGlzIG1pc3NpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCB7IGhhbmRsZVBhc3RlIH0gPSBzZXR1cFBhc3RlUGx1Z2luKCk7XG4gICAgICBjb25zdCBldmVudCA9IHt9O1xuICAgICAgZXhwZWN0KGhhbmRsZVBhc3RlKG1vY2tWaWV3LCBldmVudCkpLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2hhbmRsZVBhc3RlIHJldHVybnMgZmFsc2Ugd2hlbiB0aGUgZmlsZSBpdGVtIGhhcyBubyBmaWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgeyBoYW5kbGVQYXN0ZSB9ID0gc2V0dXBQYXN0ZVBsdWdpbigpO1xuICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgIGNsaXBib2FyZERhdGE6IHtcbiAgICAgICAgICBpdGVtczogW3sga2luZDogJ2ZpbGUnLCB0eXBlOiAnaW1hZ2UvcG5nJywgZ2V0QXNGaWxlOiAoKSA9PiBudWxsIH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGV4cGVjdChoYW5kbGVQYXN0ZShtb2NrVmlldywgZXZlbnQpKS50b0JlKGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYW5kbGVQYXN0ZSByZXR1cm5zIHRydWUgYW5kIGluc2VydHMgaW1hZ2VVcGxvYWROb2RlIHdpdGggZGF0YSBVUkwgYWZ0ZXIgcmVhZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaGFuZGxlUGFzdGUsIGluc2VydENvbnRlbnQgfSA9IHNldHVwUGFzdGVQbHVnaW4oKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbbmV3IFVpbnQ4QXJyYXkoWzEsIDIsIDNdKV0sICdwLnBuZycsIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG4gICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgY2xpcGJvYXJkRGF0YToge1xuICAgICAgICAgIGl0ZW1zOiBbeyBraW5kOiAnZmlsZScsIHR5cGU6ICdpbWFnZS9wbmcnLCBnZXRBc0ZpbGU6ICgpID0+IGZpbGUgfV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBleHBlY3QoaGFuZGxlUGFzdGUobW9ja1ZpZXcsIGV2ZW50KSkudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChpbnNlcnRDb250ZW50KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gcXVldWVNaWNyb3Rhc2socmVzb2x2ZSkpO1xuXG4gICAgICBleHBlY3QoaW5zZXJ0Q29udGVudCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHtcbiAgICAgICAgICB0eXBlOiAnaW1hZ2VVcGxvYWROb2RlJyxcbiAgICAgICAgICBhdHRyczogZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgICAgc3JjOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LFptOXYnLFxuICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFxQkEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQTJDLFNBQUFFLFFBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsSUFBQSxDQUFBSixDQUFBLE9BQUFHLE1BQUEsQ0FBQUUscUJBQUEsUUFBQUMsQ0FBQSxHQUFBSCxNQUFBLENBQUFFLHFCQUFBLENBQUFMLENBQUEsR0FBQUMsQ0FBQSxLQUFBSyxDQUFBLEdBQUFBLENBQUEsQ0FBQUMsTUFBQSxXQUFBTixDQUFBLFdBQUFFLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsQ0FBQSxFQUFBQyxDQUFBLEVBQUFRLFVBQUEsT0FBQVAsQ0FBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsQ0FBQSxFQUFBSSxDQUFBLFlBQUFKLENBQUE7QUFBQSxTQUFBVSxjQUFBWixDQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FBQSxHQUFBWSxTQUFBLENBQUFDLE1BQUEsRUFBQWIs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
|