easy-richtextarea 4.0.3 → 4.0.4

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 (42) hide show
  1. package/README.md +0 -8
  2. package/example.js +1399 -982
  3. package/lib/constants.js +13 -4
  4. package/lib/contentCompare.js +34 -0
  5. package/lib/example/richTextarea.js +2 -2
  6. package/lib/example/view.js +18 -9
  7. package/lib/keyCodes.js +13 -0
  8. package/lib/operation/delete.js +101 -52
  9. package/lib/operation/empty.js +21 -6
  10. package/lib/operation/insert.js +78 -31
  11. package/lib/operations/fromJSON.js +4 -4
  12. package/lib/operations/generate.js +3 -3
  13. package/lib/operations/transform.js +3 -7
  14. package/lib/richTextarea.js +244 -156
  15. package/lib/selection.js +55 -13
  16. package/lib/types.js +13 -13
  17. package/lib/undoBuffer.js +105 -0
  18. package/package.json +3 -2
  19. package/src/constants.js +1 -0
  20. package/src/contentCompare.js +34 -0
  21. package/src/example/richTextarea.js +11 -9
  22. package/src/example/view.js +28 -10
  23. package/src/keyCodes.js +3 -0
  24. package/src/operation/delete.js +135 -58
  25. package/src/operation/empty.js +19 -14
  26. package/src/operation/insert.js +97 -39
  27. package/src/operations/fromJSON.js +4 -4
  28. package/src/operations/generate.js +8 -4
  29. package/src/operations/transform.js +3 -3
  30. package/src/richTextarea.js +316 -185
  31. package/src/selection.js +53 -9
  32. package/src/types.js +6 -6
  33. package/src/undoBuffer.js +73 -0
  34. package/test/content/transform.js +9 -11
  35. package/test/helpers.js +27 -21
  36. package/test/operation/delete.js +187 -147
  37. package/test/operation/empty.js +3 -5
  38. package/test/operation/insert.js +134 -118
  39. package/test/operations/generate.js +19 -22
  40. package/test/operations/transform.js +37 -98
  41. package/lib/stringCompare.js +0 -33
  42. package/src/stringCompare.js +0 -33
@@ -10,6 +10,12 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  var _easy = require("easy");
12
12
  var _selection = /*#__PURE__*/ _interopRequireDefault(require("./selection"));
13
+ var _undoBuffer = /*#__PURE__*/ _interopRequireDefault(require("./undoBuffer"));
14
+ var _insert = /*#__PURE__*/ _interopRequireDefault(require("./operation/insert"));
15
+ var _delete = /*#__PURE__*/ _interopRequireDefault(require("./operation/delete"));
16
+ var _generate = /*#__PURE__*/ _interopRequireDefault(require("./operations/generate"));
17
+ var _keyCodes = require("./keyCodes");
18
+ var _constants = require("./constants");
13
19
  function _arrayLikeToArray(arr, len) {
14
20
  if (len == null || len > arr.length) len = arr.length;
15
21
  for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
@@ -195,75 +201,173 @@ function _createSuper(Derived) {
195
201
  return _possibleConstructorReturn(this, result);
196
202
  };
197
203
  }
198
- var BLUR_EVENT_TYPE = _easy.eventTypes.BLUR_EVENT_TYPE, INPUT_EVENT_TYPE = _easy.eventTypes.INPUT_EVENT_TYPE, FOCUS_EVENT_TYPE = _easy.eventTypes.FOCUS_EVENT_TYPE, CHANGE_EVENT_TYPE = _easy.eventTypes.CHANGE_EVENT_TYPE, SCROLL_EVENT_TYPE = _easy.eventTypes.SCROLL_EVENT_TYPE, KEYDOWN_EVENT_TYPE = _easy.eventTypes.KEYDOWN_EVENT_TYPE, MOUSEUP_EVENT_TYPE = _easy.eventTypes.MOUSEUP_EVENT_TYPE, MOUSEDOWN_EVENT_TYPE = _easy.eventTypes.MOUSEDOWN_EVENT_TYPE, MOUSEMOVE_EVENT_TYPE = _easy.eventTypes.MOUSEMOVE_EVENT_TYPE, CONTEXTMENU_EVENT_TYPE = _easy.eventTypes.CONTEXTMENU_EVENT_TYPE;
199
- var defer = function(func) {
200
- return setTimeout(func, 0);
201
- };
204
+ var CUT_EVENT_TYPE = _easy.eventTypes.CUT_EVENT_TYPE, COPY_EVENT_TYPE = _easy.eventTypes.COPY_EVENT_TYPE, BLUR_EVENT_TYPE = _easy.eventTypes.BLUR_EVENT_TYPE, PASTE_EVENT_TYPE = _easy.eventTypes.PASTE_EVENT_TYPE, INPUT_EVENT_TYPE = _easy.eventTypes.INPUT_EVENT_TYPE, FOCUS_EVENT_TYPE = _easy.eventTypes.FOCUS_EVENT_TYPE, CHANGE_EVENT_TYPE = _easy.eventTypes.CHANGE_EVENT_TYPE, SCROLL_EVENT_TYPE = _easy.eventTypes.SCROLL_EVENT_TYPE, KEYDOWN_EVENT_TYPE = _easy.eventTypes.KEYDOWN_EVENT_TYPE, CONTEXTMENU_EVENT_TYPE = _easy.eventTypes.CONTEXTMENU_EVENT_TYPE, SELECTIONCHANGE_EVENT_TYPE = _easy.eventTypes.SELECTIONCHANGE_EVENT_TYPE;
202
205
  var RichTextarea = /*#__PURE__*/ function(Element) {
203
206
  _inherits(RichTextarea, Element);
204
207
  var _super = _createSuper(RichTextarea);
205
- function RichTextarea() {
208
+ function RichTextarea(selector, focused, readOnly, undoBuffer, previousContent, previousSelection) {
206
209
  _classCallCheck(this, RichTextarea);
207
210
  var _this;
208
- _this = _super.apply(this, arguments);
209
- _defineProperty(_assertThisInitialized(_this), "intermediateHandler", function(event, element, eventType, forced) {
210
- var readOnly = _this.isReadOnly();
211
- if (readOnly) {
212
- var previousContent = _this.getPreviousContent(), content = previousContent; ///
211
+ _this = _super.call(this, selector);
212
+ _defineProperty(_assertThisInitialized(_this), "intermediateHandler", function(event, element) {
213
+ var undoable = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true, eventType = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : CHANGE_EVENT_TYPE, selectionChanged = arguments.length > 4 && arguments[4] !== void 0 ? arguments[4] : _this.hasSelectionChanged();
214
+ if (_this.readOnly) {
215
+ var content = _this.previousContent; ///
213
216
  _this.setContent(content);
214
217
  }
215
- var changed = _this.hasChanged();
216
- if (changed || forced) {
218
+ var content1 = _this.getContent(), selection = _this.getSelection(), contentChanged = _this.hasContentChanged(), changed = contentChanged || selectionChanged;
219
+ if (changed) {
217
220
  _this.callHandlers(eventType, event, element);
218
221
  }
219
- var content1 = _this.getContent(), selection = _this.getSelection(), previousContent1 = content1, previousSelection = selection; ///
220
- _this.setPreviousContent(previousContent1);
221
- _this.setPreviousSelection(previousSelection);
222
- });
223
- _defineProperty(_assertThisInitialized(_this), "mouseDownHandler", function(event, element) {
224
- var forced = false, mouseDown = true, eventType = CHANGE_EVENT_TYPE;
225
- _this.setMouseDown(mouseDown);
226
- defer(function() {
227
- return _this.intermediateHandler(event, element, eventType, forced);
228
- });
222
+ if (undoable) {
223
+ if (contentChanged) {
224
+ var operations = (0, _generate.default)(_this.previousContent, content1);
225
+ _this.undoBuffer.addOperations(operations);
226
+ }
227
+ }
228
+ _this.previousContent = content1; ///
229
+ _this.previousSelection = selection; ///
229
230
  });
230
- _defineProperty(_assertThisInitialized(_this), "mouseMoveHandler", function(event, element) {
231
- var forced = false, mouseDown = _this.isMouseDown(), eventTYpe = CHANGE_EVENT_TYPE;
232
- if (mouseDown) {
233
- _this.intermediateHandler(event, element, eventTYpe, forced);
231
+ _defineProperty(_assertThisInitialized(_this), "selectChangeHandler", function(event, element) {
232
+ if (_this.focused) {
233
+ _this.intermediateHandler(event, element);
234
234
  }
235
235
  });
236
- _defineProperty(_assertThisInitialized(_this), "mouseUpHandler", function(event, element) {
237
- var mouseDown = false;
238
- _this.setMouseDown(mouseDown);
236
+ _defineProperty(_assertThisInitialized(_this), "contextmenuHandler", function(event, element) {
237
+ event.preventDefault();
239
238
  });
240
239
  _defineProperty(_assertThisInitialized(_this), "keyDownHandler", function(event, element) {
241
- var forced = false, eventType = CHANGE_EVENT_TYPE;
240
+ var keyCode = event.keyCode;
241
+ if (keyCode === _keyCodes.Z_KEY_CODE) {
242
+ var ctrlKey = event.ctrlKey, metaKey = event.metaKey;
243
+ if (ctrlKey || metaKey) {
244
+ var shiftKey = event.shiftKey;
245
+ shiftKey ? _this.redo(event, element) : _this.undo(event, element);
246
+ event.preventDefault();
247
+ return;
248
+ }
249
+ }
242
250
  defer(function() {
243
- return _this.intermediateHandler(event, element, eventType, forced);
251
+ _this.intermediateHandler(event, element);
244
252
  });
245
253
  });
246
- _defineProperty(_assertThisInitialized(_this), "inputHandler", function(event, element) {
247
- var forced = false, eventType = CHANGE_EVENT_TYPE;
248
- _this.intermediateHandler(event, element, eventType, forced);
249
- });
250
254
  _defineProperty(_assertThisInitialized(_this), "scrollHandler", function(event, element) {
251
255
  var eventType = SCROLL_EVENT_TYPE;
252
256
  _this.callHandlers(eventType, event, element);
253
257
  });
254
258
  _defineProperty(_assertThisInitialized(_this), "focusHandler", function(event, element) {
255
- var forced = true, eventType = FOCUS_EVENT_TYPE;
259
+ _this.focused = true;
256
260
  defer(function() {
257
- return _this.intermediateHandler(event, element, eventType, forced);
261
+ var undoable = true, eventType = FOCUS_EVENT_TYPE, selectionChanged = true;
262
+ _this.intermediateHandler(event, element, undoable, eventType, selectionChanged);
258
263
  });
259
264
  });
260
265
  _defineProperty(_assertThisInitialized(_this), "blurHandler", function(event, element) {
261
- var forced = true, eventType = BLUR_EVENT_TYPE;
262
- _this.intermediateHandler(event, element, eventType, forced);
266
+ _this.focused = false;
267
+ var undoable = true, eventType = BLUR_EVENT_TYPE, selectionChanged = true;
268
+ _this.intermediateHandler(event, element, undoable, eventType, selectionChanged);
269
+ });
270
+ _defineProperty(_assertThisInitialized(_this), "inputHandler", function(event, element) {
271
+ _this.intermediateHandler(event, element);
272
+ });
273
+ _defineProperty(_assertThisInitialized(_this), "pasteHandler", function(event, element) {
274
+ var clipboardData = event.clipboardData, textData = clipboardData.getData(_constants.TEXT);
275
+ if (textData === _constants.EMPTY_STRING) {
276
+ return;
277
+ }
278
+ var selection = _this.getSelection(), selectionEmpty = selection.isEmpty();
279
+ if (!selectionEmpty) {
280
+ var content = _this.getContent(), deleteOperation = _delete.default.fromContentAndSelection(content, selection), operation = deleteOperation;
281
+ _this.applyOperation(operation);
282
+ }
283
+ var content1 = textData, insertOperation = _insert.default.fromContentAndSelection(content1, selection), operation1 = insertOperation; ///
284
+ _this.applyOperation(operation1);
285
+ _this.intermediateHandler(event, element);
286
+ event.preventDefault();
287
+ });
288
+ _defineProperty(_assertThisInitialized(_this), "copyHandler", function(event, element) {
289
+ var selection = _this.getSelection(), selectionEmpty = selection.isEmpty();
290
+ if (selectionEmpty) {
291
+ return;
292
+ }
293
+ var selectedContent = _this.getSelectedContent();
294
+ navigator.clipboard.writeText(selectedContent);
295
+ event.preventDefault();
263
296
  });
297
+ _defineProperty(_assertThisInitialized(_this), "cutHandler", function(event, element) {
298
+ var selection = _this.getSelection(), selectionEmpty = selection.isEmpty();
299
+ if (selectionEmpty) {
300
+ return;
301
+ }
302
+ var selectedContent = _this.getSelectedContent();
303
+ navigator.clipboard.writeText(selectedContent);
304
+ var content = _this.getContent(), deleteOperation = _delete.default.fromContentAndSelection(content, selection), operation = deleteOperation; ///
305
+ _this.applyOperation(operation);
306
+ _this.intermediateHandler(event, element);
307
+ event.preventDefault();
308
+ });
309
+ _this.focused = focused;
310
+ _this.readOnly = readOnly;
311
+ _this.undoBuffer = undoBuffer;
312
+ _this.previousContent = previousContent;
313
+ _this.previousSelection = previousSelection;
264
314
  return _this;
265
315
  }
266
316
  _createClass(RichTextarea, [
317
+ {
318
+ key: "isFocused",
319
+ value: function isFocused() {
320
+ return this.focused;
321
+ }
322
+ },
323
+ {
324
+ key: "isReadOnly",
325
+ value: function isReadOnly() {
326
+ return this.readOnly;
327
+ }
328
+ },
329
+ {
330
+ key: "getUndoBuffer",
331
+ value: function getUndoBuffer() {
332
+ return this.undoBuffer;
333
+ }
334
+ },
335
+ {
336
+ key: "getPreviousContent",
337
+ value: function getPreviousContent() {
338
+ return this.prevousContent;
339
+ }
340
+ },
341
+ {
342
+ key: "getPreviousSelection",
343
+ value: function getPreviousSelection() {
344
+ return this.previousSelection;
345
+ }
346
+ },
347
+ {
348
+ key: "setFocused",
349
+ value: function setFocused(focused) {
350
+ this.focused = focused;
351
+ }
352
+ },
353
+ {
354
+ key: "setReadOnly",
355
+ value: function setReadOnly(readOnly) {
356
+ this.readOnly = readOnly;
357
+ }
358
+ },
359
+ {
360
+ key: "setPreviousContent",
361
+ value: function setPreviousContent(previousContent) {
362
+ this.previousContent = previousContent;
363
+ }
364
+ },
365
+ {
366
+ key: "setPreviousSelection",
367
+ value: function setPreviousSelection(previousSelection) {
368
+ this.previousSelection = previousSelection;
369
+ }
370
+ },
267
371
  {
268
372
  key: "isActive",
269
373
  value: function isActive() {
@@ -271,6 +375,28 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
271
375
  return active;
272
376
  }
273
377
  },
378
+ {
379
+ key: "undo",
380
+ value: function undo(event, element) {
381
+ var operation = this.undoBuffer.undo();
382
+ if (operation !== null) {
383
+ var undoable = false;
384
+ this.applyOperation(operation);
385
+ this.intermediateHandler(event, element, undoable);
386
+ }
387
+ }
388
+ },
389
+ {
390
+ key: "redo",
391
+ value: function redo(event, element) {
392
+ var operation = this.undoBuffer.redo();
393
+ if (operation !== null) {
394
+ var undoable = false;
395
+ this.applyOperation(operation);
396
+ this.intermediateHandler(event, element, undoable);
397
+ }
398
+ }
399
+ },
274
400
  {
275
401
  key: "getContent",
276
402
  value: function getContent() {
@@ -285,56 +411,66 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
285
411
  return selection;
286
412
  }
287
413
  },
414
+ {
415
+ key: "getSelectedContent",
416
+ value: function getSelectedContent() {
417
+ var content = this.getContent(), selection = this.getSelection(), endPosition = selection.getEndPosition(), startPosition = selection.getStartPosition(), start = startPosition, end = endPosition, selectedContent = content.slice(start, end);
418
+ return selectedContent;
419
+ }
420
+ },
421
+ {
422
+ key: "hasContentChanged",
423
+ value: function hasContentChanged() {
424
+ var content = this.getContent(), contentPreviousContent = content === this.previousContent, contentChanged = !contentPreviousContent;
425
+ return contentChanged;
426
+ }
427
+ },
428
+ {
429
+ key: "hasSelectionChanged",
430
+ value: function hasSelectionChanged() {
431
+ var selection = this.getSelection(), selectionPreviousSelection = selection.isEqualTo(this.previousSelection), selectionChanged = !selectionPreviousSelection; ///
432
+ return selectionChanged;
433
+ }
434
+ },
288
435
  {
289
436
  key: "setContent",
290
437
  value: function setContent(content) {
291
- var value = content, previousContent = content, domElement = this.getDOMElement();
438
+ var setPreviousContent = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
439
+ var value = content, domElement = this.getDOMElement();
292
440
  Object.assign(domElement, {
293
441
  value: value
294
442
  });
295
- this.setPreviousContent(previousContent);
443
+ if (setPreviousContent) {
444
+ this.previousContent = content; ///
445
+ }
296
446
  }
297
447
  },
298
448
  {
299
449
  key: "setSelection",
300
450
  value: function setSelection(selection) {
301
- var selectionStartPosition = selection.getStartPosition(), selectionEndPosition = selection.getEndPosition(), selectionStart = selectionStartPosition, selectionEnd = selectionEndPosition, previousSelection = selection, domElement = this.getDOMElement();
302
- Object.assign(domElement, {
303
- selectionStart: selectionStart,
304
- selectionEnd: selectionEnd
305
- });
306
- this.setPreviousSelection(previousSelection);
307
- }
308
- },
309
- {
310
- key: "hasChanged",
311
- value: function hasChanged() {
312
- var contentChanged = this.hasContentChanged(), selectionChanged = this.hasSelectionChanged(), changed = contentChanged || selectionChanged;
313
- return changed;
314
- }
315
- },
316
- {
317
- key: "hasContentChanged",
318
- value: function hasContentChanged() {
319
- var content = this.getContent(), previousContent = this.getPreviousContent(), contentDifferentToPreviousContent = content !== previousContent, contentChanged = contentDifferentToPreviousContent; ///
320
- return contentChanged;
451
+ var setPreviousSelection = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
452
+ var selectionStartPosition = selection.getStartPosition(), selectionEndPosition = selection.getEndPosition(), selectionStart = selectionStartPosition, selectionEnd = selectionEndPosition, domElement = this.getDOMElement();
453
+ domElement.setSelectionRange(selectionStart, selectionEnd);
454
+ if (setPreviousSelection) {
455
+ this.previousSelection = selection; ///
456
+ }
321
457
  }
322
458
  },
323
459
  {
324
- key: "hasSelectionChanged",
325
- value: function hasSelectionChanged() {
326
- var selection = this.getSelection(), previousSelection = this.getPreviousSelection(), selectionDifferentToPreviousSelection = selection.isDifferentTo(previousSelection), selectionChanged = selectionDifferentToPreviousSelection; ///
327
- return selectionChanged;
460
+ key: "applyOperation",
461
+ value: function applyOperation(operation) {
462
+ var content = this.getContent(), selection = this.getSelection();
463
+ var transformedContent = operation.transformContent(content), transformedSelection = operation.transformSelection(selection);
464
+ content = transformedContent; ///
465
+ selection = transformedSelection; ///
466
+ var setPreviousContent = false, setPreviousSelection = false;
467
+ this.setContent(content, setPreviousContent);
468
+ this.setSelection(selection, setPreviousSelection);
328
469
  }
329
470
  },
330
471
  {
331
472
  key: "activate",
332
473
  value: function activate() {
333
- var mouseDown = false;
334
- this.setMouseDown(mouseDown);
335
- _easy.window.on("".concat(BLUR_EVENT_TYPE, " ").concat(MOUSEUP_EVENT_TYPE, " ").concat(CONTEXTMENU_EVENT_TYPE), this.mouseUpHandler, this); ///
336
- this.on(MOUSEDOWN_EVENT_TYPE, this.mouseDownHandler, this);
337
- this.on(MOUSEMOVE_EVENT_TYPE, this.mouseMoveHandler, this);
338
474
  this.on(KEYDOWN_EVENT_TYPE, this.keyDownHandler, this);
339
475
  this.on(INPUT_EVENT_TYPE, this.inputHandler, this);
340
476
  this.on(SCROLL_EVENT_TYPE, this.scrollHandler, this);
@@ -346,11 +482,6 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
346
482
  {
347
483
  key: "deactivate",
348
484
  value: function deactivate() {
349
- var mouseDown = false;
350
- this.setMouseDown(mouseDown);
351
- _easy.window.off("".concat(BLUR_EVENT_TYPE, " ").concat(MOUSEUP_EVENT_TYPE, " ").concat(CONTEXTMENU_EVENT_TYPE), this.mouseUpHandler, this); ///
352
- this.off(MOUSEDOWN_EVENT_TYPE, this.mouseDownHandler, this);
353
- this.off(MOUSEMOVE_EVENT_TYPE, this.mouseMoveHandler, this);
354
485
  this.off(KEYDOWN_EVENT_TYPE, this.keyDownHandler, this);
355
486
  this.off(INPUT_EVENT_TYPE, this.inputHandler, this);
356
487
  this.off(SCROLL_EVENT_TYPE, this.scrollHandler, this);
@@ -424,7 +555,9 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
424
555
  var _this = this;
425
556
  var eventListeners = this.findEventListeners(eventType);
426
557
  eventListeners.forEach(function(eventListener) {
427
- var handler = eventListener.handler, handlerElement = eventListener.element, element = _this; ///
558
+ var element = eventListener.element;
559
+ var handler = eventListener.handler, handlerElement = element; ///
560
+ element = _this; ///
428
561
  if (handler !== _this.blurHandler && handler !== _this.focusHandler && handler !== _this.scrollHandler) {
429
562
  var _handler;
430
563
  (_handler = handler).call.apply(_handler, [
@@ -436,89 +569,22 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
436
569
  });
437
570
  }
438
571
  },
439
- {
440
- key: "isReadOnly",
441
- value: function isReadOnly() {
442
- var readOnly = this.getState().readOnly;
443
- return readOnly;
444
- }
445
- },
446
- {
447
- key: "isMouseDown",
448
- value: function isMouseDown() {
449
- var mouseDown = this.getState().mouseDown;
450
- return mouseDown;
451
- }
452
- },
453
- {
454
- key: "getPreviousContent",
455
- value: function getPreviousContent() {
456
- var previousContent = this.getState().previousContent;
457
- return previousContent;
458
- }
459
- },
460
- {
461
- key: "getPreviousSelection",
462
- value: function getPreviousSelection() {
463
- var previousSelection = this.getState().previousSelection;
464
- return previousSelection;
465
- }
466
- },
467
- {
468
- key: "setReadOnly",
469
- value: function setReadOnly(readOnly) {
470
- this.updateState({
471
- readOnly: readOnly
472
- });
473
- }
474
- },
475
- {
476
- key: "setMouseDown",
477
- value: function setMouseDown(mouseDown) {
478
- this.updateState({
479
- mouseDown: mouseDown
480
- });
481
- }
482
- },
483
- {
484
- key: "setPreviousContent",
485
- value: function setPreviousContent(previousContent) {
486
- this.updateState({
487
- previousContent: previousContent
488
- });
489
- }
490
- },
491
- {
492
- key: "setPreviousSelection",
493
- value: function setPreviousSelection(previousSelection) {
494
- this.updateState({
495
- previousSelection: previousSelection
496
- });
497
- }
498
- },
499
- {
500
- key: "setInitialState",
501
- value: function setInitialState() {
502
- var readOnly = false, mouseDown = false, previousContent = null, previousSelection = null;
503
- this.setState({
504
- readOnly: readOnly,
505
- mouseDown: mouseDown,
506
- previousContent: previousContent,
507
- previousSelection: previousSelection
508
- });
509
- }
510
- },
511
572
  {
512
573
  key: "didMount",
513
574
  value: function didMount() {
514
575
  var _this_properties = this.properties, onChange = _this_properties.onChange, onScroll = _this_properties.onScroll, onFocus = _this_properties.onFocus, onBlur = _this_properties.onBlur, changeHandler = onChange, scrollHandler = onScroll, focusHandler = onFocus, blurHandler = onBlur; ///
576
+ var content = this.getContent(), selection = this.getSelection();
577
+ this.previousContent = content; ///
578
+ this.previousSelection = selection; ///
515
579
  changeHandler && this.onChange(changeHandler, this);
516
580
  scrollHandler && this.onScroll(scrollHandler, this);
517
581
  focusHandler && this.onFocus(focusHandler, this);
518
582
  blurHandler && this.onBlur(blurHandler, this);
519
- var content = this.getContent(), selection = this.getSelection(), previousContent = content, previousSelection = selection; ///
520
- this.setPreviousSelection(previousSelection);
521
- this.setPreviousContent(previousContent);
583
+ this.on(CUT_EVENT_TYPE, this.cutHandler);
584
+ this.on(COPY_EVENT_TYPE, this.copyHandler);
585
+ this.on(PASTE_EVENT_TYPE, this.pasteHandler);
586
+ this.on(CONTEXTMENU_EVENT_TYPE, this.contextmenuHandler);
587
+ _easy.document.on(SELECTIONCHANGE_EVENT_TYPE, this.selectChangeHandler);
522
588
  }
523
589
  },
524
590
  {
@@ -529,16 +595,35 @@ var RichTextarea = /*#__PURE__*/ function(Element) {
529
595
  scrollHandler && this.offScroll(scrollHandler, this);
530
596
  focusHandler && this.offFocus(focusHandler, this);
531
597
  blurHandler && this.offBlur(blurHandler, this);
598
+ this.off(CUT_EVENT_TYPE, this.cutHandler);
599
+ this.off(COPY_EVENT_TYPE, this.copyHandler);
600
+ this.off(PASTE_EVENT_TYPE, this.pasteHandler);
601
+ this.off(CONTEXTMENU_EVENT_TYPE, this.contextmenuHandler);
602
+ _easy.document.off(SELECTIONCHANGE_EVENT_TYPE, this.selectChangeHandler);
532
603
  var active = this.isActive();
533
604
  if (active) {
534
605
  this.deactivate();
535
606
  }
536
607
  }
537
- },
608
+ }
609
+ ], [
538
610
  {
539
- key: "initialise",
540
- value: function initialise() {
541
- this.setInitialState();
611
+ key: "fromClass",
612
+ value: function fromClass(Class, properties) {
613
+ for(var _len = arguments.length, remainingArguments = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++){
614
+ remainingArguments[_key - 2] = arguments[_key];
615
+ }
616
+ var _Element;
617
+ var focused = false, readOnly = false, undoBuffer = _undoBuffer.default.fromNothing(), previousContent = null, previousSelection = null, richTextarea = (_Element = _easy.Element).fromClass.apply(_Element, [
618
+ Class,
619
+ properties,
620
+ focused,
621
+ readOnly,
622
+ undoBuffer,
623
+ previousContent,
624
+ previousSelection
625
+ ].concat(_toConsumableArray(remainingArguments)));
626
+ return richTextarea;
542
627
  }
543
628
  }
544
629
  ]);
@@ -554,5 +639,8 @@ _defineProperty(RichTextarea, "ignoredProperties", [
554
639
  _defineProperty(RichTextarea, "defaultProperties", {
555
640
  className: "rich"
556
641
  });
642
+ function defer(func) {
643
+ setTimeout(func, 0);
644
+ }
557
645
 
558
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yaWNoVGV4dGFyZWEuanMiLCI8PGpzeC1jb25maWctcHJhZ21hLmpzPj4iXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgeyB3aW5kb3csIEVsZW1lbnQsIGV2ZW50VHlwZXMgfSBmcm9tIFwiZWFzeVwiO1xyXG5cclxuaW1wb3J0IFNlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb25cIlxyXG5cclxuY29uc3QgeyBCTFVSX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgIElOUFVUX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgIEZPQ1VTX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgIENIQU5HRV9FVkVOVF9UWVBFLFxyXG4gICAgICAgICBTQ1JPTExfRVZFTlRfVFlQRSxcclxuICAgICAgICAgS0VZRE9XTl9FVkVOVF9UWVBFLFxyXG4gICAgICAgICBNT1VTRVVQX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgIE1PVVNFRE9XTl9FVkVOVF9UWVBFLFxyXG4gICAgICAgICBNT1VTRU1PVkVfRVZFTlRfVFlQRSxcclxuICAgICAgICAgQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSB9ID0gZXZlbnRUeXBlcztcclxuXHJcbmNvbnN0IGRlZmVyID0gKGZ1bmMpID0+IHNldFRpbWVvdXQoZnVuYywgMCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSaWNoVGV4dGFyZWEgZXh0ZW5kcyBFbGVtZW50IHtcclxuICBpbnRlcm1lZGlhdGVIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50LCBldmVudFR5cGUsIGZvcmNlZCkgPT4ge1xyXG4gICAgY29uc3QgcmVhZE9ubHkgPSB0aGlzLmlzUmVhZE9ubHkoKTtcclxuXHJcbiAgICBpZiAocmVhZE9ubHkpIHtcclxuICAgICAgY29uc3QgcHJldmlvdXNDb250ZW50ID0gdGhpcy5nZXRQcmV2aW91c0NvbnRlbnQoKSxcclxuICAgICAgICAgICAgY29udGVudCA9IHByZXZpb3VzQ29udGVudDsgIC8vL1xyXG5cclxuICAgICAgdGhpcy5zZXRDb250ZW50KGNvbnRlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmhhc0NoYW5nZWQoKTtcclxuXHJcbiAgICBpZiAoY2hhbmdlZCB8fCBmb3JjZWQpIHtcclxuICAgICAgdGhpcy5jYWxsSGFuZGxlcnMoZXZlbnRUeXBlLCBldmVudCwgZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKSxcclxuICAgICAgICAgIHByZXZpb3VzQ29udGVudCA9IGNvbnRlbnQsICAvLy9cclxuICAgICAgICAgIHByZXZpb3VzU2VsZWN0aW9uID0gc2VsZWN0aW9uOyAgLy8vXHJcblxyXG4gICAgdGhpcy5zZXRQcmV2aW91c0NvbnRlbnQocHJldmlvdXNDb250ZW50KTtcclxuICAgIHRoaXMuc2V0UHJldmlvdXNTZWxlY3Rpb24ocHJldmlvdXNTZWxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgbW91c2VEb3duSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgZm9yY2VkID0gZmFsc2UsXHJcbiAgICAgICAgICBtb3VzZURvd24gPSB0cnVlLFxyXG4gICAgICAgICAgZXZlbnRUeXBlID0gQ0hBTkdFX0VWRU5UX1RZUEU7XHJcblxyXG4gICAgdGhpcy5zZXRNb3VzZURvd24obW91c2VEb3duKTtcclxuXHJcbiAgICBkZWZlcigoKSA9PiB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIGV2ZW50VHlwZSwgZm9yY2VkKSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZU1vdmVIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBmb3JjZWQgPSBmYWxzZSxcclxuICAgICAgICAgIG1vdXNlRG93biA9IHRoaXMuaXNNb3VzZURvd24oKSxcclxuICAgICAgICAgIGV2ZW50VFlwZSA9IENIQU5HRV9FVkVOVF9UWVBFO1xyXG5cclxuICAgIGlmIChtb3VzZURvd24pIHtcclxuICAgICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBldmVudFRZcGUsIGZvcmNlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtb3VzZVVwSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgbW91c2VEb3duID0gZmFsc2U7XHJcblxyXG4gICAgdGhpcy5zZXRNb3VzZURvd24obW91c2VEb3duKTtcclxuICB9O1xyXG5cclxuICBrZXlEb3duSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgZm9yY2VkID0gZmFsc2UsXHJcbiAgICAgICAgICBldmVudFR5cGUgPSBDSEFOR0VfRVZFTlRfVFlQRTtcclxuXHJcbiAgICBkZWZlcigoKSA9PiB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIGV2ZW50VHlwZSwgZm9yY2VkKSk7XHJcbiAgfVxyXG5cclxuICBpbnB1dEhhbmRsZXIgPSAoZXZlbnQsIGVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGZvcmNlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgZXZlbnRUeXBlID0gQ0hBTkdFX0VWRU5UX1RZUEU7XHJcblxyXG4gICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBldmVudFR5cGUsIGZvcmNlZCk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGxIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBTQ1JPTExfRVZFTlRfVFlQRTtcclxuXHJcbiAgICB0aGlzLmNhbGxIYW5kbGVycyhldmVudFR5cGUsIGV2ZW50LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGZvY3VzSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgZm9yY2VkID0gdHJ1ZSxcclxuICAgICAgICAgIGV2ZW50VHlwZSA9IEZPQ1VTX0VWRU5UX1RZUEU7XHJcblxyXG4gICAgZGVmZXIoKCkgPT4gdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBldmVudFR5cGUsIGZvcmNlZCkpO1xyXG4gIH1cclxuXHJcbiAgYmx1ckhhbmRsZXIgPSAoZXZlbnQsIGVsZW1lbnQpID0+IHtcclxuICAgIGNvbnN0IGZvcmNlZCA9IHRydWUsXHJcbiAgICAgICAgICBldmVudFR5cGUgPSBCTFVSX0VWRU5UX1RZUEU7XHJcblxyXG4gICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCBldmVudFR5cGUsIGZvcmNlZCk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpIHtcclxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuaGFzQ2xhc3MoXCJhY3RpdmVcIik7XHJcblxyXG4gICAgcmV0dXJuIGFjdGl2ZTtcclxuICB9XHJcblxyXG4gIGdldENvbnRlbnQoKSB7XHJcbiAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5nZXRET01FbGVtZW50KCksXHJcbiAgICAgICAgICB7IHZhbHVlIH0gPSBkb21FbGVtZW50LFxyXG4gICAgICAgICAgY29udGVudCA9IHZhbHVlOyAgLy8vXHJcblxyXG4gICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCBkb21FbGVtZW50ID0gdGhpcy5nZXRET01FbGVtZW50KCksXHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBTZWxlY3Rpb24uZnJvbURPTUVsZW1lbnQoZG9tRWxlbWVudCk7XHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHNldENvbnRlbnQoY29udGVudCkge1xyXG4gICAgY29uc3QgdmFsdWUgPSBjb250ZW50LCAgLy8vXHJcbiAgICAgICAgICBwcmV2aW91c0NvbnRlbnQgPSBjb250ZW50LCAgLy8vXHJcbiAgICAgICAgICBkb21FbGVtZW50ID0gdGhpcy5nZXRET01FbGVtZW50KCk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihkb21FbGVtZW50LCB7XHJcbiAgICAgIHZhbHVlXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldFByZXZpb3VzQ29udGVudChwcmV2aW91c0NvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbikge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uU3RhcnRQb3NpdGlvbiA9IHNlbGVjdGlvbi5nZXRTdGFydFBvc2l0aW9uKCksXHJcbiAgICAgICAgICBzZWxlY3Rpb25FbmRQb3NpdGlvbiA9IHNlbGVjdGlvbi5nZXRFbmRQb3NpdGlvbigpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydFBvc2l0aW9uLCAgLy8vXHJcbiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmRQb3NpdGlvbiwgIC8vL1xyXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24sICAvLy9cclxuICAgICAgICAgIGRvbUVsZW1lbnQgPSB0aGlzLmdldERPTUVsZW1lbnQoKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGRvbUVsZW1lbnQsIHtcclxuICAgICAgc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgIHNlbGVjdGlvbkVuZFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZXRQcmV2aW91c1NlbGVjdGlvbihwcmV2aW91c1NlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBoYXNDaGFuZ2VkKCkge1xyXG4gICAgY29uc3QgY29udGVudENoYW5nZWQgPSB0aGlzLmhhc0NvbnRlbnRDaGFuZ2VkKCksXHJcbiAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkID0gdGhpcy5oYXNTZWxlY3Rpb25DaGFuZ2VkKCksXHJcbiAgICAgICAgICBjaGFuZ2VkID0gKGNvbnRlbnRDaGFuZ2VkIHx8IHNlbGVjdGlvbkNoYW5nZWQpO1xyXG5cclxuICAgIHJldHVybiBjaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgaGFzQ29udGVudENoYW5nZWQoKSB7XHJcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KCksXHJcbiAgICAgICAgICBwcmV2aW91c0NvbnRlbnQgPSB0aGlzLmdldFByZXZpb3VzQ29udGVudCgpLFxyXG4gICAgICAgICAgY29udGVudERpZmZlcmVudFRvUHJldmlvdXNDb250ZW50ID0gKGNvbnRlbnQgIT09IHByZXZpb3VzQ29udGVudCksXHJcbiAgICAgICAgICBjb250ZW50Q2hhbmdlZCA9IGNvbnRlbnREaWZmZXJlbnRUb1ByZXZpb3VzQ29udGVudDsgLy8vXHJcblxyXG4gICAgcmV0dXJuIGNvbnRlbnRDaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgaGFzU2VsZWN0aW9uQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZ2V0U2VsZWN0aW9uKCksXHJcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGlvbiA9IHRoaXMuZ2V0UHJldmlvdXNTZWxlY3Rpb24oKSxcclxuICAgICAgICAgIHNlbGVjdGlvbkRpZmZlcmVudFRvUHJldmlvdXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24uaXNEaWZmZXJlbnRUbyhwcmV2aW91c1NlbGVjdGlvbiksXHJcbiAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkID0gc2VsZWN0aW9uRGlmZmVyZW50VG9QcmV2aW91c1NlbGVjdGlvbjsgLy8vXHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbkNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBhY3RpdmF0ZSgpIHtcclxuICAgIGNvbnN0IG1vdXNlRG93biA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc2V0TW91c2VEb3duKG1vdXNlRG93bik7XHJcblxyXG4gICAgd2luZG93Lm9uKGAke0JMVVJfRVZFTlRfVFlQRX0gJHtNT1VTRVVQX0VWRU5UX1RZUEV9ICR7Q09OVEVYVE1FTlVfRVZFTlRfVFlQRX1gLCB0aGlzLm1vdXNlVXBIYW5kbGVyLCB0aGlzKTsgLy8vXHJcblxyXG4gICAgdGhpcy5vbihNT1VTRURPV05fRVZFTlRfVFlQRSwgdGhpcy5tb3VzZURvd25IYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLm9uKE1PVVNFTU9WRV9FVkVOVF9UWVBFLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oS0VZRE9XTl9FVkVOVF9UWVBFLCB0aGlzLmtleURvd25IYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLm9uKElOUFVUX0VWRU5UX1RZUEUsIHRoaXMuaW5wdXRIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLm9uKFNDUk9MTF9FVkVOVF9UWVBFLCB0aGlzLnNjcm9sbEhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oRk9DVVNfRVZFTlRfVFlQRSwgdGhpcy5mb2N1c0hhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oQkxVUl9FVkVOVF9UWVBFLCB0aGlzLmJsdXJIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xyXG4gIH1cclxuXHJcbiAgZGVhY3RpdmF0ZSgpIHtcclxuICAgIGNvbnN0IG1vdXNlRG93biA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc2V0TW91c2VEb3duKG1vdXNlRG93bik7XHJcblxyXG4gICAgd2luZG93Lm9mZihgJHtCTFVSX0VWRU5UX1RZUEV9ICR7TU9VU0VVUF9FVkVOVF9UWVBFfSAke0NPTlRFWFRNRU5VX0VWRU5UX1RZUEV9YCwgdGhpcy5tb3VzZVVwSGFuZGxlciwgdGhpcyk7IC8vL1xyXG5cclxuICAgIHRoaXMub2ZmKE1PVVNFRE9XTl9FVkVOVF9UWVBFLCB0aGlzLm1vdXNlRG93bkhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub2ZmKE1PVVNFTU9WRV9FVkVOVF9UWVBFLCB0aGlzLm1vdXNlTW92ZUhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub2ZmKEtFWURPV05fRVZFTlRfVFlQRSwgdGhpcy5rZXlEb3duSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vZmYoSU5QVVRfRVZFTlRfVFlQRSwgdGhpcy5pbnB1dEhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub2ZmKFNDUk9MTF9FVkVOVF9UWVBFLCB0aGlzLnNjcm9sbEhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub2ZmKEZPQ1VTX0VWRU5UX1RZUEUsIHRoaXMuZm9jdXNIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLm9mZihCTFVSX0VWRU5UX1RZUEUsIHRoaXMuYmx1ckhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgfVxyXG5cclxuICBvbkJsdXIoYmx1ckhhbmRsZXIsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IEJMVVJfRVZFTlRfVFlQRSxcclxuICAgICAgICAgIGhhbmRsZXIgPSBibHVySGFuZGxlcjsgIC8vL1xyXG5cclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb2ZmQmx1cihibHVySGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gQkxVUl9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGJsdXJIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzKGJsdXJIYW5kbGVyLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBGT0NVU19FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGJsdXJIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvZmZGb2N1cyhibHVySGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gRk9DVVNfRVZFTlRfVFlQRSxcclxuICAgICAgICAgIGhhbmRsZXIgPSBibHVySGFuZGxlcjsgIC8vL1xyXG5cclxuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb25TY3JvbGwoc2Nyb2xsSGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gU0NST0xMX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgICBoYW5kbGVyID0gc2Nyb2xsSGFuZGxlcjsgIC8vL1xyXG5cclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb2ZmU2Nyb2xsKHNjcm9sbEhhbmRsZXIsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IFNDUk9MTF9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IHNjcm9sbEhhbmRsZXI7ICAvLy9cclxuXHJcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGNoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IENIQU5HRV9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGNoYW5nZUhhbmRsZXI7ICAvLy9cclxuXHJcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9mZkNoYW5nZShjaGFuZ2VIYW5kbGVyLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBDSEFOR0VfRVZFTlRfVFlQRSxcclxuICAgICAgICAgIGhhbmRsZXIgPSBjaGFuZ2VIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBjYWxsSGFuZGxlcnMoZXZlbnRUeXBlLCAuLi5yZW1haW5pbmdBcmd1bWVudHMpIHtcclxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gdGhpcy5maW5kRXZlbnRMaXN0ZW5lcnMoZXZlbnRUeXBlKTtcclxuXHJcbiAgICBldmVudExpc3RlbmVycy5mb3JFYWNoKChldmVudExpc3RlbmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgaGFuZGxlciwgZWxlbWVudDogaGFuZGxlckVsZW1lbnQgfSA9IGV2ZW50TGlzdGVuZXIsXHJcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0aGlzOyAvLy9cclxuXHJcbiAgICAgIGlmICgoaGFuZGxlciAhPT0gdGhpcy5ibHVySGFuZGxlcikgJiYgKGhhbmRsZXIgIT09IHRoaXMuZm9jdXNIYW5kbGVyKSAmJiAoaGFuZGxlciAhPT0gdGhpcy5zY3JvbGxIYW5kbGVyKSkge1xyXG4gICAgICAgIGhhbmRsZXIuY2FsbChoYW5kbGVyRWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCBlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc1JlYWRPbmx5KCkge1xyXG4gICAgY29uc3QgeyByZWFkT25seSB9ID0gdGhpcy5nZXRTdGF0ZSgpO1xyXG5cclxuICAgIHJldHVybiByZWFkT25seTtcclxuICB9XHJcblxyXG4gIGlzTW91c2VEb3duKCkge1xyXG4gICAgY29uc3QgeyBtb3VzZURvd24gfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gbW91c2VEb3duO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmlvdXNDb250ZW50KCkge1xyXG4gICAgY29uc3QgeyBwcmV2aW91c0NvbnRlbnQgfSA9IHRoaXMuZ2V0U3RhdGUoKTtcclxuXHJcbiAgICByZXR1cm4gcHJldmlvdXNDb250ZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmlvdXNTZWxlY3Rpb24oKSB7XHJcbiAgICBjb25zdCB7IHByZXZpb3VzU2VsZWN0aW9uIH0gPSB0aGlzLmdldFN0YXRlKCk7XHJcblxyXG4gICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0UmVhZE9ubHkocmVhZE9ubHkpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xyXG4gICAgICByZWFkT25seVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRNb3VzZURvd24obW91c2VEb3duKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVN0YXRlKHtcclxuICAgICAgbW91c2VEb3duXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldFByZXZpb3VzQ29udGVudChwcmV2aW91c0NvbnRlbnQpIHtcclxuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xyXG4gICAgICBwcmV2aW91c0NvbnRlbnRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmlvdXNTZWxlY3Rpb24ocHJldmlvdXNTZWxlY3Rpb24pIHtcclxuICAgIHRoaXMudXBkYXRlU3RhdGUoe1xyXG4gICAgICBwcmV2aW91c1NlbGVjdGlvblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICBjb25zdCByZWFkT25seSA9IGZhbHNlLFxyXG4gICAgICAgICAgbW91c2VEb3duID0gZmFsc2UsXHJcbiAgICAgICAgICBwcmV2aW91c0NvbnRlbnQgPSBudWxsLFxyXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICByZWFkT25seSxcclxuICAgICAgbW91c2VEb3duLFxyXG4gICAgICBwcmV2aW91c0NvbnRlbnQsXHJcbiAgICAgIHByZXZpb3VzU2VsZWN0aW9uXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRpZE1vdW50KCkge1xyXG4gICAgY29uc3QgeyBvbkNoYW5nZSwgb25TY3JvbGwsIG9uRm9jdXMsIG9uQmx1ciB9ID0gdGhpcy5wcm9wZXJ0aWVzLFxyXG4gICAgICAgICAgICBjaGFuZ2VIYW5kbGVyID0gb25DaGFuZ2UsIC8vL1xyXG4gICAgICAgICAgICBzY3JvbGxIYW5kbGVyID0gb25TY3JvbGwsIC8vL1xyXG4gICAgICAgICAgICBmb2N1c0hhbmRsZXIgPSBvbkZvY3VzLCAvLy9cclxuICAgICAgICAgICAgYmx1ckhhbmRsZXIgPSBvbkJsdXI7IC8vL1xyXG5cclxuICAgIGNoYW5nZUhhbmRsZXIgJiYgdGhpcy5vbkNoYW5nZShjaGFuZ2VIYW5kbGVyLCB0aGlzKTtcclxuICAgIHNjcm9sbEhhbmRsZXIgJiYgdGhpcy5vblNjcm9sbChzY3JvbGxIYW5kbGVyLCB0aGlzKTtcclxuICAgIGZvY3VzSGFuZGxlciAmJiB0aGlzLm9uRm9jdXMoZm9jdXNIYW5kbGVyLCB0aGlzKTtcclxuICAgIGJsdXJIYW5kbGVyICYmIHRoaXMub25CbHVyKGJsdXJIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KCksXHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpLFxyXG4gICAgICAgICAgcHJldmlvdXNDb250ZW50ID0gY29udGVudCwgIC8vL1xyXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3Rpb24gPSBzZWxlY3Rpb247ICAvLy9cclxuXHJcbiAgICB0aGlzLnNldFByZXZpb3VzU2VsZWN0aW9uKHByZXZpb3VzU2VsZWN0aW9uKTtcclxuXHJcbiAgICB0aGlzLnNldFByZXZpb3VzQ29udGVudChwcmV2aW91c0NvbnRlbnQpO1xyXG4gIH1cclxuXHJcbiAgd2lsbFVubW91bnQoKSB7XHJcbiAgICBjb25zdCB7IG9uQ2hhbmdlLCBvblNjcm9sbCwgb25Gb2N1cywgb25CbHVyIH0gPSB0aGlzLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICBjaGFuZ2VIYW5kbGVyID0gb25DaGFuZ2UsIC8vL1xyXG4gICAgICAgICAgc2Nyb2xsSGFuZGxlciA9IG9uU2Nyb2xsLCAvLy9cclxuICAgICAgICAgIGZvY3VzSGFuZGxlciA9IG9uRm9jdXMsIC8vL1xyXG4gICAgICAgICAgYmx1ckhhbmRsZXIgPSBvbkJsdXI7IC8vL1xyXG5cclxuICAgIGNoYW5nZUhhbmRsZXIgJiYgdGhpcy5vZmZDaGFuZ2UoY2hhbmdlSGFuZGxlciwgdGhpcyk7XHJcbiAgICBzY3JvbGxIYW5kbGVyICYmIHRoaXMub2ZmU2Nyb2xsKHNjcm9sbEhhbmRsZXIsIHRoaXMpO1xyXG4gICAgZm9jdXNIYW5kbGVyICYmIHRoaXMub2ZmRm9jdXMoZm9jdXNIYW5kbGVyLCB0aGlzKTtcclxuICAgIGJsdXJIYW5kbGVyICYmIHRoaXMub2ZmQmx1cihibHVySGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5pc0FjdGl2ZSgpO1xyXG5cclxuICAgIGlmIChhY3RpdmUpIHtcclxuICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXNlKCkge1xyXG4gICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB0YWdOYW1lID0gXCJ0ZXh0YXJlYVwiO1xyXG5cclxuICBzdGF0aWMgaWdub3JlZFByb3BlcnRpZXMgPSBbXHJcbiAgICBcIm9uQ2hhbmdlXCIsXHJcbiAgICBcIm9uU2Nyb2xsXCIsXHJcbiAgICBcIm9uRm9jdXNcIixcclxuICAgIFwib25CbHVyXCJcclxuICBdO1xyXG5cclxuICBzdGF0aWMgZGVmYXVsdFByb3BlcnRpZXMgPSB7XHJcbiAgICBjbGFzc05hbWU6IFwicmljaFwiXHJcbiAgfTtcclxufVxyXG4iLCJSZWFjdC5jcmVhdGVFbGVtZW50Il0sIm5hbWVzIjpbIlJpY2hUZXh0YXJlYSIsIkJMVVJfRVZFTlRfVFlQRSIsImV2ZW50VHlwZXMiLCJJTlBVVF9FVkVOVF9UWVBFIiwiRk9DVVNfRVZFTlRfVFlQRSIsIkNIQU5HRV9FVkVOVF9UWVBFIiwiU0NST0xMX0VWRU5UX1RZUEUiLCJLRVlET1dOX0VWRU5UX1RZUEUiLCJNT1VTRVVQX0VWRU5UX1RZUEUiLCJNT1VTRURPV05fRVZFTlRfVFlQRSIsIk1PVVNFTU9WRV9FVkVOVF9UWVBFIiwiQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSIsImRlZmVyIiwiZnVuYyIsInNldFRpbWVvdXQiLCJpbnRlcm1lZGlhdGVIYW5kbGVyIiwiZXZlbnQiLCJlbGVtZW50IiwiZXZlbnRUeXBlIiwiZm9yY2VkIiwicmVhZE9ubHkiLCJpc1JlYWRPbmx5IiwicHJldmlvdXNDb250ZW50IiwiZ2V0UHJldmlvdXNDb250ZW50IiwiY29udGVudCIsInNldENvbnRlbnQiLCJjaGFuZ2VkIiwiaGFzQ2hhbmdlZCIsImNhbGxIYW5kbGVycyIsImdldENvbnRlbnQiLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJwcmV2aW91c1NlbGVjdGlvbiIsInNldFByZXZpb3VzQ29udGVudCIsInNldFByZXZpb3VzU2VsZWN0aW9uIiwibW91c2VEb3duSGFuZGxlciIsIm1vdXNlRG93biIsInNldE1vdXNlRG93biIsIm1vdXNlTW92ZUhhbmRsZXIiLCJpc01vdXNlRG93biIsImV2ZW50VFlwZSIsIm1vdXNlVXBIYW5kbGVyIiwia2V5RG93bkhhbmRsZXIiLCJpbnB1dEhhbmRsZXIiLCJzY3JvbGxIYW5kbGVyIiwiZm9jdXNIYW5kbGVyIiwiYmx1ckhhbmRsZXIiLCJpc0FjdGl2ZSIsImFjdGl2ZSIsImhhc0NsYXNzIiwiZG9tRWxlbWVudCIsImdldERPTUVsZW1lbnQiLCJ2YWx1ZSIsIlNlbGVjdGlvbiIsImZyb21ET01FbGVtZW50IiwiT2JqZWN0IiwiYXNzaWduIiwic2V0U2VsZWN0aW9uIiwic2VsZWN0aW9uU3RhcnRQb3NpdGlvbiIsImdldFN0YXJ0UG9zaXRpb24iLCJzZWxlY3Rpb25FbmRQb3NpdGlvbiIsImdldEVuZFBvc2l0aW9uIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJjb250ZW50Q2hhbmdlZCIsImhhc0NvbnRlbnRDaGFuZ2VkIiwic2VsZWN0aW9uQ2hhbmdlZCIsImhhc1NlbGVjdGlvbkNoYW5nZWQiLCJjb250ZW50RGlmZmVyZW50VG9QcmV2aW91c0NvbnRlbnQiLCJnZXRQcmV2aW91c1NlbGVjdGlvbiIsInNlbGVjdGlvbkRpZmZlcmVudFRvUHJldmlvdXNTZWxlY3Rpb24iLCJpc0RpZmZlcmVudFRvIiwiYWN0aXZhdGUiLCJ3aW5kb3ciLCJvbiIsImFkZENsYXNzIiwiZGVhY3RpdmF0ZSIsIm9mZiIsInJlbW92ZUNsYXNzIiwib25CbHVyIiwiaGFuZGxlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJvZmZCbHVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uRm9jdXMiLCJvZmZGb2N1cyIsIm9uU2Nyb2xsIiwib2ZmU2Nyb2xsIiwib25DaGFuZ2UiLCJjaGFuZ2VIYW5kbGVyIiwib2ZmQ2hhbmdlIiwicmVtYWluaW5nQXJndW1lbnRzIiwiZXZlbnRMaXN0ZW5lcnMiLCJmaW5kRXZlbnRMaXN0ZW5lcnMiLCJmb3JFYWNoIiwiZXZlbnRMaXN0ZW5lciIsImhhbmRsZXJFbGVtZW50IiwiY2FsbCIsImdldFN0YXRlIiwic2V0UmVhZE9ubHkiLCJ1cGRhdGVTdGF0ZSIsInNldEluaXRpYWxTdGF0ZSIsInNldFN0YXRlIiwiZGlkTW91bnQiLCJwcm9wZXJ0aWVzIiwid2lsbFVubW91bnQiLCJpbml0aWFsaXNlIiwiRWxlbWVudCIsInRhZ05hbWUiLCJpZ25vcmVkUHJvcGVydGllcyIsImRlZmF1bHRQcm9wZXJ0aWVzIiwiY2xhc3NOYW1lIl0sIm1hcHBp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
646
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9yaWNoVGV4dGFyZWEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG5pbXBvcnQgeyBFbGVtZW50LCBkb2N1bWVudCwgZXZlbnRUeXBlcyB9IGZyb20gXCJlYXN5XCI7XHJcblxyXG5pbXBvcnQgU2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvblwiXHJcbmltcG9ydCBVbmRvQnVmZmVyIGZyb20gXCIuL3VuZG9CdWZmZXJcIjtcclxuaW1wb3J0IEluc2VydE9wZXJhdGlvbiBmcm9tIFwiLi9vcGVyYXRpb24vaW5zZXJ0XCI7XHJcbmltcG9ydCBEZWxldGVPcGVyYXRpb24gZnJvbSBcIi4vb3BlcmF0aW9uL2RlbGV0ZVwiO1xyXG5pbXBvcnQgZ2VuZXJhdGVPcGVyYXRpb25zIGZyb20gXCIuL29wZXJhdGlvbnMvZ2VuZXJhdGVcIjtcclxuXHJcbmltcG9ydCB7IFpfS0VZX0NPREUgfSBmcm9tIFwiLi9rZXlDb2Rlc1wiO1xyXG5pbXBvcnQgeyBURVhULCBFTVBUWV9TVFJJTkcgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuXHJcbmNvbnN0IHsgQ1VUX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgQ09QWV9FVkVOVF9UWVBFLFxyXG4gICAgICAgIEJMVVJfRVZFTlRfVFlQRSxcclxuICAgICAgICBQQVNURV9FVkVOVF9UWVBFLFxyXG4gICAgICAgIElOUFVUX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgRk9DVVNfRVZFTlRfVFlQRSxcclxuICAgICAgICBDSEFOR0VfRVZFTlRfVFlQRSxcclxuICAgICAgICBTQ1JPTExfRVZFTlRfVFlQRSxcclxuICAgICAgICBLRVlET1dOX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSxcclxuICAgICAgICBTRUxFQ1RJT05DSEFOR0VfRVZFTlRfVFlQRSB9ID0gZXZlbnRUeXBlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJpY2hUZXh0YXJlYSBleHRlbmRzIEVsZW1lbnQge1xyXG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBmb2N1c2VkLCByZWFkT25seSwgdW5kb0J1ZmZlciwgcHJldmlvdXNDb250ZW50LCBwcmV2aW91c1NlbGVjdGlvbikge1xyXG4gICAgc3VwZXIoc2VsZWN0b3IpO1xyXG5cclxuICAgIHRoaXMuZm9jdXNlZCA9IGZvY3VzZWQ7XHJcbiAgICB0aGlzLnJlYWRPbmx5ID0gcmVhZE9ubHk7XHJcbiAgICB0aGlzLnVuZG9CdWZmZXIgPSB1bmRvQnVmZmVyO1xyXG4gICAgdGhpcy5wcmV2aW91c0NvbnRlbnQgPSBwcmV2aW91c0NvbnRlbnQ7XHJcbiAgICB0aGlzLnByZXZpb3VzU2VsZWN0aW9uID0gcHJldmlvdXNTZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBpc0ZvY3VzZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkO1xyXG4gIH1cclxuXHJcbiAgaXNSZWFkT25seSgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlYWRPbmx5O1xyXG4gIH1cclxuXHJcbiAgZ2V0VW5kb0J1ZmZlcigpIHtcclxuICAgIHJldHVybiB0aGlzLnVuZG9CdWZmZXI7XHJcbiAgfVxyXG5cclxuICBnZXRQcmV2aW91c0NvbnRlbnQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcmV2b3VzQ29udGVudDtcclxuICB9XHJcblxyXG4gIGdldFByZXZpb3VzU2VsZWN0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJldmlvdXNTZWxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBzZXRGb2N1c2VkKGZvY3VzZWQpIHtcclxuICAgIHRoaXMuZm9jdXNlZCA9IGZvY3VzZWQ7XHJcbiAgfVxyXG5cclxuICBzZXRSZWFkT25seShyZWFkT25seSkge1xyXG4gICAgdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5O1xyXG4gIH1cclxuXHJcbiAgc2V0UHJldmlvdXNDb250ZW50KHByZXZpb3VzQ29udGVudCkge1xyXG4gICAgdGhpcy5wcmV2aW91c0NvbnRlbnQgPSBwcmV2aW91c0NvbnRlbnQ7XHJcbiAgfVxyXG5cclxuICBzZXRQcmV2aW91c1NlbGVjdGlvbihwcmV2aW91c1NlbGVjdGlvbikge1xyXG4gICAgdGhpcy5wcmV2aW91c1NlbGVjdGlvbiA9IHByZXZpb3VzU2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgaW50ZXJtZWRpYXRlSGFuZGxlciA9IChldmVudCwgZWxlbWVudCwgdW5kb2FibGUgPSB0cnVlLCBldmVudFR5cGUgPSBDSEFOR0VfRVZFTlRfVFlQRSwgc2VsZWN0aW9uQ2hhbmdlZCA9IHRoaXMuaGFzU2VsZWN0aW9uQ2hhbmdlZCgpKSA9PiB7XHJcbiAgICBpZiAodGhpcy5yZWFkT25seSkge1xyXG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5wcmV2aW91c0NvbnRlbnQ7ICAvLy9cclxuXHJcbiAgICAgIHRoaXMuc2V0Q29udGVudChjb250ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KCksXHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpLFxyXG4gICAgICAgICAgY29udGVudENoYW5nZWQgPSB0aGlzLmhhc0NvbnRlbnRDaGFuZ2VkKCksXHJcbiAgICAgICAgICBjaGFuZ2VkID0gKGNvbnRlbnRDaGFuZ2VkIHx8IHNlbGVjdGlvbkNoYW5nZWQpO1xyXG5cclxuICAgIGlmIChjaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMuY2FsbEhhbmRsZXJzKGV2ZW50VHlwZSwgZXZlbnQsIGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1bmRvYWJsZSkge1xyXG4gICAgICBpZiAoY29udGVudENoYW5nZWQpIHtcclxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gZ2VuZXJhdGVPcGVyYXRpb25zKHRoaXMucHJldmlvdXNDb250ZW50LCBjb250ZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy51bmRvQnVmZmVyLmFkZE9wZXJhdGlvbnMob3BlcmF0aW9ucyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnByZXZpb3VzQ29udGVudCA9IGNvbnRlbnQ7ICAvLy9cclxuXHJcbiAgICB0aGlzLnByZXZpb3VzU2VsZWN0aW9uID0gc2VsZWN0aW9uOyAgLy8vXHJcbiAgfVxyXG5cclxuICBzZWxlY3RDaGFuZ2VIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XHJcbiAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgIHRoaXMuaW50ZXJtZWRpYXRlSGFuZGxlcihldmVudCwgZWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb250ZXh0bWVudUhhbmRsZXIgPSAoZXZlbnQsIGVsZW1lbnQpID0+IHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBrZXlEb3duSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBrZXlDb2RlIH0gPSBldmVudDtcclxuXHJcbiAgICBpZiAoa2V5Q29kZSA9PT0gWl9LRVlfQ09ERSkge1xyXG4gICAgICBjb25zdCB7IGN0cmxLZXksIG1ldGFLZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgICAgaWYgKGN0cmxLZXkgfHwgbWV0YUtleSkge1xyXG4gICAgICAgIGNvbnN0IHsgc2hpZnRLZXkgfSA9IGV2ZW50O1xyXG5cclxuICAgICAgICBzaGlmdEtleSA/XHJcbiAgICAgICAgICB0aGlzLnJlZG8oZXZlbnQsIGVsZW1lbnQpIDpcclxuICAgICAgICAgICAgdGhpcy51bmRvKGV2ZW50LCBlbGVtZW50KTtcclxuXHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVmZXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzY3JvbGxIYW5kbGVyID0gKGV2ZW50LCBlbGVtZW50KSA9PiB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBTQ1JPTExfRVZFTlRfVFlQRTtcclxuXHJcbiAgICB0aGlzLmNhbGxIYW5kbGVycyhldmVudFR5cGUsIGV2ZW50LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGZvY3VzSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuXHJcbiAgICBkZWZlcigoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVuZG9hYmxlID0gdHJ1ZSxcclxuICAgICAgICAgICAgZXZlbnRUeXBlID0gRk9DVVNfRVZFTlRfVFlQRSxcclxuICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgICB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQsIHVuZG9hYmxlLCBldmVudFR5cGUsIHNlbGVjdGlvbkNoYW5nZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBibHVySGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgdW5kb2FibGUgPSB0cnVlLFxyXG4gICAgICAgICAgZXZlbnRUeXBlID0gQkxVUl9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCB1bmRvYWJsZSwgZXZlbnRUeXBlLCBzZWxlY3Rpb25DaGFuZ2VkKTtcclxuICB9XHJcblxyXG4gIGlucHV0SGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIHBhc3RlSGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBjbGlwYm9hcmREYXRhIH0gPSBldmVudCxcclxuICAgICAgICAgIHRleHREYXRhID0gY2xpcGJvYXJkRGF0YS5nZXREYXRhKFRFWFQpO1xyXG5cclxuICAgIGlmICh0ZXh0RGF0YSA9PT0gRU1QVFlfU1RSSU5HKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uRW1wdHkgPSBzZWxlY3Rpb24uaXNFbXB0eSgpO1xyXG5cclxuICAgIGlmICghc2VsZWN0aW9uRW1wdHkpIHtcclxuICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxyXG4gICAgICAgICAgICBkZWxldGVPcGVyYXRpb24gPSBEZWxldGVPcGVyYXRpb24uZnJvbUNvbnRlbnRBbmRTZWxlY3Rpb24oY29udGVudCwgc2VsZWN0aW9uKSxcclxuICAgICAgICAgICAgb3BlcmF0aW9uID0gZGVsZXRlT3BlcmF0aW9uO1xyXG5cclxuICAgICAgdGhpcy5hcHBseU9wZXJhdGlvbihvcGVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnQgPSB0ZXh0RGF0YSwgLy8vXHJcbiAgICAgICAgICBpbnNlcnRPcGVyYXRpb24gPSBJbnNlcnRPcGVyYXRpb24uZnJvbUNvbnRlbnRBbmRTZWxlY3Rpb24oY29udGVudCwgc2VsZWN0aW9uKSxcclxuICAgICAgICAgIG9wZXJhdGlvbiA9IGluc2VydE9wZXJhdGlvbjsgIC8vL1xyXG5cclxuICAgIHRoaXMuYXBwbHlPcGVyYXRpb24ob3BlcmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpO1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBjb3B5SGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKSxcclxuICAgICAgICAgIHNlbGVjdGlvbkVtcHR5ID0gc2VsZWN0aW9uLmlzRW1wdHkoKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0aW9uRW1wdHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHRoaXMuZ2V0U2VsZWN0ZWRDb250ZW50KCk7XHJcblxyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRDb250ZW50KTtcclxuXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gIH1cclxuXHJcbiAgY3V0SGFuZGxlciA9IChldmVudCwgZWxlbWVudCkgPT4ge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKSxcclxuICAgICAgICAgIHNlbGVjdGlvbkVtcHR5ID0gc2VsZWN0aW9uLmlzRW1wdHkoKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0aW9uRW1wdHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlbGVjdGVkQ29udGVudCA9IHRoaXMuZ2V0U2VsZWN0ZWRDb250ZW50KCk7XHJcblxyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoc2VsZWN0ZWRDb250ZW50KTtcclxuXHJcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5nZXRDb250ZW50KCksXHJcbiAgICAgICAgICBkZWxldGVPcGVyYXRpb24gPSBEZWxldGVPcGVyYXRpb24uZnJvbUNvbnRlbnRBbmRTZWxlY3Rpb24oY29udGVudCwgc2VsZWN0aW9uKSxcclxuICAgICAgICAgIG9wZXJhdGlvbiA9IGRlbGV0ZU9wZXJhdGlvbjsgIC8vL1xyXG5cclxuICAgIHRoaXMuYXBwbHlPcGVyYXRpb24ob3BlcmF0aW9uKTtcclxuXHJcbiAgICB0aGlzLmludGVybWVkaWF0ZUhhbmRsZXIoZXZlbnQsIGVsZW1lbnQpO1xyXG5cclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgfVxyXG5cclxuICBpc0FjdGl2ZSgpIHtcclxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuaGFzQ2xhc3MoXCJhY3RpdmVcIik7XHJcblxyXG4gICAgcmV0dXJuIGFjdGl2ZTtcclxuICB9XHJcblxyXG4gIHVuZG8oZXZlbnQsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHRoaXMudW5kb0J1ZmZlci51bmRvKCk7XHJcblxyXG4gICAgaWYgKG9wZXJhdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCB1bmRvYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5hcHBseU9wZXJhdGlvbihvcGVyYXRpb24pO1xyXG5cclxuICAgICAgdGhpcy5pbnRlcm1lZGlhdGVIYW5kbGVyKGV2ZW50LCBlbGVtZW50LCB1bmRvYWJsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWRvKGV2ZW50LCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnVuZG9CdWZmZXIucmVkbygpO1xyXG5cclxuICAgIGlmIChvcGVyYXRpb24gIT09IG51bGwpIHtcclxuICAgICAgY29uc3QgdW5kb2FibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuYXBwbHlPcGVyYXRpb24ob3BlcmF0aW9uKTtcclxuXHJcbiAgICAgIHRoaXMuaW50ZXJtZWRpYXRlSGFuZGxlcihldmVudCwgZWxlbWVudCwgdW5kb2FibGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Q29udGVudCgpIHtcclxuICAgIGNvbnN0IGRvbUVsZW1lbnQgPSB0aGlzLmdldERPTUVsZW1lbnQoKSxcclxuICAgICAgICAgIHsgdmFsdWUgfSA9IGRvbUVsZW1lbnQsXHJcbiAgICAgICAgICBjb250ZW50ID0gdmFsdWU7ICAvLy9cclxuXHJcbiAgICByZXR1cm4gY29udGVudDtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGlvbigpIHtcclxuICAgIGNvbnN0IGRvbUVsZW1lbnQgPSB0aGlzLmdldERPTUVsZW1lbnQoKSxcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IFNlbGVjdGlvbi5mcm9tRE9NRWxlbWVudChkb21FbGVtZW50KTtcclxuXHJcbiAgICByZXR1cm4gc2VsZWN0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRDb250ZW50KCkge1xyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKSxcclxuICAgICAgICAgIGVuZFBvc2l0aW9uID0gc2VsZWN0aW9uLmdldEVuZFBvc2l0aW9uKCksXHJcbiAgICAgICAgICBzdGFydFBvc2l0aW9uID0gc2VsZWN0aW9uLmdldFN0YXJ0UG9zaXRpb24oKSxcclxuICAgICAgICAgIHN0YXJ0ID0gc3RhcnRQb3NpdGlvbiwgIC8vL1xyXG4gICAgICAgICAgZW5kID0gZW5kUG9zaXRpb24sICAvLy9cclxuICAgICAgICAgIHNlbGVjdGVkQ29udGVudCA9IGNvbnRlbnQuc2xpY2Uoc3RhcnQsIGVuZCk7XHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGVkQ29udGVudDtcclxuICB9XHJcblxyXG4gIGhhc0NvbnRlbnRDaGFuZ2VkKCkge1xyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxyXG4gICAgICAgICAgY29udGVudFByZXZpb3VzQ29udGVudCA9IChjb250ZW50ID09PSB0aGlzLnByZXZpb3VzQ29udGVudCksXHJcbiAgICAgICAgICBjb250ZW50Q2hhbmdlZCA9ICFjb250ZW50UHJldmlvdXNDb250ZW50O1xyXG5cclxuICAgIHJldHVybiBjb250ZW50Q2hhbmdlZDtcclxuICB9XHJcblxyXG4gIGhhc1NlbGVjdGlvbkNoYW5nZWQoKSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uUHJldmlvdXNTZWxlY3Rpb24gPSBzZWxlY3Rpb24uaXNFcXVhbFRvKHRoaXMucHJldmlvdXNTZWxlY3Rpb24pLFxyXG4gICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9ICFzZWxlY3Rpb25QcmV2aW91c1NlbGVjdGlvbjsgLy8vXHJcblxyXG4gICAgcmV0dXJuIHNlbGVjdGlvbkNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBzZXRDb250ZW50KGNvbnRlbnQsIHNldFByZXZpb3VzQ29udGVudCA9IHRydWUpIHtcclxuICAgIGNvbnN0IHZhbHVlID0gY29udGVudCwgIC8vL1xyXG4gICAgICAgICAgZG9tRWxlbWVudCA9IHRoaXMuZ2V0RE9NRWxlbWVudCgpO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZG9tRWxlbWVudCwge1xyXG4gICAgICB2YWx1ZVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHNldFByZXZpb3VzQ29udGVudCkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzQ29udGVudCA9IGNvbnRlbnQ7ICAvLy9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHNldFByZXZpb3VzU2VsZWN0aW9uID0gdHJ1ZSkge1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uU3RhcnRQb3NpdGlvbiA9IHNlbGVjdGlvbi5nZXRTdGFydFBvc2l0aW9uKCksXHJcbiAgICAgICAgICBzZWxlY3Rpb25FbmRQb3NpdGlvbiA9IHNlbGVjdGlvbi5nZXRFbmRQb3NpdGlvbigpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydFBvc2l0aW9uLCAgLy8vXHJcbiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmRQb3NpdGlvbiwgIC8vL1xyXG4gICAgICAgICAgZG9tRWxlbWVudCA9IHRoaXMuZ2V0RE9NRWxlbWVudCgpO1xyXG5cclxuICAgIGRvbUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XHJcblxyXG4gICAgaWYgKHNldFByZXZpb3VzU2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMucHJldmlvdXNTZWxlY3Rpb24gPSBzZWxlY3Rpb247ICAvLy9cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFwcGx5T3BlcmF0aW9uKG9wZXJhdGlvbikge1xyXG4gICAgbGV0IGNvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQoKSxcclxuICAgICAgICBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IHRyYW5zZm9ybWVkQ29udGVudCA9IG9wZXJhdGlvbi50cmFuc2Zvcm1Db250ZW50KGNvbnRlbnQpLFxyXG4gICAgICAgICAgdHJhbnNmb3JtZWRTZWxlY3Rpb24gPSBvcGVyYXRpb24udHJhbnNmb3JtU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcblxyXG4gICAgY29udGVudCA9IHRyYW5zZm9ybWVkQ29udGVudDsgLy8vXHJcblxyXG4gICAgc2VsZWN0aW9uID0gdHJhbnNmb3JtZWRTZWxlY3Rpb247IC8vL1xyXG5cclxuICAgIGNvbnN0IHNldFByZXZpb3VzQ29udGVudCA9IGZhbHNlLFxyXG4gICAgICAgICAgc2V0UHJldmlvdXNTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLnNldENvbnRlbnQoY29udGVudCwgc2V0UHJldmlvdXNDb250ZW50KTtcclxuXHJcbiAgICB0aGlzLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHNldFByZXZpb3VzU2VsZWN0aW9uKTtcclxuICB9XHJcblxyXG4gIGFjdGl2YXRlKCkge1xyXG4gICAgdGhpcy5vbihLRVlET1dOX0VWRU5UX1RZUEUsIHRoaXMua2V5RG93bkhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oSU5QVVRfRVZFTlRfVFlQRSwgdGhpcy5pbnB1dEhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oU0NST0xMX0VWRU5UX1RZUEUsIHRoaXMuc2Nyb2xsSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vbihGT0NVU19FVkVOVF9UWVBFLCB0aGlzLmZvY3VzSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vbihCTFVSX0VWRU5UX1RZUEUsIHRoaXMuYmx1ckhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgfVxyXG5cclxuICBkZWFjdGl2YXRlKCkge1xyXG4gICAgdGhpcy5vZmYoS0VZRE9XTl9FVkVOVF9UWVBFLCB0aGlzLmtleURvd25IYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICB0aGlzLm9mZihJTlBVVF9FVkVOVF9UWVBFLCB0aGlzLmlucHV0SGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vZmYoU0NST0xMX0VWRU5UX1RZUEUsIHRoaXMuc2Nyb2xsSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vZmYoRk9DVVNfRVZFTlRfVFlQRSwgdGhpcy5mb2N1c0hhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub2ZmKEJMVVJfRVZFTlRfVFlQRSwgdGhpcy5ibHVySGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuICB9XHJcblxyXG4gIG9uQmx1cihibHVySGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gQkxVUl9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGJsdXJIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvZmZCbHVyKGJsdXJIYW5kbGVyLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBCTFVSX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgICBoYW5kbGVyID0gYmx1ckhhbmRsZXI7ICAvLy9cclxuXHJcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoYmx1ckhhbmRsZXIsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IEZPQ1VTX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgICBoYW5kbGVyID0gYmx1ckhhbmRsZXI7ICAvLy9cclxuXHJcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIG9mZkZvY3VzKGJsdXJIYW5kbGVyLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBGT0NVU19FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGJsdXJIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbChzY3JvbGxIYW5kbGVyLCBlbGVtZW50KSB7XHJcbiAgICBjb25zdCBldmVudFR5cGUgPSBTQ1JPTExfRVZFTlRfVFlQRSxcclxuICAgICAgICAgIGhhbmRsZXIgPSBzY3JvbGxIYW5kbGVyOyAgLy8vXHJcblxyXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvZmZTY3JvbGwoc2Nyb2xsSGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gU0NST0xMX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgICBoYW5kbGVyID0gc2Nyb2xsSGFuZGxlcjsgIC8vL1xyXG5cclxuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UoY2hhbmdlSGFuZGxlciwgZWxlbWVudCkge1xyXG4gICAgY29uc3QgZXZlbnRUeXBlID0gQ0hBTkdFX0VWRU5UX1RZUEUsXHJcbiAgICAgICAgICBoYW5kbGVyID0gY2hhbmdlSGFuZGxlcjsgIC8vL1xyXG5cclxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb2ZmQ2hhbmdlKGNoYW5nZUhhbmRsZXIsIGVsZW1lbnQpIHtcclxuICAgIGNvbnN0IGV2ZW50VHlwZSA9IENIQU5HRV9FVkVOVF9UWVBFLFxyXG4gICAgICAgICAgaGFuZGxlciA9IGNoYW5nZUhhbmRsZXI7ICAvLy9cclxuXHJcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBlbGVtZW50KTtcclxuICB9XHJcblxyXG4gIGNhbGxIYW5kbGVycyhldmVudFR5cGUsIC4uLnJlbWFpbmluZ0FyZ3VtZW50cykge1xyXG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLmZpbmRFdmVudExpc3RlbmVycyhldmVudFR5cGUpO1xyXG5cclxuICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGV2ZW50TGlzdGVuZXIpID0+IHtcclxuICAgICAgbGV0IHsgZWxlbWVudCB9ID0gZXZlbnRMaXN0ZW5lcjtcclxuXHJcbiAgICAgIGNvbnN0IHsgaGFuZGxlciB9ID0gZXZlbnRMaXN0ZW5lcixcclxuICAgICAgICAgICAgaGFuZGxlckVsZW1lbnQgPSBlbGVtZW50OyAvLy9cclxuXHJcbiAgICAgIGVsZW1lbnQgPSB0aGlzOyAvLy9cclxuXHJcbiAgICAgIGlmICgoaGFuZGxlciAhPT0gdGhpcy5ibHVySGFuZGxlcikgJiYgKGhhbmRsZXIgIT09IHRoaXMuZm9jdXNIYW5kbGVyKSAmJiAoaGFuZGxlciAhPT0gdGhpcy5zY3JvbGxIYW5kbGVyKSkge1xyXG4gICAgICAgIGhhbmRsZXIuY2FsbChoYW5kbGVyRWxlbWVudCwgLi4ucmVtYWluaW5nQXJndW1lbnRzLCBlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkaWRNb3VudCgpIHtcclxuICAgIGNvbnN0IHsgb25DaGFuZ2UsIG9uU2Nyb2xsLCBvbkZvY3VzLCBvbkJsdXIgfSA9IHRoaXMucHJvcGVydGllcyxcclxuICAgICAgICAgIGNoYW5nZUhhbmRsZXIgPSBvbkNoYW5nZSwgLy8vXHJcbiAgICAgICAgICBzY3JvbGxIYW5kbGVyID0gb25TY3JvbGwsIC8vL1xyXG4gICAgICAgICAgZm9jdXNIYW5kbGVyID0gb25Gb2N1cywgLy8vXHJcbiAgICAgICAgICBibHVySGFuZGxlciA9IG9uQmx1cjsgLy8vXHJcblxyXG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpLFxyXG4gICAgICAgICAgc2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICB0aGlzLnByZXZpb3VzQ29udGVudCA9IGNvbnRlbnQ7ICAvLy9cclxuXHJcbiAgICB0aGlzLnByZXZpb3VzU2VsZWN0aW9uID0gc2VsZWN0aW9uOyAgLy8vXHJcblxyXG4gICAgY2hhbmdlSGFuZGxlciAmJiB0aGlzLm9uQ2hhbmdlKGNoYW5nZUhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHNjcm9sbEhhbmRsZXIgJiYgdGhpcy5vblNjcm9sbChzY3JvbGxIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICBmb2N1c0hhbmRsZXIgJiYgdGhpcy5vbkZvY3VzKGZvY3VzSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgYmx1ckhhbmRsZXIgJiYgdGhpcy5vbkJsdXIoYmx1ckhhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIHRoaXMub24oQ1VUX0VWRU5UX1RZUEUsIHRoaXMuY3V0SGFuZGxlcik7XHJcblxyXG4gICAgdGhpcy5vbihDT1BZX0VWRU5UX1RZUEUsIHRoaXMuY29weUhhbmRsZXIpO1xyXG5cclxuICAgIHRoaXMub24oUEFTVEVfRVZFTlRfVFlQRSwgdGhpcy5wYXN0ZUhhbmRsZXIpO1xyXG5cclxuICAgIHRoaXMub24oQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSwgdGhpcy5jb250ZXh0bWVudUhhbmRsZXIpO1xyXG5cclxuICAgIGRvY3VtZW50Lm9uKFNFTEVDVElPTkNIQU5HRV9FVkVOVF9UWVBFLCB0aGlzLnNlbGVjdENoYW5nZUhhbmRsZXIpO1xyXG4gIH1cclxuXHJcbiAgd2lsbFVubW91bnQoKSB7XHJcbiAgICBjb25zdCB7IG9uQ2hhbmdlLCBvblNjcm9sbCwgb25Gb2N1cywgb25CbHVyIH0gPSB0aGlzLnByb3BlcnRpZXMsXHJcbiAgICAgICAgICBjaGFuZ2VIYW5kbGVyID0gb25DaGFuZ2UsIC8vL1xyXG4gICAgICAgICAgc2Nyb2xsSGFuZGxlciA9IG9uU2Nyb2xsLCAvLy9cclxuICAgICAgICAgIGZvY3VzSGFuZGxlciA9IG9uRm9jdXMsIC8vL1xyXG4gICAgICAgICAgYmx1ckhhbmRsZXIgPSBvbkJsdXI7IC8vL1xyXG5cclxuICAgIGNoYW5nZUhhbmRsZXIgJiYgdGhpcy5vZmZDaGFuZ2UoY2hhbmdlSGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgc2Nyb2xsSGFuZGxlciAmJiB0aGlzLm9mZlNjcm9sbChzY3JvbGxIYW5kbGVyLCB0aGlzKTtcclxuXHJcbiAgICBmb2N1c0hhbmRsZXIgJiYgdGhpcy5vZmZGb2N1cyhmb2N1c0hhbmRsZXIsIHRoaXMpO1xyXG5cclxuICAgIGJsdXJIYW5kbGVyICYmIHRoaXMub2ZmQmx1cihibHVySGFuZGxlciwgdGhpcyk7XHJcblxyXG4gICAgdGhpcy5vZmYoQ1VUX0VWRU5UX1RZUEUsIHRoaXMuY3V0SGFuZGxlcik7XHJcblxyXG4gICAgdGhpcy5vZmYoQ09QWV9FVkVOVF9UWVBFLCB0aGlzLmNvcHlIYW5kbGVyKTtcclxuXHJcbiAgICB0aGlzLm9mZihQQVNURV9FVkVOVF9UWVBFLCB0aGlzLnBhc3RlSGFuZGxlcik7XHJcblxyXG4gICAgdGhpcy5vZmYoQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSwgdGhpcy5jb250ZXh0bWVudUhhbmRsZXIpO1xyXG5cclxuICAgIGRvY3VtZW50Lm9mZihTRUxFQ1RJT05DSEFOR0VfRVZFTlRfVFlQRSwgdGhpcy5zZWxlY3RDaGFuZ2VIYW5kbGVyKTtcclxuXHJcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XHJcblxyXG4gICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICB0aGlzLmRlYWN0aXZhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXRpYyB0YWdOYW1lID0gXCJ0ZXh0YXJlYVwiO1xyXG5cclxuICBzdGF0aWMgaWdub3JlZFByb3BlcnRpZXMgPSBbXHJcbiAgICBcIm9uQ2hhbmdlXCIsXHJcbiAgICBcIm9uU2Nyb2xsXCIsXHJcbiAgICBcIm9uRm9jdXNcIixcclxuICAgIFwib25CbHVyXCJcclxuICBdO1xyXG5cclxuICBzdGF0aWMgZGVmYXVsdFByb3BlcnRpZXMgPSB7XHJcbiAgICBjbGFzc05hbWU6IFwicmljaFwiXHJcbiAgfTtcclxuXHJcbiAgc3RhdGljIGZyb21DbGFzcyhDbGFzcywgcHJvcGVydGllcywgLi4ucmVtYWluaW5nQXJndW1lbnRzKSB7XHJcbiAgICBjb25zdCBmb2N1c2VkID0gZmFsc2UsXHJcbiAgICAgICAgICByZWFkT25seSA9IGZhbHNlLFxyXG4gICAgICAgICAgdW5kb0J1ZmZlciA9IFVuZG9CdWZmZXIuZnJvbU5vdGhpbmcoKSxcclxuICAgICAgICAgIHByZXZpb3VzQ29udGVudCA9IG51bGwsXHJcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGlvbiA9IG51bGwsXHJcbiAgICAgICAgICByaWNoVGV4dGFyZWEgPSBFbGVtZW50LmZyb21DbGFzcyhDbGFzcywgcHJvcGVydGllcywgZm9jdXNlZCwgcmVhZE9ubHksIHVuZG9CdWZmZXIsIHByZXZpb3VzQ29udGVudCwgcHJldmlvdXNTZWxlY3Rpb24sIC4uLnJlbWFpbmluZ0FyZ3VtZW50cyk7XHJcblxyXG4gICAgcmV0dXJuIHJpY2hUZXh0YXJlYTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZmVyKGZ1bmMpIHtcclxuICBzZXRUaW1lb3V0KGZ1bmMsIDApO1xyXG59XHJcbiJdLCJuYW1lcyI6WyJSaWNoVGV4dGFyZWEiLCJDVVRfRVZFTlRfVFlQRSIsImV2ZW50VHlwZXMiLCJDT1BZX0VWRU5UX1RZUEUiLCJCTFVSX0VWRU5UX1RZUEUiLCJQQVNURV9FVkVOVF9UWVBFIiwiSU5QVVRfRVZFTlRfVFlQRSIsIkZPQ1VTX0VWRU5UX1RZUEUiLCJDSEFOR0VfRVZFTlRfVFlQRSIsIlNDUk9MTF9FVkVOVF9UWVBFIiwiS0VZRE9XTl9FVkVOVF9UWVBFIiwiQ09OVEVYVE1FTlVfRVZFTlRfVFlQRSIsIlNFTEVDVElPTkNIQU5HRV9FVkVOVF9UWVBFIiwic2VsZWN0b3IiLCJmb2N1c2VkIiwicmVhZE9ubHkiLCJ1bmRvQnVmZmVyIiwicHJldmlvdXNDb250ZW50IiwicHJldmlvdXNTZWxlY3Rpb24iLCJpbnRlcm1lZGlhdGVIYW5kbGVyIiwiZXZlbnQiLCJlbGVtZW50IiwidW5kb2FibGUiLCJldmVudFR5cGUiLCJzZWxlY3Rpb25DaGFuZ2VkIiwiaGFzU2VsZWN0aW9uQ2hhbmdlZCIsImNvbnRlbnQiLCJzZXRDb250ZW50IiwiZ2V0Q29udGVudCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsImNvbnRlbnRDaGFuZ2VkIiwiaGFzQ29udGVudENoYW5nZWQiLCJjaGFuZ2VkIiwiY2FsbEhhbmRsZXJzIiwib3BlcmF0aW9ucyIsImdlbmVyYXRlT3BlcmF0aW9ucyIsImFkZE9wZXJhdGlvbnMiLCJzZWxlY3RDaGFuZ2VIYW5kbGVyIiwiY29udGV4dG1lbnVIYW5kbGVyIiwicHJldmVudERlZmF1bHQiLCJrZXlEb3duSGFuZGxlciIsImtleUNvZGUiLCJaX0tFWV9DT0RFIiwiY3RybEtleSIsIm1ldGFLZXkiLCJzaGlmdEtleSIsInJlZG8iLCJ1bmRvIiwiZGVmZXIiLCJzY3JvbGxIYW5kbGVyIiwiZm9jdXNIYW5kbGVyIiwiYmx1ckhhbmRsZXIiLCJpbnB1dEhhbmRsZXIiLCJwYXN0ZUhhbmRsZXIiLCJjbGlwYm9hcmREYXRhIiwidGV4dERhdGEiLCJnZXREYXRhIiwiVEVYVCIsIkVNUFRZX1NUUklORyIsInNlbGVjdGlvbkVtcHR5IiwiaXNFbXB0eSIsImRlbGV0ZU9wZXJhdGlvbiIsIkRlbGV0ZU9wZXJhdGlvbiIsImZyb21Db250ZW50QW5kU2VsZWN0aW9uIiwib3BlcmF0aW9uIiwiYXBwbHlPcGVyYXRpb24iLCJpbnNlcnRPcGVyYXRpb24iLCJJbnNlcnRPcGVyYXRpb24iLCJjb3B5SGFuZGxlciIsInNlbGVjdGVkQ29udGVudCIsImdldFNlbGVjdGVkQ29udGVudCIsIm5hdmlnYXRvciIsImNsaXBib2FyZCIsIndyaXRlVGV4dCIsImN1dEhhbmRsZXIiLCJpc0ZvY3VzZWQiLCJpc1JlYWRPbmx5IiwiZ2V0VW5kb0J1ZmZlciIsImdldFByZXZpb3VzQ29udGVudCIsInByZXZvdXNDb250ZW50IiwiZ2V0UHJldmlvdXNTZWxlY3Rpb24iLCJzZXRGb2N1c2VkIiwic2V0UmVhZE9ubHkiLCJzZXRQcmV2aW91c0NvbnRlbnQiLCJzZXRQcmV2aW91c1NlbGVjdGlvbiIsImlzQWN0aXZlIiwiYWN0aXZlIiwiaGFzQ2xhc3MiLCJkb21FbGVtZW50IiwiZ2V0RE9NRWxlbWVudCIsInZhbHVlIiwiU2VsZWN0aW9uIiwiZnJvbURPTUVsZW1lbnQiLCJlbmRQb3NpdGlvbiIsImdldEVuZFBvc2l0aW9uIiwic3RhcnRQb3NpdGlvbiIsImdldFN0YXJ0UG9zaXRpb24iLCJzdGFydCIsImVuZCIsInNsaWNlIiwiY29udGVudFByZXZpb3VzQ29udGVudCIsInNlbGVjdGlvblByZXZpb3VzU2VsZWN0aW9uIiwiaXNFcXVhbFRvIiwiT2JqZWN0IiwiYXNzaWduIiwic2V0U2VsZWN0aW9uIiwic2VsZWN0aW9uU3RhcnRQb3NpdGlvbiIsInNlbGVjdGlvbkVuZFBvc2l0aW9uIiwic2VsZWN0aW9uU3RhcnQiLCJzZWxlY3Rpb25FbmQiLCJzZXRTZWxlY3Rpb25SYW5nZSIsInRyYW5zZm9ybWVkQ29udGVudCIsInRyYW5zZm9ybUNvbnRlbnQiLCJ0cmFuc2Zvcm1lZFNlbGVjdGlvbiIsInRyYW5zZm9ybVNlbGVjdGlvbiIsImFjdGl2YXRlIiwib24iLCJhZGRDbGFzcyIsImRlYWN0aXZhdGUiLCJvZmYiLCJyZW1vdmVDbGFzcyIsIm9uQmx1ciIsImhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwib2ZmQmx1ciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbkZvY3VzIiwib2ZmRm9jdXMiLCJvblNjcm9sbCIsIm9mZlNjcm9sbCIsIm9uQ2hhbmdlIiwiY2hhbmdlSGFuZGxlciIsIm9mZkNoYW5nZSIsInJlbWFpbmluZ0FyZ3VtZW50cyIsImV2ZW50TGlzdGVuZXJzIiwiZmluZEV2ZW50TGlzdGVuZXJzIiwiZm9yRWFjaCIsImV2ZW50TGlzdGVuZXIiLCJoYW5kbGVyRWxlbWVudCIsImNhbGwiLCJkaWRNb3VudCIsInByb3BlcnRpZXMiLCJkb2N1bWVudCIsIndpbGxVbm1vdW50IiwiZnJvbUNsYXNzIiwiQ2xhc3MiLCJFbGVtZW50IiwiVW5kb0J1ZmZlciIsImZyb21Ob3RoaW5nIiwicmljaFRleHRhcmVhIiwidGFnTmFtZSIsImlnbm9yZWRQcm9wZXJ0aWVzIiwiZGVmYXVsdFByb3BlcnRpZXMiLCJjbGFzc05hbWUiLCJmdW5jIiwic2V0VGltZW91dCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7ZUF5QnFCQTs7O29CQXZCeUI7OERBRXhCOytEQUNDOzJEQUNLOzJEQUNBOzZEQUNHO3dCQUVKO3lCQUNROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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