@next-bricks/diagram 0.15.0 → 0.16.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 (38) hide show
  1. package/dist/bricks.json +1 -1
  2. package/dist/chunks/6248.98448f5b.js +2 -0
  3. package/dist/chunks/6248.98448f5b.js.map +1 -0
  4. package/dist/chunks/eo-draw-canvas.6ce2466b.js +2 -0
  5. package/dist/chunks/eo-draw-canvas.6ce2466b.js.map +1 -0
  6. package/dist/chunks/experimental-node.1bab0245.js +2 -0
  7. package/dist/chunks/experimental-node.1bab0245.js.map +1 -0
  8. package/dist/chunks/{main.9d26f349.js → main.5e7856e6.js} +2 -2
  9. package/dist/chunks/main.5e7856e6.js.map +1 -0
  10. package/dist/examples.json +3 -3
  11. package/dist/index.a0b283c5.js +2 -0
  12. package/dist/index.a0b283c5.js.map +1 -0
  13. package/dist/manifest.json +91 -58
  14. package/dist/types.json +379 -67
  15. package/dist-types/draw-canvas/EdgeComponent.d.ts +8 -0
  16. package/dist-types/draw-canvas/NodeComponent.d.ts +18 -0
  17. package/dist-types/draw-canvas/index.d.ts +14 -13
  18. package/dist-types/draw-canvas/interfaces.d.ts +23 -4
  19. package/dist-types/draw-canvas/processors/findNode.d.ts +2 -0
  20. package/dist-types/draw-canvas/processors/handleKeyboard.d.ts +10 -0
  21. package/dist-types/draw-canvas/processors/handleKeyboard.spec.d.ts +1 -0
  22. package/dist-types/draw-canvas/processors/handleMouseDown.d.ts +10 -0
  23. package/dist-types/draw-canvas/processors/handleMouseDown.spec.d.ts +1 -0
  24. package/dist-types/draw-canvas/processors/sameTarget.d.ts +2 -0
  25. package/dist-types/draw-canvas/processors/sameTarget.spec.d.ts +1 -0
  26. package/dist-types/draw-canvas/reducers/interfaces.d.ts +15 -2
  27. package/dist-types/experimental-node/index.d.ts +3 -0
  28. package/docs/eo-draw-canvas.md +34 -25
  29. package/package.json +2 -2
  30. package/dist/chunks/8272.fcc84aba.js +0 -2
  31. package/dist/chunks/8272.fcc84aba.js.map +0 -1
  32. package/dist/chunks/eo-draw-canvas.0418a178.js +0 -2
  33. package/dist/chunks/eo-draw-canvas.0418a178.js.map +0 -1
  34. package/dist/chunks/experimental-node.b18bf94a.js +0 -2
  35. package/dist/chunks/experimental-node.b18bf94a.js.map +0 -1
  36. package/dist/chunks/main.9d26f349.js.map +0 -1
  37. package/dist/index.fa106669.js +0 -2
  38. package/dist/index.fa106669.js.map +0 -1
package/dist/types.json CHANGED
@@ -77,6 +77,16 @@
77
77
  "name": "ExperimentalUsage"
78
78
  }
79
79
  }
80
+ },
81
+ {
82
+ "name": "status",
83
+ "annotation": {
84
+ "type": "reference",
85
+ "typeName": {
86
+ "type": "identifier",
87
+ "name": "NodeStatus"
88
+ }
89
+ }
80
90
  }
81
91
  ],
82
92
  "events": [
@@ -140,6 +150,27 @@
140
150
  ]
141
151
  }
142
152
  },
153
+ {
154
+ "type": "typeAlias",
155
+ "name": "NodeStatus",
156
+ "annotation": {
157
+ "type": "union",
158
+ "types": [
159
+ {
160
+ "type": "jsLiteral",
161
+ "value": "highlighted"
162
+ },
163
+ {
164
+ "type": "jsLiteral",
165
+ "value": "faded"
166
+ },
167
+ {
168
+ "type": "jsLiteral",
169
+ "value": "default"
170
+ }
171
+ ]
172
+ }
173
+ },
143
174
  {
144
175
  "type": "typeAlias",
145
176
  "name": "PositionTuple",
@@ -193,9 +224,87 @@
193
224
  "name": "SizeTuple"
194
225
  }
195
226
  }
227
+ },
228
+ {
229
+ "name": "defaultNodeBricks",
230
+ "annotation": {
231
+ "type": "array",
232
+ "elementType": {
233
+ "type": "reference",
234
+ "typeName": {
235
+ "type": "identifier",
236
+ "name": "NodeBrickConf"
237
+ }
238
+ }
239
+ }
240
+ },
241
+ {
242
+ "name": "activeTarget",
243
+ "annotation": {
244
+ "type": "union",
245
+ "types": [
246
+ {
247
+ "type": "reference",
248
+ "typeName": {
249
+ "type": "identifier",
250
+ "name": "ActiveTarget"
251
+ }
252
+ },
253
+ {
254
+ "type": "keyword",
255
+ "value": "null"
256
+ }
257
+ ]
258
+ }
259
+ }
260
+ ],
261
+ "events": [
262
+ {
263
+ "name": "activeTarget.change",
264
+ "detail": {
265
+ "annotation": {
266
+ "type": "union",
267
+ "types": [
268
+ {
269
+ "type": "reference",
270
+ "typeName": {
271
+ "type": "identifier",
272
+ "name": "ActiveTarget"
273
+ }
274
+ },
275
+ {
276
+ "type": "keyword",
277
+ "value": "null"
278
+ }
279
+ ]
280
+ }
281
+ }
282
+ },
283
+ {
284
+ "name": "node.move",
285
+ "detail": {
286
+ "annotation": {
287
+ "type": "reference",
288
+ "typeName": {
289
+ "type": "identifier",
290
+ "name": "MoveNodePayload"
291
+ }
292
+ }
293
+ }
294
+ },
295
+ {
296
+ "name": "node.delete",
297
+ "detail": {
298
+ "annotation": {
299
+ "type": "reference",
300
+ "typeName": {
301
+ "type": "identifier",
302
+ "name": "NodeBasicInfo"
303
+ }
304
+ }
305
+ }
196
306
  }
197
307
  ],
198
- "events": [],
199
308
  "methods": [
200
309
  {
201
310
  "name": "dropNode",
@@ -473,6 +582,7 @@
473
582
  "name": "UseSingleBrickConf"
474
583
  }
475
584
  },
585
+ "optional": true,
476
586
  "computed": false
477
587
  }
478
588
  ],
@@ -571,17 +681,11 @@
571
681
  "name": "id"
572
682
  },
573
683
  "annotation": {
574
- "type": "union",
575
- "types": [
576
- {
577
- "type": "keyword",
578
- "value": "string"
579
- },
580
- {
581
- "type": "keyword",
582
- "value": "number"
583
- }
584
- ]
684
+ "type": "reference",
685
+ "typeName": {
686
+ "type": "identifier",
687
+ "name": "NodeId"
688
+ }
585
689
  },
586
690
  "computed": false
587
691
  },
@@ -611,6 +715,14 @@
611
715
  }
612
716
  ]
613
717
  },
718
+ {
719
+ "type": "typeAlias",
720
+ "name": "NodeId",
721
+ "annotation": {
722
+ "type": "keyword",
723
+ "value": "string"
724
+ }
725
+ },
614
726
  {
615
727
  "type": "interface",
616
728
  "name": "NodeView",
@@ -860,17 +972,11 @@
860
972
  "name": "source"
861
973
  },
862
974
  "annotation": {
863
- "type": "union",
864
- "types": [
865
- {
866
- "type": "keyword",
867
- "value": "string"
868
- },
869
- {
870
- "type": "keyword",
871
- "value": "number"
872
- }
873
- ]
975
+ "type": "reference",
976
+ "typeName": {
977
+ "type": "identifier",
978
+ "name": "NodeId"
979
+ }
874
980
  },
875
981
  "computed": false
876
982
  },
@@ -881,17 +987,11 @@
881
987
  "name": "target"
882
988
  },
883
989
  "annotation": {
884
- "type": "union",
885
- "types": [
886
- {
887
- "type": "keyword",
888
- "value": "string"
889
- },
890
- {
891
- "type": "keyword",
892
- "value": "number"
893
- }
894
- ]
990
+ "type": "reference",
991
+ "typeName": {
992
+ "type": "identifier",
993
+ "name": "NodeId"
994
+ }
895
995
  },
896
996
  "computed": false
897
997
  }
@@ -933,6 +1033,235 @@
933
1033
  ]
934
1034
  }
935
1035
  },
1036
+ {
1037
+ "type": "interface",
1038
+ "name": "NodeBrickConf",
1039
+ "body": [
1040
+ {
1041
+ "type": "propertySignature",
1042
+ "key": {
1043
+ "type": "identifier",
1044
+ "name": "useBrick"
1045
+ },
1046
+ "annotation": {
1047
+ "type": "reference",
1048
+ "typeName": {
1049
+ "type": "identifier",
1050
+ "name": "UseSingleBrickConf"
1051
+ }
1052
+ },
1053
+ "computed": false
1054
+ },
1055
+ {
1056
+ "type": "propertySignature",
1057
+ "key": {
1058
+ "type": "identifier",
1059
+ "name": "if"
1060
+ },
1061
+ "annotation": {
1062
+ "type": "union",
1063
+ "types": [
1064
+ {
1065
+ "type": "keyword",
1066
+ "value": "string"
1067
+ },
1068
+ {
1069
+ "type": "keyword",
1070
+ "value": "boolean"
1071
+ },
1072
+ {
1073
+ "type": "keyword",
1074
+ "value": "null"
1075
+ }
1076
+ ]
1077
+ },
1078
+ "optional": true,
1079
+ "computed": false
1080
+ }
1081
+ ]
1082
+ },
1083
+ {
1084
+ "type": "typeAlias",
1085
+ "name": "ActiveTarget",
1086
+ "annotation": {
1087
+ "type": "union",
1088
+ "types": [
1089
+ {
1090
+ "type": "reference",
1091
+ "typeName": {
1092
+ "type": "identifier",
1093
+ "name": "ActiveTargetOfNode"
1094
+ }
1095
+ },
1096
+ {
1097
+ "type": "reference",
1098
+ "typeName": {
1099
+ "type": "identifier",
1100
+ "name": "ActiveTargetOfEdge"
1101
+ }
1102
+ }
1103
+ ]
1104
+ }
1105
+ },
1106
+ {
1107
+ "type": "interface",
1108
+ "name": "ActiveTargetOfNode",
1109
+ "body": [
1110
+ {
1111
+ "type": "propertySignature",
1112
+ "key": {
1113
+ "type": "identifier",
1114
+ "name": "type"
1115
+ },
1116
+ "annotation": {
1117
+ "type": "jsLiteral",
1118
+ "value": "node"
1119
+ },
1120
+ "computed": false
1121
+ },
1122
+ {
1123
+ "type": "propertySignature",
1124
+ "key": {
1125
+ "type": "identifier",
1126
+ "name": "id"
1127
+ },
1128
+ "annotation": {
1129
+ "type": "reference",
1130
+ "typeName": {
1131
+ "type": "identifier",
1132
+ "name": "NodeId"
1133
+ }
1134
+ },
1135
+ "computed": false
1136
+ }
1137
+ ]
1138
+ },
1139
+ {
1140
+ "type": "interface",
1141
+ "name": "ActiveTargetOfEdge",
1142
+ "body": [
1143
+ {
1144
+ "type": "propertySignature",
1145
+ "key": {
1146
+ "type": "identifier",
1147
+ "name": "type"
1148
+ },
1149
+ "annotation": {
1150
+ "type": "jsLiteral",
1151
+ "value": "edge"
1152
+ },
1153
+ "computed": false
1154
+ },
1155
+ {
1156
+ "type": "propertySignature",
1157
+ "key": {
1158
+ "type": "identifier",
1159
+ "name": "source"
1160
+ },
1161
+ "annotation": {
1162
+ "type": "reference",
1163
+ "typeName": {
1164
+ "type": "identifier",
1165
+ "name": "NodeId"
1166
+ }
1167
+ },
1168
+ "computed": false
1169
+ },
1170
+ {
1171
+ "type": "propertySignature",
1172
+ "key": {
1173
+ "type": "identifier",
1174
+ "name": "target"
1175
+ },
1176
+ "annotation": {
1177
+ "type": "reference",
1178
+ "typeName": {
1179
+ "type": "identifier",
1180
+ "name": "NodeId"
1181
+ }
1182
+ },
1183
+ "computed": false
1184
+ }
1185
+ ]
1186
+ },
1187
+ {
1188
+ "type": "interface",
1189
+ "name": "MoveNodePayload",
1190
+ "body": [
1191
+ {
1192
+ "type": "propertySignature",
1193
+ "key": {
1194
+ "type": "identifier",
1195
+ "name": "id"
1196
+ },
1197
+ "annotation": {
1198
+ "type": "reference",
1199
+ "typeName": {
1200
+ "type": "identifier",
1201
+ "name": "NodeId"
1202
+ }
1203
+ },
1204
+ "computed": false
1205
+ },
1206
+ {
1207
+ "type": "propertySignature",
1208
+ "key": {
1209
+ "type": "identifier",
1210
+ "name": "x"
1211
+ },
1212
+ "annotation": {
1213
+ "type": "keyword",
1214
+ "value": "number"
1215
+ },
1216
+ "computed": false
1217
+ },
1218
+ {
1219
+ "type": "propertySignature",
1220
+ "key": {
1221
+ "type": "identifier",
1222
+ "name": "y"
1223
+ },
1224
+ "annotation": {
1225
+ "type": "keyword",
1226
+ "value": "number"
1227
+ },
1228
+ "computed": false
1229
+ }
1230
+ ]
1231
+ },
1232
+ {
1233
+ "type": "interface",
1234
+ "name": "NodeBasicInfo",
1235
+ "body": [
1236
+ {
1237
+ "type": "propertySignature",
1238
+ "key": {
1239
+ "type": "identifier",
1240
+ "name": "id"
1241
+ },
1242
+ "annotation": {
1243
+ "type": "reference",
1244
+ "typeName": {
1245
+ "type": "identifier",
1246
+ "name": "NodeId"
1247
+ }
1248
+ },
1249
+ "computed": false
1250
+ },
1251
+ {
1252
+ "type": "propertySignature",
1253
+ "key": {
1254
+ "type": "identifier",
1255
+ "name": "data"
1256
+ },
1257
+ "annotation": {
1258
+ "type": "keyword",
1259
+ "value": "unknown"
1260
+ },
1261
+ "computed": false
1262
+ }
1263
+ ]
1264
+ },
936
1265
  {
937
1266
  "type": "interface",
938
1267
  "name": "DropNodeInfo",
@@ -975,17 +1304,11 @@
975
1304
  "name": "id"
976
1305
  },
977
1306
  "annotation": {
978
- "type": "union",
979
- "types": [
980
- {
981
- "type": "keyword",
982
- "value": "string"
983
- },
984
- {
985
- "type": "keyword",
986
- "value": "number"
987
- }
988
- ]
1307
+ "type": "reference",
1308
+ "typeName": {
1309
+ "type": "identifier",
1310
+ "name": "NodeId"
1311
+ }
989
1312
  },
990
1313
  "computed": false
991
1314
  },
@@ -1002,6 +1325,7 @@
1002
1325
  "name": "UseSingleBrickConf"
1003
1326
  }
1004
1327
  },
1328
+ "optional": true,
1005
1329
  "computed": false
1006
1330
  },
1007
1331
  {
@@ -1046,17 +1370,11 @@
1046
1370
  "name": "source"
1047
1371
  },
1048
1372
  "annotation": {
1049
- "type": "union",
1050
- "types": [
1051
- {
1052
- "type": "keyword",
1053
- "value": "string"
1054
- },
1055
- {
1056
- "type": "keyword",
1057
- "value": "number"
1058
- }
1059
- ]
1373
+ "type": "reference",
1374
+ "typeName": {
1375
+ "type": "identifier",
1376
+ "name": "NodeId"
1377
+ }
1060
1378
  },
1061
1379
  "computed": false
1062
1380
  },
@@ -1067,17 +1385,11 @@
1067
1385
  "name": "target"
1068
1386
  },
1069
1387
  "annotation": {
1070
- "type": "union",
1071
- "types": [
1072
- {
1073
- "type": "keyword",
1074
- "value": "string"
1075
- },
1076
- {
1077
- "type": "keyword",
1078
- "value": "number"
1079
- }
1080
- ]
1388
+ "type": "reference",
1389
+ "typeName": {
1390
+ "type": "identifier",
1391
+ "name": "NodeId"
1392
+ }
1081
1393
  },
1082
1394
  "computed": false
1083
1395
  },
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import type { Cell, EdgeCell } from "./interfaces";
3
+ export interface EdgeComponentProps {
4
+ edge: EdgeCell;
5
+ cells: Cell[];
6
+ markerEnd: string;
7
+ }
8
+ export declare function EdgeComponent({ edge, cells, markerEnd, }: EdgeComponentProps): JSX.Element | null;
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ import { type UseSingleBrickConf } from "@next-core/react-runtime";
3
+ import type { NodeBrickConf, NodeCell, NodeId } from "./interfaces";
4
+ export interface NodeContainerProps {
5
+ node: NodeCell;
6
+ defaultNodeBricks?: NodeBrickConf[];
7
+ onMount?: (id: NodeId, element: HTMLElement | null) => void;
8
+ onUnmount?: (id: NodeId) => void;
9
+ }
10
+ export declare function NodeContainer({ node, defaultNodeBricks, onMount, onUnmount, }: NodeContainerProps): JSX.Element | null;
11
+ export interface NodeComponentProps {
12
+ id: NodeId;
13
+ useBrick: UseSingleBrickConf;
14
+ data: unknown;
15
+ onMount?: (id: NodeId, element: HTMLElement | null) => void;
16
+ onUnmount?: (id: NodeId) => void;
17
+ }
18
+ export declare function NodeComponent({ id, useBrick, data, onMount, onUnmount, }: NodeComponentProps): JSX.Element | null;
@@ -1,26 +1,28 @@
1
1
  import React from "react";
2
2
  import { ReactNextElement } from "@next-core/react-element";
3
- import { type UseSingleBrickConf } from "@next-core/react-runtime";
3
+ import type { UseSingleBrickConf } from "@next-core/react-runtime";
4
4
  import "@next-core/theme";
5
5
  import type { PositionTuple, SizeTuple } from "../diagram/interfaces";
6
- import type { Cell, EdgeCell, InitialCell, NodeCell } from "./interfaces";
6
+ import type { ActiveTarget, EdgeCell, InitialCell, NodeBasicInfo, NodeBrickConf, NodeCell, NodeId } from "./interfaces";
7
7
  export interface EoDrawCanvasProps {
8
8
  cells: InitialCell[] | undefined;
9
9
  defaultNodeSize?: SizeTuple;
10
+ defaultNodeBricks?: NodeBrickConf[];
11
+ activeTarget?: ActiveTarget | null;
10
12
  }
11
13
  export interface DropNodeInfo extends AddNodeInfo {
12
14
  /** [PointerEvent::clientX, PointerEvent::clientY] */
13
15
  position: PositionTuple;
14
16
  }
15
17
  export interface AddNodeInfo {
16
- id: string | number;
17
- useBrick: UseSingleBrickConf;
18
+ id: NodeId;
19
+ useBrick?: UseSingleBrickConf;
18
20
  data?: unknown;
19
21
  size?: SizeTuple;
20
22
  }
21
23
  export interface AddEdgeInfo {
22
- source: string | number;
23
- target: string | number;
24
+ source: NodeId;
25
+ target: NodeId;
24
26
  data?: unknown;
25
27
  }
26
28
  export declare const EoDrawCanvasComponent: React.ForwardRefExoticComponent<EoDrawCanvasComponentProps & React.RefAttributes<DrawCanvasRef>>;
@@ -36,22 +38,21 @@ export declare class EoDrawCanvas extends ReactNextElement implements EoDrawCanv
36
38
  */
37
39
  accessor cells: InitialCell[] | undefined;
38
40
  accessor defaultNodeSize: SizeTuple | undefined;
41
+ accessor defaultNodeBricks: NodeBrickConf[] | undefined;
42
+ accessor activeTarget: ActiveTarget | null | undefined;
39
43
  dropNode({ id, position, size, data, useBrick, }: DropNodeInfo): Promise<NodeCell | null>;
40
44
  addNodes(nodes: AddNodeInfo[]): Promise<NodeCell[]>;
41
45
  addEdge({ source, target, data }: AddEdgeInfo): Promise<EdgeCell>;
42
46
  render(): React.JSX.Element;
43
47
  }
44
48
  export interface EoDrawCanvasComponentProps extends EoDrawCanvasProps {
45
- onCellsChange?(cells: Cell[]): void;
49
+ onActiveTargetChange(target: ActiveTarget | null): void;
50
+ onSwitchActiveTarget(target: ActiveTarget | null): void;
51
+ onNodeMove(info: unknown): void;
52
+ onNodeDelete?(node: NodeBasicInfo): void;
46
53
  }
47
54
  export interface DrawCanvasRef {
48
55
  dropNode(node: NodeCell): void;
49
56
  addNodes(nodes: NodeCell[]): void;
50
57
  addEdge(edge: EdgeCell): void;
51
58
  }
52
- export interface EdgeComponentProps {
53
- edge: EdgeCell;
54
- cells: Cell[];
55
- markerEnd: string;
56
- }
57
- export declare function EdgeComponent({ edge, cells, markerEnd, }: EdgeComponentProps): JSX.Element | null;
@@ -6,6 +6,7 @@ export type NodeCell = NodeBrickCell | NodeShapeCell;
6
6
  export type EdgeCell = BaseEdgeCell;
7
7
  export type NodeShapeCell = BaseShapeCell & BaseNodeCell;
8
8
  export type NodeBrickCell = BaseBrickCell & BaseNodeCell;
9
+ export type NodeId = string;
9
10
  export interface BaseShapeCell extends BaseCell {
10
11
  tag: "shape";
11
12
  shape: string;
@@ -18,17 +19,17 @@ export interface ShapeStyle {
18
19
  }
19
20
  export interface BaseBrickCell extends BaseCell {
20
21
  tag?: "brick";
21
- useBrick: UseSingleBrickConf;
22
+ useBrick?: UseSingleBrickConf;
22
23
  }
23
24
  export interface BaseNodeCell extends BaseCell {
24
25
  type: "node";
25
- id: string | number;
26
+ id: NodeId;
26
27
  view: NodeView;
27
28
  }
28
29
  export interface BaseEdgeCell extends BaseCell {
29
30
  type: "edge";
30
- source: string | number;
31
- target: string | number;
31
+ source: NodeId;
32
+ target: NodeId;
32
33
  }
33
34
  export interface BaseCell {
34
35
  type: "node" | "edge";
@@ -49,6 +50,24 @@ export type InitialNodeCell = Omit<NodeCell, "view"> & {
49
50
  view: InitialNodeView;
50
51
  };
51
52
  export type InitialCell = InitialNodeCell | EdgeCell;
53
+ export interface NodeBrickConf {
54
+ useBrick: UseSingleBrickConf;
55
+ if?: string | boolean | null;
56
+ }
57
+ export type ActiveTarget = ActiveTargetOfNode | ActiveTargetOfEdge;
58
+ export interface ActiveTargetOfNode {
59
+ type: "node";
60
+ id: NodeId;
61
+ }
62
+ export interface ActiveTargetOfEdge {
63
+ type: "edge";
64
+ source: NodeId;
65
+ target: NodeId;
66
+ }
67
+ export interface NodeBasicInfo {
68
+ id: NodeId;
69
+ data: unknown;
70
+ }
52
71
  export interface BasicShapeProps {
53
72
  cell: ShapeCell;
54
73
  onMouseEnter?: () => void;
@@ -0,0 +1,2 @@
1
+ import type { Cell, NodeCell, NodeId } from "../interfaces";
2
+ export declare function findNode(cells: Cell[], id: NodeId): NodeCell | undefined;
@@ -0,0 +1,10 @@
1
+ import type { ActiveTarget, Cell, NodeBasicInfo } from "../interfaces";
2
+ export type KeyboardAction = KeyboardActionDeleteNode;
3
+ export interface KeyboardActionDeleteNode {
4
+ action: "delete-node";
5
+ node: NodeBasicInfo;
6
+ }
7
+ export declare function handleKeyboard(event: KeyboardEvent, { cells, activeTarget, }: {
8
+ cells: Cell[];
9
+ activeTarget: ActiveTarget | null | undefined;
10
+ }): KeyboardAction | undefined;