@pie-lib/editable-html-tip-tap 1.0.5 → 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 (112) hide show
  1. package/lib/constants.js +2 -5
  2. package/package.json +1 -1
  3. package/src/constants.js +0 -2
  4. package/lib/__tests__/editor.test.js +0 -470
  5. package/lib/__tests__/serialization.test.js +0 -246
  6. package/lib/block-tags.js +0 -25
  7. package/lib/components/CharacterPicker.js.map +0 -1
  8. package/lib/components/EditableHtml.js.map +0 -1
  9. package/lib/components/MenuBar.js.map +0 -1
  10. package/lib/components/TiptapContainer.js.map +0 -1
  11. package/lib/components/buttons/done-button.js +0 -53
  12. package/lib/components/characters/characterUtils.js.map +0 -1
  13. package/lib/components/characters/custom-popper.js.map +0 -1
  14. package/lib/components/common/done-button.js.map +0 -1
  15. package/lib/components/common/toolbar-buttons.js.map +0 -1
  16. package/lib/components/icons/CssIcon.js.map +0 -1
  17. package/lib/components/icons/RespArea.js.map +0 -1
  18. package/lib/components/icons/TableIcons.js.map +0 -1
  19. package/lib/components/icons/TextAlign.js.map +0 -1
  20. package/lib/components/icons/index.js +0 -194
  21. package/lib/components/image/AltDialog.js.map +0 -1
  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/media/MediaWrapper.js.map +0 -1
  28. package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +0 -1
  29. package/lib/components/respArea/DragInTheBlank/choice.js.map +0 -1
  30. package/lib/components/respArea/DragInTheBlank.js +0 -94
  31. package/lib/components/respArea/ExplicitConstructedResponse.js.map +0 -1
  32. package/lib/components/respArea/InlineDropdown.js.map +0 -1
  33. package/lib/components/respArea/ToolbarIcon.js.map +0 -1
  34. package/lib/components/respArea/choice.js +0 -2
  35. package/lib/constants.js.map +0 -1
  36. package/lib/editor.js +0 -1356
  37. package/lib/extensions/MediaView.js +0 -112
  38. package/lib/extensions/characters.js +0 -65
  39. package/lib/extensions/component.js.map +0 -1
  40. package/lib/extensions/css.js.map +0 -1
  41. package/lib/extensions/custom-toolbar-wrapper.js.map +0 -1
  42. package/lib/extensions/extended-table.js.map +0 -1
  43. package/lib/extensions/image.js.map +0 -1
  44. package/lib/extensions/index.js.map +0 -1
  45. package/lib/extensions/math.js.map +0 -1
  46. package/lib/extensions/media.js.map +0 -1
  47. package/lib/extensions/responseArea.js.map +0 -1
  48. package/lib/index.js.map +0 -1
  49. package/lib/old-index.js +0 -269
  50. package/lib/parse-html.js +0 -16
  51. package/lib/plugins/characters/custom-popper.js +0 -73
  52. package/lib/plugins/characters/index.js +0 -305
  53. package/lib/plugins/characters/utils.js +0 -381
  54. package/lib/plugins/css/icons/index.js +0 -37
  55. package/lib/plugins/css/index.js +0 -390
  56. package/lib/plugins/customPlugin/index.js +0 -114
  57. package/lib/plugins/html/icons/index.js +0 -38
  58. package/lib/plugins/html/index.js +0 -81
  59. package/lib/plugins/image/__tests__/component.test.js +0 -51
  60. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +0 -56
  61. package/lib/plugins/image/__tests__/image-toolbar.test.js +0 -26
  62. package/lib/plugins/image/__tests__/index.test.js +0 -98
  63. package/lib/plugins/image/__tests__/insert-image-handler.test.js +0 -125
  64. package/lib/plugins/image/__tests__/mock-change.js +0 -25
  65. package/lib/plugins/image/alt-dialog.js +0 -129
  66. package/lib/plugins/image/component.js +0 -419
  67. package/lib/plugins/image/image-toolbar.js +0 -177
  68. package/lib/plugins/image/index.js +0 -263
  69. package/lib/plugins/image/insert-image-handler.js +0 -117
  70. package/lib/plugins/index.js +0 -341
  71. package/lib/plugins/list/__tests__/index.test.js +0 -79
  72. package/lib/plugins/list/index.js +0 -334
  73. package/lib/plugins/math/__tests__/index.test.js +0 -300
  74. package/lib/plugins/math/index.js +0 -454
  75. package/lib/plugins/media/__tests__/index.test.js +0 -71
  76. package/lib/plugins/media/index.js +0 -387
  77. package/lib/plugins/media/media-dialog.js +0 -709
  78. package/lib/plugins/media/media-toolbar.js +0 -101
  79. package/lib/plugins/media/media-wrapper.js +0 -93
  80. package/lib/plugins/rendering/index.js +0 -46
  81. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -289
  82. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -94
  83. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -120
  84. package/lib/plugins/respArea/icons/index.js +0 -95
  85. package/lib/plugins/respArea/index.js +0 -341
  86. package/lib/plugins/respArea/inline-dropdown/index.js +0 -126
  87. package/lib/plugins/respArea/math-templated/index.js +0 -130
  88. package/lib/plugins/respArea/utils.js +0 -125
  89. package/lib/plugins/table/CustomTablePlugin.js +0 -133
  90. package/lib/plugins/table/__tests__/index.test.js +0 -442
  91. package/lib/plugins/table/__tests__/table-toolbar.test.js +0 -54
  92. package/lib/plugins/table/icons/index.js +0 -69
  93. package/lib/plugins/table/index.js +0 -483
  94. package/lib/plugins/table/table-toolbar.js +0 -187
  95. package/lib/plugins/textAlign/icons/index.js +0 -194
  96. package/lib/plugins/textAlign/index.js +0 -34
  97. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +0 -128
  98. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +0 -51
  99. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +0 -54
  100. package/lib/plugins/toolbar/__tests__/toolbar.test.js +0 -120
  101. package/lib/plugins/toolbar/default-toolbar.js +0 -229
  102. package/lib/plugins/toolbar/done-button.js +0 -53
  103. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
  104. package/lib/plugins/toolbar/index.js +0 -34
  105. package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
  106. package/lib/plugins/toolbar/toolbar.js +0 -376
  107. package/lib/plugins/utils.js +0 -62
  108. package/lib/serialization.js +0 -677
  109. package/lib/shared/alert-dialog.js +0 -75
  110. package/lib/styles/editorContainerStyles.js.map +0 -1
  111. package/lib/theme.js.map +0 -1
  112. package/lib/utils/size.js.map +0 -1
@@ -1,334 +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["default"] = void 0;
9
-
10
- var _react = _interopRequireDefault(require("react"));
11
-
12
- var _slate = require("slate");
13
-
14
- var _immutable = _interopRequireDefault(require("immutable"));
15
-
16
- var _propTypes = _interopRequireDefault(require("prop-types"));
17
-
18
- var _slateEditList = _interopRequireDefault(require("slate-edit-list"));
19
-
20
- var _options = _interopRequireDefault(require("slate-edit-list/dist/options"));
21
-
22
- var _debug = _interopRequireDefault(require("debug"));
23
-
24
- var _this = void 0;
25
-
26
- var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:list');
27
-
28
- var b = function b(type, next, childNodes) {
29
- return {
30
- object: 'block',
31
- type: type,
32
- nodes: next(childNodes)
33
- };
34
- };
35
-
36
- var serialization = {
37
- deserialize: function deserialize(el, next) {
38
- var name = el.tagName.toLowerCase();
39
-
40
- if (name === 'li') {
41
- return b('list_item', next, el.childNodes);
42
- }
43
-
44
- if (name === 'ul') {
45
- return b('ul_list', next, el.children.length ? Array.from(el.children) : el.childNodes);
46
- }
47
-
48
- if (name === 'ol') {
49
- return b('ol_list', next, el.children.length ? Array.from(el.children) : el.childNodes);
50
- }
51
- },
52
- serialize: function serialize(object, children) {
53
- if (object.object !== 'block') return;
54
-
55
- if (object.type === 'list_item') {
56
- return /*#__PURE__*/_react["default"].createElement("li", null, children);
57
- }
58
-
59
- if (object.type === 'ul_list') {
60
- return /*#__PURE__*/_react["default"].createElement("ul", null, children);
61
- }
62
-
63
- if (object.type === 'ol_list') {
64
- return /*#__PURE__*/_react["default"].createElement("ol", null, children);
65
- }
66
- }
67
- };
68
- exports.serialization = serialization;
69
-
70
- var createEditList = function createEditList() {
71
- var core = (0, _slateEditList["default"])({
72
- typeDefault: 'span'
73
- });
74
- var listOptions = new _options["default"]({
75
- typeDefault: 'span'
76
- }); // fix outdated schema
77
-
78
- if (core.schema && core.schema.blocks) {
79
- Object.keys(core.schema.blocks).forEach(function (key) {
80
- var block = core.schema.blocks[key];
81
-
82
- if (block.parent) {
83
- return;
84
- }
85
-
86
- block.nodes[0] = {
87
- type: block.nodes[0].types[0]
88
- };
89
- });
90
- }
91
- /**
92
- * This override of the core.changes.wrapInList is needed because the version
93
- * of immutable that we have does not support getting the element at a specific
94
- * index with a square bracket (list[0]). We have to use the list.get function instead
95
- */
96
-
97
- /**
98
- * Returns the highest list of blocks that cover the current selection
99
- */
100
-
101
-
102
- var getHighestSelectedBlocks = function getHighestSelectedBlocks(value) {
103
- var range = value.selection;
104
- var document = value.document;
105
- var startBlock = document.getClosestBlock(range.startKey);
106
- var endBlock = document.getClosestBlock(range.endKey);
107
-
108
- if (startBlock === endBlock) {
109
- return _immutable["default"].List([startBlock]);
110
- }
111
-
112
- var ancestor = document.getCommonAncestor(startBlock.key, endBlock.key);
113
- var startPath = ancestor.getPath(startBlock.key);
114
- var endPath = ancestor.getPath(endBlock.key);
115
- return ancestor.nodes.slice(startPath.get(0), endPath.get(0) + 1);
116
- };
117
- /**
118
- * Wrap the blocks in the current selection in a new list. Selected
119
- * lists are merged together.
120
- */
121
-
122
-
123
- core.changes.wrapInList = function (change, type, data) {
124
- var selectedBlocks = getHighestSelectedBlocks(change.value); // Wrap in container
125
-
126
- change.wrapBlock({
127
- type: type,
128
- data: _slate.Data.create(data)
129
- }, {
130
- normalize: false
131
- }); // Wrap in list items
132
-
133
- selectedBlocks.forEach(function (node) {
134
- if (core.utils.isList(node)) {
135
- // Merge its items with the created list
136
- node.nodes.forEach(function (_ref) {
137
- var key = _ref.key;
138
- return change.unwrapNodeByKey(key, {
139
- normalize: false
140
- });
141
- });
142
- } else if (node.type !== 'list_item') {
143
- change.wrapBlockByKey(node.key, 'list_item', {
144
- normalize: false
145
- });
146
- }
147
- });
148
- return change.normalize();
149
- };
150
-
151
- core.changes.unwrapList = function unwrapList(opts, change) {
152
- var items = core.utils.getItemsAtRange(change.value);
153
-
154
- if (items.isEmpty()) {
155
- return change;
156
- } // Unwrap the items from their list
157
-
158
-
159
- items.forEach(function (item) {
160
- return change.unwrapNodeByKey(item.key, {
161
- normalize: false
162
- });
163
- }); // Parent of the list of the items
164
-
165
- var firstItem = items.first();
166
- var parent = change.value.document.getParent(firstItem.key);
167
- var index = parent.nodes.findIndex(function (node) {
168
- return node.key === firstItem.key;
169
- }); // Unwrap the items' children
170
-
171
- items.forEach(function (item) {
172
- item.nodes.forEach(function (node) {
173
- change.moveNodeByKey(node.key, parent.key, index, {
174
- normalize: false
175
- });
176
- index += 1;
177
- });
178
- }); // Finally, remove the now empty items
179
-
180
- items.forEach(function (item) {
181
- return change.removeNodeByKey(item.key, {
182
- normalize: false
183
- });
184
- });
185
- return change;
186
- }.bind(_this, listOptions);
187
-
188
- core.utils.getItemsAtRange = function (opts, value, range) {
189
- range = range || value.selection;
190
-
191
- if (!range.startKey) {
192
- return _immutable["default"].List();
193
- }
194
-
195
- var document = value.document;
196
- var startBlock = document.getClosestBlock(range.startKey);
197
- var endBlock = document.getClosestBlock(range.endKey);
198
-
199
- if (startBlock === endBlock) {
200
- var item = core.utils.getCurrentItem(value, startBlock);
201
- return item ? _immutable["default"].List([item]) : _immutable["default"].List();
202
- }
203
-
204
- var ancestor = document.getCommonAncestor(startBlock.key, endBlock.key);
205
-
206
- if (core.utils.isList(ancestor)) {
207
- var startPath = ancestor.getPath(startBlock.key);
208
- var endPath = ancestor.getPath(endBlock.key);
209
- return ancestor.nodes.slice(startPath.get(0), endPath.get(0) + 1);
210
- } else if (ancestor.type === opts.typeItem) {
211
- // The ancestor is the highest list item that covers the range
212
- return _immutable["default"].List([ancestor]);
213
- } // No list of items can cover the range
214
-
215
-
216
- return _immutable["default"].List();
217
- }.bind(_this, listOptions);
218
-
219
- core.utils.getListForItem = function (opts, value, item) {
220
- var document = value.document;
221
- var parent = document.getParent(item.key);
222
- return parent && core.utils.isList(parent) ? parent : null;
223
- }.bind(_this, listOptions);
224
-
225
- core.utils.isSelectionInList = function (opts, value, type) {
226
- var items = core.utils.getItemsAtRange(value);
227
- return !items.isEmpty() && ( // Check the type of the list if needed
228
- !type || core.utils.getListForItem(value, items.first()).get('type') === type);
229
- }.bind(_this, listOptions);
230
-
231
- return core;
232
- };
233
-
234
- var _default = function _default(options) {
235
- var type = options.type,
236
- icon = options.icon;
237
- var core = createEditList(); // eslint-disable-next-line react/display-name
238
-
239
- core.renderNode = function (props) {
240
- var node = props.node,
241
- attributes = props.attributes,
242
- children = props.children;
243
-
244
- switch (node.type) {
245
- case 'ul_list':
246
- return /*#__PURE__*/_react["default"].createElement("ul", attributes, children);
247
-
248
- case 'ol_list':
249
- return /*#__PURE__*/_react["default"].createElement("ol", attributes, children);
250
-
251
- case 'list_item':
252
- return /*#__PURE__*/_react["default"].createElement("li", attributes, children);
253
- }
254
- };
255
-
256
- core.toolbar = {
257
- isMark: false,
258
- ariaLabel: type == 'ul_list' ? 'bulleted list' : 'numbered-list',
259
- type: type,
260
- icon: icon,
261
- isActive: function isActive(value, type) {
262
- if (!core.utils.isSelectionInList(value)) {
263
- return false;
264
- }
265
-
266
- var current = core.utils.getCurrentList(value);
267
- return current ? current.type === type : false;
268
- },
269
- onClick: function onClick(value, onChange) {
270
- log('[onClick]', value);
271
- var inList = core.utils.isSelectionInList(value);
272
-
273
- if (inList) {
274
- var change = value.change().call(core.changes.unwrapList);
275
- onChange(change);
276
- } else {
277
- var _change = value.change().call(core.changes.wrapInList, type);
278
-
279
- onChange(_change);
280
- }
281
- }
282
- };
283
-
284
- core.normalizeNode = function (node) {
285
- if (node.object !== 'document' && node.object !== 'block') {
286
- return undefined;
287
- }
288
-
289
- var response = core.validateNode(node);
290
- var invalidListItems = [];
291
- node.forEachDescendant(function (d) {
292
- if (d.type === 'list_item' && d.nodes.size === 1 && d.nodes.first().object === 'text') {
293
- // if we have a list_item that has only a text inside, we need to add a block in it
294
- invalidListItems.push(d);
295
- }
296
- });
297
-
298
- if (!invalidListItems.length && !response) {
299
- return undefined;
300
- }
301
-
302
- return function (change) {
303
- if (response) {
304
- response(change);
305
- }
306
-
307
- if (invalidListItems.length) {
308
- change.withoutNormalization(function () {
309
- invalidListItems.forEach(function (node) {
310
- var textNode = node.nodes.first();
311
- var wrappedBlock = {
312
- object: 'block',
313
- type: 'div',
314
- nodes: [textNode.toJSON()]
315
- };
316
- change.removeNodeByKey(textNode.key);
317
- change.insertNodeByKey(node.key, 0, wrappedBlock);
318
- });
319
- });
320
- }
321
- };
322
- };
323
-
324
- core.renderNode.propTypes = {
325
- node: _propTypes["default"].object,
326
- attributes: _propTypes["default"].object,
327
- children: _propTypes["default"].func
328
- };
329
- core.name = type;
330
- return core;
331
- };
332
-
333
- exports["default"] = _default;
334
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW5zL2xpc3QvaW5kZXguanN4Il0sIm5hbWVzIjpbImxvZyIsImIiLCJ0eXBlIiwibmV4dCIsImNoaWxkTm9kZXMiLCJvYmplY3QiLCJub2RlcyIsInNlcmlhbGl6YXRpb24iLCJkZXNlcmlhbGl6ZSIsImVsIiwibmFtZSIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsImNoaWxkcmVuIiwibGVuZ3RoIiwiQXJyYXkiLCJmcm9tIiwic2VyaWFsaXplIiwiY3JlYXRlRWRpdExpc3QiLCJjb3JlIiwidHlwZURlZmF1bHQiLCJsaXN0T3B0aW9ucyIsIkxpc3RPcHRpb25zIiwic2NoZW1hIiwiYmxvY2tzIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJibG9jayIsInBhcmVudCIsInR5cGVzIiwiZ2V0SGlnaGVzdFNlbGVjdGVkQmxvY2tzIiwidmFsdWUiLCJyYW5nZSIsInNlbGVjdGlvbiIsImRvY3VtZW50Iiwic3RhcnRCbG9jayIsImdldENsb3Nlc3RCbG9jayIsInN0YXJ0S2V5IiwiZW5kQmxvY2siLCJlbmRLZXkiLCJJbW11dGFibGUiLCJMaXN0IiwiYW5jZXN0b3IiLCJnZXRDb21tb25BbmNlc3RvciIsInN0YXJ0UGF0aCIsImdldFBhdGgiLCJlbmRQYXRoIiwic2xpY2UiLCJnZXQiLCJjaGFuZ2VzIiwid3JhcEluTGlzdCIsImNoYW5nZSIsImRhdGEiLCJzZWxlY3RlZEJsb2NrcyIsIndyYXBCbG9jayIsIkRhdGEiLCJjcmVhdGUiLCJub3JtYWxpemUiLCJub2RlIiwidXRpbHMiLCJpc0xpc3QiLCJfcmVmIiwidW53cmFwTm9kZUJ5S2V5Iiwid3JhcEJsb2NrQnlLZXkiLCJ1bndyYXBMaXN0Iiwib3B0cyIsIml0ZW1zIiwiZ2V0SXRlbXNBdFJhbmdlIiwiaXNFbXB0eSIsIml0ZW0iLCJmaXJzdEl0ZW0iLCJmaXJzdCIsImdldFBhcmVudCIsImluZGV4IiwiZmluZEluZGV4IiwibW92ZU5vZGVCeUtleSIsInJlbW92ZU5vZGVCeUtleSIsImJpbmQiLCJnZXRDdXJyZW50SXRlbSIsInR5cGVJdGVtIiwiZ2V0TGlzdEZvckl0ZW0iLCJpc1NlbGVjdGlvbkluTGlzdCIsIm9wdGlvbnMiLCJpY29uIiwicmVuZGVyTm9kZSIsInByb3BzIiwiYXR0cmlidXRlcyIsInRvb2xiYXIiLCJpc01hcmsiLCJhcmlhTGFiZWwiLCJpc0FjdGl2ZSIsImN1cnJlbnQiLCJnZXRDdXJyZW50TGlzdCIsIm9uQ2xpY2siLCJvbkNoYW5nZSIsImluTGlzdCIsImNhbGwiLCJub3JtYWxpemVOb2RlIiwidW5kZWZpbmVkIiwicmVzcG9uc2UiLCJ2YWxpZGF0ZU5vZGUiLCJpbnZhbGlkTGlzdEl0ZW1zIiwiZm9yRWFjaERlc2NlbmRhbnQiLCJkIiwic2l6ZSIsInB1c2giLCJ3aXRob3V0Tm9ybWFsaXphdGlvbiIsInRleHROb2RlIiwid3JhcHBlZEJsb2NrIiwidG9KU09OIiwiaW5zZXJ0Tm9kZUJ5S2V5IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxJQUFNQSxHQUFHLEdBQUcsdUJBQU0scUNBQU4sQ0FBWjs7QUFFQSxJQUFNQyxDQUFDLEdBQUcsU0FBSkEsQ0FBSSxDQUFDQyxJQUFELEVBQU9DLElBQVAsRUFBYUMsVUFBYjtBQUFBLFNBQTZCO0FBQ3JDQyxJQUFBQSxNQUFNLEVBQUUsT0FENkI7QUFFckNILElBQUFBLElBQUksRUFBSkEsSUFGcUM7QUFHckNJLElBQUFBLEtBQUssRUFBRUgsSUFBSSxDQUFDQyxVQUFEO0FBSDBCLEdBQTdCO0FBQUEsQ0FBVjs7QUFNTyxJQUFNRyxhQUFhLEdBQUc7QUFDM0JDLEVBQUFBLFdBRDJCLHVCQUNmQyxFQURlLEVBQ1hOLElBRFcsRUFDTDtBQUNwQixRQUFNTyxJQUFJLEdBQUdELEVBQUUsQ0FBQ0UsT0FBSCxDQUFXQyxXQUFYLEVBQWI7O0FBRUEsUUFBSUYs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S0FGYTtBQUduQkksY0FBQUEsS0FBSyxFQUFFLENBQUN1RyxRQUFRLENBQUNFLE1BQVQsRUFBRDtBQUhZLGFBQXJCO0FBTUExRCxZQUFBQSxNQUFNLENBQUN5QixlQUFQLENBQXVCK0IsUUFBUSxDQUFDakYsR0FBaEM7QUFFQXlCLFlBQUFBLE1BQU0sQ0FBQzJELGVBQVAsQ0FBdUJwRCxJQUFJLENBQUNoQyxHQUE1QixFQUFpQyxDQUFqQyxFQUFvQ2tGLFlBQXBDO0FBQ0QsV0FYRDtBQVlELFNBYkQ7QUFjRDtBQUNGLEtBckJEO0FBc0JELEdBMUNEOztBQTRDQTNGLEVBQUFBLElBQUksQ0FBQ21FLFVBQUwsQ0FBZ0IyQixTQUFoQixHQUE0QjtBQUMxQnJELElBQUFBLElBQUksRUFBRXNELHNCQUFVN0csTUFEVTtBQUUxQm1GLElBQUFBLFVBQVUsRUFBRTBCLHNCQUFVN0csTUFGSTtBQUcxQlEsSUFBQUEsUUFBUSxFQUFFcUcsc0JBQVVDO0FBSE0sR0FBNUI7QUFLQWhHLEVBQUFBLElBQUksQ0FBQ1QsSUFBTCxHQUFZUixJQUFaO0FBRUEsU0FBT2lCLElBQVA7QUFDRCxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IERhdGEgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgSW1tdXRhYmxlIGZyb20gJ2ltbXV0YWJsZSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IEVkaXRMaXN0IGZyb20gJ3NsYXRlLWVkaXQtbGlzdCc7XG5pbXBvcnQgTGlzdE9wdGlvbnMgZnJvbSAnc2xhdGUtZWRpdC1saXN0L2Rpc3Qvb3B0aW9ucyc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuXG5jb25zdCBsb2cgPSBkZWJ1ZygnQHBpZS1saWI6ZWRpdGFibGUtaHRtbDpwbHVnaW5zOmxpc3QnKTtcblxuY29uc3QgYiA9ICh0eXBlLCBuZXh0LCBjaGlsZE5vZGVzKSA9PiAoe1xuICBvYmplY3Q6ICdibG9jaycsXG4gIHR5cGUsXG4gIG5vZGVzOiBuZXh0KGNoaWxkTm9kZXMpLFxufSk7XG5cbmV4cG9ydCBjb25zdCBzZXJpYWxpemF0aW9uID0ge1xuICBkZXNlcmlhbGl6ZShlbCwgbmV4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAobmFtZSA9PT0gJ2xpJykge1xuICAgICAgcmV0dXJuIGIoJ2xpc3RfaXRlbScsIG5leHQsIGVsLmNoaWxkTm9kZXMpO1xuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAndWwnKSB7XG4gICAgICByZXR1cm4gYigndWxfbGlzdCcsIG5leHQsIGVsLmNoaWxkcmVuLmxlbmd0aCA/IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pIDogZWwuY2hpbGROb2Rlcyk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgPT09ICdvbCcpIHtcbiAgICAgIHJldHVybiBiKCdvbF9saXN0JywgbmV4dCwgZWwuY2hpbGRyZW4ubGVuZ3RoID8gQXJyYXkuZnJvbShlbC5jaGlsZHJlbikgOiBlbC5jaGlsZE5vZGVzKTtcbiAgICB9XG4gIH0sXG4gIHNlcmlhbGl6ZShvYmplY3QsIGNoaWxkcmVuKSB7XG4gICAgaWYgKG9iamVjdC5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGlmIChvYmplY3QudHlwZSA9PT0gJ2xpc3RfaXRlbScpIHtcbiAgICAgIHJldHVybiA8bGk+e2NoaWxkcmVufTwvbGk+O1xuICAgIH1cblxuICAgIGlmIChvYmplY3QudHlwZSA9PT0gJ3VsX2xpc3QnKSB7XG4gICAgICByZXR1cm4gPHVsPntjaGlsZHJlbn08L3VsPjtcbiAgICB9XG5cbiAgICBpZiAob2JqZWN0LnR5cGUgPT09ICdvbF9saXN0Jykge1xuICAgICAgcmV0dXJuIDxvbD57Y2hpbGRyZW59PC9vbD47XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY3JlYXRlRWRpdExpc3QgPSAoKSA9PiB7XG4gIGNvbnN0IGNvcmUgPSBFZGl0TGlzdCh7XG4gICAgdHlwZURlZmF1bHQ6ICdzcGFuJyxcbiAgfSk7XG5cbiAgY29uc3QgbGlzdE9wdGlvbnMgPSBuZXcgTGlzdE9wdGlvbnMoe1xuICAgIHR5cGVEZWZhdWx0OiAnc3BhbicsXG4gIH0pO1xuXG4gIC8vIGZpeCBvdXRkYXRlZCBzY2hlbWFcbiAgaWYgKGNvcmUuc2NoZW1hICYmIGNvcmUuc2NoZW1hLmJsb2Nrcykge1xuICAgIE9iamVjdC5rZXlzKGNvcmUuc2NoZW1hLmJsb2NrcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBibG9jayA9IGNvcmUuc2NoZW1hLmJsb2Nrc1trZXldO1xuXG4gICAgICBpZiAoYmxvY2sucGFyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYmxvY2subm9kZXNbMF0gPSB7IHR5cGU6IGJsb2NrLm5vZGVzWzBdLnR5cGVzWzBdIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBvdmVycmlkZSBvZiB0aGUgY29yZS5jaGFuZ2VzLndyYXBJbkxpc3QgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHZlcnNpb25cbiAgICogb2YgaW1tdXRhYmxlIHRoYXQgd2UgaGF2ZSBkb2VzIG5vdCBzdXBwb3J0IGdldHRpbmcgdGhlIGVsZW1lbnQgYXQgYSBzcGVjaWZpY1xuICAgKiBpbmRleCB3aXRoIGEgc3F1YXJlIGJyYWNrZXQgKGxpc3RbMF0pLiBXZSBoYXZlIHRvIHVzZSB0aGUgbGlzdC5nZXQgZnVuY3Rpb24gaW5zdGVhZFxuICAgKi9cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaGlnaGVzdCBsaXN0IG9mIGJsb2NrcyB0aGF0IGNvdmVyIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgKi9cbiAgY29uc3QgZ2V0SGlnaGVzdFNlbGVjdGVkQmxvY2tzID0gKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgcmFuZ2UgPSB2YWx1ZS5zZWxlY3Rpb247XG4gICAgY29uc3QgZG9jdW1lbnQgPSB2YWx1ZS5kb2N1bWVudDtcblxuICAgIGNvbnN0IHN0YXJ0QmxvY2sgPSBkb2N1bWVudC5nZXRDbG9zZXN0QmxvY2socmFuZ2Uuc3RhcnRLZXkpO1xuICAgIGNvbnN0IGVuZEJsb2NrID0gZG9jdW1lbnQuZ2V0Q2xvc2VzdEJsb2NrKHJhbmdlLmVuZEtleSk7XG5cbiAgICBpZiAoc3RhcnRCbG9jayA9PT0gZW5kQmxvY2spIHtcbiAgICAgIHJldHVybiBJbW11dGFibGUuTGlzdChbc3RhcnRCbG9ja10pO1xuICAgIH1cblxuICAgIGNvbnN0IGFuY2VzdG9yID0gZG9jdW1lbnQuZ2V0Q29tbW9uQW5jZXN0b3Ioc3RhcnRCbG9jay5rZXksIGVuZEJsb2NrLmtleSk7XG4gICAgY29uc3Qgc3RhcnRQYXRoID0gYW5jZXN0b3IuZ2V0UGF0aChzdGFydEJsb2NrLmtleSk7XG4gICAgY29uc3QgZW5kUGF0aCA9IGFuY2VzdG9yLmdldFBhdGgoZW5kQmxvY2sua2V5KTtcblxuICAgIHJldHVybiBhbmNlc3Rvci5ub2Rlcy5zbGljZShzdGFydFBhdGguZ2V0KDApLCBlbmRQYXRoLmdldCgwKSArIDEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBibG9ja3MgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgbmV3IGxpc3QuIFNlbGVjdGVkXG4gICAqIGxpc3RzIGFyZSBtZXJnZWQgdG9nZXRoZXIuXG4gICAqL1xuICBjb3JlLmNoYW5nZXMud3JhcEluTGlzdCA9IGZ1bmN0aW9uKGNoYW5nZSwgdHlwZSwgZGF0YSkge1xuICAgIGNvbnN0IHNlbGVjdGVkQmxvY2tzID0gZ2V0SGlnaGVzdFNlbGVjdGVkQmxvY2tzKGNoYW5nZS52YWx1ZSk7XG5cbiAgICAvLyBXcmFwIGluIGNvbnRhaW5lclxuICAgIGNoYW5nZS53cmFwQmxvY2soeyB0eXBlOiB0eXBlLCBkYXRhOiBEYXRhLmNyZWF0ZShkYXRhKSB9LCB7IG5vcm1hbGl6ZTogZmFsc2UgfSk7XG5cbiAgICAvLyBXcmFwIGluIGxpc3QgaXRlbXNcbiAgICBzZWxlY3RlZEJsb2Nrcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChjb3JlLnV0aWxzLmlzTGlzdChub2RlKSkge1xuICAgICAgICAvLyBNZXJnZSBpdHMgaXRlbXMgd2l0aCB0aGUgY3JlYXRlZCBsaXN0XG4gICAgICAgIG5vZGUubm9kZXMuZm9yRWFjaChmdW5jdGlvbihfcmVmKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gX3JlZi5rZXk7XG4gICAgICAgICAgcmV0dXJuIGNoYW5nZS51bndyYXBOb2RlQnlLZXkoa2V5LCB7IG5vcm1hbGl6ZTogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgIT09ICdsaXN0X2l0ZW0nKSB7XG4gICAgICAgIGNoYW5nZS53cmFwQmxvY2tCeUtleShub2RlLmtleSwgJ2xpc3RfaXRlbScsIHtcbiAgICAgICAgICBub3JtYWxpemU6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjaGFuZ2Uubm9ybWFsaXplKCk7XG4gIH07XG5cbiAgY29yZS5jaGFuZ2VzLnVud3JhcExpc3QgPSBmdW5jdGlvbiB1bndyYXBMaXN0KG9wdHMsIGNoYW5nZSkge1xuICAgIGNvbnN0IGl0ZW1zID0gY29yZS51dGlscy5nZXRJdGVtc0F0UmFuZ2UoY2hhbmdlLnZhbHVlKTtcblxuICAgIGlmIChpdGVtcy5pc0VtcHR5KCkpIHtcbiAgICAgIHJldHVybiBjaGFuZ2U7XG4gICAgfVxuXG4gICAgLy8gVW53cmFwIHRoZSBpdGVtcyBmcm9tIHRoZWlyIGxpc3RcbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiBjaGFuZ2UudW53cmFwTm9kZUJ5S2V5KGl0ZW0ua2V5LCB7IG5vcm1hbGl6ZTogZmFsc2UgfSkpO1xuXG4gICAgLy8gUGFyZW50IG9mIHRoZSBsaXN0IG9mIHRoZSBpdGVtc1xuICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zLmZpcnN0KCk7XG4gICAgY29uc3QgcGFyZW50ID0gY2hhbmdlLnZhbHVlLmRvY3VtZW50LmdldFBhcmVudChmaXJzdEl0ZW0ua2V5KTtcblxuICAgIGxldCBpbmRleCA9IHBhcmVudC5ub2Rlcy5maW5kSW5kZXgoKG5vZGUpID0+IG5vZGUua2V5ID09PSBmaXJzdEl0ZW0ua2V5KTtcblxuICAgIC8vIFVud3JhcCB0aGUgaXRlbXMnIGNoaWxkcmVuXG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaXRlbS5ub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIGNoYW5nZS5tb3ZlTm9kZUJ5S2V5KG5vZGUua2V5LCBwYXJlbnQua2V5LCBpbmRleCwge1xuICAgICAgICAgIG5vcm1hbGl6ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBGaW5hbGx5LCByZW1vdmUgdGhlIG5vdyBlbXB0eSBpdGVtc1xuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IGNoYW5nZS5yZW1vdmVOb2RlQnlLZXkoaXRlbS5rZXksIHsgbm9ybWFsaXplOiBmYWxzZSB9KSk7XG5cbiAgICByZXR1cm4gY2hhbmdlO1xuICB9LmJpbmQodGhpcywgbGlzdE9wdGlvbnMpO1xuXG4gIGNvcmUudXRpbHMuZ2V0SXRlbXNBdFJhbmdlID0gZnVuY3Rpb24ob3B0cywgdmFsdWUsIHJhbmdlKSB7XG4gICAgcmFuZ2UgPSByYW5nZSB8fCB2YWx1ZS5zZWxlY3Rpb247XG5cbiAgICBpZiAoIXJhbmdlLnN0YXJ0S2V5KSB7XG4gICAgICByZXR1cm4gSW1tdXRhYmxlLkxpc3QoKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGRvY3VtZW50IH0gPSB2YWx1ZTtcblxuICAgIGNvbnN0IHN0YXJ0QmxvY2sgPSBkb2N1bWVudC5nZXRDbG9zZXN0QmxvY2socmFuZ2Uuc3RhcnRLZXkpO1xuICAgIGNvbnN0IGVuZEJsb2NrID0gZG9jdW1lbnQuZ2V0Q2xvc2VzdEJsb2NrKHJhbmdlLmVuZEtleSk7XG5cbiAgICBpZiAoc3RhcnRCbG9jayA9PT0gZW5kQmxvY2spIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBjb3JlLnV0aWxzLmdldEN1cnJlbnRJdGVtKHZhbHVlLCBzdGFydEJsb2NrKTtcbiAgICAgIHJldHVybiBpdGVtID8gSW1tdXRhYmxlLkxpc3QoW2l0ZW1dKSA6IEltbXV0YWJsZS5MaXN0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jZXN0b3IgPSBkb2N1bWVudC5nZXRDb21tb25BbmNlc3RvcihzdGFydEJsb2NrLmtleSwgZW5kQmxvY2sua2V5KTtcblxuICAgIGlmIChjb3JlLnV0aWxzLmlzTGlzdChhbmNlc3RvcikpIHtcbiAgICAgIGNvbnN0IHN0YXJ0UGF0aCA9IGFuY2VzdG9yLmdldFBhdGgoc3RhcnRCbG9jay5rZXkpO1xuICAgICAgY29uc3QgZW5kUGF0aCA9IGFuY2VzdG9yLmdldFBhdGgoZW5kQmxvY2sua2V5KTtcblxuICAgICAgcmV0dXJuIGFuY2VzdG9yLm5vZGVzLnNsaWNlKHN0YXJ0UGF0aC5nZXQoMCksIGVuZFBhdGguZ2V0KDApICsgMSk7XG4gICAgfSBlbHNlIGlmIChhbmNlc3Rvci50eXBlID09PSBvcHRzLnR5cGVJdGVtKSB7XG4gICAgICAvLyBUaGUgYW5jZXN0b3IgaXMgdGhlIGhpZ2hlc3QgbGlzdCBpdGVtIHRoYXQgY292ZXJzIHRoZSByYW5nZVxuICAgICAgcmV0dXJuIEltbXV0YWJsZS5MaXN0KFthbmNlc3Rvcl0pO1xuICAgIH1cbiAgICAvLyBObyBsaXN0IG9mIGl0ZW1zIGNhbiBjb3ZlciB0aGUgcmFuZ2VcbiAgICByZXR1cm4gSW1tdXRhYmxlLkxpc3QoKTtcbiAgfS5iaW5kKHRoaXMsIGxpc3RPcHRpb25zKTtcblxuICBjb3JlLnV0aWxzLmdldExpc3RGb3JJdGVtID0gZnVuY3Rpb24ob3B0cywgdmFsdWUsIGl0ZW0pIHtcbiAgICBjb25zdCB7IGRvY3VtZW50IH0gPSB2YWx1ZTtcbiAgICBjb25zdCBwYXJlbnQgPSBkb2N1bWVudC5nZXRQYXJlbnQoaXRlbS5rZXkpO1xuICAgIHJldHVybiBwYXJlbnQgJiYgY29yZS51dGlscy5pc0xpc3QocGFyZW50KSA/IHBhcmVudCA6IG51bGw7XG4gIH0uYmluZCh0aGlzLCBsaXN0T3B0aW9ucyk7XG5cbiAgY29yZS51dGlscy5pc1NlbGVjdGlvbkluTGlzdCA9IGZ1bmN0aW9uKG9wdHMsIHZhbHVlLCB0eXBlKSB7XG4gICAgY29uc3QgaXRlbXMgPSBjb3JlLnV0aWxzLmdldEl0ZW1zQXRSYW5nZSh2YWx1ZSk7XG4gICAgcmV0dXJuIChcbiAgICAgICFpdGVtcy5pc0VtcHR5KCkgJiZcbiAgICAgIC8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBsaXN0IGlmIG5lZWRlZFxuICAgICAgKCF0eXBlIHx8IGNvcmUudXRpbHMuZ2V0TGlzdEZvckl0ZW0odmFsdWUsIGl0ZW1zLmZpcnN0KCkpLmdldCgndHlwZScpID09PSB0eXBlKVxuICAgICk7XG4gIH0uYmluZCh0aGlzLCBsaXN0T3B0aW9ucyk7XG5cbiAgcmV0dXJuIGNvcmU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAob3B0aW9ucykgPT4ge1xuICBjb25zdCB7IHR5cGUsIGljb24gfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgY29yZSA9IGNyZWF0ZUVkaXRMaXN0KCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2Rpc3BsYXktbmFtZVxuICBjb3JlLnJlbmRlck5vZGUgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IG5vZGUsIGF0dHJpYnV0ZXMsIGNoaWxkcmVuIH0gPSBwcm9wcztcblxuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICBjYXNlICd1bF9saXN0JzpcbiAgICAgICAgcmV0dXJuIDx1bCB7Li4uYXR0cmlidXRlc30+e2NoaWxkcmVufTwvdWw+O1xuICAgICAgY2FzZSAnb2xfbGlzdCc6XG4gICAgICAgIHJldHVybiA8b2wgey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L29sPjtcbiAgICAgIGNhc2UgJ2xpc3RfaXRlbSc6XG4gICAgICAgIHJldHVybiA8bGkgey4uLmF0dHJpYnV0ZXN9PntjaGlsZHJlbn08L2xpPjtcbiAgICB9XG4gIH07XG5cbiAgY29yZS50b29sYmFyID0ge1xuICAgIGlzTWFyazogZmFsc2UsXG4gICAgYXJpYUxhYmVsOiB0eXBlID09ICd1bF9saXN0JyA/ICdidWxsZXRlZCBsaXN0JyA6ICdudW1iZXJlZC1saXN0JyxcbiAgICB0eXBlLFxuICAgIGljb24sXG4gICAgaXNBY3RpdmU6ICh2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgaWYgKCFjb3JlLnV0aWxzLmlzU2VsZWN0aW9uSW5MaXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gY29yZS51dGlscy5nZXRDdXJyZW50TGlzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gY3VycmVudCA/IGN1cnJlbnQudHlwZSA9PT0gdHlwZSA6IGZhbHNlO1xuICAgIH0sXG4gICAgb25DbGljazogKHZhbHVlLCBvbkNoYW5nZSkgPT4ge1xuICAgICAgbG9nKCdbb25DbGlja10nLCB2YWx1ZSk7XG4gICAgICBjb25zdCBpbkxpc3QgPSBjb3JlLnV0aWxzLmlzU2VsZWN0aW9uSW5MaXN0KHZhbHVlKTtcbiAgICAgIGlmIChpbkxpc3QpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlID0gdmFsdWUuY2hhbmdlKCkuY2FsbChjb3JlLmNoYW5nZXMudW53cmFwTGlzdCk7XG4gICAgICAgIG9uQ2hhbmdlKGNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjaGFuZ2UgPSB2YWx1ZS5jaGFuZ2UoKS5jYWxsKGNvcmUuY2hhbmdlcy53cmFwSW5MaXN0LCB0eXBlKTtcbiAgICAgICAgb25DaGFuZ2UoY2hhbmdlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGNvcmUubm9ybWFsaXplTm9kZSA9IChub2RlKSA9PiB7XG4gICAgaWYgKG5vZGUub2JqZWN0ICE9PSAnZG9jdW1lbnQnICYmIG5vZGUub2JqZWN0ICE9PSAnYmxvY2snKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gY29yZS52YWxpZGF0ZU5vZGUobm9kZSk7XG5cbiAgICBjb25zdCBpbnZhbGlkTGlzdEl0ZW1zID0gW107XG5cbiAgICBub2RlLmZvckVhY2hEZXNjZW5kYW50KChkKSA9PiB7XG4gICAgICBpZiAoZC50eXBlID09PSAnbGlzdF9pdGVtJyAmJiBkLm5vZGVzLnNpemUgPT09IDEgJiYgZC5ub2Rlcy5maXJzdCgpLm9iamVjdCA9PT0gJ3RleHQnKSB7XG4gICAgICAgIC8vIGlmIHdlIGhhdmUgYSBsaXN0X2l0ZW0gdGhhdCBoYXMgb25seSBhIHRleHQgaW5zaWRlLCB3ZSBuZWVkIHRvIGFkZCBhIGJsb2NrIGluIGl0XG4gICAgICAgIGludmFsaWRMaXN0SXRlbXMucHVzaChkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaW52YWxpZExpc3RJdGVtcy5sZW5ndGggJiYgIXJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiAoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmVzcG9uc2UoY2hhbmdlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGludmFsaWRMaXN0SXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIGNoYW5nZS53aXRob3V0Tm9ybWFsaXphdGlvbigoKSA9PiB7XG4gICAgICAgICAgaW52YWxpZExpc3RJdGVtcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZSA9IG5vZGUubm9kZXMuZmlyc3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRCbG9jayA9IHtcbiAgICAgICAgICAgICAgb2JqZWN0OiAnYmxvY2snLFxuICAgICAgICAgICAgICB0eXBlOiAnZGl2JyxcbiAgICAgICAgICAgICAgbm9kZXM6IFt0ZXh0Tm9kZS50b0pTT04oKV0sXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjaGFuZ2UucmVtb3ZlTm9kZUJ5S2V5KHRleHROb2RlLmtleSk7XG5cbiAgICAgICAgICAgIGNoYW5nZS5pbnNlcnROb2RlQnlLZXkobm9kZS5rZXksIDAsIHdyYXBwZWRCbG9jayk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgY29yZS5yZW5kZXJOb2RlLnByb3BUeXBlcyA9IHtcbiAgICBub2RlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIGF0dHJpYnV0ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jLFxuICB9O1xuICBjb3JlLm5hbWUgPSB0eXBlO1xuXG4gIHJldHVybiBjb3JlO1xufTtcbiJdfQ==