@pie-lib/editable-html-tip-tap 1.0.0

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 (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ResponseAreaExtension = exports.MathTemplatedNode = exports.InlineDropdownNode = exports.ExplicitConstructedResponseNode = exports.DragInTheBlankNode = void 0;
9
+
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ var _react2 = require("@tiptap/react");
15
+
16
+ var _explicitConstructedResponse = _interopRequireDefault(require("../plugins/respArea/explicit-constructed-response"));
17
+
18
+ var _dragInTheBlank = _interopRequireDefault(require("../plugins/respArea/drag-in-the-blank"));
19
+
20
+ var _inlineDropdown = _interopRequireDefault(require("../plugins/respArea/inline-dropdown"));
21
+
22
+ var _core = require("@tiptap/core");
23
+
24
+ var _mathToolbar = require("@pie-lib/math-toolbar");
25
+
26
+ var _tippy = _interopRequireDefault(require("tippy.js"));
27
+
28
+ 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; }
29
+
30
+ 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; }
31
+
32
+ var ResponseAreaExtension = _core.Extension.create({
33
+ name: 'responseArea',
34
+ addCommands: function addCommands() {
35
+ return {
36
+ insertResponseArea: function insertResponseArea(type) {
37
+ return function (_ref) {
38
+ var tr = _ref.tr,
39
+ state = _ref.state,
40
+ dispatch = _ref.dispatch;
41
+ var schema = state.schema,
42
+ selection = state.selection;
43
+ var position = selection.$from.pos;
44
+ var RESP_MAP = {
45
+ 'drag-in-the-blank': 'drag_in_the_blank',
46
+ 'explicit-constructed-response': 'explicit_constructed_response',
47
+ 'inline-dropdown': 'inline_dropdown'
48
+ };
49
+ var node = schema.nodes[RESP_MAP[type]].create({
50
+ index: '1',
51
+ id: '1',
52
+ value: ''
53
+ });
54
+
55
+ if (dispatch) {
56
+ tr.insert(position, node);
57
+ dispatch(tr);
58
+ }
59
+
60
+ return true;
61
+ };
62
+ }
63
+ };
64
+ }
65
+ });
66
+ /**
67
+ * ExplicitConstructedResponse Node
68
+ */
69
+
70
+
71
+ exports.ResponseAreaExtension = ResponseAreaExtension;
72
+
73
+ var ExplicitConstructedResponseNode = _react2.Node.create({
74
+ name: 'explicit_constructed_response',
75
+ group: 'inline',
76
+ inline: true,
77
+ atom: true,
78
+ addAttributes: function addAttributes() {
79
+ return {
80
+ index: {
81
+ "default": null
82
+ },
83
+ value: {
84
+ "default": ''
85
+ }
86
+ };
87
+ },
88
+ parseHTML: function parseHTML() {
89
+ return [{
90
+ tag: 'span[data-type="explicit_constructed_response"]',
91
+ getAttrs: function getAttrs(el) {
92
+ return {
93
+ index: el.dataset.index,
94
+ value: el.dataset.value
95
+ };
96
+ }
97
+ }];
98
+ },
99
+ renderHTML: function renderHTML(_ref2) {
100
+ var HTMLAttributes = _ref2.HTMLAttributes;
101
+ return ['span', {
102
+ 'data-type': 'explicit_constructed_response',
103
+ 'data-index': HTMLAttributes.index,
104
+ 'data-value': HTMLAttributes.value
105
+ }];
106
+ },
107
+ addNodeView: function addNodeView() {
108
+ var _this = this;
109
+
110
+ return (0, _react2.ReactNodeViewRenderer)(function (props) {
111
+ return /*#__PURE__*/_react["default"].createElement(_explicitConstructedResponse["default"], _objectSpread(_objectSpread({}, props), {}, {
112
+ options: _this.options
113
+ }));
114
+ });
115
+ }
116
+ });
117
+ /**
118
+ * MathTemplated Node
119
+ */
120
+
121
+
122
+ exports.ExplicitConstructedResponseNode = ExplicitConstructedResponseNode;
123
+
124
+ var MathTemplatedNode = _react2.Node.create({
125
+ name: 'math_templated',
126
+ group: 'inline',
127
+ inline: true,
128
+ atom: true,
129
+ addAttributes: function addAttributes() {
130
+ return {
131
+ index: {
132
+ "default": null
133
+ },
134
+ value: {
135
+ "default": ''
136
+ }
137
+ };
138
+ },
139
+ parseHTML: function parseHTML() {
140
+ return [{
141
+ tag: 'span[data-type="math_templated"]',
142
+ getAttrs: function getAttrs(el) {
143
+ return {
144
+ index: el.dataset.index,
145
+ value: el.dataset.value
146
+ };
147
+ }
148
+ }];
149
+ },
150
+ renderHTML: function renderHTML(_ref3) {
151
+ var HTMLAttributes = _ref3.HTMLAttributes;
152
+ return ['span', {
153
+ 'data-type': 'math_templated',
154
+ 'data-index': HTMLAttributes.index,
155
+ 'data-value': HTMLAttributes.value
156
+ }];
157
+ },
158
+ addNodeView: function addNodeView() {
159
+ return (0, _react2.ReactNodeViewRenderer)(function () {
160
+ return /*#__PURE__*/_react["default"].createElement("div", null);
161
+ });
162
+ }
163
+ });
164
+ /**
165
+ * DragInTheBlank Node
166
+ */
167
+
168
+
169
+ exports.MathTemplatedNode = MathTemplatedNode;
170
+
171
+ var DragInTheBlankNode = _react2.Node.create({
172
+ name: 'drag_in_the_blank',
173
+ group: 'inline',
174
+ inline: true,
175
+ atom: true,
176
+ addAttributes: function addAttributes() {
177
+ return {
178
+ index: {
179
+ "default": null
180
+ },
181
+ id: {
182
+ "default": null
183
+ },
184
+ value: {
185
+ "default": ''
186
+ },
187
+ inTable: {
188
+ "default": null
189
+ }
190
+ };
191
+ },
192
+ parseHTML: function parseHTML() {
193
+ return [{
194
+ tag: 'span[data-type="drag_in_the_blank"]',
195
+ getAttrs: function getAttrs(el) {
196
+ return {
197
+ index: el.dataset.index,
198
+ id: el.dataset.id,
199
+ value: el.dataset.value,
200
+ inTable: el.dataset.inTable
201
+ };
202
+ }
203
+ }];
204
+ },
205
+ renderHTML: function renderHTML(_ref4) {
206
+ var HTMLAttributes = _ref4.HTMLAttributes;
207
+ return ['span', {
208
+ 'data-type': 'drag_in_the_blank',
209
+ 'data-index': HTMLAttributes.index,
210
+ 'data-id': HTMLAttributes.id,
211
+ 'data-value': HTMLAttributes.value,
212
+ 'data-in-table': HTMLAttributes.inTable
213
+ }];
214
+ },
215
+ addNodeView: function addNodeView() {
216
+ var _this2 = this;
217
+
218
+ return (0, _react2.ReactNodeViewRenderer)(function (props) {
219
+ return /*#__PURE__*/_react["default"].createElement(_dragInTheBlank["default"], _objectSpread(_objectSpread({}, props), {}, {
220
+ options: _this2.options
221
+ }));
222
+ });
223
+ }
224
+ });
225
+ /**
226
+ * InlineDropdown Node
227
+ */
228
+
229
+
230
+ exports.DragInTheBlankNode = DragInTheBlankNode;
231
+
232
+ var InlineDropdownNode = _react2.Node.create({
233
+ name: 'inline_dropdown',
234
+ group: 'inline',
235
+ inline: true,
236
+ atom: true,
237
+ addAttributes: function addAttributes() {
238
+ return {
239
+ index: {
240
+ "default": null
241
+ },
242
+ value: {
243
+ "default": ''
244
+ }
245
+ };
246
+ },
247
+ parseHTML: function parseHTML() {
248
+ return [{
249
+ tag: 'span[data-type="inline_dropdown"]',
250
+ getAttrs: function getAttrs(el) {
251
+ return {
252
+ index: el.dataset.index,
253
+ value: el.dataset.value
254
+ };
255
+ }
256
+ }];
257
+ },
258
+ renderHTML: function renderHTML(_ref5) {
259
+ var HTMLAttributes = _ref5.HTMLAttributes;
260
+ return ['span', {
261
+ 'data-type': 'inline_dropdown',
262
+ 'data-index': HTMLAttributes.index,
263
+ 'data-value': HTMLAttributes.value
264
+ }];
265
+ },
266
+ addNodeView: function addNodeView() {
267
+ var _this3 = this;
268
+
269
+ return (0, _react2.ReactNodeViewRenderer)(function (props) {
270
+ return /*#__PURE__*/_react["default"].createElement(_inlineDropdown["default"], _objectSpread(_objectSpread({}, props), {}, {
271
+ options: _this3.options
272
+ }));
273
+ });
274
+ }
275
+ });
276
+
277
+ exports.InlineDropdownNode = InlineDropdownNode;
278
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRlbnNpb25zL3Jlc3BvbnNlQXJlYS5qcyJdLCJuYW1lcyI6WyJSZXNwb25zZUFyZWFFeHRlbnNpb24iLCJFeHRlbnNpb24iLCJjcmVhdGUiLCJuYW1lIiwiYWRkQ29tbWFuZHMiLCJpbnNlcnRSZXNwb25zZUFyZWEiLCJ0eXBlIiwidHIiLCJzdGF0ZSIsImRpc3BhdGNoIiwic2NoZW1hIiwic2VsZWN0aW9uIiwicG9zaXRpb24iLCIkZnJvbSIsInBvcyIsIlJFU1BfTUFQIiwibm9kZSIsIm5vZGVzIiwiaW5kZXgiLCJpZCIsInZhbHVlIiwiaW5zZXJ0IiwiRXhwbGljaXRDb25zdHJ1Y3RlZFJlc3BvbnNlTm9kZSIsIk5vZGUiLCJncm91cCIsImlubGluZSIsImF0b20iLCJhZGRBdHRyaWJ1dGVzIiwicGFyc2VIVE1MIiwidGFnIiwiZ2V0QXR0cnMiLCJlbCIsImRhdGFzZXQiLCJyZW5kZXJIVE1MIiwiSFRNTEF0dHJpYnV0ZXMiLCJhZGROb2RlVmlldyIsInByb3BzIiwib3B0aW9ucyIsIk1hdGhUZW1wbGF0ZWROb2RlIiwiRHJhZ0luVGhlQmxhbmtOb2RlIiwiaW5UYWJsZSIsIklubGluZURyb3Bkb3duTm9kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7O0FBRU8sSUFBTUEscUJBQXFCLEdBQUdDLGdCQUFVQyxNQUFWLENBQWlCO0FBQ3BEQyxFQUFBQSxJQUFJLEVBQUUsY0FEOEM7QUFFcERDLEVBQUFBLFdBRm9ELHlCQUV0QztBQUNaLFdBQU87QUFDTEMsTUFBQUEsa0JBQWtCLEVBQUUsNEJBQUNDLElBQUQ7QUFBQSxlQUFVLGdCQUE2QjtBQUFBLGNBQTFCQyxFQUEwQixRQUExQkEsRUFBMEI7QUFBQSxjQUF0QkMsS0FBc0IsUUFBdEJBLEtBQXNCO0FBQUEsY0FBZkMsUUFBZSxRQUFmQSxRQUFlO0FBQ3pELGNBQVFDLE1BQVIsR0FBOEJGLEtBQTlCLENBQVFFLE1BQVI7QUFBQSxjQUFnQkMsU0FBaEIsR0FBOEJILEtBQTlCLENBQWdCRyxTQUFoQjtBQUNBLGNBQU1DLFFBQVEsR0FBR0QsU0FBUyxDQUFDRSxLQUFWLENBQWdCQyxHQUFqQztBQUNBLGNBQU1DLFFBQVEsR0FBRztBQUNmLGlDQUFxQixtQkFETjtBQUVmLDZDQUFpQywrQkFGbEI7QUFHZiwrQkFBbUI7QUFISixXQUFqQjtBQU1BLGNBQU1DLElBQUksR0FBR04sTUFBTSxDQUFDTyxLQUFQLENBQWFGLFFBQVEsQ0FBQ1QsSUFBRCxDQUFyQixFQUE2QkosTUFBN0IsQ0FBb0M7QUFDL0NnQixZQUFBQSxLQUFLLEVBQUUsR0FEd0M7QUFFL0NDLFlBQUFBLEVBQUUsRUFBRSxHQUYyQztBQUcvQ0MsWUFBQUEsS0FBSyxFQUFFO0FBSHdDLFdBQXBDLENBQWI7O0FBTUEsY0FBSVgsUUFBSixFQUFjO0FBQ1pGLFlBQUFBLEVBQUUsQ0FBQ2MsTUFBSCxDQUFVVCxRQUFWLEVBQW9CSSxJQUFwQjtBQUNBUCxZQUFBQSxRQUFRLENBQUNGLEVBQUQsQ0FBUjtBQUNEOztBQUVELGlCQUFPLElBQVA7QUFDRCxTQXJCbUI7QUFBQTtBQURmLEtBQVA7QUF3QkQ7QUEzQm1ELENBQWpCLENBQTlCO0FBOEJQO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNZSwrQkFBK0IsR0FBR0MsYUFBS3JCLE1BQUwsQ0FBWTtBQUN6REMsRUFBQUEsSUFBSSxFQUFFLCtCQURtRDtBQUV6RHFCLEVBQUFBLEtBQUssRUFBRSxRQUZrRDtBQUd6REMsRUFBQUEsTUFBTSxFQUFFLElBSGlEO0FBSXpEQyxFQUFBQSxJQUFJLEVBQUUsSUFKbUQ7QUFLekRDLEVBQUFBLGFBTHlELDJCQUt6QztBQUNkLFdBQU87QUFDTFQsTUFBQUEsS0FBSyxFQUFFO0FBQUUsbUJBQVM7QUFBWCxPQURGO0FBRUxFLE1BQUFBLEtBQUssRUFBRTtBQUFFLG1CQUFTO0FBQVg7QUFGRixLQUFQO0FBSUQsR0FWd0Q7QUFXekRRLEVBQUFBLFNBWHlELHVCQVc3QztBQUNWLFdBQU8sQ0FDTDtBQUNFQyxNQUFBQSxHQUFHLEVBQUUsaURBRFA7QUFFRUMsTUFBQUEsUUFBUSxFQUFFLGtCQUFDQyxFQUFEO0FBQUEsZUFBUztBQUNqQmIsVUFBQUEsS0FBSyxFQUFFYSxFQUFFLENBQUNDLE9BQUgsQ0FBV2QsS0FERDtBQUVqQkUsVUFBQUEsS0FBSyxFQUFFVyxFQUFFLENBQUNDLE9BQUgsQ0FBV1o7QUFGRCxTQUFUO0FBQUE7QUFGWixLQURLLENBQVA7QUFTRCxHQXJCd0Q7QUFzQnpEYSxFQUFBQSxVQXRCeUQsNkJBc0IxQjtBQUFBLFFBQWxCQyxjQUFrQixTQUFsQkEsY0FBa0I7QUFDN0IsV0FBTyxDQUNMLE1BREssRUFFTDtBQUNFLG1CQUFhLCtCQURmO0FBRUUsb0JBQWNBLGNBQWMsQ0FBQ2hCLEtBRi9CO0FBR0Usb0JBQWNnQixjQUFjLENBQUNkO0FBSC9CLEtBRkssQ0FBUDtBQVFELEdBL0J3RDtBQWdDekRlLEVBQUFBLFdBaEN5RCx5QkFnQzNDO0FBQUE7O0FBQ1osV0FBTyxtQ0FBc0IsVUFBQ0MsS0FBRDtBQUFBLDBCQUFXLGdDQUFDLHVDQUFELGtDQUFzQ0EsS0FBdEM7QUFBNkNDLFFBQUFBLE9BQU8sRUFBRSxLQUFJLENBQUNBO0FBQTNELFNBQVg7QUFBQSxLQUF0QixDQUFQO0FBQ0Q7QUFsQ3dELENBQVosQ0FBeEM7QUFxQ1A7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1DLGlCQUFpQixHQUFHZixhQUFLckIsTUFBTCxDQUFZO0FBQzNDQyxFQUFBQSxJQUFJLEVBQUUsZ0JBRHFDO0FBRTNDcUIsRUFBQUEsS0FBSyxFQUFFLFFBRm9DO0FBRzNDQyxFQUFBQSxNQUFNLEVBQUUsSUFIbUM7QUFJM0NDLEVBQUFBLElBQUksRUFBRSxJQUpxQztBQUszQ0MsRUFBQUEsYUFMMkMsMkJBSzNCO0FBQ2QsV0FBTztBQUNMVCxNQUFBQSxLQUFLLEVBQUU7QUFBRSxtQkFBUztBQUFYLE9BREY7QUFFTEUsTUFBQUEsS0FBSyxFQUFFO0FBQUUsbUJBQVM7QUFBWDtBQUZGLEtBQVA7QUFJRCxHQVYwQztBQVczQ1EsRUFBQUEsU0FYMkMsdUJBVy9CO0FBQ1YsV0FBTyxDQUNMO0FBQ0VDLE1BQUFBLEdBQUcsRUFBRSxrQ0FEUDtBQUVFQyxNQUFBQSxRQUFRLEVBQUUsa0JBQUNDLEVBQUQ7QUFBQSxlQUFTO0FBQ2pCYixVQUFBQSxLQUFLLEVBQUVhLEVBQUUsQ0FBQ0MsT0FBSCxDQUFXZCxLQUREO0FBRWpCRSxVQUFBQSxLQUFLLEVBQUVXLEVBQUUsQ0FBQ0MsT0FBSCxDQUFXWjtBQUZELFNBQVQ7QUFBQTtBQUZaLEtBREssQ0FBUDtBQVNELEdBckIwQztBQXNCM0NhLEVBQUFBLFVBdEIyQyw2QkFzQlo7QUFBQSxRQUFsQkMsY0FBa0IsU0FBbEJBLGNBQWtCO0FBQzdCLFdBQU8sQ0FDTCxNQURLLEVBRUw7QUFDRSxtQkFBYSxnQkFEZjtBQUVFLG9CQUFjQSxjQUFjLENBQUNoQixLQUYvQjtBQUdFLG9CQUFjZ0IsY0FBYyxDQUFDZDtBQUgvQixLQUZLLENBQVA7QUFRRCxHQS9CMEM7QUFnQzNDZSxFQUFBQSxXQWhDMkMseUJBZ0M3QjtBQUNaLFdBQU8sbUNBQXNCO0FBQUEsMEJBQU0sNENBQU47QUFBQSxLQUF0QixDQUFQO0FBQ0Q7QUFsQzBDLENBQVosQ0FBMUI7QUFxQ1A7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1JLGtCQUFrQixHQUFHaEIsYUFBS3JCLE1BQUwsQ0FBWTtBQUM1Q0MsRUFBQUEsSUFBSSxFQUFFLG1CQURzQztBQUU1Q3FCLEVBQUFBLEtBQUssRUFBRSxRQUZxQztBQUc1Q0MsRUFBQUEsTUFBTSxFQUFFLElBSG9DO0FBSTVDQyxFQUFBQSxJQUFJLEVBQUUsSUFKc0M7QUFLNUNDLEVBQUFBLGFBTDRDLDJCQUs1QjtBQUNkLFdBQU87QUFDTFQsTUFBQUEsS0FBSyxFQUFFO0FBQUUsbUJBQVM7QUFBWCxPQURGO0FBRUxDLE1BQUFBLEVBQUUsRUFBRTtBQUFFLG1CQUFTO0FBQVgsT0FGQztBQUdMQyxNQUFBQSxLQUFLLEVBQUU7QUFBRSxtQkFBUztBQUFYLE9BSEY7QUFJTG9CLE1BQUFBLE9BQU8sRUFBRTtBQUFFLG1CQUFTO0FBQVg7QUFKSixLQUFQO0FBTUQsR0FaMkM7QUFhNUNaLEVBQUFBLFNBYjRDLHVCQWFoQztBQUNWLFdBQU8sQ0FDTDtBQUNFQyxNQUFBQSxHQUFHLEVBQUUscUNBRFA7QUFFRUMsTUFBQUEsUUFBUSxFQUFFLGtCQUFDQyxFQUFEO0FBQUEsZUFBUztBQUNqQmIsVUFBQUEsS0FBSyxFQUFFYSxFQUFFLENBQUNDLE9BQUgsQ0FBV2QsS0FERDtBQUVqQkMsVUFBQUEsRUFBRSxFQUFFWSxFQUFFLENBQUNDLE9BQUgsQ0FBV2IsRUFGRTtBQUdqQkMsVUFBQUEsS0FBSyxFQUFFVyxFQUFFLENBQUNDLE9BQUgsQ0FBV1osS0FIRDtBQUlqQm9CLFVBQUFBLE9BQU8sRUFBRVQsRUFBRSxDQUFDQyxPQUFILENBQVdRO0FBSkgsU0FBVDtBQUFBO0FBRlosS0FESyxDQUFQO0FBV0QsR0F6QjJDO0FBMEI1Q1AsRUFBQUEsVUExQjRDLDZCQTBCYjtBQUFBLFFBQWxCQyxjQUFrQixTQUFsQkEsY0FBa0I7QUFDN0IsV0FBTyxDQUNMLE1BREssRUFFTDtBQUNFLG1CQUFhLG1CQURmO0FBRUUsb0JBQWNBLGNBQWMsQ0FBQ2hCLEtBRi9CO0FBR0UsaUJBQVdnQixjQUFjLENBQUNmLEVBSDVCO0FBSUUsb0JBQWNlLGNBQWMsQ0FBQ2QsS0FKL0I7QUFLRSx1QkFBaUJjLGNBQWMsQ0FBQ007QUFMbEMsS0FGSyxDQUFQO0FBVUQsR0FyQzJDO0FBc0M1Q0wsRUFBQUEsV0F0QzRDLHlCQXNDOUI7QUFBQTs7QUFDWixXQUFPLG1DQUFzQixVQUFDQyxLQUFEO0FBQUEsMEJBQVcsZ0NBQUMsMEJBQUQsa0NBQXlCQSxLQUF6QjtBQUFnQ0MsUUFBQUEsT0FBTyxFQUFFLE1BQUksQ0FBQ0E7QUFBOUMsU0FBWDtBQUFBLEtBQXRCLENBQVA7QUFDRDtBQXhDMkMsQ0FBWixDQUEzQjtBQTJDUDtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTUksa0JBQWtCLEdBQUdsQixhQUFLckIsTUFBTCxDQUFZO0FBQzVDQyxFQUFBQSxJQUFJLEVBQUUsaUJBRHNDO0FBRTVDcUIsRUFBQUEsS0FBSyxFQUFFLFFBRnFDO0FBRzVDQyxFQUFBQSxNQUFNLEVBQUUsSUFIb0M7QUFJNUNDLEVBQUFBLElBQUksRUFBRSxJQUpzQztBQUs1Q0MsRUFBQUEsYUFMNEMsMkJBSzVCO0FBQ2QsV0FBTztBQUNMVCxNQUFBQSxLQUFLLEVBQUU7QUFBRSxtQkFBUztBQUFYLE9BREY7QUFFTEUsTUFBQUEsS0FBSyxFQUFFO0FBQUUsbUJBQVM7QUFBWDtBQUZGLEtBQVA7QUFJRCxHQVYyQztBQVc1Q1EsRUFBQUEsU0FYNEMsdUJBV2hDO0FBQ1YsV0FBTyxDQUNMO0FBQ0VDLE1BQUFBLEdBQUcsRUFBRSxtQ0FEUDtBQUVFQyxNQUFBQSxRQUFRLEVBQUUsa0JBQUNDLEVBQUQ7QUFBQSxlQUFTO0FBQ2pCYixVQUFBQSxLQUFLLEVBQUVhLEVBQUUsQ0FBQ0MsT0FBSCxDQUFXZCxLQUREO0FBRWpCRSxVQUFBQSxLQUFLLEVBQUVXLEVBQUUsQ0FBQ0MsT0FBSCxDQUFXWjtBQUZELFNBQVQ7QUFBQTtBQUZaLEtBREssQ0FBUDtBQVNELEdBckIyQztBQXNCNUNhLEVBQUFBLFVBdEI0Qyw2QkFzQmI7QUFBQSxRQUFsQkMsY0FBa0IsU0FBbEJBLGNBQWtCO0FBQzdCLFdBQU8sQ0FDTCxNQURLLEVBRUw7QUFDRSxtQkFBYSxpQkFEZjtBQUVFLG9CQUFjQSxjQUFjLENBQUNoQixLQUYvQjtBQUdFLG9CQUFjZ0IsY0FBYyxDQUFDZDtBQUgvQixLQUZLLENBQVA7QUFRRCxHQS9CMkM7QUFnQzVDZSxFQUFBQSxXQWhDNEMseUJBZ0M5QjtBQUFBOztBQUNaLFdBQU8sbUNBQXNCLFVBQUNDLEtBQUQ7QUFBQSwwQkFBVyxnQ0FBQywwQkFBRCxrQ0FBeUJBLEtBQXpCO0FBQWdDQyxRQUFBQSxPQUFPLEVBQUUsTUFBSSxDQUFDQTtBQUE5QyxTQUFYO0FBQUEsS0FBdEIsQ0FBUDtBQUNEO0FBbEMyQyxDQUFaLENBQTNCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW5saW5lTm9kZXMuanNcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBOb2RlLCBSZWFjdE5vZGVWaWV3UmVuZGVyZXIsIFJlYWN0UmVuZGVyZXIgfSBmcm9tIFwiQHRpcHRhcC9yZWFjdFwiO1xuaW1wb3J0IEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZSBmcm9tICcuLi9wbHVnaW5zL3Jlc3BBcmVhL2V4cGxpY2l0LWNvbnN0cnVjdGVkLXJlc3BvbnNlJztcbmltcG9ydCBEcmFnSW5UaGVCbGFuayBmcm9tICcuLi9wbHVnaW5zL3Jlc3BBcmVhL2RyYWctaW4tdGhlLWJsYW5rJztcbmltcG9ydCBJbmxpbmVEcm9wZG93biBmcm9tICcuLi9wbHVnaW5zL3Jlc3BBcmVhL2lubGluZS1kcm9wZG93bic7XG5pbXBvcnQgeyBFeHRlbnNpb24gfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBNYXRoVG9vbGJhciB9IGZyb20gXCJAcGllLWxpYi9tYXRoLXRvb2xiYXJcIjtcbmltcG9ydCB0aXBweSBmcm9tIFwidGlwcHkuanNcIjtcblxuZXhwb3J0IGNvbnN0IFJlc3BvbnNlQXJlYUV4dGVuc2lvbiA9IEV4dGVuc2lvbi5jcmVhdGUoe1xuICBuYW1lOiAncmVzcG9uc2VBcmVhJyxcbiAgYWRkQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluc2VydFJlc3BvbnNlQXJlYTogKHR5cGUpID0+ICh7IHRyLCBzdGF0ZSwgZGlzcGF0Y2ggfSkgPT4ge1xuICAgICAgICBjb25zdCB7IHNjaGVtYSwgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBzZWxlY3Rpb24uJGZyb20ucG9zO1xuICAgICAgICBjb25zdCBSRVNQX01BUCA9IHtcbiAgICAgICAgICAnZHJhZy1pbi10aGUtYmxhbmsnOiAnZHJhZ19pbl90aGVfYmxhbmsnLFxuICAgICAgICAgICdleHBsaWNpdC1jb25zdHJ1Y3RlZC1yZXNwb25zZSc6ICdleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZScsXG4gICAgICAgICAgJ2lubGluZS1kcm9wZG93bic6ICdpbmxpbmVfZHJvcGRvd24nLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5vZGUgPSBzY2hlbWEubm9kZXNbUkVTUF9NQVBbdHlwZV1dLmNyZWF0ZSh7XG4gICAgICAgICAgaW5kZXg6ICcxJyxcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XG4gICAgICAgICAgdHIuaW5zZXJ0KHBvc2l0aW9uLCBub2RlKTtcbiAgICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZSBOb2RlXG4gKi9cbmV4cG9ydCBjb25zdCBFeHBsaWNpdENvbnN0cnVjdGVkUmVzcG9uc2VOb2RlID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiAnZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2UnLFxuICBncm91cDogJ2lubGluZScsXG4gIGlubGluZTogdHJ1ZSxcbiAgYXRvbTogdHJ1ZSxcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgdmFsdWU6IHsgZGVmYXVsdDogJycgfSxcbiAgICB9O1xuICB9LFxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3BhbltkYXRhLXR5cGU9XCJleHBsaWNpdF9jb25zdHJ1Y3RlZF9yZXNwb25zZVwiXScsXG4gICAgICAgIGdldEF0dHJzOiAoZWwpID0+ICh7XG4gICAgICAgICAgaW5kZXg6IGVsLmRhdGFzZXQuaW5kZXgsXG4gICAgICAgICAgdmFsdWU6IGVsLmRhdGFzZXQudmFsdWUsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXG4gICAgICAnc3BhbicsXG4gICAgICB7XG4gICAgICAgICdkYXRhLXR5cGUnOiAnZXhwbGljaXRfY29uc3RydWN0ZWRfcmVzcG9uc2UnLFxuICAgICAgICAnZGF0YS1pbmRleCc6IEhUTUxBdHRyaWJ1dGVzLmluZGV4LFxuICAgICAgICAnZGF0YS12YWx1ZSc6IEhUTUxBdHRyaWJ1dGVzLnZhbHVlLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICBhZGROb2RlVmlldygpIHtcbiAgICByZXR1cm4gUmVhY3ROb2RlVmlld1JlbmRlcmVyKChwcm9wcykgPT4gPEV4cGxpY2l0Q29uc3RydWN0ZWRSZXNwb25zZSB7Li4ueyAuLi5wcm9wcywgb3B0aW9uczogdGhpcy5vcHRpb25zIH19IC8+KTtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIE1hdGhUZW1wbGF0ZWQgTm9kZVxuICovXG5leHBvcnQgY29uc3QgTWF0aFRlbXBsYXRlZE5vZGUgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6ICdtYXRoX3RlbXBsYXRlZCcsXG4gIGdyb3VwOiAnaW5saW5lJyxcbiAgaW5saW5lOiB0cnVlLFxuICBhdG9tOiB0cnVlLFxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbmRleDogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICB2YWx1ZTogeyBkZWZhdWx0OiAnJyB9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdzcGFuW2RhdGEtdHlwZT1cIm1hdGhfdGVtcGxhdGVkXCJdJyxcbiAgICAgICAgZ2V0QXR0cnM6IChlbCkgPT4gKHtcbiAgICAgICAgICBpbmRleDogZWwuZGF0YXNldC5pbmRleCxcbiAgICAgICAgICB2YWx1ZTogZWwuZGF0YXNldC52YWx1ZSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdzcGFuJyxcbiAgICAgIHtcbiAgICAgICAgJ2RhdGEtdHlwZSc6ICdtYXRoX3RlbXBsYXRlZCcsXG4gICAgICAgICdkYXRhLWluZGV4JzogSFRNTEF0dHJpYnV0ZXMuaW5kZXgsXG4gICAgICAgICdkYXRhLXZhbHVlJzogSFRNTEF0dHJpYnV0ZXMudmFsdWUsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIGFkZE5vZGVWaWV3KCkge1xuICAgIHJldHVybiBSZWFjdE5vZGVWaWV3UmVuZGVyZXIoKCkgPT4gPGRpdj48L2Rpdj4pO1xuICB9LFxufSk7XG5cbi8qKlxuICogRHJhZ0luVGhlQmxhbmsgTm9kZVxuICovXG5leHBvcnQgY29uc3QgRHJhZ0luVGhlQmxhbmtOb2RlID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiAnZHJhZ19pbl90aGVfYmxhbmsnLFxuICBncm91cDogJ2lubGluZScsXG4gIGlubGluZTogdHJ1ZSxcbiAgYXRvbTogdHJ1ZSxcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgaWQ6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgdmFsdWU6IHsgZGVmYXVsdDogJycgfSxcbiAgICAgIGluVGFibGU6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgIH07XG4gIH0sXG4gIHBhcnNlSFRNTCgpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICB0YWc6ICdzcGFuW2RhdGEtdHlwZT1cImRyYWdfaW5fdGhlX2JsYW5rXCJdJyxcbiAgICAgICAgZ2V0QXR0cnM6IChlbCkgPT4gKHtcbiAgICAgICAgICBpbmRleDogZWwuZGF0YXNldC5pbmRleCxcbiAgICAgICAgICBpZDogZWwuZGF0YXNldC5pZCxcbiAgICAgICAgICB2YWx1ZTogZWwuZGF0YXNldC52YWx1ZSxcbiAgICAgICAgICBpblRhYmxlOiBlbC5kYXRhc2V0LmluVGFibGUsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuICByZW5kZXJIVE1MKHsgSFRNTEF0dHJpYnV0ZXMgfSkge1xuICAgIHJldHVybiBbXG4gICAgICAnc3BhbicsXG4gICAgICB7XG4gICAgICAgICdkYXRhLXR5cGUnOiAnZHJhZ19pbl90aGVfYmxhbmsnLFxuICAgICAgICAnZGF0YS1pbmRleCc6IEhUTUxBdHRyaWJ1dGVzLmluZGV4LFxuICAgICAgICAnZGF0YS1pZCc6IEhUTUxBdHRyaWJ1dGVzLmlkLFxuICAgICAgICAnZGF0YS12YWx1ZSc6IEhUTUxBdHRyaWJ1dGVzLnZhbHVlLFxuICAgICAgICAnZGF0YS1pbi10YWJsZSc6IEhUTUxBdHRyaWJ1dGVzLmluVGFibGUsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIGFkZE5vZGVWaWV3KCkge1xuICAgIHJldHVybiBSZWFjdE5vZGVWaWV3UmVuZGVyZXIoKHByb3BzKSA9PiA8RHJhZ0luVGhlQmxhbmsgey4uLnsgLi4ucHJvcHMsIG9wdGlvbnM6IHRoaXMub3B0aW9ucyB9fSAvPik7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBJbmxpbmVEcm9wZG93biBOb2RlXG4gKi9cbmV4cG9ydCBjb25zdCBJbmxpbmVEcm9wZG93bk5vZGUgPSBOb2RlLmNyZWF0ZSh7XG4gIG5hbWU6ICdpbmxpbmVfZHJvcGRvd24nLFxuICBncm91cDogJ2lubGluZScsXG4gIGlubGluZTogdHJ1ZSxcbiAgYXRvbTogdHJ1ZSxcbiAgYWRkQXR0cmlidXRlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5kZXg6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgdmFsdWU6IHsgZGVmYXVsdDogJycgfSxcbiAgICB9O1xuICB9LFxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3BhbltkYXRhLXR5cGU9XCJpbmxpbmVfZHJvcGRvd25cIl0nLFxuICAgICAgICBnZXRBdHRyczogKGVsKSA9PiAoe1xuICAgICAgICAgIGluZGV4OiBlbC5kYXRhc2V0LmluZGV4LFxuICAgICAgICAgIHZhbHVlOiBlbC5kYXRhc2V0LnZhbHVlLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcbiAgcmVuZGVySFRNTCh7IEhUTUxBdHRyaWJ1dGVzIH0pIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3NwYW4nLFxuICAgICAge1xuICAgICAgICAnZGF0YS10eXBlJzogJ2lubGluZV9kcm9wZG93bicsXG4gICAgICAgICdkYXRhLWluZGV4JzogSFRNTEF0dHJpYnV0ZXMuaW5kZXgsXG4gICAgICAgICdkYXRhLXZhbHVlJzogSFRNTEF0dHJpYnV0ZXMudmFsdWUsXG4gICAgICB9LFxuICAgIF07XG4gIH0sXG4gIGFkZE5vZGVWaWV3KCkge1xuICAgIHJldHVybiBSZWFjdE5vZGVWaWV3UmVuZGVyZXIoKHByb3BzKSA9PiA8SW5saW5lRHJvcGRvd24gey4uLnsgLi4ucHJvcHMsIG9wdGlvbnM6IHRoaXMub3B0aW9ucyB9fSAvPik7XG4gIH0sXG59KTtcbiJdfQ==