@hufe921/canvas-editor 0.9.126 → 0.9.128

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.
@@ -23,7 +23,7 @@ var __publicField = (obj, key, value) => {
23
23
  return value;
24
24
  };
25
25
  var index = "";
26
- const version = "0.9.126";
26
+ const version = "0.9.128";
27
27
  var MaxHeightRatio;
28
28
  (function(MaxHeightRatio2) {
29
29
  MaxHeightRatio2["HALF"] = "half";
@@ -463,163 +463,6 @@ function scrollIntoView(container, selected) {
463
463
  container.scrollTop = bottom - container.clientHeight;
464
464
  }
465
465
  }
466
- var browser = { exports: {} };
467
- var process = browser.exports = {};
468
- var cachedSetTimeout;
469
- var cachedClearTimeout;
470
- function defaultSetTimout() {
471
- throw new Error("setTimeout has not been defined");
472
- }
473
- function defaultClearTimeout() {
474
- throw new Error("clearTimeout has not been defined");
475
- }
476
- (function() {
477
- try {
478
- if (typeof setTimeout === "function") {
479
- cachedSetTimeout = setTimeout;
480
- } else {
481
- cachedSetTimeout = defaultSetTimout;
482
- }
483
- } catch (e) {
484
- cachedSetTimeout = defaultSetTimout;
485
- }
486
- try {
487
- if (typeof clearTimeout === "function") {
488
- cachedClearTimeout = clearTimeout;
489
- } else {
490
- cachedClearTimeout = defaultClearTimeout;
491
- }
492
- } catch (e) {
493
- cachedClearTimeout = defaultClearTimeout;
494
- }
495
- })();
496
- function runTimeout(fun) {
497
- if (cachedSetTimeout === setTimeout) {
498
- return setTimeout(fun, 0);
499
- }
500
- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
501
- cachedSetTimeout = setTimeout;
502
- return setTimeout(fun, 0);
503
- }
504
- try {
505
- return cachedSetTimeout(fun, 0);
506
- } catch (e) {
507
- try {
508
- return cachedSetTimeout.call(null, fun, 0);
509
- } catch (e2) {
510
- return cachedSetTimeout.call(this, fun, 0);
511
- }
512
- }
513
- }
514
- function runClearTimeout(marker) {
515
- if (cachedClearTimeout === clearTimeout) {
516
- return clearTimeout(marker);
517
- }
518
- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
519
- cachedClearTimeout = clearTimeout;
520
- return clearTimeout(marker);
521
- }
522
- try {
523
- return cachedClearTimeout(marker);
524
- } catch (e) {
525
- try {
526
- return cachedClearTimeout.call(null, marker);
527
- } catch (e2) {
528
- return cachedClearTimeout.call(this, marker);
529
- }
530
- }
531
- }
532
- var queue = [];
533
- var draining = false;
534
- var currentQueue;
535
- var queueIndex = -1;
536
- function cleanUpNextTick() {
537
- if (!draining || !currentQueue) {
538
- return;
539
- }
540
- draining = false;
541
- if (currentQueue.length) {
542
- queue = currentQueue.concat(queue);
543
- } else {
544
- queueIndex = -1;
545
- }
546
- if (queue.length) {
547
- drainQueue();
548
- }
549
- }
550
- function drainQueue() {
551
- if (draining) {
552
- return;
553
- }
554
- var timeout = runTimeout(cleanUpNextTick);
555
- draining = true;
556
- var len = queue.length;
557
- while (len) {
558
- currentQueue = queue;
559
- queue = [];
560
- while (++queueIndex < len) {
561
- if (currentQueue) {
562
- currentQueue[queueIndex].run();
563
- }
564
- }
565
- queueIndex = -1;
566
- len = queue.length;
567
- }
568
- currentQueue = null;
569
- draining = false;
570
- runClearTimeout(timeout);
571
- }
572
- process.nextTick = function(fun) {
573
- var args = new Array(arguments.length - 1);
574
- if (arguments.length > 1) {
575
- for (var i = 1; i < arguments.length; i++) {
576
- args[i - 1] = arguments[i];
577
- }
578
- }
579
- queue.push(new Item(fun, args));
580
- if (queue.length === 1 && !draining) {
581
- runTimeout(drainQueue);
582
- }
583
- };
584
- function Item(fun, array) {
585
- this.fun = fun;
586
- this.array = array;
587
- }
588
- Item.prototype.run = function() {
589
- this.fun.apply(null, this.array);
590
- };
591
- process.title = "browser";
592
- process.browser = true;
593
- process.env = {};
594
- process.argv = [];
595
- process.version = "";
596
- process.versions = {};
597
- function noop() {
598
- }
599
- process.on = noop;
600
- process.addListener = noop;
601
- process.once = noop;
602
- process.off = noop;
603
- process.removeListener = noop;
604
- process.removeAllListeners = noop;
605
- process.emit = noop;
606
- process.prependListener = noop;
607
- process.prependOnceListener = noop;
608
- process.listeners = function(name) {
609
- return [];
610
- };
611
- process.binding = function(name) {
612
- throw new Error("process.binding is not supported");
613
- };
614
- process.cwd = function() {
615
- return "/";
616
- };
617
- process.chdir = function(dir) {
618
- throw new Error("process.chdir is not supported");
619
- };
620
- process.umask = function() {
621
- return 0;
622
- };
623
466
  const CURSOR_AGENT_OFFSET_HEIGHT = 12;
624
467
  const defaultCursorOption = {
625
468
  width: 1,
@@ -4300,8 +4143,11 @@ const defaultCheckboxOption = {
4300
4143
  height: 14,
4301
4144
  gap: 5,
4302
4145
  lineWidth: 1,
4303
- fillStyle: "#5175f4",
4304
- strokeStyle: "#ffffff",
4146
+ fillStyle: "#ffffff",
4147
+ strokeStyle: "#000000",
4148
+ checkFillStyle: "#5175f4",
4149
+ checkStrokeStyle: "#5175f4",
4150
+ checkMarkColor: "#ffffff",
4305
4151
  verticalAlign: VerticalAlign.BOTTOM
4306
4152
  };
4307
4153
  const defaultControlOption = {
@@ -5860,9 +5706,12 @@ function getElementListByHTML(htmlText, options) {
5860
5706
  }
5861
5707
  }
5862
5708
  }
5709
+ const clipboardHost = document.createElement("div");
5710
+ document.body.appendChild(clipboardHost);
5711
+ const shadowRoot = clipboardHost.attachShadow({ mode: "open" });
5863
5712
  const clipboardDom = document.createElement("div");
5864
5713
  clipboardDom.innerHTML = htmlText;
5865
- document.body.appendChild(clipboardDom);
5714
+ shadowRoot.appendChild(clipboardDom);
5866
5715
  const deleteNodes = [];
5867
5716
  clipboardDom.childNodes.forEach((child) => {
5868
5717
  var _a;
@@ -5872,7 +5721,7 @@ function getElementListByHTML(htmlText, options) {
5872
5721
  });
5873
5722
  deleteNodes.forEach((node) => node.remove());
5874
5723
  findTextNode(clipboardDom);
5875
- clipboardDom.remove();
5724
+ clipboardHost.remove();
5876
5725
  return elementList;
5877
5726
  }
5878
5727
  function getTextFromElementList(elementList) {
@@ -6115,6 +5964,12 @@ function pasteImage(host, file) {
6115
5964
  const draw = host.getDraw();
6116
5965
  if (draw.isReadonly() || draw.isDisabled())
6117
5966
  return;
5967
+ const { pasteImage: overridePasteImage } = draw.getOverride();
5968
+ if (overridePasteImage) {
5969
+ const overrideResult = overridePasteImage(file);
5970
+ if ((overrideResult == null ? void 0 : overrideResult.preventDefault) !== false)
5971
+ return;
5972
+ }
6118
5973
  const rangeManager = draw.getRange();
6119
5974
  const { startIndex } = rangeManager.getRange();
6120
5975
  const elementList = draw.getElementList();
@@ -6416,7 +6271,7 @@ class Cursor {
6416
6271
  } else {
6417
6272
  this._clearBlinkTimeout();
6418
6273
  }
6419
- browser.exports.nextTick(() => {
6274
+ nextTick(() => {
6420
6275
  this.moveCursorToVisible({
6421
6276
  cursorPosition,
6422
6277
  direction: parseInt(oldTop) > cursorTop ? MoveDirection.UP : MoveDirection.DOWN
@@ -6432,10 +6287,6 @@ class Cursor {
6432
6287
  if (!cursorPosition || !direction)
6433
6288
  return;
6434
6289
  const { pageNo, coordinate: { leftTop, leftBottom } } = cursorPosition;
6435
- const prePageY = pageNo * (this.draw.getHeight() + this.draw.getPageGap()) + this.container.getBoundingClientRect().top;
6436
- const isUp = direction === MoveDirection.UP;
6437
- const x = leftBottom[0];
6438
- const y = isUp ? leftTop[1] + prePageY : leftBottom[1] + prePageY;
6439
6290
  const scrollContainer = findScrollContainer(this.container);
6440
6291
  const rect = {
6441
6292
  left: 0,
@@ -6443,7 +6294,8 @@ class Cursor {
6443
6294
  top: 0,
6444
6295
  bottom: 0
6445
6296
  };
6446
- if (scrollContainer === document.documentElement) {
6297
+ const isDocumentScroll = scrollContainer === document.documentElement;
6298
+ if (isDocumentScroll) {
6447
6299
  rect.right = window.innerWidth;
6448
6300
  rect.bottom = window.innerHeight;
6449
6301
  } else {
@@ -6453,6 +6305,10 @@ class Cursor {
6453
6305
  rect.top = top;
6454
6306
  rect.bottom = bottom;
6455
6307
  }
6308
+ const prePageY = pageNo * (this.draw.getHeight() + this.draw.getPageGap()) + this.container.getBoundingClientRect().top;
6309
+ const isUp = direction === MoveDirection.UP;
6310
+ const x = leftBottom[0] + (isDocumentScroll ? 0 : rect.left);
6311
+ const y = isUp ? leftTop[1] + prePageY : leftBottom[1] + prePageY;
6456
6312
  const { maskMargin } = this.options;
6457
6313
  rect.top += maskMargin[0];
6458
6314
  rect.bottom -= maskMargin[2];
@@ -6480,6 +6336,8 @@ var KeyMap;
6480
6336
  KeyMap2["Right"] = "ArrowRight";
6481
6337
  KeyMap2["Up"] = "ArrowUp";
6482
6338
  KeyMap2["Down"] = "ArrowDown";
6339
+ KeyMap2["Home"] = "Home";
6340
+ KeyMap2["End"] = "End";
6483
6341
  KeyMap2["ESC"] = "Escape";
6484
6342
  KeyMap2["TAB"] = "Tab";
6485
6343
  KeyMap2["META"] = "Meta";
@@ -7183,22 +7041,22 @@ function mousemove(evt, host) {
7183
7041
  tableId
7184
7042
  });
7185
7043
  } else {
7186
- let end = ~endIndex ? endIndex : 0;
7044
+ let end2 = ~endIndex ? endIndex : 0;
7187
7045
  if ((startIsTable || isTable) && startTableId !== tableId)
7188
7046
  return;
7189
7047
  let start = startIndex;
7190
- if (start > end) {
7191
- [start, end] = [end, start];
7048
+ if (start > end2) {
7049
+ [start, end2] = [end2, start];
7192
7050
  }
7193
- if (start === end)
7051
+ if (start === end2)
7194
7052
  return;
7195
7053
  const elementList = draw.getElementList();
7196
7054
  const startElement = elementList[start + 1];
7197
- const endElement = elementList[end];
7055
+ const endElement = elementList[end2];
7198
7056
  if ((startElement == null ? void 0 : startElement.controlComponent) === ControlComponent.PLACEHOLDER && (endElement == null ? void 0 : endElement.controlComponent) === ControlComponent.PLACEHOLDER && startElement.controlId === endElement.controlId) {
7199
7057
  return;
7200
7058
  }
7201
- rangeManager.setRange(start, end);
7059
+ rangeManager.setRange(start, end2);
7202
7060
  }
7203
7061
  draw.render({
7204
7062
  isSubmitHistory: false,
@@ -8116,6 +7974,116 @@ function updown(evt, host) {
8116
7974
  });
8117
7975
  }
8118
7976
  }
7977
+ function home(evt, host) {
7978
+ const draw = host.getDraw();
7979
+ if (draw.isReadonly())
7980
+ return;
7981
+ const position = draw.getPosition();
7982
+ const cursorPosition = position.getCursorPosition();
7983
+ if (!cursorPosition)
7984
+ return;
7985
+ const rangeManager = draw.getRange();
7986
+ const { startIndex, endIndex } = rangeManager.getRange();
7987
+ const positionList = position.getPositionList();
7988
+ let anchorPosition = cursorPosition;
7989
+ if (evt.shiftKey && startIndex !== endIndex) {
7990
+ if (startIndex === cursorPosition.index) {
7991
+ anchorPosition = positionList[endIndex];
7992
+ } else {
7993
+ anchorPosition = positionList[startIndex];
7994
+ }
7995
+ }
7996
+ const { rowNo } = anchorPosition;
7997
+ let lineStartIndex = anchorPosition.index;
7998
+ for (let i = anchorPosition.index - 1; i >= 0; i--) {
7999
+ if (positionList[i].rowNo !== rowNo)
8000
+ break;
8001
+ lineStartIndex = i;
8002
+ }
8003
+ let anchorStart = lineStartIndex;
8004
+ let anchorEnd = lineStartIndex;
8005
+ if (evt.shiftKey) {
8006
+ if (startIndex !== endIndex) {
8007
+ if (startIndex === cursorPosition.index) {
8008
+ anchorStart = startIndex;
8009
+ anchorEnd = lineStartIndex;
8010
+ } else {
8011
+ anchorStart = lineStartIndex;
8012
+ anchorEnd = endIndex;
8013
+ }
8014
+ } else {
8015
+ anchorStart = lineStartIndex;
8016
+ anchorEnd = startIndex;
8017
+ }
8018
+ }
8019
+ if (anchorStart > anchorEnd) {
8020
+ [anchorStart, anchorEnd] = [anchorEnd, anchorStart];
8021
+ }
8022
+ rangeManager.setRange(anchorStart, anchorEnd);
8023
+ const isCollapsed = anchorStart === anchorEnd;
8024
+ draw.render({
8025
+ curIndex: isCollapsed ? anchorStart : void 0,
8026
+ isSetCursor: isCollapsed,
8027
+ isSubmitHistory: false,
8028
+ isCompute: false
8029
+ });
8030
+ evt.preventDefault();
8031
+ }
8032
+ function end(evt, host) {
8033
+ const draw = host.getDraw();
8034
+ if (draw.isReadonly())
8035
+ return;
8036
+ const position = draw.getPosition();
8037
+ const cursorPosition = position.getCursorPosition();
8038
+ if (!cursorPosition)
8039
+ return;
8040
+ const rangeManager = draw.getRange();
8041
+ const { startIndex, endIndex } = rangeManager.getRange();
8042
+ const positionList = position.getPositionList();
8043
+ let anchorPosition = cursorPosition;
8044
+ if (evt.shiftKey && startIndex !== endIndex) {
8045
+ if (startIndex === cursorPosition.index) {
8046
+ anchorPosition = positionList[endIndex];
8047
+ } else {
8048
+ anchorPosition = positionList[startIndex];
8049
+ }
8050
+ }
8051
+ const { rowNo } = anchorPosition;
8052
+ let lineEndIndex = anchorPosition.index;
8053
+ for (let i = anchorPosition.index + 1; i < positionList.length; i++) {
8054
+ if (positionList[i].rowNo !== rowNo)
8055
+ break;
8056
+ lineEndIndex = i;
8057
+ }
8058
+ let anchorStart = lineEndIndex;
8059
+ let anchorEnd = lineEndIndex;
8060
+ if (evt.shiftKey) {
8061
+ if (startIndex !== endIndex) {
8062
+ if (startIndex === cursorPosition.index) {
8063
+ anchorStart = startIndex;
8064
+ anchorEnd = lineEndIndex;
8065
+ } else {
8066
+ anchorStart = lineEndIndex;
8067
+ anchorEnd = endIndex;
8068
+ }
8069
+ } else {
8070
+ anchorStart = startIndex;
8071
+ anchorEnd = lineEndIndex;
8072
+ }
8073
+ }
8074
+ if (anchorStart > anchorEnd) {
8075
+ [anchorStart, anchorEnd] = [anchorEnd, anchorStart];
8076
+ }
8077
+ rangeManager.setRange(anchorStart, anchorEnd);
8078
+ const isCollapsed = anchorStart === anchorEnd;
8079
+ draw.render({
8080
+ curIndex: isCollapsed ? anchorStart : void 0,
8081
+ isSetCursor: isCollapsed,
8082
+ isSubmitHistory: false,
8083
+ isCompute: false
8084
+ });
8085
+ evt.preventDefault();
8086
+ }
8119
8087
  function keydown(evt, host) {
8120
8088
  if (host.isComposing)
8121
8089
  return;
@@ -8127,11 +8095,23 @@ function keydown(evt, host) {
8127
8095
  } else if (evt.key === KeyMap.Enter) {
8128
8096
  enter(evt, host);
8129
8097
  } else if (evt.key === KeyMap.Left) {
8130
- left(evt, host);
8098
+ if (isMod(evt)) {
8099
+ home(evt, host);
8100
+ } else {
8101
+ left(evt, host);
8102
+ }
8131
8103
  } else if (evt.key === KeyMap.Right) {
8132
- right(evt, host);
8104
+ if (isMod(evt)) {
8105
+ end(evt, host);
8106
+ } else {
8107
+ right(evt, host);
8108
+ }
8133
8109
  } else if (evt.key === KeyMap.Up || evt.key === KeyMap.Down) {
8134
8110
  updown(evt, host);
8111
+ } else if (evt.key === KeyMap.Home) {
8112
+ home(evt, host);
8113
+ } else if (evt.key === KeyMap.End) {
8114
+ end(evt, host);
8135
8115
  } else if (isMod(evt) && evt.key.toLocaleLowerCase() === KeyMap.Z) {
8136
8116
  if (draw.isReadonly() && draw.getMode() !== EditorMode.FORM)
8137
8117
  return;
@@ -8289,7 +8269,7 @@ async function cut(host) {
8289
8269
  return;
8290
8270
  const elementList = draw.getElementList();
8291
8271
  let start = startIndex;
8292
- let end = endIndex;
8272
+ let end2 = endIndex;
8293
8273
  if (startIndex === endIndex) {
8294
8274
  const position = draw.getPosition();
8295
8275
  const positionList = position.getPositionList();
@@ -8307,17 +8287,17 @@ async function cut(host) {
8307
8287
  }
8308
8288
  const firstElementIndex = cutElementIndexList[0] - 1;
8309
8289
  start = firstElementIndex < 0 ? 0 : firstElementIndex;
8310
- end = cutElementIndexList[cutElementIndexList.length - 1];
8290
+ end2 = cutElementIndexList[cutElementIndexList.length - 1];
8311
8291
  }
8312
8292
  const options = draw.getOptions();
8313
- await writeElementList(elementList.slice(start + 1, end + 1), options);
8293
+ await writeElementList(elementList.slice(start + 1, end2 + 1), options);
8314
8294
  const control = draw.getControl();
8315
8295
  let curIndex;
8316
8296
  if (control.getActiveControl() && control.getIsRangeWithinControl()) {
8317
8297
  curIndex = control.cut();
8318
8298
  control.emitControlContentChange();
8319
8299
  } else {
8320
- draw.spliceElementList(elementList, start + 1, end - start);
8300
+ draw.spliceElementList(elementList, start + 1, end2 - start);
8321
8301
  curIndex = start;
8322
8302
  }
8323
8303
  rangeManager.setRange(curIndex, curIndex);
@@ -9791,17 +9771,17 @@ class RangeManager {
9791
9771
  middle++;
9792
9772
  }
9793
9773
  }
9794
- let end = endIndex;
9774
+ let end2 = endIndex;
9795
9775
  if (isCollapsed && elementList[startIndex].value === ZERO) {
9796
- end += 1;
9776
+ end2 += 1;
9797
9777
  }
9798
- while (end < positionList.length) {
9799
- const element = elementList[end];
9800
- const nextElement = elementList[end + 1];
9778
+ while (end2 < positionList.length) {
9779
+ const element = elementList[end2];
9780
+ const nextElement = elementList[end2 + 1];
9801
9781
  if (element.value === ZERO && !element.listWrap || element.listId !== (nextElement == null ? void 0 : nextElement.listId) || element.titleId !== (nextElement == null ? void 0 : nextElement.titleId)) {
9802
9782
  break;
9803
9783
  }
9804
- const { pageNo, rowNo } = positionList[end];
9784
+ const { pageNo, rowNo } = positionList[end2];
9805
9785
  let rowArray = rangeRow.get(pageNo);
9806
9786
  if (!rowArray) {
9807
9787
  rowArray = [];
@@ -9810,7 +9790,7 @@ class RangeManager {
9810
9790
  if (!rowArray.includes(rowNo)) {
9811
9791
  rowArray.push(rowNo);
9812
9792
  }
9813
- end++;
9793
+ end2++;
9814
9794
  }
9815
9795
  return rangeRow;
9816
9796
  }
@@ -15513,7 +15493,7 @@ class CheckboxParticle {
15513
15493
  render(payload) {
15514
15494
  const { ctx, x, index: index2, row } = payload;
15515
15495
  let { y } = payload;
15516
- const { checkbox: { gap, lineWidth, fillStyle, strokeStyle, verticalAlign }, scale } = this.options;
15496
+ const { checkbox: { gap, lineWidth, fillStyle, strokeStyle, checkFillStyle, checkStrokeStyle, checkMarkColor, verticalAlign }, scale } = this.options;
15517
15497
  const { metrics, checkbox } = row.elementList[index2];
15518
15498
  if (verticalAlign === VerticalAlign.TOP || verticalAlign === VerticalAlign.MIDDLE) {
15519
15499
  let nextIndex = index2 + 1;
@@ -15544,22 +15524,26 @@ class CheckboxParticle {
15544
15524
  ctx.beginPath();
15545
15525
  ctx.translate(0.5, 0.5);
15546
15526
  if (checkbox == null ? void 0 : checkbox.value) {
15527
+ ctx.fillStyle = checkFillStyle;
15528
+ ctx.fillRect(left2, top, width, height);
15529
+ ctx.beginPath();
15547
15530
  ctx.lineWidth = lineWidth;
15548
- ctx.strokeStyle = fillStyle;
15531
+ ctx.strokeStyle = checkStrokeStyle;
15549
15532
  ctx.rect(left2, top, width, height);
15550
15533
  ctx.stroke();
15551
15534
  ctx.beginPath();
15552
- ctx.fillStyle = fillStyle;
15553
- ctx.fillRect(left2, top, width, height);
15554
- ctx.beginPath();
15555
- ctx.strokeStyle = strokeStyle;
15535
+ ctx.strokeStyle = checkMarkColor;
15556
15536
  ctx.lineWidth = lineWidth * 2 * scale;
15557
15537
  ctx.moveTo(left2 + 2 * scale, top + height / 2);
15558
15538
  ctx.lineTo(left2 + width / 2, top + height - 3 * scale);
15559
15539
  ctx.lineTo(left2 + width - 2 * scale, top + 3 * scale);
15560
15540
  ctx.stroke();
15561
15541
  } else {
15542
+ ctx.fillStyle = fillStyle;
15543
+ ctx.fillRect(left2, top, width, height);
15544
+ ctx.beginPath();
15562
15545
  ctx.lineWidth = lineWidth;
15546
+ ctx.strokeStyle = strokeStyle;
15563
15547
  ctx.rect(left2, top, width, height);
15564
15548
  ctx.stroke();
15565
15549
  }
@@ -15665,7 +15649,7 @@ function WorkerWrapper$1() {
15665
15649
  objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
15666
15650
  }
15667
15651
  }
15668
- const encodedJs = "KCgpPT57dmFyIFRlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxJZT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIG5lPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGRlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUmU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbGU9KFQsSSxkKT0+SSBpbiBUP1RlKFQsSSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZH0pOlRbSV09ZCxTPShULEkpPT57Zm9yKHZhciBkIGluIEl8fChJPXt9KSlkZS5jYWxsKEksZCkmJmxlKFQsZCxJW2RdKTtpZihuZSlmb3IodmFyIGQgb2YgbmUoSSkpUmUuY2FsbChJLGQpJiZsZShULGQsSVtkXSk7cmV0dXJuIFR9LFg9KFQsSSk9PkllKFQsQWUoSSkpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5IQUxGPSJoYWxmIixlLk9ORV9USElSRD0ib25lLXRoaXJkIixlLlFVQVJURVI9InF1YXJ0ZXIifSkoVHx8KFQ9e30pKTt2YXIgSTsoZnVuY3Rpb24oZSl7ZS5BUkFCSUM9ImFyYWJpYyIsZS5DSElORVNFPSJjaGluZXNlIn0pKEl8fChJPXt9KSk7dmFyIGQ7KGZ1bmN0aW9uKGUpe2UuSU5MSU5FPSJpbmxpbmUiLGUuQkxPQ0s9ImJsb2NrIixlLlNVUlJPVU5EPSJzdXJyb3VuZCIsZS5GTE9BVF9UT1A9ImZsb2F0LXRvcCIsZS5GTE9BVF9CT1RUT009ImZsb2F0LWJvdHRvbSJ9KShkfHwoZD17fSkpO3ZhciBfOyhmdW5jdGlvbihlKXtlLkJFRk9SRT0iYmVmb3JlIixlLkFGVEVSPSJhZnRlciIsZS5PVVRFUl9CRUZPUkU9Im91dGVyLWJlZm9yZSIsZS5PVVRFUl9BRlRFUj0ib3V0ZXItYWZ0ZXIifSkoX3x8KF89e30pKTt2YXIgTTsoZnVuY3Rpb24oZSl7ZS5ST1c9InJvdyIsZS5DT0xVTU49ImNvbHVtbiJ9KShNfHwoTT17fSkpO2NvbnN0IFA9Ilx1MjAwQiI7VC5IQUxGKyIiLDEvMixULk9ORV9USElSRCsiIiwxLzMsVC5RVUFSVEVSKyIiLDEvNDtmdW5jdGlvbiBiKGUpe2lmKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU9PSJmdW5jdGlvbiIpcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShlKTtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBlO2xldCBzPXt9O3JldHVybiBBcnJheS5pc0FycmF5KGUpP3M9ZS5tYXAodT0+Yih1KSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaCh1PT57c1t1XT1iKGVbdV0pfSksc31mdW5jdGlvbiB3KGUscyl7Y29uc3QgdT17fTtmb3IoY29uc3QgQSBpbiBlKXMuaW5jbHVkZXMoQSkmJih1W0FdPWVbQV0pO3JldHVybiB1fWZ1bmN0aW9uIHJlKGUscyl7cmV0dXJuIGUubGVuZ3RoIT09cy5sZW5ndGg/ITE6IWUuc29tZSh1PT4hcy5pbmNsdWRlcyh1KSl9dmFyIGw7KGZ1bmN0aW9uKGUpe2UuVEVYVD0idGV4dCIsZS5JTUFHRT0iaW1hZ2UiLGUuVEFCTEU9InRhYmxlIixlLkhZUEVSTElOSz0iaHlwZXJsaW5rIixlLlNVUEVSU0NSSVBUPSJzdXBlcnNjcmlwdCIsZS5TVUJTQ1JJUFQ9InN1YnNjcmlwdCIsZS5TRVBBUkFUT1I9InNlcGFyYXRvciIsZS5QQUdFX0JSRUFLPSJwYWdlQnJlYWsiLGUuQ09OVFJPTD0iY29udHJvbCIsZS5BUkVBPSJhcmVhIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuTEFURVg9ImxhdGV4IixlLlRBQj0idGFiIixlLkRBVEU9ImRhdGUiLGUuQkxPQ0s9ImJsb2NrIixlLlRJVExFPSJ0aXRsZSIsZS5MSVNUPSJsaXN0IixlLkxBQkVMPSJsYWJlbCJ9KShsfHwobD17fSkpO2NvbnN0IG9lPVsicm93RmxleCIsInJvd01hcmdpbiJdLHNlPVsidHlwZSIsImZvbnQiLCJzaXplIiwiYm9sZCIsImNvbG9yIiwiaXRhbGljIiwiaGlnaGxpZ2h0IiwidW5kZXJsaW5lIiwic3RyaWtlb3V0Iiwicm93RmxleCIsInJvd01hcmdpbiIsImRhc2hBcnJheSIsInRyTGlzdCIsInRhYmxlVG9vbERpc2FibGVkIiwiYm9yZGVyVHlwZSIsImJvcmRlckNvbG9yIiwidHJhbnNsYXRlWCIsIndpZHRoIiwiaGVpZ2h0IiwidXJsIiwiY29sZ3JvdXAiLCJ2YWx1ZUxpc3QiLCJjb250cm9sIiwiY2hlY2tib3giLCJyYWRpbyIsImRhdGVGb3JtYXQiLCJibG9jayIsImxldmVsIiwidGl0bGUiLCJsaXN0VHlwZSIsImxpc3RTdHlsZSIsImxpc3RXcmFwIiwiZ3JvdXBJZHMiLCJjb25jZXB0SWQiLCJpbWdEaXNwbGF5IiwiaW1nRmxvYXRQb3NpdGlvbiIsImltZ1Rvb2xEaXNhYmxlZCIsImltZ1ByZXZpZXdEaXNhYmxlZCIsImltZ0Nyb3AiLCJpbWdDYXB0aW9uIiwidGV4dERlY29yYXRpb24iLCJleHRlbnNpb24iLCJleHRlcm5hbElkIiwiYXJlYUlkIiwiYXJlYSIsImhpZGUiLCJsYWJlbCIsImxhYmVsSWQiLCJsaW5lV2lkdGgiXSxjZT1bImNvbmNlcHRJZCIsImV4dGVuc2lvbiIsImV4dGVybmFsSWQiLCJ2ZXJ0aWNhbEFsaWduIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyVHlwZXMiLCJzbGFzaFR5cGVzIiwiZGlzYWJsZWQiLCJkZWxldGFibGUiXSxFZT1bImZvbnQiLCJzaXplIiwiYm9sZCIsImhpZ2hsaWdodCIsIml0YWxpYyIsInN0cmlrZW91dCJdO2wuVEVYVCxsLkhZUEVSTElOSyxsLlNVQlNDUklQVCxsLlNVUEVSU0NSSVBULGwuQ09OVFJPTCxsLkRBVEUsbC5JTUFHRSxsLkxBVEVYLGwuQkxPQ0ssbC5QQUdFX0JSRUFLLGwuU0VQQVJBVE9SLGwuVEFCTEUsbC5USVRMRSxsLkxJU1Q7dmFyIE47KGZ1bmN0aW9uKGUpe2UuVUw9InVsIixlLk9MPSJvbCJ9KShOfHwoTj17fSkpO3ZhciBPOyhmdW5jdGlvbihlKXtlLkRJU0M9ImRpc2MiLGUuQ0lSQ0xFPSJjaXJjbGUiLGUuU1FVQVJFPSJzcXVhcmUiLGUuQ0hFQ0tCT1g9ImNoZWNrYm94In0pKE98fChPPXt9KSk7dmFyIEg7KGZ1bmN0aW9uKGUpe2UuREVDSU1BTD0iZGVjaW1hbCJ9KShIfHwoSD17fSkpO3ZhciB2OyhmdW5jdGlvbihlKXtlW2UuRElTQz1PLkRJU0NdPSJESVNDIixlW2UuQ0lSQ0xFPU8uQ0lSQ0xFXT0iQ0lSQ0xFIixlW2UuU1FVQVJFPU8uU1FVQVJFXT0iU1FVQVJFIixlW2UuREVDSU1BTD1ILkRFQ0lNQUxdPSJERUNJTUFMIixlW2UuQ0hFQ0tCT1g9Ty5DSEVDS0JPWF09IkNIRUNLQk9YIn0pKHZ8fCh2PXt9KSksTy5ESVNDKyIiLE8uQ0lSQ0xFKyIiLE8uU1FVQVJFKyIiLE8uQ0hFQ0tCT1grIiIsTi5PTCsiIixOLlVMKyIiLHYuRElTQysiIix2LkNJUkNMRSsiIix2LlNRVUFSRSsiIix2LkRFQ0lNQUwrIiIsdi5DSEVDS0JPWCsiIjt2YXIgZjsoZnVuY3Rpb24oZSl7ZS5GSVJTVD0iZmlyc3QiLGUuU0VDT05EPSJzZWNvbmQiLGUuVEhJUkQ9InRoaXJkIixlLkZPVVJUSD0iZm91cnRoIixlLkZJRlRIPSJmaWZ0aCIsZS5TSVhUSD0ic2l4dGgifSkoZnx8KGY9e30pKSxmLkZJUlNUKyIiLGYuU0VDT05EKyIiLGYuVEhJUkQrIiIsZi5GT1VSVEgrIiIsZi5GSUZUSCsiIixmLlNJWFRIKyIiLGYuRklSU1QrIiIsZi5TRUNPTkQrIiIsZi5USElSRCsiIixmLkZPVVJUSCsiIixmLkZJRlRIKyIiLGYuU0lYVEgrIiIsZi5GSVJTVCxmLlNFQ09ORCxmLlRISVJELGYuRk9VUlRILGYuRklGVEgsZi5TSVhUSDt2YXIgSzsoZnVuY3Rpb24oZSl7ZS5JRlJBTUU9ImlmcmFtZSIsZS5WSURFTz0idmlkZW8ifSkoS3x8KEs9e30pKTt2YXIgRzsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLlNFTEVDVD0ic2VsZWN0IixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuREFURT0iZGF0ZSIsZS5OVU1CRVI9Im51bWJlciJ9KShHfHwoRz17fSkpO3ZhciBDOyhmdW5jdGlvbihlKXtlLlBSRUZJWD0icHJlZml4IixlLlBPU1RGSVg9InBvc3RmaXgiLGUuUFJFX1RFWFQ9InByZVRleHQiLGUuUE9TVF9URVhUPSJwb3N0VGV4dCIsZS5QTEFDRUhPTERFUj0icGxhY2Vob2xkZXIiLGUuVkFMVUU9InZhbHVlIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8ifSkoQ3x8KEM9e30pKTt2YXIgejsoZnVuY3Rpb24oZSl7ZS5ST1dfU1RBUlQ9InJvd1N0YXJ0IixlLlZBTFVFX1NUQVJUPSJ2YWx1ZVN0YXJ0In0pKHp8fCh6PXt9KSk7dmFyIFk7KGZ1bmN0aW9uKGUpe2UuQUNUSVZFPSJhY3RpdmUiLGUuSU5BQ1RJVkU9ImluYWN0aXZlIn0pKFl8fChZPXt9KSk7dmFyIFY7KGZ1bmN0aW9uKGUpe2UuTlVNQkVSPSJudW1iZXIiLGUuT1BFUkFUT1I9Im9wZXJhdG9yIixlLlVUSUxJVFk9InV0aWxpdHkiLGUuRVFVQUw9ImVxdWFsIn0pKFZ8fChWPXt9KSk7dmFyIFE7KGZ1bmN0aW9uKGUpe2UuQ09NUE9ORU5UPSJjb21wb25lbnQiLGUuTUVOVT0ibWVudSIsZS5NQUlOPSJtYWluIixlLkZPT1RFUj0iZm9vdGVyIixlLkNPTlRFWFRNRU5VPSJjb250ZXh0bWVudSIsZS5QT1BVUD0icG9wdXAiLGUuQ0FUQUxPRz0iY2F0YWxvZyIsZS5DT01NRU5UPSJjb21tZW50In0pKFF8fChRPXt9KSk7dmFyIFc7KGZ1bmN0aW9uKGUpe2UuUEFHRT0icGFnZSIsZS5UQUJMRT0idGFibGUifSkoV3x8KFc9e30pKTt2YXIgcTsoZnVuY3Rpb24oZSl7ZS5FRElUPSJlZGl0IixlLkNMRUFOPSJjbGVhbiIsZS5SRUFET05MWT0icmVhZG9ubHkiLGUuRk9STT0iZm9ybSIsZS5QUklOVD0icHJpbnQiLGUuREVTSUdOPSJkZXNpZ24iLGUuR1JBRkZJVEk9ImdyYWZmaXRpIn0pKHF8fChxPXt9KSk7dmFyIFo7KGZ1bmN0aW9uKGUpe2UuSEVBREVSPSJoZWFkZXIiLGUuTUFJTj0ibWFpbiIsZS5GT09URVI9ImZvb3RlciJ9KShafHwoWj17fSkpO3ZhciBKOyhmdW5jdGlvbihlKXtlLlBBR0lORz0icGFnaW5nIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoSnx8KEo9e30pKTt2YXIgajsoZnVuY3Rpb24oZSl7ZS5WRVJUSUNBTD0idmVydGljYWwiLGUuSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCJ9KShqfHwoaj17fSkpO3ZhciAkOyhmdW5jdGlvbihlKXtlLkJSRUFLX0FMTD0iYnJlYWstYWxsIixlLkJSRUFLX1dPUkQ9ImJyZWFrLXdvcmQifSkoJHx8KCQ9e30pKTt2YXIgZWU7KGZ1bmN0aW9uKGUpe2UuU1BFRUQ9InNwZWVkIixlLkNPTVBBVElCSUxJVFk9ImNvbXBhdGliaWxpdHkifSkoZWV8fChlZT17fSkpO3ZhciBEOyhmdW5jdGlvbihlKXtlLkxFRlQ9ImxlZnQiLGUuQ0VOVEVSPSJjZW50ZXIiLGUuUklHSFQ9InJpZ2h0IixlLkFMSUdOTUVOVD0iYWxpZ25tZW50IixlLkpVU1RJRlk9Imp1c3RpZnkifSkoRHx8KEQ9e30pKTt2YXIgdGU7KGZ1bmN0aW9uKGUpe2UuQUxMPSJhbGwiLGUuRU1QVFk9ImVtcHR5IixlLkVYVEVSTkFMPSJleHRlcm5hbCIsZS5JTlRFUk5BTD0iaW50ZXJuYWwiLGUuREFTSD0iZGFzaCJ9KSh0ZXx8KHRlPXt9KSk7dmFyIGllOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLlJJR0hUPSJyaWdodCIsZS5CT1RUT009ImJvdHRvbSIsZS5MRUZUPSJsZWZ0In0pKGllfHwoaWU9e30pKTt2YXIgYWU7KGZ1bmN0aW9uKGUpe2UuRk9SV0FSRD0iZm9yd2FyZCIsZS5CQUNLPSJiYWNrIn0pKGFlfHwoYWU9e30pKTt2YXIgbTsoZnVuY3Rpb24oZSl7ZS5DT05UQUlOPSJjb250YWluIixlLkNPVkVSPSJjb3ZlciJ9KShtfHwobT17fSkpO3ZhciBrOyhmdW5jdGlvbihlKXtlLlJFUEVBVD0icmVwZWF0IixlLk5PX1JFUEVBVD0ibm8tcmVwZWF0IixlLlJFUEVBVF9YPSJyZXBlYXQteCIsZS5SRVBFQVRfWT0icmVwZWF0LXkifSkoa3x8KGs9e30pKSxtLkNPVkVSLGsuTk9fUkVQRUFUO3ZhciBGOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLk1JRERMRT0ibWlkZGxlIixlLkJPVFRPTT0iYm90dG9tIn0pKEZ8fChGPXt9KSksRi5CT1RUT00sVC5IQUxGLFQuSEFMRjtjb25zdCB1ZT17UEFHRV9OTzoie3BhZ2VOb30iLFBBR0VfQ09VTlQ6IntwYWdlQ291bnR9In07RC5DRU5URVIsdWUuUEFHRV9OTyxJLkFSQUJJQyxGLkJPVFRPTTt2YXIgVTsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLklNQUdFPSJpbWFnZSJ9KShVfHwoVT17fSkpLFUuVEVYVCxJLkFSQUJJQzt2YXIgeTsoZnVuY3Rpb24oZSl7ZS5QQUdFPSJwYWdlIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoeXx8KHk9e30pKSx5LkNPTlRJTlVJVFk7ZnVuY3Rpb24gZmUoZSxzKXtjb25zdCB1PU9iamVjdC5rZXlzKGUpLEE9T2JqZWN0LmtleXMocyk7aWYodS5sZW5ndGghPT1BLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IFI9MDtSPHUubGVuZ3RoO1IrKyl7Y29uc3QgYT11W1JdO2lmKGEhPT0idmFsdWUiJiYhKGE9PT0iZ3JvdXBJZHMiJiZBcnJheS5pc0FycmF5KGVbYV0pJiZBcnJheS5pc0FycmF5KHNbYV0pJiZyZShlW2FdLHNbYV0pKSYmZVthXSE9PXNbYV0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gQihlLHM9e30pe2NvbnN0e2V4dHJhUGlja0F0dHJzOnV9PXMsQT1bLi4uc2VdO3UmJkEucHVzaCguLi51KTtjb25zdCBSPXt2YWx1ZTplLnZhbHVlPT09UD9gCmA6ZS52YWx1ZX07cmV0dXJuIEEuZm9yRWFjaChhPT57Y29uc3QgcD1lW2FdO3AhPT12b2lkIDAmJihSW2FdPXApfSksUn1mdW5jdGlvbiBoKGUscz17fSl7Y29uc3R7ZXh0cmFQaWNrQXR0cnM6dSxpc0NsYXNzaWZ5QXJlYTpBPSExLGlzQ2xvbmU6Uj0hMH09cyxhPVI/YihlKTplLHA9W107bGV0IGk9MDtmb3IoO2k8YS5sZW5ndGg7KXtsZXQgdD1hW2ldO2lmKGk9PT0wJiZ0LnZhbHVlPT09UCYmIXQubGlzdElkJiYoIXQudHlwZXx8dC50eXBlPT09bC5URVhUKSl7aSsrO2NvbnRpbnVlfWlmKHQuYXJlYUlkKXtjb25zdCBuPXQuYXJlYUlkLEU9dC5hcmVhLGM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW2ldO2lmKG4hPT1vLmFyZWFJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmFyZWEsZGVsZXRlIG8uYXJlYUlkLGMucHVzaChvKSxpKyt9Y29uc3Qgcj1oKGMscyk7aWYoQSl7Y29uc3Qgbz17dHlwZTpsLkFSRUEsdmFsdWU6IiIsYXJlYUlkOm4sYXJlYTpFfTtvLnZhbHVlTGlzdD1yLHQ9b31lbHNle3Auc3BsaWNlKGksMCwuLi5yKTtjb250aW51ZX19ZWxzZSBpZih0LnRpdGxlSWQmJnQubGV2ZWwpe2NvbnN0IG49dC50aXRsZUlkO2lmKG4pe2NvbnN0IEU9dC5sZXZlbCxjPXt0eXBlOmwuVElUTEUsdGl0bGU6dC50aXRsZSx0aXRsZUlkOm4sdmFsdWU6IiIsbGV2ZWw6RX0scj1bXTtmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCBvPWFbaV07aWYobiE9PW8udGl0bGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmxldmVsLGRlbGV0ZSBvLnRpdGxlLHIucHVzaChvKSxpKyt9Yy52YWx1ZUxpc3Q9aChyLHMpLHQ9Y319ZWxzZSBpZih0Lmxpc3RJZCYmdC5saXN0VHlwZSl7Y29uc3Qgbj10Lmxpc3RJZDtpZihuKXtjb25zdCBFPXQubGlzdFR5cGUsYz10Lmxpc3RTdHlsZSxyPXt0eXBlOmwuTElTVCx2YWx1ZToiIixsaXN0SWQ6bixsaXN0VHlwZTpFLGxpc3RTdHlsZTpjfSxvPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IEw9YVtpXTtpZihuIT09TC5saXN0SWQpe2ktLTticmVha31kZWxldGUgTC5saXN0VHlwZSxkZWxldGUgTC5saXN0U3R5bGUsby5wdXNoKEwpLGkrK31yLnZhbHVlTGlzdD1oKG8scyksdD1yfX1lbHNlIGlmKHQudHlwZT09PWwuVEFCTEUpe2lmKHQucGFnaW5nSWQpe2xldCBuPWkrMSxFPTA7Zm9yKDtuPGEubGVuZ3RoOyl7Y29uc3QgYz1hW25dO2lmKGMucGFnaW5nSWQ9PT10LnBhZ2luZ0lkKXQuaGVpZ2h0Kz1jLmhlaWdodCx0LnRyTGlzdC5wdXNoKC4uLmMudHJMaXN0KSxuKyssRSsrO2Vsc2UgYnJlYWt9aSs9RX1pZih0LnRyTGlzdClmb3IobGV0IG49MDtuPHQudHJMaXN0Lmxlbmd0aDtuKyspe2NvbnN0IEU9dC50ckxpc3Rbbl07ZGVsZXRlIEUuaWQ7Zm9yKGxldCBjPTA7YzxFLnRkTGlzdC5sZW5ndGg7YysrKXtjb25zdCByPUUudGRMaXN0W2NdLG89e2NvbHNwYW46ci5jb2xzcGFuLHJvd3NwYW46ci5yb3dzcGFuLHZhbHVlOmgoci52YWx1ZSxYKFMoe30scykse2lzQ2xhc3NpZnlBcmVhOiExfSkpfTtjZS5mb3JFYWNoKEw9Pntjb25zdCBnPXJbTF07ZyE9PXZvaWQgMCYmKG9bTF09Zyl9KSxFLnRkTGlzdFtjXT1vfX19ZWxzZSBpZih0LnR5cGU9PT1sLkhZUEVSTElOSyl7Y29uc3Qgbj10Lmh5cGVybGlua0lkO2lmKG4pe2NvbnN0IEU9e3R5cGU6bC5IWVBFUkxJTkssdmFsdWU6IiIsdXJsOnQudXJsfSxjPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IHI9YVtpXTtpZihuIT09ci5oeXBlcmxpbmtJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIudXJsLGMucHVzaChyKSxpKyt9RS52YWx1ZUxpc3Q9aChjLHMpLHQ9RX19ZWxzZSBpZih0LnR5cGU9PT1sLkRBVEUpe2NvbnN0IG49dC5kYXRlSWQ7aWYobil7Y29uc3QgRT17dHlwZTpsLkRBVEUsdmFsdWU6IiIsZGF0ZUZvcm1hdDp0LmRhdGVGb3JtYXR9LGM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgcj1hW2ldO2lmKG4hPT1yLmRhdGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIuZGF0ZUZvcm1hdCxjLnB1c2gociksaSsrfUUudmFsdWVMaXN0PWgoYyxzKSx0PUV9fWVsc2UgaWYodC5jb250cm9sSWQpe2NvbnN0IG49dC5jb250cm9sSWQ7aWYodC5jb250cm9sQ29tcG9uZW50PT09Qy5QUkVGSVgpe2NvbnN0IEU9W107bGV0IGM9ITEscj1pO2Zvcig7cjxhLmxlbmd0aDspe2NvbnN0IG89YVtyXTtpZihuIT09by5jb250cm9sSWQpYnJlYWs7by5jb250cm9sQ29tcG9uZW50PT09Qy5WQUxVRSYmKGRlbGV0ZSBvLmNvbnRyb2wsZGVsZXRlIG8uY29udHJvbElkLEUucHVzaChvKSksby5jb250cm9sQ29tcG9uZW50PT09Qy5QT1NURklYJiYoYz0hMCkscisrfWlmKGMpe2NvbnN0IG89dyh0LEVlKSxMPVMoUyh7fSx0LmNvbnRyb2wpLG8pLGc9WChTKHt9LHcodCxvZSkpLHt0eXBlOmwuQ09OVFJPTCx2YWx1ZToiIixjb250cm9sOkwsY29udHJvbElkOm59KTtnLmNvbnRyb2wudmFsdWU9aChFLHMpLHQ9QihnLHtleHRyYVBpY2tBdHRyczp1fSksaSs9ci1pLTF9fWlmKHQuY29udHJvbENvbXBvbmVudCYmKGRlbGV0ZSB0LmNvbnRyb2wsZGVsZXRlIHQuY29udHJvbElkLHQuY29udHJvbENvbXBvbmVudCE9PUMuVkFMVUUmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUFJFX1RFWFQmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUE9TVF9URVhUKSl7aSsrO2NvbnRpbnVlfX1jb25zdCB4PUIodCx7ZXh0cmFQaWNrQXR0cnM6dX0pO2lmKCF0LnR5cGV8fHQudHlwZT09PWwuVEVYVHx8dC50eXBlPT09bC5TVUJTQ1JJUFR8fHQudHlwZT09PWwuU1VQRVJTQ1JJUFQpZm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbj1hW2krMV07aWYoaSsrLG4mJmZlKHgsQihuLHtleHRyYVBpY2tBdHRyczp1fSkpKXtjb25zdCBFPW4udmFsdWU9PT1QP2AKYDpuLnZhbHVlO3gudmFsdWUrPUV9ZWxzZSBicmVha31lbHNlIGkrKztwLnB1c2goeCl9cmV0dXJuIHB9b25tZXNzYWdlPWU9Pntjb25zdCBzPWUuZGF0YSx7b3B0aW9uczp1LGRhdGE6QX09cyx7ZXh0cmFQaWNrQXR0cnM6Uj1bXX09dXx8e30sYT17aGVhZGVyOmgoQS5oZWFkZXIse2V4dHJhUGlja0F0dHJzOlIsaXNDbG9uZTohMX0pLG1haW46aChBLm1haW4se2V4dHJhUGlja0F0dHJzOlIsaXNDbGFzc2lmeUFyZWE6ITAsaXNDbG9uZTohMX0pLGZvb3RlcjpoKEEuZm9vdGVyLHtleHRyYVBpY2tBdHRyczpSLGlzQ2xvbmU6ITF9KX07cG9zdE1lc3NhZ2UoYSl9fSkoKTt9KSgpOwo=";
15652
+ const encodedJs = "KCgpPT57dmFyIFRlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxJZT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgQWU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIGRlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksUmU9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgbmU9KFQsSSxkKT0+SSBpbiBUP1RlKFQsSSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZH0pOlRbSV09ZCxnPShULEkpPT57Zm9yKHZhciBkIGluIEl8fChJPXt9KSlkZS5jYWxsKEksZCkmJm5lKFQsZCxJW2RdKTtpZihsZSlmb3IodmFyIGQgb2YgbGUoSSkpUmUuY2FsbChJLGQpJiZuZShULGQsSVtkXSk7cmV0dXJuIFR9LFg9KFQsSSk9PkllKFQsQWUoSSkpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgVDsoZnVuY3Rpb24oZSl7ZS5IQUxGPSJoYWxmIixlLk9ORV9USElSRD0ib25lLXRoaXJkIixlLlFVQVJURVI9InF1YXJ0ZXIifSkoVHx8KFQ9e30pKTt2YXIgSTsoZnVuY3Rpb24oZSl7ZS5BUkFCSUM9ImFyYWJpYyIsZS5DSElORVNFPSJjaGluZXNlIn0pKEl8fChJPXt9KSk7dmFyIGQ7KGZ1bmN0aW9uKGUpe2UuSU5MSU5FPSJpbmxpbmUiLGUuQkxPQ0s9ImJsb2NrIixlLlNVUlJPVU5EPSJzdXJyb3VuZCIsZS5GTE9BVF9UT1A9ImZsb2F0LXRvcCIsZS5GTE9BVF9CT1RUT009ImZsb2F0LWJvdHRvbSJ9KShkfHwoZD17fSkpO3ZhciBfOyhmdW5jdGlvbihlKXtlLkJFRk9SRT0iYmVmb3JlIixlLkFGVEVSPSJhZnRlciIsZS5PVVRFUl9CRUZPUkU9Im91dGVyLWJlZm9yZSIsZS5PVVRFUl9BRlRFUj0ib3V0ZXItYWZ0ZXIifSkoX3x8KF89e30pKTt2YXIgTTsoZnVuY3Rpb24oZSl7ZS5ST1c9InJvdyIsZS5DT0xVTU49ImNvbHVtbiJ9KShNfHwoTT17fSkpO2NvbnN0IFA9Ilx1MjAwQiI7VC5IQUxGKyIiLDEvMixULk9ORV9USElSRCsiIiwxLzMsVC5RVUFSVEVSKyIiLDEvNDtmdW5jdGlvbiBiKGUpe2lmKHR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU9PSJmdW5jdGlvbiIpcmV0dXJuIHN0cnVjdHVyZWRDbG9uZShlKTtpZighZXx8dHlwZW9mIGUhPSJvYmplY3QiKXJldHVybiBlO2xldCBjPXt9O3JldHVybiBBcnJheS5pc0FycmF5KGUpP2M9ZS5tYXAoRT0+YihFKSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaChFPT57Y1tFXT1iKGVbRV0pfSksY31mdW5jdGlvbiB3KGUsYyl7Y29uc3QgRT17fTtmb3IoY29uc3QgQSBpbiBlKWMuaW5jbHVkZXMoQSkmJihFW0FdPWVbQV0pO3JldHVybiBFfWZ1bmN0aW9uIHJlKGUsYyl7cmV0dXJuIGUubGVuZ3RoIT09Yy5sZW5ndGg/ITE6IWUuc29tZShFPT4hYy5pbmNsdWRlcyhFKSl9dmFyIG47KGZ1bmN0aW9uKGUpe2UuVEVYVD0idGV4dCIsZS5JTUFHRT0iaW1hZ2UiLGUuVEFCTEU9InRhYmxlIixlLkhZUEVSTElOSz0iaHlwZXJsaW5rIixlLlNVUEVSU0NSSVBUPSJzdXBlcnNjcmlwdCIsZS5TVUJTQ1JJUFQ9InN1YnNjcmlwdCIsZS5TRVBBUkFUT1I9InNlcGFyYXRvciIsZS5QQUdFX0JSRUFLPSJwYWdlQnJlYWsiLGUuQ09OVFJPTD0iY29udHJvbCIsZS5BUkVBPSJhcmVhIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuTEFURVg9ImxhdGV4IixlLlRBQj0idGFiIixlLkRBVEU9ImRhdGUiLGUuQkxPQ0s9ImJsb2NrIixlLlRJVExFPSJ0aXRsZSIsZS5MSVNUPSJsaXN0IixlLkxBQkVMPSJsYWJlbCJ9KShufHwobj17fSkpO2NvbnN0IG9lPVsicm93RmxleCIsInJvd01hcmdpbiJdLGNlPVsidHlwZSIsImZvbnQiLCJzaXplIiwiYm9sZCIsImNvbG9yIiwiaXRhbGljIiwiaGlnaGxpZ2h0IiwidW5kZXJsaW5lIiwic3RyaWtlb3V0Iiwicm93RmxleCIsInJvd01hcmdpbiIsImRhc2hBcnJheSIsInRyTGlzdCIsInRhYmxlVG9vbERpc2FibGVkIiwiYm9yZGVyVHlwZSIsImJvcmRlckNvbG9yIiwidHJhbnNsYXRlWCIsIndpZHRoIiwiaGVpZ2h0IiwidXJsIiwiY29sZ3JvdXAiLCJ2YWx1ZUxpc3QiLCJjb250cm9sIiwiY2hlY2tib3giLCJyYWRpbyIsImRhdGVGb3JtYXQiLCJibG9jayIsImxldmVsIiwidGl0bGUiLCJsaXN0VHlwZSIsImxpc3RTdHlsZSIsImxpc3RXcmFwIiwiZ3JvdXBJZHMiLCJjb25jZXB0SWQiLCJpbWdEaXNwbGF5IiwiaW1nRmxvYXRQb3NpdGlvbiIsImltZ1Rvb2xEaXNhYmxlZCIsImltZ1ByZXZpZXdEaXNhYmxlZCIsImltZ0Nyb3AiLCJpbWdDYXB0aW9uIiwidGV4dERlY29yYXRpb24iLCJleHRlbnNpb24iLCJleHRlcm5hbElkIiwiYXJlYUlkIiwiYXJlYSIsImhpZGUiLCJsYWJlbCIsImxhYmVsSWQiLCJsaW5lV2lkdGgiXSxzZT1bImNvbmNlcHRJZCIsImV4dGVuc2lvbiIsImV4dGVybmFsSWQiLCJ2ZXJ0aWNhbEFsaWduIiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyVHlwZXMiLCJzbGFzaFR5cGVzIiwiZGlzYWJsZWQiLCJkZWxldGFibGUiXSxmZT1bImZvbnQiLCJzaXplIiwiYm9sZCIsImhpZ2hsaWdodCIsIml0YWxpYyIsInN0cmlrZW91dCJdO24uVEVYVCxuLkhZUEVSTElOSyxuLlNVQlNDUklQVCxuLlNVUEVSU0NSSVBULG4uQ09OVFJPTCxuLkRBVEUsbi5JTUFHRSxuLkxBVEVYLG4uQkxPQ0ssbi5QQUdFX0JSRUFLLG4uU0VQQVJBVE9SLG4uVEFCTEUsbi5USVRMRSxuLkxJU1Q7dmFyIE47KGZ1bmN0aW9uKGUpe2UuVUw9InVsIixlLk9MPSJvbCJ9KShOfHwoTj17fSkpO3ZhciBPOyhmdW5jdGlvbihlKXtlLkRJU0M9ImRpc2MiLGUuQ0lSQ0xFPSJjaXJjbGUiLGUuU1FVQVJFPSJzcXVhcmUiLGUuQ0hFQ0tCT1g9ImNoZWNrYm94In0pKE98fChPPXt9KSk7dmFyIEg7KGZ1bmN0aW9uKGUpe2UuREVDSU1BTD0iZGVjaW1hbCJ9KShIfHwoSD17fSkpO3ZhciB2OyhmdW5jdGlvbihlKXtlW2UuRElTQz1PLkRJU0NdPSJESVNDIixlW2UuQ0lSQ0xFPU8uQ0lSQ0xFXT0iQ0lSQ0xFIixlW2UuU1FVQVJFPU8uU1FVQVJFXT0iU1FVQVJFIixlW2UuREVDSU1BTD1ILkRFQ0lNQUxdPSJERUNJTUFMIixlW2UuQ0hFQ0tCT1g9Ty5DSEVDS0JPWF09IkNIRUNLQk9YIn0pKHZ8fCh2PXt9KSksTy5ESVNDKyIiLE8uQ0lSQ0xFKyIiLE8uU1FVQVJFKyIiLE8uQ0hFQ0tCT1grIiIsTi5PTCsiIixOLlVMKyIiLHYuRElTQysiIix2LkNJUkNMRSsiIix2LlNRVUFSRSsiIix2LkRFQ0lNQUwrIiIsdi5DSEVDS0JPWCsiIjt2YXIgdTsoZnVuY3Rpb24oZSl7ZS5GSVJTVD0iZmlyc3QiLGUuU0VDT05EPSJzZWNvbmQiLGUuVEhJUkQ9InRoaXJkIixlLkZPVVJUSD0iZm91cnRoIixlLkZJRlRIPSJmaWZ0aCIsZS5TSVhUSD0ic2l4dGgifSkodXx8KHU9e30pKSx1LkZJUlNUKyIiLHUuU0VDT05EKyIiLHUuVEhJUkQrIiIsdS5GT1VSVEgrIiIsdS5GSUZUSCsiIix1LlNJWFRIKyIiLHUuRklSU1QrIiIsdS5TRUNPTkQrIiIsdS5USElSRCsiIix1LkZPVVJUSCsiIix1LkZJRlRIKyIiLHUuU0lYVEgrIiIsdS5GSVJTVCx1LlNFQ09ORCx1LlRISVJELHUuRk9VUlRILHUuRklGVEgsdS5TSVhUSDt2YXIgSzsoZnVuY3Rpb24oZSl7ZS5JRlJBTUU9ImlmcmFtZSIsZS5WSURFTz0idmlkZW8ifSkoS3x8KEs9e30pKTt2YXIgRzsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLlNFTEVDVD0ic2VsZWN0IixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8iLGUuREFURT0iZGF0ZSIsZS5OVU1CRVI9Im51bWJlciJ9KShHfHwoRz17fSkpO3ZhciBDOyhmdW5jdGlvbihlKXtlLlBSRUZJWD0icHJlZml4IixlLlBPU1RGSVg9InBvc3RmaXgiLGUuUFJFX1RFWFQ9InByZVRleHQiLGUuUE9TVF9URVhUPSJwb3N0VGV4dCIsZS5QTEFDRUhPTERFUj0icGxhY2Vob2xkZXIiLGUuVkFMVUU9InZhbHVlIixlLkNIRUNLQk9YPSJjaGVja2JveCIsZS5SQURJTz0icmFkaW8ifSkoQ3x8KEM9e30pKTt2YXIgejsoZnVuY3Rpb24oZSl7ZS5ST1dfU1RBUlQ9InJvd1N0YXJ0IixlLlZBTFVFX1NUQVJUPSJ2YWx1ZVN0YXJ0In0pKHp8fCh6PXt9KSk7dmFyIFk7KGZ1bmN0aW9uKGUpe2UuQUNUSVZFPSJhY3RpdmUiLGUuSU5BQ1RJVkU9ImluYWN0aXZlIn0pKFl8fChZPXt9KSk7dmFyIFY7KGZ1bmN0aW9uKGUpe2UuTlVNQkVSPSJudW1iZXIiLGUuT1BFUkFUT1I9Im9wZXJhdG9yIixlLlVUSUxJVFk9InV0aWxpdHkiLGUuRVFVQUw9ImVxdWFsIn0pKFZ8fChWPXt9KSk7dmFyIFE7KGZ1bmN0aW9uKGUpe2UuQ09NUE9ORU5UPSJjb21wb25lbnQiLGUuTUVOVT0ibWVudSIsZS5NQUlOPSJtYWluIixlLkZPT1RFUj0iZm9vdGVyIixlLkNPTlRFWFRNRU5VPSJjb250ZXh0bWVudSIsZS5QT1BVUD0icG9wdXAiLGUuQ0FUQUxPRz0iY2F0YWxvZyIsZS5DT01NRU5UPSJjb21tZW50In0pKFF8fChRPXt9KSk7dmFyIFc7KGZ1bmN0aW9uKGUpe2UuUEFHRT0icGFnZSIsZS5UQUJMRT0idGFibGUifSkoV3x8KFc9e30pKTt2YXIgcTsoZnVuY3Rpb24oZSl7ZS5FRElUPSJlZGl0IixlLkNMRUFOPSJjbGVhbiIsZS5SRUFET05MWT0icmVhZG9ubHkiLGUuRk9STT0iZm9ybSIsZS5QUklOVD0icHJpbnQiLGUuREVTSUdOPSJkZXNpZ24iLGUuR1JBRkZJVEk9ImdyYWZmaXRpIn0pKHF8fChxPXt9KSk7dmFyIFo7KGZ1bmN0aW9uKGUpe2UuSEVBREVSPSJoZWFkZXIiLGUuTUFJTj0ibWFpbiIsZS5GT09URVI9ImZvb3RlciJ9KShafHwoWj17fSkpO3ZhciBKOyhmdW5jdGlvbihlKXtlLlBBR0lORz0icGFnaW5nIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoSnx8KEo9e30pKTt2YXIgajsoZnVuY3Rpb24oZSl7ZS5WRVJUSUNBTD0idmVydGljYWwiLGUuSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCJ9KShqfHwoaj17fSkpO3ZhciAkOyhmdW5jdGlvbihlKXtlLkJSRUFLX0FMTD0iYnJlYWstYWxsIixlLkJSRUFLX1dPUkQ9ImJyZWFrLXdvcmQifSkoJHx8KCQ9e30pKTt2YXIgZWU7KGZ1bmN0aW9uKGUpe2UuU1BFRUQ9InNwZWVkIixlLkNPTVBBVElCSUxJVFk9ImNvbXBhdGliaWxpdHkifSkoZWV8fChlZT17fSkpO3ZhciBEOyhmdW5jdGlvbihlKXtlLkxFRlQ9ImxlZnQiLGUuQ0VOVEVSPSJjZW50ZXIiLGUuUklHSFQ9InJpZ2h0IixlLkFMSUdOTUVOVD0iYWxpZ25tZW50IixlLkpVU1RJRlk9Imp1c3RpZnkifSkoRHx8KEQ9e30pKTt2YXIgdGU7KGZ1bmN0aW9uKGUpe2UuQUxMPSJhbGwiLGUuRU1QVFk9ImVtcHR5IixlLkVYVEVSTkFMPSJleHRlcm5hbCIsZS5JTlRFUk5BTD0iaW50ZXJuYWwiLGUuREFTSD0iZGFzaCJ9KSh0ZXx8KHRlPXt9KSk7dmFyIGllOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLlJJR0hUPSJyaWdodCIsZS5CT1RUT009ImJvdHRvbSIsZS5MRUZUPSJsZWZ0In0pKGllfHwoaWU9e30pKTt2YXIgYWU7KGZ1bmN0aW9uKGUpe2UuRk9SV0FSRD0iZm9yd2FyZCIsZS5CQUNLPSJiYWNrIn0pKGFlfHwoYWU9e30pKTt2YXIgazsoZnVuY3Rpb24oZSl7ZS5DT05UQUlOPSJjb250YWluIixlLkNPVkVSPSJjb3ZlciJ9KShrfHwoaz17fSkpO3ZhciBtOyhmdW5jdGlvbihlKXtlLlJFUEVBVD0icmVwZWF0IixlLk5PX1JFUEVBVD0ibm8tcmVwZWF0IixlLlJFUEVBVF9YPSJyZXBlYXQteCIsZS5SRVBFQVRfWT0icmVwZWF0LXkifSkobXx8KG09e30pKSxrLkNPVkVSLG0uTk9fUkVQRUFUO3ZhciBGOyhmdW5jdGlvbihlKXtlLlRPUD0idG9wIixlLk1JRERMRT0ibWlkZGxlIixlLkJPVFRPTT0iYm90dG9tIn0pKEZ8fChGPXt9KSksRi5CT1RUT00sVC5IQUxGLFQuSEFMRjtjb25zdCBFZT17UEFHRV9OTzoie3BhZ2VOb30iLFBBR0VfQ09VTlQ6IntwYWdlQ291bnR9In07RC5DRU5URVIsRWUuUEFHRV9OTyxJLkFSQUJJQyxGLkJPVFRPTTt2YXIgeTsoZnVuY3Rpb24oZSl7ZS5URVhUPSJ0ZXh0IixlLklNQUdFPSJpbWFnZSJ9KSh5fHwoeT17fSkpLHkuVEVYVCxJLkFSQUJJQzt2YXIgVTsoZnVuY3Rpb24oZSl7ZS5QQUdFPSJwYWdlIixlLkNPTlRJTlVJVFk9ImNvbnRpbnVpdHkifSkoVXx8KFU9e30pKSxVLkNPTlRJTlVJVFk7ZnVuY3Rpb24gdWUoZSxjKXtjb25zdCBFPU9iamVjdC5rZXlzKGUpLEE9T2JqZWN0LmtleXMoYyk7aWYoRS5sZW5ndGghPT1BLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IFI9MDtSPEUubGVuZ3RoO1IrKyl7Y29uc3QgYT1FW1JdO2lmKGEhPT0idmFsdWUiJiYhKGE9PT0iZ3JvdXBJZHMiJiZBcnJheS5pc0FycmF5KGVbYV0pJiZBcnJheS5pc0FycmF5KGNbYV0pJiZyZShlW2FdLGNbYV0pKSYmZVthXSE9PWNbYV0pcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gQihlLGM9e30pe2NvbnN0e2V4dHJhUGlja0F0dHJzOkV9PWMsQT1bLi4uY2VdO0UmJkEucHVzaCguLi5FKTtjb25zdCBSPXt2YWx1ZTplLnZhbHVlPT09UD9gCmA6ZS52YWx1ZX07cmV0dXJuIEEuZm9yRWFjaChhPT57Y29uc3QgcD1lW2FdO3AhPT12b2lkIDAmJihSW2FdPXApfSksUn1mdW5jdGlvbiBoKGUsYz17fSl7Y29uc3R7ZXh0cmFQaWNrQXR0cnM6RSxpc0NsYXNzaWZ5QXJlYTpBPSExLGlzQ2xvbmU6Uj0hMH09YyxhPVI/YihlKTplLHA9W107bGV0IGk9MDtmb3IoO2k8YS5sZW5ndGg7KXtsZXQgdD1hW2ldO2lmKGk9PT0wJiZ0LnZhbHVlPT09UCYmIXQubGlzdElkJiYoIXQudHlwZXx8dC50eXBlPT09bi5URVhUKSl7aSsrO2NvbnRpbnVlfWlmKHQuYXJlYUlkKXtjb25zdCBsPXQuYXJlYUlkLGY9dC5hcmVhLHM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW2ldO2lmKGwhPT1vLmFyZWFJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmFyZWEsZGVsZXRlIG8uYXJlYUlkLHMucHVzaChvKSxpKyt9Y29uc3Qgcj1oKHMsYyk7aWYoQSl7Y29uc3Qgbz17dHlwZTpuLkFSRUEsdmFsdWU6IiIsYXJlYUlkOmwsYXJlYTpmfTtvLnZhbHVlTGlzdD1yLHQ9b31lbHNle3Auc3BsaWNlKGksMCwuLi5yKTtjb250aW51ZX19ZWxzZSBpZih0LnRpdGxlSWQmJnQubGV2ZWwpe2NvbnN0IGw9dC50aXRsZUlkO2lmKGwpe2NvbnN0IGY9dC5sZXZlbCxzPXt0eXBlOm4uVElUTEUsdGl0bGU6dC50aXRsZSx0aXRsZUlkOmwsdmFsdWU6IiIsbGV2ZWw6Zn0scj1bXTtmb3IoO2k8YS5sZW5ndGg7KXtjb25zdCBvPWFbaV07aWYobCE9PW8udGl0bGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSBvLmxldmVsLGRlbGV0ZSBvLnRpdGxlLHIucHVzaChvKSxpKyt9cy52YWx1ZUxpc3Q9aChyLGMpLHQ9c319ZWxzZSBpZih0Lmxpc3RJZCYmdC5saXN0VHlwZSl7Y29uc3QgbD10Lmxpc3RJZDtpZihsKXtjb25zdCBmPXQubGlzdFR5cGUscz10Lmxpc3RTdHlsZSxyPXt0eXBlOm4uTElTVCx2YWx1ZToiIixsaXN0SWQ6bCxsaXN0VHlwZTpmLGxpc3RTdHlsZTpzfSxvPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IEw9YVtpXTtpZihsIT09TC5saXN0SWQpe2ktLTticmVha31kZWxldGUgTC5saXN0VHlwZSxkZWxldGUgTC5saXN0U3R5bGUsby5wdXNoKEwpLGkrK31yLnZhbHVlTGlzdD1oKG8sYyksdD1yfX1lbHNlIGlmKHQudHlwZT09PW4uVEFCTEUpe2lmKHQucGFnaW5nSWQpe2xldCBsPWkrMSxmPTA7Zm9yKDtsPGEubGVuZ3RoOyl7Y29uc3Qgcz1hW2xdO2lmKHMucGFnaW5nSWQ9PT10LnBhZ2luZ0lkKXQuaGVpZ2h0Kz1zLmhlaWdodCx0LnRyTGlzdC5wdXNoKC4uLnMudHJMaXN0KSxsKyssZisrO2Vsc2UgYnJlYWt9aSs9Zn1pZih0LnRyTGlzdClmb3IobGV0IGw9MDtsPHQudHJMaXN0Lmxlbmd0aDtsKyspe2NvbnN0IGY9dC50ckxpc3RbbF07ZGVsZXRlIGYuaWQ7Zm9yKGxldCBzPTA7czxmLnRkTGlzdC5sZW5ndGg7cysrKXtjb25zdCByPWYudGRMaXN0W3NdLG89e2NvbHNwYW46ci5jb2xzcGFuLHJvd3NwYW46ci5yb3dzcGFuLHZhbHVlOmgoci52YWx1ZSxYKGcoe30sYykse2lzQ2xhc3NpZnlBcmVhOiExfSkpfTtzZS5mb3JFYWNoKEw9Pntjb25zdCBTPXJbTF07UyE9PXZvaWQgMCYmKG9bTF09Uyl9KSxmLnRkTGlzdFtzXT1vfX19ZWxzZSBpZih0LnR5cGU9PT1uLkhZUEVSTElOSyl7Y29uc3QgbD10Lmh5cGVybGlua0lkO2lmKGwpe2NvbnN0IGY9e3R5cGU6bi5IWVBFUkxJTkssdmFsdWU6IiIsdXJsOnQudXJsfSxzPVtdO2Zvcig7aTxhLmxlbmd0aDspe2NvbnN0IHI9YVtpXTtpZihsIT09ci5oeXBlcmxpbmtJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIudXJsLHMucHVzaChyKSxpKyt9Zi52YWx1ZUxpc3Q9aChzLGMpLHQ9Zn19ZWxzZSBpZih0LnR5cGU9PT1uLkRBVEUpe2NvbnN0IGw9dC5kYXRlSWQ7aWYobCl7Y29uc3QgZj17dHlwZTpuLkRBVEUsdmFsdWU6IiIsZGF0ZUZvcm1hdDp0LmRhdGVGb3JtYXR9LHM9W107Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgcj1hW2ldO2lmKGwhPT1yLmRhdGVJZCl7aS0tO2JyZWFrfWRlbGV0ZSByLnR5cGUsZGVsZXRlIHIuZGF0ZUZvcm1hdCxzLnB1c2gociksaSsrfWYudmFsdWVMaXN0PWgocyxjKSx0PWZ9fWVsc2UgaWYodC5jb250cm9sSWQpe2NvbnN0IGw9dC5jb250cm9sSWQ7aWYodC5jb250cm9sQ29tcG9uZW50PT09Qy5QUkVGSVgpe2NvbnN0IGY9W107bGV0IHM9ITEscj1pO2Zvcig7cjxhLmxlbmd0aDspe2NvbnN0IG89YVtyXTtpZihsIT09by5jb250cm9sSWQpYnJlYWs7by5jb250cm9sQ29tcG9uZW50PT09Qy5WQUxVRSYmKGRlbGV0ZSBvLmNvbnRyb2wsZGVsZXRlIG8uY29udHJvbElkLGYucHVzaChvKSksby5jb250cm9sQ29tcG9uZW50PT09Qy5QT1NURklYJiYocz0hMCkscisrfWlmKHMpe2NvbnN0IG89dyh0LGZlKSxMPWcoZyh7fSx0LmNvbnRyb2wpLG8pLFM9WChnKHt9LHcodCxvZSkpLHt0eXBlOm4uQ09OVFJPTCx2YWx1ZToiIixjb250cm9sOkwsY29udHJvbElkOmx9KTtTLmNvbnRyb2wudmFsdWU9aChmLGMpLHQ9QihTLHtleHRyYVBpY2tBdHRyczpFfSksaSs9ci1pLTF9fWlmKHQuY29udHJvbENvbXBvbmVudCYmKGRlbGV0ZSB0LmNvbnRyb2wsZGVsZXRlIHQuY29udHJvbElkLHQuY29udHJvbENvbXBvbmVudCE9PUMuVkFMVUUmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUFJFX1RFWFQmJnQuY29udHJvbENvbXBvbmVudCE9PUMuUE9TVF9URVhUKSl7aSsrO2NvbnRpbnVlfX1jb25zdCB4PUIodCx7ZXh0cmFQaWNrQXR0cnM6RX0pO2lmKCF0LnR5cGV8fHQudHlwZT09PW4uVEVYVHx8dC50eXBlPT09bi5TVUJTQ1JJUFR8fHQudHlwZT09PW4uU1VQRVJTQ1JJUFQpZm9yKDtpPGEubGVuZ3RoOyl7Y29uc3QgbD1hW2krMV07aWYoaSsrLGwmJnVlKHgsQihsLHtleHRyYVBpY2tBdHRyczpFfSkpKXtjb25zdCBmPWwudmFsdWU9PT1QP2AKYDpsLnZhbHVlO3gudmFsdWUrPWZ9ZWxzZSBicmVha31lbHNlIGkrKztwLnB1c2goeCl9cmV0dXJuIHB9b25tZXNzYWdlPWU9Pntjb25zdCBjPWUuZGF0YSx7b3B0aW9uczpFLGRhdGE6QX09Yyx7ZXh0cmFQaWNrQXR0cnM6Uj1bXX09RXx8e30sYT17aGVhZGVyOmgoQS5oZWFkZXIse2V4dHJhUGlja0F0dHJzOlIsaXNDbG9uZTohMX0pLG1haW46aChBLm1haW4se2V4dHJhUGlja0F0dHJzOlIsaXNDbGFzc2lmeUFyZWE6ITAsaXNDbG9uZTohMX0pLGZvb3RlcjpoKEEuZm9vdGVyLHtleHRyYVBpY2tBdHRyczpSLGlzQ2xvbmU6ITF9KX07cG9zdE1lc3NhZ2UoYSl9fSkoKTt9KSgpOwo=";
15669
15653
  const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" });
15670
15654
  function WorkerWrapper() {
15671
15655
  const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob);
@@ -21467,6 +21451,17 @@ class Command {
21467
21451
  this.executeJumpControl = adapt.jumpControl.bind(adapt);
21468
21452
  }
21469
21453
  }
21454
+ function getParagraphNo(elementList, index2) {
21455
+ let paragraphNo = 0;
21456
+ for (let i = 1; i < index2; i++) {
21457
+ const curElement = elementList[i];
21458
+ const preElement = elementList[i - 1];
21459
+ if (curElement.value === ZERO && !curElement.listWrap && !curElement.listId || curElement.listId !== (preElement == null ? void 0 : preElement.listId) && preElement.value !== ZERO || curElement.titleId !== (preElement == null ? void 0 : preElement.titleId) && preElement.value !== ZERO) {
21460
+ paragraphNo++;
21461
+ }
21462
+ }
21463
+ return paragraphNo;
21464
+ }
21470
21465
  function convertPxToPaperSize(width, height) {
21471
21466
  if (width === 1125 && height === 1593) {
21472
21467
  return {
@@ -22785,6 +22780,10 @@ class CommandAdapt {
22785
22780
  if (innerWidth <= 0)
22786
22781
  return 0;
22787
22782
  const targetElementList = deepClone(elementList);
22783
+ formatElementList(targetElementList, {
22784
+ isHandleFirstElement: false,
22785
+ editorOptions: this.options
22786
+ });
22788
22787
  const surroundElementList = pickSurroundElementList(targetElementList);
22789
22788
  const rowList = this.draw.computeRowList({
22790
22789
  innerWidth,
@@ -22898,6 +22897,8 @@ class CommandAdapt {
22898
22897
  }
22899
22898
  start--;
22900
22899
  }
22900
+ const startParagraphNo = getParagraphNo(elementList, startIndex);
22901
+ const endParagraphNo = startIndex === endIndex ? startParagraphNo : getParagraphNo(elementList, endIndex);
22901
22902
  return deepClone({
22902
22903
  isCollapsed,
22903
22904
  startElement,
@@ -22917,7 +22918,9 @@ class CommandAdapt {
22917
22918
  selectionText,
22918
22919
  selectionElementList,
22919
22920
  titleId,
22920
- titleStartPageNo
22921
+ titleStartPageNo,
22922
+ startParagraphNo,
22923
+ endParagraphNo
22921
22924
  });
22922
22925
  }
22923
22926
  getRangeRow() {
@@ -24862,6 +24865,7 @@ class EventBus {
24862
24865
  class Override {
24863
24866
  constructor() {
24864
24867
  __publicField(this, "paste");
24868
+ __publicField(this, "pasteImage");
24865
24869
  __publicField(this, "copy");
24866
24870
  __publicField(this, "drop");
24867
24871
  }