KCL's `fillet` function takes an array of edges to fillet. Previously this would do `n` fillet API commands, one per edge. This PR combines them all into one call, which should improve performance. You can see the effect in the artifact_commands snapshots, e.g. `rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_commands.snap`
Besides performance, this should fix a bug where some KCL fillets would fail, when they should have succeeded. Example from @max-mrgrsk:
```kcl
sketch001 = startSketchOn(XY)
|> startProfile(at = [-12, -6])
|> line(end = [0, 12], tag = $seg04)
|> line(end = [24, 0], tag = $seg03)
|> line(end = [0, -12], tag = $seg02)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $seg01)
|> close()
extrude001 = extrude(
sketch001,
length = 12,
tagEnd = $capEnd001,
tagStart = $capStart001,
)
|> fillet(
radius = 5,
tags = [
getCommonEdge(faces = [seg02, capEnd001]),
getCommonEdge(faces = [seg01, capEnd001]),
getCommonEdge(faces = [seg03, capEnd001]),
getCommonEdge(faces = [seg04, capEnd001])
],
)
```
This program fails on main, but succeeds on this branch.
19 KiB
19 KiB
flowchart LR
subgraph path6 [Path]
6["Path<br>[1017, 1061, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
16["Segment<br>[1069, 1109, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
17["Segment<br>[1117, 1163, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
23["Segment<br>[1171, 1212, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
25["Segment<br>[1220, 1285, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
29["Segment<br>[1293, 1300, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
55[Solid2d]
end
subgraph path7 [Path]
7["Path<br>[1017, 1061, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
15["Segment<br>[1069, 1109, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
18["Segment<br>[1117, 1163, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
21["Segment<br>[1171, 1212, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
28["Segment<br>[1220, 1285, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
32["Segment<br>[1293, 1300, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
56[Solid2d]
end
subgraph path8 [Path]
8["Path<br>[1017, 1061, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
13["Segment<br>[1069, 1109, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
20["Segment<br>[1117, 1163, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
22["Segment<br>[1171, 1212, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
26["Segment<br>[1220, 1285, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
31["Segment<br>[1293, 1300, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
58[Solid2d]
end
subgraph path9 [Path]
9["Path<br>[1017, 1061, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
14["Segment<br>[1069, 1109, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
19["Segment<br>[1117, 1163, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
24["Segment<br>[1171, 1212, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
27["Segment<br>[1220, 1285, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
30["Segment<br>[1293, 1300, 0]"]
%% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
59[Solid2d]
end
subgraph path10 [Path]
10["Path<br>[1462, 1519, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
33["Segment<br>[1525, 1557, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
34["Segment<br>[1563, 1600, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
35["Segment<br>[1606, 1639, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
36["Segment<br>[1645, 1712, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
37["Segment<br>[1718, 1725, 0]"]
%% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
57[Solid2d]
end
subgraph path11 [Path]
11["Path<br>[2885, 2941, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
38["Segment<br>[2947, 3006, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
39["Segment<br>[3012, 3047, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
40["Segment<br>[3053, 3086, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
41["Segment<br>[3092, 3151, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
42["Segment<br>[3157, 3193, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
43["Segment<br>[3199, 3223, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
44["Segment<br>[3229, 3236, 0]"]
%% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
60[Solid2d]
end
subgraph path12 [Path]
12["Path<br>[3831, 3881, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }]
45["Segment<br>[3887, 3937, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }]
46["Segment<br>[3943, 4009, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }]
47["Segment<br>[4015, 4066, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }]
48["Segment<br>[4072, 4137, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }]
49["Segment<br>[4143, 4196, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }]
50["Segment<br>[4202, 4269, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }]
51["Segment<br>[4275, 4349, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }]
52["Segment<br>[4355, 4423, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }]
53["Segment<br>[4429, 4436, 0]"]
%% [ProgramBodyItem { index: 25 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }]
54[Solid2d]
end
1["Plane<br>[1391, 1408, 0]"]
%% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit]
2["Plane<br>[2782, 2824, 0]"]
%% [ProgramBodyItem { index: 19 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwUnlabeledArg]
3["Plane<br>[3757, 3783, 0]"]
%% [ProgramBodyItem { index: 24 }, VariableDeclarationDeclaration, VariableDeclarationInit]
4["StartSketchOnPlane<br>[2768, 2825, 0]"]
%% [ProgramBodyItem { index: 19 }, VariableDeclarationDeclaration, VariableDeclarationInit]
5["StartSketchOnFace<br>[4593, 4632, 0]"]
%% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit]
61["Sweep Extrusion<br>[2459, 2509, 0]"]
%% [ProgramBodyItem { index: 17 }, VariableDeclarationDeclaration, VariableDeclarationInit]
62["Sweep Extrusion<br>[3270, 3314, 0]"]
%% [ProgramBodyItem { index: 21 }, VariableDeclarationDeclaration, VariableDeclarationInit]
63["Sweep Extrusion<br>[4492, 4534, 0]"]
%% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit]
64["Sweep Extrusion<br>[4812, 4862, 0]"]
%% [ProgramBodyItem { index: 29 }, ExpressionStatementExpr]
65[Wall]
%% face_code_ref=Missing NodePath
66[Wall]
%% face_code_ref=Missing NodePath
67[Wall]
%% face_code_ref=Missing NodePath
68[Wall]
%% face_code_ref=Missing NodePath
69[Wall]
%% face_code_ref=Missing NodePath
70[Wall]
%% face_code_ref=Missing NodePath
71[Wall]
%% face_code_ref=Missing NodePath
72[Wall]
%% face_code_ref=Missing NodePath
73[Wall]
%% face_code_ref=Missing NodePath
74[Wall]
%% face_code_ref=Missing NodePath
75[Wall]
%% face_code_ref=Missing NodePath
76[Wall]
%% face_code_ref=Missing NodePath
77[Wall]
%% face_code_ref=Missing NodePath
78[Wall]
%% face_code_ref=Missing NodePath
79[Wall]
%% face_code_ref=Missing NodePath
80[Wall]
%% face_code_ref=Missing NodePath
81[Wall]
%% face_code_ref=Missing NodePath
82[Wall]
%% face_code_ref=Missing NodePath
83[Wall]
%% face_code_ref=[ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit]
84[Wall]
%% face_code_ref=Missing NodePath
85[Wall]
%% face_code_ref=Missing NodePath
86[Wall]
%% face_code_ref=Missing NodePath
87[Wall]
%% face_code_ref=Missing NodePath
88[Wall]
%% face_code_ref=Missing NodePath
89["Cap Start"]
%% face_code_ref=Missing NodePath
90["Cap Start"]
%% face_code_ref=Missing NodePath
91["Cap Start"]
%% face_code_ref=Missing NodePath
92["Cap End"]
%% face_code_ref=Missing NodePath
93["Cap End"]
%% face_code_ref=Missing NodePath
94["Cap End"]
%% face_code_ref=Missing NodePath
95["SweepEdge Opposite"]
96["SweepEdge Opposite"]
97["SweepEdge Opposite"]
98["SweepEdge Opposite"]
99["SweepEdge Opposite"]
100["SweepEdge Opposite"]
101["SweepEdge Opposite"]
102["SweepEdge Opposite"]
103["SweepEdge Opposite"]
104["SweepEdge Opposite"]
105["SweepEdge Opposite"]
106["SweepEdge Opposite"]
107["SweepEdge Opposite"]
108["SweepEdge Opposite"]
109["SweepEdge Opposite"]
110["SweepEdge Opposite"]
111["SweepEdge Opposite"]
112["SweepEdge Opposite"]
113["SweepEdge Opposite"]
114["SweepEdge Opposite"]
115["SweepEdge Opposite"]
116["SweepEdge Opposite"]
117["SweepEdge Opposite"]
118["SweepEdge Opposite"]
119["SweepEdge Adjacent"]
120["SweepEdge Adjacent"]
121["SweepEdge Adjacent"]
122["SweepEdge Adjacent"]
123["SweepEdge Adjacent"]
124["SweepEdge Adjacent"]
125["SweepEdge Adjacent"]
126["SweepEdge Adjacent"]
127["SweepEdge Adjacent"]
128["SweepEdge Adjacent"]
129["SweepEdge Adjacent"]
130["SweepEdge Adjacent"]
131["SweepEdge Adjacent"]
132["SweepEdge Adjacent"]
133["SweepEdge Adjacent"]
134["SweepEdge Adjacent"]
135["SweepEdge Adjacent"]
136["SweepEdge Adjacent"]
137["SweepEdge Adjacent"]
138["SweepEdge Adjacent"]
139["SweepEdge Adjacent"]
140["SweepEdge Adjacent"]
141["SweepEdge Adjacent"]
142["SweepEdge Adjacent"]
143["EdgeCut Fillet<br>[2546, 2687, 0]"]
%% [ProgramBodyItem { index: 18 }, ExpressionStatementExpr]
144["EdgeCut Fillet<br>[3357, 3488, 0]"]
%% [ProgramBodyItem { index: 22 }, ExpressionStatementExpr]
1 --- 6
1 --- 8
1 --- 9
1 --- 10
2 <--x 4
2 --- 11
3 --- 12
83 x--> 5
6 --- 16
6 --- 17
6 --- 23
6 --- 25
6 --- 29
6 --- 55
7 --- 15
7 --- 18
7 --- 21
7 --- 28
7 --- 32
7 --- 56
7 ---- 64
83 --- 7
8 --- 13
8 --- 20
8 --- 22
8 --- 26
8 --- 31
8 --- 58
9 --- 14
9 --- 19
9 --- 24
9 --- 27
9 --- 30
9 --- 59
10 --- 33
10 --- 34
10 --- 35
10 --- 36
10 --- 37
10 --- 57
10 ---- 61
11 --- 38
11 --- 39
11 --- 40
11 --- 41
11 --- 42
11 --- 43
11 --- 44
11 --- 60
11 ---- 62
12 --- 45
12 --- 46
12 --- 47
12 --- 48
12 --- 49
12 --- 50
12 --- 51
12 --- 52
12 --- 53
12 --- 54
12 ---- 63
15 --- 74
15 x--> 83
15 --- 102
15 --- 126
18 --- 72
18 x--> 83
18 --- 103
18 --- 127
21 --- 73
21 x--> 83
21 --- 104
21 --- 128
28 --- 75
28 x--> 83
28 --- 105
28 --- 129
33 --- 88
33 x--> 91
33 --- 114
33 --- 138
34 --- 86
34 x--> 91
34 --- 115
34 --- 139
35 --- 85
35 x--> 91
35 --- 116
35 --- 140
36 --- 87
36 x--> 91
36 --- 117
36 --- 141
37 --- 84
37 x--> 91
37 --- 118
37 --- 142
38 --- 65
38 x--> 89
38 --- 95
38 --- 119
39 --- 66
39 x--> 89
39 --- 96
39 --- 120
40 --- 69
40 x--> 89
40 --- 97
40 --- 121
41 --- 68
41 x--> 89
41 --- 98
41 --- 122
42 --- 71
42 x--> 89
42 --- 99
42 --- 123
43 --- 67
43 x--> 89
43 --- 100
43 --- 124
44 --- 70
44 x--> 89
44 --- 101
44 --- 125
45 --- 78
45 x--> 93
45 --- 106
45 --- 130
46 --- 77
46 x--> 93
46 --- 107
46 --- 131
47 --- 80
47 x--> 93
47 --- 108
47 --- 132
48 --- 82
48 x--> 93
48 --- 109
48 --- 133
49 --- 76
49 x--> 93
49 --- 110
49 --- 134
50 --- 81
50 x--> 93
50 --- 111
50 --- 135
51 --- 83
51 x--> 93
51 --- 112
51 --- 136
52 --- 79
52 x--> 93
52 --- 113
52 --- 137
61 --- 84
61 --- 85
61 --- 86
61 --- 87
61 --- 88
61 --- 91
61 --- 94
61 --- 114
61 --- 115
61 --- 116
61 --- 117
61 --- 118
61 --- 138
61 --- 139
61 --- 140
61 --- 141
61 --- 142
62 --- 65
62 --- 66
62 --- 67
62 --- 68
62 --- 69
62 --- 70
62 --- 71
62 --- 89
62 --- 92
62 --- 95
62 --- 96
62 --- 97
62 --- 98
62 --- 99
62 --- 100
62 --- 101
62 --- 119
62 --- 120
62 --- 121
62 --- 122
62 --- 123
62 --- 124
62 --- 125
63 --- 76
63 --- 77
63 --- 78
63 --- 79
63 --- 80
63 --- 81
63 --- 82
63 --- 83
63 --- 90
63 --- 93
63 --- 106
63 --- 107
63 --- 108
63 --- 109
63 --- 110
63 --- 111
63 --- 112
63 --- 113
63 --- 130
63 --- 131
63 --- 132
63 --- 133
63 --- 134
63 --- 135
63 --- 136
63 --- 137
64 --- 72
64 --- 73
64 --- 74
64 --- 75
64 --- 102
64 --- 103
64 --- 104
64 --- 105
64 --- 126
64 --- 127
64 --- 128
64 --- 129
65 --- 95
65 --- 119
125 <--x 65
66 --- 96
119 <--x 66
66 --- 120
67 --- 100
123 <--x 67
67 --- 124
68 --- 98
121 <--x 68
68 --- 122
69 --- 97
120 <--x 69
69 --- 121
70 --- 101
124 <--x 70
70 --- 125
71 --- 99
122 <--x 71
71 --- 123
72 --- 103
126 <--x 72
72 --- 127
73 --- 104
127 <--x 73
73 --- 128
74 --- 102
74 --- 126
129 <--x 74
75 --- 105
128 <--x 75
75 --- 129
76 --- 110
133 <--x 76
76 --- 134
77 --- 107
130 <--x 77
77 --- 131
78 --- 106
78 --- 130
137 <--x 78
79 --- 113
136 <--x 79
79 --- 137
102 <--x 80
103 <--x 80
104 <--x 80
105 <--x 80
80 --- 108
131 <--x 80
80 --- 132
81 --- 111
134 <--x 81
81 --- 135
82 --- 109
132 <--x 82
82 --- 133
83 --- 112
135 <--x 83
83 --- 136
84 --- 118
141 <--x 84
84 --- 142
85 --- 116
139 <--x 85
85 --- 140
86 --- 115
138 <--x 86
86 --- 139
87 --- 117
140 <--x 87
87 --- 141
88 --- 114
88 --- 138
142 <--x 88
106 <--x 90
107 <--x 90
108 <--x 90
109 <--x 90
110 <--x 90
111 <--x 90
112 <--x 90
113 <--x 90
95 <--x 92
96 <--x 92
97 <--x 92
98 <--x 92
99 <--x 92
100 <--x 92
101 <--x 92
114 <--x 94
115 <--x 94
116 <--x 94
117 <--x 94
118 <--x 94
119 <--x 144
139 <--x 143