@plait/core 0.24.0-next.2 → 0.24.0-next.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 (107) hide show
  1. package/board/board.component.d.ts +1 -1
  2. package/core/children/children.component.d.ts +1 -1
  3. package/core/element/element.component.d.ts +1 -1
  4. package/core/element/plugin-element.d.ts +1 -1
  5. package/core/island/island-base.component.d.ts +1 -1
  6. package/{esm2020 → esm2022}/board/board.component.mjs +6 -6
  7. package/{esm2020 → esm2022}/core/children/children.component.mjs +6 -6
  8. package/{esm2020 → esm2022}/core/element/element.component.mjs +4 -4
  9. package/{esm2020 → esm2022}/core/element/plugin-element.mjs +4 -4
  10. package/{esm2020 → esm2022}/core/island/island-base.component.mjs +7 -7
  11. package/{esm2020 → esm2022}/interfaces/rectangle-client.mjs +11 -3
  12. package/{esm2020 → esm2022}/plait.module.mjs +5 -5
  13. package/esm2022/plugins/with-moving.mjs +98 -0
  14. package/esm2022/plugins/with-selection.mjs +181 -0
  15. package/{esm2020 → esm2022}/services/image-context.service.mjs +4 -4
  16. package/esm2022/utils/dom/common.mjs +68 -0
  17. package/esm2022/utils/dom/foreign.mjs +25 -0
  18. package/esm2022/utils/draw/rectangle.mjs +36 -0
  19. package/esm2022/utils/element.mjs +53 -0
  20. package/esm2022/utils/math.mjs +176 -0
  21. package/{fesm2020 → fesm2022}/plait-core.mjs +178 -42
  22. package/fesm2022/plait-core.mjs.map +1 -0
  23. package/interfaces/rectangle-client.d.ts +1 -0
  24. package/package.json +14 -14
  25. package/utils/dom/common.d.ts +4 -0
  26. package/utils/dom/foreign.d.ts +2 -1
  27. package/utils/draw/rectangle.d.ts +3 -0
  28. package/utils/element.d.ts +1 -0
  29. package/utils/math.d.ts +5 -0
  30. package/esm2020/plugins/with-moving.mjs +0 -97
  31. package/esm2020/plugins/with-selection.mjs +0 -183
  32. package/esm2020/utils/dom/common.mjs +0 -53
  33. package/esm2020/utils/dom/foreign.mjs +0 -19
  34. package/esm2020/utils/draw/rectangle.mjs +0 -26
  35. package/esm2020/utils/element.mjs +0 -44
  36. package/esm2020/utils/math.mjs +0 -85
  37. package/fesm2015/plait-core.mjs +0 -3498
  38. package/fesm2015/plait-core.mjs.map +0 -1
  39. package/fesm2020/plait-core.mjs.map +0 -1
  40. /package/{esm2020 → esm2022}/board/board.component.interface.mjs +0 -0
  41. /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
  42. /package/{esm2020 → esm2022}/constants/keycodes.mjs +0 -0
  43. /package/{esm2020 → esm2022}/constants/resize.mjs +0 -0
  44. /package/{esm2020 → esm2022}/constants/selection.mjs +0 -0
  45. /package/{esm2020 → esm2022}/core/children/effect.mjs +0 -0
  46. /package/{esm2020 → esm2022}/core/element/context-change.mjs +0 -0
  47. /package/{esm2020 → esm2022}/core/element/context.mjs +0 -0
  48. /package/{esm2020 → esm2022}/interfaces/board.mjs +0 -0
  49. /package/{esm2020 → esm2022}/interfaces/custom-types.mjs +0 -0
  50. /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
  51. /package/{esm2020 → esm2022}/interfaces/history.mjs +0 -0
  52. /package/{esm2020 → esm2022}/interfaces/index.mjs +0 -0
  53. /package/{esm2020 → esm2022}/interfaces/node.mjs +0 -0
  54. /package/{esm2020 → esm2022}/interfaces/operation.mjs +0 -0
  55. /package/{esm2020 → esm2022}/interfaces/path-ref.mjs +0 -0
  56. /package/{esm2020 → esm2022}/interfaces/path.mjs +0 -0
  57. /package/{esm2020 → esm2022}/interfaces/plugin-key.mjs +0 -0
  58. /package/{esm2020 → esm2022}/interfaces/plugin.mjs +0 -0
  59. /package/{esm2020 → esm2022}/interfaces/point.mjs +0 -0
  60. /package/{esm2020 → esm2022}/interfaces/pointer.mjs +0 -0
  61. /package/{esm2020 → esm2022}/interfaces/selection.mjs +0 -0
  62. /package/{esm2020 → esm2022}/interfaces/theme.mjs +0 -0
  63. /package/{esm2020 → esm2022}/interfaces/viewport.mjs +0 -0
  64. /package/{esm2020 → esm2022}/plait-core.mjs +0 -0
  65. /package/{esm2020 → esm2022}/plugins/create-board.mjs +0 -0
  66. /package/{esm2020 → esm2022}/plugins/with-board.mjs +0 -0
  67. /package/{esm2020 → esm2022}/plugins/with-hand.mjs +0 -0
  68. /package/{esm2020 → esm2022}/plugins/with-history.mjs +0 -0
  69. /package/{esm2020 → esm2022}/plugins/with-hotkey.mjs +0 -0
  70. /package/{esm2020 → esm2022}/plugins/with-options.mjs +0 -0
  71. /package/{esm2020 → esm2022}/plugins/with-viewport.mjs +0 -0
  72. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  73. /package/{esm2020 → esm2022}/testing/core/create-board.mjs +0 -0
  74. /package/{esm2020 → esm2022}/testing/core/fake-weak-map.mjs +0 -0
  75. /package/{esm2020 → esm2022}/testing/core/index.mjs +0 -0
  76. /package/{esm2020 → esm2022}/testing/fake-events/event-objects.mjs +0 -0
  77. /package/{esm2020 → esm2022}/testing/fake-events/index.mjs +0 -0
  78. /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
  79. /package/{esm2020 → esm2022}/testing/test-element.mjs +0 -0
  80. /package/{esm2020 → esm2022}/transforms/board.mjs +0 -0
  81. /package/{esm2020 → esm2022}/transforms/general.mjs +0 -0
  82. /package/{esm2020 → esm2022}/transforms/index.mjs +0 -0
  83. /package/{esm2020 → esm2022}/transforms/node.mjs +0 -0
  84. /package/{esm2020 → esm2022}/transforms/selection.mjs +0 -0
  85. /package/{esm2020 → esm2022}/transforms/theme.mjs +0 -0
  86. /package/{esm2020 → esm2022}/transforms/viewport.mjs +0 -0
  87. /package/{esm2020 → esm2022}/utils/board.mjs +0 -0
  88. /package/{esm2020 → esm2022}/utils/clipboard.mjs +0 -0
  89. /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
  90. /package/{esm2020 → esm2022}/utils/dom/environment.mjs +0 -0
  91. /package/{esm2020 → esm2022}/utils/dom/index.mjs +0 -0
  92. /package/{esm2020 → esm2022}/utils/draw/arrow.mjs +0 -0
  93. /package/{esm2020 → esm2022}/utils/draw/circle.mjs +0 -0
  94. /package/{esm2020 → esm2022}/utils/draw/line.mjs +0 -0
  95. /package/{esm2020 → esm2022}/utils/environment.mjs +0 -0
  96. /package/{esm2020 → esm2022}/utils/helper.mjs +0 -0
  97. /package/{esm2020 → esm2022}/utils/history.mjs +0 -0
  98. /package/{esm2020 → esm2022}/utils/hotkeys.mjs +0 -0
  99. /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
  100. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
  101. /package/{esm2020 → esm2022}/utils/moving-element.mjs +0 -0
  102. /package/{esm2020 → esm2022}/utils/selected-element.mjs +0 -0
  103. /package/{esm2020 → esm2022}/utils/to-image.mjs +0 -0
  104. /package/{esm2020 → esm2022}/utils/touch.mjs +0 -0
  105. /package/{esm2020 → esm2022}/utils/tree.mjs +0 -0
  106. /package/{esm2020 → esm2022}/utils/viewport.mjs +0 -0
  107. /package/{esm2020 → esm2022}/utils/weak-maps.mjs +0 -0
@@ -1,85 +0,0 @@
1
- import { RectangleClient } from '../interfaces/rectangle-client';
2
- // https://stackoverflow.com/a/6853926/232122
3
- export function distanceBetweenPointAndSegment(x, y, x1, y1, x2, y2) {
4
- const A = x - x1;
5
- const B = y - y1;
6
- const C = x2 - x1;
7
- const D = y2 - y1;
8
- const dot = A * C + B * D;
9
- const lenSquare = C * C + D * D;
10
- let param = -1;
11
- if (lenSquare !== 0) {
12
- // in case of 0 length line
13
- param = dot / lenSquare;
14
- }
15
- let xx, yy;
16
- if (param < 0) {
17
- xx = x1;
18
- yy = y1;
19
- }
20
- else if (param > 1) {
21
- xx = x2;
22
- yy = y2;
23
- }
24
- else {
25
- xx = x1 + param * C;
26
- yy = y1 + param * D;
27
- }
28
- const dx = x - xx;
29
- const dy = y - yy;
30
- return Math.hypot(dx, dy);
31
- }
32
- export function distanceBetweenPointAndSegments(points, point) {
33
- const len = points.length;
34
- let distance = Infinity;
35
- for (let i = 0; i < len - 1; i++) {
36
- const p = points[i];
37
- const p2 = points[i + 1];
38
- const currentDistance = distanceBetweenPointAndSegment(point[0], point[1], p[0], p[1], p2[0], p2[1]);
39
- if (currentDistance < distance) {
40
- distance = currentDistance;
41
- }
42
- }
43
- return distance;
44
- }
45
- export function rotate(x1, y1, x2, y2, angle) {
46
- // 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥
47
- // 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.
48
- // https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line
49
- return [(x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2, (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2];
50
- }
51
- export function distanceBetweenPointAndPoint(x1, y1, x2, y2) {
52
- const dx = x1 - x2;
53
- const dy = y1 - y2;
54
- return Math.hypot(dx, dy);
55
- }
56
- // https://stackoverflow.com/questions/5254838/calculating-distance-between-a-point-and-a-rectangular-box-nearest-point
57
- export function distanceBetweenPointAndRectangle(x, y, rect) {
58
- var dx = Math.max(rect.x - x, 0, x - (rect.x + rect.width));
59
- var dy = Math.max(rect.y - y, 0, y - (rect.y + rect.height));
60
- return Math.sqrt(dx * dx + dy * dy);
61
- }
62
- export const isLineHitLine = (a, b, c, d) => {
63
- const crossProduct = (v1, v2) => v1[0] * v2[1] - v1[1] * v2[0];
64
- const ab = [b[0] - a[0], b[1] - a[1]];
65
- const ac = [c[0] - a[0], c[1] - a[1]];
66
- const ad = [d[0] - a[0], d[1] - a[1]];
67
- const ca = [a[0] - c[0], a[1] - c[1]];
68
- const cb = [b[0] - c[0], b[1] - c[1]];
69
- const cd = [d[0] - c[0], d[1] - c[1]];
70
- return crossProduct(ab, ac) * crossProduct(ab, ad) <= 0 && crossProduct(cd, ca) * crossProduct(cd, cb) <= 0;
71
- };
72
- export const isPolylineHitRectangle = (points, rectangle) => {
73
- const rectanglePoints = RectangleClient.getCornerPoints(rectangle);
74
- for (let i = 1; i < points.length; i++) {
75
- const isIntersect = isLineHitLine(points[i], points[i - 1], rectanglePoints[0], rectanglePoints[1]) ||
76
- isLineHitLine(points[i], points[i - 1], rectanglePoints[1], rectanglePoints[2]) ||
77
- isLineHitLine(points[i], points[i - 1], rectanglePoints[2], rectanglePoints[3]) ||
78
- isLineHitLine(points[i], points[i - 1], rectanglePoints[3], rectanglePoints[0]);
79
- if (isIntersect) {
80
- return true;
81
- }
82
- }
83
- return false;
84
- };
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL21hdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsOEJBQThCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVO0lBQy9HLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNqQixNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFbEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtRQUNqQiwyQkFBMkI7UUFDM0IsS0FBSyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7S0FDM0I7SUFFRCxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDWCxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUNYO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDUixFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQ1g7U0FBTTtRQUNILEVBQUUsR0FBRyxFQUFFLEdB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N0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFRLEVBQUUsQ0FBUSxFQUFFLENBQVEsRUFBRSxDQUFRLEVBQVcsRUFBRTtJQUM3RSxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQVMsRUFBRSxFQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3RSxNQUFNLEVBQUUsR0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sRUFBRSxHQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3QyxNQUFNLEVBQUUsR0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sRUFBRSxHQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3QyxPQUFPLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLE1BQWUsRUFBRSxTQUEwQixFQUFFLEVBQUU7SUFDbEYsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVuRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxNQUFNLFdBQVcsR0FDYixhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLElBQUksV0FBVyxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUM7U0FDZjtLQUNKO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVjdGFuZ2xlLWNsaWVudCc7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82ODUzOTI2LzIzMjEyMlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgIGNvbnN0IEEgPSB4IC0geDE7XG4gICAgY29uc3QgQiA9IHkgLSB5MTtcbiAgICBjb25zdCBDID0geDIgLSB4MTtcbiAgICBjb25zdCBEID0geTIgLSB5MTtcblxuICAgIGNvbnN0IGRvdCA9IEEgKiBDICsgQiAqIEQ7XG4gICAgY29uc3QgbGVuU3F1YXJlID0gQyAqIEMgKyBEICogRDtcbiAgICBsZXQgcGFyYW0gPSAtMTtcbiAgICBpZiAobGVuU3F1YXJlICE9PSAwKSB7XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgMCBsZW5ndGggbGluZVxuICAgICAgICBwYXJhbSA9IGRvdCAvIGxlblNxdWFyZTtcbiAgICB9XG5cbiAgICBsZXQgeHgsIHl5O1xuICAgIGlmIChwYXJhbSA8IDApIHtcbiAgICAgICAgeHggPSB4MTtcbiAgICAgICAgeXkgPSB5MTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtID4gMSkge1xuICAgICAgICB4eCA9IHgyO1xuICAgICAgICB5eSA9IHkyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHh4ID0geDEgKyBwYXJhbSAqIEM7XG4gICAgICAgIHl5ID0geTEgKyBwYXJhbSAqIEQ7XG4gICAgfVxuXG4gICAgY29uc3QgZHggPSB4IC0geHg7XG4gICAgY29uc3QgZHkgPSB5IC0geXk7XG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZHgsIGR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudHMocG9pbnRzOiBQb2ludFtdLCBwb2ludDogUG9pbnQpIHtcbiAgICBjb25zdCBsZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCBkaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHAgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IHAyID0gcG9pbnRzW2kgKyAxXTtcbiAgICAgICAgY29uc3QgY3VycmVudERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRTZWdtZW50KHBvaW50WzBdLCBwb2ludFsxXSwgcFswXSwgcFsxXSwgcDJbMF0sIHAyWzFdKTtcbiAgICAgICAgaWYgKGN1cnJlbnREaXN0YW5jZSA8IGRpc3RhbmNlKSB7XG4gICAgICAgICAgICBkaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGUoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlciwgYW5nbGU6IG51bWJlcikge1xuICAgIC8vIPCdkY7igLLwnZGlPSjwnZGO8J2RpeKIkvCdkZDwnZGlKWNvc/CdnIPiiJIo8J2RjvCdkabiiJLwnZGQ8J2RpilzaW7wnZyDK/CdkZDwnZGlXG4gICAgLy8g8J2RjuKAsvCdkaY9KPCdkY7wnZGl4oiS8J2RkPCdkaUpc2lu8J2cgyso8J2RjvCdkabiiJLwnZGQ8J2Rpiljb3PwnZyDK/CdkZDwnZGmLlxuICAgIC8vIGh0dHBzOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMjIwNDUyMC9ob3ctZG8taS1yb3RhdGUtYS1saW5lLXNlZ21lbnQtaW4tYS1zcGVjaWZpYy1wb2ludC1vbi10aGUtbGluZVxuICAgIHJldHVybiBbKHgxIC0geDIpICogTWF0aC5jb3MoYW5nbGUpIC0gKHkxIC0geTIpICogTWF0aC5zaW4oYW5nbGUpICsgeDIsICh4MSAtIHgyKSAqIE1hdGguc2luKGFuZ2xlKSArICh5MSAtIHkyKSAqIE1hdGguY29zKGFuZ2xlKSArIHkyXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kUG9pbnQoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgIGNvbnN0IGR4ID0geDEgLSB4MjtcbiAgICBjb25zdCBkeSA9IHkxIC0geTI7XG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZHgsIGR5KTtcbn1cblxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTI1NDgzOC9jYWxjdWxhdGluZy1kaXN0YW5jZS1iZXR3ZWVuLWEtcG9pbnQtYW5kLWEtcmVjdGFuZ3VsYXItYm94LW5lYXJlc3QtcG9pbnRcbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFJlY3RhbmdsZSh4OiBudW1iZXIsIHk6IG51bWJlciwgcmVjdDogUmVjdGFuZ2xlQ2xpZW50KSB7XG4gICAgdmFyIGR4ID0gTWF0aC5tYXgocmVjdC54IC0geCwgMCwgeCAtIChyZWN0LnggKyByZWN0LndpZHRoKSk7XG4gICAgdmFyIGR5ID0gTWF0aC5tYXgocmVjdC55IC0geSwgMCwgeSAtIChyZWN0LnkgKyByZWN0LmhlaWdodCkpO1xuICAgIHJldHVybiBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xufVxuXG5leHBvcnQgY29uc3QgaXNMaW5lSGl0TGluZSA9IChhOiBQb2ludCwgYjogUG9pbnQsIGM6IFBvaW50LCBkOiBQb2ludCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGNyb3NzUHJvZHVjdCA9ICh2MTogUG9pbnQsIHYyOiBQb2ludCkgPT4gdjFbMF0gKiB2MlsxXSAtIHYxWzFdICogdjJbMF07XG5cbiAgICBjb25zdCBhYjogUG9pbnQgPSBbYlswXSAtIGFbMF0sIGJbMV0gLSBhWzFdXTtcbiAgICBjb25zdCBhYzogUG9pbnQgPSBbY1swXSAtIGFbMF0sIGNbMV0gLSBhWzFdXTtcbiAgICBjb25zdCBhZDogUG9pbnQgPSBbZFswXSAtIGFbMF0sIGRbMV0gLSBhWzFdXTtcblxuICAgIGNvbnN0IGNhOiBQb2ludCA9IFthWzBdIC0gY1swXSwgYVsxXSAtIGNbMV1dO1xuICAgIGNvbnN0IGNiOiBQb2ludCA9IFtiWzBdIC0gY1swXSwgYlsxXSAtIGNbMV1dO1xuICAgIGNvbnN0IGNkOiBQb2ludCA9IFtkWzBdIC0gY1swXSwgZFsxXSAtIGNbMV1dO1xuXG4gICAgcmV0dXJuIGNyb3NzUHJvZHVjdChhYiwgYWMpICogY3Jvc3NQcm9kdWN0KGFiLCBhZCkgPD0gMCAmJiBjcm9zc1Byb2R1Y3QoY2QsIGNhKSAqIGNyb3NzUHJvZHVjdChjZCwgY2IpIDw9IDA7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQb2x5bGluZUhpdFJlY3RhbmdsZSA9IChwb2ludHM6IFBvaW50W10sIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgY29uc3QgcmVjdGFuZ2xlUG9pbnRzID0gUmVjdGFuZ2xlQ2xpZW50LmdldENvcm5lclBvaW50cyhyZWN0YW5nbGUpO1xuXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXNJbnRlcnNlY3QgPVxuICAgICAgICAgICAgaXNMaW5lSGl0TGluZShwb2ludHNbaV0sIHBvaW50c1tpIC0gMV0sIHJlY3RhbmdsZVBvaW50c1swXSwgcmVjdGFuZ2xlUG9pbnRzWzFdKSB8fFxuICAgICAgICAgICAgaXNMaW5lSGl0TGluZShwb2ludHNbaV0sIHBvaW50c1tpIC0gMV0sIHJlY3RhbmdsZVBvaW50c1sxXSwgcmVjdGFuZ2xlUG9pbnRzWzJdKSB8fFxuICAgICAgICAgICAgaXNMaW5lSGl0TGluZShwb2ludHNbaV0sIHBvaW50c1tpIC0gMV0sIHJlY3RhbmdsZVBvaW50c1syXSwgcmVjdGFuZ2xlUG9pbnRzWzNdKSB8fFxuICAgICAgICAgICAgaXNMaW5lSGl0TGluZShwb2ludHNbaV0sIHBvaW50c1tpIC0gMV0sIHJlY3RhbmdsZVBvaW50c1szXSwgcmVjdGFuZ2xlUG9pbnRzWzBdKTtcbiAgICAgICAgaWYgKGlzSW50ZXJzZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG4iXX0=