@plait/draw 0.56.2 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/constants/draw.d.ts +1 -0
  2. package/constants/geometry.d.ts +82 -2
  3. package/constants/index.d.ts +1 -0
  4. package/constants/pointer.d.ts +4 -2
  5. package/engines/flowchart/display.d.ts +4 -0
  6. package/engines/index.d.ts +3 -3
  7. package/engines/table/table.d.ts +16 -0
  8. package/engines/uml/actor.d.ts +2 -0
  9. package/engines/uml/combined-fragment.d.ts +3 -0
  10. package/engines/uml/container.d.ts +2 -0
  11. package/engines/uml/package.d.ts +3 -0
  12. package/esm2022/constants/draw.mjs +2 -0
  13. package/esm2022/constants/geometry.mjs +71 -5
  14. package/esm2022/constants/index.mjs +2 -1
  15. package/esm2022/constants/pointer.mjs +9 -3
  16. package/esm2022/engines/basic-shapes/cloud.mjs +1 -1
  17. package/esm2022/engines/basic-shapes/comment.mjs +1 -1
  18. package/esm2022/engines/basic-shapes/diamond.mjs +2 -2
  19. package/esm2022/engines/basic-shapes/parallelogram.mjs +2 -2
  20. package/esm2022/engines/basic-shapes/pentagon.mjs +1 -1
  21. package/esm2022/engines/basic-shapes/round-comment.mjs +2 -2
  22. package/esm2022/engines/basic-shapes/star.mjs +1 -1
  23. package/esm2022/engines/basic-shapes/trapezoid.mjs +2 -2
  24. package/esm2022/engines/basic-shapes/triangle.mjs +2 -2
  25. package/esm2022/engines/flowchart/database.mjs +2 -2
  26. package/esm2022/engines/flowchart/display.mjs +74 -0
  27. package/esm2022/engines/flowchart/document.mjs +1 -1
  28. package/esm2022/engines/flowchart/hard-disk.mjs +2 -2
  29. package/esm2022/engines/flowchart/internal-storage.mjs +2 -2
  30. package/esm2022/engines/flowchart/manual-input.mjs +2 -2
  31. package/esm2022/engines/flowchart/manual-loop.mjs +2 -2
  32. package/esm2022/engines/flowchart/merge.mjs +1 -1
  33. package/esm2022/engines/flowchart/multi-document.mjs +1 -1
  34. package/esm2022/engines/flowchart/note-curly-left.mjs +2 -2
  35. package/esm2022/engines/flowchart/note-curly-right.mjs +2 -2
  36. package/esm2022/engines/flowchart/note-square.mjs +1 -1
  37. package/esm2022/engines/flowchart/off-page.mjs +2 -2
  38. package/esm2022/engines/flowchart/or.mjs +1 -8
  39. package/esm2022/engines/flowchart/predefined-process.mjs +1 -1
  40. package/esm2022/engines/flowchart/summing-junction.mjs +1 -8
  41. package/esm2022/engines/index.mjs +20 -5
  42. package/esm2022/engines/table/table.mjs +72 -0
  43. package/esm2022/engines/uml/actor.mjs +102 -0
  44. package/esm2022/engines/uml/combined-fragment.mjs +66 -0
  45. package/esm2022/engines/uml/container.mjs +44 -0
  46. package/esm2022/engines/uml/package.mjs +75 -0
  47. package/esm2022/generators/geometry-shape.generator.mjs +3 -3
  48. package/esm2022/generators/index.mjs +7 -0
  49. package/esm2022/generators/line-active.generator.mjs +3 -3
  50. package/esm2022/generators/line-auto-complete.generator.mjs +1 -1
  51. package/esm2022/generators/single-text.generator.mjs +16 -0
  52. package/esm2022/generators/table.generator.mjs +20 -0
  53. package/esm2022/generators/text.generator.mjs +134 -0
  54. package/esm2022/geometry.component.mjs +64 -77
  55. package/esm2022/image.component.mjs +11 -28
  56. package/esm2022/interfaces/element.mjs +2 -1
  57. package/esm2022/interfaces/engine.mjs +2 -0
  58. package/esm2022/interfaces/geometry.mjs +24 -1
  59. package/esm2022/interfaces/image.mjs +1 -1
  60. package/esm2022/interfaces/index.mjs +27 -4
  61. package/esm2022/interfaces/line.mjs +1 -1
  62. package/esm2022/interfaces/table.mjs +9 -0
  63. package/esm2022/line.component.mjs +9 -26
  64. package/esm2022/plugins/with-draw-fragment.mjs +3 -1
  65. package/esm2022/plugins/with-draw-hotkey.mjs +12 -3
  66. package/esm2022/plugins/with-draw-resize.mjs +1 -1
  67. package/esm2022/plugins/with-draw.mjs +7 -2
  68. package/esm2022/plugins/with-geometry-create.mjs +2 -1
  69. package/esm2022/plugins/with-geometry-resize.mjs +1 -1
  70. package/esm2022/plugins/with-line-auto-complete-reaction.mjs +2 -2
  71. package/esm2022/plugins/with-line-bound-reaction.mjs +3 -4
  72. package/esm2022/plugins/with-line-create.mjs +3 -3
  73. package/esm2022/plugins/with-line-resize.mjs +3 -3
  74. package/esm2022/plugins/with-swimlane-create.mjs +132 -0
  75. package/esm2022/plugins/with-swimlane.mjs +21 -0
  76. package/esm2022/plugins/with-table-resize.mjs +130 -0
  77. package/esm2022/plugins/with-table.mjs +60 -0
  78. package/esm2022/public-api.mjs +2 -1
  79. package/esm2022/table.component.mjs +136 -0
  80. package/esm2022/transforms/geometry-text.mjs +6 -3
  81. package/esm2022/transforms/geometry.mjs +3 -2
  82. package/esm2022/transforms/index.mjs +11 -2
  83. package/esm2022/transforms/multi-text-geometry-text.mjs +15 -0
  84. package/esm2022/transforms/swimlane.mjs +97 -0
  85. package/esm2022/transforms/table-text.mjs +44 -0
  86. package/esm2022/utils/clipboard.mjs +15 -2
  87. package/esm2022/utils/common.mjs +130 -0
  88. package/esm2022/utils/geometry.mjs +49 -63
  89. package/esm2022/utils/hit.mjs +47 -18
  90. package/esm2022/utils/index.mjs +4 -1
  91. package/esm2022/utils/line/elbow.mjs +2 -2
  92. package/esm2022/utils/line/line-arrow.mjs +2 -2
  93. package/esm2022/utils/line/line-basic.mjs +4 -4
  94. package/esm2022/utils/line/line-common.mjs +2 -2
  95. package/esm2022/utils/memorize.mjs +7 -1
  96. package/esm2022/utils/multi-text-geometry.mjs +61 -0
  97. package/esm2022/utils/position/geometry.mjs +2 -40
  98. package/esm2022/utils/selected.mjs +14 -1
  99. package/esm2022/utils/shape.mjs +5 -2
  100. package/esm2022/utils/snap-resizing.mjs +7 -7
  101. package/esm2022/utils/style/stroke.mjs +4 -10
  102. package/esm2022/utils/swimlane.mjs +120 -0
  103. package/esm2022/utils/table.mjs +124 -0
  104. package/fesm2022/plait-draw.mjs +4556 -2877
  105. package/fesm2022/plait-draw.mjs.map +1 -1
  106. package/generators/index.d.ts +6 -0
  107. package/generators/line-auto-complete.generator.d.ts +2 -2
  108. package/generators/single-text.generator.d.ts +11 -0
  109. package/generators/table.generator.d.ts +9 -0
  110. package/generators/text.generator.d.ts +43 -0
  111. package/geometry.component.d.ts +12 -17
  112. package/image.component.d.ts +6 -11
  113. package/interfaces/element.d.ts +2 -1
  114. package/interfaces/engine.d.ts +16 -0
  115. package/interfaces/geometry.d.ts +42 -18
  116. package/interfaces/image.d.ts +4 -2
  117. package/interfaces/index.d.ts +12 -3
  118. package/interfaces/line.d.ts +4 -5
  119. package/interfaces/table.d.ts +40 -0
  120. package/line.component.d.ts +5 -10
  121. package/package.json +1 -1
  122. package/plugins/with-swimlane-create.d.ts +8 -0
  123. package/plugins/with-swimlane.d.ts +2 -0
  124. package/plugins/with-table-resize.d.ts +2 -0
  125. package/plugins/with-table.d.ts +6 -0
  126. package/public-api.d.ts +1 -0
  127. package/table.component.d.ts +21 -0
  128. package/transforms/geometry.d.ts +2 -2
  129. package/transforms/index.d.ts +8 -2
  130. package/transforms/multi-text-geometry-text.d.ts +4 -0
  131. package/transforms/swimlane.d.ts +6 -0
  132. package/transforms/table-text.d.ts +4 -0
  133. package/utils/clipboard.d.ts +2 -0
  134. package/utils/common.d.ts +27 -0
  135. package/utils/geometry.d.ts +34 -15
  136. package/utils/hit.d.ts +4 -2
  137. package/utils/index.d.ts +3 -0
  138. package/utils/line/line-common.d.ts +3 -3
  139. package/utils/memorize.d.ts +3 -1
  140. package/utils/multi-text-geometry.d.ts +14 -0
  141. package/utils/position/geometry.d.ts +8 -21
  142. package/utils/selected.d.ts +4 -0
  143. package/utils/shape.d.ts +2 -2
  144. package/utils/style/stroke.d.ts +4 -5
  145. package/utils/swimlane.d.ts +52 -0
  146. package/utils/table.d.ts +26 -0
@@ -0,0 +1,120 @@
1
+ import { idCreator, RectangleClient } from '@plait/core';
2
+ import { DEFAULT_TEXT_HEIGHT, DefaultSwimlanePropertyMap } from '../constants';
3
+ import { PlaitDrawElement, SwimlaneSymbols } from '../interfaces';
4
+ export function buildSwimlaneTable(element) {
5
+ const swimlaneElement = { ...element };
6
+ if (PlaitDrawElement.isHorizontalSwimlane(element)) {
7
+ swimlaneElement.cells = element.cells.map((item, index) => {
8
+ if (index === 0) {
9
+ item = {
10
+ ...element.cells[0],
11
+ rowspan: element.rows.length
12
+ };
13
+ }
14
+ if (item.text && item.textHeight && !item.text.direction) {
15
+ item.text.direction = 'vertical';
16
+ }
17
+ return item;
18
+ });
19
+ return swimlaneElement;
20
+ }
21
+ swimlaneElement.cells = [
22
+ {
23
+ ...element.cells[0],
24
+ colspan: element.columns.length
25
+ },
26
+ ...element.cells.slice(1, element.cells.length)
27
+ ];
28
+ return swimlaneElement;
29
+ }
30
+ export const getDefaultSWimlanePoints = (pointer, centerPoint) => {
31
+ const property = DefaultSwimlanePropertyMap[pointer];
32
+ return RectangleClient.getPoints(RectangleClient.getRectangleByCenterPoint(centerPoint, property.width, property.height));
33
+ };
34
+ export const createDefaultSwimlane = (shape, points) => {
35
+ const rows = createDefaultRowsOrColumns(shape, 'row');
36
+ const columns = createDefaultRowsOrColumns(shape, 'column');
37
+ const swimlane = {
38
+ id: idCreator(),
39
+ type: 'table',
40
+ shape,
41
+ points,
42
+ rows,
43
+ columns,
44
+ cells: createDefaultCells(shape, rows, columns)
45
+ };
46
+ return buildSwimlaneTable(swimlane);
47
+ };
48
+ export const createDefaultRowsOrColumns = (shape, type) => {
49
+ let data = new Array(3).fill('').map(item => {
50
+ return { id: idCreator() };
51
+ });
52
+ if (type === 'row' && shape === SwimlaneSymbols.swimlaneVertical) {
53
+ data = data.map((item, index) => {
54
+ if (index === 0 || index === 1) {
55
+ return {
56
+ ...item,
57
+ height: 30
58
+ };
59
+ }
60
+ return item;
61
+ });
62
+ }
63
+ if (type === 'column' && shape === SwimlaneSymbols.swimlaneHorizontal) {
64
+ data = data.map((item, index) => {
65
+ if (index === 0 || index === 1) {
66
+ return {
67
+ ...item,
68
+ width: 30
69
+ };
70
+ }
71
+ return item;
72
+ });
73
+ }
74
+ return data;
75
+ };
76
+ export const createDefaultCells = (shape, rows, columns) => {
77
+ return new Array(7).fill('').map((item, index) => {
78
+ if (index === 0) {
79
+ item = {
80
+ id: idCreator(),
81
+ rowId: rows[0].id,
82
+ columnId: columns[0].id,
83
+ textHeight: DEFAULT_TEXT_HEIGHT,
84
+ text: {
85
+ children: [
86
+ {
87
+ text: 'New Swimlane'
88
+ }
89
+ ],
90
+ align: 'center'
91
+ }
92
+ };
93
+ }
94
+ if ([1, 2, 3].includes(index)) {
95
+ item = {
96
+ id: idCreator(),
97
+ rowId: shape === SwimlaneSymbols.swimlaneVertical ? rows[1].id : rows[index - 1].id,
98
+ columnId: shape === SwimlaneSymbols.swimlaneVertical ? columns[index - 1].id : columns[1].id,
99
+ textHeight: DEFAULT_TEXT_HEIGHT,
100
+ text: {
101
+ children: [
102
+ {
103
+ text: 'Lane'
104
+ }
105
+ ],
106
+ align: 'center'
107
+ }
108
+ };
109
+ }
110
+ if ([4, 5, 6].includes(index)) {
111
+ item = {
112
+ id: idCreator(),
113
+ rowId: shape === SwimlaneSymbols.swimlaneVertical ? rows[2].id : rows[index - 4].id,
114
+ columnId: shape === SwimlaneSymbols.swimlaneVertical ? columns[index - 4].id : columns[2].id
115
+ };
116
+ }
117
+ return item;
118
+ });
119
+ };
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dpbWxhbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy9zd2ltbGFuZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQW1CLDBCQUEwQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUIsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWpGLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUFzQjtJQUNyRCxNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdkMsSUFBSSxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2pELGVBQWUsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsSUFBSSxHQUFHO29CQUNILEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU07aUJBQy9CLENBQUM7WUFDTixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUNELGVB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QjtnQkFDL0IsSUFBSSxFQUFFO29CQUNGLFFBQVEsRUFBRTt3QkFDTjs0QkFDSSxJQUFJLEVBQUUsTUFBTTt5QkFDZjtxQkFDSjtvQkFDRCxLQUFLLEVBQUUsUUFBUTtpQkFDbEI7YUFDSixDQUFDO1FBQ04sQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksR0FBRztnQkFDSCxFQUFFLEVBQUUsU0FBUyxFQUFFO2dCQUNmLEtBQUssRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ25GLFFBQVEsRUFBRSxLQUFLLEtBQUssZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDL0YsQ0FBQztRQUNOLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlkQ3JlYXRvciwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfVEVYVF9IRUlHSFQsIERyYXdQb2ludGVyVHlwZSwgRGVmYXVsdFN3aW1sYW5lUHJvcGVydHlNYXAgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgUGxhaXREcmF3RWxlbWVudCwgUGxhaXRTd2ltbGFuZSwgU3dpbWxhbmVTeW1ib2xzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN3aW1sYW5lVGFibGUoZWxlbWVudDogUGxhaXRTd2ltbGFuZSkge1xuICAgIGNvbnN0IHN3aW1sYW5lRWxlbWVudCA9IHsgLi4uZWxlbWVudCB9O1xuICAgIGlmIChQbGFpdERyYXdFbGVtZW50LmlzSG9yaXpvbnRhbFN3aW1sYW5lKGVsZW1lbnQpKSB7XG4gICAgICAgIHN3aW1sYW5lRWxlbWVudC5jZWxscyA9IGVsZW1lbnQuY2VsbHMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudC5jZWxsc1swXSxcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogZWxlbWVudC5yb3dzLmxlbmd0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXRlbS50ZXh0ICYmIGl0ZW0udGV4dEhlaWdodCAmJiAhaXRlbS50ZXh0LmRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIGl0ZW0udGV4dC5kaXJlY3Rpb24gPSAndmVydGljYWwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc3dpbWxhbmVFbGVtZW50O1xuICAgIH1cbiAgICBzd2ltbGFuZUVsZW1lbnQuY2VsbHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLmVsZW1lbnQuY2VsbHNbMF0sXG4gICAgICAgICAgICBjb2xzcGFuOiBlbGVtZW50LmNvbHVtbnMubGVuZ3RoXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmVsZW1lbnQuY2VsbHMuc2xpY2UoMSwgZWxlbWVudC5jZWxscy5sZW5ndGgpXG4gICAgXTtcbiAgICByZXR1cm4gc3dpbWxhbmVFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFNXaW1sYW5lUG9pbnRzID0gKHBvaW50ZXI6IERyYXdQb2ludGVyVHlwZSwgY2VudGVyUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHkgPSBEZWZhdWx0U3dpbWxhbmVQcm9wZXJ0eU1hcFtwb2ludGVyXTtcbiAgICByZXR1cm4gUmVjdGFuZ2xlQ2xpZW50LmdldFBvaW50cyhSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlDZW50ZXJQb2ludChjZW50ZXJQb2ludCwgcHJvcGVydHkud2lkdGgsIHByb3BlcnR5LmhlaWdodCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlZmF1bHRTd2ltbGFuZSA9IChzaGFwZTogU3dpbWxhbmVTeW1ib2xzLCBwb2ludHM6IFtQb2ludCwgUG9pbnRdKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IGNyZWF0ZURlZmF1bHRSb3dzT3JDb2x1bW5zKHNoYXBlLCAncm93Jyk7XG4gICAgY29uc3QgY29sdW1ucyA9IGNyZWF0ZURlZmF1bHRSb3dzT3JDb2x1bW5zKHNoYXBlLCAnY29sdW1uJyk7XG4gICAgY29uc3Qgc3dpbWxhbmUgPSB7XG4gICAgICAgIGlkOiBpZENyZWF0b3IoKSxcbiAgICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHBvaW50cyxcbiAgICAgICAgcm93cyxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgY2VsbHM6IGNyZWF0ZURlZmF1bHRDZWxscyhzaGFwZSwgcm93cywgY29sdW1ucylcbiAgICB9IGFzIFBsYWl0U3dpbWxhbmU7XG4gICAgcmV0dXJuIGJ1aWxkU3dpbWxhbmVUYWJsZShzd2ltbGFuZSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRGVmYXVsdFJvd3NPckNvbHVtbnMgPSAoc2hhcGU6IFN3aW1sYW5lU3ltYm9scywgdHlwZTogJ3JvdycgfCAnY29sdW1uJykgPT4ge1xuICAgIGxldCBkYXRhID0gbmV3IEFycmF5KDMpLmZpbGwoJycpLm1hcChpdGVtID0+IHtcbiAgICAgICAgcmV0dXJuIHsgaWQ6IGlkQ3JlYXRvcigpIH07XG4gICAgfSk7XG4gICAgaWYgKHR5cGUgPT09ICdyb3cnICYmIHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCkge1xuICAgICAgICBkYXRhID0gZGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDAgfHwgaW5kZXggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDMwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdjb2x1bW4nICYmIHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVIb3Jpem9udGFsKSB7XG4gICAgICAgIGRhdGEgPSBkYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCB8fCBpbmRleCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZURlZmF1bHRDZWxscyA9IChcbiAgICBzaGFwZTogU3dpbWxhbmVTeW1ib2xzLFxuICAgIHJvd3M6IHsgaWQ6IHN0cmluZzsgaGVpZ2h0PzogbnVtYmVyIH1bXSxcbiAgICBjb2x1bW5zOiB7IGlkOiBzdHJpbmc7IHdpZHRoPzogbnVtYmVyIH1bXVxuKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBBcnJheSg3KS5maWxsKCcnKS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgICAgICAgICAgcm93SWQ6IHJvd3NbMF0uaWQsXG4gICAgICAgICAgICAgICAgY29sdW1uSWQ6IGNvbHVtbnNbMF0uaWQsXG4gICAgICAgICAgICAgICAgdGV4dEhlaWdodDogREVGQVVMVF9URVhUX0hFSUdIVCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ05ldyBTd2ltbGFuZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdjZW50ZXInXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoWzEsIDIsIDNdLmluY2x1ZGVzKGluZGV4KSkge1xuICAgICAgICAgICAgaXRlbSA9IHtcbiAgICAgICAgICAgICAgICBpZDogaWRDcmVhdG9yKCksXG4gICAgICAgICAgICAgICAgcm93SWQ6IHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCA/IHJvd3NbMV0uaWQgOiByb3dzW2luZGV4IC0gMV0uaWQsXG4gICAgICAgICAgICAgICAgY29sdW1uSWQ6IHNoYXBlID09PSBTd2ltbGFuZVN5bWJvbHMuc3dpbWxhbmVWZXJ0aWNhbCA/IGNvbHVtbnNbaW5kZXggLSAxXS5pZCA6IGNvbHVtbnNbMV0uaWQsXG4gICAgICAgICAgICAgICAgdGV4dEhlaWdodDogREVGQVVMVF9URVhUX0hFSUdIVCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogJ0xhbmUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFs0LCA1LCA2XS5pbmNsdWRlcyhpbmRleCkpIHtcbiAgICAgICAgICAgIGl0ZW0gPSB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkQ3JlYXRvcigpLFxuICAgICAgICAgICAgICAgIHJvd0lkOiBzaGFwZSA9PT0gU3dpbWxhbmVTeW1ib2xzLnN3aW1sYW5lVmVydGljYWwgPyByb3dzWzJdLmlkIDogcm93c1tpbmRleCAtIDRdLmlkLFxuICAgICAgICAgICAgICAgIGNvbHVtbklkOiBzaGFwZSA9PT0gU3dpbWxhbmVTeW1ib2xzLnN3aW1sYW5lVmVydGljYWwgPyBjb2x1bW5zW2luZGV4IC0gNF0uaWQgOiBjb2x1bW5zWzJdLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xufTtcbiJdfQ==
@@ -0,0 +1,124 @@
1
+ import { idCreator, RectangleClient } from '@plait/core';
2
+ import { getTextManage } from '../generators/text.generator';
3
+ export function getCellsWithPoints(board, element) {
4
+ const table = board.buildTable(element);
5
+ const rectangle = RectangleClient.getRectangleByPoints(table.points);
6
+ const columnsCount = table.columns.length;
7
+ const rowsCount = table.rows.length;
8
+ const cellWidths = calculateCellsSize(table.columns, rectangle.width, columnsCount, true);
9
+ const cellHeights = calculateCellsSize(table.rows, rectangle.height, rowsCount, false);
10
+ const cells = table.cells.map(cell => {
11
+ const rowIdx = table.rows.findIndex(row => row.id === cell.rowId);
12
+ const columnIdx = table.columns.findIndex(column => column.id === cell.columnId);
13
+ let cellTopLeftX = rectangle.x;
14
+ for (let i = 0; i < columnIdx; i++) {
15
+ cellTopLeftX += cellWidths[i];
16
+ }
17
+ let cellTopLeftY = rectangle.y;
18
+ for (let i = 0; i < rowIdx; i++) {
19
+ cellTopLeftY += cellHeights[i];
20
+ }
21
+ const cellWidth = calculateCellSize(cell, cellWidths, columnIdx, true);
22
+ const cellBottomRightX = cellTopLeftX + cellWidth;
23
+ const cellHeight = calculateCellSize(cell, cellHeights, rowIdx, false);
24
+ const cellBottomRightY = cellTopLeftY + cellHeight;
25
+ return {
26
+ ...cell,
27
+ points: [
28
+ [cellTopLeftX, cellTopLeftY],
29
+ [cellBottomRightX, cellBottomRightY]
30
+ ]
31
+ };
32
+ });
33
+ return cells;
34
+ }
35
+ export function getCellWithPoints(board, table, cellId) {
36
+ const cells = getCellsWithPoints(board, table);
37
+ const cellIndex = table.cells.findIndex(item => item.id === cellId);
38
+ return cells[cellIndex];
39
+ }
40
+ function calculateCellsSize(items, tableSize, count, isWidth) {
41
+ const cellSizes = [];
42
+ const sizeType = isWidth ? 'width' : 'height';
43
+ // The remaining size of the table excluding cells with already set sizes.
44
+ let totalSizeRemaining = tableSize;
45
+ items.forEach((item, index) => {
46
+ if (item[sizeType]) {
47
+ cellSizes[index] = item[sizeType];
48
+ totalSizeRemaining -= item[sizeType];
49
+ }
50
+ });
51
+ // Divide the remaining size equally.
52
+ const remainingItemCount = count - cellSizes.filter(item => !!item).length;
53
+ const remainingCellSize = remainingItemCount > 0 ? totalSizeRemaining / remainingItemCount : 0;
54
+ for (let i = 0; i < count; i++) {
55
+ if (!cellSizes[i]) {
56
+ cellSizes[i] = remainingCellSize;
57
+ }
58
+ }
59
+ return cellSizes;
60
+ }
61
+ function calculateCellSize(cell, sizes, index, isWidth) {
62
+ const span = isWidth ? cell.colspan || 1 : cell.rowspan || 1;
63
+ let size = 0;
64
+ for (let i = 0; i < span; i++) {
65
+ const cellIndex = index + i;
66
+ size += sizes[cellIndex];
67
+ }
68
+ return size;
69
+ }
70
+ export function getHitCell(board, element, point) {
71
+ const table = board.buildTable(element);
72
+ const cells = getCellsWithPoints(board, table);
73
+ const rectangle = RectangleClient.getRectangleByPoints([point, point]);
74
+ const cell = cells.find(item => {
75
+ const cellRectangle = RectangleClient.getRectangleByPoints(item.points);
76
+ return RectangleClient.isHit(rectangle, cellRectangle);
77
+ });
78
+ if (cell) {
79
+ return table.cells.find(item => item.id === cell.id);
80
+ }
81
+ return null;
82
+ }
83
+ export function editCell(cell) {
84
+ const textManage = getTextManageByCell(cell);
85
+ textManage && textManage.edit();
86
+ }
87
+ export function getTextManageByCell(cell) {
88
+ return getTextManage(cell.id);
89
+ }
90
+ export const updateColumns = (table, columnId, width, offset) => {
91
+ const columns = table.columns.map(item => (item.id === columnId ? { ...item, width } : item));
92
+ const points = [table.points[0], [table.points[1][0] + offset, table.points[1][1]]];
93
+ return { columns, points };
94
+ };
95
+ export const updateRows = (table, rowId, height, offset) => {
96
+ const rows = table.rows.map(item => (item.id === rowId ? { ...item, height } : item));
97
+ const points = [table.points[0], [table.points[1][0], table.points[1][1] + offset]];
98
+ return { rows, points };
99
+ };
100
+ export function updateCellIdsByRowOrColumn(cells, oldId, newId, type) {
101
+ const id = `${type}Id`;
102
+ cells.forEach(item => {
103
+ if (item[id] === oldId) {
104
+ item[id] = newId;
105
+ }
106
+ });
107
+ }
108
+ export function updateRowOrColumnIds(element, type) {
109
+ element[`${type}s`].forEach(item => {
110
+ const newId = idCreator();
111
+ updateCellIdsByRowOrColumn(element.cells, item.id, newId, type);
112
+ item.id = newId;
113
+ });
114
+ }
115
+ export function updateCellIds(cells) {
116
+ cells.forEach(item => {
117
+ const newId = idCreator();
118
+ item.id = newId;
119
+ });
120
+ }
121
+ export function isCellIncludeText(cell) {
122
+ return cell.text && cell.textHeight;
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kcmF3L3NyYy91dGlscy90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRzdELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxLQUFpQixFQUFFLE9BQW1CO0lBQ3JFLE1BQU0sS0FBSyxHQUFJLEtBQXlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDMUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXZGLE1BQU0sS0FBSyxHQUErQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM3RCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sU0FBUyxHQUFHLEtBQUss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QUNQLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBbUIsRUFBRSxJQUFzQjtJQUM1RSxPQUFPLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMvQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUMxQiwwQkFBMEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBdUI7SUFDakQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBb0I7SUFDbkQsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUE7QUFDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlkQ3JlYXRvciwgUGxhaXRCb2FyZCwgUG9pbnQsIFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IFBsYWl0VGFibGUsIFBsYWl0VGFibGVDZWxsLCBQbGFpdFRhYmxlQ2VsbFdpdGhQb2ludHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3RhYmxlJztcbmltcG9ydCB7IGdldFRleHRNYW5hZ2UgfSBmcm9tICcuLi9nZW5lcmF0b3JzL3RleHQuZ2VuZXJhdG9yJztcbmltcG9ydCB7IFBsYWl0VGFibGVCb2FyZCB9IGZyb20gJy4uL3BsdWdpbnMvd2l0aC10YWJsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsc1dpdGhQb2ludHMoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0VGFibGUpOiBQbGFpdFRhYmxlQ2VsbFdpdGhQb2ludHNbXSB7XG4gICAgY29uc3QgdGFibGUgPSAoYm9hcmQgYXMgUGxhaXRUYWJsZUJvYXJkKS5idWlsZFRhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyh0YWJsZS5wb2ludHMpO1xuICAgIGNvbnN0IGNvbHVtbnNDb3VudCA9IHRhYmxlLmNvbHVtbnMubGVuZ3RoO1xuICAgIGNvbnN0IHJvd3NDb3VudCA9IHRhYmxlLnJvd3MubGVuZ3RoO1xuICAgIGNvbnN0IGNlbGxXaWR0aHMgPSBjYWxjdWxhdGVDZWxsc1NpemUodGFibGUuY29sdW1ucywgcmVjdGFuZ2xlLndpZHRoLCBjb2x1bW5zQ291bnQsIHRydWUpO1xuICAgIGNvbnN0IGNlbGxIZWlnaHRzID0gY2FsY3VsYXRlQ2VsbHNTaXplKHRhYmxlLnJvd3MsIHJlY3RhbmdsZS5oZWlnaHQsIHJvd3NDb3VudCwgZmFsc2UpO1xuXG4gICAgY29uc3QgY2VsbHM6IFBsYWl0VGFibGVDZWxsV2l0aFBvaW50c1tdID0gdGFibGUuY2VsbHMubWFwKGNlbGwgPT4ge1xuICAgICAgICBjb25zdCByb3dJZHggPSB0YWJsZS5yb3dzLmZpbmRJbmRleChyb3cgPT4gcm93LmlkID09PSBjZWxsLnJvd0lkKTtcbiAgICAgICAgY29uc3QgY29sdW1uSWR4ID0gdGFibGUuY29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5pZCA9PT0gY2VsbC5jb2x1bW5JZCk7XG5cbiAgICAgICAgbGV0IGNlbGxUb3BMZWZ0WCA9IHJlY3RhbmdsZS54O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtbklkeDsgaSsrKSB7XG4gICAgICAgICAgICBjZWxsVG9wTGVmdFggKz0gY2VsbFdpZHRoc1tpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjZWxsVG9wTGVmdFkgPSByZWN0YW5nbGUueTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dJZHg7IGkrKykge1xuICAgICAgICAgICAgY2VsbFRvcExlZnRZICs9IGNlbGxIZWlnaHRzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gY2FsY3VsYXRlQ2VsbFNpemUoY2VsbCwgY2VsbFdpZHRocywgY29sdW1uSWR4LCB0cnVlKTtcbiAgICAgICAgY29uc3QgY2VsbEJvdHRvbVJpZ2h0WCA9IGNlbGxUb3BMZWZ0WCArIGNlbGxXaWR0aDtcblxuICAgICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gY2FsY3VsYXRlQ2VsbFNpemUoY2VsbCwgY2VsbEhlaWdodHMsIHJvd0lkeCwgZmFsc2UpO1xuICAgICAgICBjb25zdCBjZWxsQm90dG9tUmlnaHRZID0gY2VsbFRvcExlZnRZICsgY2VsbEhlaWdodDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uY2VsbCxcbiAgICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgICAgIFtjZWxsVG9wTGVmdFgsIGNlbGxUb3BMZWZ0WV0sXG4gICAgICAgICAgICAgICAgW2NlbGxCb3R0b21SaWdodFgsIGNlbGxCb3R0b21SaWdodFldXG4gICAgICAgICAgICBdXG4gICAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2VsbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsV2l0aFBvaW50cyhib2FyZDogUGxhaXRCb2FyZCwgdGFibGU6IFBsYWl0VGFibGUsIGNlbGxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2VsbHMgPSBnZXRDZWxsc1dpdGhQb2ludHMoYm9hcmQgYXMgUGxhaXRUYWJsZUJvYXJkLCB0YWJsZSk7XG4gICAgY29uc3QgY2VsbEluZGV4ID0gdGFibGUuY2VsbHMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gY2VsbElkKTtcbiAgICByZXR1cm4gY2VsbHNbY2VsbEluZGV4XTtcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlQ2VsbHNTaXplKGl0ZW1zOiB7IGlkOiBzdHJpbmc7IFtrZXk6IHN0cmluZ106IGFueSB9W10sIHRhYmxlU2l6ZTogbnVtYmVyLCBjb3VudDogbnVtYmVyLCBpc1dpZHRoOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2VsbFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IHNpemVUeXBlID0gaXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICAgIC8vIFRoZSByZW1haW5pbmcgc2l6ZSBvZiB0aGUgdGFibGUgZXhjbHVkaW5nIGNlbGxzIHdpdGggYWxyZWFkeSBzZXQgc2l6ZXMuXG4gICAgbGV0IHRvdGFsU2l6ZVJlbWFpbmluZyA9IHRhYmxlU2l6ZTtcblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpdGVtW3NpemVUeXBlXSkge1xuICAgICAgICAgICAgY2VsbFNpemVzW2luZGV4XSA9IGl0ZW1bc2l6ZVR5cGVdO1xuICAgICAgICAgICAgdG90YWxTaXplUmVtYWluaW5nIC09IGl0ZW1bc2l6ZVR5cGVdO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXZpZGUgdGhlIHJlbWFpbmluZyBzaXplIGVxdWFsbHkuXG4gICAgY29uc3QgcmVtYWluaW5nSXRlbUNvdW50ID0gY291bnQgLSBjZWxsU2l6ZXMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKS5sZW5ndGg7XG4gICAgY29uc3QgcmVtYWluaW5nQ2VsbFNpemUgPSByZW1haW5pbmdJdGVtQ291bnQgPiAwID8gdG90YWxTaXplUmVtYWluaW5nIC8gcmVtYWluaW5nSXRlbUNvdW50IDogMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgaWYgKCFjZWxsU2l6ZXNbaV0pIHtcbiAgICAgICAgICAgIGNlbGxTaXplc1tpXSA9IHJlbWFpbmluZ0NlbGxTaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjZWxsU2l6ZXM7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZUNlbGxTaXplKGNlbGw6IFBsYWl0VGFibGVDZWxsLCBzaXplczogbnVtYmVyW10sIGluZGV4OiBudW1iZXIsIGlzV2lkdGg6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzcGFuID0gaXNXaWR0aCA/IGNlbGwuY29sc3BhbiB8fCAxIDogY2VsbC5yb3dzcGFuIHx8IDE7XG4gICAgbGV0IHNpemUgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IGluZGV4ICsgaTtcbiAgICAgICAgc2l6ZSArPSBzaXplc1tjZWxsSW5kZXhdO1xuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhpdENlbGwoYm9hcmQ6IFBsYWl0VGFibGVCb2FyZCwgZWxlbWVudDogUGxhaXRUYWJsZSwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgdGFibGUgPSBib2FyZC5idWlsZFRhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IGNlbGxzID0gZ2V0Q2VsbHNXaXRoUG9pbnRzKGJvYXJkLCB0YWJsZSk7XG4gICAgY29uc3QgcmVjdGFuZ2xlID0gUmVjdGFuZ2xlQ2xpZW50LmdldFJlY3RhbmdsZUJ5UG9pbnRzKFtwb2ludCwgcG9pbnRdKTtcbiAgICBjb25zdCBjZWxsID0gY2VsbHMuZmluZChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgY2VsbFJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5nZXRSZWN0YW5nbGVCeVBvaW50cyhpdGVtLnBvaW50cyk7XG4gICAgICAgIHJldHVybiBSZWN0YW5nbGVDbGllbnQuaXNIaXQocmVjdGFuZ2xlLCBjZWxsUmVjdGFuZ2xlKTtcbiAgICB9KTtcbiAgICBpZiAoY2VsbCkge1xuICAgICAgICByZXR1cm4gdGFibGUuY2VsbHMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGNlbGwuaWQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVkaXRDZWxsKGNlbGw6IFBsYWl0VGFibGVDZWxsKSB7XG4gICAgY29uc3QgdGV4dE1hbmFnZSA9IGdldFRleHRNYW5hZ2VCeUNlbGwoY2VsbCk7XG4gICAgdGV4dE1hbmFnZSAmJiB0ZXh0TWFuYWdlLmVkaXQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHRNYW5hZ2VCeUNlbGwoY2VsbDogUGxhaXRUYWJsZUNlbGwpIHtcbiAgICByZXR1cm4gZ2V0VGV4dE1hbmFnZShjZWxsLmlkKTtcbn1cblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSAodGFibGU6IFBsYWl0VGFibGUsIGNvbHVtbklkOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29sdW1ucyA9IHRhYmxlLmNvbHVtbnMubWFwKGl0ZW0gPT4gKGl0ZW0uaWQgPT09IGNvbHVtbklkID8geyAuLi5pdGVtLCB3aWR0aCB9IDogaXRlbSkpO1xuICAgIGNvbnN0IHBvaW50cyA9IFt0YWJsZS5wb2ludHNbMF0sIFt0YWJsZS5wb2ludHNbMV1bMF0gKyBvZmZzZXQsIHRhYmxlLnBvaW50c1sxXVsxXV1dIGFzIFBvaW50W107XG4gICAgcmV0dXJuIHsgY29sdW1ucywgcG9pbnRzIH07XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlUm93cyA9ICh0YWJsZTogUGxhaXRUYWJsZSwgcm93SWQ6IHN0cmluZywgaGVpZ2h0OiBudW1iZXIsIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKGl0ZW0gPT4gKGl0ZW0uaWQgPT09IHJvd0lkID8geyAuLi5pdGVtLCBoZWlnaHQgfSA6IGl0ZW0pKTtcbiAgICBjb25zdCBwb2ludHMgPSBbdGFibGUucG9pbnRzWzBdLCBbdGFibGUucG9pbnRzWzFdWzBdLCB0YWJsZS5wb2ludHNbMV1bMV0gKyBvZmZzZXRdXSBhcyBQb2ludFtdO1xuICAgIHJldHVybiB7IHJvd3MsIHBvaW50cyB9O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUNlbGxJZHNCeVJvd09yQ29sdW1uKGNlbGxzOiBQbGFpdFRhYmxlQ2VsbFtdLCBvbGRJZDogc3RyaW5nLCBuZXdJZDogc3RyaW5nLCB0eXBlOiAncm93JyB8ICdjb2x1bW4nKSB7XG4gICAgY29uc3QgaWQ6ICdyb3dJZCcgfCAnY29sdW1uSWQnID0gYCR7dHlwZX1JZGA7XG4gICAgY2VsbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW1baWRdID09PSBvbGRJZCkge1xuICAgICAgICAgICAgaXRlbVtpZF0gPSBuZXdJZDtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUm93T3JDb2x1bW5JZHMoZWxlbWVudDogUGxhaXRUYWJsZSwgdHlwZTogJ3JvdycgfCAnY29sdW1uJykge1xuICAgIGVsZW1lbnRbYCR7dHlwZX1zYF0uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgbmV3SWQgPSBpZENyZWF0b3IoKTtcbiAgICAgICAgdXBkYXRlQ2VsbElkc0J5Um93T3JDb2x1bW4oZWxlbWVudC5jZWxscywgaXRlbS5pZCwgbmV3SWQsIHR5cGUpO1xuICAgICAgICBpdGVtLmlkID0gbmV3SWQ7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDZWxsSWRzKGNlbGxzOiBQbGFpdFRhYmxlQ2VsbFtdKSB7XG4gICAgY2VsbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgbmV3SWQgPSBpZENyZWF0b3IoKTtcbiAgICAgICAgaXRlbS5pZCA9IG5ld0lkO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsSW5jbHVkZVRleHQoY2VsbDogUGxhaXRUYWJsZUNlbGwpIHtcbiAgIHJldHVybiBjZWxsLnRleHQgJiYgY2VsbC50ZXh0SGVpZ2h0XG59Il19