Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add superfluous-label rule #129

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .bpmnlintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"rules": {
"superfluous-label": "error"
}
}
1 change: 1 addition & 0 deletions config/all.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const allRules = [
'start-event-required',
'sub-process-blank-start-event',
'superfluous-gateway',
'superfluous-label',
'superfluous-termination'
];

Expand Down
3 changes: 2 additions & 1 deletion config/recommended.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ module.exports = {
'start-event-required': 'error',
'sub-process-blank-start-event': 'error',
'superfluous-gateway': 'warn',
'superfluous-termination': 'warn'
'superfluous-termination': 'warn',
'superfluous-label': 'warn'
}
};
Binary file modified docs/rules/examples/conditional-flows-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/conditional-flows-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/end-event-required-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/end-event-required-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/fake-join-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/fake-join-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/label-required-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/label-required-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-bpmndi-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-bpmndi-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-complex-gateway-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-complex-gateway-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-disconnected-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-disconnected-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-duplicate-sequence-flows-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-duplicate-sequence-flows-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-gateway-join-fork-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-gateway-join-fork-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-end-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-end-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-split-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-split-incorrect.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-start-correct.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/rules/examples/no-implicit-start-incorrect.png
Binary file modified docs/rules/examples/no-inclusive-gateway-correct.png
Binary file modified docs/rules/examples/no-inclusive-gateway-incorrect.png
Binary file modified docs/rules/examples/single-blank-start-event-correct.png
Binary file modified docs/rules/examples/single-blank-start-event-incorrect.png
Binary file modified docs/rules/examples/single-event-definition-correct.png
Binary file modified docs/rules/examples/single-event-definition-incorrect.png
Binary file modified docs/rules/examples/start-event-required-correct.png
Binary file modified docs/rules/examples/start-event-required-incorrect.png
Binary file modified docs/rules/examples/sub-process-blank-start-event-correct.png
Binary file modified docs/rules/examples/sub-process-blank-start-event-incorrect.png
Binary file modified docs/rules/examples/superfluous-gateway-correct.png
Binary file modified docs/rules/examples/superfluous-gateway-incorrect.png
71 changes: 71 additions & 0 deletions docs/rules/examples/superfluous-label-correct.bpmn
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1xzqysc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.20.0-nightly.20240107" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.4.0">
<bpmn:category id="Category_0frzuuu">
<bpmn:categoryValue id="CategoryValue_1c207z7" value="YES" />
</bpmn:category>
<bpmn:process id="Process_1gm33ca" isExecutable="true">
<bpmn:task id="Activity_1y46za8">
<bpmn:incoming>Flow_19gm6uu</bpmn:incoming>
<bpmn:outgoing>Flow_0pcvi6i</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Activity_1rk2pdz">
<bpmn:incoming>Flow_1dy8u2b</bpmn:incoming>
<bpmn:outgoing>Flow_1sspqal</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_1sspqal" sourceRef="Activity_1rk2pdz" targetRef="Event_1w640go" />
<bpmn:startEvent id="Event_146g3it">
<bpmn:outgoing>Flow_1dy8u2b</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_1dy8u2b" sourceRef="Event_146g3it" targetRef="Activity_1rk2pdz" />
<bpmn:endEvent id="Event_1luh0vb">
<bpmn:incoming>Flow_0pcvi6i</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0pcvi6i" sourceRef="Activity_1y46za8" targetRef="Event_1luh0vb" />
<bpmn:intermediateThrowEvent id="Event_1w640go" name="order submitted">
<bpmn:incoming>Flow_1sspqal</bpmn:incoming>
<bpmn:outgoing>Flow_19gm6uu</bpmn:outgoing>
</bpmn:intermediateThrowEvent>
<bpmn:sequenceFlow id="Flow_19gm6uu" sourceRef="Event_1w640go" targetRef="Activity_1y46za8" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1gm33ca">
<bpmndi:BPMNShape id="Activity_1rk2pdz_di" bpmnElement="Activity_1rk2pdz">
<dc:Bounds x="250" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_146g3it_di" bpmnElement="Event_146g3it">
<dc:Bounds x="152" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1w640go_di" bpmnElement="Event_1w640go">
<dc:Bounds x="402" y="102" width="36" height="36" />
<bpmndi:BPMNLabel>
<dc:Bounds x="382" y="145" width="77" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1y46za8_di" bpmnElement="Activity_1y46za8">
<dc:Bounds x="480" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1luh0vb_di" bpmnElement="Event_1luh0vb">
<dc:Bounds x="642" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1sspqal_di" bpmnElement="Flow_1sspqal">
<di:waypoint x="350" y="120" />
<di:waypoint x="402" y="120" />
<bpmndi:BPMNLabel>
<dc:Bounds x="420.9999999999999" y="102" width="62" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dy8u2b_di" bpmnElement="Flow_1dy8u2b">
<di:waypoint x="188" y="120" />
<di:waypoint x="250" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_19gm6uu_di" bpmnElement="Flow_19gm6uu">
<di:waypoint x="438" y="120" />
<di:waypoint x="480" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pcvi6i_di" bpmnElement="Flow_0pcvi6i">
<di:waypoint x="580" y="120" />
<di:waypoint x="642" y="120" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Binary file added docs/rules/examples/superfluous-label-correct.png
56 changes: 56 additions & 0 deletions docs/rules/examples/superfluous-label-incorrect.bpmn
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1xzqysc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.20.0-nightly.20240107" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.4.0">
<bpmn:category id="Category_0frzuuu">
<bpmn:categoryValue id="CategoryValue_1c207z7" value="YES" />
</bpmn:category>
<bpmn:process id="Process_1gm33ca" isExecutable="true">
<bpmn:task id="Activity_1y46za8">
<bpmn:incoming>Flow_1sspqal</bpmn:incoming>
<bpmn:outgoing>Flow_0pcvi6i</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Activity_1rk2pdz">
<bpmn:incoming>Flow_1dy8u2b</bpmn:incoming>
<bpmn:outgoing>Flow_1sspqal</bpmn:outgoing>
</bpmn:task>
<bpmn:sequenceFlow id="Flow_1sspqal" name="submit order" sourceRef="Activity_1rk2pdz" targetRef="Activity_1y46za8" />
<bpmn:startEvent id="Event_146g3it">
<bpmn:outgoing>Flow_1dy8u2b</bpmn:outgoing>
</bpmn:startEvent>
<bpmn:sequenceFlow id="Flow_1dy8u2b" sourceRef="Event_146g3it" targetRef="Activity_1rk2pdz" />
<bpmn:endEvent id="Event_1luh0vb">
<bpmn:incoming>Flow_0pcvi6i</bpmn:incoming>
</bpmn:endEvent>
<bpmn:sequenceFlow id="Flow_0pcvi6i" sourceRef="Activity_1y46za8" targetRef="Event_1luh0vb" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1gm33ca">
<bpmndi:BPMNShape id="Activity_1y46za8_di" bpmnElement="Activity_1y46za8">
<dc:Bounds x="490" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1rk2pdz_di" bpmnElement="Activity_1rk2pdz">
<dc:Bounds x="250" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_146g3it_di" bpmnElement="Event_146g3it">
<dc:Bounds x="152" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Event_1luh0vb_di" bpmnElement="Event_1luh0vb">
<dc:Bounds x="652" y="102" width="36" height="36" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="Flow_1sspqal_di" bpmnElement="Flow_1sspqal">
<di:waypoint x="350" y="120" />
<di:waypoint x="490" y="120" />
<bpmndi:BPMNLabel>
<dc:Bounds x="389" y="102" width="62" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0pcvi6i_di" bpmnElement="Flow_0pcvi6i">
<di:waypoint x="590" y="120" />
<di:waypoint x="652" y="120" />
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_1dy8u2b_di" bpmnElement="Flow_1dy8u2b">
<di:waypoint x="188" y="120" />
<di:waypoint x="250" y="120" />
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
17 changes: 17 additions & 0 deletions docs/rules/superfluous-label.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Redundant Label (superfluous-label)

A rule that checks that no redundant labels are present in a diagram.
Redundant labels duplicate already existing information or may indicate miss-understanding of BPMN semantics.

Example of __incorrect__ usage for this rule:

![Incorrect usage example](./examples/superfluous-label-incorrect.png)

Cf. [`superfluous-label-incorrect.bpmn`](./examples/superfluous-label-incorrect.bpmn).


Example of __correct__ usage for this rule:

![Correct usage example](./examples/superfluous-label-correct.png)

Cf. [`superfluous-label.bpmn`](./examples/superfluous-label-correct.bpmn).
50 changes: 50 additions & 0 deletions rules/superfluous-label.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
const {
is
} = require('bpmnlint-utils');


/**
* A rule that checks the presence of a label.
*/
module.exports = function() {

function check(node, reporter) {

const name = (node.name || '').trim();

if (!name) {
return;
}

// match joining gateways _AND_ unconditional
// sequence flows only
if (
(is(node, 'bpmn:Gateway') && !isForking(node)) ||
(is(node, 'bpmn:SequenceFlow') && !isConditional(node))
) {

reporter.report(node.id, 'Element has superfluous label/name', [ 'name' ]);
}

}

return { check };
};


// helpers ////////////////////////

function isForking(node) {
const outgoing = (node && node.outgoing) || [];

console.log('isForking', node, outgoing.length > 1);
return outgoing.length > 1;
}

function isConditional(node) {
const source = node.sourceRef;

return (
node.conditionExpression && !source['default'] === node
);
}
25 changes: 15 additions & 10 deletions test/integration/compilation/test/bpmnlintrc.expected.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ const rules = {
"sub-process-blank-start-event": "error",
"superfluous-gateway": "warn",
"superfluous-termination": "warn",
"superfluous-label": "warn",
"test/no-label-foo": "error",
"exported/foo": "error",
"exported/bar": "error",
Expand Down Expand Up @@ -154,22 +155,26 @@ import rule_20 from 'bpmnlint/rules/superfluous-termination';

cache['bpmnlint/superfluous-termination'] = rule_20;

import rule_21 from 'bpmnlint-plugin-test/rules/no-label-foo';
import rule_21 from 'bpmnlint/rules/superfluous-label';

cache['bpmnlint-plugin-test/no-label-foo'] = rule_21;
cache['bpmnlint/superfluous-label'] = rule_21;

import rule_22 from 'bpmnlint-plugin-exported/src/foo';
import rule_22 from 'bpmnlint-plugin-test/rules/no-label-foo';

cache['bpmnlint-plugin-exported/foo'] = rule_22;
cache['bpmnlint-plugin-test/no-label-foo'] = rule_22;

import rule_23 from 'bpmnlint-plugin-exported/src/bar';
import rule_23 from 'bpmnlint-plugin-exported/src/foo';

cache['bpmnlint-plugin-exported/bar'] = rule_23;
cache['bpmnlint-plugin-exported/foo'] = rule_23;

import rule_24 from 'bpmnlint-plugin-exported/rules/baz';
import rule_24 from 'bpmnlint-plugin-exported/src/bar';

cache['bpmnlint-plugin-exported/baz'] = rule_24;
cache['bpmnlint-plugin-exported/bar'] = rule_24;

import rule_25 from 'bpmnlint-plugin-exported/src/foo';
import rule_25 from 'bpmnlint-plugin-exported/rules/baz';

cache['bpmnlint-plugin-exported/foo-absolute'] = rule_25;
cache['bpmnlint-plugin-exported/baz'] = rule_25;

import rule_26 from 'bpmnlint-plugin-exported/src/foo';

cache['bpmnlint-plugin-exported/foo-absolute'] = rule_26;
56 changes: 56 additions & 0 deletions test/rules/superfluous-label.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import RuleTester from '../../lib/testers/rule-tester.js';

import rule from '../../rules/superfluous-label.js';

import {
readModdle
} from '../../lib/testers/helper.js';

import { stubCJS } from '../helper.mjs';

const {
__dirname
} = stubCJS(import.meta.url);


const message = 'Element has superfluous label/name';


RuleTester.verify('superfluous-label', rule, {
valid: [
{
moddleElement: readModdle(__dirname + '/superfluous-label/valid.bpmn')
}
],
invalid: [
{
moddleElement: readModdle(__dirname + '/no-gateway-join-fork/invalid.bpmn'),
report: [
{
id: 'GATEWAY',
message,
path: [
'name'
],
category: 'error'
},
{
id: 'DEFAULT_FLOW',
message,
path: [
'name'
],
category: 'error'
},
{
id: 'SIMPLE_FLOW',
message,
path: [
'name'
],
category: 'error'
}
]
}
]
});
59 changes: 59 additions & 0 deletions test/rules/superfluous-label/invalid.bpmn
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1xzqysc" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="5.20.0-nightly.20240107" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.4.0">
<bpmn:category id="Category_0frzuuu">
<bpmn:categoryValue id="CategoryValue_1c207z7" value="YES" />
</bpmn:category>
<bpmn:process id="Process_1gm33ca" isExecutable="true">
<bpmn:task id="Activity_09ai1fm">
<bpmn:incoming>DEFAULT_FLOW</bpmn:incoming>
</bpmn:task>
<bpmn:task id="Activity_13btrmx" default="DEFAULT_FLOW">
<bpmn:outgoing>DEFAULT_FLOW</bpmn:outgoing>
</bpmn:task>
<bpmn:exclusiveGateway id="GATEWAY" name="YES" />
<bpmn:sequenceFlow id="DEFAULT_FLOW" name="YES" sourceRef="Activity_13btrmx" targetRef="Activity_09ai1fm" />
<bpmn:task id="Activity_1y46za8">
<bpmn:outgoing>SIMPLE_FLOW</bpmn:outgoing>
</bpmn:task>
<bpmn:task id="Activity_1rk2pdz">
<bpmn:incoming>SIMPLE_FLOW</bpmn:incoming>
</bpmn:task>
<bpmn:sequenceFlow id="SIMPLE_FLOW" name="YES" sourceRef="Activity_1y46za8" targetRef="Activity_1rk2pdz" />
</bpmn:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1gm33ca">
<bpmndi:BPMNShape id="BPMNShape_1dehp3m" bpmnElement="Activity_09ai1fm">
<dc:Bounds x="540" y="270" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_0w2bqdl" bpmnElement="Activity_13btrmx">
<dc:Bounds x="290" y="270" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="BPMNShape_0b6gxc3" bpmnElement="GATEWAY" isMarkerVisible="true">
<dc:Bounds x="705" y="122" width="50" height="50" />
<bpmndi:BPMNLabel>
<dc:Bounds x="719" y="92" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1y46za8_di" bpmnElement="Activity_1y46za8">
<dc:Bounds x="160" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNShape id="Activity_1rk2pdz_di" bpmnElement="Activity_1rk2pdz">
<dc:Bounds x="340" y="80" width="100" height="80" />
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge id="BPMNEdge_1qj5lpq" bpmnElement="DEFAULT_FLOW">
<di:waypoint x="390" y="310" />
<di:waypoint x="540" y="310" />
<bpmndi:BPMNLabel>
<dc:Bounds x="454" y="292" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge id="Flow_0tg4vy1_di" bpmnElement="SIMPLE_FLOW">
<di:waypoint x="260" y="120" />
<di:waypoint x="340" y="120" />
<bpmndi:BPMNLabel>
<dc:Bounds x="289" y="102" width="22" height="14" />
</bpmndi:BPMNLabel>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</bpmn:definitions>
Loading