@pie-lib/editable-html 11.1.1 → 11.3.0-beta.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 (194) hide show
  1. package/CHANGELOG.md +8 -4
  2. package/NEXT.CHANGELOG.json +1 -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 +349 -88
  9. package/lib/index.js +26 -10
  10. package/lib/parse-html.js +1 -1
  11. package/lib/plugins/characters/custom-popper.js +1 -1
  12. package/lib/plugins/characters/index.js +9 -4
  13. package/lib/plugins/characters/utils.js +13 -13
  14. package/lib/plugins/css/icons/index.js +37 -0
  15. package/lib/plugins/css/index.js +397 -0
  16. package/lib/plugins/customPlugin/index.js +114 -0
  17. package/lib/plugins/html/icons/index.js +1 -1
  18. package/lib/plugins/html/index.js +12 -8
  19. package/lib/plugins/image/__tests__/component.test.js +51 -0
  20. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  21. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  22. package/lib/plugins/image/__tests__/index.test.js +98 -0
  23. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  24. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  25. package/lib/plugins/image/alt-dialog.js +1 -1
  26. package/lib/plugins/image/component.js +1 -1
  27. package/lib/plugins/image/image-toolbar.js +1 -1
  28. package/lib/plugins/image/index.js +3 -2
  29. package/lib/plugins/image/insert-image-handler.js +14 -5
  30. package/lib/plugins/index.js +271 -12
  31. package/lib/plugins/list/__tests__/index.test.js +79 -0
  32. package/lib/plugins/list/index.js +131 -1
  33. package/lib/plugins/math/__tests__/index.test.js +300 -0
  34. package/lib/plugins/math/index.js +92 -57
  35. package/lib/plugins/media/__tests__/index.test.js +71 -0
  36. package/lib/plugins/media/index.js +6 -3
  37. package/lib/plugins/media/media-dialog.js +99 -58
  38. package/lib/plugins/media/media-toolbar.js +1 -1
  39. package/lib/plugins/media/media-wrapper.js +1 -1
  40. package/lib/plugins/rendering/index.js +46 -0
  41. package/lib/plugins/respArea/drag-in-the-blank/choice.js +6 -3
  42. package/lib/plugins/respArea/drag-in-the-blank/index.js +1 -1
  43. package/lib/plugins/respArea/explicit-constructed-response/index.js +12 -10
  44. package/lib/plugins/respArea/icons/index.js +1 -1
  45. package/lib/plugins/respArea/index.js +70 -22
  46. package/lib/plugins/respArea/inline-dropdown/index.js +11 -6
  47. package/lib/plugins/respArea/math-templated/index.js +130 -0
  48. package/lib/plugins/respArea/utils.js +17 -2
  49. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  50. package/lib/plugins/table/__tests__/index.test.js +442 -0
  51. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  52. package/lib/plugins/table/icons/index.js +1 -1
  53. package/lib/plugins/table/index.js +44 -60
  54. package/lib/plugins/table/table-toolbar.js +34 -5
  55. package/lib/plugins/textAlign/icons/index.js +226 -0
  56. package/lib/plugins/textAlign/index.js +34 -0
  57. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  58. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  59. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  60. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  61. package/lib/plugins/toolbar/default-toolbar.js +83 -28
  62. package/lib/plugins/toolbar/done-button.js +6 -3
  63. package/lib/plugins/toolbar/editor-and-toolbar.js +19 -20
  64. package/lib/plugins/toolbar/index.js +1 -1
  65. package/lib/plugins/toolbar/toolbar-buttons.js +45 -12
  66. package/lib/plugins/toolbar/toolbar.js +36 -12
  67. package/lib/plugins/utils.js +1 -1
  68. package/lib/serialization.js +234 -45
  69. package/lib/theme.js +1 -1
  70. package/package.json +6 -6
  71. package/src/__tests__/editor.test.jsx +363 -0
  72. package/src/__tests__/serialization.test.js +291 -0
  73. package/src/__tests__/utils.js +36 -0
  74. package/src/block-tags.js +17 -0
  75. package/src/constants.js +7 -0
  76. package/src/editor.jsx +303 -49
  77. package/src/index.jsx +19 -10
  78. package/src/plugins/characters/index.jsx +11 -3
  79. package/src/plugins/characters/utils.js +12 -12
  80. package/src/plugins/css/icons/index.jsx +17 -0
  81. package/src/plugins/css/index.jsx +346 -0
  82. package/src/plugins/customPlugin/index.jsx +85 -0
  83. package/src/plugins/html/index.jsx +9 -6
  84. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  85. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  86. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  87. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  88. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  89. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  90. package/src/plugins/image/__tests__/index.test.js +95 -0
  91. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  92. package/src/plugins/image/__tests__/mock-change.js +15 -0
  93. package/src/plugins/image/index.jsx +2 -1
  94. package/src/plugins/image/insert-image-handler.js +13 -6
  95. package/src/plugins/index.jsx +248 -5
  96. package/src/plugins/list/__tests__/index.test.js +54 -0
  97. package/src/plugins/list/index.jsx +130 -0
  98. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  99. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  100. package/src/plugins/math/index.jsx +87 -56
  101. package/src/plugins/media/__tests__/index.test.js +75 -0
  102. package/src/plugins/media/index.jsx +3 -2
  103. package/src/plugins/media/media-dialog.js +106 -57
  104. package/src/plugins/rendering/index.js +31 -0
  105. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +4 -1
  106. package/src/plugins/respArea/explicit-constructed-response/index.jsx +10 -8
  107. package/src/plugins/respArea/index.jsx +53 -7
  108. package/src/plugins/respArea/inline-dropdown/index.jsx +13 -6
  109. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  110. package/src/plugins/respArea/utils.jsx +11 -0
  111. package/src/plugins/table/CustomTablePlugin.js +113 -0
  112. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  113. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  114. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  115. package/src/plugins/table/index.jsx +46 -59
  116. package/src/plugins/table/table-toolbar.jsx +39 -2
  117. package/src/plugins/textAlign/icons/index.jsx +139 -0
  118. package/src/plugins/textAlign/index.jsx +23 -0
  119. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  120. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  121. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  122. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  123. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  124. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  125. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  126. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  127. package/src/plugins/toolbar/default-toolbar.jsx +80 -20
  128. package/src/plugins/toolbar/done-button.jsx +3 -1
  129. package/src/plugins/toolbar/editor-and-toolbar.jsx +18 -13
  130. package/src/plugins/toolbar/toolbar-buttons.jsx +52 -11
  131. package/src/plugins/toolbar/toolbar.jsx +31 -8
  132. package/src/serialization.jsx +213 -38
  133. package/README.md +0 -45
  134. package/deploy.sh +0 -16
  135. package/lib/editor.js.map +0 -1
  136. package/lib/index.js.map +0 -1
  137. package/lib/parse-html.js.map +0 -1
  138. package/lib/plugins/characters/custom-popper.js.map +0 -1
  139. package/lib/plugins/characters/index.js.map +0 -1
  140. package/lib/plugins/characters/utils.js.map +0 -1
  141. package/lib/plugins/html/icons/index.js.map +0 -1
  142. package/lib/plugins/html/index.js.map +0 -1
  143. package/lib/plugins/image/alt-dialog.js.map +0 -1
  144. package/lib/plugins/image/component.js.map +0 -1
  145. package/lib/plugins/image/image-toolbar.js.map +0 -1
  146. package/lib/plugins/image/index.js.map +0 -1
  147. package/lib/plugins/image/insert-image-handler.js.map +0 -1
  148. package/lib/plugins/index.js.map +0 -1
  149. package/lib/plugins/list/index.js.map +0 -1
  150. package/lib/plugins/math/index.js.map +0 -1
  151. package/lib/plugins/media/index.js.map +0 -1
  152. package/lib/plugins/media/media-dialog.js.map +0 -1
  153. package/lib/plugins/media/media-toolbar.js.map +0 -1
  154. package/lib/plugins/media/media-wrapper.js.map +0 -1
  155. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +0 -1
  156. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +0 -1
  157. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +0 -1
  158. package/lib/plugins/respArea/icons/index.js.map +0 -1
  159. package/lib/plugins/respArea/index.js.map +0 -1
  160. package/lib/plugins/respArea/inline-dropdown/index.js.map +0 -1
  161. package/lib/plugins/respArea/utils.js.map +0 -1
  162. package/lib/plugins/table/icons/index.js.map +0 -1
  163. package/lib/plugins/table/index.js.map +0 -1
  164. package/lib/plugins/table/table-toolbar.js.map +0 -1
  165. package/lib/plugins/toolbar/default-toolbar.js.map +0 -1
  166. package/lib/plugins/toolbar/done-button.js.map +0 -1
  167. package/lib/plugins/toolbar/editor-and-toolbar.js.map +0 -1
  168. package/lib/plugins/toolbar/index.js.map +0 -1
  169. package/lib/plugins/toolbar/toolbar-buttons.js.map +0 -1
  170. package/lib/plugins/toolbar/toolbar.js.map +0 -1
  171. package/lib/plugins/utils.js.map +0 -1
  172. package/lib/serialization.js.map +0 -1
  173. package/lib/theme.js.map +0 -1
  174. package/playground/image/data.js +0 -59
  175. package/playground/image/index.html +0 -22
  176. package/playground/image/index.jsx +0 -81
  177. package/playground/index.html +0 -25
  178. package/playground/mathquill/index.html +0 -22
  179. package/playground/mathquill/index.jsx +0 -155
  180. package/playground/package.json +0 -15
  181. package/playground/prod-test/index.html +0 -22
  182. package/playground/prod-test/index.jsx +0 -28
  183. package/playground/schema-override/data.js +0 -29
  184. package/playground/schema-override/image-plugin.jsx +0 -41
  185. package/playground/schema-override/index.html +0 -21
  186. package/playground/schema-override/index.jsx +0 -97
  187. package/playground/serialization/data.js +0 -29
  188. package/playground/serialization/image-plugin.jsx +0 -41
  189. package/playground/serialization/index.html +0 -22
  190. package/playground/serialization/index.jsx +0 -12
  191. package/playground/static.json +0 -3
  192. package/playground/table-examples.html +0 -70
  193. package/playground/webpack.config.js +0 -42
  194. package/static.json +0 -1
package/lib/editor.js CHANGED
@@ -21,6 +21,8 @@ Object.defineProperty(exports, "DEFAULT_PLUGINS", {
21
21
  });
22
22
  exports.serialization = exports["default"] = exports.Editor = void 0;
23
23
 
24
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
25
+
24
26
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
25
27
 
26
28
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
@@ -41,38 +43,40 @@ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/ge
41
43
 
42
44
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
43
45
 
46
+ var _react = _interopRequireDefault(require("react"));
47
+
44
48
  var _slateReact = require("slate-react");
45
49
 
46
50
  var _slatePropTypes = _interopRequireDefault(require("slate-prop-types"));
47
51
 
48
- var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
49
-
50
- var serialization = _interopRequireWildcard(require("./serialization"));
52
+ var _slate = require("slate");
51
53
 
52
- exports.serialization = serialization;
54
+ var _slatePlainSerializer = _interopRequireDefault(require("slate-plain-serializer"));
53
55
 
54
56
  var _propTypes = _interopRequireDefault(require("prop-types"));
55
57
 
56
- var _react = _interopRequireDefault(require("react"));
57
-
58
- var _slate = require("slate");
58
+ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
59
59
 
60
- var _plugins = require("./plugins");
60
+ var _classnames = _interopRequireDefault(require("classnames"));
61
61
 
62
62
  var _debug = _interopRequireDefault(require("debug"));
63
63
 
64
64
  var _styles = require("@material-ui/core/styles");
65
65
 
66
- var _classnames = _interopRequireDefault(require("classnames"));
67
-
68
66
  var _renderUi = require("@pie-lib/render-ui");
69
67
 
70
- var _slatePlainSerializer = _interopRequireDefault(require("slate-plain-serializer"));
71
-
72
68
  var _configUi = require("@pie-lib/config-ui");
73
69
 
70
+ var serialization = _interopRequireWildcard(require("./serialization"));
71
+
72
+ exports.serialization = serialization;
73
+
74
74
  var _insertImageHandler = _interopRequireDefault(require("./plugins/image/insert-image-handler"));
75
75
 
76
+ var _plugins = require("./plugins");
77
+
78
+ var _excluded = ["customPlugins", "showParagraphs", "separateParagraphs"];
79
+
76
80
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
77
81
 
78
82
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -106,6 +110,13 @@ var createToolbarOpts = function createToolbarOpts(toolbarOpts, error, isHtmlMod
106
110
  isHtmlMode: isHtmlMode
107
111
  });
108
112
  };
113
+ /**
114
+ * The maximum number of characters the editor can support
115
+ * @type {number}
116
+ */
117
+
118
+
119
+ var MAX_CHARACTERS_LIMIT = 1000000;
109
120
 
110
121
  var Editor = /*#__PURE__*/function (_React$Component) {
111
122
  (0, _inherits2["default"])(Editor, _React$Component);
@@ -117,18 +128,24 @@ var Editor = /*#__PURE__*/function (_React$Component) {
117
128
 
118
129
  (0, _classCallCheck2["default"])(this, Editor);
119
130
  _this = _super.call(this, _props);
120
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleAlertDialog", function (open, extraDialogProps, callback) {
131
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "setKeypadInteraction", function (interacted) {
132
+ _this.keypadInteractionDetected = interacted;
133
+ });
134
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleDialog", function (open) {
135
+ var extraDialogProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
136
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
137
+
121
138
  _this.setState({
122
139
  dialog: _objectSpread({
123
140
  open: open
124
- }, extraDialogProps),
125
- isEdited: false
141
+ }, extraDialogProps)
126
142
  }, callback);
127
143
  });
128
144
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "toggleHtmlMode", function () {
129
145
  _this.setState(function (prevState) {
130
146
  return {
131
- isHtmlMode: !prevState.isHtmlMode
147
+ isHtmlMode: !prevState.isHtmlMode,
148
+ isEditedInHtmlMode: false
132
149
  };
133
150
  }, function () {
134
151
  var error = _this.props.error;
@@ -144,23 +161,49 @@ var Editor = /*#__PURE__*/function (_React$Component) {
144
161
  var normalizedResponseAreaProps = _objectSpread(_objectSpread({}, defaultResponseAreaProps), props.responseAreaProps);
145
162
 
146
163
  var htmlPluginOpts = {
164
+ currentValue: _this.props.value,
147
165
  isHtmlMode: _this.state.isHtmlMode,
148
- isEdited: _this.state.isEdited,
166
+ isEditedInHtmlMode: _this.state.isEditedInHtmlMode,
149
167
  toggleHtmlMode: _this.toggleHtmlMode,
150
- handleAlertDialog: _this.handleAlertDialog
168
+ handleAlertDialog: _this.handleDialog
151
169
  };
152
- _this.plugins = (0, _plugins.buildPlugins)(props.activePlugins, {
170
+
171
+ var _ref = props.pluginProps || {},
172
+ customPlugins = _ref.customPlugins;
173
+
174
+ customPlugins = customPlugins || [];
175
+ _this.plugins = (0, _plugins.buildPlugins)(props.activePlugins, customPlugins, {
153
176
  math: _objectSpread({
154
177
  onClick: _this.onMathClick,
155
178
  onFocus: _this.onPluginFocus,
156
179
  onBlur: _this.onPluginBlur
157
180
  }, props.mathMlOptions),
181
+ textAlign: {
182
+ getValue: function getValue() {
183
+ return _this.state.value;
184
+ },
185
+ onChange: _this.onChange
186
+ },
158
187
  html: htmlPluginOpts,
188
+ extraCSSRules: props.extraCSSRules || {},
159
189
  image: {
160
190
  disableImageAlignmentButtons: props.disableImageAlignmentButtons,
161
- onDelete: props.imageSupport && props.imageSupport["delete"] && function (src, done) {
191
+ onDelete: props.imageSupport && props.imageSupport["delete"] && function (node, done) {
192
+ var src = node.data.get('src');
162
193
  props.imageSupport["delete"](src, function (e) {
163
- done(e, _this.state.value);
194
+ var newPendingImages = _this.state.pendingImages.filter(function (img) {
195
+ return img.key !== node.key;
196
+ });
197
+
198
+ var oldScheduled = _this.state.scheduled;
199
+ var newState = {
200
+ pendingImages: newPendingImages,
201
+ scheduled: oldScheduled && newPendingImages.length === 0 ? false : oldScheduled
202
+ };
203
+
204
+ _this.setState(newState, function () {
205
+ return done(e, _this.state.value);
206
+ });
164
207
  });
165
208
  },
166
209
  insertImageRequested: props.imageSupport && function (addedImage, getHandler) {
@@ -206,8 +249,8 @@ var Editor = /*#__PURE__*/function (_React$Component) {
206
249
  },
207
250
  onFocus: _this.onPluginFocus,
208
251
  onBlur: _this.onPluginBlur,
209
- maxImageWidth: _this.props.maxImageWidth,
210
- maxImageHeight: _this.props.maxImageHeight
252
+ maxImageWidth: props.maxImageWidth,
253
+ maxImageHeight: props.maxImageHeight
211
254
  },
212
255
  toolbar: {
213
256
  /**
@@ -225,7 +268,8 @@ var Editor = /*#__PURE__*/function (_React$Component) {
225
268
 
226
269
  _this.setState({
227
270
  toolbarInFocus: false,
228
- focusedNode: null
271
+ focusedNode: null,
272
+ focusToolbar: false
229
273
  });
230
274
 
231
275
  _this.editor.blur();
@@ -270,6 +314,8 @@ var Editor = /*#__PURE__*/function (_React$Component) {
270
314
  }
271
315
  },
272
316
  languageCharacters: props.languageCharactersProps,
317
+ keyPadCharacterRef: _this.keyPadCharacterRef,
318
+ setKeypadInteraction: _this.setKeypadInteraction,
273
319
  media: {
274
320
  focus: _this.focus,
275
321
  createChange: function createChange() {
@@ -327,19 +373,33 @@ var Editor = /*#__PURE__*/function (_React$Component) {
327
373
  });
328
374
  });
329
375
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onEditingDone", function () {
330
- if (_this.state.isHtmlMode) {
376
+ var _this$state = _this.state,
377
+ isHtmlMode = _this$state.isHtmlMode,
378
+ dialog = _this$state.dialog,
379
+ value = _this$state.value,
380
+ pendingImages = _this$state.pendingImages; // Handling HTML mode and dialog state
381
+
382
+ if (isHtmlMode) {
383
+ // Early return if HTML mode is enabled
384
+ if (dialog !== null && dialog !== void 0 && dialog.open) return;
385
+ var currentValue = (0, serialization.htmlToValue)(value.document.text);
386
+
387
+ var previewText = _this.renderHtmlPreviewContent();
388
+
389
+ _this.openHtmlModeConfirmationDialog(currentValue, previewText);
390
+
331
391
  return;
332
392
  }
333
393
 
334
- var pendingImages = _this.state.pendingImages;
335
-
336
394
  if (pendingImages.length) {
395
+ // schedule image processing
337
396
  _this.setState({
338
397
  scheduled: true
339
398
  });
340
399
 
341
400
  return;
342
- }
401
+ } // Finalizing editing
402
+
343
403
 
344
404
  log('[onEditingDone]');
345
405
 
@@ -353,6 +413,46 @@ var Editor = /*#__PURE__*/function (_React$Component) {
353
413
 
354
414
  _this.props.onChange(_this.state.value, true);
355
415
  });
416
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderHtmlPreviewContent", function () {
417
+ var classes = _this.props.classes;
418
+ return /*#__PURE__*/_react["default"].createElement("div", {
419
+ ref: function ref(_ref2) {
420
+ return _this.elementRef = _ref2;
421
+ }
422
+ }, /*#__PURE__*/_react["default"].createElement("div", null, "Preview of Edited Html:"), /*#__PURE__*/_react["default"].createElement(_renderUi.PreviewPrompt, {
423
+ defaultClassName: classes.previewText,
424
+ prompt: _this.state.value.document.text
425
+ }), /*#__PURE__*/_react["default"].createElement("div", null, "Would you like to save these changes ?"));
426
+ });
427
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "openHtmlModeConfirmationDialog", function (currentValue, previewText) {
428
+ _this.setState({
429
+ dialog: {
430
+ open: true,
431
+ title: 'Content Preview & Save',
432
+ text: previewText,
433
+ onConfirmText: 'Save changes',
434
+ onCloseText: 'Continue editing',
435
+ onConfirm: function onConfirm() {
436
+ _this.handleHtmlModeSaveConfirmation(currentValue);
437
+ },
438
+ onClose: _this.htmlModeContinueEditing
439
+ }
440
+ });
441
+ });
442
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleHtmlModeSaveConfirmation", function (currentValue) {
443
+ _this.setState({
444
+ value: currentValue
445
+ });
446
+
447
+ _this.props.onChange(currentValue, true);
448
+
449
+ _this.handleDialog(false);
450
+
451
+ _this.toggleHtmlMode();
452
+ });
453
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "htmlModeContinueEditing", function () {
454
+ _this.handleDialog(false);
455
+ });
356
456
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleBlur", function (resolve) {
357
457
  var nonEmpty = _this.props.nonEmpty;
358
458
  var doneOn = _this.state.toolbarOpts.doneOn;
@@ -383,15 +483,33 @@ var Editor = /*#__PURE__*/function (_React$Component) {
383
483
  }
384
484
  });
385
485
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onBlur", function (event) {
486
+ var _this$doneButtonRef$c;
487
+
386
488
  log('[onBlur]');
387
- var target = event.relatedTarget;
388
- var node = target ? (0, _slateReact.findNode)(target, _this.state.value) : null;
489
+ var relatedTarget = event.relatedTarget;
490
+ var toolbarElement = _this.toolbarRef && (relatedTarget === null || relatedTarget === void 0 ? void 0 : relatedTarget.closest("[class*=\"".concat(_this.toolbarRef.className, "\"]"))); // Check if relatedTarget is a done button
491
+
492
+ var isRawDoneButton = _this.doneButtonRef && (relatedTarget === null || relatedTarget === void 0 ? void 0 : relatedTarget.closest("[class*=\"".concat((_this$doneButtonRef$c = _this.doneButtonRef.current) === null || _this$doneButtonRef$c === void 0 ? void 0 : _this$doneButtonRef$c.className, "\"]"))); // Skip onBlur handling if relatedTarget is a button from the KeyPad characters
493
+
494
+ _this.skipBlurHandling = _this.keypadInteractionDetected && relatedTarget !== null;
495
+
496
+ if (toolbarElement && !isRawDoneButton && !_this.state.focusToolbar) {
497
+ _this.setState({
498
+ focusToolbar: true
499
+ });
500
+ }
501
+
502
+ var node = relatedTarget ? (0, _slateReact.findNode)(relatedTarget, _this.state.value) : null;
389
503
  log('[onBlur] node: ', node);
390
504
  return new Promise(function (resolve) {
391
- _this.setState({
392
- preBlurValue: _this.state.value,
393
- focusedNode: !node ? null : node
394
- }, _this.handleBlur.bind((0, _assertThisInitialized2["default"])(_this), resolve));
505
+ if (!_this.skipBlurHandling) {
506
+ _this.setKeypadInteraction(false);
507
+
508
+ _this.setState({
509
+ preBlurValue: _this.state.value,
510
+ focusedNode: !node ? null : node
511
+ }, _this.handleBlur.bind((0, _assertThisInitialized2["default"])(_this), resolve));
512
+ }
395
513
 
396
514
  _this.props.onBlur(event);
397
515
  });
@@ -419,14 +537,22 @@ var Editor = /*#__PURE__*/function (_React$Component) {
419
537
  }
420
538
  }, 50);
421
539
  });
422
- (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFocus", function () {
540
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onFocus", function (event, change) {
423
541
  return new Promise(function (resolve) {
542
+ var _navigator;
543
+
424
544
  var editorDOM = document.querySelector("[data-key=\"".concat(_this.state.value.document.key, "\"]"));
545
+ var isTouchDevice = typeof window !== 'undefined' && ('ontouchstart' in window || ((_navigator = navigator) === null || _navigator === void 0 ? void 0 : _navigator.maxTouchPoints) > 0);
425
546
  log('[onFocus]', document.activeElement);
547
+
548
+ if (_this.keypadInteractionDetected && _this.__TEMPORARY_CHANGE_DATA) {
549
+ _this.__TEMPORARY_CHANGE_DATA = null;
550
+ }
426
551
  /**
427
552
  * This is a temporary hack - @see changeData below for some more information.
428
553
  */
429
554
 
555
+
430
556
  if (_this.__TEMPORARY_CHANGE_DATA) {
431
557
  var _this$__TEMPORARY_CHA = _this.__TEMPORARY_CHANGE_DATA,
432
558
  key = _this$__TEMPORARY_CHA.key,
@@ -434,12 +560,12 @@ var Editor = /*#__PURE__*/function (_React$Component) {
434
560
  var domEl = document.querySelector("[data-key=\"".concat(key, "\"]"));
435
561
 
436
562
  if (domEl) {
437
- var change = _this.state.value.change().setNodeByKey(key, {
563
+ var _change = _this.state.value.change().setNodeByKey(key, {
438
564
  data: data
439
565
  });
440
566
 
441
567
  _this.setState({
442
- value: change.value
568
+ value: _change.value
443
569
  }, function () {
444
570
  _this.__TEMPORARY_CHANGE_DATA = null;
445
571
  });
@@ -460,7 +586,14 @@ var Editor = /*#__PURE__*/function (_React$Component) {
460
586
 
461
587
  _this.stashValue();
462
588
 
463
- _this.props.onFocus();
589
+ _this.props.onFocus(); // Added for accessibility: Ensures the editor gains focus when tabbed to for improved keyboard navigation
590
+
591
+
592
+ var shouldFocusEditor = !_this.keypadInteractionDetected && !isTouchDevice;
593
+
594
+ if (shouldFocusEditor) {
595
+ change === null || change === void 0 ? void 0 : change.focus();
596
+ }
464
597
 
465
598
  resolve();
466
599
  });
@@ -475,9 +608,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
475
608
  }
476
609
  });
477
610
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "resetValue", function (force) {
478
- var _this$state = _this.state,
479
- value = _this$state.value,
480
- focusedNode = _this$state.focusedNode;
611
+ var _this$state2 = _this.state,
612
+ value = _this$state2.value,
613
+ focusedNode = _this$state2.focusedNode;
481
614
 
482
615
  var stopReset = _this.plugins.reduce(function (s, p) {
483
616
  return s || p.stopReset && p.stopReset(_this.state.value);
@@ -510,20 +643,30 @@ var Editor = /*#__PURE__*/function (_React$Component) {
510
643
  });
511
644
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onChange", function (change, done) {
512
645
  log('[onChange]');
646
+ window.me = (0, _assertThisInitialized2["default"])(_this);
513
647
  var value = change.value;
514
648
  var charactersLimit = _this.props.charactersLimit;
649
+ var limit = charactersLimit;
515
650
 
516
- if (value && value.document && value.document.text && value.document.text.length > charactersLimit) {
651
+ if (!limit || limit > MAX_CHARACTERS_LIMIT) {
652
+ limit = MAX_CHARACTERS_LIMIT;
653
+ }
654
+
655
+ if (value && value.document && value.document.text && value.document.text.length > limit) {
517
656
  return;
518
657
  } // Mark the editor as edited when in HTML mode and its content has changed.
519
658
  // This status will later be used to decide whether to prompt a warning to the user when exiting HTML mode.
520
659
 
521
660
 
522
- var isEdited = !_this.state.isHtmlMode ? false : _this.state.value.document.text !== value.document.text ? true : _this.state.isEdited;
661
+ var isEditedInHtmlMode = !_this.state.isHtmlMode ? false : _this.state.value.document.text !== value.document.text ? true : _this.state.isEditedInHtmlMode;
662
+
663
+ if (isEditedInHtmlMode != _this.state.isEditedInHtmlMode) {
664
+ _this.handlePlugins(_this.props);
665
+ }
523
666
 
524
667
  _this.setState({
525
668
  value: value,
526
- isEdited: isEdited
669
+ isEditedInHtmlMode: isEditedInHtmlMode
527
670
  }, function () {
528
671
  log('[onChange], call done()');
529
672
 
@@ -544,10 +687,12 @@ var Editor = /*#__PURE__*/function (_React$Component) {
544
687
  return;
545
688
  }
546
689
 
690
+ var calcRegex = /^calc\((.*)\)$/;
691
+
547
692
  if (typeof v === 'string') {
548
693
  if (v.endsWith('%')) {
549
694
  return undefined;
550
- } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw')) {
695
+ } else if (v.endsWith('px') || v.endsWith('vh') || v.endsWith('vw') || v.endsWith('ch') || v.endsWith('em') || v.match(calcRegex)) {
551
696
  return v;
552
697
  } else {
553
698
  var value = parseInt(v, 10);
@@ -558,8 +703,6 @@ var Editor = /*#__PURE__*/function (_React$Component) {
558
703
  if (typeof v === 'number') {
559
704
  return "".concat(v, "px");
560
705
  }
561
-
562
- return;
563
706
  });
564
707
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "validateNode", function (node) {
565
708
  if (node.object !== 'block') return;
@@ -586,7 +729,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
586
729
  * on this hack rather than spend more time on this.
587
730
  */
588
731
  // Uncomment this line to see the bug described above.
589
- // this.setState({changeData: {key, data}})
732
+ // this.setState({changeData: {key, data}})
590
733
 
591
734
  _this.__TEMPORARY_CHANGE_DATA = {
592
735
  key: key,
@@ -599,7 +742,7 @@ var Editor = /*#__PURE__*/function (_React$Component) {
599
742
  _this.props.focus(position, node);
600
743
  });
601
744
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "onDropPaste", /*#__PURE__*/function () {
602
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event, change, dropContext) {
745
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(event, change, dropContext) {
603
746
  var editor, transfer, file, type, fragment, text, src, inline, range, ch, handler, _change$value, _document, selection, startBlock, defaultBlock, defaultMarks, frag;
604
747
 
605
748
  return _regenerator["default"].wrap(function _callee$(_context) {
@@ -726,14 +869,14 @@ var Editor = /*#__PURE__*/function (_React$Component) {
726
869
  }));
727
870
 
728
871
  return function (_x, _x2, _x3) {
729
- return _ref.apply(this, arguments);
872
+ return _ref3.apply(this, arguments);
730
873
  };
731
874
  }());
732
875
  (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderPlaceholder", function (props) {
733
876
  var editor = props.editor;
734
877
  var document = editor.value.document;
735
878
 
736
- if (!editor.props.placeholder || document.text !== '' || document.nodes.size !== 1) {
879
+ if (!editor.props.placeholder || document.text !== '' || document.nodes.size !== 1 || !document.isEmpty) {
737
880
  return false;
738
881
  }
739
882
 
@@ -756,15 +899,23 @@ var Editor = /*#__PURE__*/function (_React$Component) {
756
899
  toolbarOpts: createToolbarOpts(_props.toolbarOpts, _props.error),
757
900
  pendingImages: [],
758
901
  isHtmlMode: false,
759
- isEdited: false,
902
+ isEditedInHtmlMode: false,
903
+ focusToolbar: false,
760
904
  dialog: {
761
905
  open: false
762
906
  }
763
907
  };
908
+ _this.keyPadCharacterRef = /*#__PURE__*/_react["default"].createRef();
909
+ _this.doneButtonRef = /*#__PURE__*/_react["default"].createRef();
910
+ _this.keypadInteractionDetected = false;
764
911
  _this.toggleHtmlMode = _this.toggleHtmlMode.bind((0, _assertThisInitialized2["default"])(_this));
912
+ _this.handleToolbarFocus = _this.handleToolbarFocus.bind((0, _assertThisInitialized2["default"])(_this));
913
+ _this.handleToolbarBlur = _this.handleToolbarBlur.bind((0, _assertThisInitialized2["default"])(_this));
765
914
 
766
915
  _this.onResize = function () {
767
- _props.onChange(_this.state.value, true);
916
+ if (!_this.state.isHtmlMode && _props.onChange) {
917
+ _props.onChange(_this.state.value, true);
918
+ }
768
919
  };
769
920
 
770
921
  _this.handlePlugins(_this.props);
@@ -773,20 +924,62 @@ var Editor = /*#__PURE__*/function (_React$Component) {
773
924
  }
774
925
 
775
926
  (0, _createClass2["default"])(Editor, [{
927
+ key: "handleToolbarFocus",
928
+ value: function handleToolbarFocus() {
929
+ if (this.state.focusToolbar) {
930
+ return;
931
+ }
932
+
933
+ this.setState({
934
+ focusToolbar: true
935
+ });
936
+ }
937
+ }, {
938
+ key: "handleToolbarBlur",
939
+ value: function handleToolbarBlur() {
940
+ var _this2 = this;
941
+
942
+ setTimeout(function () {
943
+ if (!_this2.toolbarContainsFocus()) {
944
+ _this2.setState({
945
+ focusToolbar: false
946
+ });
947
+ }
948
+ }, 0);
949
+ }
950
+ }, {
951
+ key: "toolbarContainsFocus",
952
+ value: function toolbarContainsFocus() {
953
+ if (!this.toolbarRef) return false;
954
+ var toolbarElement = this.toolbarRef;
955
+ var activeElement = document.activeElement;
956
+ return toolbarElement && toolbarElement.contains(activeElement);
957
+ }
958
+ }, {
776
959
  key: "componentDidMount",
777
960
  value: function componentDidMount() {
778
- var _this2 = this;
961
+ var _this$props$className,
962
+ _this3 = this;
779
963
 
780
964
  // onRef is needed to get the ref of the component because we export it using withStyles
781
965
  this.props.onRef(this);
782
966
  window.addEventListener('resize', this.onResize);
967
+ var isResponseAreaEditor = (_this$props$className = this.props.className) === null || _this$props$className === void 0 ? void 0 : _this$props$className.includes('response-area-editor');
968
+
969
+ if (isResponseAreaEditor && this.editor) {
970
+ var responseAreaEditor = document.querySelector("[data-key=\"".concat(this.editor.value.document.key, "\"]"));
971
+
972
+ if (responseAreaEditor) {
973
+ responseAreaEditor.setAttribute('aria-label', 'Answer');
974
+ }
975
+ }
783
976
 
784
977
  if (this.editor && this.props.autoFocus) {
785
978
  Promise.resolve().then(function () {
786
- if (_this2.editor) {
787
- var editorDOM = document.querySelector("[data-key=\"".concat(_this2.editor.value.document.key, "\"]"));
979
+ if (_this3.editor) {
980
+ var editorDOM = document.querySelector("[data-key=\"".concat(_this3.editor.value.document.key, "\"]"));
788
981
 
789
- _this2.editor.focus();
982
+ _this3.editor.focus();
790
983
 
791
984
  if (editorDOM) {
792
985
  editorDOM.focus();
@@ -800,9 +993,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
800
993
  value: function UNSAFE_componentWillReceiveProps(nextProps) {
801
994
  var _nextProps$value, _nextProps$value$docu, _this$props$value;
802
995
 
803
- var _this$state2 = this.state,
804
- isHtmlMode = _this$state2.isHtmlMode,
805
- toolbarOpts = _this$state2.toolbarOpts;
996
+ var _this$state3 = this.state,
997
+ isHtmlMode = _this$state3.isHtmlMode,
998
+ toolbarOpts = _this$state3.toolbarOpts;
806
999
  var newToolbarOpts = createToolbarOpts(nextProps.toolbarOpts, nextProps.error, isHtmlMode);
807
1000
 
808
1001
  if (!(0, _isEqual["default"])(newToolbarOpts, toolbarOpts)) {
@@ -813,8 +1006,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
813
1006
 
814
1007
  var differentCharacterProps = !(0, _isEqual["default"])(nextProps.languageCharactersProps, this.props.languageCharactersProps);
815
1008
  var differentMathMlProps = !(0, _isEqual["default"])(nextProps.mathMlOptions, this.props.mathMlOptions);
1009
+ var differentImageMaxDimensionsProps = !(0, _isEqual["default"])(nextProps.maxImageWidth, this.props.maxImageWidth) || !(0, _isEqual["default"])(nextProps.maxImageHeight, this.props.maxImageHeight);
816
1010
 
817
- if (differentCharacterProps || differentMathMlProps) {
1011
+ if (differentCharacterProps || differentMathMlProps || differentImageMaxDimensionsProps) {
818
1012
  this.handlePlugins(nextProps);
819
1013
  }
820
1014
 
@@ -833,9 +1027,8 @@ var Editor = /*#__PURE__*/function (_React$Component) {
833
1027
  // Trigger plugins and finish editing if:
834
1028
  // 1. The 'isHtmlMode' state has been toggled.
835
1029
  // 2. We're currently in 'isHtmlMode' and the editor value has been modified.
836
- if (this.state.isHtmlMode !== prevState.isHtmlMode || this.state.isHtmlMode && !prevState.isEdited && this.state.isEdited) {
1030
+ if (this.state.isHtmlMode !== prevState.isHtmlMode || this.state.isHtmlMode && !prevState.isEditedInHtmlMode && this.state.isEditedInHtmlMode) {
837
1031
  this.handlePlugins(this.props);
838
- this.onEditingDone();
839
1032
  }
840
1033
 
841
1034
  var zeroWidthEls = document.querySelectorAll('[data-slate-zero-width="z"]');
@@ -858,12 +1051,16 @@ var Editor = /*#__PURE__*/function (_React$Component) {
858
1051
  key: "buildSizeStyle",
859
1052
  value: function buildSizeStyle() {
860
1053
  var _this$props = this.props,
1054
+ minWidth = _this$props.minWidth,
861
1055
  width = _this$props.width,
1056
+ maxWidth = _this$props.maxWidth,
862
1057
  minHeight = _this$props.minHeight,
863
1058
  height = _this$props.height,
864
1059
  maxHeight = _this$props.maxHeight;
865
1060
  return {
866
1061
  width: this.valueToSize(width),
1062
+ minWidth: this.valueToSize(minWidth),
1063
+ maxWidth: this.valueToSize(maxWidth),
867
1064
  height: this.valueToSize(height),
868
1065
  minHeight: this.valueToSize(minHeight),
869
1066
  maxHeight: this.valueToSize(maxHeight)
@@ -873,7 +1070,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
873
1070
  key: "render",
874
1071
  value: function render() {
875
1072
  var _classNames,
876
- _this3 = this;
1073
+ _this4 = this,
1074
+ _value$document,
1075
+ _classNames2;
877
1076
 
878
1077
  var _this$props2 = this.props,
879
1078
  disabled = _this$props2.disabled,
@@ -881,54 +1080,72 @@ var Editor = /*#__PURE__*/function (_React$Component) {
881
1080
  highlightShape = _this$props2.highlightShape,
882
1081
  classes = _this$props2.classes,
883
1082
  className = _this$props2.className,
1083
+ isEditor = _this$props2.isEditor,
884
1084
  placeholder = _this$props2.placeholder,
885
1085
  pluginProps = _this$props2.pluginProps,
886
- onKeyDown = _this$props2.onKeyDown;
887
- var _this$state3 = this.state,
888
- value = _this$state3.value,
889
- focusedNode = _this$state3.focusedNode,
890
- toolbarOpts = _this$state3.toolbarOpts,
891
- dialog = _this$state3.dialog,
892
- scheduled = _this$state3.scheduled;
1086
+ onKeyDown = _this$props2.onKeyDown; // We don't want to send customPlugins to slate.
1087
+ // Not sure if they would do any harm, but I think it's better to not send them.
1088
+ // We use custom plugins to be able to add custom buttons
1089
+ // eslint-disable-next-line no-unused-vars
1090
+
1091
+ var _ref4 = pluginProps || {},
1092
+ customPlugins = _ref4.customPlugins,
1093
+ showParagraphs = _ref4.showParagraphs,
1094
+ separateParagraphs = _ref4.separateParagraphs,
1095
+ otherPluginProps = (0, _objectWithoutProperties2["default"])(_ref4, _excluded);
1096
+
1097
+ var _this$state4 = this.state,
1098
+ value = _this$state4.value,
1099
+ focusedNode = _this$state4.focusedNode,
1100
+ toolbarOpts = _this$state4.toolbarOpts,
1101
+ dialog = _this$state4.dialog,
1102
+ scheduled = _this$state4.scheduled;
893
1103
  log('[render] value: ', value);
894
1104
  var sizeStyle = this.buildSizeStyle();
895
1105
  var names = (0, _classnames["default"])((_classNames = {}, (0, _defineProperty2["default"])(_classNames, classes.withBg, highlightShape), (0, _defineProperty2["default"])(_classNames, classes.toolbarOnTop, toolbarOpts.alwaysVisible && toolbarOpts.position === 'top'), (0, _defineProperty2["default"])(_classNames, classes.scheduled, scheduled), _classNames), className);
896
1106
  return /*#__PURE__*/_react["default"].createElement("div", {
897
- ref: function ref(_ref2) {
898
- return _this3.wrapperRef = _ref2;
1107
+ ref: function ref(_ref5) {
1108
+ return _this4.wrapperRef = _ref5;
899
1109
  },
900
1110
  style: {
901
- width: sizeStyle.width
1111
+ width: sizeStyle.width,
1112
+ minWidth: sizeStyle.minWidth,
1113
+ maxWidth: sizeStyle.maxWidth
902
1114
  },
903
- className: names
1115
+ className: names,
1116
+ id: "editor-".concat(value === null || value === void 0 ? void 0 : (_value$document = value.document) === null || _value$document === void 0 ? void 0 : _value$document.key)
904
1117
  }, scheduled && /*#__PURE__*/_react["default"].createElement("div", {
905
1118
  className: classes.uploading
906
1119
  }, "Uploading image and then saving..."), /*#__PURE__*/_react["default"].createElement(_slateReact.Editor, {
907
1120
  plugins: this.plugins,
908
1121
  innerRef: function innerRef(r) {
909
1122
  if (r) {
910
- _this3.slateEditor = r;
1123
+ _this4.slateEditor = r;
911
1124
  }
912
1125
  },
913
1126
  ref: function ref(r) {
914
- return _this3.editor = r && _this3.props.editorRef(r);
1127
+ return _this4.editor = r && _this4.props.editorRef(r);
915
1128
  },
916
1129
  toolbarRef: function toolbarRef(r) {
917
1130
  if (r) {
918
- _this3.toolbarRef = r;
1131
+ _this4.toolbarRef = r;
919
1132
  }
920
1133
  },
1134
+ doneButtonRef: this.doneButtonRef,
921
1135
  value: value,
1136
+ focusToolbar: this.state.focusToolbar,
1137
+ onToolbarFocus: this.handleToolbarFocus,
1138
+ onToolbarBlur: this.handleToolbarBlur,
922
1139
  focus: this.focus,
923
1140
  onKeyDown: onKeyDown,
924
1141
  onChange: this.onChange,
925
1142
  getFocusedValue: this.getFocusedValue,
926
1143
  onBlur: this.onBlur,
927
1144
  onDrop: function onDrop(event, editor) {
928
- return _this3.onDropPaste(event, editor, true);
1145
+ return _this4.onDropPaste(event, editor, true);
929
1146
  },
930
1147
  onPaste: function onPaste(event, editor) {
931
- return _this3.onDropPaste(event, editor);
1148
+ return _this4.onDropPaste(event, editor);
932
1149
  },
933
1150
  onFocus: this.onFocus,
934
1151
  onEditingDone: this.onEditingDone,
@@ -937,13 +1154,13 @@ var Editor = /*#__PURE__*/function (_React$Component) {
937
1154
  readOnly: disabled,
938
1155
  spellCheck: spellCheck,
939
1156
  autoCorrect: spellCheck,
940
- className: (0, _classnames["default"])((0, _defineProperty2["default"])({}, classes.noPadding, toolbarOpts && toolbarOpts.noBorder), classes.slateEditor),
1157
+ className: (0, _classnames["default"])((_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, classes.noPadding, toolbarOpts === null || toolbarOpts === void 0 ? void 0 : toolbarOpts.noPadding), (0, _defineProperty2["default"])(_classNames2, classes.showParagraph, showParagraphs && !showParagraphs.disabled), (0, _defineProperty2["default"])(_classNames2, classes.separateParagraph, separateParagraphs && !separateParagraphs.disabled), _classNames2), classes.slateEditor),
941
1158
  style: {
942
1159
  minHeight: sizeStyle.minHeight,
943
1160
  height: sizeStyle.height,
944
1161
  maxHeight: sizeStyle.maxHeight
945
1162
  },
946
- pluginProps: pluginProps,
1163
+ pluginProps: otherPluginProps,
947
1164
  toolbarOpts: toolbarOpts,
948
1165
  placeholder: placeholder,
949
1166
  renderPlaceholder: this.renderPlaceholder,
@@ -953,7 +1170,9 @@ var Editor = /*#__PURE__*/function (_React$Component) {
953
1170
  title: dialog.title,
954
1171
  text: dialog.text,
955
1172
  onClose: dialog.onClose,
956
- onConfirm: dialog.onConfirm
1173
+ onConfirm: dialog.onConfirm,
1174
+ onConfirmText: dialog.onConfirmText,
1175
+ onCloseText: dialog.onCloseText
957
1176
  }));
958
1177
  }
959
1178
  }]);
@@ -985,6 +1204,8 @@ exports.Editor = Editor;
985
1204
  }),
986
1205
  charactersLimit: _propTypes["default"].number,
987
1206
  width: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1207
+ minWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
1208
+ maxWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
988
1209
  height: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
989
1210
  minHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
990
1211
  maxHeight: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
@@ -997,12 +1218,28 @@ exports.Editor = Editor;
997
1218
  disableUnderline: _propTypes["default"].bool,
998
1219
  autoWidthToolbar: _propTypes["default"].bool,
999
1220
  pluginProps: _propTypes["default"].any,
1221
+ // customPlugins should be inside pluginProps (a property inside pluginProps)
1222
+ // customPlugins: PropTypes.arrayOf(
1223
+ // PropTypes.shape({
1224
+ // event: PropTypes.string,
1225
+ // icon: PropTypes.string,
1226
+ // iconType: PropTypes.string,
1227
+ // iconAlt: PropTypes.string
1228
+ // }),
1229
+ // ),
1000
1230
  placeholder: _propTypes["default"].string,
1231
+ isEditor: _propTypes["default"].bool,
1001
1232
  responseAreaProps: _propTypes["default"].shape({
1002
- type: _propTypes["default"].oneOf(['explicit-constructed-response', 'inline-dropdown', 'drag-in-the-blank']),
1233
+ type: _propTypes["default"].oneOf(['explicit-constructed-response', 'inline-dropdown', 'drag-in-the-blank', 'math-templated']),
1003
1234
  options: _propTypes["default"].object,
1004
1235
  respAreaToolbar: _propTypes["default"].func,
1005
- onHandleAreaChange: _propTypes["default"].func
1236
+ onHandleAreaChange: _propTypes["default"].func,
1237
+ maxResponseAreas: _propTypes["default"].number,
1238
+ error: _propTypes["default"].any
1239
+ }),
1240
+ extraCSSRules: _propTypes["default"].shape({
1241
+ names: _propTypes["default"].arrayOf(_propTypes["default"].string),
1242
+ rules: _propTypes["default"].string
1006
1243
  }),
1007
1244
  languageCharactersProps: _propTypes["default"].arrayOf(_propTypes["default"].shape({
1008
1245
  language: _propTypes["default"].string,
@@ -1015,7 +1252,8 @@ exports.Editor = Editor;
1015
1252
  alignment: _propTypes["default"].oneOf(['left', 'right']),
1016
1253
  alwaysVisible: _propTypes["default"].bool,
1017
1254
  showDone: _propTypes["default"].bool,
1018
- doneOn: _propTypes["default"].string
1255
+ doneOn: _propTypes["default"].string,
1256
+ minWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])
1019
1257
  }),
1020
1258
  activePlugins: _propTypes["default"].arrayOf(function (values) {
1021
1259
  var allValid = values.every(function (v) {
@@ -1039,7 +1277,9 @@ exports.Editor = Editor;
1039
1277
  },
1040
1278
  toolbarOpts: defaultToolbarOpts,
1041
1279
  responseAreaProps: defaultResponseAreaProps,
1042
- languageCharactersProps: defaultLanguageCharactersProps
1280
+ languageCharactersProps: defaultLanguageCharactersProps,
1281
+ extraCSSRules: null,
1282
+ isEditor: false
1043
1283
  });
1044
1284
  var styles = {
1045
1285
  withBg: {
@@ -1080,15 +1320,36 @@ var styles = {
1080
1320
  border: '1px solid #dfe2e5'
1081
1321
  }
1082
1322
  },
1323
+ showParagraph: {
1324
+ // a div that has a div after it
1325
+ '& > div:has(+ div)::after': {
1326
+ display: 'block',
1327
+ content: '"¶"',
1328
+ fontSize: '1em',
1329
+ color: '#146EB3'
1330
+ }
1331
+ },
1332
+ separateParagraph: {
1333
+ // a div that has a div after it
1334
+ '& > div:has(+ div)': {
1335
+ marginBottom: '1em'
1336
+ }
1337
+ },
1083
1338
  toolbarOnTop: {
1084
1339
  marginTop: '45px'
1085
1340
  },
1086
1341
  noPadding: {
1087
1342
  padding: '0 !important'
1343
+ },
1344
+ previewText: {
1345
+ marginBottom: '36px',
1346
+ marginTop: '6px',
1347
+ padding: '20px',
1348
+ backgroundColor: 'rgba(0,0,0,0.06)'
1088
1349
  }
1089
1350
  };
1090
1351
 
1091
1352
  var _default = (0, _styles.withStyles)(styles)(Editor);
1092
1353
 
1093
1354
  exports["default"] = _default;
1094
- //# sourceMappingURL=editor.js.map
1355
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9lZGl0b3IuanN4Il0sIm5hbWVzIjpbImxvZyIsImRlZmF1bHRUb29sYmFyT3B0cyIsInBvc2l0aW9uIiwiYWxpZ25tZW50IiwiYWx3YXlzVmlzaWJsZSIsInNob3dEb25lIiwiZG9uZU9uIiwiZGVmYXVsdFJlc3BvbnNlQXJlYVByb3BzIiwib3B0aW9ucyIsInJlc3BBcmVhVG9vbGJhciIsIm9uSGFuZGxlQXJlYUNoYW5nZSIsImRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyIsImNyZWF0ZVRvb2xiYXJPcHRzIiwidG9vbGJhck9wdHMiLCJlcnJvciIsImlzSHRtbE1vZGUiLCJNQVhfQ0hBUkFDVEVSU19MSU1JVCIsIkVkaXRvciIsInByb3BzIiwiaW50ZXJhY3RlZCIsImtleXBhZEludGVyYWN0aW9uRGV0ZWN0ZWQiLCJvcGVuIiwiZXh0cmFEaWFsb2dQcm9wcyIsImNhbGxiYWNrIiwic2V0U3RhdGUiLCJkaWFsb2ciLCJwcmV2U3RhdGUiLCJpc0VkaXRlZEluSHRtbE1vZGUiLCJzdGF0ZSIsIm5ld1Rvb2xiYXJPcHRzIiwibm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzIiwicmVzcG9uc2VBcmVhUHJvcHMiLCJodG1sUGx1Z2luT3B0cyIsImN1cnJlbnRWYWx1ZSIsInZhbHVlIiwidG9nZ2xlSHRtbE1vZGUiLCJoYW5kbGVBbGVydERpYWxvZyIsImhhbmRsZURpYWxvZyIsInBsdWdpblByb3BzIiwiY3VzdG9tUGx1Z2lucyIsInBsdWdpbnMiLCJhY3RpdmVQbHVnaW5zIiwibWF0aCIsIm9uQ2xpY2siLCJvbk1hdGhDbGljayIsIm9uRm9jdXMiLCJvblBsdWdpbkZvY3VzIiwib25CbHVyIiwib25QbHVnaW5CbHVyIiwibWF0aE1sT3B0aW9ucyIsInRleHRBbGlnbiIsImdldFZhbHVlIiwib25DaGFuZ2UiLCJodG1sIiwiZXh0cmFDU1NSdWxlcyIsImltYWdlIiwiZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9ucyIsIm9uRGVsZXRlIiwiaW1hZ2VTdXBwb3J0Iiwibm9kZSIsImRvbmUiLCJzcmMiLCJkYXRhIiwiZ2V0IiwiZSIsIm5ld1BlbmRpbmdJbWFnZXMiLCJwZW5kaW5nSW1hZ2VzIiwiZmlsdGVyIiwiaW1nIiwia2V5Iiwib2xkU2NoZWR1bGVkIiwic2NoZWR1bGVkIiwibmV3U3RhdGUiLCJsZW5ndGgiLCJpbnNlcnRJbWFnZVJlcXVlc3RlZCIsImFkZGVkSW1hZ2UiLCJnZXRIYW5kbGVyIiwib25GaW5pc2giLCJyZXN1bHQiLCJjYiIsIm9uRWRpdGluZ0RvbmUiLCJiaW5kIiwiaGFuZGxlciIsImFkZCIsIm1heEltYWdlV2lkdGgiLCJtYXhJbWFnZUhlaWdodCIsInRvb2xiYXIiLCJkaXNhYmxlU2Nyb2xsYmFyIiwiZGlzYWJsZVVuZGVybGluZSIsImF1dG9XaWR0aCIsImF1dG9XaWR0aFRvb2xiYXIiLCJvbkRvbmUiLCJub25FbXB0eSIsInRvb2xiYXJJbkZvY3VzIiwiZm9jdXNlZE5vZGUiLCJmb2N1c1Rvb2xiYXIiLCJlZGl0b3IiLCJibHVyIiwic3RhcnRUZXh0IiwidGV4dCIsInJlc2V0VmFsdWUiLCJ0aGVuIiwidGFibGUiLCJyZXNwb25zZUFyZWEiLCJ0eXBlIiwibWF4UmVzcG9uc2VBcmVhcyIsImxhbmd1YWdlQ2hhcmFjdGVycyIsImxhbmd1YWdlQ2hhcmFjdGVyc1Byb3BzIiwia2V5UGFkQ2hhcmFjdGVyUmVmIiwic2V0S2V5cGFkSW50ZXJhY3Rpb24iLCJtZWRpYSIsImZvY3VzIiwiY3JlYXRlQ2hhbmdlIiwiY2hhbmdlIiwidXBsb2FkU291bmRTdXBwb3J0IiwibW1sT3V0cHV0IiwibW1sRWRpdGluZyIsInJ1blNlcmlhbGl6YXRpb25Pbk1hcmt1cCIsInJlbGF0ZWRUYXJnZXQiLCJ0YXJnZXQiLCJzdGFzaGVkVmFsdWUiLCJzdGFzaFZhbHVlIiwiYyIsImNvbGxhcHNlVG9TdGFydE9mIiwic2VsZWN0ZWROb2RlIiwiZG9jdW1lbnQiLCJwcmV2aWV3VGV4dCIsInJlbmRlckh0bWxQcmV2aWV3Q29udGVudCIsIm9wZW5IdG1sTW9kZUNvbmZpcm1hdGlvbkRpYWxvZyIsImNsYXNzZXMiLCJyZWYiLCJlbGVtZW50UmVmIiwidGl0bGUiLCJvbkNvbmZpcm1UZXh0Iiwib25DbG9zZVRleHQiLCJvbkNvbmZpcm0iLCJoYW5kbGVIdG1sTW9kZVNhdmVDb25maXJtYXRpb24iLCJvbkNsb3NlIiwiaHRtbE1vZGVDb250aW51ZUVkaXRpbmciLCJyZXNvbHZlIiwiZXZlbnQiLCJ0b29sYmFyRWxlbWVudCIsInRvb2xiYXJSZWYiLCJjbG9zZXN0IiwiY2xhc3NOYW1lIiwiaXNSYXdEb25lQnV0dG9uIiwiZG9uZUJ1dHRvblJlZiIsImN1cnJlbnQiLCJza2lwQmx1ckhhbmRsaW5nIiwiUHJvbWlzZSIsInByZUJsdXJWYWx1ZSIsImhhbmRsZUJsdXIiLCJlZGl0b3JET00iLCJxdWVyeVNlbGVjdG9yIiwic2V0VGltZW91dCIsInN0YXRlVmFsdWUiLCJ3cmFwcGVyUmVmIiwiZWRpdG9yRWxlbWVudCIsImFjdGl2ZUVsZW1lbnQiLCJpc0luQ3VycmVudENvbXBvbmVudCIsImNvbnRhaW5zIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImhhbmRsZURvbUJsdXIiLCJpc0ZvY3VzZWQiLCJpc1RvdWNoRGV2aWNlIiwid2luZG93IiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJfX1RFTVBPUkFSWV9DSEFOR0VfREFUQSIsImRvbUVsIiwic2V0Tm9kZUJ5S2V5IiwiYWRkRXZlbnRMaXN0ZW5lciIsInNob3VsZEZvY3VzRWRpdG9yIiwiZm9yY2UiLCJzdG9wUmVzZXQiLCJyZWR1Y2UiLCJzIiwicCIsInRvT2JqZWN0IiwibmV3VmFsdWUiLCJWYWx1ZSIsImZyb21KU09OIiwidG9KU09OIiwibWUiLCJjaGFyYWN0ZXJzTGltaXQiLCJsaW1pdCIsImhhbmRsZVBsdWdpbnMiLCJ2IiwiY2FsY1JlZ2V4IiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJtYXRjaCIsInBhcnNlSW50IiwiaXNOYU4iLCJvYmplY3QiLCJsYXN0Iiwibm9kZXMiLCJwYXJlbnQiLCJnZXRQYXJlbnQiLCJCbG9jayIsInBvcyIsImRyb3BDb250ZXh0IiwidHJhbnNmZXIiLCJmaWxlIiwiZmlsZXMiLCJmcmFnbWVudCIsImlubGluZSIsIklubGluZSIsImNyZWF0ZSIsImlzVm9pZCIsImxvYWRpbmciLCJyYW5nZSIsInNlbGVjdCIsImNoIiwiaW5zZXJ0SW5saW5lIiwiSW5zZXJ0SW1hZ2VIYW5kbGVyIiwiZmlsZUNob3NlbiIsImluc2VydEZyYWdtZW50Iiwic2VsZWN0aW9uIiwic3RhcnRCbG9jayIsImRlZmF1bHRCbG9jayIsImRlZmF1bHRNYXJrcyIsImdldEluc2VydE1hcmtzQXRSYW5nZSIsImZyYWciLCJQbGFpbiIsImRlc2VyaWFsaXplIiwicGxhY2Vob2xkZXIiLCJzaXplIiwiaXNFbXB0eSIsImRpc3BsYXkiLCJ3aWR0aCIsIm1heFdpZHRoIiwid2hpdGVTcGFjZSIsIm9wYWNpdHkiLCJwb2ludGVyRXZlbnRzIiwidXNlclNlbGVjdCIsIlJlYWN0IiwiY3JlYXRlUmVmIiwiaGFuZGxlVG9vbGJhckZvY3VzIiwiaGFuZGxlVG9vbGJhckJsdXIiLCJvblJlc2l6ZSIsInRvb2xiYXJDb250YWluc0ZvY3VzIiwib25SZWYiLCJpc1Jlc3BvbnNlQXJlYUVkaXRvciIsImluY2x1ZGVzIiwicmVzcG9uc2VBcmVhRWRpdG9yIiwic2V0QXR0cmlidXRlIiwiYXV0b0ZvY3VzIiwibmV4dFByb3BzIiwiZGlmZmVyZW50Q2hhcmFjdGVyUHJvcHMiLCJkaWZmZXJlbnRNYXRoTWxQcm9wcyIsImRpZmZlcmVudEltYWdlTWF4RGltZW5zaW9uc1Byb3BzIiwiZXF1YWxzIiwicHJldlByb3BzIiwiemVyb1dpZHRoRWxzIiwicXVlcnlTZWxlY3RvckFsbCIsIkFycmF5IiwiZnJvbSIsImZvckVhY2giLCJlbCIsInN0eWxlIiwibWluV2lkdGgiLCJtaW5IZWlnaHQiLCJoZWlnaHQiLCJtYXhIZWlnaHQiLCJ2YWx1ZVRvU2l6ZSIsImRpc2FibGVkIiwic3BlbGxDaGVjayIsImhpZ2hsaWdodFNoYXBlIiwiaXNFZGl0b3IiLCJvbktleURvd24iLCJzaG93UGFyYWdyYXBocyIsInNlcGFyYXRlUGFyYWdyYXBocyIsIm90aGVyUGx1Z2luUHJvcHMiLCJzaXplU3R5bGUiLCJidWlsZFNpemVTdHlsZSIsIm5hbWVzIiwid2l0aEJnIiwidG9vbGJhck9uVG9wIiwidXBsb2FkaW5nIiwiciIsInNsYXRlRWRpdG9yIiwiZWRpdG9yUmVmIiwiZ2V0Rm9jdXNlZFZhbHVlIiwib25Ecm9wUGFzdGUiLCJub3JtYWxpemUiLCJub1BhZGRpbmciLCJzaG93UGFyYWdyYXBoIiwic2VwYXJhdGVQYXJhZ3JhcGgiLCJyZW5kZXJQbGFjZWhvbGRlciIsImNoYW5nZURhdGEiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJib29sIiwiZnVuYyIsImlzUmVxdWlyZWQiLCJhbnkiLCJTbGF0ZVR5cGVzIiwic2hhcGUiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJvbmVPZiIsImFycmF5T2YiLCJydWxlcyIsImxhbmd1YWdlIiwiY2hhcmFjdGVySWNvbiIsImNoYXJhY3RlcnMiLCJ2YWx1ZXMiLCJhbGxWYWxpZCIsImV2ZXJ5IiwiQUxMX1BMVUdJTlMiLCJFcnJvciIsImpvaW4iLCJzdHlsZXMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ0b3AiLCJsZWZ0IiwidHJhbnNmb3JtIiwiZm9udEZhbWlseSIsInRhYmxlTGF5b3V0IiwiYm9yZGVyQ29sbGFwc2UiLCJjb2xvciIsImJhY2tncm91bmQiLCJib3JkZXJUb3AiLCJwYWRkaW5nIiwiYm9yZGVyIiwiY29udGVudCIsImZvbnRTaXplIiwibWFyZ2luQm90dG9tIiwibWFyZ2luVG9wIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFHQTs7OztBQUNBOztBQUVBOzs7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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRWRpdG9yIGFzIFNsYXRlRWRpdG9yLCBmaW5kTm9kZSwgZ2V0RXZlbnRSYW5nZSwgZ2V0RXZlbnRUcmFuc2ZlciB9IGZyb20gJ3NsYXRlLXJlYWN0JztcbmltcG9ydCBTbGF0ZVR5cGVzIGZyb20gJ3NsYXRlLXByb3AtdHlwZXMnO1xuaW1wb3J0IHsgVmFsdWUsIEJsb2NrLCBJbmxpbmUgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgUGxhaW4gZnJvbSAnc2xhdGUtcGxhaW4tc2VyaWFsaXplcic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgd2l0aFN0eWxlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL3N0eWxlcyc7XG5cbmltcG9ydCB7IGNvbG9yIH0gZnJvbSAnQHBpZS1saWIvcmVuZGVyLXVpJztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nIH0gZnJvbSAnQHBpZS1saWIvY29uZmlnLXVpJztcbmltcG9ydCB7IFByZXZpZXdQcm9tcHQgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuXG5pbXBvcnQgeyBnZXRCYXNlNjQsIGh0bWxUb1ZhbHVlIH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCBJbnNlcnRJbWFnZUhhbmRsZXIgZnJvbSAnLi9wbHVnaW5zL2ltYWdlL2luc2VydC1pbWFnZS1oYW5kbGVyJztcbmltcG9ydCAqIGFzIHNlcmlhbGl6YXRpb24gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IGJ1aWxkUGx1Z2lucywgQUxMX1BMVUdJTlMsIERFRkFVTFRfUExVR0lOUyB9IGZyb20gJy4vcGx1Z2lucyc7XG5cbmV4cG9ydCB7IEFMTF9QTFVHSU5TLCBERUZBVUxUX1BMVUdJTlMsIHNlcmlhbGl6YXRpb24gfTtcblxuY29uc3QgbG9nID0gZGVidWcoJ2VkaXRhYmxlLWh0bWw6ZWRpdG9yJyk7XG5cbmNvbnN0IGRlZmF1bHRUb29sYmFyT3B0cyA9IHtcbiAgcG9zaXRpb246ICdib3R0b20nLFxuICBhbGlnbm1lbnQ6ICdsZWZ0JyxcbiAgYWx3YXlzVmlzaWJsZTogZmFsc2UsXG4gIHNob3dEb25lOiB0cnVlLFxuICBkb25lT246ICdibHVyJyxcbn07XG5cbmNvbnN0IGRlZmF1bHRSZXNwb25zZUFyZWFQcm9wcyA9IHtcbiAgb3B0aW9uczoge30sXG4gIHJlc3BBcmVhVG9vbGJhcjogKCkgPT4ge30sXG4gIG9uSGFuZGxlQXJlYUNoYW5nZTogKCkgPT4ge30sXG59O1xuXG5jb25zdCBkZWZhdWx0TGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHMgPSBbXTtcblxuY29uc3QgY3JlYXRlVG9vbGJhck9wdHMgPSAodG9vbGJhck9wdHMsIGVycm9yLCBpc0h0bWxNb2RlKSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdFRvb2xiYXJPcHRzLFxuICAgIC4uLnRvb2xiYXJPcHRzLFxuICAgIGVycm9yLFxuICAgIGlzSHRtbE1vZGUsXG4gIH07XG59O1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSBlZGl0b3IgY2FuIHN1cHBvcnRcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9DSEFSQUNURVJTX0xJTUlUID0gMTAwMDAwMDtcblxuZXhwb3J0IGNsYXNzIEVkaXRvciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBlZGl0b3JSZWY6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZXJyb3I6IFByb3BUeXBlcy5hbnksXG4gICAgb25SZWY6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgICBvbktleURvd246IFByb3BUeXBlcy5mdW5jLFxuICAgIGZvY3VzOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgIHZhbHVlOiBTbGF0ZVR5cGVzLnZhbHVlLmlzUmVxdWlyZWQsXG4gICAgaW1hZ2VTdXBwb3J0OiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG1hdGhNbE9wdGlvbnM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBtbWxPdXRwdXQ6IFByb3BUeXBlcy5ib29sLFxuICAgICAgbW1sRWRpdGluZzogUHJvcFR5cGVzLmJvb2wsXG4gICAgfSksXG4gICAgZGlzYWJsZUltYWdlQWxpZ25tZW50QnV0dG9uczogUHJvcFR5cGVzLmJvb2wsXG4gICAgdXBsb2FkU291bmRTdXBwb3J0OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWRkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIGRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgfSksXG4gICAgY2hhcmFjdGVyc0xpbWl0OiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgbWluV2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICBtYXhXaWR0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIG1pbkhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIG1heEhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICBoaWdobGlnaHRTaGFwZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIHNwZWxsQ2hlY2s6IFByb3BUeXBlcy5ib29sLFxuICAgIG5vbkVtcHR5OiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlU2Nyb2xsYmFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBkaXNhYmxlVW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBhdXRvV2lkdGhUb29sYmFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICBwbHVnaW5Qcm9wczogUHJvcFR5cGVzLmFueSxcbiAgICAvLyBjdXN0b21QbHVnaW5zIHNob3VsZCBiZSBpbnNpZGUgcGx1Z2luUHJvcHMgKGEgcHJvcGVydHkgaW5zaWRlIHBsdWdpblByb3BzKVxuICAgIC8vICAgY3VzdG9tUGx1Z2luczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgLy8gICAgICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAvLyAgICAgICAgIGV2ZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8vICAgICAgICAgaWNvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAvLyAgICAgICAgIGljb25UeXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIC8vICAgICAgICAgaWNvbkFsdDogUHJvcFR5cGVzLnN0cmluZ1xuICAgIC8vICAgICAgIH0pLFxuICAgIC8vICAgKSxcbiAgICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBpc0VkaXRvcjogUHJvcFR5cGVzLmJvb2wsXG4gICAgcmVzcG9uc2VBcmVhUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICB0eXBlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICAnZXhwbGljaXQtY29uc3RydWN0ZWQtcmVzcG9uc2UnLFxuICAgICAgICAnaW5saW5lLWRyb3Bkb3duJyxcbiAgICAgICAgJ2RyYWctaW4tdGhlLWJsYW5rJyxcbiAgICAgICAgJ21hdGgtdGVtcGxhdGVkJyxcbiAgICAgIF0pLFxuICAgICAgb3B0aW9uczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgIHJlc3BBcmVhVG9vbGJhcjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICBvbkhhbmRsZUFyZWFDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuICAgICAgbWF4UmVzcG9uc2VBcmVhczogUHJvcFR5cGVzLm51bWJlcixcbiAgICAgIGVycm9yOiBQcm9wVHlwZXMuYW55LFxuICAgIH0pLFxuICAgIGV4dHJhQ1NTUnVsZXM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBuYW1lczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksXG4gICAgICBydWxlczogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB9KSxcbiAgICBsYW5ndWFnZUNoYXJhY3RlcnNQcm9wczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICBsYW5ndWFnZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgY2hhcmFjdGVySWNvbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgY2hhcmFjdGVyczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZykpLFxuICAgICAgfSksXG4gICAgKSxcbiAgICBydW5TZXJpYWxpemF0aW9uT25NYXJrdXA6IFByb3BUeXBlcy5mdW5jLFxuICAgIHRvb2xiYXJPcHRzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSksXG4gICAgICBhbGlnbm1lbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG4gICAgICBhbHdheXNWaXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIHNob3dEb25lOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGRvbmVPbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIG1pbldpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgfSksXG4gICAgYWN0aXZlUGx1Z2luczogUHJvcFR5cGVzLmFycmF5T2YoKHZhbHVlcykgPT4ge1xuICAgICAgY29uc3QgYWxsVmFsaWQgPSB2YWx1ZXMuZXZlcnkoKHYpID0+IEFMTF9QTFVHSU5TLmluY2x1ZGVzKHYpKTtcblxuICAgICAgcmV0dXJuICFhbGxWYWxpZCAmJiBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWVzOiAke3ZhbHVlc30sIHZhbHVlcyBtdXN0IGJlIG9uZSBvZiBbJHtBTExfUExVR0lOUy5qb2luKCcsJyl9XWApO1xuICAgIH0pLFxuICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBtYXhJbWFnZVdpZHRoOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIG1heEltYWdlSGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyLFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZGlzYWJsZVVuZGVybGluZTogdHJ1ZSxcbiAgICBvbkZvY3VzOiAoKSA9PiB7fSxcbiAgICBvbkJsdXI6ICgpID0+IHt9LFxuICAgIG9uS2V5RG93bjogKCkgPT4ge30sXG4gICAgcnVuU2VyaWFsaXphdGlvbk9uTWFya3VwOiAoKSA9PiB7fSxcbiAgICBtYXRoTWxPcHRpb25zOiB7XG4gICAgICBtbWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgbW1sRWRpdGluZzogZmFsc2UsXG4gICAgfSxcbiAgICB0b29sYmFyT3B0czogZGVmYXVsdFRvb2xiYXJPcHRzLFxuICAgIHJlc3BvbnNlQXJlYVByb3BzOiBkZWZhdWx0UmVzcG9uc2VBcmVhUHJvcHMsXG4gICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHM6IGRlZmF1bHRMYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyxcbiAgICBleHRyYUNTU1J1bGVzOiBudWxsLFxuICAgIGlzRWRpdG9yOiBmYWxzZSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgdmFsdWU6IHByb3BzLnZhbHVlLFxuICAgICAgdG9vbGJhck9wdHM6IGNyZWF0ZVRvb2xiYXJPcHRzKHByb3BzLnRvb2xiYXJPcHRzLCBwcm9wcy5lcnJvciksXG4gICAgICBwZW5kaW5nSW1hZ2VzOiBbXSxcbiAgICAgIGlzSHRtbE1vZGU6IGZhbHNlLFxuICAgICAgaXNFZGl0ZWRJbkh0bWxNb2RlOiBmYWxzZSxcbiAgICAgIGZvY3VzVG9vbGJhcjogZmFsc2UsXG4gICAgICBkaWFsb2c6IHtcbiAgICAgICAgb3BlbjogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLmtleVBhZENoYXJhY3RlclJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMuZG9uZUJ1dHRvblJlZiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuICAgIHRoaXMua2V5cGFkSW50ZXJhY3Rpb25EZXRlY3RlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy50b2dnbGVIdG1sTW9kZSA9IHRoaXMudG9nZ2xlSHRtbE1vZGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmhhbmRsZVRvb2xiYXJGb2N1cyA9IHRoaXMuaGFuZGxlVG9vbGJhckZvY3VzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVUb29sYmFyQmx1ciA9IHRoaXMuaGFuZGxlVG9vbGJhckJsdXIuYmluZCh0aGlzKTtcblxuICAgIHRoaXMub25SZXNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuaXNIdG1sTW9kZSAmJiBwcm9wcy5vbkNoYW5nZSkge1xuICAgICAgICBwcm9wcy5vbkNoYW5nZSh0aGlzLnN0YXRlLnZhbHVlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5oYW5kbGVQbHVnaW5zKHRoaXMucHJvcHMpO1xuICB9XG5cbiAgaGFuZGxlVG9vbGJhckZvY3VzKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmZvY3VzVG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoeyBmb2N1c1Rvb2xiYXI6IHRydWUgfSk7XG4gIH1cblxuICBzZXRLZXlwYWRJbnRlcmFjdGlvbiA9IChpbnRlcmFjdGVkKSA9PiB7XG4gICAgdGhpcy5rZXlwYWRJbnRlcmFjdGlvbkRldGVjdGVkID0gaW50ZXJhY3RlZDtcbiAgfTtcblxuICBoYW5kbGVUb29sYmFyQmx1cigpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy50b29sYmFyQ29udGFpbnNGb2N1cygpKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBmb2N1c1Rvb2xiYXI6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9XG5cbiAgdG9vbGJhckNvbnRhaW5zRm9jdXMoKSB7XG4gICAgaWYgKCF0aGlzLnRvb2xiYXJSZWYpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB0b29sYmFyRWxlbWVudCA9IHRoaXMudG9vbGJhclJlZjtcbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIHJldHVybiB0b29sYmFyRWxlbWVudCAmJiB0b29sYmFyRWxlbWVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGhhbmRsZURpYWxvZyA9IChvcGVuLCBleHRyYURpYWxvZ1Byb3BzID0ge30sIGNhbGxiYWNrKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIHtcbiAgICAgICAgZGlhbG9nOiB7XG4gICAgICAgICAgb3BlbixcbiAgICAgICAgICAuLi5leHRyYURpYWxvZ1Byb3BzLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNhbGxiYWNrLFxuICAgICk7XG4gIH07XG5cbiAgdG9nZ2xlSHRtbE1vZGUgPSAoKSA9PiB7XG4gICAgdGhpcy5zZXRTdGF0ZShcbiAgICAgIChwcmV2U3RhdGUpID0+ICh7XG4gICAgICAgIGlzSHRtbE1vZGU6ICFwcmV2U3RhdGUuaXNIdG1sTW9kZSxcbiAgICAgICAgaXNFZGl0ZWRJbkh0bWxNb2RlOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7IHRvb2xiYXJPcHRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCBuZXdUb29sYmFyT3B0cyA9IGNyZWF0ZVRvb2xiYXJPcHRzKHRvb2xiYXJPcHRzLCBlcnJvciwgdGhpcy5zdGF0ZS5pc0h0bWxNb2RlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdG9vbGJhck9wdHM6IG5ld1Rvb2xiYXJPcHRzLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICBoYW5kbGVQbHVnaW5zID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzID0ge1xuICAgICAgLi4uZGVmYXVsdFJlc3BvbnNlQXJlYVByb3BzLFxuICAgICAgLi4ucHJvcHMucmVzcG9uc2VBcmVhUHJvcHMsXG4gICAgfTtcblxuICAgIGNvbnN0IGh0bWxQbHVnaW5PcHRzID0ge1xuICAgICAgY3VycmVudFZhbHVlOiB0aGlzLnByb3BzLnZhbHVlLFxuICAgICAgaXNIdG1sTW9kZTogdGhpcy5zdGF0ZS5pc0h0bWxNb2RlLFxuICAgICAgaXNFZGl0ZWRJbkh0bWxNb2RlOiB0aGlzLnN0YXRlLmlzRWRpdGVkSW5IdG1sTW9kZSxcbiAgICAgIHRvZ2dsZUh0bWxNb2RlOiB0aGlzLnRvZ2dsZUh0bWxNb2RlLFxuICAgICAgaGFuZGxlQWxlcnREaWFsb2c6IHRoaXMuaGFuZGxlRGlhbG9nLFxuICAgIH07XG4gICAgbGV0IHsgY3VzdG9tUGx1Z2lucyB9ID0gcHJvcHMucGx1Z2luUHJvcHMgfHwge307XG4gICAgY3VzdG9tUGx1Z2lucyA9IGN1c3RvbVBsdWdpbnMgfHwgW107XG5cbiAgICB0aGlzLnBsdWdpbnMgPSBidWlsZFBsdWdpbnMocHJvcHMuYWN0aXZlUGx1Z2lucywgY3VzdG9tUGx1Z2lucywge1xuICAgICAgbWF0aDoge1xuICAgICAgICBvbkNsaWNrOiB0aGlzLm9uTWF0aENsaWNrLFxuICAgICAgICBvbkZvY3VzOiB0aGlzLm9uUGx1Z2luRm9jdXMsXG4gICAgICAgIG9uQmx1cjogdGhpcy5vblBsdWdpbkJsdXIsXG4gICAgICAgIC4uLnByb3BzLm1hdGhNbE9wdGlvbnMsXG4gICAgICB9LFxuICAgICAgdGV4dEFsaWduOiB7XG4gICAgICAgIGdldFZhbHVlOiAoKSA9PiB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSxcbiAgICAgIH0sXG4gICAgICBodG1sOiBodG1sUGx1Z2luT3B0cyxcbiAgICAgIGV4dHJhQ1NTUnVsZXM6IHByb3BzLmV4dHJhQ1NTUnVsZXMgfHwge30sXG4gICAgICBpbWFnZToge1xuICAgICAgICBkaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zOiBwcm9wcy5kaXNhYmxlSW1hZ2VBbGlnbm1lbnRCdXR0b25zLFxuICAgICAgICBvbkRlbGV0ZTpcbiAgICAgICAgICBwcm9wcy5pbWFnZVN1cHBvcnQgJiZcbiAgICAgICAgICBwcm9wcy5pbWFnZVN1cHBvcnQuZGVsZXRlICYmXG4gICAgICAgICAgKChub2RlLCBkb25lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzcmMgPSBub2RlLmRhdGEuZ2V0KCdzcmMnKTtcblxuICAgICAgICAgICAgcHJvcHMuaW1hZ2VTdXBwb3J0LmRlbGV0ZShzcmMsIChlKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1BlbmRpbmdJbWFnZXMgPSB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZXMuZmlsdGVyKChpbWcpID0+IGltZy5rZXkgIT09IG5vZGUua2V5KTtcbiAgICAgICAgICAgICAgY29uc3QgeyBzY2hlZHVsZWQ6IG9sZFNjaGVkdWxlZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0ltYWdlczogbmV3UGVuZGluZ0ltYWdlcyxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWQ6IG9sZFNjaGVkdWxlZCAmJiBuZXdQZW5kaW5nSW1hZ2VzLmxlbmd0aCA9PT0gMCA/IGZhbHNlIDogb2xkU2NoZWR1bGVkLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUsICgpID0+IGRvbmUoZSwgdGhpcy5zdGF0ZS52YWx1ZSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIGluc2VydEltYWdlUmVxdWVzdGVkOlxuICAgICAgICAgIHByb3BzLmltYWdlU3VwcG9ydCAmJlxuICAgICAgICAgICgoYWRkZWRJbWFnZSwgZ2V0SGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBwZW5kaW5nSW1hZ2VzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgY29uc3Qgb25GaW5pc2ggPSAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBjYjtcblxuICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zY2hlZHVsZWQgJiYgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgLy8gZmluaXNoIGVkaXRpbmcgb25seSBvbiBzdWNjZXNzXG4gICAgICAgICAgICAgICAgY2IgPSB0aGlzLm9uRWRpdGluZ0RvbmUuYmluZCh0aGlzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IG5ld1BlbmRpbmdJbWFnZXMgPSB0aGlzLnN0YXRlLnBlbmRpbmdJbWFnZXMuZmlsdGVyKChpbWcpID0+IGltZy5rZXkgIT09IGFkZGVkSW1hZ2Uua2V5KTtcbiAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0ltYWdlczogbmV3UGVuZGluZ0ltYWdlcyxcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICBpZiAobmV3UGVuZGluZ0ltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5zY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUobmV3U3RhdGUsIGNiKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIFRoZSBoYW5kbGVyIGlzIHRoZSBvYmplY3QgdGhyb3VnaCB3aGljaCB0aGUgb3V0ZXIgY29udGV4dFxuICAgICAgICAgICAgICAgKiBjb21tdW5pY2F0ZXMgZmlsZSB1cGxvYWQgZXZlbnRzIGxpa2U6IGZpbGVDaG9zZW4sIGNhbmNlbCwgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBnZXRIYW5kbGVyKG9uRmluaXNoLCAoKSA9PiB0aGlzLnN0YXRlLnZhbHVlKTtcbiAgICAgICAgICAgICAgcHJvcHMuaW1hZ2VTdXBwb3J0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nSW1hZ2VzOiBbLi4ucGVuZGluZ0ltYWdlcywgYWRkZWRJbWFnZV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNhbGxiYWNrLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgb25Gb2N1czogdGhpcy5vblBsdWdpbkZvY3VzLFxuICAgICAgICBvbkJsdXI6IHRoaXMub25QbHVnaW5CbHVyLFxuICAgICAgICBtYXhJbWFnZVdpZHRoOiBwcm9wcy5tYXhJbWFnZVdpZHRoLFxuICAgICAgICBtYXhJbWFnZUhlaWdodDogcHJvcHMubWF4SW1hZ2VIZWlnaHQsXG4gICAgICB9LFxuICAgICAgdG9vbGJhcjoge1xuICAgICAgICAvKipcbiAgICAgICAgICogVG8gbWluaW1pemUgY29udmVydGluZyBodG1sIC0+IHN0YXRlIC0+IGh0bWxcbiAgICAgICAgICogV2Ugb25seSBlbWl0IG1hcmt1cCBvbmNlICdkb25lJyBpcyBjbGlja2VkLlxuICAgICAgICAgKi9cbiAgICAgICAgZGlzYWJsZVNjcm9sbGJhcjogISFwcm9wcy5kaXNhYmxlU2Nyb2xsYmFyLFxuICAgICAgICBkaXNhYmxlVW5kZXJsaW5lOiBwcm9wcy5kaXNhYmxlVW5kZXJsaW5lLFxuICAgICAgICBhdXRvV2lkdGg6IHByb3BzLmF1dG9XaWR0aFRvb2xiYXIsXG4gICAgICAgIG9uRG9uZTogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgbm9uRW1wdHkgfSA9IHByb3BzO1xuXG4gICAgICAgICAgbG9nKCdbb25Eb25lXScpO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB0b29sYmFySW5Gb2N1czogZmFsc2UsIGZvY3VzZWROb2RlOiBudWxsLCBmb2N1c1Rvb2xiYXI6IGZhbHNlIH0pO1xuICAgICAgICAgIHRoaXMuZWRpdG9yLmJsdXIoKTtcblxuICAgICAgICAgIGlmIChub25FbXB0eSAmJiB0aGlzLnN0YXRlLnZhbHVlLnN0YXJ0VGV4dD8udGV4dD8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0VmFsdWUodHJ1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMub25FZGl0aW5nRG9uZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25FZGl0aW5nRG9uZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YWJsZToge1xuICAgICAgICBvbkZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgbG9nKCdbdGFibGU6b25Gb2N1c10uLi4nKTtcbiAgICAgICAgICB0aGlzLm9uUGx1Z2luRm9jdXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiAoKSA9PiB7XG4gICAgICAgICAgbG9nKCdbdGFibGU6b25CbHVyXS4uLicpO1xuICAgICAgICAgIHRoaXMub25QbHVnaW5CbHVyKCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVzcG9uc2VBcmVhOiB7XG4gICAgICAgIHR5cGU6IG5vcm1hbGl6ZWRSZXNwb25zZUFyZWFQcm9wcy50eXBlLFxuICAgICAgICBvcHRpb25zOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMub3B0aW9ucyxcbiAgICAgICAgbWF4UmVzcG9uc2VBcmVhczogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLm1heFJlc3BvbnNlQXJlYXMsXG4gICAgICAgIHJlc3BBcmVhVG9vbGJhcjogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLnJlc3BBcmVhVG9vbGJhcixcbiAgICAgICAgb25IYW5kbGVBcmVhQ2hhbmdlOiBub3JtYWxpemVkUmVzcG9uc2VBcmVhUHJvcHMub25IYW5kbGVBcmVhQ2hhbmdlLFxuICAgICAgICBlcnJvcjogbm9ybWFsaXplZFJlc3BvbnNlQXJlYVByb3BzLmVycm9yLFxuICAgICAgICBvbkZvY3VzOiAoKSA9PiB7XG4gICAgICAgICAgbG9nKCdbdGFibGU6b25Gb2N1c10uLi4nKTtcbiAgICAgICAgICB0aGlzLm9uUGx1Z2luRm9jdXMoKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25CbHVyOiAoKSA9PiB7XG4gICAgICAgICAgbG9nKCdbdGFibGU6b25CbHVyXS4uLicpO1xuICAgICAgICAgIHRoaXMub25QbHVnaW5CbHVyKCk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2VDaGFyYWN0ZXJzOiBwcm9wcy5sYW5ndWFnZUNoYXJhY3RlcnNQcm9wcyxcbiAgICAgIGtleVBhZENoYXJhY3RlclJlZjogdGhpcy5rZXlQYWRDaGFyYWN0ZXJSZWYsXG4gICAgICBzZXRLZXlwYWRJbnRlcmFjdGlvbjogdGhpcy5zZXRLZXlwYWRJbnRlcmFjdGlvbixcbiAgICAgIG1lZGlhOiB7XG4gICAgICAgIGZvY3VzOiB0aGlzLmZvY3VzLFxuICAgICAgICBjcmVhdGVDaGFuZ2U6ICgpID0+IHRoaXMuc3RhdGUudmFsdWUuY2hhbmdlKCksXG4gICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLFxuICAgICAgICB1cGxvYWRTb3VuZFN1cHBvcnQ6IHByb3BzLnVwbG9hZFNvdW5kU3VwcG9ydCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMubWF0aE1sT3B0aW9ucy5tbWxPdXRwdXQgfHwgcHJvcHMubWF0aE1sT3B0aW9ucy5tbWxFZGl0aW5nKSB7XG4gICAgICB0aGlzLnByb3BzLnJ1blNlcmlhbGl6YXRpb25Pbk1hcmt1cCgpO1xuICAgIH1cbiAgfTtcblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAvLyBvblJlZiBpcyBuZWVkZWQgdG8gZ2V0IHRoZSByZWYgb2YgdGhlIGNvbXBvbmVudCBiZWNhdXNlIHdlIGV4cG9ydCBpdCB1c2luZyB3aXRoU3R5bGVzXG4gICAgdGhpcy5wcm9wcy5vblJlZih0aGlzKTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcblxuICAgIGNvbnN0IGlzUmVzcG9uc2VBcmVhRWRpdG9yID0gdGhpcy5wcm9wcy5jbGFzc05hbWU/LmluY2x1ZGVzKCdyZXNwb25zZS1hcmVhLWVkaXRvcicpO1xuXG4gICAgaWYgKGlzUmVzcG9uc2VBcmVhRWRpdG9yICYmIHRoaXMuZWRpdG9yKSB7XG4gICAgICBjb25zdCByZXNwb25zZUFyZWFFZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1rZXk9XCIke3RoaXMuZWRpdG9yLnZhbHVlLmRvY3VtZW50LmtleX1cIl1gKTtcblxuICAgICAgaWYgKHJlc3BvbnNlQXJlYUVkaXRvcikge1xuICAgICAgICByZXNwb25zZUFyZWFFZGl0b3Iuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0Fuc3dlcicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgICAgIGNvbnN0IGVkaXRvckRPTSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7dGhpcy5lZGl0b3IudmFsdWUuZG9jdW1lbnQua2V5fVwiXWApO1xuXG4gICAgICAgICAgdGhpcy5lZGl0b3IuZm9jdXMoKTtcblxuICAgICAgICAgIGlmIChlZGl0b3JET00pIHtcbiAgICAgICAgICAgIGVkaXRvckRPTS5mb2N1cygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgY29uc3QgeyBpc0h0bWxNb2RlLCB0b29sYmFyT3B0cyB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBuZXdUb29sYmFyT3B0cyA9IGNyZWF0ZVRvb2xiYXJPcHRzKG5leHRQcm9wcy50b29sYmFyT3B0cywgbmV4dFByb3BzLmVycm9yLCBpc0h0bWxNb2RlKTtcblxuICAgIGlmICghaXNFcXVhbChuZXdUb29sYmFyT3B0cywgdG9vbGJhck9wdHMpKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdG9vbGJhck9wdHM6IG5ld1Rvb2xiYXJPcHRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGlmZmVyZW50Q2hhcmFjdGVyUHJvcHMgPSAhaXNFcXVhbChuZXh0UHJvcHMubGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHMsIHRoaXMucHJvcHMubGFuZ3VhZ2VDaGFyYWN0ZXJzUHJvcHMpO1xuICAgIGNvbnN0IGRpZmZlcmVudE1hdGhNbFByb3BzID0gIWlzRXF1YWwobmV4dFByb3BzLm1hdGhNbE9wdGlvbnMsIHRoaXMucHJvcHMubWF0aE1sT3B0aW9ucyk7XG4gICAgY29uc3QgZGlmZmVyZW50SW1hZ2VNYXhEaW1lbnNpb25zUHJvcHMgPVxuICAgICAgIWlzRXF1YWwobmV4dFByb3BzLm1heEltYWdlV2lkdGgsIHRoaXMucHJvcHMubWF4SW1hZ2VXaWR0aCkgfHxcbiAgICAgICFpc0VxdWFsKG5leHRQcm9wcy5tYXhJbWFnZUhlaWdodCwgdGhpcy5wcm9wcy5tYXhJbWFnZUhlaWdodCk7XG5cbiAgICBpZiAoZGlmZmVyZW50Q2hhcmFjdGVyUHJvcHMgfHwgZGlmZmVyZW50TWF0aE1sUHJvcHMgfHwgZGlmZmVyZW50SW1hZ2VNYXhEaW1lbnNpb25zUHJvcHMpIHtcbiAgICAgIHRoaXMuaGFuZGxlUGx1Z2lucyhuZXh0UHJvcHMpO1xuICAgIH1cblxuICAgIGlmICghbmV4dFByb3BzLnZhbHVlPy5kb2N1bWVudD8uZXF1YWxzKHRoaXMucHJvcHMudmFsdWU/LmRvY3VtZW50KSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IG5leHRQcm9wcy52YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIFRoZSBjdXJzb3IgaXMgb24gYSB6ZXJvIHdpZHRoIGVsZW1lbnQgYW5kIHdoZW4gdGhhdCBpcyBwbGFjZWQgbmVhciB2b2lkIGVsZW1lbnRzLCBpdCBpcyBub3QgdmlzaWJsZVxuICAgIC8vIHNvIHdlIGluY3JlYXNlIHRoZSB3aWR0aCB0byBhdCBsZWFzdCAycHggaW4gb3JkZXIgZm9yIHRoZSB1c2VyIHRvIHNlZSBpdFxuXG4gICAgLy8gVHJpZ2dlciBwbHVnaW5zIGFuZCBmaW5pc2ggZWRpdGluZyBpZjpcbiAgICAvLyAxLiBUaGUgJ2lzSHRtbE1vZGUnIHN0YXRlIGhhcyBiZWVuIHRvZ2dsZWQuXG4gICAgLy8gMi4gV2UncmUgY3VycmVudGx5IGluICdpc0h0bWxNb2RlJyBhbmQgdGhlIGVkaXRvciB2YWx1ZSBoYXMgYmVlbiBtb2RpZmllZC5cbiAgICBpZiAoXG4gICAgICB0aGlzLnN0YXRlLmlzSHRtbE1vZGUgIT09IHByZXZTdGF0ZS5pc0h0bWxNb2RlIHx8XG4gICAgICAodGhpcy5zdGF0ZS5pc0h0bWxNb2RlICYmICFwcmV2U3RhdGUuaXNFZGl0ZWRJbkh0bWxNb2RlICYmIHRoaXMuc3RhdGUuaXNFZGl0ZWRJbkh0bWxNb2RlKVxuICAgICkge1xuICAgICAgdGhpcy5oYW5kbGVQbHVnaW5zKHRoaXMucHJvcHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHplcm9XaWR0aEVscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXNsYXRlLXplcm8td2lkdGg9XCJ6XCJdJyk7XG5cbiAgICBBcnJheS5mcm9tKHplcm9XaWR0aEVscykuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsLnN0eWxlLm1pbldpZHRoID0gJzJweCc7XG4gICAgICBlbC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XG4gICAgfSk7XG4gIH1cblxuICBvblBsdWdpbkJsdXIgPSAoZSkgPT4ge1xuICAgIGxvZygnW29uUGx1Z2luQmx1cl0nLCBlICYmIGUucmVsYXRlZFRhcmdldCk7XG4gICAgY29uc3QgdGFyZ2V0ID0gZSAmJiBlLnJlbGF0ZWRUYXJnZXQ7XG5cbiAgICBjb25zdCBub2RlID0gdGFyZ2V0ID8gZmluZE5vZGUodGFyZ2V0LCB0aGlzLnN0YXRlLnZhbHVlKSA6IG51bGw7XG4gICAgbG9nKCdbb25QbHVnaW5CbHVyXSBub2RlOiAnLCBub2RlKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZE5vZGU6IG5vZGUgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5yZXNldFZhbHVlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgb25QbHVnaW5Gb2N1cyA9IChlKSA9PiB7XG4gICAgbG9nKCdbb25QbHVnaW5Gb2N1c10nLCBlICYmIGUudGFyZ2V0KTtcbiAgICBjb25zdCB0YXJnZXQgPSBlICYmIGUudGFyZ2V0O1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBmaW5kTm9kZSh0YXJnZXQsIHRoaXMuc3RhdGUudmFsdWUpO1xuICAgICAgbG9nKCdbb25QbHVnaW5Gb2N1c10gbm9kZTogJywgbm9kZSk7XG5cbiAgICAgIGNvbnN0IHN0YXNoZWRWYWx1ZSA9IHRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlIHx8IHRoaXMuc3RhdGUudmFsdWU7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZE5vZGU6IG5vZGUsIHN0YXNoZWRWYWx1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGZvY3VzZWROb2RlOiBudWxsIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXNoVmFsdWUoKTtcbiAgfTtcblxuICBvbk1hdGhDbGljayA9IChub2RlKSA9PiB7XG4gICAgdGhpcy5lZGl0b3IuY2hhbmdlKChjKSA9PiBjLmNvbGxhcHNlVG9TdGFydE9mKG5vZGUpKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2VsZWN0ZWROb2RlOiBub2RlIH0pO1xuICB9O1xuXG4gIG9uRWRpdGluZ0RvbmUgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBpc0h0bWxNb2RlLCBkaWFsb2csIHZhbHVlLCBwZW5kaW5nSW1hZ2VzIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgLy8gSGFuZGxpbmcgSFRNTCBtb2RlIGFuZCBkaWFsb2cgc3RhdGVcbiAgICBpZiAoaXNIdG1sTW9kZSkge1xuICAgICAgLy8gRWFybHkgcmV0dXJuIGlmIEhUTUwgbW9kZSBpcyBlbmFibGVkXG4gICAgICBpZiAoZGlhbG9nPy5vcGVuKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGh0bWxUb1ZhbHVlKHZhbHVlLmRvY3VtZW50LnRleHQpO1xuICAgICAgY29uc3QgcHJldmlld1RleHQgPSB0aGlzLnJlbmRlckh0bWxQcmV2aWV3Q29udGVudCgpO1xuXG4gICAgICB0aGlzLm9wZW5IdG1sTW9kZUNvbmZpcm1hdGlvbkRpYWxvZyhjdXJyZW50VmFsdWUsIHByZXZpZXdUZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocGVuZGluZ0ltYWdlcy5sZW5ndGgpIHtcbiAgICAgIC8vIHNjaGVkdWxlIGltYWdlIHByb2Nlc3NpbmdcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzY2hlZHVsZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemluZyBlZGl0aW5nXG4gICAgbG9nKCdbb25FZGl0aW5nRG9uZV0nKTtcbiAgICB0aGlzLnNldFN0YXRlKHsgcGVuZGluZ0ltYWdlczogW10sIHN0YXNoZWRWYWx1ZTogbnVsbCwgZm9jdXNlZE5vZGU6IG51bGwgfSk7XG4gICAgbG9nKCdbb25FZGl0aW5nRG9uZV0gdmFsdWU6ICcsIHRoaXMuc3RhdGUudmFsdWUpO1xuICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5zdGF0ZS52YWx1ZSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIEhUTUwgcHJldmlldyBjb250ZW50IHRvIGJlIGRpc3BsYXllZCBpbnNpZGUgdGhlIGRpYWxvZy5cbiAgICogVGhpcyBjb250ZW50IGluY2x1ZGVzIHRoZSBlZGl0ZWQgSFRNTCBhbmQgYSBwcm9tcHQgZm9yIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVuZGVySHRtbFByZXZpZXdDb250ZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NlcyB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiByZWY9eyhyZWYpID0+ICh0aGlzLmVsZW1lbnRSZWYgPSByZWYpfT5cbiAgICAgICAgPGRpdj5QcmV2aWV3IG9mIEVkaXRlZCBIdG1sOjwvZGl2PlxuICAgICAgICA8UHJldmlld1Byb21wdCBkZWZhdWx0Q2xhc3NOYW1lPXtjbGFzc2VzLnByZXZpZXdUZXh0fSBwcm9tcHQ9e3RoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQudGV4dH0gLz5cbiAgICAgICAgPGRpdj5Xb3VsZCB5b3UgbGlrZSB0byBzYXZlIHRoZXNlIGNoYW5nZXMgPzwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogT3BlbnMgYSBjb25maXJtYXRpb24gZGlhbG9nIGluIEhUTUwgbW9kZSwgZGlzcGxheWluZyB0aGUgcHJldmlldyBvZiB0aGUgY3VycmVudCBIVE1MIGNvbnRlbnRcbiAgICogYW5kIG9mZmVyaW5nIG9wdGlvbnMgdG8gc2F2ZSBvciBjb250aW51ZSBlZGl0aW5nLlxuICAgKi9cbiAgb3Blbkh0bWxNb2RlQ29uZmlybWF0aW9uRGlhbG9nID0gKGN1cnJlbnRWYWx1ZSwgcHJldmlld1RleHQpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpYWxvZzoge1xuICAgICAgICBvcGVuOiB0cnVlLFxuICAgICAgICB0aXRsZTogJ0NvbnRlbnQgUHJldmlldyAmIFNhdmUnLFxuICAgICAgICB0ZXh0OiBwcmV2aWV3VGV4dCxcbiAgICAgICAgb25Db25maXJtVGV4dDogJ1NhdmUgY2hhbmdlcycsXG4gICAgICAgIG9uQ2xvc2VUZXh0OiAnQ29udGludWUgZWRpdGluZycsXG4gICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlSHRtbE1vZGVTYXZlQ29uZmlybWF0aW9uKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IHRoaXMuaHRtbE1vZGVDb250aW51ZUVkaXRpbmcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBzYXZlIGNvbmZpcm1hdGlvbiBhY3Rpb24gaW4gSFRNTCBtb2RlLiBUaGlzIHVwZGF0ZXMgdGhlIHZhbHVlIHRvIHRoZSBjb25maXJtZWRcbiAgICogY29udGVudCwgdXBkYXRlcyB2YWx1ZSBvbiBwcm9wcywgYW5kIGV4aXRzIHRoZSBIVE1MIG1vZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50VmFsdWUgLSBUaGUgY29uZmlybWVkIHZhbHVlIG9mIHRoZSBIVE1MIGNvbnRlbnQgdG8gc2F2ZS5cbiAgICovXG4gIGhhbmRsZUh0bWxNb2RlU2F2ZUNvbmZpcm1hdGlvbiA9IChjdXJyZW50VmFsdWUpID0+IHtcbiAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IGN1cnJlbnRWYWx1ZSB9KTtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKGN1cnJlbnRWYWx1ZSwgdHJ1ZSk7XG4gICAgdGhpcy5oYW5kbGVEaWFsb2coZmFsc2UpO1xuICAgIHRoaXMudG9nZ2xlSHRtbE1vZGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBkaWFsb2cgaW4gSFRNTCBtb2RlIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gY29udGludWUgZWRpdGluZyB0aGUgaHRtbCBjb250ZW50LlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbiB0aGUgdXNlciBvcHRzIHRvIG5vdCBzYXZlIHRoZSBjdXJyZW50IGNoYW5nZXMuXG4gICAqL1xuICBodG1sTW9kZUNvbnRpbnVlRWRpdGluZyA9ICgpID0+IHtcbiAgICB0aGlzLmhhbmRsZURpYWxvZyhmYWxzZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBvblJlc2l6ZSBldmVudCBsaXN0ZW5lclxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25SZXNpemUpO1xuICB9XG5cbiAgLy8gQWxsb3dpbmcgdGltZSBmb3Igb25DaGFuZ2UgdG8gdGFrZSBlZmZlY3QgaWYgaXQgaXMgY2FsbGVkXG4gIGhhbmRsZUJsdXIgPSAocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHsgbm9uRW1wdHkgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3Qge1xuICAgICAgdG9vbGJhck9wdHM6IHsgZG9uZU9uIH0sXG4gICAgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICB0aGlzLnNldFN0YXRlKHsgdG9vbGJhckluRm9jdXM6IGZhbHNlLCBmb2N1c2VkTm9kZTogbnVsbCB9KTtcblxuICAgIGlmICh0aGlzLmVkaXRvcikge1xuICAgICAgdGhpcy5lZGl0b3IuYmx1cigpO1xuICAgIH1cblxuICAgIGlmIChkb25lT24gPT09ICdibHVyJykge1xuICAgICAgaWYgKG5vbkVtcHR5ICYmIHRoaXMuc3RhdGUudmFsdWUuc3RhcnRUZXh0Py50ZXh0Py5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5yZXNldFZhbHVlKHRydWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25FZGl0aW5nRG9uZSgpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uRWRpdGluZ0RvbmUoKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvbkJsdXIgPSAoZXZlbnQpID0+IHtcbiAgICBsb2coJ1tvbkJsdXJdJyk7XG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgY29uc3QgdG9vbGJhckVsZW1lbnQgPSB0aGlzLnRvb2xiYXJSZWYgJiYgcmVsYXRlZFRhcmdldD8uY2xvc2VzdChgW2NsYXNzKj1cIiR7dGhpcy50b29sYmFyUmVmLmNsYXNzTmFtZX1cIl1gKTtcblxuICAgIC8vIENoZWNrIGlmIHJlbGF0ZWRUYXJnZXQgaXMgYSBkb25lIGJ1dHRvblxuICAgIGNvbnN0IGlzUmF3RG9uZUJ1dHRvbiA9XG4gICAgICB0aGlzLmRvbmVCdXR0b25SZWYgJiYgcmVsYXRlZFRhcmdldD8uY2xvc2VzdChgW2NsYXNzKj1cIiR7dGhpcy5kb25lQnV0dG9uUmVmLmN1cnJlbnQ/LmNsYXNzTmFtZX1cIl1gKTtcblxuICAgIC8vIFNraXAgb25CbHVyIGhhbmRsaW5nIGlmIHJlbGF0ZWRUYXJnZXQgaXMgYSBidXR0b24gZnJvbSB0aGUgS2V5UGFkIGNoYXJhY3RlcnNcbiAgICB0aGlzLnNraXBCbHVySGFuZGxpbmcgPSB0aGlzLmtleXBhZEludGVyYWN0aW9uRGV0ZWN0ZWQgJiYgcmVsYXRlZFRhcmdldCAhPT0gbnVsbDtcblxuICAgIGlmICh0b29sYmFyRWxlbWVudCAmJiAhaXNSYXdEb25lQnV0dG9uICYmICF0aGlzLnN0YXRlLmZvY3VzVG9vbGJhcikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzVG9vbGJhcjogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGUgPSByZWxhdGVkVGFyZ2V0ID8gZmluZE5vZGUocmVsYXRlZFRhcmdldCwgdGhpcy5zdGF0ZS52YWx1ZSkgOiBudWxsO1xuXG4gICAgbG9nKCdbb25CbHVyXSBub2RlOiAnLCBub2RlKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNraXBCbHVySGFuZGxpbmcpIHtcbiAgICAgICAgdGhpcy5zZXRLZXlwYWRJbnRlcmFjdGlvbihmYWxzZSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgeyBwcmVCbHVyVmFsdWU6IHRoaXMuc3RhdGUudmFsdWUsIGZvY3VzZWROb2RlOiAhbm9kZSA/IG51bGwgOiBub2RlIH0sXG4gICAgICAgICAgdGhpcy5oYW5kbGVCbHVyLmJpbmQodGhpcywgcmVzb2x2ZSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucHJvcHMub25CbHVyKGV2ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICBoYW5kbGVEb21CbHVyID0gKGUpID0+IHtcbiAgICBjb25zdCBlZGl0b3JET00gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1rZXk9XCIke3RoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQua2V5fVwiXWApO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCB7IHZhbHVlOiBzdGF0ZVZhbHVlIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICBpZiAoIXRoaXMud3JhcHBlclJlZikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVkaXRvckVsZW1lbnQgPSAhZWRpdG9yRE9NIHx8IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuY2xvc2VzdChgW2NsYXNzKj1cIiR7ZWRpdG9yRE9NLmNsYXNzTmFtZX1cIl1gKTtcbiAgICAgIGNvbnN0IHRvb2xiYXJFbGVtZW50ID1cbiAgICAgICAgIXRoaXMudG9vbGJhclJlZiB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmNsb3Nlc3QoYFtjbGFzcyo9XCIke3RoaXMudG9vbGJhclJlZi5jbGFzc05hbWV9XCJdYCk7XG4gICAgICBjb25zdCBpc0luQ3VycmVudENvbXBvbmVudCA9IHRoaXMud3JhcHBlclJlZi5jb250YWlucyhlZGl0b3JFbGVtZW50KSB8fCB0aGlzLndyYXBwZXJSZWYuY29udGFpbnModG9vbGJhckVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWlzSW5DdXJyZW50Q29tcG9uZW50KSB7XG4gICAgICAgIGVkaXRvckRPTS5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5oYW5kbGVEb21CbHVyKTtcblxuICAgICAgICBpZiAoc3RhdGVWYWx1ZS5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICB0aGlzLm9uQmx1cihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIDUwKTtcbiAgfTtcblxuICAvKlxuICAgKiBOZWVkcyB0byBiZSB3cmFwcGVkIG90aGVyd2lzZSBpdCBjYXVzZXMgaXNzdWVzIGJlY2F1c2Ugb2YgcmFjZSBjb25kaXRpb25zXG4gICAqIEtub3duIGlzc3VlIGZvciBzbGF0ZWpzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9pYW5zdG9ybXRheWxvci9zbGF0ZS9pc3N1ZXMvMjA5N1xuICAgKiBVc2luZyB0aW1lb3V0IEkgd2Fzbid0IGFibGUgdG8gdGVzdCB0aGlzXG4gICAqXG4gICAqIE5vdGU6IFRoZSB1c2Ugb2YgcHJvbWlzZXMgaGFzIGJlZW4gY2F1c2luZyBpc3N1ZXMgd2l0aCBNYXRoUXVpbGxcbiAgICogKi9cbiAgb25Gb2N1cyA9IChldmVudCwgY2hhbmdlKSA9PlxuICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3JET00gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1rZXk9XCIke3RoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQua2V5fVwiXWApO1xuICAgICAgY29uc3QgaXNUb3VjaERldmljZSA9XG4gICAgICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICgnb250b3VjaHN0YXJ0JyBpbiB3aW5kb3cgfHwgbmF2aWdhdG9yPy5tYXhUb3VjaFBvaW50cyA+IDApO1xuXG4gICAgICBsb2coJ1tvbkZvY3VzXScsIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgICBpZiAodGhpcy5rZXlwYWRJbnRlcmFjdGlvbkRldGVjdGVkICYmIHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEEpIHtcbiAgICAgICAgdGhpcy5fX1RFTVBPUkFSWV9DSEFOR0VfREFUQSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIC0gQHNlZSBjaGFuZ2VEYXRhIGJlbG93IGZvciBzb21lIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBKSB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBkYXRhIH0gPSB0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBO1xuICAgICAgICBjb25zdCBkb21FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWtleT1cIiR7a2V5fVwiXWApO1xuXG4gICAgICAgIGlmIChkb21FbCkge1xuICAgICAgICAgIGxldCBjaGFuZ2UgPSB0aGlzLnN0YXRlLnZhbHVlLmNoYW5nZSgpLnNldE5vZGVCeUtleShrZXksIHsgZGF0YSB9KTtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IGNoYW5nZS52YWx1ZSB9LCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9fVEVNUE9SQVJZX0NIQU5HRV9EQVRBID0gbnVsbDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgaXMgbmVlZGVkIGp1c3QgaW4gY2FzZSB0aGUgYnJvd3NlciBkZWNpZGVzIHRvIG1ha2UgdGhlIGVkaXRvclxuICAgICAgICogbG9zZSBmb2N1cyB3aXRob3V0IHRyaWdnZXJpbmcgdGhlIG9uQmx1ciBldmVudCAoY2FuIGhhcHBlbiBpbiBhIGZldyBjYXNlcykuXG4gICAgICAgKiBUaGlzIHdpbGwgYWxzbyB0cmlnZ2VyIG9uQmx1ciBpZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgcGFnZSB3aGVuIHRoZSBlZGl0b3JcbiAgICAgICAqIGlzIGZvY3VzZWQuXG4gICAgICAgKi9cbiAgICAgIGlmIChlZGl0b3JET00gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgZWRpdG9yRE9NLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLmhhbmRsZURvbUJsdXIpO1xuICAgICAgICBlZGl0b3JET00uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuaGFuZGxlRG9tQmx1cik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3Rhc2hWYWx1ZSgpO1xuICAgICAgdGhpcy5wcm9wcy5vbkZvY3VzKCk7XG5cbiAgICAgIC8vIEFkZGVkIGZvciBhY2Nlc3NpYmlsaXR5OiBFbnN1cmVzIHRoZSBlZGl0b3IgZ2FpbnMgZm9jdXMgd2hlbiB0YWJiZWQgdG8gZm9yIGltcHJvdmVkIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgIGNvbnN0IHNob3VsZEZvY3VzRWRpdG9yID0gIXRoaXMua2V5cGFkSW50ZXJhY3Rpb25EZXRlY3RlZCAmJiAhaXNUb3VjaERldmljZTtcblxuICAgICAgaWYgKHNob3VsZEZvY3VzRWRpdG9yKSB7XG4gICAgICAgIGNoYW5nZT8uZm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuXG4gIHN0YXNoVmFsdWUgPSAoKSA9PiB7XG4gICAgbG9nKCdbc3Rhc2hWYWx1ZV0nKTtcblxuICAgIGlmICghdGhpcy5zdGF0ZS5zdGFzaGVkVmFsdWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdGFzaGVkVmFsdWU6IHRoaXMuc3RhdGUudmFsdWUgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdmFsdWUgaWYgdGhlIHVzZXIgZGlkbid0IGNsaWNrIGRvbmUuXG4gICAqL1xuICByZXNldFZhbHVlID0gKGZvcmNlKSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSwgZm9jdXNlZE5vZGUgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICBjb25zdCBzdG9wUmVzZXQgPSB0aGlzLnBsdWdpbnMucmVkdWNlKChzLCBwKSA9PiB7XG4gICAgICByZXR1cm4gcyB8fCAocC5zdG9wUmVzZXQgJiYgcC5zdG9wUmVzZXQodGhpcy5zdGF0ZS52YWx1ZSkpO1xuICAgIH0sIGZhbHNlKTtcblxuICAgIGxvZygnW3Jlc2V0VmFsdWVdJywgdmFsdWUuaXNGb2N1c2VkLCBmb2N1c2VkTm9kZSwgJ3N0b3BSZXNldDogJywgc3RvcFJlc2V0KTtcbiAgICBpZiAoKHRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlICYmICF2YWx1ZS5pc0ZvY3VzZWQgJiYgIWZvY3VzZWROb2RlICYmICFzdG9wUmVzZXQpIHx8IGZvcmNlKSB7XG4gICAgICBsb2coJ1tyZXNldFZhbHVlXSByZXNldHRpbmcuLi4nKTtcbiAgICAgIGxvZygnc3Rhc2hlZCcsIHRoaXMuc3RhdGUuc3Rhc2hlZFZhbHVlLmRvY3VtZW50LnRvT2JqZWN0KCkpO1xuICAgICAgbG9nKCdjdXJyZW50JywgdGhpcy5zdGF0ZS52YWx1ZS5kb2N1bWVudC50b09iamVjdCgpKTtcblxuICAgICAgY29uc3QgbmV3VmFsdWUgPSBWYWx1ZS5mcm9tSlNPTih0aGlzLnN0YXRlLnN0YXNoZWRWYWx1ZS50b0pTT04oKSk7XG5cbiAgICAgIGxvZygnbmV3VmFsdWU6ICcsIG5ld1ZhbHVlLmRvY3VtZW50KTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmFsdWU6IG5ld1ZhbHVlLCBzdGFzaGVkVmFsdWU6IG51bGwgfSwgKCkgPT4ge1xuICAgICAgICAgICAgbG9nKCd2YWx1ZSBub3c6ICcsIHRoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQudG9KU09OKCkpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCA1MCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgfVxuICB9O1xuXG4gIG9uQ2hhbmdlID0gKGNoYW5nZSwgZG9uZSkgPT4ge1xuICAgIGxvZygnW29uQ2hhbmdlXScpO1xuICAgIHdpbmRvdy5tZSA9IHRoaXM7XG5cbiAgICBjb25zdCB7IHZhbHVlIH0gPSBjaGFuZ2U7XG4gICAgY29uc3QgeyBjaGFyYWN0ZXJzTGltaXQgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IGxpbWl0ID0gY2hhcmFjdGVyc0xpbWl0O1xuICAgIGlmICghbGltaXQgfHwgbGltaXQgPiBNQVhfQ0hBUkFDVEVSU19MSU1JVCkge1xuICAgICAgbGltaXQgPSBNQVhfQ0hBUkFDVEVSU19MSU1JVDtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuZG9jdW1lbnQgJiYgdmFsdWUuZG9jdW1lbnQudGV4dCAmJiB2YWx1ZS5kb2N1bWVudC50ZXh0Lmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTWFyayB0aGUgZWRpdG9yIGFzIGVkaXRlZCB3aGVuIGluIEhUTUwgbW9kZSBhbmQgaXRzIGNvbnRlbnQgaGFzIGNoYW5nZWQuXG4gICAgLy8gVGhpcyBzdGF0dXMgd2lsbCBsYXRlciBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHByb21wdCBhIHdhcm5pbmcgdG8gdGhlIHVzZXIgd2hlbiBleGl0aW5nIEhUTUwgbW9kZS5cbiAgICBjb25zdCBpc0VkaXRlZEluSHRtbE1vZGUgPSAhdGhpcy5zdGF0ZS5pc0h0bWxNb2RlXG4gICAgICA/IGZhbHNlXG4gICAgICA6IHRoaXMuc3RhdGUudmFsdWUuZG9jdW1lbnQudGV4dCAhPT0gdmFsdWUuZG9jdW1lbnQudGV4dFxuICAgICAgPyB0cnVlXG4gICAgICA6IHRoaXMuc3RhdGUuaXNFZGl0ZWRJbkh0bWxNb2RlO1xuXG4gICAgaWYgKGlzRWRpdGVkSW5IdG1sTW9kZSAhPSB0aGlzLnN0YXRlLmlzRWRpdGVkSW5IdG1sTW9kZSkge1xuICAgICAgdGhpcy5oYW5kbGVQbHVnaW5zKHRoaXMucHJvcHMpO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZSwgaXNFZGl0ZWRJbkh0bWxNb2RlIH0sICgpID0+IHtcbiAgICAgIGxvZygnW29uQ2hhbmdlXSwgY2FsbCBkb25lKCknKTtcblxuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGdldEZvY3VzZWRWYWx1ZSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5zdGF0ZS52YWx1ZS5pc0ZvY3VzZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlLnByZUJsdXJWYWx1ZTtcbiAgfTtcblxuICB2YWx1ZVRvU2l6ZSA9ICh2KSA9PiB7XG4gICAgaWYgKCF2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNhbGNSZWdleCA9IC9eY2FsY1xcKCguKilcXCkkLztcblxuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2LmVuZHNXaXRoKCclJykpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHYuZW5kc1dpdGgoJ3B4JykgfHxcbiAgICAgICAgdi5lbmRzV2l0aCgndmgnKSB8fFxuICAgICAgICB2LmVuZHNXaXRoKCd2dycpIHx8XG4gICAgICAgIHYuZW5kc1dpdGgoJ2NoJykgfHxcbiAgICAgICAgdi5lbmRzV2l0aCgnZW0nKSB8fFxuICAgICAgICB2Lm1hdGNoKGNhbGNSZWdleClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VJbnQodiwgMTApO1xuICAgICAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdmFsdWUgOiBgJHt2YWx1ZX1weGA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBgJHt2fXB4YDtcbiAgICB9XG4gIH07XG5cbiAgYnVpbGRTaXplU3R5bGUoKSB7XG4gICAgY29uc3QgeyBtaW5XaWR0aCwgd2lkdGgsIG1heFdpZHRoLCBtaW5IZWlnaHQsIGhlaWdodCwgbWF4SGVpZ2h0IH0gPSB0aGlzLnByb3BzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0aGlzLnZhbHVlVG9TaXplKHdpZHRoKSxcbiAgICAgIG1pbldpZHRoOiB0aGlzLnZhbHVlVG9TaXplKG1pbldpZHRoKSxcbiAgICAgIG1heFdpZHRoOiB0aGlzLnZhbHVlVG9TaXplKG1heFdpZHRoKSxcbiAgICAgIGhlaWdodDogdGhpcy52YWx1ZVRvU2l6ZShoZWlnaHQpLFxuICAgICAgbWluSGVpZ2h0OiB0aGlzLnZhbHVlVG9TaXplKG1pbkhlaWdodCksXG4gICAgICBtYXhIZWlnaHQ6IHRoaXMudmFsdWVUb1NpemUobWF4SGVpZ2h0KSxcbiAgICB9O1xuICB9XG5cbiAgdmFsaWRhdGVOb2RlID0gKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS5vYmplY3QgIT09ICdibG9jaycpIHJldHVybjtcblxuICAgIGNvbnN0IGxhc3QgPSBub2RlLm5vZGVzLmxhc3QoKTtcbiAgICBpZiAoIWxhc3QpIHJldHVybjtcblxuICAgIGlmIChsYXN0LnR5cGUgIT09ICdpbWFnZScpIHJldHVybjtcblxuICAgIGxvZygnW3ZhbGlkYXRlTm9kZV0gbGFzdCBpcyBpbWFnZS4uJyk7XG5cbiAgICBjb25zdCBwYXJlbnQgPSBsYXN0LmdldFBhcmVudChsYXN0LmtleSk7XG4gICAgY29uc3QgcCA9IEJsb2NrLmdldFBhcmVudChsYXN0LmtleSk7XG4gICAgbG9nKCdbdmFsaWRhdGVOb2RlXSBwYXJlbnQ6JywgcGFyZW50LCBwKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY2hhbmdlRGF0YSA9IChrZXksIGRhdGEpID0+IHtcbiAgICBsb2coJ1tjaGFuZ2VEYXRhXS4gLi4gJywga2V5LCBkYXRhKTtcblxuICAgIC8qKlxuICAgICAqIEhBQ0sgQUxFUlQ6IFdlIHNob3VsZCBiZSBjYWxsaW5nIHNldFN0YXRlIGhlcmUgYW5kIHN0b3JpbmcgdGhlIGNoYW5nZSBkYXRhOlxuICAgICAqXG4gICAgICogPGNvZGU+dGhpcy5zZXRTdGF0ZSh7Y2hhbmdlRGF0YTogeyBrZXksIGRhdGF9fSk8L2NvZGU+XG4gICAgICogSG93ZXZlciB0aGlzIGlzIGNhdXNpbmcgaXNzdWVzIHdpdGggdGhlIE1hdGhxdWlsbCBpbnN0YW5jZS4gVGhlICdpbnB1dCcgZXZlbnQgc3RvcHMgZmlyaW5nIG9uIHRoZSBlbGVtZW50IGFuZCBub1xuICAgICAqIG1vcmUgY2hhbmdlcyBnZXQgdGhyb3VnaC4gVGhlIGlzc3VlcyBzZWVtIHRvIGJlIHJlbGF0ZWQgdG8gdGhlIHByb21pc2VzIGluIG9uQmx1ci9vbkZvY3VzLiBCdXQgcmVtb3ZpbmcgdGhlc2VcbiAgICAgKiBicmluZ3MgaXQncyBvd24gcHJvYmxlbXMuIEEgbWFqb3IgY2xlYW4gdXAgaXMgcGxhbm5lZCBmb3IgdGhpcyBjb21wb25lbnQgc28gSSd2ZSBkZWNpZGVkIHRvIHRlbXBvcmFyaWx5IHNldHRsZVxuICAgICAqIG9uIHRoaXMgaGFjayByYXRoZXIgdGhhbiBzcGVuZCBtb3JlIHRpbWUgb24gdGhpcy5cbiAgICAgKi9cblxuICAgIC8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gc2VlIHRoZSBidWcgZGVzY3JpYmVkIGFib3ZlLlxuICAgIC8vICAgIHRoaXMuc2V0U3RhdGUoe2NoYW5nZURhdGE6IHtrZXksIGRhdGF9fSlcblxuICAgIHRoaXMuX19URU1QT1JBUllfQ0hBTkdFX0RBVEEgPSB7IGtleSwgZGF0YSB9O1xuICB9O1xuXG4gIGZvY3VzID0gKHBvcywgbm9kZSkgPT4ge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gcG9zIHx8ICdlbmQnO1xuXG4gICAgdGhpcy5wcm9wcy5mb2N1cyhwb3NpdGlvbiwgbm9kZSk7XG4gIH07XG5cbiAgb25Ecm9wUGFzdGUgPSBhc3luYyAoZXZlbnQsIGNoYW5nZSwgZHJvcENvbnRleHQpID0+IHtcbiAgICBjb25zdCBlZGl0b3IgPSBjaGFuZ2UuZWRpdG9yO1xuICAgIGNvbnN0IHRyYW5zZmVyID0gZ2V0RXZlbnRUcmFuc2ZlcihldmVudCk7XG4gICAgY29uc3QgZmlsZSA9IHRyYW5zZmVyLmZpbGVzICYmIHRyYW5zZmVyLmZpbGVzWzBdO1xuXG4gICAgY29uc3QgdHlwZSA9IHRyYW5zZmVyLnR5cGU7XG4gICAgY29uc3QgZnJhZ21lbnQgPSB0cmFuc2Zlci5mcmFnbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gdHJhbnNmZXIudGV4dDtcblxuICAgIGlmIChmaWxlICYmIChmaWxlLnR5cGUgPT09ICdpbWFnZS9qcGVnJyB8fCBmaWxlLnR5cGUgPT09ICdpbWFnZS9qcGcnIHx8IGZpbGUudHlwZSA9PT0gJ2ltYWdlL3BuZycpKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuaW1hZ2VTdXBwb3J0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZygnW29uRHJvcFBhc3RlXScpO1xuICAgICAgICBjb25zdCBzcmMgPSBhd2FpdCBnZXRCYXNlNjQoZmlsZSk7XG4gICAgICAgIGNvbnN0IGlubGluZSA9IElubGluZS5jcmVhdGUoe1xuICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgaXNWb2lkOiB0cnVlLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgc3JjLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkcm9wQ29udGV4dCkge1xuICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGdldEV2ZW50UmFuZ2UoZXZlbnQsIGVkaXRvcik7XG4gICAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBjaGFuZ2Uuc2VsZWN0KHJhbmdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaCA9IGNoYW5nZS5pbnNlcnRJbmxpbmUoaW5saW5lKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZShjaCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSW5zZXJ0SW1hZ2VIYW5kbGVyKFxuICAgICAgICAgIGlubGluZSxcbiAgICAgICAgICAoKSA9PiB7fSxcbiAgICAgICAgICAoKSA9PiB0aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICAgIHRoaXMub25DaGFuZ2UsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgKTtcbiAgICAgICAgaGFuZGxlci5maWxlQ2hvc2VuKGZpbGUpO1xuICAgICAgICB0aGlzLnByb3BzLmltYWdlU3VwcG9ydC5hZGQoaGFuZGxlcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nKCdbb25Ecm9wUGFzdGVdIGVycm9yOiAnLCBlcnIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgY2hhbmdlLmluc2VydEZyYWdtZW50KGZyYWdtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd0ZXh0JyB8fCB0eXBlID09PSAnaHRtbCcpIHtcbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIHZhbHVlOiB7IGRvY3VtZW50LCBzZWxlY3Rpb24sIHN0YXJ0QmxvY2sgfSxcbiAgICAgIH0gPSBjaGFuZ2U7XG5cbiAgICAgIGlmIChzdGFydEJsb2NrLmlzVm9pZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRCbG9jayA9IHN0YXJ0QmxvY2s7XG4gICAgICBjb25zdCBkZWZhdWx0TWFya3MgPSBkb2N1bWVudC5nZXRJbnNlcnRNYXJrc0F0UmFuZ2Uoc2VsZWN0aW9uKTtcbiAgICAgIGNvbnN0IGZyYWcgPSBQbGFpbi5kZXNlcmlhbGl6ZSh0ZXh0LCB7XG4gICAgICAgIGRlZmF1bHRCbG9jayxcbiAgICAgICAgZGVmYXVsdE1hcmtzLFxuICAgICAgfSkuZG9jdW1lbnQ7XG4gICAgICBjaGFuZ2UuaW5zZXJ0RnJhZ21lbnQoZnJhZyk7XG4gICAgfVxuICB9O1xuXG4gIHJlbmRlclBsYWNlaG9sZGVyID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBlZGl0b3IgfSA9IHByb3BzO1xuICAgIGNvbnN0IHsgZG9jdW1lbnQgfSA9IGVkaXRvci52YWx1ZTtcblxuICAgIGlmICghZWRpdG9yLnByb3BzLnBsYWNlaG9sZGVyIHx8IGRvY3VtZW50LnRleHQgIT09ICcnIHx8IGRvY3VtZW50Lm5vZGVzLnNpemUgIT09IDEgfHwgIWRvY3VtZW50LmlzRW1wdHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPHNwYW5cbiAgICAgICAgY29udGVudEVkaXRhYmxlPXtmYWxzZX1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICAgICAgICB3aWR0aDogJ2ZpdC1jb250ZW50JywgLy8gZm9yIGNlbnRlcmluZyB0aGUgcGxhY2Vob2xkZXIgaWYgdGV4dC1hbGlnbiBpcyBzZXQgdG8gY2VudGVyXG4gICAgICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgICAgICBvcGFjaXR5OiAnMC4zMycsXG4gICAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2VkaXRvci5wcm9wcy5wbGFjZWhvbGRlcn1cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHNwZWxsQ2hlY2ssXG4gICAgICBoaWdobGlnaHRTaGFwZSxcbiAgICAgIGNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBpc0VkaXRvcixcbiAgICAgIHBsYWNlaG9sZGVyLFxuICAgICAgcGx1Z2luUHJvcHMsXG4gICAgICBvbktleURvd24sXG4gICAgfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBzZW5kIGN1c3RvbVBsdWdpbnMgdG8gc2xhdGUuXG4gICAgLy8gTm90IHN1cmUgaWYgdGhleSB3b3VsZCBkbyBhbnkgaGFybSwgYnV0IEkgdGhpbmsgaXQncyBiZXR0ZXIgdG8gbm90IHNlbmQgdGhlbS5cbiAgICAvLyBXZSB1c2UgY3VzdG9tIHBsdWdpbnMgdG8gYmUgYWJsZSB0byBhZGQgY3VzdG9tIGJ1dHRvbnNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBjb25zdCB7IGN1c3RvbVBsdWdpbnMsIHNob3dQYXJhZ3JhcGhzLCBzZXBhcmF0ZVBhcmFncmFwaHMsIC4uLm90aGVyUGx1Z2luUHJvcHMgfSA9IHBsdWdpblByb3BzIHx8IHt9O1xuXG4gICAgY29uc3QgeyB2YWx1ZSwgZm9jdXNlZE5vZGUsIHRvb2xiYXJPcHRzLCBkaWFsb2csIHNjaGVkdWxlZCB9ID0gdGhpcy5zdGF0ZTtcblxuICAgIGxvZygnW3JlbmRlcl0gdmFsdWU6ICcsIHZhbHVlKTtcbiAgICBjb25zdCBzaXplU3R5bGUgPSB0aGlzLmJ1aWxkU2l6ZVN0eWxlKCk7XG4gICAgY29uc3QgbmFtZXMgPSBjbGFzc05hbWVzKFxuICAgICAge1xuICAgICAgICBbY2xhc3Nlcy53aXRoQmddOiBoaWdobGlnaHRTaGFwZSxcbiAgICAgICAgW2NsYXNzZXMudG9vbGJhck9uVG9wXTogdG9vbGJhck9wdHMuYWx3YXlzVmlzaWJsZSAmJiB0b29sYmFyT3B0cy5wb3NpdGlvbiA9PT0gJ3RvcCcsXG4gICAgICAgIFtjbGFzc2VzLnNjaGVkdWxlZF06IHNjaGVkdWxlZCxcbiAgICAgIH0sXG4gICAgICBjbGFzc05hbWUsXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17KHJlZikgPT4gKHRoaXMud3JhcHBlclJlZiA9IHJlZil9XG4gICAgICAgIHN0eWxlPXt7IHdpZHRoOiBzaXplU3R5bGUud2lkdGgsIG1pbldpZHRoOiBzaXplU3R5bGUubWluV2lkdGgsIG1heFdpZHRoOiBzaXplU3R5bGUubWF4V2lkdGggfX1cbiAgICAgICAgY2xhc3NOYW1lPXtuYW1lc31cbiAgICAgICAgaWQ9e2BlZGl0b3ItJHt2YWx1ZT8uZG9jdW1lbnQ/LmtleX1gfVxuICAgICAgPlxuICAgICAgICB7c2NoZWR1bGVkICYmIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzLnVwbG9hZGluZ30+VXBsb2FkaW5nIGltYWdlIGFuZCB0aGVuIHNhdmluZy4uLjwvZGl2Pn1cbiAgICAgICAgPFNsYXRlRWRpdG9yXG4gICAgICAgICAgcGx1Z2lucz17dGhpcy5wbHVnaW5zfVxuICAgICAgICAgIGlubmVyUmVmPXsocikgPT4ge1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgdGhpcy5zbGF0ZUVkaXRvciA9IHI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfX1cbiAgICAgICAgICByZWY9eyhyKSA9PiAodGhpcy5lZGl0b3IgPSByICYmIHRoaXMucHJvcHMuZWRpdG9yUmVmKHIpKX1cbiAgICAgICAgICB0b29sYmFyUmVmPXsocikgPT4ge1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgdGhpcy50b29sYmFyUmVmID0gcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAgIGRvbmVCdXR0b25SZWY9e3RoaXMuZG9uZUJ1dHRvblJlZn1cbiAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgZm9jdXNUb29sYmFyPXt0aGlzLnN0YXRlLmZvY3VzVG9vbGJhcn1cbiAgICAgICAgICBvblRvb2xiYXJGb2N1cz17dGhpcy5oYW5kbGVUb29sYmFyRm9jdXN9XG4gICAgICAgICAgb25Ub29sYmFyQmx1cj17dGhpcy5oYW5kbGVUb29sYmFyQmx1cn1cbiAgICAgICAgICBmb2N1cz17dGhpcy5mb2N1c31cbiAgICAgICAgICBvbktleURvd249e29uS2V5RG93bn1cbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5vbkNoYW5nZX1cbiAgICAgICAgICBnZXRGb2N1c2VkVmFsdWU9e3RoaXMuZ2V0Rm9jdXNlZFZhbHVlfVxuICAgICAgICAgIG9uQmx1cj17dGhpcy5vbkJsdXJ9XG4gICAgICAgICAgb25Ecm9wPXsoZXZlbnQsIGVkaXRvcikgPT4gdGhpcy5vbkRyb3BQYXN0ZShldmVudCwgZWRpdG9yLCB0cnVlKX1cbiAgICAgICAgICBvblBhc3RlPXsoZXZlbnQsIGVkaXRvcikgPT4gdGhpcy5vbkRyb3BQYXN0ZShldmVudCwgZWRpdG9yKX1cbiAgICAgICAgICBvbkZvY3VzPXt0aGlzLm9uRm9jdXN9XG4gICAgICAgICAgb25FZGl0aW5nRG9uZT17dGhpcy5vbkVkaXRpbmdEb25lfVxuICAgICAgICAgIGZvY3VzZWROb2RlPXtmb2N1c2VkTm9kZX1cbiAgICAgICAgICBub3JtYWxpemU9e3RoaXMubm9ybWFsaXplfVxuICAgICAgICAgIHJlYWRPbmx5PXtkaXNhYmxlZH1cbiAgICAgICAgICBzcGVsbENoZWNrPXtzcGVsbENoZWNrfVxuICAgICAgICAgIGF1dG9Db3JyZWN0PXtzcGVsbENoZWNrfVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgW2NsYXNzZXMubm9QYWRkaW5nXTogdG9vbGJhck9wdHM/Lm5vUGFkZGluZyxcbiAgICAgICAgICAgICAgW2NsYXNzZXMuc2hvd1BhcmFncmFwaF06IHNob3dQYXJhZ3JhcGhzICYmICFzaG93UGFyYWdyYXBocy5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgW2NsYXNzZXMuc2VwYXJhdGVQYXJhZ3JhcGhdOiBzZXBhcmF0ZVBhcmFncmFwaHMgJiYgIXNlcGFyYXRlUGFyYWdyYXBocy5kaXNhYmxlZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjbGFzc2VzLnNsYXRlRWRpdG9yLFxuICAgICAgICAgICl9XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIG1pbkhlaWdodDogc2l6ZVN0eWxlLm1pbkhlaWdodCxcbiAgICAgICAgICAgIGhlaWdodDogc2l6ZVN0eWxlLmhlaWdodCxcbiAgICAgICAgICAgIG1heEhlaWdodDogc2l6ZVN0eWxlLm1heEhlaWdodCxcbiAgICAgICAgICB9fVxuICAgICAgICAgIHBsdWdpblByb3BzPXtvdGhlclBsdWdpblByb3BzfVxuICAgICAgICAgIHRvb2xiYXJPcHRzPXt0b29sYmFyT3B0c31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XG4gICAgICAgICAgcmVuZGVyUGxhY2Vob2xkZXI9e3RoaXMucmVuZGVyUGxhY2Vob2xkZXJ9XG4gICAgICAgICAgb25EYXRhQ2hhbmdlPXt0aGlzLmNoYW5nZURhdGF9XG4gICAgICAgIC8+XG4gICAgICAgIDxBbGVydERpYWxvZ1xuICAgICAgICAgIG9wZW49e2RpYWxvZy5vcGVufVxuICAgICAgICAgIHRpdGxlPXtkaWFsb2cudGl0bGV9XG4gICAgICAgICAgdGV4dD17ZGlhbG9nLnRleHR9XG4gICAgICAgICAgb25DbG9zZT17ZGlhbG9nLm9uQ2xvc2V9XG4gICAgICAgICAgb25Db25maXJtPXtkaWFsb2cub25Db25maXJtfVxuICAgICAgICAgIG9uQ29uZmlybVRleHQ9e2RpYWxvZy5vbkNvbmZpcm1UZXh0fVxuICAgICAgICAgIG9uQ2xvc2VUZXh0PXtkaWFsb2cub25DbG9zZVRleHR9XG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbi8vIFRPRE8gY29sb3IgLSBoYXJkY29kZWQgZ3JheSBiYWNrZ3JvdW5kIGFuZCBrZXlwYWQgY29sb3JzIHdpbGwgbmVlZCB0byBjaGFuZ2UgdG9vXG5jb25zdCBzdHlsZXMgPSB7XG4gIHdpdGhCZzoge1xuICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMC4wNiknLFxuICB9LFxuICBzY2hlZHVsZWQ6IHtcbiAgICBvcGFjaXR5OiAwLjUsXG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICB9LFxuICB1cGxvYWRpbmc6IHtcbiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICB0b3A6ICc1MCUnLFxuICAgIGxlZnQ6ICc1MCUnLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXG4gIH0sXG4gIHNsYXRlRWRpdG9yOiB7XG4gICAgZm9udEZhbWlseTogJ1JvYm90bywgc2Fucy1zZXJpZicsXG5cbiAgICAnJiB0YWJsZSc6IHtcbiAgICAgIHRhYmxlTGF5b3V0OiAnZml4ZWQnLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGJvcmRlckNvbGxhcHNlOiAnY29sbGFwc2UnLFxuICAgICAgY29sb3I6IGNvbG9yLnRleHQoKSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogY29sb3IuYmFja2dyb3VuZCgpLFxuICAgIH0sXG4gICAgJyYgdGFibGU6bm90KFtib3JkZXI9XCIxXCJdKSB0cic6IHtcbiAgICAgIGJvcmRlclRvcDogJzFweCBzb2xpZCAjZGZlMmU1JyxcbiAgICAgIC8vIFRPRE8gcGVyaGFwcyBzZWNvbmRhcnkgY29sb3IgZm9yIGJhY2tncm91bmQsIGZvciBub3cgZGlzYWJsZVxuICAgICAgLy8gJyY6bnRoLWNoaWxkKDJuKSc6IHtcbiAgICAgIC8vICAgYmFja2dyb3VuZENvbG9yOiAnI2Y2ZjhmYSdcbiAgICAgIC8vIH1cbiAgICB9LFxuICAgICcmIHRkLCB0aCc6IHtcbiAgICAgIHBhZGRpbmc6ICcuNmVtIDFlbScsXG4gICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgIH0sXG4gICAgJyYgdGFibGU6bm90KFtib3JkZXI9XCIxXCJdKSB0ZCwgdGgnOiB7XG4gICAgICBib3JkZXI6ICcxcHggc29saWQgI2RmZTJlNScsXG4gICAgfSxcbiAgfSxcbiAgc2hvd1BhcmFncmFwaDoge1xuICAgIC8vIGEgZGl2IHRoYXQgaGFzIGEgZGl2IGFmdGVyIGl0XG4gICAgJyYgPiBkaXY6aGFzKCsgZGl2KTo6YWZ0ZXInOiB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgY29udGVudDogJ1wiwrZcIicsXG4gICAgICBmb250U2l6ZTogJzFlbScsXG4gICAgICBjb2xvcjogJyMxNDZFQjMnLFxuICAgIH0sXG4gIH0sXG4gIHNlcGFyYXRlUGFyYWdyYXBoOiB7XG4gICAgLy8gYSBkaXYgdGhhdCBoYXMgYSBkaXYgYWZ0ZXIgaXRcbiAgICAnJiA+IGRpdjpoYXMoKyBkaXYpJzoge1xuICAgICAgbWFyZ2luQm90dG9tOiAnMWVtJyxcbiAgICB9LFxuICB9LFxuICB0b29sYmFyT25Ub3A6IHtcbiAgICBtYXJnaW5Ub3A6ICc0NXB4JyxcbiAgfSxcbiAgbm9QYWRkaW5nOiB7XG4gICAgcGFkZGluZzogJzAgIWltcG9ydGFudCcsXG4gIH0sXG4gIHByZXZpZXdUZXh0OiB7XG4gICAgbWFyZ2luQm90dG9tOiAnMzZweCcsXG4gICAgbWFyZ2luVG9wOiAnNnB4JyxcbiAgICBwYWRkaW5nOiAnMjBweCcsXG4gICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwwLjA2KScsXG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcykoRWRpdG9yKTtcbiJdfQ==