@pie-lib/editable-html-tip-tap 1.0.4 → 1.0.6

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.
Files changed (111) hide show
  1. package/lib/components/MenuBar.js +7 -7
  2. package/lib/constants.js +2 -5
  3. package/package.json +1 -1
  4. package/src/components/MenuBar.jsx +1 -1
  5. package/src/constants.js +0 -2
  6. package/lib/__tests__/editor.test.js +0 -470
  7. package/lib/__tests__/serialization.test.js +0 -246
  8. package/lib/block-tags.js +0 -25
  9. package/lib/components/CharacterPicker.js.map +0 -1
  10. package/lib/components/EditableHtml.js.map +0 -1
  11. package/lib/components/MenuBar.js.map +0 -1
  12. package/lib/components/TiptapContainer.js.map +0 -1
  13. package/lib/components/buttons/done-button.js +0 -53
  14. package/lib/components/characters/characterUtils.js.map +0 -1
  15. package/lib/components/characters/custom-popper.js.map +0 -1
  16. package/lib/components/common/done-button.js.map +0 -1
  17. package/lib/components/icons/CssIcon.js.map +0 -1
  18. package/lib/components/icons/RespArea.js.map +0 -1
  19. package/lib/components/icons/TableIcons.js.map +0 -1
  20. package/lib/components/icons/TextAlign.js.map +0 -1
  21. package/lib/components/icons/index.js +0 -194
  22. package/lib/components/image/ImageToolbar.js.map +0 -1
  23. package/lib/components/image/InsertImageHandler.js.map +0 -1
  24. package/lib/components/image/alt-dialog.js +0 -2
  25. package/lib/components/media/MediaDialog.js.map +0 -1
  26. package/lib/components/media/MediaToolbar.js.map +0 -1
  27. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
  28. package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
  29. package/lib/components/respArea/DragInTheBlank.js +0 -94
  30. package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
  31. package/lib/components/respArea/InlineDropdown.js.map +0 -1
  32. package/lib/components/respArea/ToolbarIcon.js.map +0 -1
  33. package/lib/components/respArea/choice.js +0 -2
  34. package/lib/constants.js.map +0 -1
  35. package/lib/editor.js +0 -1356
  36. package/lib/extensions/MediaView.js +0 -112
  37. package/lib/extensions/characters.js +0 -65
  38. package/lib/extensions/component.js.map +0 -1
  39. package/lib/extensions/css.js.map +0 -1
  40. package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
  41. package/lib/extensions/extended-table.js.map +0 -1
  42. package/lib/extensions/image.js.map +0 -1
  43. package/lib/extensions/index.js.map +0 -1
  44. package/lib/extensions/math.js.map +0 -1
  45. package/lib/extensions/media.js.map +0 -1
  46. package/lib/extensions/responseArea.js.map +0 -1
  47. package/lib/index.js.map +0 -1
  48. package/lib/old-index.js +0 -269
  49. package/lib/parse-html.js +0 -16
  50. package/lib/plugins/characters/custom-popper.js +0 -73
  51. package/lib/plugins/characters/index.js +0 -305
  52. package/lib/plugins/characters/utils.js +0 -381
  53. package/lib/plugins/css/icons/index.js +0 -37
  54. package/lib/plugins/css/index.js +0 -390
  55. package/lib/plugins/customPlugin/index.js +0 -114
  56. package/lib/plugins/html/icons/index.js +0 -38
  57. package/lib/plugins/html/index.js +0 -81
  58. package/lib/plugins/image/__tests__/component.test.js +0 -51
  59. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -56
  60. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -26
  61. package/lib/plugins/image/__tests__/index.test.js +0 -98
  62. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -125
  63. package/lib/plugins/image/__tests__/mock-change.js +0 -25
  64. package/lib/plugins/image/alt-dialog.js +0 -129
  65. package/lib/plugins/image/component.js +0 -419
  66. package/lib/plugins/image/image-toolbar.js +0 -177
  67. package/lib/plugins/image/index.js +0 -263
  68. package/lib/plugins/image/insert-image-handler.js +0 -117
  69. package/lib/plugins/index.js +0 -341
  70. package/lib/plugins/list/__tests__/index.test.js +0 -79
  71. package/lib/plugins/list/index.js +0 -334
  72. package/lib/plugins/math/__tests__/index.test.js +0 -300
  73. package/lib/plugins/math/index.js +0 -454
  74. package/lib/plugins/media/__tests__/index.test.js +0 -71
  75. package/lib/plugins/media/index.js +0 -387
  76. package/lib/plugins/media/media-dialog.js +0 -709
  77. package/lib/plugins/media/media-toolbar.js +0 -101
  78. package/lib/plugins/media/media-wrapper.js +0 -93
  79. package/lib/plugins/rendering/index.js +0 -46
  80. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -289
  81. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -94
  82. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -120
  83. package/lib/plugins/respArea/icons/index.js +0 -95
  84. package/lib/plugins/respArea/index.js +0 -341
  85. package/lib/plugins/respArea/inline-dropdown/index.js +0 -126
  86. package/lib/plugins/respArea/math-templated/index.js +0 -130
  87. package/lib/plugins/respArea/utils.js +0 -125
  88. package/lib/plugins/table/CustomTablePlugin.js +0 -133
  89. package/lib/plugins/table/__tests__/index.test.js +0 -442
  90. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -54
  91. package/lib/plugins/table/icons/index.js +0 -69
  92. package/lib/plugins/table/index.js +0 -483
  93. package/lib/plugins/table/table-toolbar.js +0 -187
  94. package/lib/plugins/textAlign/icons/index.js +0 -194
  95. package/lib/plugins/textAlign/index.js +0 -34
  96. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -128
  97. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -51
  98. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -54
  99. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -120
  100. package/lib/plugins/toolbar/default-toolbar.js +0 -229
  101. package/lib/plugins/toolbar/done-button.js +0 -53
  102. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
  103. package/lib/plugins/toolbar/index.js +0 -34
  104. package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
  105. package/lib/plugins/toolbar/toolbar.js +0 -376
  106. package/lib/plugins/utils.js +0 -62
  107. package/lib/serialization.js +0 -677
  108. package/lib/shared/alert-dialog.js +0 -75
  109. package/lib/styles/editorContainerStyles.js.map +0 -1
  110. package/lib/theme.js.map +0 -1
  111. package/lib/utils/size.js.map +0 -1
@@ -1,483 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.serialization = exports.reactAttributes = exports.parseStyleString = exports.moveFocusToBeginningOfTable = exports["default"] = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
-
12
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
-
14
- var _react = _interopRequireDefault(require("react"));
15
-
16
- var _slate = require("slate");
17
-
18
- var _debug = _interopRequireDefault(require("debug"));
19
-
20
- var _GridOn = _interopRequireDefault(require("@material-ui/icons/GridOn"));
21
-
22
- var _tableToolbar = _interopRequireDefault(require("./table-toolbar"));
23
-
24
- var _propTypes = _interopRequireDefault(require("prop-types"));
25
-
26
- var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
27
-
28
- var _styles = require("@material-ui/core/styles");
29
-
30
- var _reactAttrConverter = _interopRequireDefault(require("react-attr-converter"));
31
-
32
- var _toStyle = require("to-style");
33
-
34
- var _CustomTablePlugin = _interopRequireDefault(require("./CustomTablePlugin"));
35
-
36
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
37
-
38
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
39
-
40
- var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:table');
41
- var Table = (0, _styles.withStyles)(function () {
42
- return {
43
- table: {}
44
- };
45
- })(function (props) {
46
- var nodeAttributes = dataToAttributes(props.node.data);
47
- return /*#__PURE__*/_react["default"].createElement("table", (0, _extends2["default"])({
48
- className: props.classes.table
49
- }, props.attributes, nodeAttributes, {
50
- onFocus: props.onFocus,
51
- onBlur: props.onBlur
52
- }), /*#__PURE__*/_react["default"].createElement("tbody", null, props.children));
53
- });
54
- Table.propTypes = {
55
- attributes: _propTypes["default"].object,
56
- onFocus: _propTypes["default"].func,
57
- onBlur: _propTypes["default"].func,
58
- node: _slatePropTypes["default"].node,
59
- children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
60
- };
61
-
62
- var TableRow = function TableRow(props) {
63
- return /*#__PURE__*/_react["default"].createElement("tr", props.attributes, props.children);
64
- };
65
-
66
- TableRow.propTypes = {
67
- attributes: _propTypes["default"].object,
68
- onFocus: _propTypes["default"].func,
69
- onBlur: _propTypes["default"].func,
70
- children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
71
- };
72
- var TableCell = (0, _styles.withStyles)(function () {
73
- return {
74
- td: {
75
- minWidth: '25px'
76
- }
77
- };
78
- })(function (props) {
79
- var Tag = props.node.data.get('header') ? 'th' : 'td';
80
- var nodeAttributes = dataToAttributes(props.node.data);
81
- delete nodeAttributes.header;
82
- return /*#__PURE__*/_react["default"].createElement(Tag, (0, _extends2["default"])({}, props.attributes, nodeAttributes, {
83
- colSpan: props.node.data.get('colspan'),
84
- className: props.classes[Tag],
85
- onFocus: props.onFocus,
86
- onBlur: props.onBlur
87
- }), props.children);
88
- });
89
- TableCell.propTypes = {
90
- attributes: _propTypes["default"].object,
91
- onFocus: _propTypes["default"].func,
92
- onBlur: _propTypes["default"].func,
93
- children: _propTypes["default"].oneOfType([_propTypes["default"].arrayOf(_propTypes["default"].node), _propTypes["default"].node]).isRequired
94
- };
95
-
96
- var moveFocusToBeginningOfTable = function moveFocusToBeginningOfTable(change) {
97
- var addedTable = change.value.document.findDescendant(function (d) {
98
- return !!d.data && !!d.data.get('newTable');
99
- });
100
-
101
- if (!addedTable) {
102
- return;
103
- }
104
-
105
- change.collapseToStartOf(addedTable);
106
- var update = addedTable.data.remove('newTable');
107
- change.setNodeByKey(addedTable.key, {
108
- data: update
109
- });
110
- };
111
-
112
- exports.moveFocusToBeginningOfTable = moveFocusToBeginningOfTable;
113
-
114
- var _default = function _default(opts, toolbarPlugins
115
- /* : {toolbar: {}}[] */
116
- ) {
117
- var core = (0, _CustomTablePlugin["default"])(opts); // fix outdated schema
118
-
119
- if (core.schema && core.schema.blocks) {
120
- Object.keys(core.schema.blocks).forEach(function (key) {
121
- var block = core.schema.blocks[key];
122
-
123
- if (block.parent) {
124
- if (block.nodes[0].types) {
125
- block.nodes[0] = {
126
- type: block.nodes[0].types[0]
127
- };
128
- }
129
-
130
- if (block.nodes[0].objects) {
131
- block.nodes[0] = {
132
- object: block.nodes[0].objects[0]
133
- };
134
- }
135
-
136
- block.parent = {
137
- type: block.parent.types[0]
138
- };
139
- } else {
140
- block.nodes[0] = {
141
- type: block.nodes[0].types[0]
142
- };
143
- }
144
- });
145
- }
146
-
147
- core.utils.getTableBlock = function (containerNode, key) {
148
- var node = containerNode.getDescendant(key);
149
- var ancestors = containerNode.getAncestors(key).push(node);
150
- return ancestors.findLast(function (p) {
151
- return p.type === 'table';
152
- });
153
- };
154
-
155
- core.utils.createTableWithOptions = function (row, columns, extra) {
156
- var createdTable = core.utils.createTable(row, columns);
157
-
158
- var newTable = _slate.Block.create(_objectSpread(_objectSpread({}, createdTable.toJSON()), extra));
159
-
160
- return newTable;
161
- };
162
-
163
- core.toolbar = {
164
- type: 'table',
165
- icon: /*#__PURE__*/_react["default"].createElement(_GridOn["default"], null),
166
- ariaLabel: 'Insert Table',
167
- onClick: function onClick(value, onChange) {
168
- log('insert table');
169
- var change = value.change();
170
- var newTable = core.utils.createTableWithOptions(2, 2, {
171
- data: {
172
- border: '1',
173
- newTable: true
174
- }
175
- });
176
- change.insertBlock(newTable);
177
- moveFocusToBeginningOfTable(change);
178
- onChange(change);
179
- },
180
- supports: function supports(node, value) {
181
- return node && node.object === 'block' && core.utils.isSelectionInTable(value);
182
- },
183
-
184
- /**
185
- * Note - the node may not be a table node - it may be a node inside a table.
186
- */
187
- customToolbar: function customToolbar(node, value, onToolbarDone, getFocusedValue) {
188
- log('[customToolbar] node.data: ', node.data);
189
- var tableBlock = core.utils.getTableBlock(value.document, node === null || node === void 0 ? void 0 : node.key);
190
- log('[customToolbar] tableBlock: ', tableBlock);
191
-
192
- var hasBorder = function hasBorder() {
193
- return tableBlock.data.get('border') && tableBlock.data.get('border') !== '0';
194
- };
195
-
196
- var addRow = function addRow() {
197
- var change = core.changes.insertRow(value.change());
198
- onToolbarDone(change, false);
199
- };
200
-
201
- var addColumn = function addColumn() {
202
- var change = core.changes.insertColumn(value.change());
203
- onToolbarDone(change, false);
204
- };
205
-
206
- var removeRow = function removeRow() {
207
- var change = core.changes.removeRow(value.change());
208
- onToolbarDone(change, false);
209
- };
210
-
211
- var removeColumn = function removeColumn() {
212
- var change = core.changes.removeColumn(value.change());
213
- onToolbarDone(change, false);
214
- };
215
-
216
- var removeTable = function removeTable() {
217
- var change = core.changes.removeTable(value.change());
218
- onToolbarDone(change, false);
219
- };
220
-
221
- var toggleBorder = function toggleBorder() {
222
- var data = tableBlock.data;
223
- var update = data.set('border', hasBorder() ? '0' : '1');
224
- log('[toggleBorder] update: ', update);
225
- var change = value.change().setNodeByKey(tableBlock.key, {
226
- data: update
227
- });
228
- onToolbarDone(change, false);
229
- };
230
-
231
- var onDone = function onDone() {
232
- log('[onDone] call onToolbarDone...');
233
- onToolbarDone(null, true);
234
- };
235
-
236
- var Tb = function Tb() {
237
- return /*#__PURE__*/_react["default"].createElement(_tableToolbar["default"], {
238
- getFocusedValue: getFocusedValue,
239
- plugins: toolbarPlugins,
240
- onChange: function onChange(c) {
241
- return onToolbarDone(c, false);
242
- },
243
- value: value,
244
- onAddRow: addRow,
245
- onRemoveRow: removeRow,
246
- onAddColumn: addColumn,
247
- onRemoveColumn: removeColumn,
248
- onRemoveTable: removeTable,
249
- hasBorder: hasBorder(),
250
- onToggleBorder: toggleBorder,
251
- onDone: onDone
252
- });
253
- };
254
-
255
- return Tb;
256
- }
257
- };
258
-
259
- var Node = function Node(props) {
260
- switch (props.node.type) {
261
- case 'table':
262
- return /*#__PURE__*/_react["default"].createElement(Table, (0, _extends2["default"])({}, props, {
263
- onFocus: opts.onFocus,
264
- onBlur: opts.onBlur
265
- }));
266
-
267
- case 'table_row':
268
- return /*#__PURE__*/_react["default"].createElement(TableRow, props);
269
-
270
- case 'table_cell':
271
- return /*#__PURE__*/_react["default"].createElement(TableCell, (0, _extends2["default"])({}, props, {
272
- onFocus: opts.onFocus,
273
- onBlur: opts.onBlur
274
- }));
275
-
276
- default:
277
- return null;
278
- }
279
- };
280
-
281
- Node.propTypes = {
282
- node: _propTypes["default"].object
283
- };
284
-
285
- core.normalizeNode = function (node) {
286
- var addNodeBeforeArray = [];
287
- if (node.object !== 'document') return;
288
- node.findDescendant(function (d) {
289
- if (d.type === 'table') {
290
- var tablePath = node.getPath(d.key);
291
- var prevNode = node.getPreviousNode(tablePath);
292
- var nextNode = node.getNextNode(tablePath);
293
-
294
- if (!prevNode || !nextNode) {
295
- addNodeBeforeArray.push({
296
- node: d,
297
- prevNode: prevNode,
298
- nextNode: nextNode
299
- });
300
- }
301
- }
302
- });
303
-
304
- if (!addNodeBeforeArray.length) {
305
- return;
306
- }
307
-
308
- return function (change) {
309
- var newBlock = {
310
- object: 'block',
311
- type: 'div'
312
- };
313
- addNodeBeforeArray.forEach(function (n) {
314
- var tablePath = change.value.document.getPath(n.node.key).toJSON(); // removing tableIndex
315
-
316
- var indexToAdd = tablePath.splice(-1)[0];
317
-
318
- if (!n.prevNode) {
319
- // inserting block key before table
320
- change.insertNodeByPath(tablePath, indexToAdd, newBlock); // this will trigger another normalization, which will figure out if there's not
321
- // a block after the table and add it, so we exit for now
322
-
323
- return;
324
- }
325
-
326
- if (!n.nextNode) {
327
- // inserting block key after table
328
- change.insertNodeByPath(tablePath, indexToAdd + 1, newBlock);
329
- }
330
- });
331
- };
332
- };
333
-
334
- core.renderNode = Node;
335
- core.name = 'table';
336
- return core;
337
- };
338
-
339
- exports["default"] = _default;
340
-
341
- var parseStyleString = function parseStyleString(s) {
342
- var regex = /([\w-]*)\s*:\s*([^;]*)/g;
343
- var match;
344
- var result = {};
345
-
346
- while (match = regex.exec(s)) {
347
- result[match[1]] = match[2].trim();
348
- }
349
-
350
- return result;
351
- };
352
-
353
- exports.parseStyleString = parseStyleString;
354
-
355
- var reactAttributes = function reactAttributes(o) {
356
- return (0, _toStyle.object)(o, {
357
- camelize: true,
358
- addUnits: false
359
- });
360
- };
361
-
362
- exports.reactAttributes = reactAttributes;
363
-
364
- var attributesToMap = function attributesToMap(el) {
365
- return function (acc, attribute) {
366
- var value = el.getAttribute(attribute);
367
-
368
- if (value) {
369
- if (attribute === 'style') {
370
- var styleString = el.getAttribute(attribute);
371
- var reactStyleObject = reactAttributes(parseStyleString(styleString));
372
- acc['style'] = reactStyleObject;
373
- } else {
374
- acc[attribute] = el.getAttribute(attribute);
375
- }
376
- }
377
-
378
- return acc;
379
- };
380
- };
381
-
382
- var dataToAttributes = function dataToAttributes(data) {
383
- if (!data || !data.get) {
384
- return {};
385
- }
386
-
387
- return data.reduce(function (acc, v, name) {
388
- if (v) {
389
- acc[(0, _reactAttrConverter["default"])(name)] = v;
390
- }
391
-
392
- return acc;
393
- }, {});
394
- };
395
-
396
- var attributes = ['border', 'cellpadding', 'cellspacing', 'class', 'style'];
397
- var cellAttributes = ['colspan', 'rowspan', 'class', 'style'];
398
- var serialization = {
399
- deserialize: function deserialize(el, next) {
400
- var tag = el.tagName.toLowerCase();
401
-
402
- switch (tag) {
403
- case 'table':
404
- {
405
- var children = el.children.length === 1 && el.children[0].tagName.toLowerCase() === 'tbody' ? el.children[0].children : el.children;
406
- var c = Array.from(children);
407
- return {
408
- object: 'block',
409
- type: 'table',
410
- nodes: next(c),
411
- data: attributes.reduce(attributesToMap(el), {})
412
- };
413
- }
414
-
415
- case 'th':
416
- {
417
- return {
418
- object: 'block',
419
- type: 'table_cell',
420
- nodes: next(el.childNodes),
421
- data: cellAttributes.reduce(attributesToMap(el), {
422
- header: true
423
- })
424
- };
425
- }
426
-
427
- case 'tr':
428
- {
429
- return {
430
- object: 'block',
431
- type: 'table_row',
432
- nodes: next(Array.from(el.children))
433
- };
434
- }
435
-
436
- case 'td':
437
- {
438
- return {
439
- object: 'block',
440
- type: 'table_cell',
441
- nodes: next(Array.from(el.childNodes)),
442
- data: cellAttributes.reduce(attributesToMap(el), {
443
- header: false
444
- })
445
- };
446
- }
447
- }
448
- },
449
- serialize: function serialize(object, children) {
450
- if (object.object !== 'block') {
451
- return;
452
- }
453
-
454
- switch (object.type) {
455
- case 'table':
456
- {
457
- var _attributes = dataToAttributes(object.data);
458
-
459
- return /*#__PURE__*/_react["default"].createElement("table", _attributes, /*#__PURE__*/_react["default"].createElement("tbody", null, children));
460
- }
461
-
462
- case 'table_row':
463
- {
464
- return /*#__PURE__*/_react["default"].createElement("tr", null, children);
465
- }
466
-
467
- case 'table_cell':
468
- {
469
- var _attributes2 = dataToAttributes(object.data);
470
-
471
- delete _attributes2.header;
472
-
473
- if (object.data.get('header')) {
474
- return /*#__PURE__*/_react["default"].createElement("th", _attributes2, children);
475
- } else {
476
- return /*#__PURE__*/_react["default"].createElement("td", _attributes2, children);
477
- }
478
- }
479
- }
480
- }
481
- };
482
- exports.serialization = serialization;
483
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL3RhYmxlL2luZGV4LmpzeCJdLCJuYW1lcyI6WyJsb2ciLCJUYWJsZSIsInRhYmxlIiwicHJvcHMiLCJub2RlQXR0cmlidXRlcyIsImRhdGFUb0F0dHJpYnV0ZXMiLCJub2RlIiwiZGF0YSIsImNsYXNzZXMiLCJhdHRyaWJ1dGVzIiwib25Gb2N1cyIsIm9uQmx1ciIsImNoaWxkcmVuIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwib2JqZWN0IiwiZnVuYyIsIlNsYXRlUHJvcFR5cGVzIiwib25lT2ZUeXBlIiwiYXJyYXlPZiIsImlzUmVxdWlyZWQiLCJUYWJsZVJvdyIsIlRhYmxlQ2VsbCIsInRkIiwibWluV2lkdGgiLCJUYWciLCJnZXQiLCJoZWFkZXIiLCJtb3ZlRm9jdXNUb0JlZ2lubmluZ09mVGFibGUiLCJjaGFuZ2UiLCJhZGRlZFRhYmxlIiwidmFsdWUiLCJkb2N1bWVudCIsImZpbmREZXNjZW5kYW50IiwiZCIsImNvbGxhcHNlVG9TdGFydE9mIiwidXBkYXRlIiwicmVtb3ZlIiwic2V0Tm9kZUJ5S2V5Iiwia2V5Iiwib3B0cyIsInRvb2xiYXJQbHVnaW5zIiwiY29yZSIsInNjaGVtYSIsImJsb2NrcyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiYmxvY2siLCJwYXJlbnQiLCJub2RlcyIsInR5cGVzIiwidHlwZSIsIm9iamVjdHMiLCJ1dGlscyIsImdldFRhYmxlQmxvY2siLCJjb250YWluZXJOb2RlIiwiZ2V0RGVzY2VuZGFudCIsImFuY2VzdG9ycyIsImdldEFuY2VzdG9ycyIsInB1c2giLCJmaW5kTGFzdCIsInAiLCJjcmVhdGVUYWJsZVdpdGhPcHRpb25zIiwicm93IiwiY29sdW1ucyIsImV4dHJhIiwiY3JlYXRlZFRhYmxlIiwiY3JlYXRlVGFibGUiLCJuZXdUYWJsZSIsIkJsb2NrIiwiY3JlYXRlIiwidG9KU09OIiwidG9vbGJhciIsImljb24iLCJhcmlhTGFiZWwiLCJvbkNsaWNrIiwib25DaGFuZ2UiLCJib3JkZXIiLCJpbnNlcnRCbG9jayIsInN1cHBvcnRzIiwiaXNTZWxlY3Rpb25JblRhYmxlIiwiY3VzdG9tVG9vbGJhciIsIm9uVG9vbGJhckRvbmUiLCJnZXRGb2N1c2VkVmFsdWUiLCJ0YWJsZUJsb2NrIiwiaGFzQm9yZGVyIiwiYWRkUm93IiwiY2hhbmdlcyIsImluc2VydFJvdyIsImFkZENvbHVtbiIsImluc2VydENvbHVtbiIsInJlbW92ZVJvdyIsInJlbW92ZUNvbHVtbiIsInJlbW92ZVRhYmxlIiwidG9nZ2xlQm9yZGVyIiwic2V0Iiwib25Eb25lIiwiVGIiLCJjIiwiTm9kZSIsIm5vcm1hbGl6ZU5vZGUiLCJhZGROb2RlQmVmb3JlQXJyYXkiLCJ0YWJsZVBhdGgiLCJnZXRQYXRoIiwicHJldk5vZGUiLCJnZXRQcmV2aW91c05vZGUiLCJuZXh0Tm9kZSIsImdldE5leHROb2RlIiwibGVuZ3RoIiwibmV3QmxvY2siLCJuIiwiaW5kZXhUb0FkZCIsInNwbGljZSIsImluc2VydE5vZGVCeVBhdGgiLCJyZW5kZXJOb2RlIiwibmFtZSIsInBhcnNlU3R5bGVTdHJpbmciLCJzIiwicmVnZXgiLCJtYXRjaCIsInJlc3VsdCIsImV4ZWMiLCJ0cmltIiwicmVhY3RBdHRyaWJ1dGVzIiwibyIsImNhbWVsaXplIiwiYWRkVW5pdHMiLCJhdHRyaWJ1dGVzVG9NYXAiLCJlbCIsImFjYyIsImF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInN0eWxlU3RyaW5nIiwicmVhY3RTdHlsZU9iamVjdCIsInJlZHVjZSIsInYiLCJjZWxsQXR0cmlidXRlcyIsInNlcmlhbGl6YXRpb24iLCJkZXNlcmlhbGl6ZSIsIm5leHQiLCJ0YWciLCJ0YWdOYW1lIiwidG9Mb3dlckNhc2UiLCJBcnJheSIsImZyb20iLCJjaGlsZE5vZGVzIiwic2VyaWFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7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QUFDUixJQUFSLENBQW5DOztBQUNBLGlCQUFPRSxZQUFVLENBQUNrQixNQUFsQjs7QUFFQSxjQUFJWixNQUFNLENBQUNSLElBQVAsQ0FBWW1CLEdBQVosQ0FBZ0IsUUFBaEIsQ0FBSixFQUErQjtBQUM3QixnQ0FBTyxzQ0FBUWpCLFlBQVIsRUFBcUJHLFFBQXJCLENBQVA7QUFDRCxXQUZELE1BRU87QUFDTCxnQ0FBTyxzQ0FBUUgsWUFBUixFQUFxQkcsUUFBckIsQ0FBUDtBQUNEO0FBQ0Y7QUF4Qkg7QUEwQkQ7QUE5RTBCLENBQXRCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IEJsb2NrIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBHcmlkT24gZnJvbSAnQG1hdGVyaWFsLXVpL2ljb25zL0dyaWRPbic7XG5pbXBvcnQgVGFibGVUb29sYmFyIGZyb20gJy4vdGFibGUtdG9vbGJhcic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFNsYXRlUHJvcFR5cGVzIGZyb20gJ3NsYXRlLXByb3AtdHlwZXMnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5pbXBvcnQgY29udmVydCBmcm9tICdyZWFjdC1hdHRyLWNvbnZlcnRlcic7XG5pbXBvcnQgeyBvYmplY3QgYXMgdG9TdHlsZU9iamVjdCB9IGZyb20gJ3RvLXN0eWxlJztcbmltcG9ydCBDdXN0b21UYWJsZVBsdWdpbiBmcm9tICcuL0N1c3RvbVRhYmxlUGx1Z2luJztcblxuY29uc3QgbG9nID0gZGVidWcoJ0BwaWUtbGliOmVkaXRhYmxlLWh0bWw6cGx1Z2luczp0YWJsZScpO1xuXG5jb25zdCBUYWJsZSA9IHdpdGhTdHlsZXMoKCkgPT4gKHtcbiAgdGFibGU6IHt9LFxufSkpKChwcm9wcykgPT4ge1xuICBjb25zdCBub2RlQXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMocHJvcHMubm9kZS5kYXRhKTtcblxuICByZXR1cm4gKFxuICAgIDx0YWJsZVxuICAgICAgY2xhc3NOYW1lPXtwcm9wcy5jbGFzc2VzLnRhYmxlfVxuICAgICAgey4uLnByb3BzLmF0dHJpYnV0ZXN9XG4gICAgICB7Li4ubm9kZUF0dHJpYnV0ZXN9XG4gICAgICBvbkZvY3VzPXtwcm9wcy5vbkZvY3VzfVxuICAgICAgb25CbHVyPXtwcm9wcy5vbkJsdXJ9XG4gICAgPlxuICAgICAgPHRib2R5Pntwcm9wcy5jaGlsZHJlbn08L3Rib2R5PlxuICAgIDwvdGFibGU+XG4gICk7XG59KTtcblxuVGFibGUucHJvcFR5cGVzID0ge1xuICBhdHRyaWJ1dGVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgbm9kZTogU2xhdGVQcm9wVHlwZXMubm9kZSxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5ub2RlKSwgUHJvcFR5cGVzLm5vZGVdKS5pc1JlcXVpcmVkLFxufTtcblxuY29uc3QgVGFibGVSb3cgPSAocHJvcHMpID0+IDx0ciB7Li4ucHJvcHMuYXR0cmlidXRlc30+e3Byb3BzLmNoaWxkcmVufTwvdHI+O1xuXG5UYWJsZVJvdy5wcm9wVHlwZXMgPSB7XG4gIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLmlzUmVxdWlyZWQsXG59O1xuXG5jb25zdCBUYWJsZUNlbGwgPSB3aXRoU3R5bGVzKCgpID0+ICh7XG4gIHRkOiB7XG4gICAgbWluV2lkdGg6ICcyNXB4JyxcbiAgfSxcbn0pKSgocHJvcHMpID0+IHtcbiAgY29uc3QgVGFnID0gcHJvcHMubm9kZS5kYXRhLmdldCgnaGVhZGVyJykgPyAndGgnIDogJ3RkJztcblxuICBjb25zdCBub2RlQXR0cmlidXRlcyA9IGRhdGFUb0F0dHJpYnV0ZXMocHJvcHMubm9kZS5kYXRhKTtcbiAgZGVsZXRlIG5vZGVBdHRyaWJ1dGVzLmhlYWRlcjtcblxuICByZXR1cm4gKFxuICAgIDxUYWdcbiAgICAgIHsuLi5wcm9wcy5hdHRyaWJ1dGVzfVxuICAgICAgey4uLm5vZGVBdHRyaWJ1dGVzfVxuICAgICAgY29sU3Bhbj17cHJvcHMubm9kZS5kYXRhLmdldCgnY29sc3BhbicpfVxuICAgICAgY2xhc3NOYW1lPXtwcm9wcy5jbGFzc2VzW1RhZ119XG4gICAgICBvbkZvY3VzPXtwcm9wcy5vbkZvY3VzfVxuICAgICAgb25CbHVyPXtwcm9wcy5vbkJsdXJ9XG4gICAgPlxuICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgIDwvVGFnPlxuICApO1xufSk7XG5cblRhYmxlQ2VsbC5wcm9wVHlwZXMgPSB7XG4gIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gIG9uRm9jdXM6IFByb3BUeXBlcy5mdW5jLFxuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLCBQcm9wVHlwZXMubm9kZV0pLmlzUmVxdWlyZWQsXG59O1xuXG5leHBvcnQgY29uc3QgbW92ZUZvY3VzVG9CZWdpbm5pbmdPZlRhYmxlID0gKGNoYW5nZSkgPT4ge1xuICBjb25zdCBhZGRlZFRhYmxlID0gY2hhbmdlLnZhbHVlLmRvY3VtZW50LmZpbmREZXNjZW5kYW50KChkKSA9PiAhIWQuZGF0YSAmJiAhIWQuZGF0YS5nZXQoJ25ld1RhYmxlJykpO1xuXG4gIGlmICghYWRkZWRUYWJsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoYW5nZS5jb2xsYXBzZVRvU3RhcnRPZihhZGRlZFRhYmxlKTtcblxuICBjb25zdCB1cGRhdGUgPSBhZGRlZFRhYmxlLmRhdGEucmVtb3ZlKCduZXdUYWJsZScpO1xuXG4gIGNoYW5nZS5zZXROb2RlQnlLZXkoYWRkZWRUYWJsZS5rZXksIHsgZGF0YTogdXBkYXRlIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgKG9wdHMsIHRvb2xiYXJQbHVnaW5zIC8qIDogIHt0b29sYmFyOiB7fX1bXSAqLykgPT4ge1xuICBjb25zdCBjb3JlID0gQ3VzdG9tVGFibGVQbHVnaW4ob3B0cyk7XG5cbiAgLy8gZml4IG91dGRhdGVkIHNjaGVtYVxuXG4gIGlmIChjb3JlLnNjaGVtYSAmJiBjb3JlLnNjaGVtYS5ibG9ja3MpIHtcbiAgICBPYmplY3Qua2V5cyhjb3JlLnNjaGVtYS5ibG9ja3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgYmxvY2sgPSBjb3JlLnNjaGVtYS5ibG9ja3Nba2V5XTtcblxuICAgICAgaWYgKGJsb2NrLnBhcmVudCkge1xuICAgICAgICBpZiAoYmxvY2subm9kZXNbMF0udHlwZXMpIHtcbiAgICAgICAgICBibG9jay5ub2Rlc1swXSA9IHtcbiAgICAgICAgICAgIHR5cGU6IGJsb2NrLm5vZGVzWzBdLnR5cGVzWzBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmxvY2subm9kZXNbMF0ub2JqZWN0cykge1xuICAgICAgICAgIGJsb2NrLm5vZGVzWzBdID0ge1xuICAgICAgICAgICAgb2JqZWN0OiBibG9jay5ub2Rlc1swXS5vYmplY3RzWzBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBibG9jay5wYXJlbnQgPSB7XG4gICAgICAgICAgdHlwZTogYmxvY2sucGFyZW50LnR5cGVzWzBdLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmxvY2subm9kZXNbMF0gPSB7IHR5cGU6IGJsb2NrLm5vZGVzWzBdLnR5cGVzWzBdIH07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb3JlLnV0aWxzLmdldFRhYmxlQmxvY2sgPSAoY29udGFpbmVyTm9kZSwga2V5KSA9PiB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnRhaW5lck5vZGUuZ2V0RGVzY2VuZGFudChrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGNvbnRhaW5lck5vZGUuZ2V0QW5jZXN0b3JzKGtleSkucHVzaChub2RlKTtcbiAgICByZXR1cm4gYW5jZXN0b3JzLmZpbmRMYXN0KChwKSA9PiBwLnR5cGUgPT09ICd0YWJsZScpO1xuICB9O1xuXG4gIGNvcmUudXRpbHMuY3JlYXRlVGFibGVXaXRoT3B0aW9ucyA9IChyb3csIGNvbHVtbnMsIGV4dHJhKSA9PiB7XG4gICAgY29uc3QgY3JlYXRlZFRhYmxlID0gY29yZS51dGlscy5jcmVhdGVUYWJsZShyb3csIGNvbHVtbnMpO1xuICAgIGNvbnN0IG5ld1RhYmxlID0gQmxvY2suY3JlYXRlKHtcbiAgICAgIC4uLmNyZWF0ZWRUYWJsZS50b0pTT04oKSxcbiAgICAgIC4uLmV4dHJhLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ld1RhYmxlO1xuICB9O1xuXG4gIGNvcmUudG9vbGJhciA9IHtcbiAgICB0eXBlOiAndGFibGUnLFxuICAgIGljb246IDxHcmlkT24gLz4sXG4gICAgYXJpYUxhYmVsOiAnSW5zZXJ0IFRhYmxlJyxcbiAgICBvbkNsaWNrOiAodmFsdWUsIG9uQ2hhbmdlKSA9PiB7XG4gICAgICBsb2coJ2luc2VydCB0YWJsZScpO1xuICAgICAgY29uc3QgY2hhbmdlID0gdmFsdWUuY2hhbmdlKCk7XG4gICAgICBjb25zdCBuZXdUYWJsZSA9IGNvcmUudXRpbHMuY3JlYXRlVGFibGVXaXRoT3B0aW9ucygyLCAyLCB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBib3JkZXI6ICcxJyxcbiAgICAgICAgICBuZXdUYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjaGFuZ2UuaW5zZXJ0QmxvY2sobmV3VGFibGUpO1xuXG4gICAgICBtb3ZlRm9jdXNUb0JlZ2lubmluZ09mVGFibGUoY2hhbmdlKTtcbiAgICAgIG9uQ2hhbmdlKGNoYW5nZSk7XG4gICAgfSxcbiAgICBzdXBwb3J0czogKG5vZGUsIHZhbHVlKSA9PiBub2RlICYmIG5vZGUub2JqZWN0ID09PSAnYmxvY2snICYmIGNvcmUudXRpbHMuaXNTZWxlY3Rpb25JblRhYmxlKHZhbHVlKSxcbiAgICAvKipcbiAgICAgKiBOb3RlIC0gdGhlIG5vZGUgbWF5IG5vdCBiZSBhIHRhYmxlIG5vZGUgLSBpdCBtYXkgYmUgYSBub2RlIGluc2lkZSBhIHRhYmxlLlxuICAgICAqL1xuICAgIGN1c3RvbVRvb2xiYXI6IChub2RlLCB2YWx1ZSwgb25Ub29sYmFyRG9uZSwgZ2V0Rm9jdXNlZFZhbHVlKSA9PiB7XG4gICAgICBsb2coJ1tjdXN0b21Ub29sYmFyXSBub2RlLmRhdGE6ICcsIG5vZGUuZGF0YSk7XG5cbiAgICAgIGNvbnN0IHRhYmxlQmxvY2sgPSBjb3JlLnV0aWxzLmdldFRhYmxlQmxvY2sodmFsdWUuZG9jdW1lbnQsIG5vZGU/LmtleSk7XG4gICAgICBsb2coJ1tjdXN0b21Ub29sYmFyXSB0YWJsZUJsb2NrOiAnLCB0YWJsZUJsb2NrKTtcblxuICAgICAgY29uc3QgaGFzQm9yZGVyID0gKCkgPT4gdGFibGVCbG9jay5kYXRhLmdldCgnYm9yZGVyJykgJiYgdGFibGVCbG9jay5kYXRhLmdldCgnYm9yZGVyJykgIT09ICcwJztcbiAgICAgIGNvbnN0IGFkZFJvdyA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLmluc2VydFJvdyh2YWx1ZS5jaGFuZ2UoKSk7XG4gICAgICAgIG9uVG9vbGJhckRvbmUoY2hhbmdlLCBmYWxzZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhZGRDb2x1bW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5nZSA9IGNvcmUuY2hhbmdlcy5pbnNlcnRDb2x1bW4odmFsdWUuY2hhbmdlKCkpO1xuICAgICAgICBvblRvb2xiYXJEb25lKGNoYW5nZSwgZmFsc2UpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVtb3ZlUm93ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSBjb3JlLmNoYW5nZXMucmVtb3ZlUm93KHZhbHVlLmNoYW5nZSgpKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlbW92ZUNvbHVtbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLnJlbW92ZUNvbHVtbih2YWx1ZS5jaGFuZ2UoKSk7XG4gICAgICAgIG9uVG9vbGJhckRvbmUoY2hhbmdlLCBmYWxzZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZW1vdmVUYWJsZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gY29yZS5jaGFuZ2VzLnJlbW92ZVRhYmxlKHZhbHVlLmNoYW5nZSgpKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHRvZ2dsZUJvcmRlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSB0YWJsZUJsb2NrO1xuICAgICAgICBjb25zdCB1cGRhdGUgPSBkYXRhLnNldCgnYm9yZGVyJywgaGFzQm9yZGVyKCkgPyAnMCcgOiAnMScpO1xuICAgICAgICBsb2coJ1t0b2dnbGVCb3JkZXJdIHVwZGF0ZTogJywgdXBkYXRlKTtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gdmFsdWUuY2hhbmdlKCkuc2V0Tm9kZUJ5S2V5KHRhYmxlQmxvY2sua2V5LCB7IGRhdGE6IHVwZGF0ZSB9KTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShjaGFuZ2UsIGZhbHNlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uRG9uZSA9ICgpID0+IHtcbiAgICAgICAgbG9nKCdbb25Eb25lXSBjYWxsIG9uVG9vbGJhckRvbmUuLi4nKTtcbiAgICAgICAgb25Ub29sYmFyRG9uZShudWxsLCB0cnVlKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IFRiID0gKCkgPT4gKFxuICAgICAgICA8VGFibGVUb29sYmFyXG4gICAgICAgICAgZ2V0Rm9jdXNlZFZhbHVlPXtnZXRGb2N1c2VkVmFsdWV9XG4gICAgICAgICAgcGx1Z2lucz17dG9vbGJhclBsdWdpbnN9XG4gICAgICAgICAgb25DaGFuZ2U9eyhjKSA9PiBvblRvb2xiYXJEb25lKGMsIGZhbHNlKX1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgb25BZGRSb3c9e2FkZFJvd31cbiAgICAgICAgICBvblJlbW92ZVJvdz17cmVtb3ZlUm93fVxuICAgICAgICAgIG9uQWRkQ29sdW1uPXthZGRDb2x1bW59XG4gICAgICAgICAgb25SZW1vdmVDb2x1bW49e3JlbW92ZUNvbHVtbn1cbiAgICAgICAgICBvblJlbW92ZVRhYmxlPXtyZW1vdmVUYWJsZX1cbiAgICAgICAgICBoYXNCb3JkZXI9e2hhc0JvcmRlcigpfVxuICAgICAgICAgIG9uVG9nZ2xlQm9yZGVyPXt0b2dnbGVCb3JkZXJ9XG4gICAgICAgICAgb25Eb25lPXtvbkRvbmV9XG4gICAgICAgIC8+XG4gICAgICApO1xuXG4gICAgICByZXR1cm4gVGI7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBOb2RlID0gKHByb3BzKSA9PiB7XG4gICAgc3dpdGNoIChwcm9wcy5ub2RlLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgICAgcmV0dXJuIDxUYWJsZSB7Li4ucHJvcHN9IG9uRm9jdXM9e29wdHMub25Gb2N1c30gb25CbHVyPXtvcHRzLm9uQmx1cn0gLz47XG4gICAgICBjYXNlICd0YWJsZV9yb3cnOlxuICAgICAgICByZXR1cm4gPFRhYmxlUm93IHsuLi5wcm9wc30gLz47XG4gICAgICBjYXNlICd0YWJsZV9jZWxsJzpcbiAgICAgICAgcmV0dXJuIDxUYWJsZUNlbGwgey4uLnByb3BzfSBvbkZvY3VzPXtvcHRzLm9uRm9jdXN9IG9uQmx1cj17b3B0cy5vbkJsdXJ9IC8+O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuICBOb2RlLnByb3BUeXBlcyA9IHtcbiAgICBub2RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICB9O1xuXG4gIGNvcmUubm9ybWFsaXplTm9kZSA9IChub2RlKSA9PiB7XG4gICAgY29uc3QgYWRkTm9kZUJlZm9yZUFycmF5ID0gW107XG5cbiAgICBpZiAobm9kZS5vYmplY3QgIT09ICdkb2N1bWVudCcpIHJldHVybjtcblxuICAgIG5vZGUuZmluZERlc2NlbmRhbnQoKGQpID0+IHtcbiAgICAgIGlmIChkLnR5cGUgPT09ICd0YWJsZScpIHtcbiAgICAgICAgY29uc3QgdGFibGVQYXRoID0gbm9kZS5nZXRQYXRoKGQua2V5KTtcbiAgICAgICAgY29uc3QgcHJldk5vZGUgPSBub2RlLmdldFByZXZpb3VzTm9kZSh0YWJsZVBhdGgpO1xuICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dE5vZGUodGFibGVQYXRoKTtcblxuICAgICAgICBpZiAoIXByZXZOb2RlIHx8ICFuZXh0Tm9kZSkge1xuICAgICAgICAgIGFkZE5vZGVCZWZvcmVBcnJheS5wdXNoKHtcbiAgICAgICAgICAgIG5vZGU6IGQsXG4gICAgICAgICAgICBwcmV2Tm9kZSxcbiAgICAgICAgICAgIG5leHROb2RlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWFkZE5vZGVCZWZvcmVBcnJheS5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNoYW5nZSkgPT4ge1xuICAgICAgY29uc3QgbmV3QmxvY2sgPSB7XG4gICAgICAgIG9iamVjdDogJ2Jsb2NrJyxcbiAgICAgICAgdHlwZTogJ2RpdicsXG4gICAgICB9O1xuXG4gICAgICBhZGROb2RlQmVmb3JlQXJyYXkuZm9yRWFjaCgobikgPT4ge1xuICAgICAgICBjb25zdCB0YWJsZVBhdGggPSBjaGFuZ2UudmFsdWUuZG9jdW1lbnQuZ2V0UGF0aChuLm5vZGUua2V5KS50b0pTT04oKTtcbiAgICAgICAgLy8gcmVtb3ZpbmcgdGFibGVJbmRleFxuICAgICAgICBsZXQgaW5kZXhUb0FkZCA9IHRhYmxlUGF0aC5zcGxpY2UoLTEpWzBdO1xuXG4gICAgICAgIGlmICghbi5wcmV2Tm9kZSkge1xuICAgICAgICAgIC8vIGluc2VydGluZyBibG9jayBrZXkgYmVmb3JlIHRhYmxlXG4gICAgICAgICAgY2hhbmdlLmluc2VydE5vZGVCeVBhdGgodGFibGVQYXRoLCBpbmRleFRvQWRkLCBuZXdCbG9jayk7XG4gICAgICAgICAgLy8gdGhpcyB3aWxsIHRyaWdnZXIgYW5vdGhlciBub3JtYWxpemF0aW9uLCB3aGljaCB3aWxsIGZpZ3VyZSBvdXQgaWYgdGhlcmUncyBub3RcbiAgICAgICAgICAvLyBhIGJsb2NrIGFmdGVyIHRoZSB0YWJsZSBhbmQgYWRkIGl0LCBzbyB3ZSBleGl0IGZvciBub3dcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW4ubmV4dE5vZGUpIHtcbiAgICAgICAgICAvLyBpbnNlcnRpbmcgYmxvY2sga2V5IGFmdGVyIHRhYmxlXG4gICAgICAgICAgY2hhbmdlLmluc2VydE5vZGVCeVBhdGgodGFibGVQYXRoLCBpbmRleFRvQWRkICsgMSwgbmV3QmxvY2spO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xuXG4gIGNvcmUucmVuZGVyTm9kZSA9IE5vZGU7XG4gIGNvcmUubmFtZSA9ICd0YWJsZSc7XG5cbiAgcmV0dXJuIGNvcmU7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VTdHlsZVN0cmluZyA9IChzKSA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXFx3LV0qKVxccyo6XFxzKihbXjtdKikvZztcbiAgbGV0IG1hdGNoO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMocykpKSB7XG4gICAgcmVzdWx0W21hdGNoWzFdXSA9IG1hdGNoWzJdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlYWN0QXR0cmlidXRlcyA9IChvKSA9PiB0b1N0eWxlT2JqZWN0KG8sIHsgY2FtZWxpemU6IHRydWUsIGFkZFVuaXRzOiBmYWxzZSB9KTtcblxuY29uc3QgYXR0cmlidXRlc1RvTWFwID0gKGVsKSA9PiAoYWNjLCBhdHRyaWJ1dGUpID0+IHtcbiAgY29uc3QgdmFsdWUgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N0eWxlJykge1xuICAgICAgY29uc3Qgc3R5bGVTdHJpbmcgPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIGNvbnN0IHJlYWN0U3R5bGVPYmplY3QgPSByZWFjdEF0dHJpYnV0ZXMocGFyc2VTdHlsZVN0cmluZyhzdHlsZVN0cmluZykpO1xuICAgICAgYWNjWydzdHlsZSddID0gcmVhY3RTdHlsZU9iamVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgYWNjW2F0dHJpYnV0ZV0gPSBlbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFjYztcbn07XG5cbmNvbnN0IGRhdGFUb0F0dHJpYnV0ZXMgPSAoZGF0YSkgPT4ge1xuICBpZiAoIWRhdGEgfHwgIWRhdGEuZ2V0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2MsIHYsIG5hbWUpID0+IHtcbiAgICBpZiAodikge1xuICAgICAgYWNjW2NvbnZlcnQobmFtZSldID0gdjtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xufTtcblxuY29uc3QgYXR0cmlidXRlcyA9IFsnYm9yZGVyJywgJ2NlbGxwYWRkaW5nJywgJ2NlbGxzcGFjaW5nJywgJ2NsYXNzJywgJ3N0eWxlJ107XG5cbmNvbnN0IGNlbGxBdHRyaWJ1dGVzID0gWydjb2xzcGFuJywgJ3Jvd3NwYW4nLCAnY2xhc3MnLCAnc3R5bGUnXTtcblxuZXhwb3J0IGNvbnN0IHNlcmlhbGl6YXRpb24gPSB7XG4gIGRlc2VyaWFsaXplKGVsLCBuZXh0KSB7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzoge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9XG4gICAgICAgICAgZWwuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmIGVsLmNoaWxkcmVuWzBdLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Rib2R5J1xuICAgICAgICAgICAgPyBlbC5jaGlsZHJlblswXS5jaGlsZHJlblxuICAgICAgICAgICAgOiBlbC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgYyA9IEFycmF5LmZyb20oY2hpbGRyZW4pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICAgICAgbm9kZXM6IG5leHQoYyksXG4gICAgICAgICAgZGF0YTogYXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwge30pLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICd0aCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBvYmplY3Q6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ3RhYmxlX2NlbGwnLFxuICAgICAgICAgIG5vZGVzOiBuZXh0KGVsLmNoaWxkTm9kZXMpLFxuICAgICAgICAgIGRhdGE6IGNlbGxBdHRyaWJ1dGVzLnJlZHVjZShhdHRyaWJ1dGVzVG9NYXAoZWwpLCB7IGhlYWRlcjogdHJ1ZSB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndHInOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZV9yb3cnLFxuICAgICAgICAgIG5vZGVzOiBuZXh0KEFycmF5LmZyb20oZWwuY2hpbGRyZW4pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndGQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICd0YWJsZV9jZWxsJyxcbiAgICAgICAgICBub2RlczogbmV4dChBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpKSxcbiAgICAgICAgICBkYXRhOiBjZWxsQXR0cmlidXRlcy5yZWR1Y2UoYXR0cmlidXRlc1RvTWFwKGVsKSwgeyBoZWFkZXI6IGZhbHNlIH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgc2VyaWFsaXplKG9iamVjdCwgY2hpbGRyZW4pIHtcbiAgICBpZiAob2JqZWN0Lm9iamVjdCAhPT0gJ2Jsb2NrJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAob2JqZWN0LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RhYmxlJzoge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGF0YVRvQXR0cmlidXRlcyhvYmplY3QuZGF0YSk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8dGFibGUgey4uLmF0dHJpYnV0ZXN9PlxuICAgICAgICAgICAgPHRib2R5PntjaGlsZHJlbn08L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3RhYmxlX3Jvdyc6IHtcbiAgICAgICAgcmV0dXJuIDx0cj57Y2hpbGRyZW59PC90cj47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3RhYmxlX2NlbGwnOiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBkYXRhVG9BdHRyaWJ1dGVzKG9iamVjdC5kYXRhKTtcbiAgICAgICAgZGVsZXRlIGF0dHJpYnV0ZXMuaGVhZGVyO1xuXG4gICAgICAgIGlmIChvYmplY3QuZGF0YS5nZXQoJ2hlYWRlcicpKSB7XG4gICAgICAgICAgcmV0dXJuIDx0aCB7Li4uYXR0cmlidXRlc30+e2NoaWxkcmVufTwvdGg+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiA8dGQgey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L3RkPjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG4iXX0=