@aranzatech/diagrams-bpmn 0.2.1 → 0.2.3

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.
@@ -2,7 +2,7 @@ import { e as BpmnElementType, c as BpmnElementMeta, d as BpmnElementSize } from
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
5
- declare const BPMN_RESIZABLE_ELEMENT_TYPES: ("Task" | "UserTask" | "ServiceTask" | "ScriptTask" | "ManualTask" | "BusinessRuleTask" | "ReceiveTask" | "SendTask" | "CallActivity" | "SubProcess" | "Transaction" | "AdHocSubProcess" | "EventSubProcess" | "Pool" | "Lane" | "Annotation" | "Group" | "SubConversation" | "ChoreographyTask" | "SubChoreography" | "CallChoreography")[];
5
+ declare const BPMN_RESIZABLE_ELEMENT_TYPES: ("Task" | "UserTask" | "ServiceTask" | "ScriptTask" | "ManualTask" | "BusinessRuleTask" | "ReceiveTask" | "SendTask" | "CallActivity" | "SubProcess" | "Transaction" | "EventSubProcess" | "AdHocSubProcess" | "Pool" | "Lane" | "Annotation" | "Group" | "SubConversation" | "ChoreographyTask" | "SubChoreography" | "CallChoreography")[];
6
6
  declare function isBpmnElementResizable(type: BpmnElementType): boolean;
7
7
  declare function getBpmnElementSize(type: BpmnElementType): BpmnElementSize;
8
8
 
@@ -2,7 +2,7 @@ import { e as BpmnElementType, c as BpmnElementMeta, d as BpmnElementSize } from
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
5
- declare const BPMN_RESIZABLE_ELEMENT_TYPES: ("Task" | "UserTask" | "ServiceTask" | "ScriptTask" | "ManualTask" | "BusinessRuleTask" | "ReceiveTask" | "SendTask" | "CallActivity" | "SubProcess" | "Transaction" | "AdHocSubProcess" | "EventSubProcess" | "Pool" | "Lane" | "Annotation" | "Group" | "SubConversation" | "ChoreographyTask" | "SubChoreography" | "CallChoreography")[];
5
+ declare const BPMN_RESIZABLE_ELEMENT_TYPES: ("Task" | "UserTask" | "ServiceTask" | "ScriptTask" | "ManualTask" | "BusinessRuleTask" | "ReceiveTask" | "SendTask" | "CallActivity" | "SubProcess" | "Transaction" | "EventSubProcess" | "AdHocSubProcess" | "Pool" | "Lane" | "Annotation" | "Group" | "SubConversation" | "ChoreographyTask" | "SubChoreography" | "CallChoreography")[];
6
6
  declare function isBpmnElementResizable(type: BpmnElementType): boolean;
7
7
  declare function getBpmnElementSize(type: BpmnElementType): BpmnElementSize;
8
8
 
@@ -1,6 +1,6 @@
1
1
  import { acceptsBoundaryEvents, getHandlePolicy, isEventType, isGatewayType, isDataType } from './chunk-RLAJNRF2.js';
2
2
  import { isBpmnElementResizable, BPMN_ELEMENT_CATALOG, getBpmnElementSize } from './chunk-L5Z22RLX.js';
3
- import { createModelingRules, getNode, getOutgoingEdges, getIncomingEdges, patchNode, resizeNode, addNode, connectNodes, reparentNode, replaceNode, patchEdge, removeElements, copyElements, pasteElements, setSelection, createSelectionState, normalizeDiagramState, executeCommand, executeCommands } from '@aranzatech/diagrams-core';
3
+ import { createModelingRules, getNode, getOutgoingEdges, getIncomingEdges, getNodeSize, getNodeAbsolutePosition, toRelativeNodePosition, findContainingNode, getNodeCenterPosition, patchNode, resizeNode, addNode, connectNodes, reparentNode, replaceNode, patchEdge, removeElements, copyElements, pasteElements, setSelection, createSelectionState, normalizeDiagramState, executeCommand, executeCommands } from '@aranzatech/diagrams-core';
4
4
  import { createDiagramDocument, serializeDiagram, parseDiagramDocument, deserializeDiagram } from '@aranzatech/diagrams-core/serialization';
5
5
 
6
6
  function createBpmnNode(options) {
@@ -20,14 +20,30 @@ function createBpmnNode(options) {
20
20
  },
21
21
  width: options.width ?? size.width,
22
22
  height: options.height ?? size.height,
23
+ zIndex: getBpmnNodeZIndex(options.elementType),
23
24
  ...options.parentId ? { parentId: options.parentId } : {},
25
+ ...options.elementType === "Lane" && options.parentId ? { extent: "parent" } : {},
24
26
  ...dragHandle ? { dragHandle } : {}
25
27
  };
26
28
  }
29
+ function getBpmnNodeZIndex(elementType) {
30
+ if (elementType === "Pool") return 0;
31
+ if (elementType === "Lane") return 1;
32
+ if (elementType === "BoundaryEvent") return 4;
33
+ return 3;
34
+ }
35
+ function withBpmnNodeZIndexes(nodes) {
36
+ return nodes.map((node) => {
37
+ const zIndex = getBpmnNodeZIndex(node.data.elementType);
38
+ return node.zIndex === zIndex ? node : { ...node, zIndex };
39
+ });
40
+ }
27
41
  var BPMN_POOL_LANE_LAYOUT = {
28
42
  poolHeaderSize: 30,
29
43
  laneHeaderSize: 24,
30
- laneGap: 0
44
+ laneGap: 0,
45
+ verticalPoolHeaderSize: 28,
46
+ minLaneSize: 96
31
47
  };
32
48
  function getBpmnDragHandleSelector(elementType) {
33
49
  if (elementType === "Pool") return ".pool-drag-handle";
@@ -148,6 +164,116 @@ function getBpmnPoolLanes(state, poolId) {
148
164
  function getNodeDimension(node, axis) {
149
165
  return node[axis] ?? node.measured?.[axis] ?? getBpmnElementSize(node.data.elementType)[axis];
150
166
  }
167
+ function getBpmnLaneOrderPosition(lane, orientation) {
168
+ const size = getBpmnNodeSize(lane);
169
+ return orientation === "vertical" ? lane.position.x + size.width / 2 : lane.position.y + size.height / 2;
170
+ }
171
+ function resizeHorizontalBpmnLanes(lanes, pool) {
172
+ const poolSize = getBpmnNodeSize(pool);
173
+ const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width - BPMN_POOL_LANE_LAYOUT.poolHeaderSize);
174
+ const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height / Math.max(1, lanes.length));
175
+ return lanes.map((lane, index) => ({
176
+ ...lane,
177
+ position: { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: index * laneHeight },
178
+ width: laneWidth,
179
+ height: laneHeight,
180
+ parentId: pool.id,
181
+ extent: "parent",
182
+ zIndex: getBpmnNodeZIndex("Lane"),
183
+ data: { ...lane.data, orientation: "horizontal", laneIndex: index }
184
+ }));
185
+ }
186
+ function resizeVerticalBpmnLanes(lanes, pool) {
187
+ const poolSize = getBpmnNodeSize(pool);
188
+ const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width / Math.max(1, lanes.length));
189
+ const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height - BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize);
190
+ return lanes.map((lane, index) => ({
191
+ ...lane,
192
+ position: { x: index * laneWidth, y: BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize },
193
+ width: laneWidth,
194
+ height: laneHeight,
195
+ parentId: pool.id,
196
+ extent: "parent",
197
+ zIndex: getBpmnNodeZIndex("Lane"),
198
+ data: { ...lane.data, orientation: "vertical", laneIndex: index }
199
+ }));
200
+ }
201
+ function layoutBpmnPoolLaneNodes(nodes, poolId) {
202
+ const pool = nodes.find((node) => node.id === poolId && node.data.elementType === "Pool");
203
+ if (!pool) return nodes;
204
+ const orientation = pool.data.orientation === "vertical" ? "vertical" : "horizontal";
205
+ const lanes = nodes.filter((node) => node.parentId === pool.id && node.data.elementType === "Lane").sort((a, b) => {
206
+ const aIndex = typeof a.data.laneIndex === "number" ? a.data.laneIndex : void 0;
207
+ const bIndex = typeof b.data.laneIndex === "number" ? b.data.laneIndex : void 0;
208
+ if (aIndex !== void 0 || bIndex !== void 0) return (aIndex ?? 0) - (bIndex ?? 0);
209
+ return getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation);
210
+ });
211
+ if (lanes.length === 0) return withBpmnNodeZIndexes(nodes);
212
+ const laneMap = new Map(
213
+ (orientation === "vertical" ? resizeVerticalBpmnLanes(lanes, pool) : resizeHorizontalBpmnLanes(lanes, pool)).map((lane) => [lane.id, lane])
214
+ );
215
+ return withBpmnNodeZIndexes(nodes.map((node) => laneMap.get(node.id) ?? node));
216
+ }
217
+ function reorderBpmnLaneAfterDrop(nodes, laneId) {
218
+ const lane = nodes.find((node) => node.id === laneId && node.data.elementType === "Lane");
219
+ if (!lane?.parentId) return nodes;
220
+ const pool = nodes.find((node) => node.id === lane.parentId && node.data.elementType === "Pool");
221
+ if (!pool) return nodes;
222
+ const orientation = pool.data.orientation === "vertical" ? "vertical" : "horizontal";
223
+ const lanes = nodes.filter((node) => node.parentId === pool.id && node.data.elementType === "Lane").sort((a, b) => getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation));
224
+ const moved = lanes.find((candidate) => candidate.id === lane.id);
225
+ if (!moved) return layoutBpmnPoolLaneNodes(nodes, pool.id);
226
+ const withoutMoved = lanes.filter((candidate) => candidate.id !== lane.id);
227
+ const movedCenter = getBpmnLaneOrderPosition(lane, orientation);
228
+ const insertIndex = withoutMoved.findIndex(
229
+ (candidate) => movedCenter < getBpmnLaneOrderPosition(candidate, orientation)
230
+ );
231
+ const ordered = [...withoutMoved];
232
+ ordered.splice(insertIndex === -1 ? ordered.length : insertIndex, 0, moved);
233
+ const orderedMap = new Map(ordered.map((candidate, index) => [candidate.id, index]));
234
+ const sortedByDrop = nodes.map((node) => {
235
+ if (node.parentId !== pool.id || node.data.elementType !== "Lane") return node;
236
+ return { ...node, data: { ...node.data, laneIndex: orderedMap.get(node.id) ?? 0 } };
237
+ });
238
+ return layoutBpmnPoolLaneNodes(sortedByDrop, pool.id);
239
+ }
240
+ function getBpmnNodeSize(node) {
241
+ return getNodeSize(node, getBpmnElementSize(node.data.elementType));
242
+ }
243
+ function getBpmnNodeAbsolutePosition(state, nodeOrId) {
244
+ const nodeId = typeof nodeOrId === "string" ? nodeOrId : nodeOrId.id;
245
+ return getNodeAbsolutePosition(state, nodeId);
246
+ }
247
+ function toBpmnRelativePosition(state, absolutePosition, parentOrId) {
248
+ return toRelativeNodePosition(state, absolutePosition, parentOrId);
249
+ }
250
+ var BPMN_CONTAINER_PRIORITY = [
251
+ "Lane",
252
+ "SubProcess",
253
+ "EventSubProcess",
254
+ "Transaction",
255
+ "AdHocSubProcess",
256
+ "Pool"
257
+ ];
258
+ function findBpmnContainerAt(state, options) {
259
+ return findContainingNode(state, {
260
+ point: options.position,
261
+ excludeId: options.excludeId,
262
+ fallbackSize: (node) => getBpmnElementSize(node.data.elementType),
263
+ predicate: (node) => BPMN_CONTAINER_PRIORITY.includes(node.data.elementType),
264
+ sort: (a, b) => {
265
+ const aPriority = BPMN_CONTAINER_PRIORITY.indexOf(a.data.elementType);
266
+ const bPriority = BPMN_CONTAINER_PRIORITY.indexOf(b.data.elementType);
267
+ if (aPriority !== bPriority) return aPriority - bPriority;
268
+ const aSize = getBpmnNodeSize(a);
269
+ const bSize = getBpmnNodeSize(b);
270
+ return aSize.width * aSize.height - bSize.width * bSize.height;
271
+ }
272
+ });
273
+ }
274
+ function getBpmnNodeCenter(node, absolutePosition) {
275
+ return getNodeCenterPosition(absolutePosition, getBpmnNodeSize(node));
276
+ }
151
277
  function resolvePoolLaneDirection(pool) {
152
278
  return pool.data.orientation === "vertical" ? "horizontal" : "vertical";
153
279
  }
@@ -410,6 +536,19 @@ function reparentBpmnNodeCommand(options) {
410
536
  }
411
537
  };
412
538
  }
539
+ function reparentBpmnNodeAtPosition(state, options) {
540
+ const node = getNode(state, options.id);
541
+ if (!node) throw new Error(`Element "${options.id}" does not exist.`);
542
+ const hitPoint = getBpmnNodeCenter(node, options.position);
543
+ const parent = isBpmnProcessNode(node.data.elementType) ? findBpmnContainerAt(state, { position: hitPoint, excludeId: node.id }) : void 0;
544
+ const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);
545
+ if (containment !== true) throw new Error(containment);
546
+ const nextPosition = parent ? toBpmnRelativePosition(state, options.position, parent) : options.position;
547
+ return reparentNode(state, node.id, {
548
+ ...parent ? { parentId: parent.id } : { parentId: void 0 },
549
+ position: nextPosition
550
+ });
551
+ }
413
552
  function resizeBpmnNodeCommand(options) {
414
553
  return {
415
554
  id: `bpmn.resize.${options.id}`,
@@ -527,6 +666,6 @@ function runBpmnCommands(stack, commands, options = {}) {
527
666
  return executeCommands(stack, commands, options);
528
667
  }
529
668
 
530
- export { BPMN_EDGE_CONNECTION_RULES, BPMN_MODELING_RULES, BPMN_POOL_LANE_LAYOUT, BPMN_ROUTABLE_EDGE_TYPES, BPMN_SELECTION_STYLE, attachBoundaryEventCommand, bpmnConnectionValidators, canContainBpmnElement, connectBpmnCommand, copyBpmnElements, createBpmnDiagramDocument, createBpmnNode, createBpmnNodeCommand, deleteBpmnElementsCommand, deserializeBpmnDiagram, getBpmnDragHandleSelector, getBpmnLaneIndexAtPosition, getBpmnPoolLanes, inferBpmnEdgeType, isBpmnEdgeRoutingEditable, isBpmnProcessNode, layoutBpmnPoolLanes, moveBpmnLaneCommand, parseBpmnDiagramDocument, pasteBpmnElementsCommand, reorderBpmnLane, reorderBpmnLaneCommand, reparentBpmnNodeCommand, replaceBpmnNodeCommand, resizeBpmnNodeCommand, routeBpmnEdgeCommand, runBpmnCommand, runBpmnCommands, selectBpmnElementsCommand, serializeBpmnDiagram, validateBpmnConnectionForEdgeType };
531
- //# sourceMappingURL=chunk-YQTIODXH.js.map
532
- //# sourceMappingURL=chunk-YQTIODXH.js.map
669
+ export { BPMN_EDGE_CONNECTION_RULES, BPMN_MODELING_RULES, BPMN_POOL_LANE_LAYOUT, BPMN_ROUTABLE_EDGE_TYPES, BPMN_SELECTION_STYLE, attachBoundaryEventCommand, bpmnConnectionValidators, canContainBpmnElement, connectBpmnCommand, copyBpmnElements, createBpmnDiagramDocument, createBpmnNode, createBpmnNodeCommand, deleteBpmnElementsCommand, deserializeBpmnDiagram, findBpmnContainerAt, getBpmnDragHandleSelector, getBpmnLaneIndexAtPosition, getBpmnNodeAbsolutePosition, getBpmnNodeCenter, getBpmnNodeSize, getBpmnNodeZIndex, getBpmnPoolLanes, inferBpmnEdgeType, isBpmnEdgeRoutingEditable, isBpmnProcessNode, layoutBpmnPoolLaneNodes, layoutBpmnPoolLanes, moveBpmnLaneCommand, parseBpmnDiagramDocument, pasteBpmnElementsCommand, reorderBpmnLane, reorderBpmnLaneAfterDrop, reorderBpmnLaneCommand, reparentBpmnNodeAtPosition, reparentBpmnNodeCommand, replaceBpmnNodeCommand, resizeBpmnNodeCommand, routeBpmnEdgeCommand, runBpmnCommand, runBpmnCommands, selectBpmnElementsCommand, serializeBpmnDiagram, toBpmnRelativePosition, validateBpmnConnectionForEdgeType, withBpmnNodeZIndexes };
670
+ //# sourceMappingURL=chunk-7MKU37XQ.js.map
671
+ //# sourceMappingURL=chunk-7MKU37XQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modeling/index.ts"],"names":[],"mappings":"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","file":"chunk-7MKU37XQ.js","sourcesContent":["import {\n addNode,\n connectNodes,\n copyElements,\n createModelingRules,\n createSelectionState,\n executeCommand,\n executeCommands,\n findContainingNode,\n getNode,\n getNodeAbsolutePosition,\n getNodeCenterPosition,\n getNodeSize,\n getOutgoingEdges,\n getIncomingEdges,\n normalizeDiagramState,\n pasteElements,\n patchEdge,\n patchNode,\n removeElements,\n replaceNode,\n reparentNode,\n resizeNode,\n setSelection,\n toRelativeNodePosition,\n type CommandStackState,\n type ClipboardState,\n type ConnectionValidator,\n type DiagramCommand,\n type DiagramState,\n type ModelingRules,\n type SelectionState,\n} from \"@aranzatech/diagrams-core\";\nimport {\n createDiagramDocument,\n deserializeDiagram,\n parseDiagramDocument,\n serializeDiagram,\n type CreateDiagramDocumentOptions,\n type DiagramDocument,\n} from \"@aranzatech/diagrams-core/serialization\";\nimport {\n BPMN_ELEMENT_CATALOG,\n getBpmnElementSize,\n isBpmnElementResizable,\n} from \"../elements/catalog\";\nimport {\n acceptsBoundaryEvents,\n getHandlePolicy,\n isDataType,\n isEventType,\n isGatewayType,\n} from \"../elements/guards\";\nimport type { BpmnElementType, BpmnEdgeData, BpmnEdgeType, BpmnNodeData } from \"../elements/types\";\nimport type { BpmnRFEdge, BpmnRFNode } from \"../xml/types\";\n\nexport { getBpmnElementSize, isBpmnElementResizable } from \"../elements/catalog\";\n\nexport type BpmnDiagramState = DiagramState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnClipboardState = ClipboardState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnDiagramDocument = DiagramDocument<BpmnRFNode, BpmnRFEdge>;\n\nexport interface CreateBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n position: { x: number; y: number };\n label?: string;\n parentId?: string;\n width?: number;\n height?: number;\n data?: Partial<BpmnNodeData>;\n}\n\nexport interface ConnectBpmnOptions {\n id?: string;\n source: string;\n target: string;\n edgeType?: BpmnEdgeType;\n label?: string;\n sourceHandle?: string | null;\n targetHandle?: string | null;\n data?: Partial<BpmnEdgeData>;\n}\n\nexport interface ReplaceBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n label?: string;\n data?: Partial<BpmnNodeData>;\n width?: number;\n height?: number;\n}\n\nexport interface ReparentBpmnNodeOptions {\n id: string;\n parentId?: string;\n position?: { x: number; y: number };\n}\n\nexport interface FindBpmnContainerAtOptions {\n position: { x: number; y: number };\n excludeId?: string;\n}\n\nexport interface ReparentBpmnNodeAtPositionOptions {\n id: string;\n position: { x: number; y: number };\n}\n\nexport interface ResizeBpmnNodeOptions {\n id: string;\n width?: number;\n height?: number;\n}\n\nexport interface ReorderBpmnLaneOptions {\n poolId: string;\n laneId: string;\n index: number;\n}\n\nexport interface MoveBpmnLaneOptions {\n poolId: string;\n laneId: string;\n position: { x: number; y: number };\n}\n\nexport interface RouteBpmnEdgeOptions {\n id: string;\n routingPoints: Array<{ x: number; y: number }>;\n}\n\nexport interface PasteBpmnOptions {\n offset?: { x: number; y: number };\n position?: { x: number; y: number };\n}\n\nexport function createBpmnNode(options: CreateBpmnNodeOptions): BpmnRFNode {\n const size = getBpmnElementSize(options.elementType);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n const orientation = options.data?.orientation ?? meta.orientation;\n const dragHandle = getBpmnDragHandleSelector(options.elementType);\n return {\n id: options.id,\n type: options.elementType,\n position: options.position,\n data: {\n elementType: options.elementType,\n orientation,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n width: options.width ?? size.width,\n height: options.height ?? size.height,\n zIndex: getBpmnNodeZIndex(options.elementType),\n ...(options.parentId ? { parentId: options.parentId } : {}),\n ...(options.elementType === \"Lane\" && options.parentId ? { extent: \"parent\" as const } : {}),\n ...(dragHandle ? { dragHandle } : {}),\n };\n}\n\nexport function getBpmnNodeZIndex(elementType: BpmnElementType): number {\n if (elementType === \"Pool\") return 0;\n if (elementType === \"Lane\") return 1;\n if (elementType === \"BoundaryEvent\") return 4;\n return 3;\n}\n\nexport function withBpmnNodeZIndexes(\n nodes: BpmnRFNode[],\n): BpmnRFNode[] {\n return nodes.map((node) => {\n const zIndex = getBpmnNodeZIndex(node.data.elementType);\n return node.zIndex === zIndex ? node : { ...node, zIndex };\n });\n}\n\nexport const BPMN_POOL_LANE_LAYOUT = {\n poolHeaderSize: 30,\n laneHeaderSize: 24,\n laneGap: 0,\n verticalPoolHeaderSize: 28,\n minLaneSize: 96,\n} as const;\n\nexport function getBpmnDragHandleSelector(\n elementType: BpmnElementType,\n): string | undefined {\n if (elementType === \"Pool\") return \".pool-drag-handle\";\n if (elementType === \"Lane\") return \".lane-drag-handle\";\n return undefined;\n}\n\nexport const BPMN_SELECTION_STYLE = {\n nodeOutline: \"#2563eb\",\n edgeStroke: \"#2563eb\",\n handleFill: \"#ffffff\",\n handleStroke: \"#2563eb\",\n resizeHandleSize: 8,\n routingPointRadius: 5,\n} as const;\n\nexport const BPMN_ROUTABLE_EDGE_TYPES = [\n \"sequenceFlow\",\n \"messageFlow\",\n \"association\",\n \"dataAssociation\",\n \"conversationLink\",\n] satisfies BpmnEdgeType[];\n\nexport interface BpmnConnectionRule {\n edgeType: BpmnEdgeType;\n sourceCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n targetCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n allowSameParent?: boolean;\n allowDifferentParent?: boolean;\n}\n\nexport const BPMN_EDGE_CONNECTION_RULES: Record<BpmnEdgeType, BpmnConnectionRule> = {\n sequenceFlow: {\n edgeType: \"sequenceFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: false,\n },\n messageFlow: {\n edgeType: \"messageFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: false,\n allowDifferentParent: true,\n },\n association: {\n edgeType: \"association\",\n sourceCategories: [\"flowNode\", \"artifact\", \"data\"],\n targetCategories: [\"flowNode\", \"artifact\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n dataAssociation: {\n edgeType: \"dataAssociation\",\n sourceCategories: [\"flowNode\", \"data\"],\n targetCategories: [\"flowNode\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n conversationLink: {\n edgeType: \"conversationLink\",\n sourceCategories: [\"conversation\", \"flowNode\"],\n targetCategories: [\"conversation\", \"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n};\n\nexport function inferBpmnEdgeType(\n state: BpmnDiagramState,\n sourceId: string,\n targetId: string,\n): BpmnEdgeType {\n const source = getNode(state, sourceId);\n const target = getNode(state, targetId);\n if (!source || !target) return \"sequenceFlow\";\n\n if (isDataType(source.data.elementType) || isDataType(target.data.elementType)) {\n return \"dataAssociation\";\n }\n if (\n source.data.elementType === \"Annotation\" ||\n target.data.elementType === \"Annotation\" ||\n source.data.elementType === \"Group\" ||\n target.data.elementType === \"Group\"\n ) {\n return \"association\";\n }\n if (\n source.data.elementType === \"Conversation\" ||\n source.data.elementType === \"SubConversation\" ||\n source.data.elementType === \"CallConversation\" ||\n target.data.elementType === \"Conversation\" ||\n target.data.elementType === \"SubConversation\" ||\n target.data.elementType === \"CallConversation\"\n ) {\n return \"conversationLink\";\n }\n if (source.parentId && target.parentId && source.parentId !== target.parentId) {\n return \"messageFlow\";\n }\n return \"sequenceFlow\";\n}\n\nfunction canUseSequenceFlow(type: BpmnElementType): boolean {\n const meta = BPMN_ELEMENT_CATALOG[type];\n return (\n meta.handlePolicy !== \"none\" &&\n !isDataType(type) &&\n type !== \"Annotation\" &&\n type !== \"Group\" &&\n meta.category !== \"conversation\"\n );\n}\n\nfunction matchesConnectionCategory(\n type: BpmnElementType,\n categories: BpmnConnectionRule[\"sourceCategories\"],\n): boolean {\n return categories.some((category) => {\n if (category === type) return true;\n if (category === \"flowNode\") return canUseSequenceFlow(type);\n if (category === \"data\") return isDataType(type);\n if (category === \"artifact\") return type === \"Annotation\" || type === \"Group\";\n if (category === \"conversation\") return BPMN_ELEMENT_CATALOG[type].category === \"conversation\";\n return false;\n });\n}\n\nexport function isBpmnEdgeRoutingEditable(edgeType: BpmnEdgeType): boolean {\n return BPMN_ROUTABLE_EDGE_TYPES.includes(edgeType);\n}\n\nexport function isBpmnProcessNode(type: BpmnElementType): boolean {\n return (\n isEventType(type) ||\n isGatewayType(type) ||\n type.includes(\"Task\") ||\n type === \"CallActivity\" ||\n type === \"SubProcess\" ||\n type === \"Transaction\" ||\n type === \"EventSubProcess\" ||\n type === \"AdHocSubProcess\"\n );\n}\n\nexport function canContainBpmnElement(\n parentType: BpmnElementType | undefined,\n childType: BpmnElementType,\n): true | string {\n if (!parentType) return true;\n if (parentType === \"Pool\") {\n return childType === \"Lane\" || isBpmnProcessNode(childType)\n ? true\n : \"Pools can contain lanes or BPMN process nodes.\";\n }\n if (parentType === \"Lane\") {\n return isBpmnProcessNode(childType)\n ? true\n : \"Lanes can only contain BPMN process nodes.\";\n }\n if (\n parentType === \"SubProcess\" ||\n parentType === \"Transaction\" ||\n parentType === \"EventSubProcess\" ||\n parentType === \"AdHocSubProcess\"\n ) {\n return isBpmnProcessNode(childType)\n ? true\n : \"Subprocesses can only contain BPMN process nodes.\";\n }\n return `${parentType} cannot contain BPMN child elements.`;\n}\n\nfunction getDirectBpmnChildren(\n state: BpmnDiagramState,\n parentId: string,\n): BpmnRFNode[] {\n return state.nodes.filter((node) => node.parentId === parentId);\n}\n\nexport function getBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnRFNode[] {\n return getDirectBpmnChildren(state, poolId).filter(\n (node) => node.data.elementType === \"Lane\",\n );\n}\n\nfunction getNodeDimension(node: BpmnRFNode, axis: \"width\" | \"height\"): number {\n return node[axis] ?? node.measured?.[axis] ?? getBpmnElementSize(node.data.elementType)[axis];\n}\n\nfunction getBpmnLaneOrderPosition(\n lane: BpmnRFNode,\n orientation: \"horizontal\" | \"vertical\",\n): number {\n const size = getBpmnNodeSize(lane);\n return orientation === \"vertical\"\n ? lane.position.x + size.width / 2\n : lane.position.y + size.height / 2;\n}\n\nfunction resizeHorizontalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const poolSize = getBpmnNodeSize(pool);\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width - BPMN_POOL_LANE_LAYOUT.poolHeaderSize);\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height / Math.max(1, lanes.length));\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: index * laneHeight },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n extent: \"parent\" as const,\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"horizontal\", laneIndex: index },\n }));\n}\n\nfunction resizeVerticalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const poolSize = getBpmnNodeSize(pool);\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width / Math.max(1, lanes.length));\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height - BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize);\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: index * laneWidth, y: BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n extent: \"parent\" as const,\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"vertical\", laneIndex: index },\n }));\n}\n\nexport function layoutBpmnPoolLaneNodes(\n nodes: BpmnRFNode[],\n poolId: string,\n): BpmnRFNode[] {\n const pool = nodes.find((node) => node.id === poolId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => {\n const aIndex = typeof a.data.laneIndex === \"number\" ? a.data.laneIndex : undefined;\n const bIndex = typeof b.data.laneIndex === \"number\" ? b.data.laneIndex : undefined;\n if (aIndex !== undefined || bIndex !== undefined) return (aIndex ?? 0) - (bIndex ?? 0);\n return getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation);\n });\n\n if (lanes.length === 0) return withBpmnNodeZIndexes(nodes);\n\n const laneMap = new Map(\n (orientation === \"vertical\" ? resizeVerticalBpmnLanes(lanes, pool) : resizeHorizontalBpmnLanes(lanes, pool))\n .map((lane) => [lane.id, lane]),\n );\n\n return withBpmnNodeZIndexes(nodes.map((node) => laneMap.get(node.id) ?? node));\n}\n\nexport function reorderBpmnLaneAfterDrop(\n nodes: BpmnRFNode[],\n laneId: string,\n): BpmnRFNode[] {\n const lane = nodes.find((node) => node.id === laneId && node.data.elementType === \"Lane\");\n if (!lane?.parentId) return nodes;\n\n const pool = nodes.find((node) => node.id === lane.parentId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation));\n\n const moved = lanes.find((candidate) => candidate.id === lane.id);\n if (!moved) return layoutBpmnPoolLaneNodes(nodes, pool.id);\n\n const withoutMoved = lanes.filter((candidate) => candidate.id !== lane.id);\n const movedCenter = getBpmnLaneOrderPosition(lane, orientation);\n const insertIndex = withoutMoved.findIndex(\n (candidate) => movedCenter < getBpmnLaneOrderPosition(candidate, orientation),\n );\n const ordered = [...withoutMoved];\n ordered.splice(insertIndex === -1 ? ordered.length : insertIndex, 0, moved);\n\n const orderedMap = new Map(ordered.map((candidate, index) => [candidate.id, index]));\n const sortedByDrop = nodes.map((node) => {\n if (node.parentId !== pool.id || node.data.elementType !== \"Lane\") return node;\n return { ...node, data: { ...node.data, laneIndex: orderedMap.get(node.id) ?? 0 } };\n });\n\n return layoutBpmnPoolLaneNodes(sortedByDrop, pool.id);\n}\n\nexport function getBpmnNodeSize(node: BpmnRFNode): { width: number; height: number } {\n return getNodeSize(node, getBpmnElementSize(node.data.elementType));\n}\n\nexport function getBpmnNodeAbsolutePosition(\n state: BpmnDiagramState,\n nodeOrId: BpmnRFNode | string,\n): { x: number; y: number } | undefined {\n const nodeId = typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id;\n return getNodeAbsolutePosition(state, nodeId);\n}\n\nexport function toBpmnRelativePosition(\n state: BpmnDiagramState,\n absolutePosition: { x: number; y: number },\n parentOrId: BpmnRFNode | string,\n): { x: number; y: number } {\n return toRelativeNodePosition(state, absolutePosition, parentOrId);\n}\n\nconst BPMN_CONTAINER_PRIORITY: BpmnElementType[] = [\n \"Lane\",\n \"SubProcess\",\n \"EventSubProcess\",\n \"Transaction\",\n \"AdHocSubProcess\",\n \"Pool\",\n];\n\nexport function findBpmnContainerAt(\n state: BpmnDiagramState,\n options: FindBpmnContainerAtOptions,\n): BpmnRFNode | undefined {\n return findContainingNode(state, {\n point: options.position,\n excludeId: options.excludeId,\n fallbackSize: (node) => getBpmnElementSize(node.data.elementType),\n predicate: (node) => BPMN_CONTAINER_PRIORITY.includes(node.data.elementType),\n sort: (a, b) => {\n const aPriority = BPMN_CONTAINER_PRIORITY.indexOf(a.data.elementType);\n const bPriority = BPMN_CONTAINER_PRIORITY.indexOf(b.data.elementType);\n if (aPriority !== bPriority) return aPriority - bPriority;\n const aSize = getBpmnNodeSize(a);\n const bSize = getBpmnNodeSize(b);\n return aSize.width * aSize.height - bSize.width * bSize.height;\n },\n });\n}\n\nexport function getBpmnNodeCenter(\n node: BpmnRFNode,\n absolutePosition: { x: number; y: number },\n): { x: number; y: number } {\n return getNodeCenterPosition(absolutePosition, getBpmnNodeSize(node));\n}\n\nfunction resolvePoolLaneDirection(pool: BpmnRFNode): \"horizontal\" | \"vertical\" {\n return pool.data.orientation === \"vertical\" ? \"horizontal\" : \"vertical\";\n}\n\nexport function getBpmnLaneIndexAtPosition(\n state: BpmnDiagramState,\n poolId: string,\n position: { x: number; y: number },\n): number {\n const pool = getNode(state, poolId);\n if (!pool) return 0;\n const lanes = getBpmnPoolLanes(state, poolId);\n const direction = resolvePoolLaneDirection(pool);\n const axis = direction === \"vertical\" ? \"y\" : \"x\";\n const sizeKey = direction === \"vertical\" ? \"height\" : \"width\";\n\n for (let index = 0; index < lanes.length; index += 1) {\n const lane = lanes[index];\n const midpoint = lane.position[axis] + getNodeDimension(lane, sizeKey) / 2;\n if (position[axis] < midpoint) return index;\n }\n return lanes.length;\n}\n\nfunction sortBpmnLanes(\n state: BpmnDiagramState,\n poolId: string,\n laneId: string,\n index: number,\n): BpmnDiagramState {\n const lanes = getBpmnPoolLanes(state, poolId);\n const currentIndex = lanes.findIndex((lane) => lane.id === laneId);\n if (currentIndex < 0) return state;\n\n const orderedIds = lanes.map((lane) => lane.id);\n const [moved] = orderedIds.splice(currentIndex, 1);\n orderedIds.splice(Math.max(0, Math.min(index, orderedIds.length)), 0, moved);\n const order = new Map(orderedIds.map((id, laneIndex) => [id, laneIndex]));\n\n return {\n ...state,\n nodes: [...state.nodes].sort((a, b) => {\n const aOrder = order.get(a.id);\n const bOrder = order.get(b.id);\n if (aOrder === undefined && bOrder === undefined) return 0;\n if (aOrder === undefined) return -1;\n if (bOrder === undefined) return 1;\n return aOrder - bOrder;\n }),\n };\n}\n\nexport function layoutBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnDiagramState {\n const pool = getNode(state, poolId);\n if (!pool) return state;\n const poolSize = getBpmnElementSize(\"Pool\");\n const direction = resolvePoolLaneDirection(pool);\n const lanes = getBpmnPoolLanes(state, poolId);\n let cursor = direction === \"vertical\" ? BPMN_POOL_LANE_LAYOUT.poolHeaderSize : 0;\n\n let next = state;\n for (const lane of lanes) {\n const laneSize = getBpmnElementSize(\"Lane\");\n const width =\n direction === \"vertical\"\n ? Math.max(poolSize.minWidth - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.width ?? laneSize.width)\n : lane.width ?? laneSize.width;\n const height =\n direction === \"vertical\"\n ? lane.height ?? laneSize.height\n : Math.max(poolSize.minHeight - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.height ?? laneSize.height);\n next = patchNode(next, lane.id, {\n position: direction === \"vertical\" ? { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: cursor } : { x: cursor, y: BPMN_POOL_LANE_LAYOUT.poolHeaderSize },\n width,\n height,\n data: { orientation: pool.data.orientation ?? \"horizontal\" },\n });\n cursor += (direction === \"vertical\" ? height : width) + BPMN_POOL_LANE_LAYOUT.laneGap;\n }\n\n const minWidth =\n direction === \"vertical\"\n ? poolSize.minWidth\n : Math.max(poolSize.minWidth, cursor);\n const minHeight =\n direction === \"vertical\"\n ? Math.max(poolSize.minHeight, cursor)\n : poolSize.minHeight;\n return resizeNode(next, poolId, { width: minWidth, height: minHeight } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n}\n\nexport function reorderBpmnLane(\n state: BpmnDiagramState,\n options: ReorderBpmnLaneOptions,\n): BpmnDiagramState {\n return layoutBpmnPoolLanes(\n sortBpmnLanes(state, options.poolId, options.laneId, options.index),\n options.poolId,\n );\n}\n\nexport function validateBpmnConnectionForEdgeType(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n const rule = BPMN_EDGE_CONNECTION_RULES[edgeType];\n if (!matchesConnectionCategory(source.data.elementType, rule.sourceCategories)) {\n return `${edgeType} cannot start from ${source.data.elementType}.`;\n }\n if (!matchesConnectionCategory(target.data.elementType, rule.targetCategories)) {\n return `${edgeType} cannot target ${target.data.elementType}.`;\n }\n const sameParent = (source.parentId ?? null) === (target.parentId ?? null);\n if (sameParent && rule.allowSameParent === false) {\n return `${edgeType} must connect BPMN elements in different participants/scopes.`;\n }\n if (!sameParent && rule.allowDifferentParent === false) {\n return `${edgeType} must stay inside the same BPMN participant/scope.`;\n }\n if (edgeType === \"sequenceFlow\") {\n if (source.data.elementType === \"EndEvent\") return \"End events cannot have outgoing sequence flows.\";\n if (target.data.elementType === \"StartEvent\") return \"Start events cannot have incoming sequence flows.\";\n return validateEdgeCardinality(state, edgeType, source, target);\n }\n return true;\n}\n\nfunction validateEdgeCardinality(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n if (edgeType !== \"sequenceFlow\") return true;\n\n const sourceMax = BPMN_ELEMENT_CATALOG[source.data.elementType].maxOutgoing;\n const targetMax = BPMN_ELEMENT_CATALOG[target.data.elementType].maxIncoming;\n const outgoing = getOutgoingEdges(state, source.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n const incoming = getIncomingEdges(state, target.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n\n if (sourceMax !== undefined && outgoing.length >= sourceMax) {\n return `${source.data.elementType} cannot have more than ${sourceMax} outgoing sequence flow(s).`;\n }\n if (targetMax !== undefined && incoming.length >= targetMax) {\n return `${target.data.elementType} cannot have more than ${targetMax} incoming sequence flow(s).`;\n }\n return true;\n}\n\nexport const bpmnConnectionValidators: Array<\n ConnectionValidator<BpmnRFNode, BpmnRFEdge>\n> = [\n ({ state, source, target }) => {\n if (source.id === target.id) return \"BPMN self-connections are not allowed.\";\n const edgeType = inferBpmnEdgeType(state, source.id, target.id);\n\n if (getHandlePolicy(source.data.elementType) === \"none\" || getHandlePolicy(target.data.elementType) === \"none\") {\n return \"Elements without BPMN connection handles cannot be directly connected.\";\n }\n\n if (edgeType === \"sequenceFlow\") {\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n }\n\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n },\n];\n\nexport const BPMN_MODELING_RULES: ModelingRules<BpmnRFNode, BpmnRFEdge> =\n createModelingRules({\n connect: [\n ({ state, source, target }) => {\n if (!source || !target) return false;\n for (const validator of bpmnConnectionValidators) {\n const result = validator({\n state,\n source,\n target,\n existingEdges: state.edges,\n });\n if (result !== true) return result;\n }\n return true;\n },\n ],\n drop: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be attached to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent.data.elementType, node.data.elementType);\n },\n ],\n reparent: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be reparented to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n },\n ],\n delete: [() => true],\n resize: [\n ({ node }) =>\n !node || isBpmnElementResizable(node.data.elementType)\n ? true\n : `${node.data.elementType} is not resizable in BPMN.`,\n ],\n });\n\nexport function createBpmnNodeCommand(\n options: CreateBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.createNode.${options.id}`,\n label: `Create ${options.elementType}`,\n execute: (state) => addNode(state, createBpmnNode(options)),\n };\n}\n\nexport function connectBpmnCommand(\n options: ConnectBpmnOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.connect.${options.id ?? `${options.source}-${options.target}`}`,\n label: \"Connect BPMN elements\",\n execute: (state) => {\n const edgeType = options.edgeType ?? inferBpmnEdgeType(state, options.source, options.target);\n const source = getNode(state, options.source);\n const target = getNode(state, options.target);\n if (!source) throw new Error(`Source node \"${options.source}\" does not exist.`);\n if (!target) throw new Error(`Target node \"${options.target}\" does not exist.`);\n const validation = validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n if (validation !== true) throw new Error(validation);\n return connectNodes(\n state,\n {\n source: options.source,\n target: options.target,\n type: edgeType,\n ...(options.sourceHandle !== undefined\n ? { sourceHandle: options.sourceHandle }\n : {}),\n ...(options.targetHandle !== undefined\n ? { targetHandle: options.targetHandle }\n : {}),\n ...(options.id ? { id: options.id } : {}),\n data: {\n edgeType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n },\n [],\n );\n },\n };\n}\n\nexport function attachBoundaryEventCommand(\n boundaryId: string,\n hostId: string,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.attachBoundary.${boundaryId}.${hostId}`,\n label: \"Attach boundary event\",\n execute: (state) => {\n const host = getNode(state, hostId);\n if (!host || !acceptsBoundaryEvents(host.data.elementType)) {\n throw new Error(`Element \"${hostId}\" cannot host boundary events.`);\n }\n const boundary = getNode(state, boundaryId);\n if (!boundary || boundary.data.elementType !== \"BoundaryEvent\") {\n throw new Error(`Element \"${boundaryId}\" is not a boundary event.`);\n }\n const reparented = reparentNode(state, boundaryId, { parentId: hostId });\n return patchNode(reparented, boundaryId, {\n data: { attachedToRef: hostId },\n });\n },\n };\n}\n\nexport function replaceBpmnNodeCommand(\n options: ReplaceBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.replaceNode.${options.id}.${options.elementType}`,\n label: `Replace with ${options.elementType}`,\n execute: (state) => {\n const current = getNode(state, options.id);\n if (!current) throw new Error(`Element \"${options.id}\" does not exist.`);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n return replaceNode(state, options.id, {\n ...current,\n type: options.elementType,\n width: options.width ?? current.width ?? meta.defaultWidth,\n height: options.height ?? current.height ?? meta.defaultHeight,\n data: {\n ...current.data,\n elementType: options.elementType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n });\n },\n };\n}\n\nexport function reparentBpmnNodeCommand(\n options: ReparentBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reparent.${options.id}.${options.parentId ?? \"root\"}`,\n label: \"Reparent BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n const parent = options.parentId ? getNode(state, options.parentId) : undefined;\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n if (parent && node.data.elementType === \"BoundaryEvent\" && !acceptsBoundaryEvents(parent.data.elementType)) {\n throw new Error(\"Boundary events can only be reparented to tasks or subprocesses.\");\n }\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n const reparented = reparentNode(state, options.id, {\n ...(options.parentId !== undefined ? { parentId: options.parentId } : {}),\n ...(options.position ? { position: options.position } : {}),\n });\n return parent?.data.elementType === \"Pool\" && node.data.elementType === \"Lane\"\n ? layoutBpmnPoolLanes(reparented, parent.id)\n : reparented;\n },\n };\n}\n\nexport function reparentBpmnNodeAtPosition(\n state: BpmnDiagramState,\n options: ReparentBpmnNodeAtPositionOptions,\n): BpmnDiagramState {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n\n const hitPoint = getBpmnNodeCenter(node, options.position);\n const parent = isBpmnProcessNode(node.data.elementType)\n ? findBpmnContainerAt(state, { position: hitPoint, excludeId: node.id })\n : undefined;\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n\n const nextPosition = parent\n ? toBpmnRelativePosition(state, options.position, parent)\n : options.position;\n return reparentNode(state, node.id, {\n ...(parent ? { parentId: parent.id } : { parentId: undefined }),\n position: nextPosition,\n });\n}\n\nexport function resizeBpmnNodeCommand(\n options: ResizeBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.resize.${options.id}`,\n label: \"Resize BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n const size = getBpmnElementSize(node.data.elementType);\n if (!size.resizable) {\n throw new Error(`${node.data.elementType} is not resizable in BPMN.`);\n }\n return resizeNode(state, options.id, {\n width:\n options.width === undefined\n ? undefined\n : Math.max(size.minWidth, options.width),\n height:\n options.height === undefined\n ? undefined\n : Math.max(size.minHeight, options.height),\n } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n },\n };\n}\n\nexport function reorderBpmnLaneCommand(\n options: ReorderBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reorderLane.${options.poolId}.${options.laneId}`,\n label: \"Reorder BPMN lane\",\n execute: (state) => {\n const pool = getNode(state, options.poolId);\n const lane = getNode(state, options.laneId);\n if (!pool || pool.data.elementType !== \"Pool\") {\n throw new Error(`Element \"${options.poolId}\" is not a pool.`);\n }\n if (!lane || lane.data.elementType !== \"Lane\" || lane.parentId !== options.poolId) {\n throw new Error(`Element \"${options.laneId}\" is not a lane in pool \"${options.poolId}\".`);\n }\n return reorderBpmnLane(state, options);\n },\n };\n}\n\nexport function moveBpmnLaneCommand(\n options: MoveBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.moveLane.${options.poolId}.${options.laneId}`,\n label: \"Move BPMN lane\",\n execute: (state) =>\n reorderBpmnLane(state, {\n poolId: options.poolId,\n laneId: options.laneId,\n index: getBpmnLaneIndexAtPosition(state, options.poolId, options.position),\n }),\n };\n}\n\nexport function routeBpmnEdgeCommand(\n options: RouteBpmnEdgeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.routeEdge.${options.id}`,\n label: \"Route BPMN edge\",\n execute: (state) => {\n const edge = state.edges.find((item) => item.id === options.id);\n if (!edge) throw new Error(`Edge \"${options.id}\" does not exist.`);\n const edgeType = edge.data?.edgeType;\n if (!edgeType || !isBpmnEdgeRoutingEditable(edgeType)) {\n throw new Error(`${edgeType ?? \"edge\"} routing points cannot be edited.`);\n }\n return patchEdge(state, options.id, {\n data: { routingPoints: options.routingPoints },\n } as Parameters<typeof patchEdge<BpmnRFNode, BpmnRFEdge>>[2]);\n },\n };\n}\n\nexport function deleteBpmnElementsCommand(\n ids: string[],\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.delete.${ids.join(\".\")}`,\n label: \"Delete BPMN elements\",\n execute: (state) => removeElements(state, ids),\n };\n}\n\nexport function copyBpmnElements(\n state: BpmnDiagramState,\n selection?: SelectionState,\n): BpmnClipboardState {\n return copyElements(state, selection);\n}\n\nexport function pasteBpmnElementsCommand(\n clipboard: BpmnClipboardState,\n options: PasteBpmnOptions = {},\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.paste\",\n label: \"Paste BPMN elements\",\n execute: (state) => pasteElements(state, clipboard, options),\n };\n}\n\nexport function selectBpmnElementsCommand(\n selection: SelectionState,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.select\",\n label: \"Select BPMN elements\",\n execute: (state) => setSelection(state, createSelectionState(selection.nodeIds, selection.edgeIds)),\n };\n}\n\nexport function createBpmnDiagramDocument(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> = {},\n): BpmnDiagramDocument {\n return createDiagramDocument(normalizeDiagramState(state), {\n ...options,\n diagramType: \"bpmn\",\n });\n}\n\nexport function serializeBpmnDiagram(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> = {},\n): string {\n return serializeDiagram(normalizeDiagramState(state), {\n ...options,\n diagramType: \"bpmn\",\n });\n}\n\nexport function parseBpmnDiagramDocument(json: string): BpmnDiagramDocument {\n const document = parseDiagramDocument<BpmnRFNode, BpmnRFEdge>(json);\n if (document.diagramType && document.diagramType !== \"bpmn\") {\n throw new Error(`Expected a BPMN diagram document, received \"${document.diagramType}\".`);\n }\n return document;\n}\n\nexport function deserializeBpmnDiagram(json: string): BpmnDiagramState {\n const document = parseBpmnDiagramDocument(json);\n return deserializeDiagram<BpmnRFNode, BpmnRFEdge>(JSON.stringify(document));\n}\n\nexport function runBpmnCommand(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n command: DiagramCommand<BpmnRFNode, BpmnRFEdge>,\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n return executeCommand(stack, command);\n}\n\nexport function runBpmnCommands(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n commands: Array<DiagramCommand<BpmnRFNode, BpmnRFEdge>>,\n options: { id?: string; label?: string } = {},\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n return executeCommands(stack, commands, options);\n}\n"]}
@@ -75,7 +75,13 @@ function isManual(nodeType) {
75
75
  return TASK_TYPES.has(nodeType) || nodeType === "IntermediateCatchEvent" || nodeType === "BoundaryEvent";
76
76
  }
77
77
  function isSubProcess(nodeType) {
78
- return nodeType === "SubProcess" || nodeType === "Transaction" || nodeType === "AdHocSubProcess";
78
+ return nodeType === "SubProcess" || nodeType === "Transaction" || nodeType === "EventSubProcess" || nodeType === "AdHocSubProcess";
79
+ }
80
+ function isRootProcessStart(diagram, node) {
81
+ if (node.type !== "StartEvent") return false;
82
+ if (!node.parentId) return true;
83
+ const parent = nodeById(diagram, node.parentId);
84
+ return !parent || !isSubProcess(parent.type);
79
85
  }
80
86
  function getScopeId(diagram, nodeId) {
81
87
  const node = nodeById(diagram, nodeId);
@@ -311,9 +317,7 @@ function fireAutomatic(diagram, state, token) {
311
317
  }
312
318
  function createSimulation(diagram, initialVariables = {}) {
313
319
  _tokenCounter = 0;
314
- const startEvents = diagram.nodes.filter(
315
- (n) => n.type === "StartEvent" && !n.parentId
316
- );
320
+ const startEvents = diagram.nodes.filter((n) => isRootProcessStart(diagram, n));
317
321
  const tokens = startEvents.map((n) => ({
318
322
  id: nextTokenId(),
319
323
  elementId: n.id,
@@ -472,5 +476,5 @@ function setVariable(state, key, value) {
472
476
  }
473
477
 
474
478
  export { createSimulation, fire, getFireable, isCompleted, setVariable, tick };
475
- //# sourceMappingURL=chunk-57LA2WSJ.js.map
476
- //# sourceMappingURL=chunk-57LA2WSJ.js.map
479
+ //# sourceMappingURL=chunk-QOGZITWB.js.map
480
+ //# sourceMappingURL=chunk-QOGZITWB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/simulation/evaluator.ts","../src/simulation/index.ts"],"names":["next"],"mappings":";AAEA,SAAS,WAAW,GAAA,EAAwC;AAC1D,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,IAAA;AAC3B,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,KAAA;AAC5B,EAAA,IAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,IAAI,QAAA,CAAS,GAAG,CAAA,IAAO,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,GAAA,CAAI,SAAS,GAAG,CAAA;AACxF,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,OAAO,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA;AAC1B;AAMO,SAAS,aAAA,CAAc,MAAc,SAAA,EAAkC;AAC5E,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK,CAAE,QAAQ,YAAA,EAAc,EAAE,EAAE,IAAA,EAAK;AACxD,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAGlB,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACjC,IAAA,OAAO,CAAC,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC5C,EAAA,IAAI,KAAK,OAAO,MAAA,CAAO,UAAU,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,CAAC,CAAA,KAAM,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAGrF,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,qBAAqB,CAAA;AAC3C,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,MAAM,SAAA,CAAU,EAAA,CAAG,CAAC,CAAA,CAAE,MAAM,CAAA;AAClC,IAAA,MAAM,MAAM,UAAA,CAAW,EAAA,CAAG,CAAC,CAAA,CAAE,MAAM,CAAA;AAEnC,IAAA,OAAO,GAAA,IAAO,GAAA;AAAA,EAChB;AAGA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,8BAA8B,CAAA;AACrD,EAAA,IAAI,GAAA,EAAK,OAAO,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAGjE,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,8BAA8B,CAAA;AACrD,EAAA,IAAI,GAAA,EAAK,OAAO,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,IAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAGjE,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,6BAA6B,CAAA;AACnD,EAAA,IAAI,EAAA,EAAI,OAAO,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAG7D,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,6BAA6B,CAAA;AACnD,EAAA,IAAI,EAAA,EAAI,OAAO,MAAA,CAAO,SAAA,CAAU,GAAG,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA,GAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA;AAG7D,EAAA,OAAO,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAC,CAAA;AAChC;;;ACkBA,SAAS,MAAA,CAAO,SAAqB,MAAA,EAA2B;AAC9D,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,cAAA,IAAkB,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AACrF;AAEA,SAAS,KAAA,CAAM,SAAqB,MAAA,EAA2B;AAC7D,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,cAAA,IAAkB,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AACrF;AAEA,SAAS,QAAA,CAAS,SAAqB,EAAA,EAAiC;AACtE,EAAA,OAAO,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C;AAGA,SAAS,gBAAA,CAAiB,SAAqB,MAAA,EAA2B;AACxE,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,eAAA,IAAmB,CAAA,CAAE,aAAA,KAAkB,MAAM,CAAA;AAC7F;AAEA,IAAI,aAAA,GAAgB,CAAA;AACpB,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO,CAAA,IAAA,EAAO,EAAE,aAAa,CAAA,CAAA;AAC/B;AAIA,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,OACE,QAAA,KAAa,gBACb,QAAA,KAAa,UAAA,IACb,aAAa,wBAAA,IACb,aAAA,CAAc,IAAI,QAAQ,CAAA;AAE9B;AAEA,SAAS,SAAS,QAAA,EAA2B;AAC3C,EAAA,OACE,WAAW,GAAA,CAAI,QAAQ,CAAA,IACvB,QAAA,KAAa,4BACb,QAAA,KAAa,eAAA;AAEjB;AAEA,SAAS,aAAa,QAAA,EAA2B;AAC/C,EAAA,OACE,aAAa,YAAA,IACb,QAAA,KAAa,aAAA,IACb,QAAA,KAAa,qBACb,QAAA,KAAa,iBAAA;AAEjB;AAEA,SAAS,kBAAA,CAAmB,SAAqB,IAAA,EAAwB;AACvE,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,YAAA,EAAc,OAAO,KAAA;AACvC,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAA;AAC9C,EAAA,OAAO,CAAC,MAAA,IAAU,CAAC,YAAA,CAAa,OAAO,IAAI,CAAA;AAC7C;AAQA,SAAS,UAAA,CAAW,SAAqB,MAAA,EAAwB;AAC/D,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AACrC,EAAA,IAAI,CAAC,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,QAAQ,CAAA;AAC9C,EAAA,OAAO,UAAU,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,GAAI,KAAK,QAAA,GAAW,MAAA;AAC/D;AAIA,SAAS,OAAA,CACP,OACA,KAAA,EACiB;AACjB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,GAAA,EAAK,CAAC,GAAG,KAAA,CAAM,GAAA,EAAK,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA,EAAE;AACzE;AAOA,SAAS,iBAAA,CACP,OAAA,EACA,KAAA,EACA,QAAA,EACA,eAAA,EACiB;AACjB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,EAAS,QAAQ,CAAA;AACzC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAElC,EAAA,IAAI,IAAA,GAAwB;AAAA,IAC1B,GAAG,KAAA;AAAA,IACH,MAAA,EACE,eAAA,KAAoB,IAAA,GAChB,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,GACnD,KAAA,CAAM;AAAA,GACd;AAEA,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAI,WAAA,EAAY;AAAA,MAChB,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,MAAM;AAAA,KAC1C;AACA,IAAA,IAAA,GAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,QAAQ,QAAQ;AAAA,KACnC;AACA,IAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,SAAA;AAAA,MACN,WAAW,IAAA,CAAK,MAAA;AAAA,MAChB,SAAS,QAAA,CAAS,EAAA;AAAA,MAClB,OAAA,EAAS,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,IAAQ,KAAK,MAAM,CAAA,EAAA;AAAA,KACzD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,eAAA,CACP,OAAA,EACA,KAAA,EACA,WAAA,EACiB;AACjB,EAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,CAAM,MAAA;AAAA,IAChC,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAA,IAAgB,CAAA,CAAE,aAAa,WAAA,CAAY;AAAA,GAC/D;AAEA,EAAA,IAAI,IAAA,GAAwB;AAAA,IAC1B,GAAG,KAAA;AAAA,IACH,eAAe,CAAC,GAAG,KAAA,CAAM,aAAA,EAAe,YAAY,EAAE;AAAA,GACxD;AAEA,EAAA,KAAA,MAAW,aAAa,WAAA,EAAa;AACnC,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAI,WAAA,EAAY;AAAA,MAChB,WAAW,SAAA,CAAU,EAAA;AAAA,MACrB,SAAS,WAAA,CAAY;AAAA,KACvB;AACA,IAAA,IAAA,GAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,QAAQ,QAAQ;AAAA,KACnC;AACA,IAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,SAAA;AAAA,MACN,WAAW,SAAA,CAAU,EAAA;AAAA,MACrB,SAAS,QAAA,CAAS,EAAA;AAAA,MAClB,OAAA,EAAS,CAAA,YAAA,EAAe,WAAA,CAAY,IAAA,IAAQ,WAAA,CAAY,EAAE,CAAA,2BAAA,EAAyB,SAAA,CAAU,IAAA,IAAQ,SAAA,CAAU,EAAE,CAAA,EAAA;AAAA,KAClH,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,aAAA,CACP,OAAA,EACA,KAAA,EACA,KAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,MAAM,EAAE,MAAK,GAAI,IAAA;AACjB,EAAA,MAAM,OAAO,KAAA,CAAM,SAAA;AAGnB,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,IAAI,IAAA,GAAwB;AAAA,MAC1B,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAE;AAAA,KACtD;AACA,IAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,UAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,EAAA;AAAA,KAC9D,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,KAAS,YAAA,IAAgB,IAAA,KAAS,wBAAA,EAA0B;AAC9D,IAAA,IAAI,IAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,EAAE,MAAM,IAAI,CAAA,QAAA;AAAA,KAC5C,CAAA;AACD,IAAA,OAAO,kBAAkB,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACvC,IAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAExB,MAAA,IAAIA,KAAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,QACxB,IAAA,EAAM,QAAA;AAAA,QACN,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,mCAAA;AAAA,OACnD,CAAA;AACD,MAAA,OAAO,kBAAkB,OAAA,EAASA,KAAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAExC,IAAA,MAAM,SACJ,QAAA,CAAS,IAAA;AAAA,MACP,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAA,IAAuB,CAAC,EAAE,SAAA,IAAa,aAAA,CAAc,CAAA,CAAE,mBAAA,EAAqB,IAAI;AAAA,KAC3F,IACA,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAS,CAAA,IAChC,QAAA,CAAS,CAAC,CAAA;AAEZ,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAI,WAAA,EAAY;AAAA,MAChB,WAAW,MAAA,CAAO,MAAA;AAAA,MAClB,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,MAAM;AAAA,KAC5C;AACA,IAAA,IAAI,IAAA,GAAwB;AAAA,MAC1B,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAE,GAAG,QAAQ;AAAA,KACrE;AACA,IAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,gBAAA,EAAc,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,MAAM,CAAA,EAAA;AAAA,KAC7F,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACvC,IAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAExB,MAAA,IAAIA,KAAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,QACxB,IAAA,EAAM,QAAA;AAAA,QACN,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,OAAA,EAAS,CAAA,kBAAA,EAAqB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,OAAA;AAAA,OACnD,CAAA;AACD,MAAA,OAAO,kBAAkB,OAAA,EAASA,KAAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AAExC,IAAA,MAAM,WAAW,QAAA,CAAS,MAAA;AAAA,MACxB,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAA,IAAuB,CAAC,EAAE,SAAA,IAAa,aAAA,CAAc,CAAA,CAAE,mBAAA,EAAqB,IAAI;AAAA,KAC3F;AACA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA;AACvF,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,QAAA;AAErD,IAAA,IAAI,IAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,qBAAqB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,eAAA,EAAa,MAAM,MAAM,CAAA,SAAA;AAAA,KAC5E,CAAA;AAED,IAAA,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAE,CAAA,EAAE;AACvE,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,IAAA,CAAK,MAAM,CAAA;AACzC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,QAAA,GAAqB;AAAA,QACzB,IAAI,WAAA,EAAY;AAAA,QAChB,WAAW,IAAA,CAAK,MAAA;AAAA,QAChB,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,MAAM;AAAA,OAC1C;AACA,MAAA,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,EAAE;AACrD,MAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,QACnB,IAAA,EAAM,SAAA;AAAA,QACN,WAAW,IAAA,CAAK,MAAA;AAAA,QAChB,SAAS,QAAA,CAAS,EAAA;AAAA,QAClB,OAAA,EAAS,CAAA,kBAAA,EAAqB,GAAA,CAAI,IAAA,IAAQ,KAAK,MAAM,CAAA,EAAA;AAAA,OACtD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACvC,IAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,IAAA,CAAK,EAAE,CAAA;AACpE,MAAA,IAAI,SAAA,CAAU,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ;AACtC,QAAA,OAAO,QAAQ,KAAA,EAAO;AAAA,UACpB,IAAA,EAAM,SAAA;AAAA,UACN,WAAW,IAAA,CAAK,EAAA;AAAA,UAChB,SAAS,KAAA,CAAM,EAAA;AAAA,UACf,OAAA,EAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,cAAA,EAAiB,QAAA,CAAS,MAAA,GAAS,SAAA,CAAU,MAAM,CAAA,eAAA;AAAA,SACrG,CAAA;AAAA,MACH;AACA,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACrD,MAAA,IAAIA,KAAAA,GAAwB;AAAA,QAC1B,GAAG,KAAA;AAAA,QACH,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC;AAAA,OAC1D;AACA,MAAAA,KAAAA,GAAO,QAAQA,KAAAA,EAAM;AAAA,QACnB,IAAA,EAAM,QAAA;AAAA,QACN,WAAW,IAAA,CAAK,EAAA;AAAA,QAChB,OAAA,EAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,2CAAA;AAAA,OAClD,CAAA;AACD,MAAA,OAAO,iBAAA,CAAkB,OAAA,EAASA,KAAAA,EAAM,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,IAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,eAAA,EAAa,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA,CAAE,MAAM,CAAA,OAAA;AAAA,KAC9F,CAAA;AACD,IAAA,OAAO,kBAAkB,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAAA,EAC3D;AAIA,EAAA,IAAI,SAAS,mBAAA,EAAqB;AAChC,IAAA,IAAI,IAAA,GAAO,QAAQ,KAAA,EAAO;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAA,iBAAA,EAAe,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA,CAAE,MAAM,CAAA,oBAAA;AAAA,KAClG,CAAA;AACD,IAAA,OAAO,kBAAkB,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAAA,EAC3D;AAGA,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACxC,IAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAI,WAAA,EAAY;AAAA,MAChB,WAAW,MAAA,CAAO,MAAA;AAAA,MAClB,OAAA,EAAS,UAAA,CAAW,OAAA,EAAS,MAAA,CAAO,MAAM;AAAA,KAC5C;AACA,IAAA,IAAI,IAAA,GAAwB;AAAA,MAC1B,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GAAG,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,CAAM,EAAE,GAAG,QAAQ;AAAA,KACrE;AACA,IAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,MACnB,IAAA,EAAM,OAAA;AAAA,MACN,WAAW,IAAA,CAAK,EAAA;AAAA,MAChB,SAAS,KAAA,CAAM,EAAA;AAAA,MACf,OAAA,EAAS,mBAAmB,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,gBAAA,EAAc,OAAO,MAAM,CAAA,EAAA;AAAA,KAC5E,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAIO,SAAS,gBAAA,CACd,OAAA,EACA,gBAAA,GAA8D,EAAC,EAC9C;AACjB,EAAA,aAAA,GAAgB,CAAA;AAEhB,EAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,kBAAA,CAAmB,OAAA,EAAS,CAAC,CAAC,CAAA;AAE9E,EAAA,MAAM,MAAA,GAAqB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACjD,IAAI,WAAA,EAAY;AAAA,IAChB,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,OAAA,EAAS;AAAA,GACX,CAAE,CAAA;AAEF,EAAA,MAAM,GAAA,GAAqB,WAAA,CAAY,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,IACpD,IAAA,EAAM,CAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,WAAW,CAAA,CAAE,EAAA;AAAA,IACb,OAAA,EAAS,MAAA,CAAO,CAAC,CAAA,EAAG,EAAA;AAAA,IACpB,OAAA,EAAS,CAAA,2CAAA,EAAyC,CAAA,CAAE,IAAA,IAAQ,EAAE,EAAE,CAAA,EAAA;AAAA,GAClE,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAA,EAAM,CAAA;AAAA,IACN,MAAA,EAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,IAC7C,GAAA;AAAA,IACA,SAAA,EAAW,gBAAA;AAAA,IACX,eAAe;AAAC,GAClB;AACF;AAEO,SAAS,IAAA,CAAK,SAAqB,KAAA,EAAyC;AACjF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW,OAAO,KAAA;AAEvC,EAAA,IAAI,UAA2B,EAAE,GAAG,OAAO,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA,EAAE;AAChE,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,OAAA,IAAW,QAAQ,GAAA,EAAM;AAC9B,IAAA,KAAA,EAAA;AACA,IAAA,OAAA,GAAU,KAAA;AAEV,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,MAAA,EAAQ;AAClC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC9C,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,QAAA,IAAI,CAAC,OAAA,CAAQ,aAAA,CAAc,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AAE5C,UAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,CAAM,MAAA;AAAA,YAChC,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAA,IAAgB,CAAA,CAAE,aAAa,IAAA,CAAK;AAAA,WACxD;AACA,UAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,YAAA,OAAA,GAAU,eAAA,CAAgB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAChD,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AAAA,QAEF,CAAA,MAAO;AAEL,UAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,IAAA,CAAK,EAAE,CAAA;AACtE,UAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,YAAA,IAAI,IAAA,GAAO,QAAQ,OAAA,EAAS;AAAA,cAC1B,IAAA,EAAM,OAAA;AAAA,cACN,WAAW,IAAA,CAAK,EAAA;AAAA,cAChB,SAAS,KAAA,CAAM,EAAA;AAAA,cACf,OAAA,EAAS,CAAA,YAAA,EAAe,IAAA,CAAK,IAAA,IAAQ,KAAK,EAAE,CAAA,YAAA;AAAA,aAC7C,CAAA;AACD,YAAA,OAAA,GAAU,kBAAkB,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAM,EAAE,CAAA;AAC5D,YAAA,OAAA,GAAU,IAAA;AACV,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,SAAS,iBAAA,EAAmB;AACnC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA;AACvC,QAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,IAAA,CAAK,EAAE,CAAA;AACtE,QAAA,IAAI,SAAS,MAAA,IAAU,CAAA,IAAK,SAAA,CAAU,MAAA,GAAS,SAAS,MAAA,EAAQ;AAAA,MAClE;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAE7B,MAAA,MAAM,OAAA,GAAU,QAAQ,MAAA,CAAO,MAAA;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,MAAA,OAAA,GAAU,aAAA,CAAc,OAAA,EAAS,OAAA,EAAS,KAAK,CAAA;AAE/C,MAAA,MAAM,IAAA,GACJ,QAAQ,MAAA,CAAO,MAAA,KAAW,WAC1B,CAAC,GAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAC,EAAA,KAAO,OAAA,CAAQ,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAEpE,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC/B,IAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAY;AAAA,EAC9C;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,IAAA,CACd,OAAA,EACA,KAAA,EACA,SAAA,EACA,SAAA,EACiB;AACjB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW,OAAO,KAAA;AAEvC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AACxC,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,MAAM,UAAA,GAAa,YAAY,EAAE,GAAG,MAAM,SAAA,EAAW,GAAG,SAAA,EAAU,GAAI,KAAA,CAAM,SAAA;AAG5E,EAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA;AACpB,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAGpB,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,WAAW,OAAO,KAAA;AAEvB,IAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,KAAmB,KAAA;AAE/C,IAAA,IAAIA,KAAAA,GAAwB,EAAE,GAAG,KAAA,EAAO,WAAW,UAAA,EAAY,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAE;AACpF,IAAAA,KAAAA,GAAO,QAAQA,KAAAA,EAAM;AAAA,MACnB,IAAA,EAAM,iBAAiB,aAAA,GAAgB,OAAA;AAAA,MACvC,SAAA;AAAA,MACA,SAAS,SAAA,CAAU,EAAA;AAAA,MACnB,OAAA,EAAS,kBAAkB,IAAA,CAAK,IAAA,IAAQ,SAAS,CAAA,SAAA,EAAY,cAAA,GAAiB,iBAAiB,kBAAkB,CAAA,EAAA;AAAA,KAClH,CAAA;AAED,IAAA,IAAI,cAAA,EAAgB;AAElB,MAAAA,KAAAA,GAAO,EAAE,GAAGA,KAAAA,EAAM,QAAQA,KAAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA,EAAE;AAAA,IAC7E;AAGA,IAAAA,KAAAA,GAAO,iBAAA,CAAkB,OAAA,EAASA,KAAAA,EAAM,WAAW,IAAI,CAAA;AACvD,IAAA,OAAO,IAAA,CAAK,SAAS,EAAE,GAAGA,OAAM,IAAA,EAAMA,KAAAA,CAAK,IAAA,GAAO,CAAA,EAAG,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAChE,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAGnB,EAAA,IAAI,IAAA,CAAK,SAAS,wBAAA,EAA0B;AAC1C,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,EAAS,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AACnD,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AACtC,MAAA,OAAO,KAAK,IAAA,KAAS,mBAAA;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AAC1C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,UACzB,MAAA,CAAO,OAAA,EAAS,EAAA,CAAG,EAAE,EAClB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CACnB,MAAA,CAAO,CAAC,EAAA,KAAO,OAAO,SAAS;AAAA,SACpC;AACA,QAAA,KAAA,GAAQ;AAAA,UACN,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,cAAA,CAAe,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC;AAAA,SACrE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,GAAwB,EAAE,GAAG,KAAA,EAAO,WAAW,UAAA,EAAY,IAAA,EAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAE;AACpF,EAAA,IAAA,GAAO,QAAQ,IAAA,EAAM;AAAA,IACnB,IAAA,EAAM,OAAA;AAAA,IACN,SAAA;AAAA,IACA,SAAS,KAAA,CAAM,EAAA;AAAA,IACf,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,SAAS,CAAA,GAAA,EAAM,KAAK,IAAI,CAAA,iBAAA;AAAA,GACnD,CAAA;AACD,EAAA,IAAA,GAAO,iBAAA,CAAkB,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,MAAM,EAAE,CAAA;AAC3D,EAAA,OAAO,IAAA,CAAK,SAAS,EAAE,GAAG,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG,CAAA;AACvD;AAEO,SAAS,WAAA,CAAY,SAAqB,KAAA,EAAkC;AACjF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,SAAA,EAAW,OAAO,EAAC;AAExC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC7B,MAAA,KAAA,MAAW,EAAA,IAAM,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,EAAE,CAAA,EAAG;AACnD,QAAA,QAAA,CAAS,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,QAAQ,CAAA;AACrB;AAEO,SAAS,YAAY,KAAA,EAAiC;AAC3D,EAAA,OAAO,MAAM,MAAA,KAAW,WAAA;AAC1B;AAGO,SAAS,WAAA,CACd,KAAA,EACA,GAAA,EACA,KAAA,EACiB;AACjB,EAAA,OAAO,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,EAAE,GAAG,KAAA,CAAM,SAAA,EAAW,CAAC,GAAG,GAAG,KAAA,EAAM,EAAE;AACrE","file":"chunk-QOGZITWB.js","sourcesContent":["export type SimVariables = Record<string, string | number | boolean>;\n\nfunction parseValue(raw: string): string | number | boolean {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n if ((raw.startsWith(\"'\") && raw.endsWith(\"'\")) || (raw.startsWith('\"') && raw.endsWith('\"')))\n return raw.slice(1, -1);\n const n = Number(raw);\n return isNaN(n) ? raw : n;\n}\n\n/**\n * Evaluates a BPMN condition expression (${...}) against a variables map.\n * Supports: bare variable (truthy), ==, !=, >, >=, <, <=, !var\n */\nexport function evalCondition(expr: string, variables: SimVariables): boolean {\n const body = expr.trim().replace(/^\\$\\{|\\}$/g, \"\").trim();\n if (!body) return false;\n\n // Logical NOT: !varName\n if (body.startsWith(\"!\")) {\n const inner = body.slice(1).trim();\n return !Boolean(variables[inner]);\n }\n\n // != comparison\n const neq = body.match(/^(\\w+)\\s*!=\\s*(.+)$/);\n if (neq) return String(variables[neq[1].trim()]) !== String(parseValue(neq[2].trim()));\n\n // == comparison\n const eq = body.match(/^(\\w+)\\s*==\\s*(.+)$/);\n if (eq) {\n const lhs = variables[eq[1].trim()];\n const rhs = parseValue(eq[2].trim());\n // eslint-disable-next-line eqeqeq\n return lhs == rhs;\n }\n\n // >= comparison\n const gte = body.match(/^(\\w+)\\s*>=\\s*(-?\\d+\\.?\\d*)$/);\n if (gte) return Number(variables[gte[1].trim()]) >= Number(gte[2]);\n\n // <= comparison\n const lte = body.match(/^(\\w+)\\s*<=\\s*(-?\\d+\\.?\\d*)$/);\n if (lte) return Number(variables[lte[1].trim()]) <= Number(lte[2]);\n\n // > comparison\n const gt = body.match(/^(\\w+)\\s*>\\s*(-?\\d+\\.?\\d*)$/);\n if (gt) return Number(variables[gt[1].trim()]) > Number(gt[2]);\n\n // < comparison\n const lt = body.match(/^(\\w+)\\s*<\\s*(-?\\d+\\.?\\d*)$/);\n if (lt) return Number(variables[lt[1].trim()]) < Number(lt[2]);\n\n // Bare variable → truthy\n return Boolean(variables[body]);\n}\n","import { evalCondition } from \"./evaluator\";\nexport type { SimVariables } from \"./evaluator\";\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface SimNode {\n id: string;\n type: string;\n name?: string;\n parentId?: string;\n /** BoundaryEvent only — the task/subprocess this event is attached to. */\n attachedToRef?: string;\n /** BoundaryEvent: true = interrupting (default), false = non-interrupting. */\n isInterrupting?: boolean;\n}\n\nexport interface SimEdge {\n id: string;\n type: string;\n source: string;\n target: string;\n conditionExpression?: string;\n isDefault?: boolean;\n}\n\nexport interface SimDiagram {\n nodes: SimNode[];\n edges: SimEdge[];\n}\n\nexport interface SimToken {\n id: string;\n /** The element the token currently occupies. */\n elementId: string;\n /**\n * The subprocess scope this token belongs to.\n * \"root\" for top-level tokens; the subprocess node id for child tokens.\n */\n scopeId: string;\n}\n\nexport type SimStatus = \"idle\" | \"running\" | \"completed\" | \"deadlocked\";\n\nexport type SimLogType =\n | \"created\"\n | \"fired\"\n | \"split\"\n | \"joined\"\n | \"consumed\"\n | \"blocked\"\n | \"deadlocked\"\n | \"interrupted\";\n\nexport interface SimLogEntry {\n step: number;\n type: SimLogType;\n elementId: string;\n tokenId?: string;\n message: string;\n}\n\nexport interface SimulationState {\n tokens: SimToken[];\n step: number;\n status: SimStatus;\n log: SimLogEntry[];\n /** Process-level variables used for gateway condition evaluation. */\n variables: Record<string, string | number | boolean>;\n /** IDs of subprocess nodes whose internal execution has started. */\n enteredScopes: string[];\n}\n\n// ─── Diagram query helpers ────────────────────────────────────────────────────\n\nfunction seqOut(diagram: SimDiagram, nodeId: string): SimEdge[] {\n return diagram.edges.filter((e) => e.type === \"sequenceFlow\" && e.source === nodeId);\n}\n\nfunction seqIn(diagram: SimDiagram, nodeId: string): SimEdge[] {\n return diagram.edges.filter((e) => e.type === \"sequenceFlow\" && e.target === nodeId);\n}\n\nfunction nodeById(diagram: SimDiagram, id: string): SimNode | undefined {\n return diagram.nodes.find((n) => n.id === id);\n}\n\n/** Returns boundary events attached to the given host element. */\nfunction boundaryEventsOf(diagram: SimDiagram, hostId: string): SimNode[] {\n return diagram.nodes.filter((n) => n.type === \"BoundaryEvent\" && n.attachedToRef === hostId);\n}\n\nlet _tokenCounter = 0;\nfunction nextTokenId(): string {\n return `tok_${++_tokenCounter}`;\n}\n\n// ─── Element classification ───────────────────────────────────────────────────\n\nconst GATEWAY_TYPES = new Set([\n \"ExclusiveGateway\",\n \"InclusiveGateway\",\n \"ParallelGateway\",\n \"ComplexGateway\",\n \"EventBasedGateway\",\n]);\n\nconst TASK_TYPES = new Set([\n \"Task\",\n \"UserTask\",\n \"ServiceTask\",\n \"ScriptTask\",\n \"ManualTask\",\n \"BusinessRuleTask\",\n \"ReceiveTask\",\n \"SendTask\",\n \"CallActivity\",\n]);\n\nfunction isAutomatic(nodeType: string): boolean {\n return (\n nodeType === \"StartEvent\" ||\n nodeType === \"EndEvent\" ||\n nodeType === \"IntermediateThrowEvent\" ||\n GATEWAY_TYPES.has(nodeType)\n );\n}\n\nfunction isManual(nodeType: string): boolean {\n return (\n TASK_TYPES.has(nodeType) ||\n nodeType === \"IntermediateCatchEvent\" ||\n nodeType === \"BoundaryEvent\"\n );\n}\n\nfunction isSubProcess(nodeType: string): boolean {\n return (\n nodeType === \"SubProcess\" ||\n nodeType === \"Transaction\" ||\n nodeType === \"EventSubProcess\" ||\n nodeType === \"AdHocSubProcess\"\n );\n}\n\nfunction isRootProcessStart(diagram: SimDiagram, node: SimNode): boolean {\n if (node.type !== \"StartEvent\") return false;\n if (!node.parentId) return true;\n const parent = nodeById(diagram, node.parentId);\n return !parent || !isSubProcess(parent.type);\n}\n\n// ─── Scope resolution ─────────────────────────────────────────────────────────\n\n/**\n * Determines the scope of a node by checking whether its parent is a SubProcess.\n * Returns \"root\" for top-level nodes or children of Pools/Lanes.\n */\nfunction getScopeId(diagram: SimDiagram, nodeId: string): string {\n const node = nodeById(diagram, nodeId);\n if (!node?.parentId) return \"root\";\n const parent = nodeById(diagram, node.parentId);\n return parent && isSubProcess(parent.type) ? node.parentId : \"root\";\n}\n\n// ─── Core token helpers ───────────────────────────────────────────────────────\n\nfunction withLog(\n state: SimulationState,\n entry: Omit<SimLogEntry, \"step\">,\n): SimulationState {\n return { ...state, log: [...state.log, { ...entry, step: state.step }] };\n}\n\n/**\n * Removes the consumed token and creates new tokens at each outgoing\n * sequence-flow target of sourceId. Each new token inherits the scope\n * determined by the target node's position in the diagram.\n */\nfunction disperseToTargets(\n diagram: SimDiagram,\n state: SimulationState,\n sourceId: string,\n consumedTokenId: string | null,\n): SimulationState {\n const outEdges = seqOut(diagram, sourceId);\n if (outEdges.length === 0) return state;\n\n let next: SimulationState = {\n ...state,\n tokens:\n consumedTokenId !== null\n ? state.tokens.filter((t) => t.id !== consumedTokenId)\n : state.tokens,\n };\n\n for (const edge of outEdges) {\n const target = nodeById(diagram, edge.target);\n if (!target) continue;\n\n const newToken: SimToken = {\n id: nextTokenId(),\n elementId: edge.target,\n scopeId: getScopeId(diagram, edge.target),\n };\n next = {\n ...next,\n tokens: [...next.tokens, newToken],\n };\n next = withLog(next, {\n type: \"created\",\n elementId: edge.target,\n tokenId: newToken.id,\n message: `Token created at \"${target.name ?? edge.target}\".`,\n });\n }\n\n return next;\n}\n\n// ─── SubProcess scope management ─────────────────────────────────────────────\n\nfunction enterSubProcess(\n diagram: SimDiagram,\n state: SimulationState,\n subProcNode: SimNode,\n): SimulationState {\n const childStarts = diagram.nodes.filter(\n (n) => n.type === \"StartEvent\" && n.parentId === subProcNode.id,\n );\n\n let next: SimulationState = {\n ...state,\n enteredScopes: [...state.enteredScopes, subProcNode.id],\n };\n\n for (const startNode of childStarts) {\n const newToken: SimToken = {\n id: nextTokenId(),\n elementId: startNode.id,\n scopeId: subProcNode.id,\n };\n next = {\n ...next,\n tokens: [...next.tokens, newToken],\n };\n next = withLog(next, {\n type: \"created\",\n elementId: startNode.id,\n tokenId: newToken.id,\n message: `SubProcess \"${subProcNode.name ?? subProcNode.id}\" entered — token at \"${startNode.name ?? startNode.id}\".`,\n });\n }\n\n return next;\n}\n\n// ─── Automatic element execution ──────────────────────────────────────────────\n\nfunction fireAutomatic(\n diagram: SimDiagram,\n state: SimulationState,\n token: SimToken,\n): SimulationState {\n const node = nodeById(diagram, token.elementId);\n if (!node) return state;\n const { type } = node;\n const vars = state.variables;\n\n // EndEvent ─────────────────────────────────────────────────────────────────\n if (type === \"EndEvent\") {\n let next: SimulationState = {\n ...state,\n tokens: state.tokens.filter((t) => t.id !== token.id),\n };\n next = withLog(next, {\n type: \"consumed\",\n elementId: node.id,\n tokenId: token.id,\n message: `Token consumed at end event \"${node.name ?? node.id}\".`,\n });\n return next;\n }\n\n // StartEvent / IntermediateThrowEvent ──────────────────────────────────────\n if (type === \"StartEvent\" || type === \"IntermediateThrowEvent\") {\n let next = withLog(state, {\n type: \"fired\",\n elementId: node.id,\n tokenId: token.id,\n message: `\"${node.name ?? node.id}\" (${type}) fired.`,\n });\n return disperseToTargets(diagram, next, node.id, token.id);\n }\n\n // ExclusiveGateway ─────────────────────────────────────────────────────────\n if (type === \"ExclusiveGateway\") {\n const incoming = seqIn(diagram, node.id);\n if (incoming.length >= 2) {\n // XOR join: pass through immediately\n let next = withLog(state, {\n type: \"joined\",\n elementId: node.id,\n tokenId: token.id,\n message: `ExclusiveGateway \"${node.name ?? node.id}\" join — token passes through.`,\n });\n return disperseToTargets(diagram, next, node.id, token.id);\n }\n\n const outEdges = seqOut(diagram, node.id);\n // Evaluate conditions; fall back to default, then first\n const chosen =\n outEdges.find(\n (e) => e.conditionExpression && !e.isDefault && evalCondition(e.conditionExpression, vars),\n ) ??\n outEdges.find((e) => e.isDefault) ??\n outEdges[0];\n\n if (!chosen) return state;\n const target = nodeById(diagram, chosen.target);\n if (!target) return state;\n\n const newToken: SimToken = {\n id: nextTokenId(),\n elementId: chosen.target,\n scopeId: getScopeId(diagram, chosen.target),\n };\n let next: SimulationState = {\n ...state,\n tokens: [...state.tokens.filter((t) => t.id !== token.id), newToken],\n };\n next = withLog(next, {\n type: \"fired\",\n elementId: node.id,\n tokenId: token.id,\n message: `ExclusiveGateway \"${node.name ?? node.id}\" split → \"${target.name ?? chosen.target}\".`,\n });\n return next;\n }\n\n // InclusiveGateway ─────────────────────────────────────────────────────────\n if (type === \"InclusiveGateway\") {\n const incoming = seqIn(diagram, node.id);\n if (incoming.length >= 2) {\n // OR join: pass through (simplified — full semantics require tracking active paths)\n let next = withLog(state, {\n type: \"joined\",\n elementId: node.id,\n tokenId: token.id,\n message: `InclusiveGateway \"${node.name ?? node.id}\" join.`,\n });\n return disperseToTargets(diagram, next, node.id, token.id);\n }\n\n const outEdges = seqOut(diagram, node.id);\n // Take all paths whose condition is true; if none match → take default\n const matching = outEdges.filter(\n (e) => e.conditionExpression && !e.isDefault && evalCondition(e.conditionExpression, vars),\n );\n const activePaths = matching.length > 0 ? matching : outEdges.filter((e) => e.isDefault);\n const paths = activePaths.length > 0 ? activePaths : outEdges; // all if no conditions defined\n\n let next = withLog(state, {\n type: \"split\",\n elementId: node.id,\n tokenId: token.id,\n message: `InclusiveGateway \"${node.name ?? node.id}\" split → ${paths.length} path(s).`,\n });\n\n next = { ...next, tokens: next.tokens.filter((t) => t.id !== token.id) };\n for (const edge of paths) {\n const tgt = nodeById(diagram, edge.target);\n if (!tgt) continue;\n const newToken: SimToken = {\n id: nextTokenId(),\n elementId: edge.target,\n scopeId: getScopeId(diagram, edge.target),\n };\n next = { ...next, tokens: [...next.tokens, newToken] };\n next = withLog(next, {\n type: \"created\",\n elementId: edge.target,\n tokenId: newToken.id,\n message: `Token created at \"${tgt.name ?? edge.target}\".`,\n });\n }\n return next;\n }\n\n // ParallelGateway ──────────────────────────────────────────────────────────\n if (type === \"ParallelGateway\") {\n const incoming = seqIn(diagram, node.id);\n if (incoming.length >= 2) {\n const atGateway = state.tokens.filter((t) => t.elementId === node.id);\n if (atGateway.length < incoming.length) {\n return withLog(state, {\n type: \"blocked\",\n elementId: node.id,\n tokenId: token.id,\n message: `ParallelGateway \"${node.name ?? node.id}\" waiting for ${incoming.length - atGateway.length} more token(s).`,\n });\n }\n const consumeIds = new Set(atGateway.map((t) => t.id));\n let next: SimulationState = {\n ...state,\n tokens: state.tokens.filter((t) => !consumeIds.has(t.id)),\n };\n next = withLog(next, {\n type: \"joined\",\n elementId: node.id,\n message: `ParallelGateway \"${node.name ?? node.id}\" join fired — all paths synchronized.`,\n });\n return disperseToTargets(diagram, next, node.id, null);\n }\n // AND split\n let next = withLog(state, {\n type: \"split\",\n elementId: node.id,\n tokenId: token.id,\n message: `ParallelGateway \"${node.name ?? node.id}\" split → ${seqOut(diagram, node.id).length} paths.`,\n });\n return disperseToTargets(diagram, next, node.id, token.id);\n }\n\n // EventBasedGateway ────────────────────────────────────────────────────────\n // Disperses to ALL outgoing catch events; first one fired wins (race).\n if (type === \"EventBasedGateway\") {\n let next = withLog(state, {\n type: \"split\",\n elementId: node.id,\n tokenId: token.id,\n message: `EventBasedGateway \"${node.name ?? node.id}\" waiting — ${seqOut(diagram, node.id).length} competing event(s).`,\n });\n return disperseToTargets(diagram, next, node.id, token.id);\n }\n\n // ComplexGateway (simplified: first path) ─────────────────────────────────\n if (type === \"ComplexGateway\") {\n const outEdges = seqOut(diagram, node.id);\n const chosen = outEdges[0];\n if (!chosen) return state;\n const newToken: SimToken = {\n id: nextTokenId(),\n elementId: chosen.target,\n scopeId: getScopeId(diagram, chosen.target),\n };\n let next: SimulationState = {\n ...state,\n tokens: [...state.tokens.filter((t) => t.id !== token.id), newToken],\n };\n next = withLog(next, {\n type: \"fired\",\n elementId: node.id,\n tokenId: token.id,\n message: `ComplexGateway \"${node.name ?? node.id}\" fired → \"${chosen.target}\".`,\n });\n return next;\n }\n\n return state;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport function createSimulation(\n diagram: SimDiagram,\n initialVariables: Record<string, string | number | boolean> = {},\n): SimulationState {\n _tokenCounter = 0;\n\n const startEvents = diagram.nodes.filter((n) => isRootProcessStart(diagram, n));\n\n const tokens: SimToken[] = startEvents.map((n) => ({\n id: nextTokenId(),\n elementId: n.id,\n scopeId: \"root\",\n }));\n\n const log: SimLogEntry[] = startEvents.map((n, i) => ({\n step: 0,\n type: \"created\" as SimLogType,\n elementId: n.id,\n tokenId: tokens[i]?.id,\n message: `Simulation started — token placed at \"${n.name ?? n.id}\".`,\n }));\n\n return {\n tokens,\n step: 0,\n status: startEvents.length > 0 ? \"running\" : \"idle\",\n log,\n variables: initialVariables,\n enteredScopes: [],\n };\n}\n\nexport function tick(diagram: SimDiagram, state: SimulationState): SimulationState {\n if (state.status !== \"running\") return state;\n\n let current: SimulationState = { ...state, step: state.step + 1 };\n let changed = true;\n let guard = 0;\n\n while (changed && guard < 1000) {\n guard++;\n changed = false;\n\n for (const token of current.tokens) {\n const node = nodeById(diagram, token.elementId);\n if (!node) continue;\n\n // ── SubProcess enter / wait / complete ─────────────────────────────────\n if (isSubProcess(node.type)) {\n if (!current.enteredScopes.includes(node.id)) {\n // Enter: spawn child tokens at internal start events\n const childStarts = diagram.nodes.filter(\n (n) => n.type === \"StartEvent\" && n.parentId === node.id,\n );\n if (childStarts.length > 0) {\n current = enterSubProcess(diagram, current, node);\n changed = true;\n break;\n }\n // No internal structure → treat as manual task (don't advance)\n } else {\n // Check if scope completed\n const scopeTokens = current.tokens.filter((t) => t.scopeId === node.id);\n if (scopeTokens.length === 0) {\n let next = withLog(current, {\n type: \"fired\",\n elementId: node.id,\n tokenId: token.id,\n message: `SubProcess \"${node.name ?? node.id}\" completed.`,\n });\n current = disperseToTargets(diagram, next, node.id, token.id);\n changed = true;\n break;\n }\n }\n continue;\n }\n\n // ── ParallelGateway join: only fire when all tokens are present ─────────\n if (node.type === \"ParallelGateway\") {\n const incoming = seqIn(diagram, node.id);\n const atGateway = current.tokens.filter((t) => t.elementId === node.id);\n if (incoming.length >= 2 && atGateway.length < incoming.length) continue;\n }\n\n if (!isAutomatic(node.type)) continue;\n\n const prevLen = current.tokens.length;\n const prevIds = new Set(current.tokens.map((t) => t.id));\n current = fireAutomatic(diagram, current, token);\n\n const same =\n current.tokens.length === prevLen &&\n [...prevIds].every((id) => current.tokens.some((t) => t.id === id));\n\n if (!same) {\n changed = true;\n break;\n }\n }\n }\n\n // Determine final status\n if (current.tokens.length === 0) {\n current = { ...current, status: \"completed\" };\n }\n\n return current;\n}\n\nexport function fire(\n diagram: SimDiagram,\n state: SimulationState,\n elementId: string,\n variables?: Record<string, string | number | boolean>,\n): SimulationState {\n if (state.status !== \"running\") return state;\n\n const node = nodeById(diagram, elementId);\n if (!node) return state;\n\n const mergedVars = variables ? { ...state.variables, ...variables } : state.variables;\n\n // ── BoundaryEvent: fired from the host task context, no token at the event ─\n if (node.type === \"BoundaryEvent\") {\n const hostId = node.attachedToRef;\n if (!hostId) return state;\n\n // The boundary event is activated relative to a token at the host task\n const hostToken = state.tokens.find((t) => t.elementId === hostId);\n if (!hostToken) return state;\n\n const isInterrupting = node.isInterrupting !== false;\n\n let next: SimulationState = { ...state, variables: mergedVars, step: state.step + 1 };\n next = withLog(next, {\n type: isInterrupting ? \"interrupted\" : \"fired\",\n elementId,\n tokenId: hostToken.id,\n message: `BoundaryEvent \"${node.name ?? elementId}\" fired (${isInterrupting ? \"interrupting\" : \"non-interrupting\"}).`,\n });\n\n if (isInterrupting) {\n // Remove the host task token (interrupts the task)\n next = { ...next, tokens: next.tokens.filter((t) => t.id !== hostToken.id) };\n }\n // Non-interrupting: host token stays; a new parallel token follows the boundary path\n\n next = disperseToTargets(diagram, next, elementId, null);\n return tick(diagram, { ...next, step: next.step - 1 });\n }\n\n const token = state.tokens.find((t) => t.elementId === elementId);\n if (!token) return state;\n\n // ── IntermediateCatchEvent following an EventBasedGateway: cancel race ────\n if (node.type === \"IntermediateCatchEvent\") {\n const gwEdge = seqIn(diagram, elementId).find((e) => {\n const src = nodeById(diagram, e.source);\n return src?.type === \"EventBasedGateway\";\n });\n if (gwEdge) {\n // Cancel all sibling catch events in the race\n const gw = nodeById(diagram, gwEdge.source);\n if (gw) {\n const siblingTargets = new Set(\n seqOut(diagram, gw.id)\n .map((e) => e.target)\n .filter((id) => id !== elementId),\n );\n state = {\n ...state,\n tokens: state.tokens.filter((t) => !siblingTargets.has(t.elementId)),\n };\n }\n }\n }\n\n let next: SimulationState = { ...state, variables: mergedVars, step: state.step + 1 };\n next = withLog(next, {\n type: \"fired\",\n elementId,\n tokenId: token.id,\n message: `\"${node.name ?? elementId}\" (${node.type}) manually fired.`,\n });\n next = disperseToTargets(diagram, next, elementId, token.id);\n return tick(diagram, { ...next, step: next.step - 1 });\n}\n\nexport function getFireable(diagram: SimDiagram, state: SimulationState): string[] {\n if (state.status !== \"running\") return [];\n\n const fireable = new Set<string>();\n\n for (const token of state.tokens) {\n const node = nodeById(diagram, token.elementId);\n if (!node) continue;\n\n if (isManual(node.type)) {\n fireable.add(node.id);\n }\n\n // Expose boundary events attached to tasks that have tokens\n if (TASK_TYPES.has(node.type)) {\n for (const be of boundaryEventsOf(diagram, node.id)) {\n fireable.add(be.id);\n }\n }\n }\n\n return [...fireable];\n}\n\nexport function isCompleted(state: SimulationState): boolean {\n return state.status === \"completed\";\n}\n\n/** Set or update a process variable without advancing the simulation. */\nexport function setVariable(\n state: SimulationState,\n key: string,\n value: string | number | boolean,\n): SimulationState {\n return { ...state, variables: { ...state.variables, [key]: value } };\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-OWfI_yHU.cjs';
1
+ export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-m8fHIiKH.cjs';
2
2
  import { e as BpmnElementType, g as BpmnHandlePolicy, i as BpmnOrientation } from '../types-DznxZxpV.cjs';
3
3
  export { B as BpmnCategory, a as BpmnEdgeData, b as BpmnEdgeType, c as BpmnElementMeta, d as BpmnElementSize, f as BpmnEventSemantics, h as BpmnNodeData, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-DznxZxpV.cjs';
4
4
 
@@ -1,4 +1,4 @@
1
- export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-OVnBDD8R.js';
1
+ export { B as BPMN_ELEMENT_CATALOG, a as BPMN_RESIZABLE_ELEMENT_TYPES, g as getBpmnElementSize, b as getElementMeta, i as isBpmnElementResizable } from '../catalog-DIBySQqA.js';
2
2
  import { e as BpmnElementType, g as BpmnHandlePolicy, i as BpmnOrientation } from '../types-DznxZxpV.js';
3
3
  export { B as BpmnCategory, a as BpmnEdgeData, b as BpmnEdgeType, c as BpmnElementMeta, d as BpmnElementSize, f as BpmnEventSemantics, h as BpmnNodeData, E as EventTrigger, S as SubProcessVariant, T as TaskMarker } from '../types-DznxZxpV.js';
4
4