diff --git a/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn
new file mode 100644
index 0000000..9dcdbc9
--- /dev/null
+++ b/Rechnungseingang/src/main/resources/DMN_HoeheRechnungssumme.dmn
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >= 10000
+
+
+ false
+
+
+
+
+ < 10000
+
+
+ true
+
+
+
+
+
diff --git a/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn b/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn
new file mode 100644
index 0000000..1d75243
--- /dev/null
+++ b/Rechnungseingang/src/main/resources/DMN_Zahlungsziel.dmn
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) <= 1
+
+
+ true
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) > 1
+
+
+ false
+
+
+
+
+
diff --git a/Rechnungseingang/src/main/resources/process.bpmn b/Rechnungseingang/src/main/resources/process.bpmn
index 404475f..457ba93 100644
--- a/Rechnungseingang/src/main/resources/process.bpmn
+++ b/Rechnungseingang/src/main/resources/process.bpmn
@@ -1,5 +1,5 @@
-
+
@@ -11,49 +11,54 @@
-
- Activity_1nxd2jr
- Event_1mwritv
- Gateway_07mt2sj
+
+ Gateway_Lieferscheinpruefen
+ Activity_1b029kn
+ Event_0p7ms1x
+ Activity_0snbir8
-
- Gateway_12i5die
- Activity_0vq3ho7
- Activity_0jdjg2h
- Gateway_0lfg2b2
- Event_1czv0yh
- Activity_1x7zph6
- Gateway_1y79rn0
- Gateway_01r6r9e
- Activity_108exu6
+
+ Activity_1ovc6n5
+ Event_1350hwr
Activity_1uloahn
Gateway_1m9g2lh
Activity_14ny5c3
Activity_060riuq
- Gateway_0slfj8c
+ Gateway_Zahlungsziel
Activity_0pq4lxv
Event_1wc0kk6
- Gateway_0ufclm7
+ Gateway_Formalpruefen
-
- Activity_1ovc6n5
- Event_1350hwr
+
+ Gateway_HoeheRechnungssumme
+ Activity_0vq3ho7
+ Activity_0jdjg2h
+ Gateway_0lfg2b2
+ Event_1czv0yh
+ Gateway_1y79rn0
+ Gateway_01r6r9e
+ Activity_108exu6
+ Activity_1x7zph6
-
- Gateway_14wptg0
- Activity_1b029kn
- Event_0p7ms1x
- Activity_0snbir8
+
+ Activity_1nxd2jr
+ Event_1mwritv
+ Gateway_Vorgangfreigeben
-
+
Flow_17ny5uv
Flow_1aijtcn
Flow_1kjf7y9
+
+
+
+
+
Flow_0bvc46v
Flow_17ny5uv
@@ -85,6 +90,12 @@
+
+
+
+
+
+
Flow_1kjf7y9
Flow_11zwlrd
@@ -112,12 +123,17 @@
DataObjectReference_0plzlak
-
+
Flow_0uk4now
Flow_0fpeqn8
Flow_1wh7ll1
+
+
+
+
+
Flow_11zwlrd
Flow_1dqx4w4
@@ -130,7 +146,7 @@
Flow_1r20qxv
-
+
Flow_1dqx4w4
Flow_1a5ycoj
Flow_1r20qxv
@@ -139,16 +155,16 @@
-
+
Flow_1hogzdg
Flow_1sjj2gm
Flow_06iwtj7
-
+
Flow_1fwe2w7
Flow_0uk4now
-
+
Flow_1mj7tm1
Flow_1hogzdg
@@ -158,6 +174,11 @@
Flow_1mj7tm1
+
+
+
+
+
Flow_1sjj2gm
Flow_0ivc5ab
@@ -165,7 +186,7 @@
Flow_0dub3tg
-
+
Flow_0ivc5ab
Flow_0dub3tg
Flow_0a59c48
@@ -173,15 +194,6 @@
Flow_0vok3bx
-
- Flow_0p94qch
- Flow_0vok3bx
-
-
- DataObjectReference_08ly05s
- Property_00cbv43
-
-
Flow_00dngjn
Flow_1jt6q3y
@@ -194,15 +206,6 @@
-
- Flow_0zftkwh
- Flow_0p94qch
-
-
- DataObjectReference_0fpian9
- Property_0u4bllb
-
-
@@ -213,7 +216,7 @@
-
+
Flow_145gpqj
Flow_0bvc46v
@@ -232,34 +235,72 @@
Flow_145gpqj
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Flow_0zftkwh
+ Flow_0p94qch
+
+
+ DataObjectReference_0fpian9
+ Property_1froj4a
+
+
+
+ Flow_0p94qch
+ Flow_0vok3bx
+
+
+ DataObjectReference_08ly05s
+ Property_1lqg73b
+
+
+
+ #{FormField_Bool_Lieferscheinpruefen}
+
+
+
+ #{not FormField_Bool_Lieferscheinpruefen}
+
+
+
+
+
+ #{not FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{FormField_bool_Zahlungsziel}
+
+
+ #{not FormField_bool_Zahlungsziel}
+
+
+
+
+ #{not FormField_bool_Formalpruefen}
+
+
+ #{FormField_bool_Formalpruefen}
+
+
+
+ #{FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{not FormField_bool_Vorgangpruefen}
+
+
+ #{FormField_bool_Vorgangpruefen}
+
+
+
+
+
Nachricht an den Einkauf
@@ -279,13 +320,13 @@ eingegangen
-
+
Flow_0kd9ypk
-
+
Flow_0kd9ypk
@@ -296,8 +337,8 @@ eingegangen
Flow_05nfk8a
-
+
@@ -312,477 +353,476 @@ eingegangen
Flow_02liz1g
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html b/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html
new file mode 100644
index 0000000..68f6071
--- /dev/null
+++ b/Rechnungseingang/src/main/webapp/forms/RechnungScannen.html
@@ -0,0 +1,6 @@
+
diff --git a/Rechnungseingang/target/Rechnungseingang.war b/Rechnungseingang/target/Rechnungseingang.war
new file mode 100644
index 0000000..41e9397
Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang.war differ
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn
new file mode 100644
index 0000000..9dcdbc9
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_HoeheRechnungssumme.dmn
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >= 10000
+
+
+ false
+
+
+
+
+ < 10000
+
+
+ true
+
+
+
+
+
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn
new file mode 100644
index 0000000..1d75243
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/DMN_Zahlungsziel.dmn
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) <= 1
+
+
+ true
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) > 1
+
+
+ false
+
+
+
+
+
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml
new file mode 100644
index 0000000..417f437
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/META-INF/processes.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ default
+
+ false
+ true
+
+
+
+
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class
new file mode 100644
index 0000000..da208fb
Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/CamundaBpmProcessApplication.class differ
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class
new file mode 100644
index 0000000..5d5eb26
Binary files /dev/null and b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/com/bpmn/Rechnungseingang/LoggerDelegate.class differ
diff --git a/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn
new file mode 100644
index 0000000..457ba93
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/WEB-INF/classes/process.bpmn
@@ -0,0 +1,829 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Gateway_Lieferscheinpruefen
+ Activity_1b029kn
+ Event_0p7ms1x
+ Activity_0snbir8
+
+
+ Activity_1ovc6n5
+ Event_1350hwr
+
+
+ Activity_1uloahn
+ Gateway_1m9g2lh
+ Activity_14ny5c3
+ Activity_060riuq
+ Gateway_Zahlungsziel
+ Activity_0pq4lxv
+ Event_1wc0kk6
+ Gateway_Formalpruefen
+
+
+ Gateway_HoeheRechnungssumme
+ Activity_0vq3ho7
+ Activity_0jdjg2h
+ Gateway_0lfg2b2
+ Event_1czv0yh
+ Gateway_1y79rn0
+ Gateway_01r6r9e
+ Activity_108exu6
+ Activity_1x7zph6
+
+
+ Activity_1nxd2jr
+ Event_1mwritv
+ Gateway_Vorgangfreigeben
+
+
+
+ Flow_17ny5uv
+ Flow_1aijtcn
+ Flow_1kjf7y9
+
+
+
+
+
+
+
+ Flow_0bvc46v
+ Flow_17ny5uv
+
+
+ DataObjectReference_1anpq9i
+ Property_09aqjdw
+
+
+ DataObjectReference_1xniyui
+ Property_09aqjdw
+
+
+
+ Flow_1kx09zm
+
+
+
+ Flow_1aijtcn
+ Flow_1kx09zm
+
+
+ DataObjectReference_07vv3e8
+ Property_0v9359q
+
+
+ DataObjectReference_1at71qu
+
+
+
+
+
+
+
+
+
+
+
+ Flow_1kjf7y9
+ Flow_11zwlrd
+
+
+ DataObjectReference_1dwjb3m
+ Property_1963d32
+
+
+
+ Flow_1g8ipne
+ Flow_1h6imqg
+ Flow_1jt6q3y
+
+
+ Flow_1wh7ll1
+ Flow_1h6imqg
+
+ DataObjectReference_0plzlak
+
+
+
+ Flow_0fpeqn8
+ Flow_1g8ipne
+
+ DataObjectReference_0plzlak
+
+
+
+ Flow_0uk4now
+ Flow_0fpeqn8
+ Flow_1wh7ll1
+
+
+
+
+
+
+
+ Flow_11zwlrd
+ Flow_1dqx4w4
+
+
+ DataObjectReference_10dir96
+ Property_16649me
+
+
+
+ Flow_1r20qxv
+
+
+
+ Flow_1dqx4w4
+ Flow_1a5ycoj
+ Flow_1r20qxv
+
+
+
+
+
+
+ Flow_1hogzdg
+ Flow_1sjj2gm
+ Flow_06iwtj7
+
+
+ Flow_1fwe2w7
+ Flow_0uk4now
+
+
+ Flow_1mj7tm1
+ Flow_1hogzdg
+
+
+ Flow_1a5ycoj
+ Flow_1fwe2w7
+ Flow_1mj7tm1
+
+
+
+
+
+
+
+ Flow_1sjj2gm
+ Flow_0ivc5ab
+
+
+ Flow_0dub3tg
+
+
+
+ Flow_0ivc5ab
+ Flow_0dub3tg
+ Flow_0a59c48
+
+
+ Flow_0vok3bx
+
+
+ Flow_00dngjn
+ Flow_1jt6q3y
+ Flow_0zftkwh
+
+
+ Flow_0a59c48
+ Flow_06iwtj7
+ Flow_00dngjn
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Flow_145gpqj
+ Flow_0bvc46v
+
+
+ DataObjectReference_0aikf8k
+ Property_19sm0wk
+
+
+ DataObjectReference_0tpk221
+
+
+
+
+
+
+
+ Flow_145gpqj
+
+
+ Flow_0zftkwh
+ Flow_0p94qch
+
+
+ DataObjectReference_0fpian9
+ Property_1froj4a
+
+
+
+ Flow_0p94qch
+ Flow_0vok3bx
+
+
+ DataObjectReference_08ly05s
+ Property_1lqg73b
+
+
+
+
+ #{FormField_Bool_Lieferscheinpruefen}
+
+
+
+ #{not FormField_Bool_Lieferscheinpruefen}
+
+
+
+
+
+ #{not FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{FormField_bool_Zahlungsziel}
+
+
+ #{not FormField_bool_Zahlungsziel}
+
+
+
+
+ #{not FormField_bool_Formalpruefen}
+
+
+ #{FormField_bool_Formalpruefen}
+
+
+
+ #{FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{not FormField_bool_Vorgangpruefen}
+
+
+ #{FormField_bool_Vorgangpruefen}
+
+
+
+
+
+
+ Nachricht an den Einkauf
+
+
+ Rechnung
+eingegangen
+
+
+ Nachricht an Einkauf
+
+
+ Nachricht an den Einkauf
+
+
+ Vorgang automatisch freigegeben
+
+
+
+
+
+
+
+
+
+ Flow_0kd9ypk
+
+
+
+ Flow_0kd9ypk
+ Flow_05nfk8a
+
+
+
+ Flow_05nfk8a
+
+
+
+
+
+
+
+ Flow_1lvm3gr
+
+
+
+ Flow_1lvm3gr
+ Flow_02liz1g
+
+
+ Flow_02liz1g
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html b/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html
new file mode 100644
index 0000000..68f6071
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/forms/RechnungScannen.html
@@ -0,0 +1,6 @@
+
diff --git a/Rechnungseingang/target/Rechnungseingang/forms/start-form.html b/Rechnungseingang/target/Rechnungseingang/forms/start-form.html
new file mode 100644
index 0000000..ef755f0
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/forms/start-form.html
@@ -0,0 +1,24 @@
+Here you would put the actual form to start the process
+
+
+ You can use this form through Camunda Tasklist
+ by setting the formKey of a BPMN Start Event to:
+ embedded:app:forms/start-form.html
+
+
+
\ No newline at end of file
diff --git a/Rechnungseingang/target/Rechnungseingang/forms/task-form.html b/Rechnungseingang/target/Rechnungseingang/forms/task-form.html
new file mode 100644
index 0000000..2977392
--- /dev/null
+++ b/Rechnungseingang/target/Rechnungseingang/forms/task-form.html
@@ -0,0 +1,33 @@
+Here you would put the actual form to work on the task
+
+
+ You can use this form through Camunda Tasklist
+ by setting the formKey of a BPMN User Task to:
+ embedded:app:forms/task-form.html
+
+
+
\ No newline at end of file
diff --git a/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn b/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn
new file mode 100644
index 0000000..9dcdbc9
--- /dev/null
+++ b/Rechnungseingang/target/classes/DMN_HoeheRechnungssumme.dmn
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >= 10000
+
+
+ false
+
+
+
+
+ < 10000
+
+
+ true
+
+
+
+
+
diff --git a/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn b/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn
new file mode 100644
index 0000000..1d75243
--- /dev/null
+++ b/Rechnungseingang/target/classes/DMN_Zahlungsziel.dmn
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) <= 1
+
+
+ true
+
+
+
+
+ DayDiff(FormField_date_Zahlungsziel, Today()) > 1
+
+
+ false
+
+
+
+
+
diff --git a/Rechnungseingang/target/classes/process.bpmn b/Rechnungseingang/target/classes/process.bpmn
index 404475f..457ba93 100644
--- a/Rechnungseingang/target/classes/process.bpmn
+++ b/Rechnungseingang/target/classes/process.bpmn
@@ -1,5 +1,5 @@
-
+
@@ -11,49 +11,54 @@
-
- Activity_1nxd2jr
- Event_1mwritv
- Gateway_07mt2sj
+
+ Gateway_Lieferscheinpruefen
+ Activity_1b029kn
+ Event_0p7ms1x
+ Activity_0snbir8
-
- Gateway_12i5die
- Activity_0vq3ho7
- Activity_0jdjg2h
- Gateway_0lfg2b2
- Event_1czv0yh
- Activity_1x7zph6
- Gateway_1y79rn0
- Gateway_01r6r9e
- Activity_108exu6
+
+ Activity_1ovc6n5
+ Event_1350hwr
Activity_1uloahn
Gateway_1m9g2lh
Activity_14ny5c3
Activity_060riuq
- Gateway_0slfj8c
+ Gateway_Zahlungsziel
Activity_0pq4lxv
Event_1wc0kk6
- Gateway_0ufclm7
+ Gateway_Formalpruefen
-
- Activity_1ovc6n5
- Event_1350hwr
+
+ Gateway_HoeheRechnungssumme
+ Activity_0vq3ho7
+ Activity_0jdjg2h
+ Gateway_0lfg2b2
+ Event_1czv0yh
+ Gateway_1y79rn0
+ Gateway_01r6r9e
+ Activity_108exu6
+ Activity_1x7zph6
-
- Gateway_14wptg0
- Activity_1b029kn
- Event_0p7ms1x
- Activity_0snbir8
+
+ Activity_1nxd2jr
+ Event_1mwritv
+ Gateway_Vorgangfreigeben
-
+
Flow_17ny5uv
Flow_1aijtcn
Flow_1kjf7y9
+
+
+
+
+
Flow_0bvc46v
Flow_17ny5uv
@@ -85,6 +90,12 @@
+
+
+
+
+
+
Flow_1kjf7y9
Flow_11zwlrd
@@ -112,12 +123,17 @@
DataObjectReference_0plzlak
-
+
Flow_0uk4now
Flow_0fpeqn8
Flow_1wh7ll1
+
+
+
+
+
Flow_11zwlrd
Flow_1dqx4w4
@@ -130,7 +146,7 @@
Flow_1r20qxv
-
+
Flow_1dqx4w4
Flow_1a5ycoj
Flow_1r20qxv
@@ -139,16 +155,16 @@
-
+
Flow_1hogzdg
Flow_1sjj2gm
Flow_06iwtj7
-
+
Flow_1fwe2w7
Flow_0uk4now
-
+
Flow_1mj7tm1
Flow_1hogzdg
@@ -158,6 +174,11 @@
Flow_1mj7tm1
+
+
+
+
+
Flow_1sjj2gm
Flow_0ivc5ab
@@ -165,7 +186,7 @@
Flow_0dub3tg
-
+
Flow_0ivc5ab
Flow_0dub3tg
Flow_0a59c48
@@ -173,15 +194,6 @@
Flow_0vok3bx
-
- Flow_0p94qch
- Flow_0vok3bx
-
-
- DataObjectReference_08ly05s
- Property_00cbv43
-
-
Flow_00dngjn
Flow_1jt6q3y
@@ -194,15 +206,6 @@
-
- Flow_0zftkwh
- Flow_0p94qch
-
-
- DataObjectReference_0fpian9
- Property_0u4bllb
-
-
@@ -213,7 +216,7 @@
-
+
Flow_145gpqj
Flow_0bvc46v
@@ -232,34 +235,72 @@
Flow_145gpqj
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Flow_0zftkwh
+ Flow_0p94qch
+
+
+ DataObjectReference_0fpian9
+ Property_1froj4a
+
+
+
+ Flow_0p94qch
+ Flow_0vok3bx
+
+
+ DataObjectReference_08ly05s
+ Property_1lqg73b
+
+
+
+ #{FormField_Bool_Lieferscheinpruefen}
+
+
+
+ #{not FormField_Bool_Lieferscheinpruefen}
+
+
+
+
+
+ #{not FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{FormField_bool_Zahlungsziel}
+
+
+ #{not FormField_bool_Zahlungsziel}
+
+
+
+
+ #{not FormField_bool_Formalpruefen}
+
+
+ #{FormField_bool_Formalpruefen}
+
+
+
+ #{FormField_Boolean_HoeheRechnungssumme}
+
+
+
+
+
+ #{not FormField_bool_Vorgangpruefen}
+
+
+ #{FormField_bool_Vorgangpruefen}
+
+
+
+
+
Nachricht an den Einkauf
@@ -279,13 +320,13 @@ eingegangen
-
+
Flow_0kd9ypk
-
+
Flow_0kd9ypk
@@ -296,8 +337,8 @@ eingegangen
Flow_05nfk8a
-
+
@@ -312,477 +353,476 @@ eingegangen
Flow_02liz1g
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
-
-
+
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
-
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
+
+
-
-
+
+
+
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Rechnungseingang/target/maven-archiver/pom.properties b/Rechnungseingang/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..a842057
--- /dev/null
+++ b/Rechnungseingang/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Maven
+#Wed May 27 17:29:04 CEST 2020
+version=0.0.1-SNAPSHOT
+groupId=com.bpmn
+artifactId=Rechnungseingang
diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..c23db67
--- /dev/null
+++ b/Rechnungseingang/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,2 @@
+C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\main\java\com\bpmn\Rechnungseingang\CamundaBpmProcessApplication.java
+C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\main\java\com\bpmn\Rechnungseingang\LoggerDelegate.java
diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
new file mode 100644
index 0000000..e69de29
diff --git a/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..2befc62
--- /dev/null
+++ b/Rechnungseingang/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -0,0 +1 @@
+C:\Users\Philipp\Documents\GitHub\BPMN_Projekt\Rechnungseingang\src\test\java\com\bpmn\Rechnungseingang\ProcessUnitTest.java
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json
new file mode 100644
index 0000000..1bfbec0
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/.bower.json
@@ -0,0 +1,29 @@
+{
+ "name": "bpmn-js",
+ "version": "0.14.1",
+ "authors": [
+ "bpmn.io"
+ ],
+ "description": "A BPMN 2.0 renderer and web modeler",
+ "main": "dist/bpmn-viewer.js",
+ "keywords": [
+ "models",
+ "diagram",
+ "renderer",
+ "modeler",
+ "bpmn"
+ ],
+ "ignore": [
+ "test/*"
+ ],
+ "homepage": "http://bpmn.io",
+ "_release": "0.14.1",
+ "_resolution": {
+ "type": "version",
+ "tag": "v0.14.1",
+ "commit": "d28fbecf41b4f87507ef1a680f07dddd64e0e7bf"
+ },
+ "_source": "https://github.com/bpmn-io/bower-bpmn-js.git",
+ "_target": "0.14.1",
+ "_originalSource": "bpmn-js"
+}
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE
new file mode 100644
index 0000000..38500c2
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2014 camunda services GmbH
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in the
+Software without restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
+and to permit persons to whom the Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The source code responsible for displaying the bpmn.io logo (two green cogwheels in
+a box) that links back to http://bpmn.io as part of rendered diagrams MUST NOT be
+removed or changed.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
+OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md
new file mode 100644
index 0000000..92fbe2d
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/README.md
@@ -0,0 +1,46 @@
+# bpmn-js (pre-packaged version)
+
+This is a packaged version of [bpmn-js](https://github.com/bpmn-io/bpmn-js) for standalone usage or via [bower](http://bower.io).
+
+
+## Usage
+
+Download individual files from the [dist folder](https://github.com/bpmn-io/bower-bpmn-js/tree/master/dist) or
+fetch them with dependencies via `bower install bpmn-js`.
+
+Include the file(s) into your project
+
+```html
+
+
+
+
+
+
+
+
+
+```
+
+
+Checkout the [examples repository](https://github.com/bpmn-io/bpmn-js-examples) for a complete example of [how to use bpmn-js with bower](https://github.com/bpmn-io/bpmn-js-examples/tree/master/simple-bower).
+
+
+## License
+
+Use under the terms of the [bpmn-js license](http://bpmn.io/license).
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json
new file mode 100644
index 0000000..a05a1da
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/bower.json
@@ -0,0 +1,20 @@
+{
+ "name": "bpmn-js",
+ "version": "0.14.1",
+ "authors": [
+ "bpmn.io"
+ ],
+ "description": "A BPMN 2.0 renderer and web modeler",
+ "main": "dist/bpmn-viewer.js",
+ "keywords": [
+ "models",
+ "diagram",
+ "renderer",
+ "modeler",
+ "bpmn"
+ ],
+ "ignore": [
+ "test/*"
+ ],
+ "homepage": "http://bpmn.io"
+}
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css
new file mode 100644
index 0000000..8aab7ee
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css
@@ -0,0 +1,160 @@
+@font-face {
+ font-family: 'bpmn';
+ src: url('../font/bpmn.eot?43681877');
+ src: url('../font/bpmn.eot?43681877#iefix') format('embedded-opentype'),
+ url('../font/bpmn.svg?43681877#bpmn') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+@font-face {
+ font-family: 'bpmn';
+ src: url('data:application/octet-stream;base64,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') format('woff'),
+ url('data:application/octet-stream;base64,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AQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAfr+yAE4MVo+urp9AfIBAQEBBwICBAMEBAQJBAUGAwIJAgEBAQEBAQIFAQIDAwgEBQQJAwMDBwEBAQFTAQICBAcJCQoBCQcGBwMEAwQDBAcIBxQEDQQEIAMDAgICAgMDCAkFBgUFBAEEAQQFHA0EAQgEAQQEBAgBAwEDAQMECAMBAwQDAQYEBwgBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwQBAgIFDAUJBAMGAgEBAQEBAgIHAgIDAgICAQIDAwgFCQgDBQIBAgECAQICAgkCAQEBJwIDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ7AQIDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwOpAQQEAwQIBAQJBQQJDQQbBQ0JBAQJBAEEIgQFAQQEAwMCAQICAwQICQUEEgQLBAcEBAcECAQeBAgEBwQEBwQECQQEBAMELQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAIGCAgJBhEFBgUGCwUhBgsFBQoGDwEEARkFCgEEBgIBAQMCBAgJCAEpBAUFBAUFCQUiBQkFBQUFCgUXBQQHAgI5AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoAEEAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDB0oBAgEDBgwDAwUDAgEBAQQDAwQJBQQIAwMCAQEBAQIJAgICAQIBAgEBAQICAgEBAQQBAQEFBAMFBAUICAMCAScBAQMGBAkFBAQEAgUDBAkBBgkDAgECAwIBAgMEAwoCCAECAQICAwECAwMIBQQJBAMDAwQCAQIBAgECARAQBgIDBQkDCgECAgIPAgMFBgwUAQIBAgECAQIGAgYJBAUEBAQDAwIBAQECAgIBAgEIDAMEAwIBAgMCAQISAQkEAwUEBAQFCQQDAwQAAAAFAAD/hwO/AyIADwAeACYAKgAvAAABDgISFgQ3PgE3NiYnLgEHMhYXFgYHBiQnJgI3PgEXBgcXNRcRBycUFSclFBUmJwH0ieJpMLoBAn6BpAgHiXgvZjSH1yYiVGlw/vFqZz8zMMlqaWjRysoYjwFZR0gDIgGW+f72wj4sLtyJh+g9Fxgxo4J78UtPC1ZWAQN7cIb/SkqUj48BKI9gZGVkZWRmMzIAAAAJAAD/ogO4AyAACwAXAFIAuwFEAaEB6AIyAp4AAAEVIxUzFTM1MzUjNQczFTMVIxUjNSM1MxMrAQcjByMHFQ8FFR8FMz8DMzczNzM3MxczFzMXMx8BMz8DNS8EIzUjJyMnFw8GFR8KMx8GFR8CMx8NMz8ENS8BNScjLwYjLwE1Iy8LIy8BIy8HIzUnNS8EIwUPASMPBBUPBBUHIwcVDwMjFQcVByMVDwQVByMPARUPAhUPAiMPAxUPAxUHFQ8KFQcVHwQ/BDM/BDU/JjUvAwEPBRUXFQcVBxUHFQcVBxUHFQcVBxUHFQcVBxUPBxUfBD8FMz8BMz8BNT8BMzczNzU3NTM1NzU3NTc1NzU3NTc1NzU3NSc1LwQFDwUVFxUXFRczHwUzHwEVFxUXFRcVMxcVFxUfBD8ENS8NNSc1JzUnNS8DAQ8XHwQ/BDM/AzM3MzczNzM3Mzc1NzM3NTczPwIzNzM1PwM1LwQFDwUVHwMVHwEzHwIzHwIVHwEzHwEVHwEzFzMXMxczHwIzFzMXFTMfBzMXFRczFTMXMz8ENS8EIycjJyMnIy8KIy8EIy8FIwGufX2MfX11Xn19Xn19MwcNBg0NBycNDgQDAwQBAgMDCQQFBgwGFwYLBgYGBikGBgYGBgUfBAUMAwMCAgYDCicGBwYNB+kFBAQDAwECAgIGAgIDBgUEAwgBDgIIAgYCBAECAgECAwIDBQQDBAMKBQYDCQQJBAQDBAIEBgEEAwIDAgMCAQIIAQUDBAIEAgIFAgcCAgECCQECAgMHAwIDAgECAwIGAgoF/fMFBwECAwIDAgMCAwIDBAECAgMCBAEEBAECAgICAgIBAgICBAICBAEBAQIDAgIKAQICAgEEAQIBAgECAQICAQQEAw4ECAQDAQECAwECAgIBAgECAQIBAgIDAgECCAIBAgICAQQCBAEGAgoCBgMKAwYDBQMCAQQGCAUCsgQFAwYCAQEBAQEBAQECAQMFAwUDBAMCBgMBAgMGBAkJBAQDAgEBAwIBAgMDAgEFAQwDAQIBAQEBAQEBAQQDBAQI/KYEBQMEBAEBAwIBAwIBBAEKAQQDAgMCAQIDAQIEBwkJBAQDBAIEAgMCBwQBBgECAQIIAQEBAQUICAKxBAQJBAUKBA8FBQsPBgULBSEGCxAIBAUCAgQDBA0JBgYUBQESBgcFAQUBBQEFARwBCwUBBQUBBQsPAQQBAwMCAQQDBAQI/d4EBAQDAgIBAgMEDQIBAgMCAQIDAwsCAQgDAwUBAgECAQIBAgMDAQIBAgECBAMGAw0DHQIDDQQDDQkFCAUCAQQDBAQDBAgDFAIRAwkFEQIGBQMFBQUCAQ8CBQICAQQDBBEEBAUCIX2MfX2MfRd9Xn1+XQGTAQIGAQIEAgMECAkFBAQDBAECAgIEAgEBAQEBBQEGBAMJBQgIAgQGAQEBTwEBAwMEBAQFCQQGAQIBBgMEAggOAwgDBgMEAQICAwQDBAMHBwMIAxIKCAIEAgIDAwgKBwcBDAgEBAQEBAQECwEHAwYCBgIDBQMHAwIDCQMCAgcCAgICAQEBAgIEAgUMAQQCAgICAgECAgICAgEEAgECAgMEAQQBBAECAwIDAgECAwIBAgYCAQIGAwMCBQIBAg8DAgECAQIDBgMDAwMDAwMDAQQJBQgDAwMBBAMDBAYFAwIFAQIDAgMCAwIDAwIFAgMCDAIDAgMCAwQDBAMGAwoDBgIKAQYCBQQEBAkJBgQB/sYBAgIIBAQEBDMDCQMGAgYDAwMDAwMGAgMDCQIOAwgBDQULBQYKBwQFCQQGAgICAgMDAwMGBgYFAQUHDyYDCgMDBwMDBAMDBAMDBAMHAw4DLAUJCAQCAwITAQIDAwgEGwYHEwcNEwYHDQYfDQUBBQEFAQUBBQEFAQEEBAQCAgIDAwkJCAYGBQYQCwYRBQYGBS8GBQYGDAYHBQcGAv6yAQIGBAQGBAkEAwUJAgMEAwwBBAMEAwcJCQgDAwMCAgEGAgYDAgMCAwMPBgEDAwEDBAcMBAEDBAQECQgEAwICAgEDAgQECQQFBAQDAQoCAgICAgIBAQcCBQEBAQMCAgECAQIBAQEBAQICAgQCCQEBBAEEAQQHBQQJCAQCAwEDBwYDAwYCAgMBAwIDAgkCAwIBBAEEDQECAAAAAQAAAAADQwKFACoAAAEOAQcGFhcmJwcWFzY3JicHJjY3PgEXHgEHDgEjDgEXFj8BPgE3NiYnLgECEWGcHhUWKUJEDHp4GBcdHhw0ATU3pkpGQhITgVIWDhEPEiJfiA4NVFEgSAKFAXJcQoo4DA47GBd4eAYFkUGmQEEgKCaQTVBmAScNCQIEEIpgXKQsERMAAwAAAAAC7gKKAAMABwALAAATETMRMxEzETMRMxH6ZGRkZGQCiv2oAlj9qAJY/agCWAAAAAkAAP+iA7wDIgADAAgAFgAiAC4APABKAFYAYwAAAQYHIQMWFyE2Ew4BBxY2FzYWFzYmByYXBhYXFhcWNicuAScFDgEHDgE3PgE3PgEBBhYHBgcUNjc+AScuAQUGFhceARcWJicmJy4BAQ4BBw4BFz4BNzYmIQYWFx4BFzYmJyYvAQH0YGABgMBLTP7STE8kVRIQRh4ePB0fSB8M7ik1Fi0fIA0WGT4o/fEmNBcUFysXKRwTJwKSHwoHCyA1BBcTBgIN/KQhDAMIFhUtGgsSAQIMAq4lRykdKiE5ZywKDP3TJTMbIkonISscTDwGAjKsrQEmh4eHAagDAyEfFgECCAIiGAIBTxA0EzI7EjYVKUgZChFBIRZKBSBFHRAt/tYMRh1BPCIKHjJtNggIEgtHHCNEHgNKHD0/CAv+sxMvDAEnFAozJQwbEjQNExwGEyYCFjMDAAARAAD/owO4AyIADQAaACkAbADCASABawGuAgYCUwKWAu4DRAOGA8sEFwRhAAABIg4BHgI3PgImJyYHMh4BBgcGLgI3PgEXBgcOARcWNjsBNSM2NyYnKwEVIw8DFR8EMzczNzMXMxczFzMXMxczHwYzPwU1LwIjLwkjJyMnIycjNQ8EIw8BFQcjDwEjBxUHIwcjByMHFQ8DIxUPARUPAiMPAR8FMz8dMz8DLwMjBQ8FHxYVHwQzPwQ1JzUvCDUnNS8EIycjJzUvASMnNSc1LwE1Iy8BNScjJzUvAjUvBAUPBRUjFQcVBxUjFQcVFxUzFRcVFxUXFR8JMz8ENS8CNSc1JzUnNSc1JzU3NTc1NzU3NTc1LwUFDwUVBxUPDxUfBT8CNT8BNTczNzU/AjM/CjU3LwQjBQ8FHwIVFxUXMxczHwIzHwEzFRcVFxUXMx8BMxczFxUXFR8BFR8CFR8CMz8FNS8dBQ8IIwcjByMHIwcjByMPBBUfBTM1MzczNzM3Mz8LMzczPwE1PwE1NzU/BDUvBCMDKwEHIwcjFSMHIw8HFR8EMzczNzM3MzczNzMXMxczFzMXMxczPwU1LwUjJyM1IycjJxcPBR8ZPwQ1LwMjJzUnNScjLwEjLwE1JyMnNS8BIy8BNSc1JyM1JyMnIy8BNS8BIyc1JyMvAgUPAhUHIw8BFQ8CFQcVBxUPASMPARUPAhUPASMPASMPARUHFQ8BIw8CFR8FMz8ZNS8EIwEPAxUHFxUHFQcVBxUHFQ8IFR8DMz8GNTc1Pwc1NzUzNTc1NzUnNS8DIwUPBBUXFRcVFxUXFR8HFRcVHwIzFR8DMz8ENS8LNSc1JzUnNSc1LwQjEw8EFR8FMx8BFRczFzMfARUfATMXFR8EMxczHwYzPwU1LxcFDxcVHwYzPwgzPwQ1NzM3Mzc1PwE1PwEzPwQ1LwQjAfRBbDEXWHs7Pk4GQzksMTxfHSwxNHhXDSEZTmQdHQ4EDAgPB1lZGx0KQwQODQoFBwYCAgMICAQBCAQmBAgDBAQEBwQIAxoDCAcHAwkFBAQEAwQBBAMHAQMFBAQEBAQJBCYECQUEBAUNsQUDBgcBAwgDARUDAQMDAQkBDAEJCQMDAgECAwMIBAEEAgICAwMIBAUECQMIAwIEAwIDAgMCAwIDAwMCAwMDAwMDAwMGAyMCAwQEAgIFBAgFAYQEBAQDAwMBBgMDAgMCAwIDAgMHFgEEAQQBBgMCAgQEAwQFCQQEBAMEAQICAgECAQIBAgICAQEBCAEBAQICBAECBwMCAQIDAgECBgMJAwMDBAn9xwQIAwMCAgECAQEBAQEBAgEIAgEBAQMDBAQEBQkEAwMEAQIFAwIBAQEBAQECAQECAwMJBAKNBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECAX9rgQEBAMCAgIFBgwGAQwBBgcDAQMDAQcHAwEHBwEDAQMECAQEDAQEBAQJBAQEBQIBAQQEAxUDBAoHGQMKAgMDAwMDAwMCBgMCAwIDAggOAaUEBAEHChwLBxIECwQHBAQHBAgEEAgEAwICAQQEAwQFEQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAUEpwUGBgsFDAUFBiYGCggEAgMBAQIGBAkEKwUJBQUFBQoFHgUKBQUFBQoEGAkFBAMEBAEBBAMEByYFBgULBgsG7wQFAwQEAgIIAgwHCAcEAwQDBAMHBgcPAgkCAxEEAwQJCQQEAwQBAgMCAQIDAgECEgEJBAYBAwQDAQMIBAMBAwEDAQgEBAQBBAgBBAoI/fQECAUEAQQEBAwEBAQIAwEDBAMEAwQJAQ8CAQIDAwUCAQQDAwECAwMIBAkFBwUFEAYCBgIPBwYHAwQDBAMEBwgEBAcCAQICAwQIBAKvBAgGAgEBAQEBAggCAQICBAEWAQEEAwwFCQQGBQQDCgIIAQIBAgICBwEBAQEBBAMECAT8pgQECAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFBJQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0NAhoEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIBAI0SXd8Wx4VFmqCbRwVJ0lybB4fDld7NCUrMTU2AxoHBQkZMzMG7wECAgUMBQkEAwYCAQEBAQECAgcCAgMCAgIBAgMDCAUJCAMFAgECAQIBAgICCQIBAQEnAQEDBQIEAQIPAwIBAgkMCQEJBAMDAQMDAQMLBwcJCQQDBAQBAQQDDAMEBgMDAgMDAwMDAwIDAwIDAgMCAwIDBAMWAwMICQkHAwQ8AQEDAwQNBQsCAwMDAwMDAgMDCiMDBwMHBA4LAwcDCAMDAgEBAwIECAkEAgQJBAQEBAQFAwEDAQMEAQMQBAMBAwgDAQoBAwMBAwMBAwMBBgQJAQMCAwMCqwEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBAF3AQIDAwgHBAcEGgMLCwcGBAMHFA8DBwEIBQQFCAMDAgICAgcBAxUBAwsBBxAEBAwEBAQEBAQJBCYFBQgEBAMEoQICAwMECQkJBgEMAQYMBgUDAwIBBAEEAQIFBAICAQEBBAEBAQYBAQECAQECAwcFBAUECAMDCQIBBgMQAwYDAgMCAwIDAgMGAgMDAwMDBwNNAQIBAwYMAwMFAwIBAQEEAwMECQUECAMDAgEBAQECCQICAgECAQIBAQECAgIBAQEEAQEBBQQDBQQFCAgDAgECzgEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHAgoBBAQBAwQDAQMMAwEDAQMBCAQEBAEEBAQBBA0XBQUEAQQBCQUKBQwEBQQEAwQBAgUHDB4IBAkEFAcIBwQDBAMEAwcGBAMHBQQECQQEAwT+xQEECAQEBAQeBQoFBQUFCQUnBQQFCQoEMgQFBAgEBgICBggKBRkBBAEUBgUFBQsGJgUGBQsGCwYWBgkIAwMEEAEBBggICQYRBQYFBgsFIQYLBQUKBg8BBAEZBQoBBAYCAQEDAgQICQgBKQQFBQQFBQkFIgUJBQUFBQoF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AQMGBAUJBAQEAwQCARIBAgECAQICAgcCAQEBAQIHAwUC8AQFBAQDBAICBwIDBQIEAQIDDAoDBAIEAQEEAwQECQgFBwMPAgEGBQgBAQEGAQIBAgECAgIJAQICAwQI/a0ECAQDAgICBQYMBgEMAQYHAwEDAwEHBwMBBwcBAwEDBAgEBAwEBAQECQQEBAUCAQEEBAMVAwQKBxkDCgIDAwMDAwMDAgYDAgMCAwIIAZwFBAQBBwocCwcSBAsEBwQEBwQIBBAIBAMCAgEEBAMEBQwFDQQFBAUIBSYECQQEBAQEBAEEAwEDAQMEBAgECQQCAgECBgMEBf5EBAUEBgICAQIDAwUEAQQNCQENAQQFBQQBBAUFCgUZAQQBFAYFBQULCgkFBAQDBAECAwMEBxMFBAUFBAUFBCUeCAQECQwDDQISBQQFAwEUBAQJCBYsBQUEBQUFBAUbBAYEAQECAwMEBAQJAwYFCwUFBQYUAR4FCgUFBAEEAQQFHA0EAQQFAwIBAgIDBAgCIX2MfX2MfRd9Xn1+XQGVAQEBAQcCAgQDBAQECQQFBgMCCQIBAQEBAQECBQECAwMIBAUECQMDAwcBAQEBUwECAgQHCQkKAQkHBgcDBAMEAwQHCAcUBA0EBCADAwICAgIDAwgJBQYFBQQBBAEEBRwNBAEIBAEEBAQIAQMBAwEDBAgDAQMEAwEGBAcIAQQEAQMEAwEDDAMBAwEDAQgEBAQBBAQEAQQNFwUFBAEEAQkFCgUMBAUEBAMEAQIFBwweCAQJBBQHCAcEAwQDBAMHBgQDBwUEBAkEBAMEAQICBQwFCQQDBgIBAQEBAQICBwICAwICAgECAwMIBQkIAwUCAQIBAgECAgIJAgEBAScCAwUCBAECDwMCAQIJDAkBCQQDAwEDAwEDCwcHCQkEAwQEAQEEAwwDBAYDAwIDAwMDAwMCAwMCAwIDAgMCAwQDFgMDCAkJBwMEOwECAwMEDQULAgMDAwMDAwIDAwojAwcDBwQOCwMHAwgDAwIBAQMCBAgJBAIECQQEBAQEBQMBAwEDBAEDEAQDAQMIAwEKAQMDAQMDAQMDAQYECQEDAgMDqQEEBAMECAQECQUECQ0EGwUNCQQECQQBBCIEBQEEBAMDAgECAgMECAkFBBIECwQHBAQHBAgEHgQIBAcEBAcEBAkEBAQDBC0BBAgEBAQEHgUKBQUFBQkF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CgUGAwkECQQEAwQCBAYBBAMCAwIDAgECCAEFAwQCBAICBQIHAgIBAgkBAgIDBwMCAwIBAgMCBgIKBf3zBQcBAgMCAwIDAgMCAwQBAgIDAgQBBAQBAgICAgICAQICAgQCAgQBAQECAwICCgECAgIBBAECAQIBAgECAgEEBAMOBAgEAwEBAgMBAgICAQIBAgECAQICAwIBAggCAQICAgEEAgQBBgIKAgYDCgMGAwUDAgEEBggFArIEBQMGAgEBAQEBAQEBAgEDBQMFAwQDAgYDAQIDBgQJCQQEAwIBAQMCAQIDAwIBBQEMAwECAQEBAQEBAQEEAwQECPymBAUDBAQBAQMCAQMCAQQBCgEEAwIDAgECAwECBAcJCQQEAwQCBAIDAgcEAQYBAgECCAEBAQEFCAgCsQQECQQFCgQPBQULDwYFCwUhBgsQCAQFAgIEAwQNCQYGFAUBEgYHBQEFAQUBBQEcAQsFAQUFAQULDwEEAQMDAgEEAwQECP3eBAQEAwICAQIDBA0CAQIDAgECAwMLAgEIAwMFAQIBAgECAQIDAwECAQIBAgQDBgMNAx0CAw0EAw0JBQgFAgEEAwQEAwQIAxQCEQMJBRECBgUDBQUFAgEPAgUCAgEEAwQRBAQFAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLQECBgECBAIDBAgJBQQEAwQBAgICBAIBAQEBAQUBBgQDCQUICAIEBgEBAU8BAQMDBAQEBQkEBgECAQYDBAIIDgMIAwYDBAECAgMEAwQDBwcDCAMSCggCBAICAwMICgcHAQwIBAQEBAQEBAsBBwMGAgYCAwUDBwMCAwkDAgIHAgICAgEBAQICBAIFDAEEAgICAgIBAgICAgIBBAIBAgIDBAEEAQQBAgMCAwIBAgMCAQIGAgECBgMDAgUCAQIPAwIBAgECAwYDAwMDAwMDAwEECQUIAwMDAQQDAwQGBQMCBQECAwIDAgMCAwMCBQIDAgwCAwIDAgMEAwQDBgMKAwYCCgEGAgUEBAQJCQYEAf7GAQICCAQEBAQzAwkDBgIGAwMDAwMDBgIDAwkCDgMIAQ0FCwUGCgcEBQkEBgICAgIDAwMDBgYGBQEFBw8mAwoDAwcDAwQDAwQDAwQDBwMOAywFCQgEAgMCEwECAwMIBBsGBxMHDRMGBw0GHw0FAQUBBQEFAQUBBQEBBAQEAgICAwMJ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CAMBFQMBAwMBCQEMAQkJAwMCAQIDAwgEAQQCAgIDAwgEBQQJAwgDAgQDAgMCAwIDAgMDAwIDAwMDAwMDAwYDIwIDBAQCAgUECAGEBQgEAwMDAQYDAwIDAgMCAwIDBxYBBAEEAQYDAgIEBAMEBQkEBAQDBAECAgIBAgECAQICAgEBAQgBAQECAgQBAgcDAgECAwIBAgYDCQMDAwT9wwUECAMDAgIBAgEBAQEBAQIBCAIBAQEDAwQEBAUJBAMDBAECBQMCAQEBAQEBAgEBAgMDCQLuBQQIBgIBAQEBAQIIAgECAgQBFgEBBAMMBQkEBgUEAwoCCAECAQICAgcBAQEBAQQDBAj8pwUICAQCAQEBAgYCAgIBBAEGAgoDBAEDBgQFCQQEBAMEAgESAQIBAgECAgIHAgEBAQECBwMFAvAEBQQEAwQCAgcCAwUCBAECAwwKAwQCBAEBBAMEBAkIBQcDDwIBBgUIAQEBBgECAQIBAgICCQECAgMECP2tBAgEAwICAgUGDAYBDAEGBwMBAwMBBwcDAQcHAQMBAwQIBAQMBAQEBAkEBAQFAgEBBAQDFQMECgcZAwoCAwMDAwMDAwIGAwIDAgMCCAGcBQQEAQcKHAsHEgQLBAcEBAcECAQQCAQDAgIBBAQDBAUMBQ0EBQQFCAUmBAkEBAQEBAQBBAMBAwEDBAQIBAkEAgIBAgYDBAX+RAQFBAYCAgECAwMFBAEEDQkBDQEEBQUEAQQFBQoFGQEEARQGBQUFCwoJBQQEAwQBAgMDBAcTBQQFBQQFBQQlHggEBAkMAw0CEgUEBQMBFAQECQgWLAUFBAUFBQQFGwQGBAEBAgMDBAQECQMGBQsFBQUGFAEeBQoFBQQBBAEEBRwNBAEEBQMCAQICAwQIAhwM/pABfBj+tAEnGRlKGBhVGBhNGBgCLwEBAQEHAgIEAwQEBAkEBQYDAgkCAQEBAQEBAgUBAgMDCAQFBAkDAwMHAQEBAVMBAgIEBwkJCgEJBwYHAwQDBAMEBwgHFAQNBAQgAwMCAgICAwMICQUGBQUEAQQBBAUcDQQBCAQBBAQECAEDAQMBAwQIAwEDBAMBBgQHCAEEBAEDBAMBAwwDAQMBAwEIBAQEAQQEBAEEDRcFBQQBBAEJBQoFDAQFBAQDBAECBQcMHggECQQUBwgHBAMEAwQDBwYEAwcFBAQJBAQDBAECAgUM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bHRpcGxlJWludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb21wZW5zYXRpb24LZ2F0ZXdheS14b3IKY29ubmVjdGlvbhBlbmQtZXZlbnQtY2FuY2VsImludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1jb25kaXRpb247aW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW5vbi1pbnRlcnJ1cHRpbmctcGFyYWxsZWwtbXVsdGlwbGUVc3RhcnQtZXZlbnQtY29uZGl0aW9uInN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctdGltZXIUc2VxdWVudGlhbC1taS1tYXJrZXIJdXNlci10YXNrDWJ1c2luZXNzLXJ1bGUSc3ViLXByb2Nlc3MtbWFya2VyHXN0YXJ0LWV2ZW50LXBhcmFsbGVsLW11bHRpcGxlEXN0YXJ0LWV2ZW50LWVycm9yH2ludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1zaWduYWweaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLWVycm9yFmVuZC1ldmVudC1jb21wZW5zYXRpb24Uc3VicHJvY2Vzcy1jb2xsYXBzZWQTc3VicHJvY2Vzcy1leHBhbmRlZAR0YXNrD2VuZC1ldmVudC1lcnJvciNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtZXNjYWxhdGlvbh5pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtdGltZXIWc3RhcnQtZXZlbnQtZXNjYWxhdGlvbhJzdGFydC1ldmVudC1zaWduYWwSYnVzaW5lc3MtcnVsZS10YXNrBm1hbnVhbAdyZWNlaXZlDWNhbGwtYWN0aXZpdHkRc3RhcnQtZXZlbnQtdGltZXITc3RhcnQtZXZlbnQtbWVzc2FnZRdpbnRlcm1lZGlhdGUtZXZlbnQtbm9uZR1pbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbGluaxRlbmQtZXZlbnQtZXNjYWxhdGlvbg90ZXh0LWFubm90YXRpb24HYnBtbi1pbw9nYXRld2F5LWNvbXBsZXgSZ2F0ZXdheS1ldmVudGJhc2VkDGdhdGV3YXktbm9uZQpnYXRld2F5LW9yE2VuZC1ldmVudC10ZXJtaW5hdGUQZW5kLWV2ZW50LXNpZ25hbA5lbmQtZXZlbnQtbm9uZRJlbmQtZXZlbnQtbXVsdGlwbGURZW5kLWV2ZW50LW1lc3NhZ2UOZW5kLWV2ZW50LWxpbmsgaW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW1lc3NhZ2UlaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWNvbXBlbnNhdGlvbhRzdGFydC1ldmVudC1tdWx0aXBsZQZzY3JpcHQLbWFudWFsLXRhc2sEc2VuZAdzZXJ2aWNlDHJlY2VpdmUtdGFzawR1c2VyEHN0YXJ0LWV2ZW50LW5vbmUjaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWVzY2FsYXRpb24haW50ZXJtZWRpYXRlLWV2ZW50LWNhdGNoLW11bHRpcGxlNGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLWVzY2FsYXRpb24daW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LWxpbmsmc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LZGF0YS1vYmplY3QLc2NyaXB0LXRhc2sJc2VuZC10YXNrCmRhdGEtc3RvcmUnc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1lc2NhbGF0aW9uIGludGVybWVkaWF0ZS1ldmVudC10aHJvdy1tZXNzYWdlMmludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLW11bHRpcGxlMGludGVybWVkaWF0ZS1ldmVudC1jYXRjaC1ub24taW50ZXJydXB0aW5nLXNpZ25hbCFpbnRlcm1lZGlhdGUtZXZlbnQtdGhyb3ctbXVsdGlwbGUkc3RhcnQtZXZlbnQtbm9uLWludGVycnVwdGluZy1tZXNzYWdlDWFkLWhvYy1tYXJrZXIMc2VydmljZS10YXNrCXRhc2stbm9uZRNjb21wZW5zYXRpb24tbWFya2VyJXN0YXJ0LWV2ZW50LW5vbi1pbnRlcnJ1cHRpbmctbXVsdGlwbGUfaW50ZXJtZWRpYXRlLWV2ZW50LXRocm93LXNpZ25hbDNpbnRlcm1lZGlhdGUtZXZlbnQtY2F0Y2gtbm9uLWludGVycnVwdGluZy1jb25kaXRpb24LcGFydGljaXBhbnQZZXZlbnQtc3VicHJvY2Vzcy1leHBhbmRlZBFsYW5lLWluc2VydC1iZWxvdwpzcGFjZS10b29sEGNvbm5lY3Rpb24tbXVsdGkEbGFuZQpsYXNzby10b29sEWxhbmUtaW5zZXJ0LWFib3ZlEWxhbmUtZGl2aWRlLXRocmVlD2xhbmUtZGl2aWRlLXR3bwpkYXRhLWlucHV0C2RhdGEtb3V0cHV0CWhhbmQtdG9vbAt0cmFuc2FjdGlvbgAAAA==') format('truetype');
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'bpmn';
+ src: url('../font/bpmn.svg?43681877#bpmn') format('svg');
+ }
+}
+*/
+
+ [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
+ font-family: "bpmn";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */
+.bpmn-icon-trash:before { content: '\e801'; } /* '' */
+.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */
+.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */
+.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
+.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
+.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
+.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
+.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
+.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
+.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
+.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
+.bpmn-icon-connection:before { content: '\e810'; } /* '' */
+.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
+.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
+.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
+.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
+.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
+.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
+.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
+.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
+.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
+.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
+.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
+.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
+.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
+.bpmn-icon-task:before { content: '\e821'; } /* '' */
+.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
+.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
+.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
+.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
+.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
+.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
+.bpmn-icon-manual:before { content: '\e828'; } /* '' */
+.bpmn-icon-receive:before { content: '\e829'; } /* '' */
+.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
+.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
+.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
+.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
+.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
+.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
+.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */
+.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
+.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
+.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
+.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
+.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
+.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
+.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
+.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
+.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
+.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
+.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
+.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
+.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
+.bpmn-icon-script:before { content: '\e83f'; } /* '' */
+.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
+.bpmn-icon-send:before { content: '\e841'; } /* '' */
+.bpmn-icon-service:before { content: '\e842'; } /* '' */
+.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
+.bpmn-icon-user:before { content: '\e844'; } /* '' */
+.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
+.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
+.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
+.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
+.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
+.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
+.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
+.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
+.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
+.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
+.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
+.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
+.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
+.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
+.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
+.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
+.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
+.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
+.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
+.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
+.bpmn-icon-lane:before { content: '\e861'; } /* '' */
+.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
+.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
+.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
+.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
+.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
+.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
+.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
+.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css
new file mode 100644
index 0000000..a8b7725
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/css/bpmn.css
@@ -0,0 +1,162 @@
+@font-face {
+ font-family: 'bpmn';
+ src: url('../font/bpmn.eot?70672887');
+ src: url('../font/bpmn.eot?70672887#iefix') format('embedded-opentype'),
+ url('../font/bpmn.woff?70672887') format('woff'),
+ url('../font/bpmn.ttf?70672887') format('truetype'),
+ url('../font/bpmn.svg?70672887#bpmn') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
+/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
+/*
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+ @font-face {
+ font-family: 'bpmn';
+ src: url('../font/bpmn.svg?70672887#bpmn') format('svg');
+ }
+}
+*/
+
+ [class^="bpmn-icon-"]:before, [class*=" bpmn-icon-"]:before {
+ font-family: "bpmn";
+ font-style: normal;
+ font-weight: normal;
+ speak: none;
+
+ display: inline-block;
+ text-decoration: inherit;
+ width: 1em;
+ margin-right: .2em;
+ text-align: center;
+ /* opacity: .8; */
+
+ /* For safety - reset parent styles, that can break glyph codes*/
+ font-variant: normal;
+ text-transform: none;
+
+ /* fix buttons height, for twitter bootstrap */
+ line-height: 1em;
+
+ /* Animation center compensation - margins should be symmetric */
+ /* remove if not needed */
+ margin-left: .2em;
+
+ /* you can be more comfortable with increased icons size */
+ /* font-size: 120%; */
+
+ /* Font smoothing. That was taken from TWBS */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ /* Uncomment for 3D effect */
+ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
+}
+
+.bpmn-icon-screw-wrench:before { content: '\e800'; } /* '' */
+.bpmn-icon-trash:before { content: '\e801'; } /* '' */
+.bpmn-icon-conditional-flow:before { content: '\e802'; } /* '' */
+.bpmn-icon-default-flow:before { content: '\e803'; } /* '' */
+.bpmn-icon-gateway-parallel:before { content: '\e804'; } /* '' */
+.bpmn-icon-intermediate-event-catch-cancel:before { content: '\e805'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-message:before { content: '\e806'; } /* '' */
+.bpmn-icon-start-event-compensation:before { content: '\e807'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-parallel-multiple:before { content: '\e808'; } /* '' */
+.bpmn-icon-loop-marker:before { content: '\e809'; } /* '' */
+.bpmn-icon-parallel-mi-marker:before { content: '\e80a'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-signal:before { content: '\e80b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-timer:before { content: '\e80c'; } /* '' */
+.bpmn-icon-intermediate-event-catch-parallel-multiple:before { content: '\e80d'; } /* '' */
+.bpmn-icon-intermediate-event-catch-compensation:before { content: '\e80e'; } /* '' */
+.bpmn-icon-gateway-xor:before { content: '\e80f'; } /* '' */
+.bpmn-icon-connection:before { content: '\e810'; } /* '' */
+.bpmn-icon-end-event-cancel:before { content: '\e811'; } /* '' */
+.bpmn-icon-intermediate-event-catch-condition:before { content: '\e812'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-parallel-multiple:before { content: '\e813'; } /* '' */
+.bpmn-icon-start-event-condition:before { content: '\e814'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-timer:before { content: '\e815'; } /* '' */
+.bpmn-icon-sequential-mi-marker:before { content: '\e816'; } /* '' */
+.bpmn-icon-user-task:before { content: '\e817'; } /* '' */
+.bpmn-icon-business-rule:before { content: '\e818'; } /* '' */
+.bpmn-icon-sub-process-marker:before { content: '\e819'; } /* '' */
+.bpmn-icon-start-event-parallel-multiple:before { content: '\e81a'; } /* '' */
+.bpmn-icon-start-event-error:before { content: '\e81b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-signal:before { content: '\e81c'; } /* '' */
+.bpmn-icon-intermediate-event-catch-error:before { content: '\e81d'; } /* '' */
+.bpmn-icon-end-event-compensation:before { content: '\e81e'; } /* '' */
+.bpmn-icon-subprocess-collapsed:before { content: '\e81f'; } /* '' */
+.bpmn-icon-subprocess-expanded:before { content: '\e820'; } /* '' */
+.bpmn-icon-task:before { content: '\e821'; } /* '' */
+.bpmn-icon-end-event-error:before { content: '\e822'; } /* '' */
+.bpmn-icon-intermediate-event-catch-escalation:before { content: '\e823'; } /* '' */
+.bpmn-icon-intermediate-event-catch-timer:before { content: '\e824'; } /* '' */
+.bpmn-icon-start-event-escalation:before { content: '\e825'; } /* '' */
+.bpmn-icon-start-event-signal:before { content: '\e826'; } /* '' */
+.bpmn-icon-business-rule-task:before { content: '\e827'; } /* '' */
+.bpmn-icon-manual:before { content: '\e828'; } /* '' */
+.bpmn-icon-receive:before { content: '\e829'; } /* '' */
+.bpmn-icon-call-activity:before { content: '\e82a'; } /* '' */
+.bpmn-icon-start-event-timer:before { content: '\e82b'; } /* '' */
+.bpmn-icon-start-event-message:before { content: '\e82c'; } /* '' */
+.bpmn-icon-intermediate-event-none:before { content: '\e82d'; } /* '' */
+.bpmn-icon-intermediate-event-catch-link:before { content: '\e82e'; } /* '' */
+.bpmn-icon-end-event-escalation:before { content: '\e82f'; } /* '' */
+.bpmn-icon-text-annotation:before { content: '\e830'; } /* '' */
+.bpmn-icon-bpmn-io:before { content: '\e831'; } /* '' */
+.bpmn-icon-gateway-complex:before { content: '\e832'; } /* '' */
+.bpmn-icon-gateway-eventbased:before { content: '\e833'; } /* '' */
+.bpmn-icon-gateway-none:before { content: '\e834'; } /* '' */
+.bpmn-icon-gateway-or:before { content: '\e835'; } /* '' */
+.bpmn-icon-end-event-terminate:before { content: '\e836'; } /* '' */
+.bpmn-icon-end-event-signal:before { content: '\e837'; } /* '' */
+.bpmn-icon-end-event-none:before { content: '\e838'; } /* '' */
+.bpmn-icon-end-event-multiple:before { content: '\e839'; } /* '' */
+.bpmn-icon-end-event-message:before { content: '\e83a'; } /* '' */
+.bpmn-icon-end-event-link:before { content: '\e83b'; } /* '' */
+.bpmn-icon-intermediate-event-catch-message:before { content: '\e83c'; } /* '' */
+.bpmn-icon-intermediate-event-throw-compensation:before { content: '\e83d'; } /* '' */
+.bpmn-icon-start-event-multiple:before { content: '\e83e'; } /* '' */
+.bpmn-icon-script:before { content: '\e83f'; } /* '' */
+.bpmn-icon-manual-task:before { content: '\e840'; } /* '' */
+.bpmn-icon-send:before { content: '\e841'; } /* '' */
+.bpmn-icon-service:before { content: '\e842'; } /* '' */
+.bpmn-icon-receive-task:before { content: '\e843'; } /* '' */
+.bpmn-icon-user:before { content: '\e844'; } /* '' */
+.bpmn-icon-start-event-none:before { content: '\e845'; } /* '' */
+.bpmn-icon-intermediate-event-throw-escalation:before { content: '\e846'; } /* '' */
+.bpmn-icon-intermediate-event-catch-multiple:before { content: '\e847'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-escalation:before { content: '\e848'; } /* '' */
+.bpmn-icon-intermediate-event-throw-link:before { content: '\e849'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-condition:before { content: '\e84a'; } /* '' */
+.bpmn-icon-data-object:before { content: '\e84b'; } /* '' */
+.bpmn-icon-script-task:before { content: '\e84c'; } /* '' */
+.bpmn-icon-send-task:before { content: '\e84d'; } /* '' */
+.bpmn-icon-data-store:before { content: '\e84e'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-escalation:before { content: '\e84f'; } /* '' */
+.bpmn-icon-intermediate-event-throw-message:before { content: '\e850'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-multiple:before { content: '\e851'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-signal:before { content: '\e852'; } /* '' */
+.bpmn-icon-intermediate-event-throw-multiple:before { content: '\e853'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-message:before { content: '\e854'; } /* '' */
+.bpmn-icon-ad-hoc-marker:before { content: '\e855'; } /* '' */
+.bpmn-icon-service-task:before { content: '\e856'; } /* '' */
+.bpmn-icon-task-none:before { content: '\e857'; } /* '' */
+.bpmn-icon-compensation-marker:before { content: '\e858'; } /* '' */
+.bpmn-icon-start-event-non-interrupting-multiple:before { content: '\e859'; } /* '' */
+.bpmn-icon-intermediate-event-throw-signal:before { content: '\e85a'; } /* '' */
+.bpmn-icon-intermediate-event-catch-non-interrupting-condition:before { content: '\e85b'; } /* '' */
+.bpmn-icon-participant:before { content: '\e85c'; } /* '' */
+.bpmn-icon-event-subprocess-expanded:before { content: '\e85d'; } /* '' */
+.bpmn-icon-lane-insert-below:before { content: '\e85e'; } /* '' */
+.bpmn-icon-space-tool:before { content: '\e85f'; } /* '' */
+.bpmn-icon-connection-multi:before { content: '\e860'; } /* '' */
+.bpmn-icon-lane:before { content: '\e861'; } /* '' */
+.bpmn-icon-lasso-tool:before { content: '\e862'; } /* '' */
+.bpmn-icon-lane-insert-above:before { content: '\e863'; } /* '' */
+.bpmn-icon-lane-divide-three:before { content: '\e864'; } /* '' */
+.bpmn-icon-lane-divide-two:before { content: '\e865'; } /* '' */
+.bpmn-icon-data-input:before { content: '\e866'; } /* '' */
+.bpmn-icon-data-output:before { content: '\e867'; } /* '' */
+.bpmn-icon-hand-tool:before { content: '\e868'; } /* '' */
+.bpmn-icon-transaction:before { content: '\e8c4'; } /* '' */
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot
new file mode 100644
index 0000000..f7900ea
Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.eot differ
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg
new file mode 100644
index 0000000..5c7316e
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.svg
@@ -0,0 +1,117 @@
+
+
+
+camunda Services GmbH
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf
new file mode 100644
index 0000000..aa4c957
Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.ttf differ
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff
new file mode 100644
index 0000000..8f240aa
Binary files /dev/null and b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/bpmn-font/font/bpmn.woff differ
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css
new file mode 100644
index 0000000..623153b
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/assets/diagram-js.css
@@ -0,0 +1,561 @@
+/**
+ * outline styles
+ */
+
+.djs-outline {
+ fill: none;
+ visibility: hidden;
+}
+
+.djs-element.hover .djs-outline,
+.djs-element.selected .djs-outline {
+ visibility: visible;
+ shape-rendering: crispEdges;
+ stroke-dasharray: 3,3;
+}
+
+.djs-element.selected .djs-outline {
+ stroke: #8888FF;
+ stroke-width: 1px;
+}
+
+.djs-element.hover .djs-outline {
+ stroke: #FF8888;
+ stroke-width: 1px;
+}
+
+.djs-shape.connect-ok .djs-visual > :nth-child(1) {
+ fill: #DCFECC /* light-green */ !important;
+}
+
+.djs-shape.connect-not-ok .djs-visual > :nth-child(1),
+.djs-shape.drop-not-ok .djs-visual > :nth-child(1) {
+ fill: #f9dee5 /* light-red */ !important;
+}
+
+.djs-shape.new-parent .djs-visual > :nth-child(1) {
+ fill: #F7F9FF !important;
+}
+
+svg.drop-not-ok {
+ background: #f9dee5 /* light-red */ !important;
+}
+
+svg.new-parent {
+ background: #F7F9FF /* light-blue */ !important;
+}
+
+.djs-connection.connect-ok .djs-visual > :nth-child(1),
+.djs-connection.drop-ok .djs-visual > :nth-child(1) {
+ stroke: #90DD5F /* light-green */ !important;
+}
+
+.djs-connection.connect-not-ok .djs-visual > :nth-child(1),
+.djs-connection.drop-not-ok .djs-visual > :nth-child(1) {
+ stroke: #E56283 /* light-red */ !important;
+}
+
+.drop-not-ok,
+.connect-not-ok {
+ cursor: not-allowed;
+}
+
+.djs-element.attach-ok .djs-visual > :nth-child(1) {
+ stroke-width: 5px !important;
+ stroke: rgba(255, 116, 0, 0.7);
+}
+
+
+/**
+* Selection box style
+*
+*/
+.djs-lasso-overlay {
+ fill: rgb(255, 116, 0);
+ fill-opacity: 0.1;
+
+ stroke-dasharray: 5 1 3 1;
+ stroke: rgb(255, 116, 0);
+
+ shape-rendering: crispEdges;
+ pointer-events: none;
+}
+
+/**
+ * Resize styles
+ */
+.djs-resize-overlay {
+ fill: white;
+ fill-opacity: 0.8;
+
+ stroke-dasharray: 5 1 3 1;
+ stroke: rgb(255, 116, 0);
+
+ pointer-events: none;
+}
+
+.djs-resizer-hit {
+ fill: none;
+ pointer-events: all;
+}
+
+.djs-resizer-visual {
+ fill: white;
+ stroke-width: 1px;
+ stroke: black;
+ shape-rendering: crispEdges;
+ stroke-opacity: 0.2;
+}
+
+.djs-cursor-resize-nwse,
+.djs-resizer-nw,
+.djs-resizer-se {
+ cursor: nwse-resize;
+}
+
+.djs-cursor-resize-nesw,
+.djs-resizer-ne,
+.djs-resizer-sw {
+ cursor: nesw-resize;
+}
+
+.djs-shape.djs-resizing > .djs-outline {
+ visibility: hidden !important;
+}
+
+.djs-shape.djs-resizing > .djs-resizer {
+ visibility: hidden;
+}
+
+.djs-dragger > .djs-resizer {
+ visibility: hidden;
+}
+
+/**
+ * drag styles
+ */
+.djs-dragger {
+ fill: white;
+ fill-opacity: 0.6;
+ stroke: #333;
+}
+
+.djs-dragger .djs-visual > :first-child {
+ stroke: rgb(255, 116, 0) !important;
+}
+
+.djs-dragging {
+ opacity: 0.3;
+}
+
+.djs-dragging,
+.djs-dragging > * {
+ pointer-events: none !important;
+}
+
+.djs-dragging .djs-context-pad,
+.djs-dragging .djs-outline {
+ display: none !important;
+}
+
+/**
+ * no pointer events for visual
+ */
+.djs-visual,
+.djs-outline {
+ pointer-events: none;
+}
+
+/**
+ * all pointer events for hit shape
+ */
+.djs-shape .djs-hit {
+ pointer-events: all;
+}
+
+.djs-connection .djs-hit {
+ pointer-events: stroke;
+}
+
+/**
+ * shape / connection basic styles
+ */
+.djs-connection .djs-visual {
+ stroke-width: 2px;
+ fill: none;
+}
+
+.djs-cursor-grab {
+ cursor: -webkit-grab;
+ cursor: -moz-grab;
+ cursor: grab;
+}
+
+.djs-cursor-grabbing {
+ cursor: -webkit-grabbing;
+ cursor: -moz-grabbing;
+ cursor: grabbing;
+}
+
+.djs-cursor-crosshair {
+ cursor: crosshair;
+}
+
+.djs-cursor-move {
+ cursor: move;
+}
+
+.djs-cursor-resize-ns {
+ cursor: ns-resize;
+}
+
+.djs-cursor-resize-ew {
+ cursor: ew-resize;
+}
+
+
+/**
+ * snapping
+ */
+.djs-snap-line {
+ stroke: rgb(255, 195, 66);
+ stroke: rgba(255, 195, 66, 0.50);
+ stroke-linecap: round;
+ stroke-width: 2px;
+ pointer-events: none;
+}
+
+/**
+ * snapping
+ */
+.djs-crosshair {
+ stroke: #555;
+ stroke-linecap: round;
+ stroke-width: 1px;
+ pointer-events: none;
+ shape-rendering: crispEdges;
+ stroke-dasharray: 5, 5;
+}
+
+/**
+ * palette
+ */
+
+.djs-palette {
+ position: absolute;
+ left: 20px;
+ top: 20px;
+}
+
+.djs-palette:not(.open) {
+ overflow: hidden;
+}
+
+.djs-palette .entry,
+.djs-palette .djs-palette-toggle {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+ cursor: default;
+}
+
+.djs-palette .separator {
+ margin: 3px 5px 5px 5px;
+ border: none;
+ border-top: solid 1px #DDD;
+};
+
+.djs-palette .entry:before {
+ vertical-align: middle;
+}
+
+.djs-palette .djs-palette-toggle {
+ cursor: pointer;
+}
+
+.djs-palette .entry,
+.djs-palette .djs-palette-toggle {
+ color: #333;
+ font-size: 30px;
+
+ text-align: center;
+}
+
+.djs-palette .entry img {
+ max-width: 100%;
+}
+
+.djs-palette.open .djs-palette-toggle {
+ height: 10px;
+}
+
+.djs-palette:not(.open) .djs-palette-entries {
+ display: none;
+}
+
+.djs-palette .djs-palette-toggle:hover {
+ background: #666;
+}
+
+.djs-palette .entry:hover {
+ color: rgb(255, 116, 0);
+}
+
+.highlighted-entry {
+ color: rgb(255, 116, 0) !important;
+}
+
+/**
+ * context-pad
+ */
+.djs-overlay-context-pad {
+ width: 72px;
+}
+
+.djs-context-pad {
+ position: absolute;
+ display: none;
+ pointer-events: none;
+}
+
+.djs-context-pad .entry {
+ width: 22px;
+ height: 22px;
+ text-align: center;
+ display: inline-block;
+ font-size: 22px;
+ margin: 0 2px 2px 0;
+
+ border-radius: 3px;
+
+ cursor: default;
+
+ background-color: #FEFEFE;
+ box-shadow: 0 0 2px 1px #FEFEFE;
+
+ pointer-events: all;
+}
+
+.djs-context-pad .entry:before {
+ vertical-align: top;
+}
+
+.djs-context-pad .entry:hover {
+ background: rgb(255, 252, 176);
+}
+
+.djs-context-pad.open {
+ display: block;
+}
+
+/**
+ * popup styles
+ */
+.djs-popup .entry {
+ line-height: 20px;
+ white-space: nowrap;
+ border: solid 1px transparent;
+ cursor: default;
+}
+
+/* larger font for prefixed icons */
+.djs-popup .entry:before {
+ vertical-align: middle;
+ font-size: 20px;
+}
+
+.djs-popup .entry > span {
+ vertical-align: middle;
+ font-size: 14px;
+}
+
+.djs-popup .entry:hover,
+.djs-popup .entry.active:hover {
+ background: rgb(255, 252, 176);
+}
+
+.djs-popup .entry.disabled {
+ background: inherit;
+}
+
+.djs-popup .entry.active {
+ color: rgb(255, 116, 0);
+ border: solid 1px rgb(255, 116, 0);
+ border-radius: 3px;
+ background-color: #F6F6F6;
+}
+
+.djs-popup-body .entry {
+ padding: 2px 10px 2px 5px;
+}
+
+.djs-popup-header .entry {
+ display: inline-block;
+ padding: 2px 3px 2px 3px;
+}
+
+.djs-popup-body .entry > span {
+ margin-left: 5px;
+}
+
+.djs-popup-body {
+ background-color: #FEFEFE;
+}
+
+.djs-popup-header {
+ border-bottom: 1px solid #DDD;
+}
+
+.djs-popup-header .entry {
+ margin: 1px;
+ margin-left: 3px;
+}
+
+.djs-popup-header .entry:last-child {
+ margin-right: 3px;
+}
+
+/**
+ * popup / palette styles
+ */
+.djs-popup, .djs-palette {
+ background: #FAFAFA;
+ border: solid 1px #CCC;
+ border-radius: 2px;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.3);
+}
+
+/**
+ * touch
+ */
+
+.djs-shape,
+.djs-connection {
+ touch-action: none;
+}
+
+.djs-segment-dragger,
+.djs-bendpoint {
+ display: none;
+}
+
+/**
+ * bendpoints
+ */
+.djs-segment-dragger .djs-visual {
+ fill: rgba(255, 255, 121, 0.2);
+ stroke-width: 1px;
+ stroke-opacity: 1;
+ stroke: rgba(255, 255, 121, 0.3);
+}
+
+.djs-bendpoint .djs-visual {
+ fill: rgba(255, 255, 121, 0.8);
+ stroke-width: 1px;
+ stroke-opacity: 0.5;
+ stroke: black;
+}
+
+.djs-segment-dragger:hover,
+.djs-bendpoints.hover .djs-segment-dragger,
+.djs-bendpoints.selected .djs-segment-dragger,
+.djs-bendpoint:hover,
+.djs-bendpoints.hover .djs-bendpoint,
+.djs-bendpoints.selected .djs-bendpoint {
+ display: block;
+}
+
+.djs-drag-active .djs-bendpoints * {
+ display: none;
+}
+
+.djs-bendpoints:not(.hover) .floating {
+ display: none;
+}
+
+.djs-segment-dragger:hover .djs-visual,
+.djs-segment-dragger.djs-dragging .djs-visual,
+.djs-bendpoint:hover .djs-visual,
+.djs-bendpoint.floating .djs-visual {
+ fill: yellow;
+ stroke-opacity: 0.5;
+ stroke: black;
+}
+
+.djs-bendpoint.floating .djs-hit {
+ pointer-events: none;
+}
+
+.djs-segment-dragger .djs-hit,
+.djs-bendpoint .djs-hit {
+ pointer-events: all;
+ fill: none;
+}
+
+.djs-segment-dragger.horizontal .djs-hit {
+ cursor: ns-resize;
+}
+
+.djs-segment-dragger.vertical .djs-hit {
+ cursor: ew-resize;
+}
+
+.djs-segment-dragger.djs-dragging .djs-hit {
+ pointer-events: none;
+}
+
+.djs-updating,
+.djs-updating > * {
+ pointer-events: none !important;
+}
+
+.djs-updating .djs-context-pad,
+.djs-updating .djs-outline,
+.djs-updating .djs-bendpoint,
+.connect-ok .djs-bendpoint,
+.connect-not-ok .djs-bendpoint,
+.drop-ok .djs-bendpoint,
+.drop-not-ok .djs-bendpoint {
+ display: none !important;
+}
+
+.djs-segment-dragger.djs-dragging,
+.djs-bendpoint.djs-dragging {
+ display: block;
+ opacity: 1.0;
+}
+
+.djs-segment-dragger.djs-dragging .djs-visual,
+.djs-bendpoint.djs-dragging .djs-visual {
+ fill: yellow;
+ stroke-opacity: 0.5;
+}
+
+
+/**
+ * tooltips
+ */
+.djs-tooltip-error {
+ font-size: 11px;
+ line-height: 18px;
+ text-align: left;
+
+ padding: 5px;
+
+ opacity: 0.7;
+}
+
+.djs-tooltip-error > * {
+ width: 160px;
+
+ background: rgb(252, 236, 240);
+ color: rgb(158, 76, 76);
+ padding: 3px 7px;
+ box-shadow: 0 1px 2px rgba(0,0,0, 0.2);
+ border-radius: 5px;
+ border-left: solid 5px rgb(174, 73, 73);
+}
+
+.djs-tooltip-error:hover {
+ opacity: 1;
+}
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js
new file mode 100644
index 0000000..04a7060
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/bpmn-js/dist/bpmn-modeler.js
@@ -0,0 +1,52125 @@
+/*!
+ * bpmn-js - bpmn-modeler v0.14.1
+
+ * Copyright 2014, 2015 camunda Services GmbH and other contributors
+ *
+ * Released under the bpmn.io license
+ * http://bpmn.io/license
+ *
+ * Source Code: https://github.com/bpmn-io/bpmn-js
+ *
+ * Date: 2016-03-23
+ */
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.BpmnJS = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o' +
+ '' +
+ '' +
+ ' ' +
+ ' ' +
+ '' +
+ '' +
+ '' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ' +
+ ' ';
+
+
+/**
+ * A modeler for BPMN 2.0 diagrams.
+ *
+ *
+ * ## Extending the Modeler
+ *
+ * In order to extend the viewer pass extension modules to bootstrap via the
+ * `additionalModules` option. An extension module is an object that exposes
+ * named services.
+ *
+ * The following example depicts the integration of a simple
+ * logging component that integrates with interaction events:
+ *
+ *
+ * ```javascript
+ *
+ * // logging component
+ * function InteractionLogger(eventBus) {
+ * eventBus.on('element.hover', function(event) {
+ * console.log()
+ * })
+ * }
+ *
+ * InteractionLogger.$inject = [ 'eventBus' ]; // minification save
+ *
+ * // extension module
+ * var extensionModule = {
+ * __init__: [ 'interactionLogger' ],
+ * interactionLogger: [ 'type', InteractionLogger ]
+ * };
+ *
+ * // extend the viewer
+ * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });
+ * bpmnModeler.importXML(...);
+ * ```
+ *
+ *
+ * ## Customizing / Replacing Components
+ *
+ * You can replace individual diagram components by redefining them in override modules.
+ * This works for all components, including those defined in the core.
+ *
+ * Pass in override modules via the `options.additionalModules` flag like this:
+ *
+ * ```javascript
+ * function CustomContextPadProvider(contextPad) {
+ *
+ * contextPad.registerProvider(this);
+ *
+ * this.getContextPadEntries = function(element) {
+ * // no entries, effectively disable the context pad
+ * return {};
+ * };
+ * }
+ *
+ * CustomContextPadProvider.$inject = [ 'contextPad' ];
+ *
+ * var overrideModule = {
+ * contextPadProvider: [ 'type', CustomContextPadProvider ]
+ * };
+ *
+ * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});
+ * ```
+ *
+ * @param {Object} [options] configuration options to pass to the viewer
+ * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body.
+ * @param {String|Number} [options.width] the width of the viewer
+ * @param {String|Number} [options.height] the height of the viewer
+ * @param {Object} [options.moddleExtensions] extension packages to provide
+ * @param {Array} [options.modules] a list of modules to override the default modules
+ * @param {Array} [options.additionalModules] a list of modules to use with the default modules
+ */
+function Modeler(options) {
+ Viewer.call(this, options);
+
+ // hook ID collection into the modeler
+ this.on('import.parse.complete', function(event) {
+ if (!event.error) {
+ this._collectIds(event.definitions, event.context);
+ }
+ }, this);
+
+ this.on('diagram.destroy', function() {
+ this.moddle.ids.clear();
+ }, this);
+}
+
+inherits(Modeler, Viewer);
+
+module.exports = Modeler;
+
+/**
+ * Create a new diagram to start modeling.
+ *
+ * @param {Function} [done]
+ */
+Modeler.prototype.createDiagram = function(done) {
+ return this.importXML(initialDiagram, done);
+};
+
+/**
+ * Create a moddle instance, attaching ids to it.
+ *
+ * @param {Object} options
+ */
+Modeler.prototype._createModdle = function(options) {
+ var moddle = Viewer.prototype._createModdle.call(this, options);
+
+ // attach ids to moddle to be able to track
+ // and validated ids in the BPMN 2.0 XML document
+ // tree
+ moddle.ids = new Ids([ 32, 36, 1 ]);
+
+ return moddle;
+};
+
+/**
+ * Collect ids processed during parsing of the
+ * definitions object.
+ *
+ * @param {ModdleElement} definitions
+ * @param {Context} context
+ */
+Modeler.prototype._collectIds = function(definitions, context) {
+
+ var moddle = definitions.$model,
+ ids = moddle.ids,
+ id;
+
+ // remove references from previous import
+ ids.clear();
+
+ for (id in context.elementsById) {
+ ids.claim(id, context.elementsById[id]);
+ }
+};
+
+
+Modeler.prototype._interactionModules = [
+ // non-modeling components
+ _dereq_(16),
+ _dereq_(8),
+ _dereq_(216),
+ _dereq_(212),
+ _dereq_(213)
+];
+
+Modeler.prototype._modelingModules = [
+ // modeling components
+ _dereq_(166),
+ _dereq_(118),
+ _dereq_(182),
+ _dereq_(196),
+ _dereq_(141),
+ _dereq_(133),
+ _dereq_(12),
+ _dereq_(62),
+ _dereq_(43),
+ _dereq_(10),
+ _dereq_(49),
+ _dereq_(54)
+];
+
+
+// modules the modeler is composed of
+//
+// - viewer modules
+// - interaction modules
+// - modeling modules
+
+Modeler.prototype._modules = [].concat(
+ Modeler.prototype._modules,
+ Modeler.prototype._interactionModules,
+ Modeler.prototype._modelingModules);
+},{"10":10,"118":118,"12":12,"133":133,"141":141,"16":16,"166":166,"182":182,"196":196,"2":2,"212":212,"213":213,"216":216,"241":241,"243":243,"43":43,"49":49,"54":54,"62":62,"8":8}],2:[function(_dereq_,module,exports){
+/**
+ * The code in the area
+ * must not be changed.
+ *
+ * @see http://bpmn.io/license for more information.
+ */
+'use strict';
+
+var assign = _dereq_(377),
+ omit = _dereq_(381),
+ isString = _dereq_(374),
+ isNumber = _dereq_(371);
+
+var domify = _dereq_(394),
+ domQuery = _dereq_(397),
+ domRemove = _dereq_(398);
+
+var Diagram = _dereq_(96),
+ BpmnModdle = _dereq_(72);
+
+
+var inherits = _dereq_(243);
+
+var Importer = _dereq_(65);
+
+
+function checkValidationError(err) {
+
+ // check if we can help the user by indicating wrong BPMN 2.0 xml
+ // (in case he or the exporting tool did not get that right)
+
+ var pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/;
+ var match = pattern.exec(err.message);
+
+ if (match) {
+ err.message =
+ 'unparsable content <' + match[1] + '> detected; ' +
+ 'this may indicate an invalid BPMN 2.0 diagram file' + match[2];
+ }
+
+ return err;
+}
+
+var DEFAULT_OPTIONS = {
+ width: '100%',
+ height: '100%',
+ position: 'relative',
+ container: 'body'
+};
+
+
+/**
+ * Ensure the passed argument is a proper unit (defaulting to px)
+ */
+function ensureUnit(val) {
+ return val + (isNumber(val) ? 'px' : '');
+}
+
+/**
+ * A viewer for BPMN 2.0 diagrams.
+ *
+ * Have a look at {@link NavigatedViewer} or {@link Modeler} for bundles that include
+ * additional features.
+ *
+ *
+ * ## Extending the Viewer
+ *
+ * In order to extend the viewer pass extension modules to bootstrap via the
+ * `additionalModules` option. An extension module is an object that exposes
+ * named services.
+ *
+ * The following example depicts the integration of a simple
+ * logging component that integrates with interaction events:
+ *
+ *
+ * ```javascript
+ *
+ * // logging component
+ * function InteractionLogger(eventBus) {
+ * eventBus.on('element.hover', function(event) {
+ * console.log()
+ * })
+ * }
+ *
+ * InteractionLogger.$inject = [ 'eventBus' ]; // minification save
+ *
+ * // extension module
+ * var extensionModule = {
+ * __init__: [ 'interactionLogger' ],
+ * interactionLogger: [ 'type', InteractionLogger ]
+ * };
+ *
+ * // extend the viewer
+ * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });
+ * bpmnViewer.importXML(...);
+ * ```
+ *
+ * @param {Object} [options] configuration options to pass to the viewer
+ * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body.
+ * @param {String|Number} [options.width] the width of the viewer
+ * @param {String|Number} [options.height] the height of the viewer
+ * @param {Object} [options.moddleExtensions] extension packages to provide
+ * @param {Array} [options.modules] a list of modules to override the default modules
+ * @param {Array} [options.additionalModules] a list of modules to use with the default modules
+ */
+function Viewer(options) {
+
+ options = assign({}, DEFAULT_OPTIONS, options);
+
+ this.moddle = this._createModdle(options);
+
+ this.container = this._createContainer(options);
+
+ /* */
+
+ addProjectLogo(this.container);
+
+ /* */
+
+ this._init(this.container, this.moddle, options);
+}
+
+inherits(Viewer, Diagram);
+
+module.exports = Viewer;
+
+
+/**
+ * Parse and render a BPMN 2.0 diagram.
+ *
+ * Once finished the viewer reports back the result to the
+ * provided callback function with (err, warnings).
+ *
+ * ## Life-Cycle Events
+ *
+ * During import the viewer will fire life-cycle events:
+ *
+ * * import.parse.start (about to read model from xml)
+ * * import.parse.complete (model read; may have worked or not)
+ * * import.render.start (graphical import start)
+ * * import.render.complete (graphical import finished)
+ * * import.done (everything done)
+ *
+ * You can use these events to hook into the life-cycle.
+ *
+ * @param {String} xml the BPMN 2.0 xml
+ * @param {Function} [done] invoked with (err, warnings=[])
+ */
+Viewer.prototype.importXML = function(xml, done) {
+
+ // done is optional
+ done = done || function() {};
+
+ var self = this;
+
+ // hook in pre-parse listeners +
+ // allow xml manipulation
+ xml = this._emit('import.parse.start', { xml: xml }) || xml;
+
+ this.moddle.fromXML(xml, 'bpmn:Definitions', function(err, definitions, context) {
+
+ // hook in post parse listeners +
+ // allow definitions manipulation
+ definitions = self._emit('import.parse.complete', {
+ error: err,
+ definitions: definitions,
+ context: context
+ }) || definitions;
+
+ if (err) {
+ err = checkValidationError(err);
+
+ self._emit('import.done', { error: err });
+
+ return done(err);
+ }
+
+ var parseWarnings = context.warnings;
+
+ self.importDefinitions(definitions, function(err, importWarnings) {
+ var allWarnings = [].concat(parseWarnings, importWarnings || []);
+
+ self._emit('import.done', { error: err, warnings: allWarnings });
+
+ done(err, allWarnings);
+ });
+ });
+};
+
+/**
+ * Export the currently displayed BPMN 2.0 diagram as
+ * a BPMN 2.0 XML document.
+ *
+ * @param {Object} [options] export options
+ * @param {Boolean} [options.format=false] output formated XML
+ * @param {Boolean} [options.preamble=true] output preamble
+ *
+ * @param {Function} done invoked with (err, xml)
+ */
+Viewer.prototype.saveXML = function(options, done) {
+
+ if (!done) {
+ done = options;
+ options = {};
+ }
+
+ var definitions = this.definitions;
+
+ if (!definitions) {
+ return done(new Error('no definitions loaded'));
+ }
+
+ this.moddle.toXML(definitions, options, done);
+};
+
+/**
+ * Export the currently displayed BPMN 2.0 diagram as
+ * an SVG image.
+ *
+ * @param {Object} [options]
+ * @param {Function} done invoked with (err, svgStr)
+ */
+Viewer.prototype.saveSVG = function(options, done) {
+
+ if (!done) {
+ done = options;
+ options = {};
+ }
+
+ var canvas = this.get('canvas');
+
+ var contentNode = canvas.getDefaultLayer(),
+ defsNode = canvas._svg.select('defs');
+
+ var contents = contentNode.innerSVG(),
+ defs = (defsNode && defsNode.outerSVG()) || '';
+
+ var bbox = contentNode.getBBox();
+
+ var svg =
+ '\n' +
+ '\n' +
+ '\n' +
+ '' +
+ defs + contents +
+ ' ';
+
+ done(null, svg);
+};
+
+/**
+ * Get a named diagram service.
+ *
+ * @example
+ *
+ * var elementRegistry = viewer.get('elementRegistry');
+ * var startEventShape = elementRegistry.get('StartEvent_1');
+ *
+ * @param {String} name
+ *
+ * @return {Object} diagram service instance
+ *
+ * @method Viewer#get
+ */
+
+/**
+ * Invoke a function in the context of this viewer.
+ *
+ * @example
+ *
+ * viewer.invoke(function(elementRegistry) {
+ * var startEventShape = elementRegistry.get('StartEvent_1');
+ * });
+ *
+ * @param {Function} fn to be invoked
+ *
+ * @return {Object} the functions return value
+ *
+ * @method Viewer#invoke
+ */
+
+/**
+ * Remove all drawn elements from the viewer.
+ *
+ * After calling this method the viewer can still
+ * be reused for opening another diagram.
+ *
+ * @method Viewer#clear
+ */
+
+Viewer.prototype.importDefinitions = function(definitions, done) {
+
+ // use try/catch to not swallow synchronous exceptions
+ // that may be raised during model parsing
+ try {
+
+ if (this.definitions) {
+ // clear existing rendered diagram
+ this.clear();
+ }
+
+ // update definitions
+ this.definitions = definitions;
+
+ // perform graphical import
+ Importer.importBpmnDiagram(this, definitions, done);
+ } catch (e) {
+
+ // handle synchronous errors
+ done(e);
+ }
+};
+
+Viewer.prototype.getModules = function() {
+ return this._modules;
+};
+
+/**
+ * Destroy the viewer instance and remove all its
+ * remainders from the document tree.
+ */
+Viewer.prototype.destroy = function() {
+
+ // diagram destroy
+ Diagram.prototype.destroy.call(this);
+
+ // dom detach
+ domRemove(this.container);
+};
+
+/**
+ * Register an event listener
+ *
+ * Remove a previously added listener via {@link #off(event, callback)}.
+ *
+ * @param {String} event
+ * @param {Number} [priority]
+ * @param {Function} callback
+ * @param {Object} [that]
+ */
+Viewer.prototype.on = function(event, priority, callback, target) {
+ return this.get('eventBus').on(event, priority, callback, target);
+};
+
+/**
+ * De-register an event listener
+ *
+ * @param {String} event
+ * @param {Function} callback
+ */
+Viewer.prototype.off = function(event, callback) {
+ this.get('eventBus').off(event, callback);
+};
+
+
+Viewer.prototype._init = function(container, moddle, options) {
+
+ var baseModules = options.modules || this.getModules(),
+ additionalModules = options.additionalModules || [],
+ staticModules = [
+ {
+ bpmnjs: [ 'value', this ],
+ moddle: [ 'value', moddle ]
+ }
+ ];
+
+ var diagramModules = [].concat(staticModules, baseModules, additionalModules);
+
+ var diagramOptions = assign(omit(options, 'additionalModules'), {
+ canvas: assign({}, options.canvas, { container: container }),
+ modules: diagramModules
+ });
+
+ // invoke diagram constructor
+ Diagram.call(this, diagramOptions);
+};
+
+/**
+ * Emit an event on the underlying {@link EventBus}
+ *
+ * @param {String} type
+ * @param {Object} event
+ *
+ * @return {Object} event processing result (if any)
+ */
+Viewer.prototype._emit = function(type, event) {
+ return this.get('eventBus').fire(type, event);
+};
+
+Viewer.prototype._createContainer = function(options) {
+
+ var parent = options.container,
+ container;
+
+ // support jquery element
+ // unwrap it if passed
+ if (parent.get) {
+ parent = parent.get(0);
+ }
+
+ // support selector
+ if (isString(parent)) {
+ parent = domQuery(parent);
+ }
+
+ container = domify('
');
+
+ assign(container.style, {
+ width: ensureUnit(options.width),
+ height: ensureUnit(options.height),
+ position: options.position
+ });
+
+ parent.appendChild(container);
+
+ return container;
+};
+
+Viewer.prototype._createModdle = function(options) {
+ var moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions);
+
+ return new BpmnModdle(moddleOptions);
+};
+
+
+// modules the viewer is composed of
+Viewer.prototype._modules = [
+ _dereq_(3),
+ _dereq_(204),
+ _dereq_(189),
+ _dereq_(171)
+];
+
+// default moddle extensions the viewer is composed of
+Viewer.prototype._moddleExtensions = {};
+
+/* */
+
+var PoweredBy = _dereq_(71),
+ domEvent = _dereq_(395);
+
+/**
+ * Adds the project logo to the diagram container as
+ * required by the bpmn.io license.
+ *
+ * @see http://bpmn.io/license
+ *
+ * @param {Element} container
+ */
+function addProjectLogo(container) {
+ var logoData = PoweredBy.BPMNIO_LOGO;
+
+ var linkMarkup =
+ '' +
+ ' ' +
+ ' ';
+
+ var linkElement = domify(linkMarkup);
+
+ container.appendChild(linkElement);
+
+ domEvent.bind(linkElement, 'click', function(event) {
+ PoweredBy.open();
+
+ event.preventDefault();
+ });
+}
+
+/* */
+},{"171":171,"189":189,"204":204,"243":243,"3":3,"371":371,"374":374,"377":377,"381":381,"394":394,"395":395,"397":397,"398":398,"65":65,"71":71,"72":72,"96":96}],3:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(6),
+ _dereq_(67)
+ ]
+};
+},{"6":6,"67":67}],4:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243),
+ isObject = _dereq_(372),
+ assign = _dereq_(377),
+ forEach = _dereq_(255),
+ every = _dereq_(252),
+ includes = _dereq_(257),
+ some = _dereq_(261);
+
+var BaseRenderer = _dereq_(107),
+ TextUtil = _dereq_(232),
+ DiUtil = _dereq_(68);
+
+var is = _dereq_(70).is;
+
+var RenderUtil = _dereq_(231);
+
+var componentsToPath = RenderUtil.componentsToPath,
+ createLine = RenderUtil.createLine;
+
+
+var TASK_BORDER_RADIUS = 10;
+var INNER_OUTER_DIST = 3;
+
+var LABEL_STYLE = {
+ fontFamily: 'Arial, sans-serif',
+ fontSize: '12px'
+};
+
+
+function BpmnRenderer(eventBus, styles, pathMap, priority) {
+
+ BaseRenderer.call(this, eventBus, priority);
+
+ var textUtil = new TextUtil({
+ style: LABEL_STYLE,
+ size: { width: 100 }
+ });
+
+ var markers = {};
+
+ var computeStyle = styles.computeStyle;
+
+ function addMarker(id, element) {
+ markers[id] = element;
+ }
+
+ function marker(id) {
+ return markers[id];
+ }
+
+ function initMarkers(svg) {
+
+ function createMarker(id, options) {
+ var attrs = assign({
+ fill: 'black',
+ strokeWidth: 1,
+ strokeLinecap: 'round',
+ strokeDasharray: 'none'
+ }, options.attrs);
+
+ var ref = options.ref || { x: 0, y: 0 };
+
+ var scale = options.scale || 1;
+
+ // fix for safari / chrome / firefox bug not correctly
+ // resetting stroke dash array
+ if (attrs.strokeDasharray === 'none') {
+ attrs.strokeDasharray = [10000, 1];
+ }
+
+ var marker = options.element
+ .attr(attrs)
+ .marker(0, 0, 20, 20, ref.x, ref.y)
+ .attr({
+ markerWidth: 20 * scale,
+ markerHeight: 20 * scale
+ });
+
+ return addMarker(id, marker);
+ }
+
+
+ createMarker('sequenceflow-end', {
+ element: svg.path('M 1 5 L 11 10 L 1 15 Z'),
+ ref: { x: 11, y: 10 },
+ scale: 0.5
+ });
+
+ createMarker('messageflow-start', {
+ element: svg.circle(6, 6, 3.5),
+ attrs: {
+ fill: 'white',
+ stroke: 'black'
+ },
+ ref: { x: 6, y: 6 }
+ });
+
+ createMarker('messageflow-end', {
+ element: svg.path('m 1 5 l 0 -3 l 7 3 l -7 3 z'),
+ attrs: {
+ fill: 'white',
+ stroke: 'black',
+ strokeLinecap: 'butt'
+ },
+ ref: { x: 8.5, y: 5 }
+ });
+
+ createMarker('association-start', {
+ element: svg.path('M 11 5 L 1 10 L 11 15'),
+ attrs: {
+ fill: 'none',
+ stroke: 'black',
+ strokeWidth: 1.5
+ },
+ ref: { x: 1, y: 10 },
+ scale: 0.5
+ });
+
+ createMarker('association-end', {
+ element: svg.path('M 1 5 L 11 10 L 1 15'),
+ attrs: {
+ fill: 'none',
+ stroke: 'black',
+ strokeWidth: 1.5
+ },
+ ref: { x: 12, y: 10 },
+ scale: 0.5
+ });
+
+ createMarker('conditional-flow-marker', {
+ element: svg.path('M 0 10 L 8 6 L 16 10 L 8 14 Z'),
+ attrs: {
+ fill: 'white',
+ stroke: 'black'
+ },
+ ref: { x: -1, y: 10 },
+ scale: 0.5
+ });
+
+ createMarker('conditional-default-flow-marker', {
+ element: svg.path('M 1 4 L 5 16'),
+ attrs: {
+ stroke: 'black'
+ },
+ ref: { x: -5, y: 10 },
+ scale: 0.5
+ });
+ }
+
+ function drawCircle(p, width, height, offset, attrs) {
+
+ if (isObject(offset)) {
+ attrs = offset;
+ offset = 0;
+ }
+
+ offset = offset || 0;
+
+ attrs = computeStyle(attrs, {
+ stroke: 'black',
+ strokeWidth: 2,
+ fill: 'white'
+ });
+
+ var cx = width / 2,
+ cy = height / 2;
+
+ return p.circle(cx, cy, Math.round((width + height) / 4 - offset)).attr(attrs);
+ }
+
+ function drawRect(p, width, height, r, offset, attrs) {
+
+ if (isObject(offset)) {
+ attrs = offset;
+ offset = 0;
+ }
+
+ offset = offset || 0;
+
+ attrs = computeStyle(attrs, {
+ stroke: 'black',
+ strokeWidth: 2,
+ fill: 'white'
+ });
+
+ return p.rect(offset, offset, width - offset * 2, height - offset * 2, r).attr(attrs);
+ }
+
+ function drawDiamond(p, width, height, attrs) {
+
+ var x_2 = width / 2;
+ var y_2 = height / 2;
+
+ var points = [x_2, 0, width, y_2, x_2, height, 0, y_2 ];
+
+ attrs = computeStyle(attrs, {
+ stroke: 'black',
+ strokeWidth: 2,
+ fill: 'white'
+ });
+
+ return p.polygon(points).attr(attrs);
+ }
+
+ function drawLine(p, waypoints, attrs) {
+ attrs = computeStyle(attrs, [ 'no-fill' ], {
+ stroke: 'black',
+ strokeWidth: 2,
+ fill: 'none'
+ });
+
+ return createLine(waypoints, attrs).appendTo(p);
+ }
+
+ function drawPath(p, d, attrs) {
+
+ attrs = computeStyle(attrs, [ 'no-fill' ], {
+ strokeWidth: 2,
+ stroke: 'black'
+ });
+
+ return p.path(d).attr(attrs);
+ }
+
+ function drawMarker(type, p, path, attrs) {
+ return drawPath(p, path, assign({ 'data-marker': type }, attrs));
+ }
+
+ function as(type) {
+ return function(p, element) {
+ return handlers[type](p, element);
+ };
+ }
+
+ function renderer(type) {
+ return handlers[type];
+ }
+
+ function renderEventContent(element, p) {
+
+ var event = getSemantic(element);
+ var isThrowing = isThrowEvent(event);
+
+ if (isTypedEvent(event, 'bpmn:MessageEventDefinition')) {
+ return renderer('bpmn:MessageEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:TimerEventDefinition')) {
+ return renderer('bpmn:TimerEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:ConditionalEventDefinition')) {
+ return renderer('bpmn:ConditionalEventDefinition')(p, element);
+ }
+
+ if (isTypedEvent(event, 'bpmn:SignalEventDefinition')) {
+ return renderer('bpmn:SignalEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:CancelEventDefinition') &&
+ isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: false })) {
+ return renderer('bpmn:MultipleEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:CancelEventDefinition') &&
+ isTypedEvent(event, 'bpmn:TerminateEventDefinition', { parallelMultiple: true })) {
+ return renderer('bpmn:ParallelMultipleEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:EscalationEventDefinition')) {
+ return renderer('bpmn:EscalationEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:LinkEventDefinition')) {
+ return renderer('bpmn:LinkEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:ErrorEventDefinition')) {
+ return renderer('bpmn:ErrorEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:CancelEventDefinition')) {
+ return renderer('bpmn:CancelEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:CompensateEventDefinition')) {
+ return renderer('bpmn:CompensateEventDefinition')(p, element, isThrowing);
+ }
+
+ if (isTypedEvent(event, 'bpmn:TerminateEventDefinition')) {
+ return renderer('bpmn:TerminateEventDefinition')(p, element, isThrowing);
+ }
+
+ return null;
+ }
+
+ function renderLabel(p, label, options) {
+ return textUtil.createText(p, label || '', options).addClass('djs-label');
+ }
+
+ function renderEmbeddedLabel(p, element, align) {
+ var semantic = getSemantic(element);
+ return renderLabel(p, semantic.name, { box: element, align: align, padding: 5 });
+ }
+
+ function renderExternalLabel(p, element, align) {
+ var semantic = getSemantic(element);
+ return renderLabel(p, semantic.name, { box: element, align: align, style: { fontSize: '11px' } });
+ }
+
+ function renderLaneLabel(p, text, element) {
+ var textBox = renderLabel(p, text, {
+ box: { height: 30, width: element.height },
+ align: 'center-middle'
+ });
+
+ var top = -1 * element.height;
+ textBox.transform(
+ 'rotate(270) ' +
+ 'translate(' + top + ',' + 0 + ')'
+ );
+ }
+
+ function createPathFromConnection(connection) {
+ var waypoints = connection.waypoints;
+
+ var pathData = 'm ' + waypoints[0].x + ',' + waypoints[0].y;
+ for (var i = 1; i < waypoints.length; i++) {
+ pathData += 'L' + waypoints[i].x + ',' + waypoints[i].y + ' ';
+ }
+ return pathData;
+ }
+
+ var handlers = this.handlers = {
+ 'bpmn:Event': function(p, element, attrs) {
+ return drawCircle(p, element.width, element.height, attrs);
+ },
+ 'bpmn:StartEvent': function(p, element) {
+ var attrs = {};
+ var semantic = getSemantic(element);
+
+ if (!semantic.isInterrupting) {
+ attrs = {
+ strokeDasharray: '6',
+ strokeLinecap: 'round'
+ };
+ }
+
+ var circle = renderer('bpmn:Event')(p, element, attrs);
+
+ renderEventContent(element, p);
+
+ return circle;
+ },
+ 'bpmn:MessageEventDefinition': function(p, element, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {
+ xScaleFactor: 0.9,
+ yScaleFactor: 0.9,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.235,
+ my: 0.315
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'white';
+ var stroke = isThrowing ? 'white' : 'black';
+
+ var messagePath = drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill,
+ stroke: stroke
+ });
+
+ return messagePath;
+ },
+ 'bpmn:TimerEventDefinition': function(p, element) {
+
+ var circle = drawCircle(p, element.width, element.height, 0.2 * element.height, {
+ strokeWidth: 2
+ });
+
+ var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {
+ xScaleFactor: 0.75,
+ yScaleFactor: 0.75,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.5,
+ my: 0.5
+ }
+ });
+
+ drawPath(p, pathData, {
+ strokeWidth: 2,
+ strokeLinecap: 'square'
+ });
+
+ for(var i = 0;i < 12;i++) {
+
+ var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {
+ xScaleFactor: 0.75,
+ yScaleFactor: 0.75,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.5,
+ my: 0.5
+ }
+ });
+
+ var width = element.width / 2;
+ var height = element.height / 2;
+
+ drawPath(p, linePathData, {
+ strokeWidth: 1,
+ strokeLinecap: 'square',
+ transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')'
+ });
+ }
+
+ return circle;
+ },
+ 'bpmn:EscalationEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.5,
+ my: 0.555
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:ConditionalEventDefinition': function(p, event) {
+ var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.5,
+ my: 0.222
+ }
+ });
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1
+ });
+ },
+ 'bpmn:LinkEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_LINK', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.57,
+ my: 0.263
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:ErrorEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_ERROR', {
+ xScaleFactor: 1.1,
+ yScaleFactor: 1.1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.2,
+ my: 0.722
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:CancelEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {
+ xScaleFactor: 1.0,
+ yScaleFactor: 1.0,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.638,
+ my: -0.055
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ }).transform('rotate(45)');
+ },
+ 'bpmn:CompensateEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.22,
+ my: 0.5
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:SignalEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {
+ xScaleFactor: 0.9,
+ yScaleFactor: 0.9,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.5,
+ my: 0.2
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:MultipleEventDefinition': function(p, event, isThrowing) {
+ var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {
+ xScaleFactor: 1.1,
+ yScaleFactor: 1.1,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.222,
+ my: 0.36
+ }
+ });
+
+ var fill = isThrowing ? 'black' : 'none';
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: fill
+ });
+ },
+ 'bpmn:ParallelMultipleEventDefinition': function(p, event) {
+ var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {
+ xScaleFactor: 1.2,
+ yScaleFactor: 1.2,
+ containerWidth: event.width,
+ containerHeight: event.height,
+ position: {
+ mx: 0.458,
+ my: 0.194
+ }
+ });
+
+ return drawPath(p, pathData, {
+ strokeWidth: 1
+ });
+ },
+ 'bpmn:EndEvent': function(p, element) {
+ var circle = renderer('bpmn:Event')(p, element, {
+ strokeWidth: 4
+ });
+
+ renderEventContent(element, p, true);
+
+ return circle;
+ },
+ 'bpmn:TerminateEventDefinition': function(p, element) {
+ var circle = drawCircle(p, element.width, element.height, 8, {
+ strokeWidth: 4,
+ fill: 'black'
+ });
+
+ return circle;
+ },
+ 'bpmn:IntermediateEvent': function(p, element) {
+ var outer = renderer('bpmn:Event')(p, element, { strokeWidth: 1 });
+ /* inner */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, { strokeWidth: 1, fill: 'none' });
+
+ renderEventContent(element, p);
+
+ return outer;
+ },
+ 'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),
+ 'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),
+
+ 'bpmn:Activity': function(p, element, attrs) {
+ return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, attrs);
+ },
+
+ 'bpmn:Task': function(p, element, attrs) {
+ var rect = renderer('bpmn:Activity')(p, element, attrs);
+ renderEmbeddedLabel(p, element, 'center-middle');
+ attachTaskMarkers(p, element);
+ return rect;
+ },
+ 'bpmn:ServiceTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var pathDataBG = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
+ abspos: {
+ x: 12,
+ y: 18
+ }
+ });
+
+ /* service bg */ drawPath(p, pathDataBG, {
+ strokeWidth: 1,
+ fill: 'none'
+ });
+
+ var fillPathData = pathMap.getScaledPath('TASK_TYPE_SERVICE_FILL', {
+ abspos: {
+ x: 17.2,
+ y: 18
+ }
+ });
+
+ /* service fill */ drawPath(p, fillPathData, {
+ strokeWidth: 0,
+ stroke: 'none',
+ fill: 'white'
+ });
+
+ var pathData = pathMap.getScaledPath('TASK_TYPE_SERVICE', {
+ abspos: {
+ x: 17,
+ y: 22
+ }
+ });
+
+ /* service */ drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: 'white'
+ });
+
+ return task;
+ },
+ 'bpmn:UserTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var x = 15;
+ var y = 12;
+
+ var pathData = pathMap.getScaledPath('TASK_TYPE_USER_1', {
+ abspos: {
+ x: x,
+ y: y
+ }
+ });
+
+ /* user path */ drawPath(p, pathData, {
+ strokeWidth: 0.5,
+ fill: 'none'
+ });
+
+ var pathData2 = pathMap.getScaledPath('TASK_TYPE_USER_2', {
+ abspos: {
+ x: x,
+ y: y
+ }
+ });
+
+ /* user2 path */ drawPath(p, pathData2, {
+ strokeWidth: 0.5,
+ fill: 'none'
+ });
+
+ var pathData3 = pathMap.getScaledPath('TASK_TYPE_USER_3', {
+ abspos: {
+ x: x,
+ y: y
+ }
+ });
+
+ /* user3 path */ drawPath(p, pathData3, {
+ strokeWidth: 0.5,
+ fill: 'black'
+ });
+
+ return task;
+ },
+ 'bpmn:ManualTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {
+ abspos: {
+ x: 17,
+ y: 15
+ }
+ });
+
+ /* manual path */ drawPath(p, pathData, {
+ strokeWidth: 0.25,
+ fill: 'white',
+ stroke: 'black'
+ });
+
+ return task;
+ },
+ 'bpmn:SendTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: 21,
+ containerHeight: 14,
+ position: {
+ mx: 0.285,
+ my: 0.357
+ }
+ });
+
+ /* send path */ drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: 'black',
+ stroke: 'white'
+ });
+
+ return task;
+ },
+ 'bpmn:ReceiveTask' : function(p, element) {
+ var semantic = getSemantic(element);
+
+ var task = renderer('bpmn:Task')(p, element);
+ var pathData;
+
+ if (semantic.instantiate) {
+ drawCircle(p, 28, 28, 20 * 0.22, { strokeWidth: 1 });
+
+ pathData = pathMap.getScaledPath('TASK_TYPE_INSTANTIATING_SEND', {
+ abspos: {
+ x: 7.77,
+ y: 9.52
+ }
+ });
+ } else {
+
+ pathData = pathMap.getScaledPath('TASK_TYPE_SEND', {
+ xScaleFactor: 0.9,
+ yScaleFactor: 0.9,
+ containerWidth: 21,
+ containerHeight: 14,
+ position: {
+ mx: 0.3,
+ my: 0.4
+ }
+ });
+ }
+
+ /* receive path */ drawPath(p, pathData, {
+ strokeWidth: 1
+ });
+
+ return task;
+ },
+ 'bpmn:ScriptTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var pathData = pathMap.getScaledPath('TASK_TYPE_SCRIPT', {
+ abspos: {
+ x: 15,
+ y: 20
+ }
+ });
+
+ /* script path */ drawPath(p, pathData, {
+ strokeWidth: 1
+ });
+
+ return task;
+ },
+ 'bpmn:BusinessRuleTask': function(p, element) {
+ var task = renderer('bpmn:Task')(p, element);
+
+ var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {
+ abspos: {
+ x: 8,
+ y: 8
+ }
+ });
+
+ var businessHeaderPath = drawPath(p, headerPathData);
+ businessHeaderPath.attr({
+ strokeWidth: 1,
+ fill: 'AAA'
+ });
+
+ var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {
+ abspos: {
+ x: 8,
+ y: 8
+ }
+ });
+
+ var businessPath = drawPath(p, headerData);
+ businessPath.attr({
+ strokeWidth: 1
+ });
+
+ return task;
+ },
+ 'bpmn:SubProcess': function(p, element, attrs) {
+
+ attrs = assign({ fillOpacity: 0.95 }, attrs);
+
+ var rect = renderer('bpmn:Activity')(p, element, attrs);
+
+ var expanded = DiUtil.isExpanded(element);
+
+ var isEventSubProcess = DiUtil.isEventSubProcess(element);
+
+ if (isEventSubProcess) {
+ rect.attr({
+ strokeDasharray: '1,2'
+ });
+ }
+
+ renderEmbeddedLabel(p, element, expanded ? 'center-top' : 'center-middle');
+
+ if (expanded) {
+ attachTaskMarkers(p, element);
+ } else {
+ attachTaskMarkers(p, element, ['SubProcessMarker']);
+ }
+
+ return rect;
+ },
+ 'bpmn:AdHocSubProcess': function(p, element) {
+ return renderer('bpmn:SubProcess')(p, element);
+ },
+ 'bpmn:Transaction': function(p, element) {
+ var outer = renderer('bpmn:SubProcess')(p, element);
+
+ var innerAttrs = styles.style([ 'no-fill', 'no-events' ]);
+
+ /* inner path */ drawRect(p, element.width, element.height, TASK_BORDER_RADIUS - 2, INNER_OUTER_DIST, innerAttrs);
+
+ return outer;
+ },
+ 'bpmn:CallActivity': function(p, element) {
+ return renderer('bpmn:SubProcess')(p, element, {
+ strokeWidth: 5
+ });
+ },
+ 'bpmn:Participant': function(p, element) {
+
+ var lane = renderer('bpmn:Lane')(p, element, {
+ fillOpacity: 0.95,
+ fill: 'White'
+ });
+
+ var expandedPool = DiUtil.isExpanded(element);
+
+ if (expandedPool) {
+ drawLine(p, [
+ { x: 30, y: 0 },
+ { x: 30, y: element.height }
+ ]);
+ var text = getSemantic(element).name;
+ renderLaneLabel(p, text, element);
+ } else {
+ // Collapsed pool draw text inline
+ var text2 = getSemantic(element).name;
+ renderLabel(p, text2, { box: element, align: 'center-middle' });
+ }
+
+ var participantMultiplicity = !!(getSemantic(element).participantMultiplicity);
+
+ if (participantMultiplicity) {
+ renderer('ParticipantMultiplicityMarker')(p, element);
+ }
+
+ return lane;
+ },
+ 'bpmn:Lane': function(p, element, attrs) {
+ var rect = drawRect(p, element.width, element.height, 0, attrs || {
+ fill: 'none'
+ });
+
+ var semantic = getSemantic(element);
+
+ if (semantic.$type === 'bpmn:Lane') {
+ var text = semantic.name;
+ renderLaneLabel(p, text, element);
+ }
+
+ return rect;
+ },
+ 'bpmn:InclusiveGateway': function(p, element) {
+ var diamond = drawDiamond(p, element.width, element.height);
+
+ /* circle path */
+ drawCircle(p, element.width, element.height, element.height * 0.24, {
+ strokeWidth: 2.5,
+ fill: 'none'
+ });
+
+ return diamond;
+ },
+ 'bpmn:ExclusiveGateway': function(p, element) {
+ var diamond = drawDiamond(p, element.width, element.height);
+
+ var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {
+ xScaleFactor: 0.4,
+ yScaleFactor: 0.4,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.32,
+ my: 0.3
+ }
+ });
+
+ if (!!(getDi(element).isMarkerVisible)) {
+ drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: 'black'
+ });
+ }
+
+ return diamond;
+ },
+ 'bpmn:ComplexGateway': function(p, element) {
+ var diamond = drawDiamond(p, element.width, element.height);
+
+ var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {
+ xScaleFactor: 0.5,
+ yScaleFactor:0.5,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.46,
+ my: 0.26
+ }
+ });
+
+ /* complex path */ drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: 'black'
+ });
+
+ return diamond;
+ },
+ 'bpmn:ParallelGateway': function(p, element) {
+ var diamond = drawDiamond(p, element.width, element.height);
+
+ var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
+ xScaleFactor: 0.6,
+ yScaleFactor:0.6,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.46,
+ my: 0.2
+ }
+ });
+
+ /* parallel path */ drawPath(p, pathData, {
+ strokeWidth: 1,
+ fill: 'black'
+ });
+
+ return diamond;
+ },
+ 'bpmn:EventBasedGateway': function(p, element) {
+
+ var semantic = getSemantic(element);
+
+ var diamond = drawDiamond(p, element.width, element.height);
+
+ /* outer circle path */ drawCircle(p, element.width, element.height, element.height * 0.20, {
+ strokeWidth: 1,
+ fill: 'none'
+ });
+
+ var type = semantic.eventGatewayType;
+ var instantiate = !!semantic.instantiate;
+
+ function drawEvent() {
+
+ var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {
+ xScaleFactor: 0.18,
+ yScaleFactor: 0.18,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.36,
+ my: 0.44
+ }
+ });
+
+ /* event path */ drawPath(p, pathData, {
+ strokeWidth: 2,
+ fill: 'none'
+ });
+ }
+
+ if (type === 'Parallel') {
+
+ var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
+ xScaleFactor: 0.4,
+ yScaleFactor:0.4,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.474,
+ my: 0.296
+ }
+ });
+
+ var parallelPath = drawPath(p, pathData);
+ parallelPath.attr({
+ strokeWidth: 1,
+ fill: 'none'
+ });
+ } else if (type === 'Exclusive') {
+
+ if (!instantiate) {
+ var innerCircle = drawCircle(p, element.width, element.height, element.height * 0.26);
+ innerCircle.attr({
+ strokeWidth: 1,
+ fill: 'none'
+ });
+ }
+
+ drawEvent();
+ }
+
+
+ return diamond;
+ },
+ 'bpmn:Gateway': function(p, element) {
+ return drawDiamond(p, element.width, element.height);
+ },
+ 'bpmn:SequenceFlow': function(p, element) {
+ var pathData = createPathFromConnection(element);
+ var path = drawPath(p, pathData, {
+ strokeLinejoin: 'round',
+ markerEnd: marker('sequenceflow-end')
+ });
+
+ var sequenceFlow = getSemantic(element);
+ var source = element.source.businessObject;
+
+ // conditional flow marker
+ if (sequenceFlow.conditionExpression && source.$instanceOf('bpmn:Activity')) {
+ path.attr({
+ markerStart: marker('conditional-flow-marker')
+ });
+ }
+
+ // default marker
+ if (source.default && (source.$instanceOf('bpmn:Gateway') || source.$instanceOf('bpmn:Activity')) &&
+ source.default === sequenceFlow) {
+ path.attr({
+ markerStart: marker('conditional-default-flow-marker')
+ });
+ }
+
+ return path;
+ },
+ 'bpmn:Association': function(p, element, attrs) {
+
+ var semantic = getSemantic(element);
+
+ attrs = assign({
+ strokeDasharray: '0.5, 5',
+ strokeLinecap: 'round',
+ strokeLinejoin: 'round'
+ }, attrs || {});
+
+ if (semantic.associationDirection === 'One' ||
+ semantic.associationDirection === 'Both') {
+ attrs.markerEnd = marker('association-end');
+ }
+
+ if (semantic.associationDirection === 'Both') {
+ attrs.markerStart = marker('association-start');
+ }
+
+ return drawLine(p, element.waypoints, attrs);
+ },
+ 'bpmn:DataInputAssociation': function(p, element) {
+ return renderer('bpmn:Association')(p, element, {
+ markerEnd: marker('association-end')
+ });
+ },
+ 'bpmn:DataOutputAssociation': function(p, element) {
+ return renderer('bpmn:Association')(p, element, {
+ markerEnd: marker('association-end')
+ });
+ },
+ 'bpmn:MessageFlow': function(p, element) {
+
+ var semantic = getSemantic(element),
+ di = getDi(element);
+
+ var pathData = createPathFromConnection(element);
+ var path = drawPath(p, pathData, {
+ markerEnd: marker('messageflow-end'),
+ markerStart: marker('messageflow-start'),
+ strokeDasharray: '10, 12',
+ strokeLinecap: 'round',
+ strokeLinejoin: 'round',
+ strokeWidth: '1.5px'
+ });
+
+ if (semantic.messageRef) {
+ var midPoint = path.getPointAtLength(path.getTotalLength() / 2);
+
+ var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {
+ abspos: {
+ x: midPoint.x,
+ y: midPoint.y
+ }
+ });
+
+ var messageAttrs = { strokeWidth: 1 };
+
+ if (di.messageVisibleKind === 'initiating') {
+ messageAttrs.fill = 'white';
+ messageAttrs.stroke = 'black';
+ } else {
+ messageAttrs.fill = '#888';
+ messageAttrs.stroke = 'white';
+ }
+
+ drawPath(p, markerPathData, messageAttrs);
+ }
+
+ return path;
+ },
+ 'bpmn:DataObject': function(p, element) {
+ var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.474,
+ my: 0.296
+ }
+ });
+
+ var elementObject = drawPath(p, pathData, { fill: 'white' });
+
+ var semantic = getSemantic(element);
+
+ if (isCollection(semantic)) {
+ renderDataItemCollection(p, element);
+ }
+
+ return elementObject;
+ },
+ 'bpmn:DataObjectReference': as('bpmn:DataObject'),
+ 'bpmn:DataInput': function(p, element) {
+
+ var arrowPathData = pathMap.getRawPath('DATA_ARROW');
+
+ // page
+ var elementObject = renderer('bpmn:DataObject')(p, element);
+
+ /* input arrow path */ drawPath(p, arrowPathData, { strokeWidth: 1 });
+
+ return elementObject;
+ },
+ 'bpmn:DataOutput': function(p, element) {
+ var arrowPathData = pathMap.getRawPath('DATA_ARROW');
+
+ // page
+ var elementObject = renderer('bpmn:DataObject')(p, element);
+
+ /* output arrow path */ drawPath(p, arrowPathData, {
+ strokeWidth: 1,
+ fill: 'black'
+ });
+
+ return elementObject;
+ },
+ 'bpmn:DataStoreReference': function(p, element) {
+ var DATA_STORE_PATH = pathMap.getScaledPath('DATA_STORE', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0,
+ my: 0.133
+ }
+ });
+
+ var elementStore = drawPath(p, DATA_STORE_PATH, {
+ strokeWidth: 2,
+ fill: 'white'
+ });
+
+ return elementStore;
+ },
+ 'bpmn:BoundaryEvent': function(p, element) {
+
+ var semantic = getSemantic(element),
+ cancel = semantic.cancelActivity;
+
+ var attrs = {
+ strokeWidth: 1
+ };
+
+ if (!cancel) {
+ attrs.strokeDasharray = '6';
+ attrs.strokeLinecap = 'round';
+ }
+
+ var outer = renderer('bpmn:Event')(p, element, attrs);
+ /* inner path */ drawCircle(p, element.width, element.height, INNER_OUTER_DIST, assign(attrs, { fill: 'none' }));
+
+ renderEventContent(element, p);
+
+ return outer;
+ },
+ 'bpmn:Group': function(p, element) {
+ return drawRect(p, element.width, element.height, TASK_BORDER_RADIUS, {
+ strokeWidth: 1,
+ strokeDasharray: '8,3,1,3',
+ fill: 'none',
+ pointerEvents: 'none'
+ });
+ },
+ 'label': function(p, element) {
+ return renderExternalLabel(p, element, '');
+ },
+ 'bpmn:TextAnnotation': function(p, element) {
+ var style = {
+ 'fill': 'none',
+ 'stroke': 'none'
+ };
+ var textElement = drawRect(p, element.width, element.height, 0, 0, style);
+ var textPathData = pathMap.getScaledPath('TEXT_ANNOTATION', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.0,
+ my: 0.0
+ }
+ });
+ drawPath(p, textPathData);
+
+ var text = getSemantic(element).text || '';
+ renderLabel(p, text, { box: element, align: 'left-middle', padding: 5 });
+
+ return textElement;
+ },
+ 'ParticipantMultiplicityMarker': function(p, element) {
+ var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2) / element.width),
+ my: (element.height - 15) / element.height
+ }
+ });
+
+ drawMarker('participant-multiplicity', p, markerPath);
+ },
+ 'SubProcessMarker': function(p, element) {
+ var markerRect = drawRect(p, 14, 14, 0, {
+ strokeWidth: 1
+ });
+
+ // Process marker is placed in the middle of the box
+ // therefore fixed values can be used here
+ markerRect.transform('translate(' + (element.width / 2 - 7.5) + ',' + (element.height - 20) + ')');
+
+ var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {
+ xScaleFactor: 1.5,
+ yScaleFactor: 1.5,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: (element.width / 2 - 7.5) / element.width,
+ my: (element.height - 20) / element.height
+ }
+ });
+
+ drawMarker('sub-process', p, markerPath);
+ },
+ 'ParallelMarker': function(p, element, position) {
+ var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2 + position.parallel) / element.width),
+ my: (element.height - 20) / element.height
+ }
+ });
+
+ drawMarker('parallel', p, markerPath);
+ },
+ 'SequentialMarker': function(p, element, position) {
+ var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2 + position.seq) / element.width),
+ my: (element.height - 19) / element.height
+ }
+ });
+
+ drawMarker('sequential', p, markerPath);
+ },
+ 'CompensationMarker': function(p, element, position) {
+ var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2 + position.compensation) / element.width),
+ my: (element.height - 13) / element.height
+ }
+ });
+
+ drawMarker('compensation', p, markerMath, { strokeWidth: 1 });
+ },
+ 'LoopMarker': function(p, element, position) {
+ var markerPath = pathMap.getScaledPath('MARKER_LOOP', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2 + position.loop) / element.width),
+ my: (element.height - 7) / element.height
+ }
+ });
+
+ drawMarker('loop', p, markerPath, {
+ strokeWidth: 1,
+ fill: 'none',
+ strokeLinecap: 'round',
+ strokeMiterlimit: 0.5
+ });
+ },
+ 'AdhocMarker': function(p, element, position) {
+ var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: ((element.width / 2 + position.adhoc) / element.width),
+ my: (element.height - 15) / element.height
+ }
+ });
+
+ drawMarker('adhoc', p, markerPath, {
+ strokeWidth: 1,
+ fill: 'black'
+ });
+ }
+ };
+
+ function attachTaskMarkers(p, element, taskMarkers) {
+ var obj = getSemantic(element);
+
+ var subprocess = includes(taskMarkers, 'SubProcessMarker');
+ var position;
+
+ if (subprocess) {
+ position = {
+ seq: -21,
+ parallel: -22,
+ compensation: -42,
+ loop: -18,
+ adhoc: 10
+ };
+ } else {
+ position = {
+ seq: -3,
+ parallel: -6,
+ compensation: -27,
+ loop: 0,
+ adhoc: 10
+ };
+ }
+
+ forEach(taskMarkers, function(marker) {
+ renderer(marker)(p, element, position);
+ });
+
+ if (obj.isForCompensation) {
+ renderer('CompensationMarker')(p, element, position);
+ }
+
+ if (obj.$type === 'bpmn:AdHocSubProcess') {
+ renderer('AdhocMarker')(p, element, position);
+ }
+
+ var loopCharacteristics = obj.loopCharacteristics,
+ isSequential = loopCharacteristics && loopCharacteristics.isSequential;
+
+ if (loopCharacteristics) {
+
+ if (isSequential === undefined) {
+ renderer('LoopMarker')(p, element, position);
+ }
+
+ if (isSequential === false) {
+ renderer('ParallelMarker')(p, element, position);
+ }
+
+ if (isSequential === true) {
+ renderer('SequentialMarker')(p, element, position);
+ }
+ }
+ }
+
+ function renderDataItemCollection(p, element) {
+
+ var yPosition = (element.height - 16) / element.height;
+
+ var pathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {
+ xScaleFactor: 1,
+ yScaleFactor: 1,
+ containerWidth: element.width,
+ containerHeight: element.height,
+ position: {
+ mx: 0.451,
+ my: yPosition
+ }
+ });
+
+ /* collection path */ drawPath(p, pathData, {
+ strokeWidth: 2
+ });
+ }
+
+ // hook onto canvas init event to initialize
+ // connection start/end markers on svg
+ eventBus.on('canvas.init', function(event) {
+ initMarkers(event.svg);
+ });
+}
+
+
+inherits(BpmnRenderer, BaseRenderer);
+
+BpmnRenderer.$inject = [ 'eventBus', 'styles', 'pathMap' ];
+
+module.exports = BpmnRenderer;
+
+
+BpmnRenderer.prototype.canRender = function(element) {
+ return is(element, 'bpmn:BaseElement');
+};
+
+BpmnRenderer.prototype.drawShape = function(visuals, element) {
+ var type = element.type;
+ var h = this.handlers[type];
+
+ /* jshint -W040 */
+ return h(visuals, element);
+};
+
+BpmnRenderer.prototype.drawConnection = function(visuals, element) {
+ var type = element.type;
+ var h = this.handlers[type];
+
+ /* jshint -W040 */
+ return h(visuals, element);
+};
+
+BpmnRenderer.prototype.getShapePath = function(element) {
+
+ if (is(element, 'bpmn:Event')) {
+ return getCirclePath(element);
+ }
+
+ if (is(element, 'bpmn:Activity')) {
+ return getRoundRectPath(element, TASK_BORDER_RADIUS);
+ }
+
+ if (is(element, 'bpmn:Gateway')) {
+ return getDiamondPath(element);
+ }
+
+ return getRectPath(element);
+};
+
+
+///////// helper functions /////////////////////////////
+
+/**
+ * Checks if eventDefinition of the given element matches with semantic type.
+ *
+ * @return {boolean} true if element is of the given semantic type
+ */
+function isTypedEvent(event, eventDefinitionType, filter) {
+
+ function matches(definition, filter) {
+ return every(filter, function(val, key) {
+
+ // we want a == conversion here, to be able to catch
+ // undefined == false and friends
+ /* jshint -W116 */
+ return definition[key] == val;
+ });
+ }
+
+ return some(event.eventDefinitions, function(definition) {
+ return definition.$type === eventDefinitionType && matches(event, filter);
+ });
+}
+
+function isThrowEvent(event) {
+ return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');
+}
+
+function isCollection(element) {
+ return element.isCollection ||
+ (element.elementObjectRef && element.elementObjectRef.isCollection);
+}
+
+function getDi(element) {
+ return element.businessObject.di;
+}
+
+function getSemantic(element) {
+ return element.businessObject;
+}
+
+
+
+/////// cropping path customizations /////////////////////////
+
+function getCirclePath(shape) {
+
+ var cx = shape.x + shape.width / 2,
+ cy = shape.y + shape.height / 2,
+ radius = shape.width / 2;
+
+ var circlePath = [
+ ['M', cx, cy],
+ ['m', 0, -radius],
+ ['a', radius, radius, 0, 1, 1, 0, 2 * radius],
+ ['a', radius, radius, 0, 1, 1, 0, -2 * radius],
+ ['z']
+ ];
+
+ return componentsToPath(circlePath);
+}
+
+function getRoundRectPath(shape, borderRadius) {
+
+ var x = shape.x,
+ y = shape.y,
+ width = shape.width,
+ height = shape.height;
+
+ var roundRectPath = [
+ ['M', x + borderRadius, y],
+ ['l', width - borderRadius * 2, 0],
+ ['a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius],
+ ['l', 0, height - borderRadius * 2],
+ ['a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius],
+ ['l', borderRadius * 2 - width, 0],
+ ['a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius],
+ ['l', 0, borderRadius * 2 - height],
+ ['a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius],
+ ['z']
+ ];
+
+ return componentsToPath(roundRectPath);
+}
+
+function getDiamondPath(shape) {
+
+ var width = shape.width,
+ height = shape.height,
+ x = shape.x,
+ y = shape.y,
+ halfWidth = width / 2,
+ halfHeight = height / 2;
+
+ var diamondPath = [
+ ['M', x + halfWidth, y],
+ ['l', halfWidth, halfHeight],
+ ['l', -halfWidth, halfHeight],
+ ['l', -halfWidth, -halfHeight],
+ ['z']
+ ];
+
+ return componentsToPath(diamondPath);
+}
+
+function getRectPath(shape) {
+ var x = shape.x,
+ y = shape.y,
+ width = shape.width,
+ height = shape.height;
+
+ var rectPath = [
+ ['M', x, y],
+ ['l', width, 0],
+ ['l', 0, height],
+ ['l', -width, 0],
+ ['z']
+ ];
+
+ return componentsToPath(rectPath);
+}
+
+},{"107":107,"231":231,"232":232,"243":243,"252":252,"255":255,"257":257,"261":261,"372":372,"377":377,"68":68,"70":70}],5:[function(_dereq_,module,exports){
+'use strict';
+
+var Snap = _dereq_(240);
+
+/**
+ * Map containing SVG paths needed by BpmnRenderer.
+ */
+
+function PathMap() {
+
+ /**
+ * Contains a map of path elements
+ *
+ * Path definition
+ * A parameterized path is defined like this:
+ *
+ * 'GATEWAY_PARALLEL': {
+ * d: 'm {mx},{my} {e.x0},0 0,{e.x1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
+ '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
+ * height: 17.5,
+ * width: 17.5,
+ * heightElements: [2.5, 7.5],
+ * widthElements: [2.5, 7.5]
+ * }
+ *
+ * It's important to specify a correct height and width for the path as the scaling
+ * is based on the ratio between the specified height and width in this object and the
+ * height and width that is set as scale target (Note x,y coordinates will be scaled with
+ * individual ratios).
+ * The 'heightElements ' and 'widthElements ' array must contain the values that will be scaled.
+ * The scaling is based on the computed ratios.
+ * Coordinates on the y axis should be in the heightElement 's array, they will be scaled using
+ * the computed ratio coefficient.
+ * In the parameterized path the scaled values can be accessed through the 'e' object in {} brackets.
+ *
+ * The values for the y axis can be accessed in the path string using {e.y0}, {e.y1}, ....
+ * The values for the x axis can be accessed in the path string using {e.x0}, {e.x1}, ....
+ *
+ * The numbers x0, x1 respectively y0, y1, ... map to the corresponding array index.
+ *
+ */
+ this.pathMap = {
+ 'EVENT_MESSAGE': {
+ d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',
+ height: 36,
+ width: 36,
+ heightElements: [6, 14],
+ widthElements: [10.5, 21]
+ },
+ 'EVENT_SIGNAL': {
+ d: 'M {mx},{my} l {e.x0},{e.y0} l -{e.x1},0 Z',
+ height: 36,
+ width: 36,
+ heightElements: [18],
+ widthElements: [10, 20]
+ },
+ 'EVENT_ESCALATION': {
+ d: 'm {mx},{my} c -{e.x1},{e.y0} -{e.x3},{e.y1} -{e.x5},{e.y4} {e.x1},-{e.y3} {e.x3},-{e.y5} {e.x5},-{e.y6} ' +
+ '{e.x0},{e.y3} {e.x2},{e.y5} {e.x4},{e.y6} -{e.x0},-{e.y0} -{e.x2},-{e.y1} -{e.x4},-{e.y4} z',
+ height: 36,
+ width: 36,
+ heightElements: [2.382, 4.764, 4.926, 6.589333, 7.146, 13.178667, 19.768],
+ widthElements: [2.463, 2.808, 4.926, 5.616, 7.389, 8.424]
+ },
+ 'EVENT_CONDITIONAL': {
+ d: 'M {e.x0},{e.y0} l {e.x1},0 l 0,{e.y2} l -{e.x1},0 Z ' +
+ 'M {e.x2},{e.y3} l {e.x0},0 ' +
+ 'M {e.x2},{e.y4} l {e.x0},0 ' +
+ 'M {e.x2},{e.y5} l {e.x0},0 ' +
+ 'M {e.x2},{e.y6} l {e.x0},0 ' +
+ 'M {e.x2},{e.y7} l {e.x0},0 ' +
+ 'M {e.x2},{e.y8} l {e.x0},0 ',
+ height: 36,
+ width: 36,
+ heightElements: [8.5, 14.5, 18, 11.5, 14.5, 17.5, 20.5, 23.5, 26.5],
+ widthElements: [10.5, 14.5, 12.5]
+ },
+ 'EVENT_LINK': {
+ d: 'm {mx},{my} 0,{e.y0} -{e.x1},0 0,{e.y1} {e.x1},0 0,{e.y0} {e.x0},-{e.y2} -{e.x0},-{e.y2} z',
+ height: 36,
+ width: 36,
+ heightElements: [4.4375, 6.75, 7.8125],
+ widthElements: [9.84375, 13.5]
+ },
+ 'EVENT_ERROR': {
+ d: 'm {mx},{my} {e.x0},-{e.y0} {e.x1},-{e.y1} {e.x2},{e.y2} {e.x3},-{e.y3} -{e.x4},{e.y4} -{e.x5},-{e.y5} z',
+ height: 36,
+ width: 36,
+ heightElements: [0.023, 8.737, 8.151, 16.564, 10.591, 8.714],
+ widthElements: [0.085, 6.672, 6.97, 4.273, 5.337, 6.636]
+ },
+ 'EVENT_CANCEL_45': {
+ d: 'm {mx},{my} -{e.x1},0 0,{e.x0} {e.x1},0 0,{e.y1} {e.x0},0 ' +
+ '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',
+ height: 36,
+ width: 36,
+ heightElements: [4.75, 8.5],
+ widthElements: [4.75, 8.5]
+ },
+ 'EVENT_COMPENSATION': {
+ d: 'm {mx},{my} {e.x0},-{e.y0} 0,{e.y1} z m {e.x1},-{e.y2} {e.x2},-{e.y3} 0,{e.y1} -{e.x2},-{e.y3} z',
+ height: 36,
+ width: 36,
+ heightElements: [6.5, 13, 0.4, 6.1],
+ widthElements: [9, 9.3, 8.7]
+ },
+ 'EVENT_TIMER_WH': {
+ d: 'M {mx},{my} l {e.x0},-{e.y0} m -{e.x0},{e.y0} l {e.x1},{e.y1} ',
+ height: 36,
+ width: 36,
+ heightElements: [10, 2],
+ widthElements: [3, 7]
+ },
+ 'EVENT_TIMER_LINE': {
+ d: 'M {mx},{my} ' +
+ 'm {e.x0},{e.y0} l -{e.x1},{e.y1} ',
+ height: 36,
+ width: 36,
+ heightElements: [10, 3],
+ widthElements: [0, 0]
+ },
+ 'EVENT_MULTIPLE': {
+ d:'m {mx},{my} {e.x1},-{e.y0} {e.x1},{e.y0} -{e.x0},{e.y1} -{e.x2},0 z',
+ height: 36,
+ width: 36,
+ heightElements: [6.28099, 12.56199],
+ widthElements: [3.1405, 9.42149, 12.56198]
+ },
+ 'EVENT_PARALLEL_MULTIPLE': {
+ d:'m {mx},{my} {e.x0},0 0,{e.y1} {e.x1},0 0,{e.y0} -{e.x1},0 0,{e.y1} ' +
+ '-{e.x0},0 0,-{e.y1} -{e.x1},0 0,-{e.y0} {e.x1},0 z',
+ height: 36,
+ width: 36,
+ heightElements: [2.56228, 7.68683],
+ widthElements: [2.56228, 7.68683]
+ },
+ 'GATEWAY_EXCLUSIVE': {
+ d:'m {mx},{my} {e.x0},{e.y0} {e.x1},{e.y0} {e.x2},0 {e.x4},{e.y2} ' +
+ '{e.x4},{e.y1} {e.x2},0 {e.x1},{e.y3} {e.x0},{e.y3} ' +
+ '{e.x3},0 {e.x5},{e.y1} {e.x5},{e.y2} {e.x3},0 z',
+ height: 17.5,
+ width: 17.5,
+ heightElements: [8.5, 6.5312, -6.5312, -8.5],
+ widthElements: [6.5, -6.5, 3, -3, 5, -5]
+ },
+ 'GATEWAY_PARALLEL': {
+ d:'m {mx},{my} 0,{e.y1} -{e.x1},0 0,{e.y0} {e.x1},0 0,{e.y1} {e.x0},0 ' +
+ '0,-{e.y1} {e.x1},0 0,-{e.y0} -{e.x1},0 0,-{e.y1} -{e.x0},0 z',
+ height: 30,
+ width: 30,
+ heightElements: [5, 12.5],
+ widthElements: [5, 12.5]
+ },
+ 'GATEWAY_EVENT_BASED': {
+ d:'m {mx},{my} {e.x0},{e.y0} {e.x0},{e.y1} {e.x1},{e.y2} {e.x2},0 z',
+ height: 11,
+ width: 11,
+ heightElements: [-6, 6, 12, -12],
+ widthElements: [9, -3, -12]
+ },
+ 'GATEWAY_COMPLEX': {
+ d:'m {mx},{my} 0,{e.y0} -{e.x0},-{e.y1} -{e.x1},{e.y2} {e.x0},{e.y1} -{e.x2},0 0,{e.y3} ' +
+ '{e.x2},0 -{e.x0},{e.y1} l {e.x1},{e.y2} {e.x0},-{e.y1} 0,{e.y0} {e.x3},0 0,-{e.y0} {e.x0},{e.y1} ' +
+ '{e.x1},-{e.y2} -{e.x0},-{e.y1} {e.x2},0 0,-{e.y3} -{e.x2},0 {e.x0},-{e.y1} -{e.x1},-{e.y2} ' +
+ '-{e.x0},{e.y1} 0,-{e.y0} -{e.x3},0 z',
+ height: 17.125,
+ width: 17.125,
+ heightElements: [4.875, 3.4375, 2.125, 3],
+ widthElements: [3.4375, 2.125, 4.875, 3]
+ },
+ 'DATA_OBJECT_PATH': {
+ d:'m 0,0 {e.x1},0 {e.x0},{e.y0} 0,{e.y1} -{e.x2},0 0,-{e.y2} {e.x1},0 0,{e.y0} {e.x0},0',
+ height: 61,
+ width: 51,
+ heightElements: [10, 50, 60],
+ widthElements: [10, 40, 50, 60]
+ },
+ 'DATA_OBJECT_COLLECTION_PATH': {
+ d:'m {mx}, {my} ' +
+ 'm 0 15 l 0 -15 ' +
+ 'm 4 15 l 0 -15 ' +
+ 'm 4 15 l 0 -15 ',
+ height: 61,
+ width: 51,
+ heightElements: [12],
+ widthElements: [1, 6, 12, 15]
+ },
+ 'DATA_ARROW': {
+ d:'m 5,9 9,0 0,-3 5,5 -5,5 0,-3 -9,0 z',
+ height: 61,
+ width: 51,
+ heightElements: [],
+ widthElements: []
+ },
+ 'DATA_STORE': {
+ d:'m {mx},{my} ' +
+ 'l 0,{e.y2} ' +
+ 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' +
+ 'l 0,-{e.y2} ' +
+ 'c -{e.x0},-{e.y1} -{e.x1},-{e.y1} -{e.x2},0' +
+ 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0 ' +
+ 'm -{e.x2},{e.y0}' +
+ 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0' +
+ 'm -{e.x2},{e.y0}' +
+ 'c {e.x0},{e.y1} {e.x1},{e.y1} {e.x2},0',
+ height: 61,
+ width: 61,
+ heightElements: [7, 10, 45],
+ widthElements: [2, 58, 60]
+ },
+ 'TEXT_ANNOTATION': {
+ d: 'm {mx}, {my} m 10,0 l -10,0 l 0,{e.y0} l 10,0',
+ height: 30,
+ width: 10,
+ heightElements: [30],
+ widthElements: [10]
+ },
+ 'MARKER_SUB_PROCESS': {
+ d: 'm{mx},{my} m 7,2 l 0,10 m -5,-5 l 10,0',
+ height: 10,
+ width: 10,
+ heightElements: [],
+ widthElements: []
+ },
+ 'MARKER_PARALLEL': {
+ d: 'm{mx},{my} m 3,2 l 0,10 m 3,-10 l 0,10 m 3,-10 l 0,10',
+ height: 10,
+ width: 10,
+ heightElements: [],
+ widthElements: []
+ },
+ 'MARKER_SEQUENTIAL': {
+ d: 'm{mx},{my} m 0,3 l 10,0 m -10,3 l 10,0 m -10,3 l 10,0',
+ height: 10,
+ width: 10,
+ heightElements: [],
+ widthElements: []
+ },
+ 'MARKER_COMPENSATION': {
+ d: 'm {mx},{my} 7,-5 0,10 z m 7.1,-0.3 6.9,-4.7 0,10 -6.9,-4.7 z',
+ height: 10,
+ width: 21,
+ heightElements: [],
+ widthElements: []
+ },
+ 'MARKER_LOOP': {
+ d: 'm {mx},{my} c 3.526979,0 6.386161,-2.829858 6.386161,-6.320661 0,-3.490806 -2.859182,-6.320661 ' +
+ '-6.386161,-6.320661 -3.526978,0 -6.38616,2.829855 -6.38616,6.320661 0,1.745402 ' +
+ '0.714797,3.325567 1.870463,4.469381 0.577834,0.571908 1.265885,1.034728 2.029916,1.35457 ' +
+ 'l -0.718163,-3.909793 m 0.718163,3.909793 -3.885211,0.802902',
+ height: 13.9,
+ width: 13.7,
+ heightElements: [],
+ widthElements: []
+ },
+ 'MARKER_ADHOC': {
+ d: 'm {mx},{my} m 0.84461,2.64411 c 1.05533,-1.23780996 2.64337,-2.07882 4.29653,-1.97997996 2.05163,0.0805 ' +
+ '3.85579,1.15803 5.76082,1.79107 1.06385,0.34139996 2.24454,0.1438 3.18759,-0.43767 0.61743,-0.33642 ' +
+ '1.2775,-0.64078 1.7542,-1.17511 0,0.56023 0,1.12046 0,1.6807 -0.98706,0.96237996 -2.29792,1.62393996 ' +
+ '-3.6918,1.66181996 -1.24459,0.0927 -2.46671,-0.2491 -3.59505,-0.74812 -1.35789,-0.55965 ' +
+ '-2.75133,-1.33436996 -4.27027,-1.18121996 -1.37741,0.14601 -2.41842,1.13685996 -3.44288,1.96782996 z',
+ height: 4,
+ width: 15,
+ heightElements: [],
+ widthElements: []
+ },
+ 'TASK_TYPE_SEND': {
+ d: 'm {mx},{my} l 0,{e.y1} l {e.x1},0 l 0,-{e.y1} z l {e.x0},{e.y0} l {e.x0},-{e.y0}',
+ height: 14,
+ width: 21,
+ heightElements: [6, 14],
+ widthElements: [10.5, 21]
+ },
+ 'TASK_TYPE_SCRIPT': {
+ d: 'm {mx},{my} c 9.966553,-6.27276 -8.000926,-7.91932 2.968968,-14.938 l -8.802728,0 ' +
+ 'c -10.969894,7.01868 6.997585,8.66524 -2.968967,14.938 z ' +
+ 'm -7,-12 l 5,0 ' +
+ 'm -4.5,3 l 4.5,0 ' +
+ 'm -3,3 l 5,0' +
+ 'm -4,3 l 5,0',
+ height: 15,
+ width: 12.6,
+ heightElements: [6, 14],
+ widthElements: [10.5, 21]
+ },
+ 'TASK_TYPE_USER_1': {
+ d: 'm {mx},{my} c 0.909,-0.845 1.594,-2.049 1.594,-3.385 0,-2.554 -1.805,-4.62199999 ' +
+ '-4.357,-4.62199999 -2.55199998,0 -4.28799998,2.06799999 -4.28799998,4.62199999 0,1.348 ' +
+ '0.974,2.562 1.89599998,3.405 -0.52899998,0.187 -5.669,2.097 -5.794,4.7560005 v 6.718 ' +
+ 'h 17 v -6.718 c 0,-2.2980005 -5.5279996,-4.5950005 -6.0509996,-4.7760005 z' +
+ 'm -8,6 l 0,5.5 m 11,0 l 0,-5'
+ },
+ 'TASK_TYPE_USER_2': {
+ d: 'm {mx},{my} m 2.162,1.009 c 0,2.4470005 -2.158,4.4310005 -4.821,4.4310005 ' +
+ '-2.66499998,0 -4.822,-1.981 -4.822,-4.4310005 '
+ },
+ 'TASK_TYPE_USER_3': {
+ d: 'm {mx},{my} m -6.9,-3.80 c 0,0 2.25099998,-2.358 4.27399998,-1.177 2.024,1.181 4.221,1.537 ' +
+ '4.124,0.965 -0.098,-0.57 -0.117,-3.79099999 -4.191,-4.13599999 -3.57499998,0.001 ' +
+ '-4.20799998,3.36699999 -4.20699998,4.34799999 z'
+ },
+ 'TASK_TYPE_MANUAL': {
+ d: 'm {mx},{my} c 0.234,-0.01 5.604,0.008 8.029,0.004 0.808,0 1.271,-0.172 1.417,-0.752 0.227,-0.898 ' +
+ '-0.334,-1.314 -1.338,-1.316 -2.467,-0.01 -7.886,-0.004 -8.108,-0.004 -0.014,-0.079 0.016,-0.533 0,-0.61 ' +
+ '0.195,-0.042 8.507,0.006 9.616,0.002 0.877,-0.007 1.35,-0.438 1.353,-1.208 0.003,-0.768 -0.479,-1.09 ' +
+ '-1.35,-1.091 -2.968,-0.002 -9.619,-0.013 -9.619,-0.013 v -0.591 c 0,0 5.052,-0.016 7.225,-0.016 ' +
+ '0.888,-0.002 1.354,-0.416 1.351,-1.193 -0.006,-0.761 -0.492,-1.196 -1.361,-1.196 -3.473,-0.005 ' +
+ '-10.86,-0.003 -11.0829995,-0.003 -0.022,-0.047 -0.045,-0.094 -0.069,-0.139 0.3939995,-0.319 ' +
+ '2.0409995,-1.626 2.4149995,-2.017 0.469,-0.4870005 0.519,-1.1650005 0.162,-1.6040005 -0.414,-0.511 ' +
+ '-0.973,-0.5 -1.48,-0.236 -1.4609995,0.764 -6.5999995,3.6430005 -7.7329995,4.2710005 -0.9,0.499 ' +
+ '-1.516,1.253 -1.882,2.19 -0.37000002,0.95 -0.17,2.01 -0.166,2.979 0.004,0.718 -0.27300002,1.345 ' +
+ '-0.055,2.063 0.629,2.087 2.425,3.312 4.859,3.318 4.6179995,0.014 9.2379995,-0.139 13.8569995,-0.158 ' +
+ '0.755,-0.004 1.171,-0.301 1.182,-1.033 0.012,-0.754 -0.423,-0.969 -1.183,-0.973 -1.778,-0.01 ' +
+ '-5.824,-0.004 -6.04,-0.004 10e-4,-0.084 0.003,-0.586 10e-4,-0.67 z'
+ },
+ 'TASK_TYPE_INSTANTIATING_SEND': {
+ d: 'm {mx},{my} l 0,8.4 l 12.6,0 l 0,-8.4 z l 6.3,3.6 l 6.3,-3.6'
+ },
+ 'TASK_TYPE_SERVICE': {
+ d: 'm {mx},{my} v -1.71335 c 0.352326,-0.0705 0.703932,-0.17838 1.047628,-0.32133 ' +
+ '0.344416,-0.14465 0.665822,-0.32133 0.966377,-0.52145 l 1.19431,1.18005 1.567487,-1.57688 ' +
+ '-1.195028,-1.18014 c 0.403376,-0.61394 0.683079,-1.29908 0.825447,-2.01824 l 1.622133,-0.01 ' +
+ 'v -2.2196 l -1.636514,0.01 c -0.07333,-0.35153 -0.178319,-0.70024 -0.323564,-1.04372 ' +
+ '-0.145244,-0.34406 -0.321407,-0.6644 -0.522735,-0.96217 l 1.131035,-1.13631 -1.583305,-1.56293 ' +
+ '-1.129598,1.13589 c -0.614052,-0.40108 -1.302883,-0.68093 -2.022633,-0.82247 l 0.0093,-1.61852 ' +
+ 'h -2.241173 l 0.0042,1.63124 c -0.353763,0.0736 -0.705369,0.17977 -1.049785,0.32371 -0.344415,0.14437 ' +
+ '-0.665102,0.32092 -0.9635006,0.52046 l -1.1698628,-1.15823 -1.5667691,1.5792 1.1684265,1.15669 ' +
+ 'c -0.4026573,0.61283 -0.68308,1.29797 -0.8247287,2.01713 l -1.6588041,0.003 v 2.22174 ' +
+ 'l 1.6724648,-0.006 c 0.073327,0.35077 0.1797598,0.70243 0.3242851,1.04472 0.1452428,0.34448 ' +
+ '0.3214064,0.6644 0.5227339,0.96066 l -1.1993431,1.19723 1.5840256,1.56011 1.1964668,-1.19348 ' +
+ 'c 0.6140517,0.40346 1.3028827,0.68232 2.0233517,0.82331 l 7.19e-4,1.69892 h 2.226848 z ' +
+ 'm 0.221462,-3.9957 c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +
+ '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +
+ '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'
+ },
+ 'TASK_TYPE_SERVICE_FILL': {
+ d: 'm {mx},{my} c -1.788948,0.7502 -3.8576,-0.0928 -4.6097055,-1.87438 -0.7521065,-1.78321 ' +
+ '0.090598,-3.84627 1.8802645,-4.59604 1.78823,-0.74936 3.856881,0.0929 4.608987,1.87437 ' +
+ '0.752106,1.78165 -0.0906,3.84612 -1.879546,4.59605 z'
+ },
+ 'TASK_TYPE_BUSINESS_RULE_HEADER': {
+ d: 'm {mx},{my} 0,4 20,0 0,-4 z'
+ },
+ 'TASK_TYPE_BUSINESS_RULE_MAIN': {
+ d: 'm {mx},{my} 0,12 20,0 0,-12 z' +
+ 'm 0,8 l 20,0 ' +
+ 'm -13,-4 l 0,8'
+ },
+ 'MESSAGE_FLOW_MARKER': {
+ d: 'm {mx},{my} m -10.5 ,-7 l 0,14 l 21,0 l 0,-14 z l 10.5,6 l 10.5,-6'
+ }
+ };
+
+ this.getRawPath = function getRawPath(pathId) {
+ return this.pathMap[pathId].d;
+ };
+
+ /**
+ * Scales the path to the given height and width.
+ * Use case
+ * Use case is to scale the content of elements (event, gateways) based
+ * on the element bounding box's size.
+ *
+ * Why not transform
+ * Scaling a path with transform() will also scale the stroke and IE does not support
+ * the option 'non-scaling-stroke' to prevent this.
+ * Also there are use cases where only some parts of a path should be
+ * scaled.
+ *
+ * @param {String} pathId The ID of the path.
+ * @param {Object} param
+ * Example param object scales the path to 60% size of the container (data.width, data.height).
+ *
+ * {
+ * xScaleFactor: 0.6,
+ * yScaleFactor:0.6,
+ * containerWidth: data.width,
+ * containerHeight: data.height,
+ * position: {
+ * mx: 0.46,
+ * my: 0.2,
+ * }
+ * }
+ *
+ *
+ * targetpathwidth = xScaleFactor * containerWidth
+ * targetpathheight = yScaleFactor * containerHeight
+ * Position is used to set the starting coordinate of the path. M is computed:
+ *
+ * position.x * containerWidth
+ * position.y * containerHeight
+ *
+ * Center of the container position: {
+ * mx: 0.5,
+ * my: 0.5,
+ * }
+ * Upper left corner of the container
+ * position: {
+ * mx: 0.0,
+ * my: 0.0,
+ * }
+ *
+ *
+ *
+ *
+ */
+ this.getScaledPath = function getScaledPath(pathId, param) {
+ var rawPath = this.pathMap[pathId];
+
+ // positioning
+ // compute the start point of the path
+ var mx, my;
+
+ if(!!param.abspos) {
+ mx = param.abspos.x;
+ my = param.abspos.y;
+ } else {
+ mx = param.containerWidth * param.position.mx;
+ my = param.containerHeight * param.position.my;
+ }
+
+ var coordinates = {}; //map for the scaled coordinates
+ if(param.position) {
+
+ // path
+ var heightRatio = (param.containerHeight / rawPath.height) * param.yScaleFactor;
+ var widthRatio = (param.containerWidth / rawPath.width) * param.xScaleFactor;
+
+
+ //Apply height ratio
+ for (var heightIndex = 0; heightIndex < rawPath.heightElements.length; heightIndex++) {
+ coordinates['y' + heightIndex] = rawPath.heightElements[heightIndex] * heightRatio;
+ }
+
+ //Apply width ratio
+ for (var widthIndex = 0; widthIndex < rawPath.widthElements.length; widthIndex++) {
+ coordinates['x' + widthIndex] = rawPath.widthElements[widthIndex] * widthRatio;
+ }
+ }
+
+ //Apply value to raw path
+ var path = Snap.format(
+ rawPath.d, {
+ mx: mx,
+ my: my,
+ e: coordinates
+ }
+ );
+ return path;
+ };
+}
+
+module.exports = PathMap;
+
+},{"240":240}],6:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [ 'bpmnRenderer' ],
+ bpmnRenderer: [ 'type', _dereq_(4) ],
+ pathMap: [ 'type', _dereq_(5) ]
+};
+
+},{"4":4,"5":5}],7:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var is = _dereq_(70).is,
+ getBoundingBox = _dereq_(221).getBBox;
+
+var pick = _dereq_(383),
+ assign = _dereq_(377),
+ forEach = _dereq_(255),
+ values = _dereq_(385),
+ flatten = _dereq_(245),
+ groupBy = _dereq_(256);
+
+var CommandInterceptor = _dereq_(98);
+
+var OFFSET = { top: 60, bottom: 60, left: 100, right: 100 };
+var PADDING = { top: 2, bottom: 2, left: 15, right: 15 };
+
+/**
+ * An auto resize component that takes care of expanding parent participants
+ * and lanes if elements are modeled close to an edge of the parent element.
+ */
+function AutoResize(eventBus, canvas, modeling, elementRegistry){
+
+ CommandInterceptor.call(this, eventBus);
+
+ this.postExecuted([ 'shape.create' ], function(event) {
+ var context = event.context,
+ shape = context.shape,
+ parent = context.parent || context.newParent;
+
+ expand([ shape ], parent);
+ });
+
+ this.postExecuted([ 'elements.move' ], function(event) {
+
+ var context = event.context,
+ elements = flatten(values(context.closure.topLevel));
+
+ var expandings = groupBy(elements, function(element){
+ return element.parent.id;
+ });
+
+ forEach(expandings, function(elements, parentId) {
+ expand(elements, parentId);
+ });
+ });
+
+ /**
+ * Returns an object which indicates near which bounding edge(s)
+ * of a target a bounding box is located.
+ *
+ * @param {Object} bbox bounding box object with x, y, width and height properties
+ * @param {Shape} target
+ * @param {Number} padding
+ *
+ * @return {Object} {top, bottom, left, right}
+ *
+ * @example
+ *
+ * // If the bounding box is near the bottom left corner of a target the return object is:
+ * { top: false, bottom: true, left: true, right: false }
+ *
+ */
+ function isInbounds(bbox, target, padding) {
+ return {
+ top: bbox.y < target.y + padding.top,
+ bottom: bbox.y + bbox.height > target.y + target.height - padding.bottom,
+ left: bbox.x < target.x + padding.left,
+ right: bbox.x + bbox.width > target.x + target.width - padding.right,
+ };
+ }
+
+ /**
+ * Expand the target shape if the bounding box of the moved elements is near or on an edge,
+ * considering the position of the bounding box in relation to the parent's edge plus padding.
+ * The amount to expand can be defined for each edge in the OFFSET object.
+ *
+ * @param {Array} elements
+ * @param {Shape|String} target|targetId
+ */
+ function expand(elements, target) {
+
+ if (typeof target === 'string') {
+ target = elementRegistry.get(target);
+ }
+
+ var bbox = getBoundingBox(elements),
+ canExpand = true;
+
+ if (!is(target, 'bpmn:Participant') && !is(target, 'bpmn:Lane') && !(is(target, 'bpmn:SubProcess'))) {
+ return;
+ }
+
+ forEach(elements, function(element) {
+
+ if (is(element, 'bpmn:Lane') || element.labelTarget) {
+ canExpand = false;
+ return;
+ }
+ });
+
+ if (!canExpand) {
+ return;
+ }
+
+ var inbounds = isInbounds(bbox, target, PADDING);
+
+ var newBounds = pick(target, [ 'x', 'y', 'width', 'height' ]);
+
+ if (inbounds.top) {
+ var topPosition = bbox.y - OFFSET.top;
+ assign(newBounds, { y: topPosition, height: newBounds.height + newBounds.y - topPosition });
+ }
+
+ if (inbounds.bottom) {
+ assign(newBounds, { height: bbox.y + bbox.height + OFFSET.bottom - newBounds.y });
+ }
+
+ if (inbounds.left) {
+ var leftPosition = bbox.x - OFFSET.left;
+ assign(newBounds, { x: leftPosition, width: newBounds.width + newBounds.x - leftPosition });
+ }
+
+ if (inbounds.right) {
+ assign(newBounds, { width: bbox.x + bbox.width + OFFSET.right - newBounds.x });
+ }
+
+ if (is(target, 'bpmn:Participant')) {
+ modeling.resizeLane(target, newBounds);
+ } else {
+ modeling.resizeShape(target, newBounds);
+ }
+
+ var parent = target.parent;
+
+ // recursively expand parent elements
+ if (parent) {
+ expand([ target ], parent);
+ }
+ }
+}
+
+AutoResize.$inject = [ 'eventBus', 'canvas', 'modeling', 'elementRegistry' ];
+
+inherits(AutoResize, CommandInterceptor);
+
+module.exports = AutoResize;
+
+},{"221":221,"243":243,"245":245,"255":255,"256":256,"377":377,"383":383,"385":385,"70":70,"98":98}],8:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [ 'autoResize' ],
+ autoResize: [ 'type', _dereq_(7) ]
+};
+
+},{"7":7}],9:[function(_dereq_,module,exports){
+'use strict';
+
+
+var assign = _dereq_(377),
+ forEach = _dereq_(255),
+ isArray = _dereq_(368),
+ is = _dereq_(70).is,
+ isExpanded = _dereq_(68).isExpanded,
+ isAny = _dereq_(45).isAny,
+ getChildLanes = _dereq_(44).getChildLanes,
+ isEventSubProcess = _dereq_(68).isEventSubProcess;
+
+
+/**
+ * A provider for BPMN 2.0 elements context pad
+ */
+function ContextPadProvider(contextPad, modeling, elementFactory,
+ connect, create, popupMenu,
+ canvas, rules, translate) {
+
+ contextPad.registerProvider(this);
+
+ this._contextPad = contextPad;
+
+ this._modeling = modeling;
+
+ this._elementFactory = elementFactory;
+ this._connect = connect;
+ this._create = create;
+ this._popupMenu = popupMenu;
+ this._canvas = canvas;
+ this._rules = rules;
+ this._translate = translate;
+}
+
+ContextPadProvider.$inject = [
+ 'contextPad',
+ 'modeling',
+ 'elementFactory',
+ 'connect',
+ 'create',
+ 'popupMenu',
+ 'canvas',
+ 'rules',
+ 'translate'
+];
+
+module.exports = ContextPadProvider;
+
+
+ContextPadProvider.prototype.getContextPadEntries = function(element) {
+
+ var contextPad = this._contextPad,
+ modeling = this._modeling,
+
+ elementFactory = this._elementFactory,
+ connect = this._connect,
+ create = this._create,
+ popupMenu = this._popupMenu,
+ canvas = this._canvas,
+ rules = this._rules,
+
+ translate = this._translate;
+
+ var actions = {};
+
+ if (element.type === 'label') {
+ return actions;
+ }
+
+ var businessObject = element.businessObject;
+
+ function startConnect(event, element, autoActivate) {
+ connect.start(event, element, autoActivate);
+ }
+
+ function removeElement(e) {
+ modeling.removeElements([ element ]);
+ }
+
+ function getReplaceMenuPosition(element) {
+
+ var Y_OFFSET = 5;
+
+ var diagramContainer = canvas.getContainer(),
+ pad = contextPad.getPad(element).html;
+
+ var diagramRect = diagramContainer.getBoundingClientRect(),
+ padRect = pad.getBoundingClientRect();
+
+ var top = padRect.top - diagramRect.top;
+ var left = padRect.left - diagramRect.left;
+
+ var pos = {
+ x: left,
+ y: top + padRect.height + Y_OFFSET
+ };
+
+ return pos;
+ }
+
+
+ /**
+ * Create an append action
+ *
+ * @param {String} type
+ * @param {String} className
+ * @param {String} [title]
+ * @param {Object} [options]
+ *
+ * @return {Object} descriptor
+ */
+ function appendAction(type, className, title, options) {
+
+ if (typeof title !== 'string') {
+ options = title;
+ title = translate('Append {type}', { type: type.replace(/^bpmn\:/, '') });
+ }
+
+ function appendListener(event, element) {
+
+ var shape = elementFactory.createShape(assign({ type: type }, options));
+ create.start(event, shape, element);
+ }
+
+ return {
+ group: 'model',
+ className: className,
+ title: title,
+ action: {
+ dragstart: appendListener,
+ click: appendListener
+ }
+ };
+ }
+
+ function splitLaneHandler(count) {
+
+ return function(event, element) {
+ // actual split
+ modeling.splitLane(element, count);
+
+ // refresh context pad after split to
+ // get rid of split icons
+ contextPad.open(element, true);
+ };
+ }
+
+
+ if (isAny(businessObject, [ 'bpmn:Lane', 'bpmn:Participant' ]) && isExpanded(businessObject)) {
+
+ var childLanes = getChildLanes(element);
+
+ assign(actions, {
+ 'lane-insert-above': {
+ group: 'lane-insert-above',
+ className: 'bpmn-icon-lane-insert-above',
+ title: translate('Add Lane above'),
+ action: {
+ click: function(event, element) {
+ modeling.addLane(element, 'top');
+ }
+ }
+ }
+ });
+
+ if (childLanes.length < 2) {
+
+ if (element.height >= 120) {
+ assign(actions, {
+ 'lane-divide-two': {
+ group: 'lane-divide',
+ className: 'bpmn-icon-lane-divide-two',
+ title: translate('Divide into two Lanes'),
+ action: {
+ click: splitLaneHandler(2)
+ }
+ }
+ });
+ }
+
+ if (element.height >= 180) {
+ assign(actions, {
+ 'lane-divide-three': {
+ group: 'lane-divide',
+ className: 'bpmn-icon-lane-divide-three',
+ title: translate('Divide into three Lanes'),
+ action: {
+ click: splitLaneHandler(3)
+ }
+ }
+ });
+ }
+ }
+
+ assign(actions, {
+ 'lane-insert-below': {
+ group: 'lane-insert-below',
+ className: 'bpmn-icon-lane-insert-below',
+ title: translate('Add Lane below'),
+ action: {
+ click: function(event, element) {
+ modeling.addLane(element, 'bottom');
+ }
+ }
+ }
+ });
+
+ }
+
+ if (is(businessObject, 'bpmn:FlowNode')) {
+
+ if (is(businessObject, 'bpmn:EventBasedGateway')) {
+
+ assign(actions, {
+ 'append.receive-task': appendAction('bpmn:ReceiveTask', 'bpmn-icon-receive-task'),
+ 'append.message-intermediate-event': appendAction('bpmn:IntermediateCatchEvent',
+ 'bpmn-icon-intermediate-event-catch-message',
+ { eventDefinitionType: 'bpmn:MessageEventDefinition'}),
+ 'append.timer-intermediate-event': appendAction('bpmn:IntermediateCatchEvent',
+ 'bpmn-icon-intermediate-event-catch-timer',
+ { eventDefinitionType: 'bpmn:TimerEventDefinition'}),
+ 'append.condtion-intermediate-event': appendAction('bpmn:IntermediateCatchEvent',
+ 'bpmn-icon-intermediate-event-catch-condition',
+ { eventDefinitionType: 'bpmn:ConditionalEventDefinition'}),
+ 'append.signal-intermediate-event': appendAction('bpmn:IntermediateCatchEvent',
+ 'bpmn-icon-intermediate-event-catch-signal',
+ { eventDefinitionType: 'bpmn:SignalEventDefinition'})
+ });
+ } else
+
+ if (isEventType(businessObject, 'bpmn:BoundaryEvent', 'bpmn:CompensateEventDefinition')) {
+
+ assign(actions, {
+ 'append.compensation-activity':
+ appendAction('bpmn:Task', 'bpmn-icon-task', translate('Append compensation activity'), {
+ isForCompensation: true
+ })
+ });
+ } else
+
+ if (!is(businessObject, 'bpmn:EndEvent') &&
+ !businessObject.isForCompensation &&
+ !isEventType(businessObject, 'bpmn:IntermediateThrowEvent', 'bpmn:LinkEventDefinition') &&
+ !isEventSubProcess(businessObject)) {
+
+ assign(actions, {
+ 'append.end-event': appendAction('bpmn:EndEvent', 'bpmn-icon-end-event-none'),
+ 'append.gateway': appendAction('bpmn:ExclusiveGateway', 'bpmn-icon-gateway-xor'),
+ 'append.append-task': appendAction('bpmn:Task', 'bpmn-icon-task'),
+ 'append.intermediate-event': appendAction('bpmn:IntermediateThrowEvent',
+ 'bpmn-icon-intermediate-event-none')
+ });
+ }
+ }
+
+ var replaceMenu;
+
+ if (popupMenu._providers['bpmn-replace']) {
+ replaceMenu = popupMenu.create('bpmn-replace', element);
+ }
+
+ if (replaceMenu && !replaceMenu.isEmpty()) {
+
+ // Replace menu entry
+ assign(actions, {
+ 'replace': {
+ group: 'edit',
+ className: 'bpmn-icon-screw-wrench',
+ title: translate('Change type'),
+ action: {
+ click: function(event, element) {
+ replaceMenu.open(assign(getReplaceMenuPosition(element), {
+ cursor: { x: event.x, y: event.y }
+ }), element);
+ }
+ }
+ }
+ });
+ }
+
+ if (isAny(businessObject, [ 'bpmn:FlowNode', 'bpmn:InteractionNode' ]) ) {
+
+ assign(actions, {
+ 'append.text-annotation': appendAction('bpmn:TextAnnotation', 'bpmn-icon-text-annotation'),
+
+ 'connect': {
+ group: 'connect',
+ className: 'bpmn-icon-connection-multi',
+ title: translate('Connect using ' +
+ (businessObject.isForCompensation ? '' : 'Sequence/MessageFlow or ') +
+ 'Association'),
+ action: {
+ click: startConnect,
+ dragstart: startConnect
+ }
+ }
+ });
+ }
+
+ if (isAny(businessObject, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ])) {
+ assign(actions, {
+ 'connect': {
+ group: 'connect',
+ className: 'bpmn-icon-connection-multi',
+ title: translate('Connect using DataInputAssociation'),
+ action: {
+ click: startConnect,
+ dragstart: startConnect
+ }
+ }
+ });
+ }
+
+ // delete element entry, only show if allowed by rules
+ var deleteAllowed = rules.allowed('elements.delete', { elements: [ element ]});
+
+ if (isArray(deleteAllowed)) {
+ // was the element returned as a deletion candidate?
+ deleteAllowed = deleteAllowed[0] === element;
+ }
+
+ if (deleteAllowed) {
+ assign(actions, {
+ 'delete': {
+ group: 'edit',
+ className: 'bpmn-icon-trash',
+ title: translate('Remove'),
+ action: {
+ click: removeElement,
+ dragstart: removeElement
+ }
+ }
+ });
+ }
+
+ return actions;
+};
+
+function isEventType(eventBo, type, definition) {
+
+ var isType = eventBo.$instanceOf(type);
+ var isDefinition = false;
+
+ var definitions = eventBo.eventDefinitions || [];
+ forEach(definitions, function(def) {
+ if (def.$type === definition) {
+ isDefinition = true;
+ }
+ });
+
+ return isType && isDefinition;
+}
+
+},{"255":255,"368":368,"377":377,"44":44,"45":45,"68":68,"70":70}],10:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(93),
+ _dereq_(124),
+ _dereq_(189),
+ _dereq_(122),
+ _dereq_(126),
+ _dereq_(51)
+ ],
+ __init__: [ 'contextPadProvider' ],
+ contextPadProvider: [ 'type', _dereq_(9) ]
+};
+},{"122":122,"124":124,"126":126,"189":189,"51":51,"9":9,"93":93}],11:[function(_dereq_,module,exports){
+'use strict';
+
+function BpmnKeyBindings(keyboard, spaceTool, lassoTool, handTool, directEditing,
+ selection, canvas, elementRegistry, editorActions) {
+
+ var actions = {
+ selectElements: function() {
+ // select all elements except for the invisible
+ // root element
+ var rootElement = canvas.getRootElement();
+
+ var elements = elementRegistry.filter(function(element) {
+ return element != rootElement;
+ });
+
+ selection.select(elements);
+ },
+ spaceTool: function() {
+ spaceTool.toggle();
+ },
+ lassoTool: function() {
+ lassoTool.toggle();
+ },
+ handTool: function() {
+ handTool.toggle();
+ },
+ directEditing: function() {
+ var currentSelection = selection.get();
+
+ if (currentSelection.length) {
+ directEditing.activate(currentSelection[0]);
+ }
+ }
+ };
+
+ editorActions.register(actions);
+
+ keyboard.addListener(function(key, modifiers) {
+
+ // ctrl + a -> select all elements
+ if (key === 65 && keyboard.isCmd(modifiers)) {
+ editorActions.trigger('selectElements');
+
+ return true;
+ }
+
+ if (keyboard.hasModifier(modifiers)) {
+ return;
+ }
+
+ // s -> activate space tool
+ if (key === 83) {
+ editorActions.trigger('spaceTool');
+
+ return true;
+ }
+
+ // l -> activate lasso tool
+ if (key === 76) {
+ editorActions.trigger('lassoTool');
+
+ return true;
+ }
+
+ // h -> activate hand tool
+ if (key === 72) {
+ editorActions.trigger('handTool');
+
+ return true;
+ }
+
+ // e -> activate direct editing
+ if (key === 69) {
+ editorActions.trigger('directEditing');
+
+ return true;
+ }
+ });
+}
+
+BpmnKeyBindings.$inject = [
+ 'keyboard',
+ 'spaceTool',
+ 'lassoTool',
+ 'handTool',
+ 'directEditing',
+ 'selection',
+ 'canvas',
+ 'elementRegistry',
+ 'editorActions'
+];
+
+module.exports = BpmnKeyBindings;
+
+},{}],12:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(137)
+ ],
+ __init__: [ 'bpmnKeyBindings' ],
+ bpmnKeyBindings: [ 'type', _dereq_(11) ]
+};
+},{"11":11,"137":137}],13:[function(_dereq_,module,exports){
+'use strict';
+
+var UpdateLabelHandler = _dereq_(15);
+
+var LabelUtil = _dereq_(14);
+
+var is = _dereq_(70).is,
+ isExpanded = _dereq_(68).isExpanded;
+
+
+var MIN_BOUNDS = {
+ width: 150,
+ height: 50
+};
+
+
+function LabelEditingProvider(eventBus, canvas, directEditing, commandStack) {
+
+ directEditing.registerProvider(this);
+ commandStack.registerHandler('element.updateLabel', UpdateLabelHandler);
+
+ // listen to dblclick on non-root elements
+ eventBus.on('element.dblclick', function(event) {
+ directEditing.activate(event.element);
+ });
+
+ // complete on followup canvas operation
+ eventBus.on([ 'element.mousedown', 'drag.init', 'canvas.viewbox.changed' ], function(event) {
+ directEditing.complete();
+ });
+
+ // cancel on command stack changes
+ eventBus.on([ 'commandStack.changed' ], function() {
+ directEditing.cancel();
+ });
+
+
+ // activate direct editing for activities and text annotations
+
+
+ if ('ontouchstart' in document.documentElement) {
+ // we deactivate automatic label editing on mobile devices
+ // as it breaks the user interaction workflow
+
+ // TODO(nre): we should temporarily focus the edited element here
+ // and release the focused viewport after the direct edit operation is finished
+ } else {
+ eventBus.on('create.end', 500, function(e) {
+
+ var element = e.shape,
+ canExecute = e.context.canExecute;
+
+ if (!canExecute) {
+ return;
+ }
+
+ if (is(element, 'bpmn:Task') || is(element, 'bpmn:TextAnnotation') ||
+ (is(element, 'bpmn:SubProcess') && !isExpanded(element))) {
+
+ directEditing.activate(element);
+ }
+ });
+ }
+
+ this._canvas = canvas;
+ this._commandStack = commandStack;
+}
+
+LabelEditingProvider.$inject = [ 'eventBus', 'canvas', 'directEditing', 'commandStack' ];
+
+module.exports = LabelEditingProvider;
+
+
+LabelEditingProvider.prototype.activate = function(element) {
+
+ var text = LabelUtil.getLabel(element);
+
+ if (text === undefined) {
+ return;
+ }
+
+ var bbox = this.getEditingBBox(element);
+
+ // adjust for expanded pools AND lanes
+ if ((is(element, 'bpmn:Participant') && isExpanded(element)) || is(element, 'bpmn:Lane')) {
+
+ bbox.width = MIN_BOUNDS.width;
+ bbox.height = MIN_BOUNDS.height;
+
+ bbox.x = bbox.x + 10 - bbox.width / 2;
+ bbox.y = bbox.mid.y - bbox.height / 2;
+ }
+
+ // ajust minumum size for task and activities
+ if ((is(element, 'bpmn:Task') || is(element, 'bpmn:Activity') )) {
+
+ if (bbox.width < 100) {
+ bbox.width = 100;
+ bbox.x = bbox.mid.x - bbox.width / 2;
+ }
+
+ if (bbox.height < 80) {
+ bbox.height = 80;
+ bbox.y = bbox.mid.y - bbox.height / 2;
+ }
+ }
+
+ // adjust for expanded sub processes and collapsed pools
+ if ((is(element, 'bpmn:SubProcess') && isExpanded(element)) ||
+ (is(element, 'bpmn:Participant') && !isExpanded(element))) {
+
+ bbox.width = element.width;
+ bbox.height = MIN_BOUNDS.height;
+
+ bbox.x = bbox.mid.x - element.width / 2;
+ }
+
+ return { bounds: bbox, text: text };
+};
+
+
+LabelEditingProvider.prototype.getEditingBBox = function(element, maxBounds) {
+
+ var target = element.label || element;
+
+ var bbox = this._canvas.getAbsoluteBBox(target);
+
+ var mid = {
+ x: bbox.x + bbox.width / 2,
+ y: bbox.y + bbox.height / 2
+ };
+
+ // external label
+ if (target.labelTarget) {
+ bbox.width = Math.max(bbox.width, MIN_BOUNDS.width);
+ bbox.height = Math.max(bbox.height, MIN_BOUNDS.height);
+
+ bbox.x = mid.x - bbox.width / 2;
+ }
+
+ bbox.mid = mid;
+
+ return bbox;
+};
+
+
+LabelEditingProvider.prototype.update = function(element, newLabel) {
+ this._commandStack.execute('element.updateLabel', {
+ element: element,
+ newLabel: newLabel
+ });
+};
+
+},{"14":14,"15":15,"68":68,"70":70}],14:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is;
+
+function getLabelAttr(semantic) {
+ if (is(semantic, 'bpmn:FlowElement') ||
+ is(semantic, 'bpmn:Participant') ||
+ is(semantic, 'bpmn:Lane') ||
+ is(semantic, 'bpmn:SequenceFlow') ||
+ is(semantic, 'bpmn:MessageFlow')) {
+
+ return 'name';
+ }
+
+ if (is(semantic, 'bpmn:TextAnnotation')) {
+ return 'text';
+ }
+}
+
+module.exports.getLabel = function(element) {
+ var semantic = element.businessObject,
+ attr = getLabelAttr(semantic);
+
+ if (attr) {
+ return semantic[attr] || '';
+ }
+};
+
+
+module.exports.setLabel = function(element, text, isExternal) {
+ var semantic = element.businessObject,
+ attr = getLabelAttr(semantic);
+
+ if (attr) {
+ semantic[attr] = text;
+ }
+
+ // show external label if not empty
+ if (isExternal) {
+ element.hidden = !text;
+ }
+
+ return element;
+};
+},{"70":70}],15:[function(_dereq_,module,exports){
+'use strict';
+
+var LabelUtil = _dereq_(14);
+
+
+/**
+ * A handler that updates the text of a BPMN element.
+ */
+function UpdateLabelHandler() {
+
+ /**
+ * Set the label and return the changed elements.
+ *
+ * Element parameter can be label itself or connection (i.e. sequence flow).
+ *
+ * @param {djs.model.Base} element
+ * @param {String} text
+ */
+ function setText(element, text) {
+
+ // external label if present
+ var label = element.label || element;
+
+ var labelTarget = element.labelTarget || element;
+
+ LabelUtil.setLabel(label, text, labelTarget !== label);
+
+ return [ label, labelTarget ];
+ }
+
+ function execute(ctx) {
+ ctx.oldLabel = LabelUtil.getLabel(ctx.element);
+ return setText(ctx.element, ctx.newLabel);
+ }
+
+ function revert(ctx) {
+ return setText(ctx.element, ctx.oldLabel);
+ }
+
+ // API
+
+ this.execute = execute;
+ this.revert = revert;
+}
+
+module.exports = UpdateLabelHandler;
+},{"14":14}],16:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(100),
+ _dereq_(120),
+ _dereq_(93)
+ ],
+ __init__: [ 'labelEditingProvider' ],
+ labelEditingProvider: [ 'type', _dereq_(13) ]
+};
+},{"100":100,"120":120,"13":13,"93":93}],17:[function(_dereq_,module,exports){
+'use strict';
+
+var map = _dereq_(258),
+ assign = _dereq_(377),
+ pick = _dereq_(383);
+
+
+function BpmnFactory(moddle) {
+ this._model = moddle;
+}
+
+BpmnFactory.$inject = [ 'moddle' ];
+
+
+BpmnFactory.prototype._needsId = function(element) {
+ return element.$instanceOf('bpmn:RootElement') ||
+ element.$instanceOf('bpmn:FlowElement') ||
+ element.$instanceOf('bpmn:MessageFlow') ||
+ element.$instanceOf('bpmn:DataAssociation') ||
+ element.$instanceOf('bpmn:Artifact') ||
+ element.$instanceOf('bpmn:Participant') ||
+ element.$instanceOf('bpmn:Lane') ||
+ element.$instanceOf('bpmn:Process') ||
+ element.$instanceOf('bpmn:Collaboration') ||
+ element.$instanceOf('bpmndi:BPMNShape') ||
+ element.$instanceOf('bpmndi:BPMNEdge') ||
+ element.$instanceOf('bpmndi:BPMNDiagram') ||
+ element.$instanceOf('bpmndi:BPMNPlane') ||
+ element.$instanceOf('bpmn:Property');
+};
+
+BpmnFactory.prototype._ensureId = function(element) {
+
+ // generate semantic ids for elements
+ // bpmn:SequenceFlow -> SequenceFlow_ID
+ var prefix = (element.$type || '').replace(/^[^:]*:/g, '') + '_';
+
+ if (!element.id && this._needsId(element)) {
+ element.id = this._model.ids.nextPrefixed(prefix, element);
+ }
+};
+
+
+BpmnFactory.prototype.create = function(type, attrs) {
+ var element = this._model.create(type, attrs || {});
+
+ this._ensureId(element);
+
+ return element;
+};
+
+
+BpmnFactory.prototype.createDiLabel = function() {
+ return this.create('bpmndi:BPMNLabel', {
+ bounds: this.createDiBounds()
+ });
+};
+
+
+BpmnFactory.prototype.createDiShape = function(semantic, bounds, attrs) {
+
+ return this.create('bpmndi:BPMNShape', assign({
+ bpmnElement: semantic,
+ bounds: this.createDiBounds(bounds)
+ }, attrs));
+};
+
+
+BpmnFactory.prototype.createDiBounds = function(bounds) {
+ return this.create('dc:Bounds', bounds);
+};
+
+
+BpmnFactory.prototype.createDiWaypoints = function(waypoints) {
+ return map(waypoints, function(pos) {
+ return this.createDiWaypoint(pos);
+ }, this);
+};
+
+BpmnFactory.prototype.createDiWaypoint = function(point) {
+ return this.create('dc:Point', pick(point, [ 'x', 'y' ]));
+};
+
+
+BpmnFactory.prototype.createDiEdge = function(semantic, waypoints, attrs) {
+ return this.create('bpmndi:BPMNEdge', assign({
+ bpmnElement: semantic
+ }, attrs));
+};
+
+BpmnFactory.prototype.createDiPlane = function(semantic) {
+ return this.create('bpmndi:BPMNPlane', {
+ bpmnElement: semantic
+ });
+};
+
+module.exports = BpmnFactory;
+
+},{"258":258,"377":377,"383":383}],18:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var assign = _dereq_(377);
+
+var BaseLayouter = _dereq_(206),
+ ManhattanLayout = _dereq_(209);
+
+var LayoutUtil = _dereq_(208);
+
+var getMid = LayoutUtil.getMid,
+ getOrientation = LayoutUtil.getOrientation;
+
+var is = _dereq_(70).is;
+
+
+function BpmnLayouter() {}
+
+inherits(BpmnLayouter, BaseLayouter);
+
+module.exports = BpmnLayouter;
+
+
+BpmnLayouter.prototype.layoutConnection = function(connection, layoutHints) {
+ var source = connection.source,
+ target = connection.target,
+ waypoints = connection.waypoints,
+ start,
+ end;
+
+ var manhattanOptions,
+ updatedWaypoints;
+
+ start = getConnectionDocking(waypoints, 0, source);
+ end = getConnectionDocking(waypoints, waypoints && waypoints.length - 1, target);
+
+ // TODO (nre): support vertical modeling
+ // and invert preferredLayouts accordingly
+
+ if (is(connection, 'bpmn:Association') ||
+ is(connection, 'bpmn:DataAssociation')) {
+
+ if (waypoints && !isCompensationAssociation(connection)) {
+ return waypoints;
+ }
+ }
+
+ // manhattan layout sequence / message flows
+ if (is(connection, 'bpmn:MessageFlow')) {
+ manhattanOptions = {
+ preferredLayouts: [ 'straight', 'v:v' ]
+ };
+
+ if (is(target, 'bpmn:Event')) {
+ manhattanOptions = {
+ preferredLayouts: [ 'v:v' ]
+ };
+ }
+ } else
+
+
+ // layout all connection between flow elements h:h,
+ //
+ // except for
+ //
+ // (1) outgoing of BoundaryEvents -> layout h:v or v:h based on attach orientation
+ // (2) incoming / outgoing of Gateway -> v:h (outgoing), h:v (incoming)
+ //
+ if (is(connection, 'bpmn:SequenceFlow') ||
+ isCompensationAssociation(connection)) {
+
+ // make sure boundary event connections do
+ // not look ugly =:>
+ if (is(source, 'bpmn:BoundaryEvent')) {
+
+ var orientation = getAttachOrientation(source);
+
+ if (/left|right/.test(orientation)) {
+ manhattanOptions = {
+ preferredLayouts: [ 'h:v' ]
+ };
+ } else
+
+ if (/top|bottom/.test(orientation)) {
+ manhattanOptions = {
+ preferredLayouts: [ 'v:h' ]
+ };
+ }
+ } else
+
+ if (is(source, 'bpmn:Gateway')) {
+
+ manhattanOptions = {
+ preferredLayouts: [ 'v:h' ]
+ };
+ } else
+
+ if (is(target, 'bpmn:Gateway')) {
+
+ manhattanOptions = {
+ preferredLayouts: [ 'h:v' ]
+ };
+ }
+
+ // apply horizontal love <3
+ else {
+ manhattanOptions = {
+ preferredLayouts: [ 'h:h' ]
+ };
+ }
+ }
+
+ if (manhattanOptions) {
+
+ manhattanOptions = assign(manhattanOptions, layoutHints);
+
+ updatedWaypoints =
+ ManhattanLayout.repairConnection(
+ source, target,
+ start, end,
+ waypoints,
+ manhattanOptions);
+ }
+
+ return updatedWaypoints || [ start, end ];
+};
+
+
+function getAttachOrientation(attachedElement) {
+
+ var hostElement = attachedElement.host,
+ padding = -10;
+
+ return getOrientation(getMid(attachedElement), hostElement, padding);
+}
+
+
+function getConnectionDocking(waypoints, idx, shape) {
+ var point = waypoints && waypoints[idx];
+
+ return point ? (point.original || point) : getMid(shape);
+}
+
+function isCompensationAssociation(connection) {
+
+ var source = connection.source,
+ target = connection.target;
+
+ return is(target, 'bpmn:Activity') &&
+ is(source, 'bpmn:BoundaryEvent') &&
+ target.businessObject.isForCompensation;
+}
+},{"206":206,"208":208,"209":209,"243":243,"377":377,"70":70}],19:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377),
+ forEach = _dereq_(255),
+ inherits = _dereq_(243);
+
+var Collections = _dereq_(219),
+ Model = _dereq_(210);
+
+var getBusinessObject = _dereq_(70).getBusinessObject,
+ is = _dereq_(70).is;
+
+var CommandInterceptor = _dereq_(98);
+
+
+/**
+ * A handler responsible for updating the underlying BPMN 2.0 XML + DI
+ * once changes on the diagram happen
+ */
+function BpmnUpdater(eventBus, bpmnFactory, connectionDocking, translate) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ this._bpmnFactory = bpmnFactory;
+ this._translate = translate;
+
+ var self = this;
+
+
+
+ ////// connection cropping /////////////////////////
+
+ // crop connection ends during create/update
+ function cropConnection(e) {
+ var context = e.context,
+ connection;
+
+ if (!context.cropped) {
+ connection = context.connection;
+ connection.waypoints = connectionDocking.getCroppedWaypoints(connection);
+ context.cropped = true;
+ }
+ }
+
+ this.executed([
+ 'connection.layout',
+ 'connection.create',
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], cropConnection);
+
+ this.reverted([ 'connection.layout' ], function(e) {
+ delete e.context.cropped;
+ });
+
+
+
+ ////// BPMN + DI update /////////////////////////
+
+
+ // update parent
+ function updateParent(e) {
+ var context = e.context;
+
+ self.updateParent(context.shape || context.connection, context.oldParent);
+ }
+
+ function reverseUpdateParent(e) {
+ var context = e.context;
+
+ var element = context.shape || context.connection,
+ // oldParent is the (old) new parent, because we are undoing
+ oldParent = context.parent || context.newParent;
+
+ self.updateParent(element, oldParent);
+ }
+
+ this.executed([ 'shape.move',
+ 'shape.create',
+ 'shape.delete',
+ 'connection.create',
+ 'connection.move',
+ 'connection.delete' ], ifBpmn(updateParent));
+
+ this.reverted([ 'shape.move',
+ 'shape.create',
+ 'shape.delete',
+ 'connection.create',
+ 'connection.move',
+ 'connection.delete' ], ifBpmn(reverseUpdateParent));
+
+ /*
+ * ## Updating Parent
+ *
+ * When morphing a Process into a Collaboration or vice-versa,
+ * make sure that both the *semantic* and *di* parent of each element
+ * is updated.
+ *
+ */
+ function updateRoot(event) {
+ var context = event.context,
+ oldRoot = context.oldRoot,
+ children = oldRoot.children;
+
+ forEach(children, function(child) {
+ self.updateParent(child);
+ });
+ }
+
+ this.executed([ 'canvas.updateRoot' ], updateRoot);
+ this.reverted([ 'canvas.updateRoot' ], updateRoot);
+
+
+ // update bounds
+ function updateBounds(e) {
+ var shape = e.context.shape;
+
+ if (!is(shape, 'bpmn:BaseElement')) {
+ return;
+ }
+
+ self.updateBounds(shape);
+ }
+
+ this.executed([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(updateBounds));
+ this.reverted([ 'shape.move', 'shape.create', 'shape.resize' ], ifBpmn(updateBounds));
+
+
+ // attach / detach connection
+ function updateConnection(e) {
+ self.updateConnection(e.context);
+ }
+
+ this.executed([
+ 'connection.create',
+ 'connection.move',
+ 'connection.delete',
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(updateConnection));
+
+ this.reverted([
+ 'connection.create',
+ 'connection.move',
+ 'connection.delete',
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(updateConnection));
+
+
+ // update waypoints
+ function updateConnectionWaypoints(e) {
+ self.updateConnectionWaypoints(e.context.connection);
+ }
+
+ this.executed([
+ 'connection.layout',
+ 'connection.move',
+ 'connection.updateWaypoints',
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(updateConnectionWaypoints));
+
+ this.reverted([
+ 'connection.layout',
+ 'connection.move',
+ 'connection.updateWaypoints',
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(updateConnectionWaypoints));
+
+
+ // update Default & Conditional flows
+ this.executed([
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(function(e) {
+ var context = e.context,
+ connection = context.connection,
+ businessObject = getBusinessObject(connection),
+ oldSource = getBusinessObject(context.oldSource),
+ oldTarget = getBusinessObject(context.oldTarget),
+ newSource = getBusinessObject(connection.source),
+ newTarget = getBusinessObject(connection.target);
+
+ if (oldSource === newSource || oldTarget === newTarget) {
+ return;
+ }
+
+ // on reconnectStart -> default flow
+ if (oldSource && oldSource.default) {
+ context.default = oldSource.default;
+ oldSource.default = undefined;
+ }
+
+ // on reconnectEnd -> default flow
+ if ((businessObject.sourceRef && businessObject.sourceRef.default) && !is(newTarget, 'bpmn:Activity')) {
+ context.default = businessObject.sourceRef.default;
+ businessObject.sourceRef.default = undefined;
+ }
+
+ // on reconnectStart -> condtional flow
+ if ((businessObject.conditionExpression) && is(oldSource, 'bpmn:Activity')) {
+ context.conditionExpression = businessObject.conditionExpression;
+ businessObject.conditionExpression = undefined;
+ }
+
+ // on reconnectEnd -> condtional flow
+ if ((businessObject.conditionExpression) && !is(newTarget, 'bpmn:Activity')) {
+ context.conditionExpression = businessObject.conditionExpression;
+ businessObject.conditionExpression = undefined;
+ }
+ }));
+
+ this.reverted([
+ 'connection.reconnectEnd',
+ 'connection.reconnectStart'
+ ], ifBpmn(function(e) {
+ var context = e.context,
+ connection = context.connection,
+ businessObject = getBusinessObject(connection),
+ newSource = getBusinessObject(connection.source);
+
+ // default flow
+ if (context.default) {
+ if (is(newSource, 'bpmn:ExclusiveGateway') || is(newSource, 'bpmn:InclusiveGateway') ||
+ is(newSource, 'bpmn:Activity')) {
+ newSource.default = context.default;
+ }
+ }
+
+ // conditional flow
+ if (context.conditionExpression && is(newSource, 'bpmn:Activity')) {
+ businessObject.conditionExpression = context.conditionExpression;
+ }
+ }));
+
+ // update attachments
+ function updateAttachment(e) {
+ self.updateAttachment(e.context);
+ }
+
+ this.executed([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
+ this.reverted([ 'element.updateAttachment' ], ifBpmn(updateAttachment));
+}
+
+inherits(BpmnUpdater, CommandInterceptor);
+
+module.exports = BpmnUpdater;
+
+BpmnUpdater.$inject = [ 'eventBus', 'bpmnFactory', 'connectionDocking', 'translate' ];
+
+
+/////// implementation //////////////////////////////////
+
+BpmnUpdater.prototype.updateAttachment = function(context) {
+
+ var shape = context.shape,
+ businessObject = shape.businessObject,
+ host = shape.host;
+
+ businessObject.attachedToRef = host && host.businessObject;
+};
+
+BpmnUpdater.prototype.updateParent = function(element, oldParent) {
+ // do not update BPMN 2.0 label parent
+ if (element instanceof Model.Label) {
+ return;
+ }
+
+ var parentShape = element.parent;
+
+ var businessObject = element.businessObject,
+ parentBusinessObject = parentShape && parentShape.businessObject,
+ parentDi = parentBusinessObject && parentBusinessObject.di;
+
+ if (is(element, 'bpmn:FlowNode')) {
+ this.updateFlowNodeRefs(businessObject, parentBusinessObject, oldParent && oldParent.businessObject);
+ }
+
+ if (is(element, 'bpmn:DataOutputAssociation')) {
+ if (element.source) {
+ parentBusinessObject = element.source.businessObject;
+ } else {
+ parentBusinessObject = null;
+ }
+ }
+
+ if (is(element, 'bpmn:DataInputAssociation')) {
+ if (element.target) {
+ parentBusinessObject = element.target.businessObject;
+ } else {
+ parentBusinessObject = null;
+ }
+ }
+
+ this.updateSemanticParent(businessObject, parentBusinessObject);
+
+ if (is(element, 'bpmn:DataObjectReference') && businessObject.dataObjectRef) {
+ this.updateSemanticParent(businessObject.dataObjectRef, parentBusinessObject);
+ }
+
+ this.updateDiParent(businessObject.di, parentDi);
+};
+
+
+BpmnUpdater.prototype.updateBounds = function(shape) {
+
+ var di = shape.businessObject.di;
+
+ var bounds = (shape instanceof Model.Label) ? this._getLabel(di).bounds : di.bounds;
+
+ assign(bounds, {
+ x: shape.x,
+ y: shape.y,
+ width: shape.width,
+ height: shape.height
+ });
+};
+
+BpmnUpdater.prototype.updateFlowNodeRefs = function(businessObject, newContainment, oldContainment) {
+
+ if (oldContainment === newContainment) {
+ return;
+ }
+
+ var oldRefs, newRefs;
+
+ if (is (oldContainment, 'bpmn:Lane')) {
+ oldRefs = oldContainment.get('flowNodeRef');
+ Collections.remove(oldRefs, businessObject);
+ }
+
+ if (is(newContainment, 'bpmn:Lane')) {
+ newRefs = newContainment.get('flowNodeRef');
+ Collections.add(newRefs, businessObject);
+ }
+};
+
+BpmnUpdater.prototype.updateDiParent = function(di, parentDi) {
+
+ if (parentDi && !is(parentDi, 'bpmndi:BPMNPlane')) {
+ parentDi = parentDi.$parent;
+ }
+
+ if (di.$parent === parentDi) {
+ return;
+ }
+
+ var planeElements = (parentDi || di.$parent).get('planeElement');
+
+ if (parentDi) {
+ planeElements.push(di);
+ di.$parent = parentDi;
+ } else {
+ Collections.remove(planeElements, di);
+ di.$parent = null;
+ }
+};
+
+function getDefinitions(element) {
+ while (element && !is(element, 'bpmn:Definitions')) {
+ element = element.$parent;
+ }
+
+ return element;
+}
+
+BpmnUpdater.prototype.getLaneSet = function(container) {
+
+ var laneSet, laneSets;
+
+ // bpmn:Lane
+ if (is(container, 'bpmn:Lane')) {
+ laneSet = container.childLaneSet;
+
+ if (!laneSet) {
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
+ container.childLaneSet = laneSet;
+ laneSet.$parent = container;
+ }
+
+ return laneSet;
+ }
+
+ // bpmn:Participant
+ if (is(container, 'bpmn:Participant')) {
+ container = container.processRef;
+ }
+
+ // bpmn:FlowElementsContainer
+ laneSets = container.get('laneSets');
+ laneSet = laneSets[0];
+
+ if (!laneSet) {
+ laneSet = this._bpmnFactory.create('bpmn:LaneSet');
+ laneSet.$parent = container;
+ laneSets.push(laneSet);
+ }
+
+ return laneSet;
+};
+
+BpmnUpdater.prototype.updateSemanticParent = function(businessObject, newParent) {
+
+ var containment,
+ translate = this._translate;
+
+ if (businessObject.$parent === newParent) {
+ return;
+ }
+
+ if (is(businessObject, 'bpmn:Lane')) {
+
+ if (newParent) {
+ newParent = this.getLaneSet(newParent);
+ }
+
+ containment = 'lanes';
+ } else
+
+ if (is(businessObject, 'bpmn:FlowElement')) {
+
+ if (newParent) {
+
+ if (is(newParent, 'bpmn:Participant')) {
+ newParent = newParent.processRef;
+ } else
+
+ if (is(newParent, 'bpmn:Lane')) {
+ do {
+ // unwrap Lane -> LaneSet -> (Lane | FlowElementsContainer)
+ newParent = newParent.$parent.$parent;
+ } while(is(newParent, 'bpmn:Lane'));
+
+ }
+ }
+
+ containment = 'flowElements';
+
+ } else
+
+ if (is(businessObject, 'bpmn:Artifact')) {
+
+ while (newParent &&
+ !is(newParent, 'bpmn:Process') &&
+ !is(newParent, 'bpmn:SubProcess') &&
+ !is(newParent, 'bpmn:Collaboration')) {
+
+ if (is(newParent, 'bpmn:Participant')) {
+ newParent = newParent.processRef;
+ break;
+ } else {
+ newParent = newParent.$parent;
+ }
+ }
+
+ containment = 'artifacts';
+ } else
+
+ if (is(businessObject, 'bpmn:MessageFlow')) {
+ containment = 'messageFlows';
+
+ } else
+
+ if (is(businessObject, 'bpmn:Participant')) {
+ containment = 'participants';
+
+ // make sure the participants process is properly attached / detached
+ // from the XML document
+
+ var process = businessObject.processRef,
+ definitions;
+
+ if (process) {
+ definitions = getDefinitions(businessObject.$parent || newParent);
+
+ if (businessObject.$parent) {
+ Collections.remove(definitions.get('rootElements'), process);
+ process.$parent = null;
+ }
+
+ if (newParent) {
+ Collections.add(definitions.get('rootElements'), process);
+ process.$parent = definitions;
+ }
+ }
+ } else
+
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
+ containment = 'dataOutputAssociations';
+ } else
+
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
+ containment = 'dataInputAssociations';
+ }
+
+ if (!containment) {
+ throw new Error(translate(
+ 'no parent for {element} in {parent}',
+ {
+ element: businessObject.id,
+ parent: newParent.id
+ }
+ ));
+ }
+
+ var children;
+
+ if (businessObject.$parent) {
+ // remove from old parent
+ children = businessObject.$parent.get(containment);
+ Collections.remove(children, businessObject);
+ }
+
+ if (!newParent) {
+ businessObject.$parent = null;
+ } else {
+ // add to new parent
+ children = newParent.get(containment);
+ children.push(businessObject);
+ businessObject.$parent = newParent;
+ }
+};
+
+
+BpmnUpdater.prototype.updateConnectionWaypoints = function(connection) {
+ connection.businessObject.di.set('waypoint', this._bpmnFactory.createDiWaypoints(connection.waypoints));
+};
+
+
+BpmnUpdater.prototype.updateConnection = function(context) {
+
+ var connection = context.connection,
+ businessObject = getBusinessObject(connection),
+ newSource = getBusinessObject(connection.source),
+ newTarget = getBusinessObject(connection.target);
+
+ if (!is(businessObject, 'bpmn:DataAssociation')) {
+
+ var inverseSet = is(businessObject, 'bpmn:SequenceFlow');
+
+ if (businessObject.sourceRef !== newSource) {
+ if (inverseSet) {
+ Collections.remove(businessObject.sourceRef && businessObject.sourceRef.get('outgoing'), businessObject);
+
+ if (newSource && newSource.get('outgoing')) {
+ newSource.get('outgoing').push(businessObject);
+ }
+ }
+
+ businessObject.sourceRef = newSource;
+ }
+
+ if (businessObject.targetRef !== newTarget) {
+ if (inverseSet) {
+ Collections.remove(businessObject.targetRef && businessObject.targetRef.get('incoming'), businessObject);
+
+ if (newTarget && newTarget.get('incoming')) {
+ newTarget.get('incoming').push(businessObject);
+ }
+ }
+
+ businessObject.targetRef = newTarget;
+ }
+ } else
+
+ if (is(businessObject, 'bpmn:DataInputAssociation')) {
+ // handle obnoxious isMany sourceRef
+ businessObject.get('sourceRef')[0] = newSource;
+
+ // targetRef = new parent
+ this.updateSemanticParent(businessObject, newTarget);
+ } else
+
+ if (is(businessObject, 'bpmn:DataOutputAssociation')) {
+ // sourceRef = new parent
+ this.updateSemanticParent(businessObject, newSource);
+
+ // targetRef = new target
+ businessObject.targetRef = newTarget;
+ }
+
+ this.updateConnectionWaypoints(connection);
+};
+
+
+/////// helpers /////////////////////////////////////////
+
+BpmnUpdater.prototype._getLabel = function(di) {
+ if (!di.label) {
+ di.label = this._bpmnFactory.createDiLabel();
+ }
+
+ return di.label;
+};
+
+
+/**
+ * Make sure the event listener is only called
+ * if the touched element is a BPMN element.
+ *
+ * @param {Function} fn
+ * @return {Function} guarded function
+ */
+function ifBpmn(fn) {
+
+ return function(event) {
+
+ var context = event.context,
+ element = context.shape || context.connection;
+
+ if (is(element, 'bpmn:BaseElement')) {
+ fn(event);
+ }
+ };
+}
+
+},{"210":210,"219":219,"243":243,"255":255,"377":377,"70":70,"98":98}],20:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377),
+ inherits = _dereq_(243);
+
+var is = _dereq_(70).is;
+
+var isExpanded = _dereq_(68).isExpanded;
+
+var BaseElementFactory = _dereq_(102),
+ LabelUtil = _dereq_(69);
+
+/**
+ * A bpmn-aware factory for diagram-js shapes
+ */
+function ElementFactory(bpmnFactory, moddle, translate) {
+ BaseElementFactory.call(this);
+
+ this._bpmnFactory = bpmnFactory;
+ this._moddle = moddle;
+ this._translate = translate;
+}
+
+inherits(ElementFactory, BaseElementFactory);
+
+
+ElementFactory.$inject = [ 'bpmnFactory', 'moddle', 'translate' ];
+
+module.exports = ElementFactory;
+
+ElementFactory.prototype.baseCreate = BaseElementFactory.prototype.create;
+
+ElementFactory.prototype.create = function(elementType, attrs) {
+ // no special magic for labels,
+ // we assume their businessObjects have already been created
+ // and wired via attrs
+ if (elementType === 'label') {
+ return this.baseCreate(elementType, assign({ type: 'label' }, LabelUtil.DEFAULT_LABEL_SIZE, attrs));
+ }
+
+ return this.createBpmnElement(elementType, attrs);
+};
+
+ElementFactory.prototype.createBpmnElement = function(elementType, attrs) {
+ var size,
+ translate = this._translate;
+
+ attrs = attrs || {};
+
+ var businessObject = attrs.businessObject;
+
+ if (!businessObject) {
+ if (!attrs.type) {
+ throw new Error(translate('no shape type specified'));
+ }
+
+ businessObject = this._bpmnFactory.create(attrs.type);
+ }
+
+ if (!businessObject.di) {
+ if (elementType === 'root') {
+ businessObject.di = this._bpmnFactory.createDiPlane(businessObject, [], {
+ id: businessObject.id + '_di'
+ });
+ } else
+ if (elementType === 'connection') {
+ businessObject.di = this._bpmnFactory.createDiEdge(businessObject, [], {
+ id: businessObject.id + '_di'
+ });
+ } else {
+ businessObject.di = this._bpmnFactory.createDiShape(businessObject, {}, {
+ id: businessObject.id + '_di'
+ });
+ }
+ }
+
+ if (attrs.processRef) {
+ businessObject.processRef = attrs.processRef;
+ }
+
+ if (attrs.isExpanded) {
+ businessObject.di.isExpanded = attrs.isExpanded;
+ }
+
+ if (is(businessObject, 'bpmn:ExclusiveGateway')) {
+ businessObject.di.isMarkerVisible = true;
+ }
+
+ if (attrs.isInterrupting === false) {
+ businessObject.isInterrupting = false;
+ }
+
+ if (attrs.associationDirection) {
+ businessObject.associationDirection = attrs.associationDirection;
+ }
+
+ var eventDefinitions,
+ newEventDefinition;
+
+ if (attrs.eventDefinitionType) {
+ eventDefinitions = businessObject.get('eventDefinitions') || [];
+ newEventDefinition = this._moddle.create(attrs.eventDefinitionType);
+
+ eventDefinitions.push(newEventDefinition);
+
+ newEventDefinition.$parent = businessObject;
+ businessObject.eventDefinitions = eventDefinitions;
+ }
+
+ if (attrs.isForCompensation) {
+ businessObject.isForCompensation = true;
+ }
+
+ size = this._getDefaultSize(businessObject);
+
+ attrs = assign({
+ businessObject: businessObject,
+ id: businessObject.id
+ }, size, attrs);
+
+ return this.baseCreate(elementType, attrs);
+};
+
+
+ElementFactory.prototype._getDefaultSize = function(semantic) {
+
+ if (is(semantic, 'bpmn:SubProcess')) {
+
+ if (isExpanded(semantic)) {
+ return { width: 350, height: 200 };
+ } else {
+ return { width: 100, height: 80 };
+ }
+ }
+
+ if (is(semantic, 'bpmn:Task')) {
+ return { width: 100, height: 80 };
+ }
+
+ if (is(semantic, 'bpmn:Gateway')) {
+ return { width: 50, height: 50 };
+ }
+
+ if (is(semantic, 'bpmn:Event')) {
+ return { width: 36, height: 36 };
+ }
+
+ if (is(semantic, 'bpmn:Participant')) {
+ if (!isExpanded(semantic)) {
+ return { width: 400, height: 100 };
+ } else {
+ return { width: 600, height: 250 };
+ }
+ }
+
+ if (is(semantic, 'bpmn:Lane')) {
+ return { width: 400, height: 100 };
+ }
+
+ if (is(semantic, 'bpmn:DataObjectReference')) {
+ return { width: 36, height: 50 };
+ }
+
+ if (is(semantic, 'bpmn:DataStoreReference')) {
+ return { width: 50, height: 50 };
+ }
+
+ if (is(semantic, 'bpmn:TextAnnotation')) {
+ return { width: 100, height: 30 };
+ }
+
+ return { width: 100, height: 80 };
+};
+
+
+ElementFactory.prototype.createParticipantShape = function(collapsed) {
+
+ var attrs = { type: 'bpmn:Participant' };
+
+ if (!collapsed) {
+ attrs.processRef = this._bpmnFactory.create('bpmn:Process');
+ }
+
+ return this.createShape(attrs);
+};
+
+},{"102":102,"243":243,"377":377,"68":68,"69":69,"70":70}],21:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var BaseModeling = _dereq_(142);
+
+var UpdatePropertiesHandler = _dereq_(42),
+ UpdateCanvasRootHandler = _dereq_(40),
+ AddLaneHandler = _dereq_(37),
+ SplitLaneHandler = _dereq_(39),
+ ResizeLaneHandler = _dereq_(38),
+ UpdateFlowNodeRefsHandler = _dereq_(41);
+
+
+/**
+ * BPMN 2.0 modeling features activator
+ *
+ * @param {EventBus} eventBus
+ * @param {ElementFactory} elementFactory
+ * @param {CommandStack} commandStack
+ * @param {BpmnRules} bpmnRules
+ */
+function Modeling(eventBus, elementFactory, commandStack, bpmnRules) {
+ BaseModeling.call(this, eventBus, elementFactory, commandStack);
+
+ this._bpmnRules = bpmnRules;
+}
+
+inherits(Modeling, BaseModeling);
+
+Modeling.$inject = [ 'eventBus', 'elementFactory', 'commandStack', 'bpmnRules' ];
+
+module.exports = Modeling;
+
+
+Modeling.prototype.getHandlers = function() {
+ var handlers = BaseModeling.prototype.getHandlers.call(this);
+
+ handlers['element.updateProperties'] = UpdatePropertiesHandler;
+ handlers['canvas.updateRoot'] = UpdateCanvasRootHandler;
+ handlers['lane.add'] = AddLaneHandler;
+ handlers['lane.resize'] = ResizeLaneHandler;
+ handlers['lane.split'] = SplitLaneHandler;
+ handlers['lane.updateRefs'] = UpdateFlowNodeRefsHandler;
+
+ return handlers;
+};
+
+
+Modeling.prototype.updateLabel = function(element, newLabel) {
+ this._commandStack.execute('element.updateLabel', {
+ element: element,
+ newLabel: newLabel
+ });
+};
+
+
+Modeling.prototype.connect = function(source, target, attrs) {
+
+ var bpmnRules = this._bpmnRules;
+
+ if (!attrs) {
+ attrs = bpmnRules.canConnect(source, target) || { type: 'bpmn:Association' };
+ }
+
+ return this.createConnection(source, target, attrs, source.parent);
+};
+
+
+Modeling.prototype.updateProperties = function(element, properties) {
+ this._commandStack.execute('element.updateProperties', {
+ element: element,
+ properties: properties
+ });
+};
+
+Modeling.prototype.resizeLane = function(laneShape, newBounds, balanced) {
+ this._commandStack.execute('lane.resize', {
+ shape: laneShape,
+ newBounds: newBounds,
+ balanced: balanced
+ });
+};
+
+Modeling.prototype.addLane = function(targetLaneShape, location) {
+ var context = {
+ shape: targetLaneShape,
+ location: location
+ };
+
+ this._commandStack.execute('lane.add', context);
+
+ return context.newLane;
+};
+
+Modeling.prototype.splitLane = function(targetLane, count) {
+ this._commandStack.execute('lane.split', {
+ shape: targetLane,
+ count: count
+ });
+};
+
+/**
+ * Transform the current diagram into a collaboration.
+ *
+ * @return {djs.model.Root} the new root element
+ */
+Modeling.prototype.makeCollaboration = function() {
+
+ var collaborationElement = this._create('root', {
+ type: 'bpmn:Collaboration'
+ });
+
+ var context = {
+ newRoot: collaborationElement
+ };
+
+ this._commandStack.execute('canvas.updateRoot', context);
+
+ return collaborationElement;
+};
+
+Modeling.prototype.updateLaneRefs = function(flowNodeShapes, laneShapes) {
+
+ this._commandStack.execute('lane.updateRefs', {
+ flowNodeShapes: flowNodeShapes,
+ laneShapes: laneShapes
+ });
+};
+
+/**
+ * Transform the current diagram into a process.
+ *
+ * @return {djs.model.Root} the new root element
+ */
+Modeling.prototype.makeProcess = function() {
+
+ var processElement = this._create('root', {
+ type: 'bpmn:Process'
+ });
+
+ var context = {
+ newRoot: processElement
+ };
+
+ this._commandStack.execute('canvas.updateRoot', context);
+};
+
+},{"142":142,"243":243,"37":37,"38":38,"39":39,"40":40,"41":41,"42":42}],22:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var is = _dereq_(70).is;
+
+var CommandInterceptor = _dereq_(98);
+
+
+function AppendBehavior(eventBus, elementFactory, bpmnRules) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ // assign correct shape position unless already set
+
+ this.preExecute('shape.append', function(context) {
+
+ var source = context.source,
+ shape = context.shape;
+
+ if (!context.position) {
+
+ if (is(shape, 'bpmn:TextAnnotation')) {
+ context.position = {
+ x: source.x + source.width / 2 + 75,
+ y: source.y - (50) - shape.height / 2
+ };
+ } else {
+ context.position = {
+ x: source.x + source.width + 80 + shape.width / 2,
+ y: source.y + source.height / 2
+ };
+ }
+ }
+ }, true);
+}
+
+
+AppendBehavior.$inject = [ 'eventBus', 'elementFactory', 'bpmnRules' ];
+
+inherits(AppendBehavior, CommandInterceptor);
+
+module.exports = AppendBehavior;
+},{"243":243,"70":70,"98":98}],23:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+
+/**
+ * BPMN specific create boundary event behavior
+ */
+function CreateBoundaryEventBehavior(eventBus, modeling, elementFactory, bpmnFactory) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ /**
+ * replace intermediate event with boundary event when
+ * attaching it to a shape
+ */
+
+ this.preExecute('shape.create', function(context) {
+ var shape = context.shape,
+ host = context.host,
+ businessObject,
+ boundaryEvent;
+
+ var attrs = {
+ cancelActivity: true
+ };
+
+ if (host && is(shape, 'bpmn:IntermediateThrowEvent')) {
+ attrs.attachedToRef = host.businessObject;
+
+ businessObject = bpmnFactory.create('bpmn:BoundaryEvent', attrs);
+
+ boundaryEvent = {
+ type: 'bpmn:BoundaryEvent',
+ businessObject: businessObject
+ };
+
+ context.shape = elementFactory.createShape(boundaryEvent);
+ }
+ }, true);
+}
+
+CreateBoundaryEventBehavior.$inject = [ 'eventBus', 'modeling', 'elementFactory', 'bpmnFactory' ];
+
+inherits(CreateBoundaryEventBehavior, CommandInterceptor);
+
+module.exports = CreateBoundaryEventBehavior;
+
+},{"243":243,"70":70,"98":98}],24:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+/**
+ * BPMN specific create data object behavior
+ */
+function CreateDataObjectBehavior(eventBus, bpmnFactory, moddle) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ this.preExecute('shape.create', function(event) {
+
+ var context = event.context,
+ shape = context.shape;
+
+ if (is(shape, 'bpmn:DataObjectReference') && shape.type !== 'label') {
+
+ // create a DataObject every time a DataObjectReference is created
+ var dataObject = bpmnFactory.create('bpmn:DataObject');
+
+ // set the reference to the DataObject
+ shape.businessObject.dataObjectRef = dataObject;
+ }
+ });
+
+}
+
+CreateDataObjectBehavior.$inject = [ 'eventBus', 'bpmnFactory', 'moddle' ];
+
+inherits(CreateDataObjectBehavior, CommandInterceptor);
+
+module.exports = CreateDataObjectBehavior;
+
+},{"243":243,"70":70,"98":98}],25:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var assign = _dereq_(377);
+
+var CommandInterceptor = _dereq_(98);
+
+var getApproxIntersection = _dereq_(226).getApproxIntersection;
+
+
+function copy(obj) {
+ return assign({}, obj);
+}
+
+function CreateOnFlowBehavior(eventBus, bpmnRules, modeling) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ /**
+ * Reconnect start / end of a connection after
+ * dropping an element on a flow.
+ */
+
+ this.preExecute('shape.create', function(context) {
+
+ var parent = context.parent,
+ shape = context.shape;
+
+ if (bpmnRules.canInsert(shape, parent)) {
+ context.targetFlow = parent;
+ context.parent = parent.parent;
+ }
+ }, true);
+
+
+ this.postExecute('shape.create', function(context) {
+
+ var shape = context.shape,
+ targetFlow = context.targetFlow,
+ position = context.position,
+ source,
+ target,
+ reconnected,
+ intersection,
+ waypoints,
+ waypointsBefore,
+ waypointsAfter,
+ dockingPoint;
+
+ if (targetFlow) {
+
+ waypoints = targetFlow.waypoints;
+
+
+ intersection = getApproxIntersection(waypoints, position);
+
+ if (intersection) {
+ waypointsBefore = waypoints.slice(0, intersection.index);
+ waypointsAfter = waypoints.slice(intersection.index + (intersection.bendpoint ? 1 : 0));
+
+ dockingPoint = intersection.bendpoint ? waypoints[intersection.index] : position;
+
+ waypointsBefore.push(copy(dockingPoint));
+ waypointsAfter.unshift(copy(dockingPoint));
+ }
+
+ source = targetFlow.source;
+ target = targetFlow.target;
+
+ if (bpmnRules.canConnect(source, shape, targetFlow)) {
+ // reconnect source -> inserted shape
+ modeling.reconnectEnd(targetFlow, shape, waypointsBefore || copy(position));
+
+ reconnected = true;
+ }
+
+ if (bpmnRules.canConnect(shape, target, targetFlow)) {
+
+ if (!reconnected) {
+ // reconnect inserted shape -> end
+ modeling.reconnectStart(targetFlow, shape, waypointsAfter || copy(position));
+ } else {
+ modeling.connect(shape, target, { type: targetFlow.type, waypoints: waypointsAfter });
+ }
+ }
+ }
+ }, true);
+}
+
+inherits(CreateOnFlowBehavior, CommandInterceptor);
+
+CreateOnFlowBehavior.$inject = [ 'eventBus', 'bpmnRules', 'modeling' ];
+
+module.exports = CreateOnFlowBehavior;
+
+},{"226":226,"243":243,"377":377,"98":98}],26:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+/**
+ * BPMN specific create participant behavior
+ */
+function CreateParticipantBehavior(eventBus, modeling, elementFactory, bpmnFactory) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ /**
+ * morph process into collaboration before adding
+ * participant onto collaboration
+ */
+
+ this.preExecute('shape.create', function(context) {
+
+ var parent = context.parent,
+ shape = context.shape,
+ position = context.position;
+
+ if (is(parent, 'bpmn:Process') && is(shape, 'bpmn:Participant')) {
+
+ // this is going to detach the process root
+ // and set the returned collaboration element
+ // as the new root element
+ var collaborationElement = modeling.makeCollaboration();
+
+ // monkey patch the create context
+ // so that the participant is being dropped
+ // onto the new collaboration root instead
+ context.position = position;
+ context.parent = collaborationElement;
+
+ context.processRoot = parent;
+ }
+ }, true);
+
+
+ this.execute('shape.create', function(context) {
+
+ var processRoot = context.processRoot,
+ shape = context.shape;
+
+ if (processRoot) {
+ context.oldProcessRef = shape.businessObject.processRef;
+
+ // assign the participant processRef
+ shape.businessObject.processRef = processRoot.businessObject;
+ }
+ }, true);
+
+
+ this.revert('shape.create', function(context) {
+ var processRoot = context.processRoot,
+ shape = context.shape;
+
+ if (processRoot) {
+ // assign the participant processRef
+ shape.businessObject.processRef = context.oldProcessRef;
+ }
+ }, true);
+
+
+ this.postExecute('shape.create', function(context) {
+
+ var processRoot = context.processRoot,
+ shape = context.shape;
+
+ if (processRoot) {
+ // process root is already detached at this point
+ var processChildren = processRoot.children.slice();
+ modeling.moveElements(processChildren, { x: 0, y: 0 }, shape);
+ }
+
+ }, true);
+
+}
+
+CreateParticipantBehavior.$inject = [ 'eventBus', 'modeling', 'elementFactory', 'bpmnFactory' ];
+
+inherits(CreateParticipantBehavior, CommandInterceptor);
+
+module.exports = CreateParticipantBehavior;
+
+},{"243":243,"70":70,"98":98}],27:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var Collections = _dereq_(219);
+
+var find = _dereq_(254);
+
+var is = _dereq_(70).is;
+
+var TARGET_REF_PLACEHOLDER_NAME = '__targetRef_placeholder';
+
+
+/**
+ * This behavior makes sure we always set a fake
+ * DataInputAssociation#targetRef as demanded by the BPMN 2.0
+ * XSD schema.
+ *
+ * The reference is set to a bpmn:Property{ name: '__targetRef_placeholder' }
+ * which is created on the fly and cleaned up afterwards if not needed
+ * anymore.
+ *
+ * @param {EventBus} eventBus
+ * @param {BpmnFactory} bpmnFactory
+ */
+function DataInputAssociationBehavior(eventBus, bpmnFactory) {
+
+ CommandInterceptor.call(this, eventBus);
+
+
+ this.executed([
+ 'connection.create',
+ 'connection.delete',
+ 'connection.move',
+ 'connection.reconnectEnd'
+ ], ifDataInputAssociation(fixTargetRef));
+
+ this.reverted([
+ 'connection.create',
+ 'connection.delete',
+ 'connection.move',
+ 'connection.reconnectEnd'
+ ], ifDataInputAssociation(fixTargetRef));
+
+
+ function usesTargetRef(element, targetRef, removedConnection) {
+
+ var inputAssociations = element.get('dataInputAssociations');
+
+ return find(inputAssociations, function(association) {
+ return association !== removedConnection &&
+ association.targetRef === targetRef;
+ });
+ }
+
+ function getTargetRef(element, create) {
+
+ var properties = element.get('properties');
+
+ var targetRefProp = find(properties, function(p) {
+ return p.name === TARGET_REF_PLACEHOLDER_NAME;
+ });
+
+ if (!targetRefProp && create) {
+ targetRefProp = bpmnFactory.create('bpmn:Property', {
+ name: TARGET_REF_PLACEHOLDER_NAME
+ });
+
+ Collections.add(properties, targetRefProp);
+ }
+
+ return targetRefProp;
+ }
+
+ function cleanupTargetRef(element, connection) {
+
+ var targetRefProp = getTargetRef(element);
+
+ if (!targetRefProp) {
+ return;
+ }
+
+ if (!usesTargetRef(element, targetRefProp, connection)) {
+ Collections.remove(element.get('properties'), targetRefProp);
+ }
+ }
+
+ /**
+ * Make sure targetRef is set to a valid property or
+ * `null` if the connection is detached.
+ *
+ * @param {Event} event
+ */
+ function fixTargetRef(event) {
+
+ var context = event.context,
+ connection = context.connection,
+ connectionBo = connection.businessObject,
+ target = connection.target,
+ targetBo = target && target.businessObject,
+ newTarget = context.newTarget,
+ newTargetBo = newTarget && newTarget.businessObject,
+ oldTarget = context.oldTarget || context.target,
+ oldTargetBo = oldTarget && oldTarget.businessObject;
+
+ var dataAssociation = connection.businessObject,
+ targetRefProp;
+
+ if (oldTargetBo && oldTargetBo !== targetBo) {
+ cleanupTargetRef(oldTargetBo, connectionBo);
+ }
+
+ if (newTargetBo && newTargetBo !== targetBo) {
+ cleanupTargetRef(newTargetBo, connectionBo);
+ }
+
+ if (targetBo) {
+ targetRefProp = getTargetRef(targetBo, true);
+ dataAssociation.targetRef = targetRefProp;
+ } else {
+ dataAssociation.targetRef = null;
+ }
+ }
+}
+
+DataInputAssociationBehavior.$inject = [ 'eventBus', 'bpmnFactory' ];
+
+inherits(DataInputAssociationBehavior, CommandInterceptor);
+
+module.exports = DataInputAssociationBehavior;
+
+
+/**
+ * Only call the given function when the event
+ * touches a bpmn:DataInputAssociation.
+ *
+ * @param {Function} fn
+ * @return {Function}
+ */
+function ifDataInputAssociation(fn) {
+
+ return function(event) {
+ var context = event.context,
+ connection = context.connection;
+
+ if (is(connection, 'bpmn:DataInputAssociation')) {
+ return fn(event);
+ }
+ };
+}
+},{"219":219,"243":243,"254":254,"70":70,"98":98}],28:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+var getChildLanes = _dereq_(44).getChildLanes;
+
+var eachElement = _dereq_(221).eachElement;
+
+
+var LOW_PRIORITY = 500;
+
+
+/**
+ * BPMN specific delete lane behavior
+ */
+function DeleteLaneBehavior(eventBus, modeling, spaceTool) {
+
+ CommandInterceptor.call(this, eventBus);
+
+
+ function compensateLaneDelete(shape, oldParent) {
+
+ var siblings = getChildLanes(oldParent);
+
+ var topAffected = [];
+ var bottomAffected = [];
+
+ eachElement(siblings, function(element) {
+
+ if (element.y > shape.y) {
+ bottomAffected.push(element);
+ } else {
+ topAffected.push(element);
+ }
+
+ return element.children;
+ });
+
+ if (!siblings.length) {
+ return;
+ }
+
+ var offset;
+
+ if (bottomAffected.length && topAffected.length) {
+ offset = shape.height / 2;
+ } else {
+ offset = shape.height;
+ }
+
+ var topAdjustments,
+ bottomAdjustments;
+
+ if (topAffected.length) {
+ topAdjustments = spaceTool.calculateAdjustments(
+ topAffected, 'y', offset, shape.y - 10);
+
+ spaceTool.makeSpace(
+ topAdjustments.movingShapes,
+ topAdjustments.resizingShapes,
+ { x: 0, y: offset }, 's');
+ }
+
+ if (bottomAffected.length) {
+ bottomAdjustments = spaceTool.calculateAdjustments(
+ bottomAffected, 'y', -offset, shape.y + shape.height + 10);
+
+ spaceTool.makeSpace(
+ bottomAdjustments.movingShapes,
+ bottomAdjustments.resizingShapes,
+ { x: 0, y: -offset }, 'n');
+ }
+ }
+
+
+ /**
+ * Adjust sizes of other lanes after lane deletion
+ */
+ this.postExecuted('shape.delete', LOW_PRIORITY, function(event) {
+
+ var context = event.context,
+ hints = context.hints,
+ shape = context.shape,
+ oldParent = context.oldParent;
+
+ // only compensate lane deletes
+ if (!is(shape, 'bpmn:Lane')) {
+ return;
+ }
+
+ // compensate root deletes only
+ if (hints && hints.nested) {
+ return;
+ }
+
+ compensateLaneDelete(shape, oldParent);
+ });
+}
+
+DeleteLaneBehavior.$inject = [ 'eventBus', 'modeling', 'spaceTool' ];
+
+inherits(DeleteLaneBehavior, CommandInterceptor);
+
+module.exports = DeleteLaneBehavior;
+},{"221":221,"243":243,"44":44,"70":70,"98":98}],29:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377),
+ inherits = _dereq_(243);
+
+var LabelUtil = _dereq_(69),
+ is = _dereq_(70).is;
+
+var hasExternalLabel = LabelUtil.hasExternalLabel,
+ getExternalLabelMid = LabelUtil.getExternalLabelMid;
+
+var CommandInterceptor = _dereq_(98);
+
+
+/**
+ * A component that makes sure that external labels are added
+ * together with respective elements and properly updated (DI wise)
+ * during move.
+ *
+ * @param {EventBus} eventBus
+ * @param {Modeling} modeling
+ * @param {BpmnFactory} bpmnFactory
+ */
+function LabelSupport(eventBus, modeling, bpmnFactory) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ // create external labels on shape creation
+
+ this.postExecute([ 'shape.create', 'connection.create' ], function(e) {
+ var context = e.context;
+
+ var element = context.shape || context.connection,
+ businessObject = element.businessObject;
+
+ var position;
+
+ if (hasExternalLabel(businessObject)) {
+ position = getExternalLabelMid(element);
+
+ modeling.createLabel(element, position, {
+ id: businessObject.id + '_label',
+ hidden: !businessObject.name,
+ businessObject: businessObject
+ });
+ }
+ });
+
+ // update di information on label creation
+ this.executed([ 'label.create' ], function(e) {
+
+ var element = e.context.shape,
+ businessObject,
+ di;
+
+ // we want to trigger on real labels only
+ if (!element.labelTarget) {
+ return;
+ }
+
+ // we want to trigger on BPMN elements only
+ if (!is(element.labelTarget || element, 'bpmn:BaseElement')) {
+ return;
+ }
+
+ businessObject = element.businessObject,
+ di = businessObject.di;
+
+
+ if (!di.label) {
+ di.label = bpmnFactory.create('bpmndi:BPMNLabel', {
+ bounds: bpmnFactory.create('dc:Bounds')
+ });
+ }
+
+ assign(di.label.bounds, {
+ x: element.x,
+ y: element.y,
+ width: element.width,
+ height: element.height
+ });
+ });
+}
+
+inherits(LabelSupport, CommandInterceptor);
+
+LabelSupport.$inject = [ 'eventBus', 'modeling', 'bpmnFactory' ];
+
+module.exports = LabelSupport;
+
+},{"243":243,"377":377,"69":69,"70":70,"98":98}],30:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is;
+
+
+function ModelingFeedback(eventBus, tooltips, translate) {
+
+ function showError(position, message) {
+ tooltips.add({
+ position: {
+ x: position.x + 5,
+ y: position.y + 5
+ },
+ type: 'error',
+ timeout: 2000,
+ html: '' + message + '
'
+ });
+ }
+
+ eventBus.on([ 'shape.move.rejected', 'create.rejected' ], function(event) {
+
+ var context = event.context,
+ shape = context.shape,
+ target = context.target;
+
+ if (is(target, 'bpmn:Collaboration') && is(shape, 'bpmn:FlowNode')) {
+ showError(event, translate('flow elements must be children of pools/participants'));
+ }
+ });
+
+}
+
+
+ModelingFeedback.$inject = [ 'eventBus', 'tooltips', 'translate' ];
+
+module.exports = ModelingFeedback;
+},{"70":70}],31:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+
+/**
+ * BPMN specific remove behavior
+ */
+function RemoveParticipantBehavior(eventBus, modeling) {
+
+ CommandInterceptor.call(this, eventBus);
+
+
+ /**
+ * morph collaboration diagram into process diagram
+ * after the last participant has been removed
+ */
+
+ this.preExecute('shape.delete', function(context) {
+
+ var shape = context.shape,
+ parent = shape.parent;
+
+ // activate the behavior if the shape to be removed
+ // is a participant
+ if (is(shape, 'bpmn:Participant')) {
+ context.collaborationRoot = parent;
+ }
+ }, true);
+
+ this.postExecute('shape.delete', function(context) {
+
+ var collaborationRoot = context.collaborationRoot;
+
+ if (collaborationRoot && !collaborationRoot.businessObject.participants.length) {
+ // replace empty collaboration with process diagram
+ modeling.makeProcess();
+ }
+ }, true);
+
+}
+
+RemoveParticipantBehavior.$inject = [ 'eventBus', 'modeling' ];
+
+inherits(RemoveParticipantBehavior, CommandInterceptor);
+
+module.exports = RemoveParticipantBehavior;
+},{"243":243,"70":70,"98":98}],32:[function(_dereq_,module,exports){
+'use strict';
+
+var forEach = _dereq_(255),
+ find = _dereq_(254),
+ inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ function fixConnection(connection) {
+
+ var source = connection.source,
+ target = connection.target,
+ parent = connection.parent;
+
+ // do not do anything if connection
+ // is already deleted (may happen due to other
+ // behaviors plugged-in before)
+ if (!parent) {
+ return;
+ }
+
+ var replacementType,
+ remove;
+
+ /**
+ * Check if incoming or outgoing connections
+ * can stay or could be substituted with an
+ * appropriate replacement.
+ *
+ * This holds true for SequenceFlow <> MessageFlow.
+ */
+
+ if (is(connection, 'bpmn:SequenceFlow')) {
+ if (!bpmnRules.canConnectSequenceFlow(source, target)) {
+ remove = true;
+ }
+
+ if (bpmnRules.canConnectMessageFlow(source, target)) {
+ replacementType = 'bpmn:MessageFlow';
+ }
+ }
+
+ // transform message flows into sequence flows, if possible
+
+ if (is(connection, 'bpmn:MessageFlow')) {
+
+ if (!bpmnRules.canConnectMessageFlow(source, target)) {
+ remove = true;
+ }
+
+ if (bpmnRules.canConnectSequenceFlow(source, target)) {
+ replacementType = 'bpmn:SequenceFlow';
+ }
+ }
+
+ if (is(connection, 'bpmn:Association') && !bpmnRules.canConnectAssociation(source, target)) {
+ remove = true;
+ }
+
+
+ // remove invalid connection,
+ // unless it has been removed already
+ if (remove) {
+ modeling.removeConnection(connection);
+ }
+
+ // replace SequenceFlow <> MessageFlow
+
+ if (replacementType) {
+ modeling.connect(source, target, {
+ type: replacementType,
+ waypoints: connection.waypoints.slice()
+ });
+ }
+ }
+
+ this.postExecuted('elements.move', function(context) {
+
+ var closure = context.closure,
+ allConnections = closure.allConnections;
+
+ forEach(allConnections, fixConnection);
+ }, true);
+
+ this.postExecuted([
+ 'connection.reconnectStart',
+ 'connection.reconnectEnd'
+ ], function(event){
+
+ var connection = event.context.connection;
+
+ fixConnection(connection);
+ });
+
+ this.postExecuted('element.updateProperties', function(event) {
+ var context = event.context,
+ properties = context.properties,
+ element = context.element,
+ businessObject = element.businessObject,
+ connection;
+
+ // remove condition expression when morphing to default flow
+ if (properties.default) {
+ connection = find(element.outgoing, { id: element.businessObject.default.id });
+
+ if (connection) {
+ modeling.updateProperties(connection, { conditionExpression: undefined });
+ }
+ }
+
+ // remove default property from source when morphing to conditional flow
+ if (properties.conditionExpression && businessObject.sourceRef.default === businessObject) {
+ modeling.updateProperties(element.source, { default: undefined });
+ }
+ });
+}
+
+inherits(ReplaceConnectionBehavior, CommandInterceptor);
+
+ReplaceConnectionBehavior.$inject = [ 'eventBus', 'modeling', 'bpmnRules' ];
+
+module.exports = ReplaceConnectionBehavior;
+
+},{"243":243,"254":254,"255":255,"70":70,"98":98}],33:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var forEach = _dereq_(255);
+
+var isEventSubProcess = _dereq_(68).isEventSubProcess;
+var is = _dereq_(70).is;
+
+/**
+ * Defines the behaviour of what happens to the elements inside a container
+ * that morphs into another BPMN element
+ */
+function ReplaceElementBehaviour(eventBus, bpmnReplace, bpmnRules, elementRegistry, selection, modeling) {
+ CommandInterceptor.call(this, eventBus);
+
+ this._bpmnReplace = bpmnReplace;
+ this._elementRegistry = elementRegistry;
+ this._selection = selection;
+ this._modeling = modeling;
+
+ this.postExecuted([ 'elements.move' ], 500, function(event) {
+
+ var context = event.context,
+ target = context.newParent,
+ newHost = context.newHost,
+ elements = [];
+
+ forEach(context.closure.topLevel, function(topLevelElements) {
+ if (isEventSubProcess(topLevelElements)) {
+ elements = elements.concat(topLevelElements.children);
+ } else {
+ elements = elements.concat(topLevelElements);
+ }
+ });
+
+ // Change target to host when the moving element is a `bpmn:BoundaryEvent`
+ if (elements.length === 1 && newHost) {
+ target = newHost;
+ }
+
+ var canReplace = bpmnRules.canReplace(elements, target);
+
+ if (canReplace) {
+ this.replaceElements(elements, canReplace.replacements, newHost);
+ }
+ }, this);
+
+ // update attachments if the host is replaced
+ this.postExecute([ 'shape.replace' ], 1500, function(e) {
+
+ var context = e.context,
+ oldShape = context.oldShape,
+ newShape = context.newShape,
+ attachers = oldShape.attachers,
+ canReplace;
+
+ if (attachers && attachers.length) {
+ canReplace = bpmnRules.canReplace(attachers, newShape);
+
+ this.replaceElements(attachers, canReplace.replacements);
+ }
+
+ }, this);
+}
+
+inherits(ReplaceElementBehaviour, CommandInterceptor);
+
+
+ReplaceElementBehaviour.prototype.replaceElements = function(elements, newElements, newHost) {
+ var elementRegistry = this._elementRegistry,
+ bpmnReplace = this._bpmnReplace,
+ selection = this._selection,
+ modeling = this._modeling;
+
+ forEach(newElements, function(replacement) {
+
+ var newElement = {
+ type: replacement.newElementType
+ };
+
+ var oldElement = elementRegistry.get(replacement.oldElementId);
+
+ if (newHost && is(oldElement, 'bpmn:BoundaryEvent')) {
+ modeling.updateAttachment(oldElement, null);
+ }
+
+ var idx = elements.indexOf(oldElement);
+
+ elements[idx] = bpmnReplace.replaceElement(oldElement, newElement, { select: false });
+
+ if (newHost && is(elements[idx], 'bpmn:BoundaryEvent')) {
+ modeling.updateAttachment(elements[idx], newHost);
+ }
+ });
+
+ if (newElements) {
+ selection.select(elements);
+ }
+};
+
+ReplaceElementBehaviour.$inject = [ 'eventBus', 'bpmnReplace', 'bpmnRules', 'elementRegistry',
+ 'selection', 'modeling' ];
+
+module.exports = ReplaceElementBehaviour;
+
+},{"243":243,"255":255,"68":68,"70":70,"98":98}],34:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is;
+
+var roundBounds = _dereq_(208).roundBounds;
+
+var hasPrimaryModifier = _dereq_(228).hasPrimaryModifier;
+
+var SLIGHTLY_HIGHER_PRIORITY = 1001;
+
+
+/**
+ * Invoke {@link Modeling#resizeLane} instead of
+ * {@link Modeling#resizeShape} when resizing a Lane
+ * or Participant shape.
+ */
+function ResizeLaneBehavior(eventBus, modeling) {
+
+ eventBus.on('resize.start', SLIGHTLY_HIGHER_PRIORITY + 500, function(event) {
+ var context = event.context,
+ shape = context.shape;
+
+ if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
+
+ // should we resize the opposite lane(s) in
+ // order to compensate for the resize operation?
+ context.balanced = !hasPrimaryModifier(event);
+ }
+ });
+
+ /**
+ * Intercept resize end and call resize lane function instead.
+ */
+ eventBus.on('resize.end', SLIGHTLY_HIGHER_PRIORITY, function(event) {
+ var context = event.context,
+ shape = context.shape,
+ canExecute = context.canExecute,
+ newBounds = context.newBounds;
+
+ if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
+
+ if (canExecute) {
+ // ensure we have actual pixel values for new bounds
+ // (important when zoom level was > 1 during move)
+ newBounds = roundBounds(newBounds);
+
+ // perform the actual resize
+ modeling.resizeLane(shape, newBounds, context.balanced);
+ }
+
+ // stop propagation
+ return false;
+ }
+ });
+}
+
+ResizeLaneBehavior.$inject = [ 'eventBus', 'modeling' ];
+
+module.exports = ResizeLaneBehavior;
+
+},{"208":208,"228":228,"70":70}],35:[function(_dereq_,module,exports){
+'use strict';
+
+
+var inherits = _dereq_(243);
+
+var CommandInterceptor = _dereq_(98);
+
+var is = _dereq_(70).is;
+
+var LOW_PRIORITY = 500,
+ HIGH_PRIORITY = 5000;
+
+
+/**
+ * BPMN specific delete lane behavior
+ */
+function UpdateFlowNodeRefsBehavior(eventBus, modeling, translate) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ /**
+ * Ok, this is it:
+ *
+ * We have to update the Lane#flowNodeRefs _and_
+ * FlowNode#lanes with every FlowNode move/resize and
+ * Lane move/resize.
+ *
+ * We want to group that stuff to recompute containments
+ * as efficient as possible.
+ *
+ * Yea!
+ */
+
+ // the update context
+ var context;
+
+
+ function initContext() {
+ context = context || new UpdateContext();
+ context.enter();
+
+ return context;
+ }
+
+ function getContext() {
+ if (!context) {
+ throw new Error(translate('out of bounds release'));
+ }
+
+ return context;
+ }
+
+ function releaseContext() {
+
+ if (!context) {
+ throw new Error(translate('out of bounds release'));
+ }
+
+ var triggerUpdate = context.leave();
+
+ if (triggerUpdate) {
+ modeling.updateLaneRefs(context.flowNodes, context.lanes);
+
+ context = null;
+ }
+
+ return triggerUpdate;
+ }
+
+
+ var laneRefUpdateEvents = [
+ 'spaceTool',
+ 'lane.add',
+ 'lane.resize',
+ 'lane.split',
+ 'elements.move',
+ 'elements.delete',
+ 'shape.create',
+ 'shape.delete',
+ 'shape.move',
+ 'shape.resize'
+ ];
+
+
+ // listen to a lot of stuff to group lane updates
+
+ this.preExecute(laneRefUpdateEvents, HIGH_PRIORITY, function(event) {
+ initContext();
+ });
+
+ this.postExecuted(laneRefUpdateEvents, LOW_PRIORITY, function(event) {
+ releaseContext();
+ });
+
+
+ // Mark flow nodes + lanes that need an update
+
+ this.preExecute([
+ 'shape.create',
+ 'shape.move',
+ 'shape.delete',
+ 'shape.resize'
+ ], function(event) {
+
+ var context = event.context,
+ shape = context.shape;
+
+ var updateContext = getContext();
+
+ // no need to update labels
+ if (shape.labelTarget) {
+ return;
+ }
+
+ if (is(shape, 'bpmn:Lane')) {
+ updateContext.addLane(shape);
+ }
+
+ if (is(shape, 'bpmn:FlowNode')) {
+ updateContext.addFlowNode(shape);
+ }
+ });
+}
+
+UpdateFlowNodeRefsBehavior.$inject = [ 'eventBus', 'modeling' , 'translate'];
+
+inherits(UpdateFlowNodeRefsBehavior, CommandInterceptor);
+
+module.exports = UpdateFlowNodeRefsBehavior;
+
+
+
+function UpdateContext() {
+
+ this.flowNodes = [];
+ this.lanes = [];
+
+ this.counter = 0;
+
+ this.addLane = function(lane) {
+ this.lanes.push(lane);
+ };
+
+ this.addFlowNode = function(flowNode) {
+ this.flowNodes.push(flowNode);
+ };
+
+ this.enter = function() {
+ this.counter++;
+ };
+
+ this.leave = function() {
+ this.counter--;
+
+ return !this.counter;
+ };
+}
+},{"243":243,"70":70,"98":98}],36:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [
+ 'appendBehavior',
+ 'createBoundaryEventBehavior',
+ 'createDataObjectBehavior',
+ 'createOnFlowBehavior',
+ 'createParticipantBehavior',
+ 'dataInputAssociationBehavior',
+ 'deleteLaneBehavior',
+ 'labelBehavior',
+ 'modelingFeedback',
+ 'removeParticipantBehavior',
+ 'replaceConnectionBehavior',
+ 'replaceElementBehaviour',
+ 'resizeLaneBehavior',
+ 'updateFlowNodeRefsBehavior'
+ ],
+ appendBehavior: [ 'type', _dereq_(22) ],
+ createBoundaryEventBehavior: [ 'type', _dereq_(23) ],
+ createDataObjectBehavior: [ 'type', _dereq_(24) ],
+ createOnFlowBehavior: [ 'type', _dereq_(25) ],
+ createParticipantBehavior: [ 'type', _dereq_(26) ],
+ dataInputAssociationBehavior: [ 'type', _dereq_(27) ],
+ deleteLaneBehavior: [ 'type', _dereq_(28) ],
+ labelBehavior: [ 'type', _dereq_(29) ],
+ modelingFeedback: [ 'type', _dereq_(30) ],
+ removeParticipantBehavior: [ 'type', _dereq_(31) ],
+ replaceConnectionBehavior: [ 'type', _dereq_(32) ],
+ replaceElementBehaviour: [ 'type', _dereq_(33) ],
+ resizeLaneBehavior: [ 'type', _dereq_(34) ],
+ updateFlowNodeRefsBehavior: [ 'type', _dereq_(35) ]
+};
+
+},{"22":22,"23":23,"24":24,"25":25,"26":26,"27":27,"28":28,"29":29,"30":30,"31":31,"32":32,"33":33,"34":34,"35":35}],37:[function(_dereq_,module,exports){
+'use strict';
+
+var filter = _dereq_(253);
+
+var Elements = _dereq_(221);
+
+var getLanesRoot = _dereq_(44).getLanesRoot,
+ getChildLanes = _dereq_(44).getChildLanes,
+ LANE_INDENTATION = _dereq_(44).LANE_INDENTATION;
+
+/**
+ * A handler that allows us to add a new lane
+ * above or below an existing one.
+ *
+ * @param {Modeling} modeling
+ */
+function AddLaneHandler(modeling, spaceTool) {
+ this._modeling = modeling;
+ this._spaceTool = spaceTool;
+}
+
+AddLaneHandler.$inject = [ 'modeling', 'spaceTool' ];
+
+module.exports = AddLaneHandler;
+
+
+AddLaneHandler.prototype.preExecute = function(context) {
+
+ var spaceTool = this._spaceTool,
+ modeling = this._modeling;
+
+ var shape = context.shape,
+ location = context.location;
+
+ var lanesRoot = getLanesRoot(shape);
+
+ var isRoot = lanesRoot === shape,
+ laneParent = isRoot ? shape : shape.parent;
+
+ var existingChildLanes = getChildLanes(laneParent);
+
+ // (0) add a lane if we currently got none and are adding to root
+ if (!existingChildLanes.length) {
+ modeling.createShape({ type: 'bpmn:Lane' }, {
+ x: shape.x + LANE_INDENTATION,
+ y: shape.y,
+ width: shape.width - LANE_INDENTATION,
+ height: shape.height
+ }, laneParent);
+ }
+
+ // (1) collect affected elements to create necessary space
+ var allAffected = [];
+
+ Elements.eachElement(lanesRoot, function(element) {
+ allAffected.push(element);
+
+ if (element === shape) {
+ return [];
+ }
+
+ return filter(element.children, function(c) {
+ return c !== shape;
+ });
+ });
+
+ var offset = location === 'top' ? -120 : 120,
+ lanePosition = location === 'top' ? shape.y : shape.y + shape.height,
+ spacePos = lanePosition + (location === 'top' ? 10 : -10),
+ direction = location === 'top' ? 'n' : 's';
+
+ var adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);
+
+ spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: offset }, direction);
+
+ // (2) create new lane at open space
+ context.newLane = modeling.createShape({ type: 'bpmn:Lane' }, {
+ x: shape.x + (isRoot ? LANE_INDENTATION : 0),
+ y: lanePosition - (location === 'top' ? 120 : 0),
+ width: shape.width - (isRoot ? LANE_INDENTATION : 0),
+ height: 120
+ }, laneParent);
+};
+
+},{"221":221,"253":253,"44":44}],38:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is;
+
+var getLanesRoot = _dereq_(44).getLanesRoot,
+ computeLanesResize = _dereq_(44).computeLanesResize;
+
+var eachElement = _dereq_(221).eachElement;
+
+var asTRBL = _dereq_(208).asTRBL,
+ substractTRBL = _dereq_(180).substractTRBL;
+
+
+/**
+ * A handler that resizes a lane.
+ *
+ * @param {Modeling} modeling
+ */
+function ResizeLaneHandler(modeling, spaceTool) {
+ this._modeling = modeling;
+ this._spaceTool = spaceTool;
+}
+
+ResizeLaneHandler.$inject = [ 'modeling', 'spaceTool' ];
+
+module.exports = ResizeLaneHandler;
+
+
+ResizeLaneHandler.prototype.preExecute = function(context) {
+
+ var shape = context.shape,
+ newBounds = context.newBounds,
+ balanced = context.balanced;
+
+ if (balanced !== false) {
+ this.resizeBalanced(shape, newBounds);
+ } else {
+ this.resizeSpace(shape, newBounds);
+ }
+};
+
+
+/**
+ * Resize balanced, adjusting next / previous lane sizes.
+ *
+ * @param {djs.model.Shape} shape
+ * @param {Bounds} newBounds
+ */
+ResizeLaneHandler.prototype.resizeBalanced = function(shape, newBounds) {
+
+ var modeling = this._modeling;
+
+ var resizeNeeded = computeLanesResize(shape, newBounds);
+
+ // resize the lane
+ modeling.resizeShape(shape, newBounds);
+
+ // resize other lanes as needed
+ resizeNeeded.forEach(function(r) {
+ modeling.resizeShape(r.shape, r.newBounds);
+ });
+};
+
+
+/**
+ * Resize, making actual space and moving below / above elements.
+ *
+ * @param {djs.model.Shape} shape
+ * @param {Bounds} newBounds
+ */
+ResizeLaneHandler.prototype.resizeSpace = function(shape, newBounds) {
+ var spaceTool = this._spaceTool;
+
+ var shapeTrbl = asTRBL(shape),
+ newTrbl = asTRBL(newBounds);
+
+ var trblDiff = substractTRBL(newTrbl, shapeTrbl);
+
+ var lanesRoot = getLanesRoot(shape);
+
+ var allAffected = [],
+ allLanes = [];
+
+ eachElement(lanesRoot, function(element) {
+ allAffected.push(element);
+
+ if (is(element, 'bpmn:Lane') || is(element, 'bpmn:Participant')) {
+ allLanes.push(element);
+ }
+
+ return element.children;
+ });
+
+ var change,
+ spacePos,
+ direction,
+ offset,
+ adjustments;
+
+ if (trblDiff.bottom || trblDiff.top) {
+
+ change = trblDiff.bottom || trblDiff.top;
+ spacePos = shape.y + (trblDiff.bottom ? shape.height : 0) + (trblDiff.bottom ? -10 : 10);
+ direction = trblDiff.bottom ? 's' : 'n';
+
+ offset = trblDiff.top > 0 || trblDiff.bottom < 0 ? -change : change;
+
+ adjustments = spaceTool.calculateAdjustments(allAffected, 'y', offset, spacePos);
+
+ spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: 0, y: change }, direction);
+ }
+
+
+ if (trblDiff.left || trblDiff.right) {
+
+ change = trblDiff.right || trblDiff.left;
+ spacePos = shape.x + (trblDiff.right ? shape.width : 0) + (trblDiff.right ? -10 : 100);
+ direction = trblDiff.right ? 'e' : 'w';
+
+ offset = trblDiff.left > 0 || trblDiff.right < 0 ? -change : change;
+
+ adjustments = spaceTool.calculateAdjustments(allLanes, 'x', offset, spacePos);
+
+ spaceTool.makeSpace(adjustments.movingShapes, adjustments.resizingShapes, { x: change, y: 0 }, direction);
+ }
+};
+},{"180":180,"208":208,"221":221,"44":44,"70":70}],39:[function(_dereq_,module,exports){
+'use strict';
+
+var getChildLanes = _dereq_(44).getChildLanes;
+
+var LANE_INDENTATION = _dereq_(44).LANE_INDENTATION;
+
+/**
+ * A handler that splits a lane into a number of sub-lanes,
+ * creating new sub lanes, if neccessary.
+ *
+ * @param {Modeling} modeling
+ */
+function SplitLaneHandler(modeling, translate) {
+ this._modeling = modeling;
+ this._translate = translate;
+}
+
+SplitLaneHandler.$inject = [ 'modeling', 'translate'];
+
+module.exports = SplitLaneHandler;
+
+
+SplitLaneHandler.prototype.preExecute = function(context) {
+
+ var modeling = this._modeling,
+ translate = this._translate;
+
+ var shape = context.shape,
+ newLanesCount = context.count;
+
+ var childLanes = getChildLanes(shape),
+ existingLanesCount = childLanes.length;
+
+ if (existingLanesCount > newLanesCount) {
+ throw new Error(translate('more than {count} child lanes', { count: newLanesCount }));
+ }
+
+ var newLanesHeight = Math.round(shape.height / newLanesCount);
+
+ // Iterate from top to bottom in child lane order,
+ // resizing existing lanes and creating new ones
+ // so that they split the parent proportionally.
+ //
+ // Due to rounding related errors, the bottom lane
+ // needs to take up all the remaining space.
+ var laneY,
+ laneHeight,
+ laneBounds,
+ newLaneAttrs,
+ idx;
+
+ for (idx = 0; idx < newLanesCount; idx++) {
+
+ laneY = shape.y + idx * newLanesHeight;
+
+ // if bottom lane
+ if (idx === newLanesCount - 1) {
+ laneHeight = shape.height - (newLanesHeight * idx);
+ } else {
+ laneHeight = newLanesHeight;
+ }
+
+ laneBounds = {
+ x: shape.x + LANE_INDENTATION,
+ y: laneY,
+ width: shape.width - LANE_INDENTATION,
+ height: laneHeight
+ };
+
+ if (idx < existingLanesCount) {
+ // resize existing lane
+ modeling.resizeShape(childLanes[idx], laneBounds);
+ } else {
+ // create a new lane at position
+ newLaneAttrs = {
+ type: 'bpmn:Lane'
+ };
+
+ modeling.createShape(newLaneAttrs, laneBounds, shape);
+ }
+ }
+};
+
+},{"44":44}],40:[function(_dereq_,module,exports){
+'use strict';
+
+var Collections = _dereq_(219);
+
+
+function UpdateCanvasRootHandler(canvas, modeling) {
+ this._canvas = canvas;
+ this._modeling = modeling;
+}
+
+UpdateCanvasRootHandler.$inject = [ 'canvas', 'modeling' ];
+
+module.exports = UpdateCanvasRootHandler;
+
+
+UpdateCanvasRootHandler.prototype.execute = function(context) {
+
+ var canvas = this._canvas;
+
+ var newRoot = context.newRoot,
+ newRootBusinessObject = newRoot.businessObject,
+ oldRoot = canvas.getRootElement(),
+ oldRootBusinessObject = oldRoot.businessObject,
+ bpmnDefinitions = oldRootBusinessObject.$parent,
+ diPlane = oldRootBusinessObject.di;
+
+ // (1) replace process old <> new root
+ canvas.setRootElement(newRoot, true);
+
+ // (2) update root elements
+ Collections.add(bpmnDefinitions.rootElements, newRootBusinessObject);
+ newRootBusinessObject.$parent = bpmnDefinitions;
+
+ Collections.remove(bpmnDefinitions.rootElements, oldRootBusinessObject);
+ oldRootBusinessObject.$parent = null;
+
+ // (3) wire di
+ oldRootBusinessObject.di = null;
+
+ diPlane.bpmnElement = newRootBusinessObject;
+ newRootBusinessObject.di = diPlane;
+
+ context.oldRoot = oldRoot;
+
+ // TODO(nikku): return changed elements?
+ // return [ newRoot, oldRoot ];
+};
+
+
+UpdateCanvasRootHandler.prototype.revert = function(context) {
+
+ var canvas = this._canvas;
+
+ var newRoot = context.newRoot,
+ newRootBusinessObject = newRoot.businessObject,
+ oldRoot = context.oldRoot,
+ oldRootBusinessObject = oldRoot.businessObject,
+ bpmnDefinitions = newRootBusinessObject.$parent,
+ diPlane = newRootBusinessObject.di;
+
+ // (1) replace process old <> new root
+ canvas.setRootElement(oldRoot, true);
+
+ // (2) update root elements
+ Collections.remove(bpmnDefinitions.rootElements, newRootBusinessObject);
+ newRootBusinessObject.$parent = null;
+
+ Collections.add(bpmnDefinitions.rootElements, oldRootBusinessObject);
+ oldRootBusinessObject.$parent = bpmnDefinitions;
+
+ // (3) wire di
+ newRootBusinessObject.di = null;
+
+ diPlane.bpmnElement = oldRootBusinessObject;
+ oldRootBusinessObject.di = diPlane;
+
+ // TODO(nikku): return changed elements?
+ // return [ newRoot, oldRoot ];
+};
+},{"219":219}],41:[function(_dereq_,module,exports){
+'use strict';
+
+var collectLanes = _dereq_(44).collectLanes;
+
+var getLanesRoot = _dereq_(44).getLanesRoot;
+
+var is = _dereq_(70).is;
+
+var Collections = _dereq_(219);
+
+var asTRBL = _dereq_(208).asTRBL;
+
+var FLOW_NODE_REFS_ATTR = 'flowNodeRef',
+ LANES_ATTR = 'lanes';
+
+/**
+ * A handler that updates lane refs on changed elements
+ */
+function UpdateFlowNodeRefsHandler(elementRegistry) {
+ this._elementRegistry = elementRegistry;
+}
+
+UpdateFlowNodeRefsHandler.$inject = [ 'elementRegistry' ];
+
+module.exports = UpdateFlowNodeRefsHandler;
+
+
+UpdateFlowNodeRefsHandler.prototype.computeUpdates = function(flowNodeShapes, laneShapes) {
+
+ var handledNodes = {};
+
+ var updates = [];
+
+ var participantCache = {};
+
+ var allFlowNodeShapes = [];
+
+ function isInLaneShape(element, laneShape) {
+
+ var laneTrbl = asTRBL(laneShape);
+
+ var elementMid = {
+ x: element.x + element.width / 2,
+ y: element.y + element.height / 2
+ };
+
+ return elementMid.x > laneTrbl.left &&
+ elementMid.x < laneTrbl.right &&
+ elementMid.y > laneTrbl.top &&
+ elementMid.y < laneTrbl.bottom;
+ }
+
+ function addFlowNodeShape(flowNodeShape) {
+ if (!handledNodes[flowNodeShape.id]) {
+ allFlowNodeShapes.push(flowNodeShape);
+ handledNodes[flowNodeShape.id] = flowNodeShape;
+ }
+ }
+
+ function getAllLaneShapes(flowNodeShape) {
+
+ var root = getLanesRoot(flowNodeShape);
+
+ if (!participantCache[root.id]) {
+ participantCache[root.id] = collectLanes(root);
+ }
+
+ return participantCache[root.id];
+ }
+
+ function getNewLanes(flowNodeShape) {
+ if (!flowNodeShape.parent) {
+ return [];
+ }
+
+ var allLaneShapes = getAllLaneShapes(flowNodeShape);
+
+ return allLaneShapes.filter(function(l) {
+ return isInLaneShape(flowNodeShape, l);
+ }).map(function(shape) {
+ return shape.businessObject;
+ });
+ }
+
+ laneShapes.forEach(function(laneShape) {
+ var root = getLanesRoot(laneShape);
+
+ if (!root || handledNodes[root.id]) {
+ return;
+ }
+
+ var children = root.children.filter(function(c) {
+ return is(c, 'bpmn:FlowNode');
+ });
+
+ children.forEach(addFlowNodeShape);
+
+ handledNodes[root.id] = root;
+ });
+
+ flowNodeShapes.forEach(addFlowNodeShape);
+
+
+ allFlowNodeShapes.forEach(function(flowNodeShape) {
+
+ var flowNode = flowNodeShape.businessObject;
+
+ var lanes = flowNode.get(LANES_ATTR),
+ remove = lanes.slice(),
+ add = getNewLanes(flowNodeShape);
+
+ updates.push({ flowNode: flowNode, remove: remove, add: add });
+ });
+
+ laneShapes.forEach(function(laneShape) {
+
+ var lane = laneShape.businessObject;
+
+ // lane got removed XX-)
+ if (!laneShape.parent) {
+ lane.get(FLOW_NODE_REFS_ATTR).forEach(function(flowNode) {
+ updates.push({ flowNode: flowNode, remove: [ lane ], add: [] });
+ });
+ }
+ });
+
+ return updates;
+};
+
+UpdateFlowNodeRefsHandler.prototype.execute = function(context) {
+
+ var updates = context.updates;
+
+ if (!updates) {
+ updates = context.updates = this.computeUpdates(context.flowNodeShapes, context.laneShapes);
+ }
+
+
+ updates.forEach(function(update) {
+
+ var flowNode = update.flowNode,
+ lanes = flowNode.get(LANES_ATTR);
+
+ // unwire old
+ update.remove.forEach(function(oldLane) {
+ Collections.remove(lanes, oldLane);
+ Collections.remove(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);
+ });
+
+ // wire new
+ update.add.forEach(function(newLane) {
+ Collections.add(lanes, newLane);
+ Collections.add(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);
+ });
+ });
+
+ // TODO(nikku): return changed elements
+ // return [ ... ];
+};
+
+
+UpdateFlowNodeRefsHandler.prototype.revert = function(context) {
+
+ var updates = context.updates;
+
+ updates.forEach(function(update) {
+
+ var flowNode = update.flowNode,
+ lanes = flowNode.get(LANES_ATTR);
+
+ // unwire new
+ update.add.forEach(function(newLane) {
+ Collections.remove(lanes, newLane);
+ Collections.remove(newLane.get(FLOW_NODE_REFS_ATTR), flowNode);
+ });
+
+ // wire old
+ update.remove.forEach(function(oldLane) {
+ Collections.add(lanes, oldLane);
+ Collections.add(oldLane.get(FLOW_NODE_REFS_ATTR), flowNode);
+ });
+ });
+
+ // TODO(nikku): return changed elements
+ // return [ ... ];
+};
+},{"208":208,"219":219,"44":44,"70":70}],42:[function(_dereq_,module,exports){
+'use strict';
+
+var reduce = _dereq_(384),
+ keys = _dereq_(378),
+ forEach = _dereq_(255),
+ assign = _dereq_(377);
+
+var getBusinessObject = _dereq_(70).getBusinessObject;
+
+var DEFAULT_FLOW = 'default',
+ NAME = 'name',
+ ID = 'id';
+
+
+/**
+ * A handler that implements a BPMN 2.0 property update.
+ *
+ * This should be used to set simple properties on elements with
+ * an underlying BPMN business object.
+ *
+ * Use respective diagram-js provided handlers if you would
+ * like to perform automated modeling.
+ */
+function UpdatePropertiesHandler(elementRegistry, moddle, translate) {
+ this._elementRegistry = elementRegistry;
+ this._moddle = moddle;
+ this._translate = translate;
+}
+
+UpdatePropertiesHandler.$inject = [ 'elementRegistry', 'moddle', 'translate' ];
+
+module.exports = UpdatePropertiesHandler;
+
+
+////// api /////////////////////////////////////////////
+
+/**
+ * Updates a BPMN element with a list of new properties
+ *
+ * @param {Object} context
+ * @param {djs.model.Base} context.element the element to update
+ * @param {Object} context.properties a list of properties to set on the element's
+ * businessObject (the BPMN model element)
+ *
+ * @return {Array} the updated element
+ */
+UpdatePropertiesHandler.prototype.execute = function(context) {
+
+ var element = context.element,
+ changed = [ element],
+ translate = this._translate;
+
+ if (!element) {
+ throw new Error(translate('element required'));
+ }
+
+ var elementRegistry = this._elementRegistry,
+ ids = this._moddle.ids;
+
+ var businessObject = element.businessObject,
+ properties = unwrapBusinessObjects(context.properties),
+ oldProperties = context.oldProperties || getProperties(businessObject, keys(properties));
+
+ if (isIdChange(properties, businessObject)) {
+ ids.unclaim(businessObject[ID]);
+
+ elementRegistry.updateId(element, properties[ID]);
+ }
+
+ // correctly indicate visual changes on default flow updates
+ if (DEFAULT_FLOW in properties) {
+
+ if (properties[DEFAULT_FLOW]) {
+ changed.push(elementRegistry.get(properties[DEFAULT_FLOW].id));
+ }
+
+ if (businessObject[DEFAULT_FLOW]) {
+ changed.push(elementRegistry.get(businessObject[DEFAULT_FLOW].id));
+ }
+ }
+
+ if (NAME in properties && element.label) {
+ changed.push(element.label);
+
+ // show the label
+ element.label.hidden = !properties[NAME];
+ }
+
+ // update properties
+ setProperties(businessObject, properties);
+
+ // store old values
+ context.oldProperties = oldProperties;
+ context.changed = changed;
+
+ // indicate changed on objects affected by the update
+ return changed;
+};
+
+/**
+ * Reverts the update on a BPMN elements properties.
+ *
+ * @param {Object} context
+ *
+ * @return {djs.mode.Base} the updated element
+ */
+UpdatePropertiesHandler.prototype.revert = function(context) {
+
+ var element = context.element,
+ properties = context.properties,
+ oldProperties = context.oldProperties,
+ businessObject = element.businessObject,
+ elementRegistry = this._elementRegistry,
+ ids = this._moddle.ids;
+
+ // update properties
+ setProperties(businessObject, oldProperties);
+
+ if (isIdChange(properties, businessObject)) {
+ ids.unclaim(properties[ID]);
+
+ elementRegistry.updateId(element, oldProperties[ID]);
+ }
+
+ return context.changed;
+};
+
+
+function isIdChange(properties, businessObject) {
+ return ID in properties && properties[ID] !== businessObject[ID];
+}
+
+
+function getProperties(businessObject, propertyNames) {
+ return reduce(propertyNames, function(result, key) {
+ result[key] = businessObject.get(key);
+ return result;
+ }, {});
+}
+
+
+function setProperties(businessObject, properties) {
+ forEach(properties, function(value, key) {
+ businessObject.set(key, value);
+ });
+}
+
+
+var referencePropertyNames = [ 'default' ];
+
+/**
+ * Make sure we unwrap the actual business object
+ * behind diagram element that may have been
+ * passed as arguments.
+ *
+ * @param {Object} properties
+ *
+ * @return {Object} unwrappedProps
+ */
+function unwrapBusinessObjects(properties) {
+
+ var unwrappedProps = assign({}, properties);
+
+ referencePropertyNames.forEach(function(name) {
+ if (name in properties) {
+ unwrappedProps[name] = getBusinessObject(unwrappedProps[name]);
+ }
+ });
+
+ return unwrappedProps;
+}
+},{"255":255,"377":377,"378":378,"384":384,"70":70}],43:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [ 'modeling', 'bpmnUpdater' ],
+ __depends__: [
+ _dereq_(36),
+ _dereq_(16),
+ _dereq_(59),
+ _dereq_(47),
+ _dereq_(57),
+ _dereq_(100),
+ _dereq_(200),
+ _dereq_(139),
+ _dereq_(112),
+ _dereq_(189),
+ _dereq_(120),
+ _dereq_(196)
+ ],
+ bpmnFactory: [ 'type', _dereq_(17) ],
+ bpmnUpdater: [ 'type', _dereq_(19) ],
+ elementFactory: [ 'type', _dereq_(20) ],
+ modeling: [ 'type', _dereq_(21) ],
+ layouter: [ 'type', _dereq_(18) ],
+ connectionDocking: [ 'type', _dereq_(207) ]
+};
+
+},{"100":100,"112":112,"120":120,"139":139,"16":16,"17":17,"18":18,"189":189,"19":19,"196":196,"20":20,"200":200,"207":207,"21":21,"36":36,"47":47,"57":57,"59":59}],44:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is;
+
+var getParent = _dereq_(45).getParent;
+
+var asTRBL = _dereq_(208).asTRBL,
+ substractTRBL = _dereq_(180).substractTRBL,
+ resizeTRBL = _dereq_(180).resizeTRBL;
+
+var abs = Math.abs;
+
+
+function getTRBLResize(oldBounds, newBounds) {
+ return substractTRBL(asTRBL(newBounds), asTRBL(oldBounds));
+}
+
+
+var LANE_PARENTS = [
+ 'bpmn:Participant',
+ 'bpmn:Process',
+ 'bpmn:SubProcess'
+];
+
+var LANE_INDENTATION = 30;
+
+module.exports.LANE_INDENTATION = LANE_INDENTATION;
+
+
+/**
+ * Collect all lane shapes in the given paren
+ *
+ * @param {djs.model.Shape} shape
+ * @param {Array} [collectedShapes]
+ *
+ * @return {Array}
+ */
+function collectLanes(shape, collectedShapes) {
+
+ collectedShapes = collectedShapes || [];
+
+ shape.children.filter(function(s) {
+ if (is(s, 'bpmn:Lane')) {
+ collectLanes(s, collectedShapes);
+
+ collectedShapes.push(s);
+ }
+ });
+
+ return collectedShapes;
+}
+
+module.exports.collectLanes = collectLanes;
+
+/**
+ * Return the lane children of the given element.
+ *
+ * @param {djs.model.Shape} shape
+ *
+ * @return {Array}
+ */
+function getChildLanes(shape) {
+ return shape.children.filter(function(c) {
+ return is(c, 'bpmn:Lane');
+ });
+}
+
+module.exports.getChildLanes = getChildLanes;
+
+/**
+ * Return the root element containing the given lane shape
+ *
+ * @param {djs.model.Shape} shape
+ *
+ * @return {djs.model.Shape}
+ */
+function getLanesRoot(shape) {
+ return getParent(shape, LANE_PARENTS) || shape;
+}
+
+module.exports.getLanesRoot = getLanesRoot;
+
+
+/**
+ * Compute the required resize operations for lanes
+ * adjacent to the given shape, assuming it will be
+ * resized to the given new bounds.
+ *
+ * @param {djs.model.Shape} shape
+ * @param {Bounds} newBounds
+ *
+ * @return {Array}
+ */
+function computeLanesResize(shape, newBounds) {
+
+ var rootElement = getLanesRoot(shape);
+
+ var initialShapes = is(rootElement, 'bpmn:Process') ? [] : [ rootElement ];
+
+ var allLanes = collectLanes(rootElement, initialShapes),
+ shapeTrbl = asTRBL(shape),
+ shapeNewTrbl = asTRBL(newBounds),
+ trblResize = getTRBLResize(shape, newBounds),
+ resizeNeeded = [];
+
+ allLanes.forEach(function(other) {
+
+ if (other === shape) {
+ return;
+ }
+
+ var topResize = 0,
+ rightResize = trblResize.right,
+ bottomResize = 0,
+ leftResize = trblResize.left;
+
+ var otherTrbl = asTRBL(other);
+
+ if (trblResize.top) {
+ if (abs(otherTrbl.bottom - shapeTrbl.top) < 10) {
+ bottomResize = shapeNewTrbl.top - otherTrbl.bottom;
+ }
+
+ if (abs(otherTrbl.top - shapeTrbl.top) < 5) {
+ topResize = shapeNewTrbl.top - otherTrbl.top;
+ }
+ }
+
+ if (trblResize.bottom) {
+ if (abs(otherTrbl.top - shapeTrbl.bottom) < 10) {
+ topResize = shapeNewTrbl.bottom - otherTrbl.top;
+ }
+
+ if (abs(otherTrbl.bottom - shapeTrbl.bottom) < 5) {
+ bottomResize = shapeNewTrbl.bottom - otherTrbl.bottom;
+ }
+ }
+
+ if (topResize || rightResize || bottomResize || leftResize) {
+
+ resizeNeeded.push({
+ shape: other,
+ newBounds: resizeTRBL(other, {
+ top: topResize,
+ right: rightResize,
+ bottom: bottomResize,
+ left: leftResize
+ })
+ });
+ }
+
+ });
+
+ return resizeNeeded;
+}
+
+module.exports.computeLanesResize = computeLanesResize;
+
+},{"180":180,"208":208,"45":45,"70":70}],45:[function(_dereq_,module,exports){
+'use strict';
+
+var any = _dereq_(251);
+
+var is = _dereq_(70).is;
+
+
+function getParents(element) {
+
+ var parents = [];
+
+ while (element) {
+ element = element.parent;
+
+ if (element) {
+ parents.push(element);
+ }
+ }
+
+ return parents;
+}
+
+module.exports.getParents = getParents;
+
+
+/**
+ * Return true if element has any of the given types.
+ *
+ * @param {djs.model.Base} element
+ * @param {Array} types
+ *
+ * @return {Boolean}
+ */
+function isAny(element, types) {
+ return any(types, function(t) {
+ return is(element, t);
+ });
+}
+
+module.exports.isAny = isAny;
+
+
+/**
+ * Return the parent of the element with any of the given types.
+ *
+ * @param {djs.model.Base} element
+ * @param {String|Array} anyType
+ *
+ * @return {djs.model.Base}
+ */
+function getParent(element, anyType) {
+
+ if (typeof anyType === 'string') {
+ anyType = [ anyType ];
+ }
+
+ while ((element = element.parent)) {
+ if (isAny(element, anyType)) {
+ return element;
+ }
+ }
+
+ return null;
+}
+
+module.exports.getParent = getParent;
+},{"251":251,"70":70}],46:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var OrderingProvider = _dereq_(167);
+
+var isAny = _dereq_(45).isAny;
+
+var findIndex = _dereq_(244);
+
+var find = _dereq_(254);
+
+
+/**
+ * a simple ordering provider that makes sure:
+ *
+ * (1) elements are ordered by a {level} property
+ * (2) elements with {alwaysOnTop} are always added to the root
+ */
+function BpmnOrderingProvider(eventBus, translate) {
+
+ OrderingProvider.call(this, eventBus);
+
+ var orders = [
+ { type: 'label', order: { level: 10 } },
+ { type: 'bpmn:SubProcess', order: { level: 6 } },
+ {
+ type: 'bpmn:SequenceFlow',
+ order: {
+ level: 5,
+ containers: [
+ 'bpmn:Participant',
+ 'bpmn:FlowElementsContainer'
+ ]
+ }
+ },
+ {
+ type: 'bpmn:Association',
+ order: {
+ level: 6,
+ containers: [
+ 'bpmn:Participant',
+ 'bpmn:FlowElementsContainer',
+ 'bpmn:Collaboration'
+ ]
+ }
+ },
+ { type: 'bpmn:MessageFlow', order: { level: 9, containers: [ 'bpmn:Collaboration' ] } },
+ { type: 'bpmn:BoundaryEvent', order: { level: 8 } },
+ { type: 'bpmn:Participant', order: { level: -2 } },
+ { type: 'bpmn:Lane', order: { level: -1 } }
+ ];
+
+ function computeOrder(element) {
+ var entry = find(orders, function(o) {
+ return isAny(element, [ o.type ]);
+ });
+
+ return entry && entry.order || { level: 1 };
+ }
+
+ function getOrder(element) {
+
+ var order = element.order;
+
+ if (!order) {
+ element.order = order = computeOrder(element);
+ }
+
+ return order;
+ }
+
+ function findActualParent(element, newParent, containers) {
+
+ var actualParent = newParent;
+
+ while (actualParent) {
+
+ if (isAny(actualParent, containers)) {
+ break;
+ }
+
+ actualParent = actualParent.parent;
+ }
+
+ if (!actualParent) {
+ throw new Error(translate('no parent for {element} in {parent}', {
+ element: element.id,
+ parent: newParent.id
+ }));
+ }
+
+ return actualParent;
+ }
+
+ this.getOrdering = function(element, newParent) {
+
+ var elementOrder = getOrder(element);
+
+
+ if (elementOrder.containers) {
+ newParent = findActualParent(element, newParent, elementOrder.containers);
+ }
+
+
+ var currentIndex = newParent.children.indexOf(element);
+
+ var insertIndex = findIndex(newParent.children, function(child) {
+
+ // do not compare with labels, they are created
+ // in the wrong order (right after elements) during import and
+ // mess up the positioning.
+ if (!element.labelTarget && child.labelTarget) {
+ return false;
+ }
+
+ return elementOrder.level < getOrder(child).level;
+ });
+
+
+ // if the element is already in the child list at
+ // a smaller index, we need to adjust the inser index.
+ // this takes into account that the element is being removed
+ // before being re-inserted
+ if (insertIndex !== -1) {
+ if (currentIndex !== -1 && currentIndex < insertIndex) {
+ insertIndex -= 1;
+ }
+ }
+
+ return {
+ index: insertIndex,
+ parent: newParent
+ };
+ };
+}
+
+BpmnOrderingProvider.$inject = [ 'eventBus', 'translate' ];
+
+inherits(BpmnOrderingProvider, OrderingProvider);
+
+module.exports = BpmnOrderingProvider;
+
+},{"167":167,"243":243,"244":244,"254":254,"45":45}],47:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [ 'bpmnOrderingProvider' ],
+ __depends__: [
+ _dereq_(204)
+ ],
+ bpmnOrderingProvider: [ 'type', _dereq_(46) ]
+};
+},{"204":204,"46":46}],48:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377);
+
+/**
+ * A palette provider for BPMN 2.0 elements.
+ */
+function PaletteProvider(palette, create, elementFactory, spaceTool, lassoTool, handTool, translate) {
+
+ this._palette = palette;
+ this._create = create;
+ this._elementFactory = elementFactory;
+ this._spaceTool = spaceTool;
+ this._lassoTool = lassoTool;
+ this._handTool = handTool;
+ this._translate = translate;
+
+ palette.registerProvider(this);
+}
+
+module.exports = PaletteProvider;
+
+PaletteProvider.$inject = [
+ 'palette',
+ 'create',
+ 'elementFactory',
+ 'spaceTool',
+ 'lassoTool',
+ 'handTool',
+ 'translate',
+ 'eventBus'
+];
+
+
+PaletteProvider.prototype.getPaletteEntries = function(element) {
+
+ var actions = {},
+ create = this._create,
+ elementFactory = this._elementFactory,
+ spaceTool = this._spaceTool,
+ lassoTool = this._lassoTool,
+ handTool = this._handTool,
+ translate = this._translate;
+
+ function createAction(type, group, className, title, options) {
+
+ function createListener(event) {
+ var shape = elementFactory.createShape(assign({ type: type }, options));
+
+ if (options) {
+ shape.businessObject.di.isExpanded = options.isExpanded;
+ }
+
+ create.start(event, shape);
+ }
+
+ var shortType = type.replace(/^bpmn\:/, '');
+
+ return {
+ group: group,
+ className: className,
+ title: title || translate('Create {type}', { type: shortType }),
+ action: {
+ dragstart: createListener,
+ click: createListener
+ }
+ };
+ }
+
+ function createParticipant(event, collapsed) {
+ create.start(event, elementFactory.createParticipantShape(collapsed));
+ }
+
+ assign(actions, {
+ 'hand-tool': {
+ group: 'tools',
+ className: 'bpmn-icon-hand-tool',
+ title: translate('Activate the hand tool'),
+ action: {
+ click: function(event) {
+ handTool.activateHand(event);
+ }
+ }
+ },
+ 'lasso-tool': {
+ group: 'tools',
+ className: 'bpmn-icon-lasso-tool',
+ title: translate('Activate the lasso tool'),
+ action: {
+ click: function(event) {
+ lassoTool.activateSelection(event);
+ }
+ }
+ },
+ 'space-tool': {
+ group: 'tools',
+ className: 'bpmn-icon-space-tool',
+ title: translate('Activate the create/remove space tool'),
+ action: {
+ click: function(event) {
+ spaceTool.activateSelection(event);
+ }
+ }
+ },
+ 'tool-separator': {
+ group: 'tools',
+ separator: true
+ },
+ 'create.start-event': createAction(
+ 'bpmn:StartEvent', 'event', 'bpmn-icon-start-event-none'
+ ),
+ 'create.intermediate-event': createAction(
+ 'bpmn:IntermediateThrowEvent', 'event', 'bpmn-icon-intermediate-event-none'
+ ),
+ 'create.end-event': createAction(
+ 'bpmn:EndEvent', 'event', 'bpmn-icon-end-event-none'
+ ),
+ 'create.exclusive-gateway': createAction(
+ 'bpmn:ExclusiveGateway', 'gateway', 'bpmn-icon-gateway-xor'
+ ),
+ 'create.task': createAction(
+ 'bpmn:Task', 'activity', 'bpmn-icon-task'
+ ),
+ 'create.data-object': createAction(
+ 'bpmn:DataObjectReference', 'data-object', 'bpmn-icon-data-object'
+ ),
+ 'create.data-store': createAction(
+ 'bpmn:DataStoreReference', 'data-store', 'bpmn-icon-data-store'
+ ),
+ 'create.subprocess-expanded': createAction(
+ 'bpmn:SubProcess', 'activity', 'bpmn-icon-subprocess-expanded', translate('Create expanded SubProcess'),
+ { isExpanded: true }
+ ),
+ 'create.participant-expanded': {
+ group: 'collaboration',
+ className: 'bpmn-icon-participant',
+ title: translate('Create Pool/Participant'),
+ action: {
+ dragstart: createParticipant,
+ click: createParticipant
+ }
+ }
+ });
+
+ return actions;
+};
+
+},{"377":377}],49:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(173),
+ _dereq_(126),
+ _dereq_(196),
+ _dereq_(141),
+ _dereq_(133),
+ _dereq_(204)
+ ],
+ __init__: [ 'paletteProvider' ],
+ paletteProvider: [ 'type', _dereq_(48) ]
+};
+
+},{"126":126,"133":133,"141":141,"173":173,"196":196,"204":204,"48":48}],50:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is,
+ isEventSubProcess = _dereq_(68).isEventSubProcess,
+ getBusinessObject = _dereq_(70).getBusinessObject,
+ isExpanded = _dereq_(68).isExpanded,
+ isDifferentType = _dereq_(52).isDifferentType;
+
+var forEach = _dereq_(255),
+ filter = _dereq_(253);
+
+var replaceOptions = _dereq_(56);
+
+
+/**
+ * This module is an element agnostic replace menu provider for the popup menu.
+ */
+function ReplaceMenuProvider(popupMenu, modeling, moddle, bpmnReplace, rules, translate) {
+
+ this._popupMenu = popupMenu;
+ this._modeling = modeling;
+ this._moddle = moddle;
+ this._bpmnReplace = bpmnReplace;
+ this._rules = rules;
+ this._translate = translate;
+
+ this.register();
+}
+
+ReplaceMenuProvider.$inject = [ 'popupMenu', 'modeling', 'moddle', 'bpmnReplace', 'rules', 'translate' ];
+
+
+/**
+ * Register replace menu provider in the popup menu
+ */
+ReplaceMenuProvider.prototype.register = function() {
+ this._popupMenu.registerProvider('bpmn-replace', this);
+};
+
+
+/**
+ * Get all entries from replaceOptions for the given element and apply filters
+ * on them. Get for example only elements, which are different from the current one.
+ *
+ * @param {djs.model.Base} element
+ *
+ * @return {Array} a list of menu entry items
+ */
+ReplaceMenuProvider.prototype.getEntries = function(element) {
+
+ var businessObject = element.businessObject;
+
+ var rules = this._rules;
+
+ var entries;
+
+ if (!rules.allowed('shape.replace', { element: element })) {
+ return [];
+ }
+
+ var differentType = isDifferentType(element);
+
+ // start events outside event sub processes
+ if (is(businessObject, 'bpmn:StartEvent') && !isEventSubProcess(businessObject.$parent)) {
+
+ entries = filter(replaceOptions.START_EVENT, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // expanded/collapsed pools
+ if (is(businessObject, 'bpmn:Participant')) {
+
+ entries = filter(replaceOptions.PARTICIPANT, function(entry) {
+ return isExpanded(businessObject) !== entry.target.isExpanded;
+ });
+
+ return this._createEntries(element, entries);
+ }
+
+ // start events inside event sub processes
+ if (is(businessObject, 'bpmn:StartEvent') && isEventSubProcess(businessObject.$parent)) {
+
+ entries = filter(replaceOptions.EVENT_SUB_PROCESS_START_EVENT, function(entry) {
+
+ var target = entry.target;
+
+ var isInterrupting = target.isInterrupting !== false;
+
+ var isInterruptingEqual = getBusinessObject(element).isInterrupting === isInterrupting;
+
+ // filters elements which types and event definition are equal but have have different interrupting types
+ return differentType(entry) || !differentType(entry) && !isInterruptingEqual;
+
+ });
+
+ return this._createEntries(element, entries);
+ }
+
+ // end events
+ if (is(businessObject, 'bpmn:EndEvent')) {
+
+ entries = filter(replaceOptions.END_EVENT, function(entry) {
+ var target = entry.target;
+
+ // hide cancel end events outside transactions
+ if (target.eventDefinition == 'bpmn:CancelEventDefinition' && !is(businessObject.$parent, 'bpmn:Transaction')) {
+ return false;
+ }
+ return differentType(entry);
+ });
+
+ return this._createEntries(element, entries);
+ }
+
+ // boundary events
+ if (is(businessObject, 'bpmn:BoundaryEvent')) {
+
+ entries = filter(replaceOptions.BOUNDARY_EVENT, function(entry) {
+
+ var target = entry.target;
+
+ if (target.eventDefinition == 'bpmn:CancelEventDefinition' &&
+ !is(businessObject.attachedToRef, 'bpmn:Transaction')) {
+ return false;
+ }
+ var cancelActivity = target.cancelActivity !== false;
+
+ var isCancelActivityEqual = businessObject.cancelActivity == cancelActivity;
+
+ return differentType(entry) || !differentType(entry) && !isCancelActivityEqual;
+ });
+
+ return this._createEntries(element, entries);
+ }
+
+ // intermediate events
+ if (is(businessObject, 'bpmn:IntermediateCatchEvent') ||
+ is(businessObject, 'bpmn:IntermediateThrowEvent')) {
+
+ entries = filter(replaceOptions.INTERMEDIATE_EVENT, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // gateways
+ if (is(businessObject, 'bpmn:Gateway')) {
+
+ entries = filter(replaceOptions.GATEWAY, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // transactions
+ if (is(businessObject, 'bpmn:Transaction')) {
+
+ entries = filter(replaceOptions.TRANSACTION, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // expanded event sub processes
+ if (isEventSubProcess(businessObject) && isExpanded(businessObject)) {
+
+ entries = filter(replaceOptions.EVENT_SUB_PROCESS, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // expanded sub processes
+ if (is(businessObject, 'bpmn:SubProcess') && isExpanded(businessObject)) {
+
+ entries = filter(replaceOptions.SUBPROCESS_EXPANDED, differentType);
+
+ return this._createEntries(element, entries);
+ }
+
+ // collapsed ad hoc sub processes
+ if (is(businessObject, 'bpmn:AdHocSubProcess') && !isExpanded(businessObject)) {
+
+ entries = filter(replaceOptions.TASK, function(entry) {
+
+ var target = entry.target;
+
+ var isTargetSubProcess = target.type === 'bpmn:SubProcess';
+
+ return isDifferentType(element, target) && !isTargetSubProcess;
+ });
+
+ return this._createEntries(element, entries);
+ }
+
+ // sequence flows
+ if (is(businessObject, 'bpmn:SequenceFlow')) {
+ return this._createSequenceFlowEntries(element, replaceOptions.SEQUENCE_FLOW);
+ }
+
+ // flow nodes
+ if (is(businessObject, 'bpmn:FlowNode')) {
+ entries = filter(replaceOptions.TASK, differentType);
+
+ if (businessObject.isForCompensation) {
+
+ // can only replace to compensation activities
+ entries = filter(entries, function(entry) {
+ return !/CallActivity/.test(entry.target.type);
+ });
+ }
+
+ return this._createEntries(element, entries);
+ }
+
+ return [];
+};
+
+
+/**
+ * Get a list of header items for the given element. This includes buttons
+ * for multi instance markers and for the ad hoc marker.
+ *
+ * @param {djs.model.Base} element
+ *
+ * @return {Array} a list of menu entry items
+ */
+ReplaceMenuProvider.prototype.getHeaderEntries = function(element) {
+
+ var headerEntries = [];
+
+ if (is(element, 'bpmn:Activity') && !isEventSubProcess(element)) {
+ headerEntries = headerEntries.concat(this._getLoopEntries(element));
+ }
+
+ if (is(element, 'bpmn:SubProcess') &&
+ !is(element, 'bpmn:Transaction') &&
+ !isEventSubProcess(element)) {
+ headerEntries.push(this._getAdHocEntry(element));
+ }
+
+ return headerEntries;
+};
+
+
+/**
+ * Creates an array of menu entry objects for a given element and filters the replaceOptions
+ * according to a filter function.
+ *
+ * @param {djs.model.Base} element
+ * @param {Object} replaceOptions
+ *
+ * @return {Array} a list of menu items
+ */
+ReplaceMenuProvider.prototype._createEntries = function(element, replaceOptions) {
+ var menuEntries = [];
+
+ var self = this;
+
+ forEach(replaceOptions, function(definition) {
+ var entry = self._createMenuEntry(definition, element);
+
+ menuEntries.push(entry);
+ });
+
+ return menuEntries;
+};
+
+/**
+ * Creates an array of menu entry objects for a given sequence flow.
+ *
+ * @param {djs.model.Base} element
+ * @param {Object} replaceOptions
+
+ * @return {Array} a list of menu items
+ */
+ReplaceMenuProvider.prototype._createSequenceFlowEntries = function (element, replaceOptions) {
+
+ var businessObject = getBusinessObject(element);
+
+ var menuEntries = [];
+
+ var modeling = this._modeling,
+ moddle = this._moddle;
+
+ var self = this;
+
+ forEach(replaceOptions, function(entry) {
+
+ switch (entry.actionName) {
+ case 'replace-with-default-flow':
+ if (businessObject.sourceRef.default !== businessObject &&
+ (is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||
+ is(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||
+ is(businessObject.sourceRef, 'bpmn:Activity'))) {
+
+ menuEntries.push(self._createMenuEntry(entry, element, function() {
+ modeling.updateProperties(element.source, { default: businessObject });
+ }));
+ }
+ break;
+ case 'replace-with-conditional-flow':
+ if (!businessObject.conditionExpression && is(businessObject.sourceRef, 'bpmn:Activity')) {
+
+ menuEntries.push(self._createMenuEntry(entry, element, function() {
+ var conditionExpression = moddle.create('bpmn:FormalExpression', { body: '' });
+
+ modeling.updateProperties(element, { conditionExpression: conditionExpression });
+ }));
+ }
+ break;
+ default:
+ // default flows
+ if (is(businessObject.sourceRef, 'bpmn:Activity') && businessObject.conditionExpression) {
+ return menuEntries.push(self._createMenuEntry(entry, element, function() {
+ modeling.updateProperties(element, { conditionExpression: undefined });
+ }));
+ }
+ // conditional flows
+ if ((is(businessObject.sourceRef, 'bpmn:ExclusiveGateway') ||
+ is(businessObject.sourceRef, 'bpmn:InclusiveGateway') ||
+ is(businessObject.sourceRef, 'bpmn:Activity')) &&
+ businessObject.sourceRef.default === businessObject) {
+
+ return menuEntries.push(self._createMenuEntry(entry, element, function() {
+ modeling.updateProperties(element.source, { default: undefined });
+ }));
+ }
+ }
+ });
+
+ return menuEntries;
+};
+
+
+/**
+ * Creates and returns a single menu entry item.
+ *
+ * @param {Object} definition a single replace options definition object
+ * @param {djs.model.Base} element
+ * @param {Function} [action] an action callback function which gets called when
+ * the menu entry is being triggered.
+ *
+ * @return {Object} menu entry item
+ */
+ReplaceMenuProvider.prototype._createMenuEntry = function(definition, element, action) {
+ var translate = this._translate;
+ var replaceElement = this._bpmnReplace.replaceElement;
+
+ var replaceAction = function() {
+ return replaceElement(element, definition.target);
+ };
+
+ action = action || replaceAction;
+
+ var menuEntry = {
+ label: translate(definition.label),
+ className: definition.className,
+ id: definition.actionName,
+ action: action
+ };
+
+ return menuEntry;
+};
+
+/**
+ * Get a list of menu items containing buttons for multi instance markers
+ *
+ * @param {djs.model.Base} element
+ *
+ * @return {Array} a list of menu items
+ */
+ReplaceMenuProvider.prototype._getLoopEntries = function(element) {
+
+ var self = this;
+ var translate = this._translate;
+
+ function toggleLoopEntry(event, entry) {
+ var loopCharacteristics;
+
+ if (entry.active) {
+ loopCharacteristics = undefined;
+ } else {
+ loopCharacteristics = self._moddle.create(entry.options.loopCharacteristics);
+
+ if (entry.options.isSequential) {
+ loopCharacteristics.isSequential = entry.options.isSequential;
+ }
+ }
+ self._modeling.updateProperties(element, { loopCharacteristics: loopCharacteristics });
+ }
+
+ var businessObject = getBusinessObject(element),
+ loopCharacteristics = businessObject.loopCharacteristics;
+
+ var isSequential,
+ isLoop,
+ isParallel;
+
+ if (loopCharacteristics) {
+ isSequential = loopCharacteristics.isSequential;
+ isLoop = loopCharacteristics.isSequential === undefined;
+ isParallel = loopCharacteristics.isSequential !== undefined && !loopCharacteristics.isSequential;
+ }
+
+
+ var loopEntries = [
+ {
+ id: 'toggle-parallel-mi',
+ className: 'bpmn-icon-parallel-mi-marker',
+ title: translate('Parallel Multi Instance'),
+ active: isParallel,
+ action: toggleLoopEntry,
+ options: {
+ loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',
+ isSequential: false
+ }
+ },
+ {
+ id: 'toggle-sequential-mi',
+ className: 'bpmn-icon-sequential-mi-marker',
+ title: translate('Sequential Multi Instance'),
+ active: isSequential,
+ action: toggleLoopEntry,
+ options: {
+ loopCharacteristics: 'bpmn:MultiInstanceLoopCharacteristics',
+ isSequential: true
+ }
+ },
+ {
+ id: 'toggle-loop',
+ className: 'bpmn-icon-loop-marker',
+ title: translate('Loop'),
+ active: isLoop,
+ action: toggleLoopEntry,
+ options: {
+ loopCharacteristics: 'bpmn:StandardLoopCharacteristics'
+ }
+ }
+ ];
+ return loopEntries;
+};
+
+
+/**
+ * Get the menu items containing a button for the ad hoc marker
+ *
+ * @param {djs.model.Base} element
+ *
+ * @return {Object} a menu item
+ */
+ReplaceMenuProvider.prototype._getAdHocEntry = function(element) {
+ var translate = this._translate;
+ var businessObject = getBusinessObject(element);
+
+ var isAdHoc = is(businessObject, 'bpmn:AdHocSubProcess');
+
+ var replaceElement = this._bpmnReplace.replaceElement;
+
+ var adHocEntry = {
+ id: 'toggle-adhoc',
+ className: 'bpmn-icon-ad-hoc-marker',
+ title: translate('Ad-hoc'),
+ active: isAdHoc,
+ action: function(event, entry) {
+ if (isAdHoc) {
+ return replaceElement(element, { type: 'bpmn:SubProcess' });
+ } else {
+ return replaceElement(element, { type: 'bpmn:AdHocSubProcess' });
+ }
+ }
+ };
+
+ return adHocEntry;
+};
+
+module.exports = ReplaceMenuProvider;
+
+},{"253":253,"255":255,"52":52,"56":56,"68":68,"70":70}],51:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(175),
+ _dereq_(57)
+ ],
+ __init__: [ 'replaceMenuProvider' ],
+ replaceMenuProvider: [ 'type', _dereq_(50) ]
+};
+},{"175":175,"50":50,"57":57}],52:[function(_dereq_,module,exports){
+'use strict';
+
+var getBusinessObject = _dereq_(70).getBusinessObject;
+
+/**
+ * Returns true, if an element is from a different type
+ * than a target definition. Takes into account the type,
+ * event definition type and triggeredByEvent property.
+ *
+ * @param {djs.model.Base} element
+ *
+ * @return {Boolean}
+ */
+function isDifferentType(element) {
+
+ return function(entry) {
+ var target = entry.target;
+
+ var businessObject = getBusinessObject(element),
+ eventDefinition = businessObject.eventDefinitions && businessObject.eventDefinitions[0];
+
+ var isEventDefinitionEqual = (eventDefinition && eventDefinition.$type) === target.eventDefinitionType,
+ isTypeEqual = businessObject.$type === target.type,
+ isTriggeredByEventEqual = businessObject.triggeredByEvent == target.triggeredByEvent;
+
+ return !isTypeEqual || !isEventDefinitionEqual || !isTriggeredByEventEqual;
+ };
+}
+
+module.exports.isDifferentType = isDifferentType;
+},{"70":70}],53:[function(_dereq_,module,exports){
+'use strict';
+
+var CommandInterceptor = _dereq_(98);
+
+var inherits = _dereq_(243);
+
+var assign = _dereq_(377),
+ forEach = _dereq_(255);
+
+var LOW_PRIORITY = 250;
+
+function BpmnReplacePreview(eventBus, elementRegistry, elementFactory, canvas, moveVisuals) {
+
+ CommandInterceptor.call(this, eventBus);
+
+ /**
+ * Replace the visuals of all elements in the context which can be replaced
+ *
+ * @param {Object} context
+ */
+ function replaceVisual(context) {
+
+ var replacements = context.canExecute.replacements;
+
+ forEach(replacements, function(replacement) {
+
+ var id = replacement.oldElementId;
+
+ var newElement = {
+ type: replacement.newElementType
+ };
+
+ // if the visual of the element is already replaced
+ if (context.visualReplacements[id]) {
+ return;
+ }
+
+ var element = elementRegistry.get(id);
+
+ assign(newElement, { x: element.x, y: element.y });
+
+ // create a temporary shape
+ var tempShape = elementFactory.createShape(newElement);
+
+ canvas.addShape(tempShape, element.parent);
+
+ // select the original SVG element related to the element and hide it
+ var gfx = context.dragGroup.select('[data-element-id=' + element.id + ']');
+
+ if (gfx) {
+ gfx.attr({ display: 'none' });
+ }
+
+ // clone the gfx of the temporary shape and add it to the drag group
+ var dragger = moveVisuals.addDragger(context, tempShape);
+
+ context.visualReplacements[id] = dragger;
+
+ canvas.removeShape(tempShape);
+ });
+ }
+
+ /**
+ * Restore the original visuals of the previously replaced elements
+ *
+ * @param {Object} context
+ */
+ function restoreVisual(context) {
+
+ var visualReplacements = context.visualReplacements;
+
+ forEach(visualReplacements, function(dragger, id) {
+
+ var originalGfx = context.dragGroup.select('[data-element-id=' + id + ']');
+
+ if (originalGfx) {
+ originalGfx.attr({ display: 'inline' });
+ }
+
+ dragger.remove();
+
+ if (visualReplacements[id]) {
+ delete visualReplacements[id];
+ }
+ });
+ }
+
+ eventBus.on('shape.move.move', LOW_PRIORITY, function(event) {
+
+ var context = event.context,
+ canExecute = context.canExecute;
+
+ if (!context.visualReplacements) {
+ context.visualReplacements = {};
+ }
+
+ if (canExecute.replacements) {
+ replaceVisual(context);
+ } else {
+ restoreVisual(context);
+ }
+ });
+}
+
+BpmnReplacePreview.$inject = [ 'eventBus', 'elementRegistry', 'elementFactory', 'canvas', 'moveVisuals' ];
+
+inherits(BpmnReplacePreview, CommandInterceptor);
+
+module.exports = BpmnReplacePreview;
+
+},{"243":243,"255":255,"377":377,"98":98}],54:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [ _dereq_(166) ],
+ __init__: ['bpmnReplacePreview'],
+ bpmnReplacePreview: [ 'type', _dereq_(53) ]
+};
+
+},{"166":166,"53":53}],55:[function(_dereq_,module,exports){
+'use strict';
+
+var pick = _dereq_(383),
+ assign = _dereq_(377);
+
+var is = _dereq_(70).is,
+ isExpanded = _dereq_(68).isExpanded,
+ isEventSubProcess = _dereq_(68).isEventSubProcess;
+
+var CUSTOM_PROPERTIES = [
+ 'cancelActivity',
+ 'instantiate',
+ 'eventGatewayType',
+ 'triggeredByEvent',
+ 'isInterrupting'
+];
+
+
+/**
+ * This module takes care of replacing BPMN elements
+ */
+function BpmnReplace(bpmnFactory, replace, selection, modeling) {
+
+ /**
+ * Prepares a new business object for the replacement element
+ * and triggers the replace operation.
+ *
+ * @param {djs.model.Base} element
+ * @param {Object} target
+ * @param {Object} [hints]
+ *
+ * @return {djs.model.Base} the newly created element
+ */
+ function replaceElement(element, target, hints) {
+
+ hints = hints || {};
+
+ var type = target.type,
+ oldBusinessObject = element.businessObject,
+ newBusinessObject = bpmnFactory.create(type);
+
+ var newElement = {
+ type: type,
+ businessObject: newBusinessObject
+ };
+
+ // initialize custom BPMN extensions
+ if (target.eventDefinitionType) {
+ newElement.eventDefinitionType = target.eventDefinitionType;
+ }
+
+ // initialize special properties defined in target definition
+ assign(newBusinessObject, pick(target, CUSTOM_PROPERTIES));
+
+ // copy size (for activities only)
+ if (is(oldBusinessObject, 'bpmn:Activity')) {
+
+ // TODO: need also to respect min/max Size
+
+ newElement.width = element.width;
+ newElement.height = element.height;
+ }
+
+ if (is(oldBusinessObject, 'bpmn:SubProcess')) {
+ newElement.isExpanded = isExpanded(oldBusinessObject);
+ }
+
+ // transform collapsed/expanded pools
+ if (is(oldBusinessObject, 'bpmn:Participant')) {
+
+ // create expanded pool
+ if (target.isExpanded === true) {
+ newBusinessObject.processRef = bpmnFactory.create('bpmn:Process');
+ } else {
+ // remove children when transforming to collapsed pool
+ hints.moveChildren = false;
+ }
+
+ // apply same size
+ newElement.width = element.width;
+ newElement.height = element.height;
+ }
+
+ newBusinessObject.name = oldBusinessObject.name;
+
+ // retain loop characteristics if the target element is not an event sub process
+ if (!isEventSubProcess(newBusinessObject)) {
+ newBusinessObject.loopCharacteristics = oldBusinessObject.loopCharacteristics;
+ }
+
+ // retain default flow's reference between inclusive <-> exclusive gateways and activities
+ if ((is(oldBusinessObject, 'bpmn:ExclusiveGateway') || is(oldBusinessObject, 'bpmn:InclusiveGateway') ||
+ is(oldBusinessObject, 'bpmn:Activity')) &&
+ (is(newBusinessObject, 'bpmn:ExclusiveGateway') || is(newBusinessObject, 'bpmn:InclusiveGateway') ||
+ is(newBusinessObject, 'bpmn:Activity')))
+ {
+ newBusinessObject.default = oldBusinessObject.default;
+ }
+
+ if (oldBusinessObject.isForCompensation) {
+ newBusinessObject.isForCompensation = true;
+ }
+
+ newElement = replace.replaceElement(element, newElement, hints);
+
+ if (hints.select !== false) {
+ selection.select(newElement);
+ }
+
+ return newElement;
+ }
+
+ this.replaceElement = replaceElement;
+}
+
+BpmnReplace.$inject = [ 'bpmnFactory', 'replace', 'selection', 'modeling' ];
+
+module.exports = BpmnReplace;
+
+},{"377":377,"383":383,"68":68,"70":70}],56:[function(_dereq_,module,exports){
+'use strict';
+
+module.exports.START_EVENT = [
+ {
+ label: 'Start Event',
+ actionName: 'replace-with-none-start',
+ className: 'bpmn-icon-start-event-none',
+ target: {
+ type: 'bpmn:StartEvent'
+ }
+ },
+ {
+ label: 'Intermediate Throw Event',
+ actionName: 'replace-with-none-intermediate-throwing',
+ className: 'bpmn-icon-intermediate-event-none',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent'
+ }
+ },
+ {
+ label: 'End Event',
+ actionName: 'replace-with-none-end',
+ className: 'bpmn-icon-end-event-none',
+ target: {
+ type: 'bpmn:EndEvent'
+ }
+ },
+ {
+ label: 'Message Start Event',
+ actionName: 'replace-with-message-start',
+ className: 'bpmn-icon-start-event-message',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Timer Start Event',
+ actionName: 'replace-with-timer-start',
+ className: 'bpmn-icon-start-event-timer',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition'
+ }
+ },
+ {
+ label: 'Conditional Start Event',
+ actionName: 'replace-with-conditional-start',
+ className: 'bpmn-icon-start-event-condition',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition'
+ }
+ },
+ {
+ label: 'Signal Start Event',
+ actionName: 'replace-with-signal-start',
+ className: 'bpmn-icon-start-event-signal',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ }
+];
+
+module.exports.INTERMEDIATE_EVENT = [
+ {
+ label: 'Start Event',
+ actionName: 'replace-with-none-start',
+ className: 'bpmn-icon-start-event-none',
+ target: {
+ type: 'bpmn:StartEvent'
+ }
+ },
+ {
+ label: 'Intermediate Throw Event',
+ actionName: 'replace-with-none-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-none',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent'
+ }
+ },
+ {
+ label: 'End Event',
+ actionName: 'replace-with-none-end',
+ className: 'bpmn-icon-end-event-none',
+ target: {
+ type: 'bpmn:EndEvent'
+ }
+ },
+ {
+ label: 'Message Intermediate Catch Event',
+ actionName: 'replace-with-message-intermediate-catch',
+ className: 'bpmn-icon-intermediate-event-catch-message',
+ target: {
+ type: 'bpmn:IntermediateCatchEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Message Intermediate Throw Event',
+ actionName: 'replace-with-message-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-throw-message',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Timer Intermediate Catch Event',
+ actionName: 'replace-with-timer-intermediate-catch',
+ className: 'bpmn-icon-intermediate-event-catch-timer',
+ target: {
+ type: 'bpmn:IntermediateCatchEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition'
+ }
+ },
+ {
+ label: 'Escalation Intermediate Throw Event',
+ actionName: 'replace-with-escalation-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-throw-escalation',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition'
+ }
+ },
+ {
+ label: 'Conditional Intermediate Catch Event',
+ actionName: 'replace-with-conditional-intermediate-catch',
+ className: 'bpmn-icon-intermediate-event-catch-condition',
+ target: {
+ type: 'bpmn:IntermediateCatchEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition'
+ }
+ },
+ {
+ label: 'Link Intermediate Catch Event',
+ actionName: 'replace-with-link-intermediate-catch',
+ className: 'bpmn-icon-intermediate-event-catch-link',
+ target: {
+ type: 'bpmn:IntermediateCatchEvent',
+ eventDefinitionType: 'bpmn:LinkEventDefinition'
+ }
+ },
+ {
+ label: 'Link Intermediate Throw Event',
+ actionName: 'replace-with-link-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-throw-link',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent',
+ eventDefinitionType: 'bpmn:LinkEventDefinition'
+ }
+ },
+ {
+ label: 'Compensation Intermediate Throw Event',
+ actionName: 'replace-with-compensation-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-throw-compensation',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent',
+ eventDefinitionType: 'bpmn:CompensateEventDefinition'
+ }
+ },
+ {
+ label: 'Signal Intermediate Catch Event',
+ actionName: 'replace-with-signal-intermediate-catch',
+ className: 'bpmn-icon-intermediate-event-catch-signal',
+ target: {
+ type: 'bpmn:IntermediateCatchEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ },
+ {
+ label: 'Signal Intermediate Throw Event',
+ actionName: 'replace-with-signal-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-throw-signal',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ }
+];
+
+module.exports.END_EVENT = [
+ {
+ label: 'Start Event',
+ actionName: 'replace-with-none-start',
+ className: 'bpmn-icon-start-event-none',
+ target: {
+ type: 'bpmn:StartEvent'
+ }
+ },
+ {
+ label: 'Intermediate Throw Event',
+ actionName: 'replace-with-none-intermediate-throw',
+ className: 'bpmn-icon-intermediate-event-none',
+ target: {
+ type: 'bpmn:IntermediateThrowEvent'
+ }
+ },
+ {
+ label: 'End Event',
+ actionName: 'replace-with-none-end',
+ className: 'bpmn-icon-end-event-none',
+ target: {
+ type: 'bpmn:EndEvent'
+ }
+ },
+ {
+ label: 'Message End Event',
+ actionName: 'replace-with-message-end',
+ className: 'bpmn-icon-end-event-message',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Escalation End Event',
+ actionName: 'replace-with-escalation-end',
+ className: 'bpmn-icon-end-event-escalation',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition'
+ }
+ },
+ {
+ label: 'Error End Event',
+ actionName: 'replace-with-error-end',
+ className: 'bpmn-icon-end-event-error',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:ErrorEventDefinition'
+ }
+ },
+ {
+ label: 'Cancel End Event',
+ actionName: 'replace-with-cancel-end',
+ className: 'bpmn-icon-end-event-cancel',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:CancelEventDefinition'
+ }
+ },
+ {
+ label: 'Compensation End Event',
+ actionName: 'replace-with-compensation-end',
+ className: 'bpmn-icon-end-event-compensation',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:CompensateEventDefinition'
+ }
+ },
+ {
+ label: 'Signal End Event',
+ actionName: 'replace-with-signal-end',
+ className: 'bpmn-icon-end-event-signal',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ },
+ {
+ label: 'Terminate End Event',
+ actionName: 'replace-with-terminate-end',
+ className: 'bpmn-icon-end-event-terminate',
+ target: {
+ type: 'bpmn:EndEvent',
+ eventDefinitionType: 'bpmn:TerminateEventDefinition'
+ }
+ }
+];
+
+module.exports.GATEWAY = [
+ {
+ label: 'Exclusive Gateway',
+ actionName: 'replace-with-exclusive-gateway',
+ className: 'bpmn-icon-gateway-xor',
+ target: {
+ type: 'bpmn:ExclusiveGateway'
+ }
+ },
+ {
+ label: 'Parallel Gateway',
+ actionName: 'replace-with-parallel-gateway',
+ className: 'bpmn-icon-gateway-parallel',
+ target: {
+ type: 'bpmn:ParallelGateway'
+ }
+ },
+ {
+ label: 'Inclusive Gateway',
+ actionName: 'replace-with-inclusive-gateway',
+ className: 'bpmn-icon-gateway-or',
+ target: {
+ type: 'bpmn:InclusiveGateway'
+ }
+ },
+ {
+ label: 'Complex Gateway',
+ actionName: 'replace-with-complex-gateway',
+ className: 'bpmn-icon-gateway-complex',
+ target: {
+ type: 'bpmn:ComplexGateway'
+ }
+ },
+ {
+ label: 'Event based Gateway',
+ actionName: 'replace-with-event-based-gateway',
+ className: 'bpmn-icon-gateway-eventbased',
+ target: {
+ type: 'bpmn:EventBasedGateway',
+ instantiate: false,
+ eventGatewayType: 'Exclusive'
+ }
+ }
+ // Gateways deactivated until https://github.com/bpmn-io/bpmn-js/issues/194
+ // {
+ // label: 'Event based instantiating Gateway',
+ // actionName: 'replace-with-exclusive-event-based-gateway',
+ // className: 'bpmn-icon-exclusive-event-based',
+ // target: {
+ // type: 'bpmn:EventBasedGateway'
+ // },
+ // options: {
+ // businessObject: { instantiate: true, eventGatewayType: 'Exclusive' }
+ // }
+ // },
+ // {
+ // label: 'Parallel Event based instantiating Gateway',
+ // actionName: 'replace-with-parallel-event-based-instantiate-gateway',
+ // className: 'bpmn-icon-parallel-event-based-instantiate-gateway',
+ // target: {
+ // type: 'bpmn:EventBasedGateway'
+ // },
+ // options: {
+ // businessObject: { instantiate: true, eventGatewayType: 'Parallel' }
+ // }
+ // }
+];
+
+module.exports.SUBPROCESS_EXPANDED = [
+ {
+ label: 'Transaction',
+ actionName: 'replace-with-transaction',
+ className: 'bpmn-icon-transaction',
+ target: {
+ type: 'bpmn:Transaction',
+ isExpanded: true
+ }
+ },
+ {
+ label: 'Event Sub Process',
+ actionName: 'replace-with-event-subprocess',
+ className: 'bpmn-icon-event-subprocess-expanded',
+ target: {
+ type: 'bpmn:SubProcess',
+ triggeredByEvent: true,
+ isExpanded: true
+ }
+ }
+];
+
+module.exports.TRANSACTION = [
+ {
+ label: 'Sub Process',
+ actionName: 'replace-with-subprocess',
+ className: 'bpmn-icon-subprocess-expanded',
+ target: {
+ type: 'bpmn:SubProcess',
+ isExpanded: true
+ }
+ },
+ {
+ label: 'Event Sub Process',
+ actionName: 'replace-with-event-subprocess',
+ className: 'bpmn-icon-event-subprocess-expanded',
+ target: {
+ type: 'bpmn:SubProcess',
+ triggeredByEvent: true,
+ isExpanded: true
+ }
+ }
+];
+
+module.exports.EVENT_SUB_PROCESS = [
+ {
+ label: 'Sub Process',
+ actionName: 'replace-with-subprocess',
+ className: 'bpmn-icon-subprocess-expanded',
+ target: {
+ type: 'bpmn:SubProcess',
+ isExpanded: true
+ }
+ },
+ {
+ label: 'Transaction',
+ actionName: 'replace-with-transaction',
+ className: 'bpmn-icon-transaction',
+ target: {
+ type: 'bpmn:Transaction',
+ isExpanded: true
+ }
+ },
+];
+
+module.exports.TASK = [
+ {
+ label: 'Task',
+ actionName: 'replace-with-task',
+ className: 'bpmn-icon-task',
+ target: {
+ type: 'bpmn:Task'
+ }
+ },
+ {
+ label: 'Send Task',
+ actionName: 'replace-with-send-task',
+ className: 'bpmn-icon-send',
+ target: {
+ type: 'bpmn:SendTask'
+ }
+ },
+ {
+ label: 'Receive Task',
+ actionName: 'replace-with-receive-task',
+ className: 'bpmn-icon-receive',
+ target: {
+ type: 'bpmn:ReceiveTask'
+ }
+ },
+ {
+ label: 'User Task',
+ actionName: 'replace-with-user-task',
+ className: 'bpmn-icon-user',
+ target: {
+ type: 'bpmn:UserTask'
+ }
+ },
+ {
+ label: 'Manual Task',
+ actionName: 'replace-with-manual-task',
+ className: 'bpmn-icon-manual',
+ target: {
+ type: 'bpmn:ManualTask'
+ }
+ },
+ {
+ label: 'Business Rule Task',
+ actionName: 'replace-with-rule-task',
+ className: 'bpmn-icon-business-rule',
+ target: {
+ type: 'bpmn:BusinessRuleTask'
+ }
+ },
+ {
+ label: 'Service Task',
+ actionName: 'replace-with-service-task',
+ className: 'bpmn-icon-service',
+ target: {
+ type: 'bpmn:ServiceTask'
+ }
+ },
+ {
+ label: 'Script Task',
+ actionName: 'replace-with-script-task',
+ className: 'bpmn-icon-script',
+ target: {
+ type: 'bpmn:ScriptTask'
+ }
+ },
+ {
+ label: 'Call Activity',
+ actionName: 'replace-with-call-activity',
+ className: 'bpmn-icon-call-activity',
+ target: {
+ type: 'bpmn:CallActivity'
+ }
+ },
+ {
+ label: 'Sub Process (collapsed)',
+ actionName: 'replace-with-collapsed-subprocess',
+ className: 'bpmn-icon-subprocess-collapsed',
+ target: {
+ type: 'bpmn:SubProcess',
+ isExpanded: false
+ }
+ }
+];
+
+module.exports.BOUNDARY_EVENT = [
+ {
+ label: 'Message Boundary Event',
+ actionName: 'replace-with-message-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-message',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Timer Boundary Event',
+ actionName: 'replace-with-timer-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-timer',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition'
+ }
+ },
+ {
+ label: 'Escalation Boundary Event',
+ actionName: 'replace-with-escalation-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-escalation',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition'
+ }
+ },
+ {
+ label: 'Conditional Boundary Event',
+ actionName: 'replace-with-conditional-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-condition',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition'
+ }
+ },
+ {
+ label: 'Error Boundary Event',
+ actionName: 'replace-with-error-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-error',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:ErrorEventDefinition'
+ }
+ },
+ {
+ label: 'Cancel Boundary Event',
+ actionName: 'replace-with-cancel-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-cancel',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:CancelEventDefinition'
+ }
+ },
+ {
+ label: 'Signal Boundary Event',
+ actionName: 'replace-with-signal-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-signal',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ },
+ {
+ label: 'Compensation Boundary Event',
+ actionName: 'replace-with-compensation-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-compensation',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:CompensateEventDefinition'
+ }
+ },
+ {
+ label: 'Message Boundary Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-message-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-non-interrupting-message',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition',
+ cancelActivity: false
+ }
+ },
+ {
+ label: 'Timer Boundary Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-timer-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-non-interrupting-timer',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition',
+ cancelActivity: false
+ }
+ },
+ {
+ label: 'Escalation Boundary Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-escalation-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-non-interrupting-escalation',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition',
+ cancelActivity: false
+ }
+ },
+ {
+ label: 'Conditional Boundary Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-conditional-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-non-interrupting-condition',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition',
+ cancelActivity: false
+ }
+ },
+ {
+ label: 'Signal Boundary Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-signal-boundary',
+ className: 'bpmn-icon-intermediate-event-catch-non-interrupting-signal',
+ target: {
+ type: 'bpmn:BoundaryEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition',
+ cancelActivity: false
+ }
+ },
+];
+
+module.exports.EVENT_SUB_PROCESS_START_EVENT = [
+ {
+ label: 'Message Start Event',
+ actionName: 'replace-with-message-start',
+ className: 'bpmn-icon-start-event-message',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
+ }
+ },
+ {
+ label: 'Timer Start Event',
+ actionName: 'replace-with-timer-start',
+ className: 'bpmn-icon-start-event-timer',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition'
+ }
+ },
+ {
+ label: 'Conditional Start Event',
+ actionName: 'replace-with-conditional-start',
+ className: 'bpmn-icon-start-event-condition',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition'
+ }
+ },
+ {
+ label: 'Signal Start Event',
+ actionName: 'replace-with-signal-start',
+ className: 'bpmn-icon-start-event-signal',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition'
+ }
+ },
+ {
+ label: 'Error Start Event',
+ actionName: 'replace-with-error-start',
+ className: 'bpmn-icon-start-event-error',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:ErrorEventDefinition'
+ }
+ },
+ {
+ label: 'Escalation Start Event',
+ actionName: 'replace-with-escalation-start',
+ className: 'bpmn-icon-start-event-escalation',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition'
+ }
+ },
+ {
+ label: 'Compensation Start Event',
+ actionName: 'replace-with-compensation-start',
+ className: 'bpmn-icon-start-event-compensation',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:CompensateEventDefinition'
+ }
+ },
+ {
+ label: 'Message Start Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-message-start',
+ className: 'bpmn-icon-start-event-non-interrupting-message',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:MessageEventDefinition',
+ isInterrupting: false
+ }
+ },
+ {
+ label: 'Timer Start Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-timer-start',
+ className: 'bpmn-icon-start-event-non-interrupting-timer',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:TimerEventDefinition',
+ isInterrupting: false
+ }
+ },
+ {
+ label: 'Conditional Start Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-conditional-start',
+ className: 'bpmn-icon-start-event-non-interrupting-condition',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:ConditionalEventDefinition',
+ isInterrupting: false
+ }
+ },
+ {
+ label: 'Signal Start Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-signal-start',
+ className: 'bpmn-icon-start-event-non-interrupting-signal',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:SignalEventDefinition',
+ isInterrupting: false
+ }
+ },
+ {
+ label: 'Escalation Start Event (non-interrupting)',
+ actionName: 'replace-with-non-interrupting-escalation-start',
+ className: 'bpmn-icon-start-event-non-interrupting-escalation',
+ target: {
+ type: 'bpmn:StartEvent',
+ eventDefinitionType: 'bpmn:EscalationEventDefinition',
+ isInterrupting: false
+ }
+ },
+];
+
+module.exports.SEQUENCE_FLOW = [
+ {
+ label: 'Sequence Flow',
+ actionName: 'replace-with-sequence-flow',
+ className: 'bpmn-icon-connection'
+ },
+ {
+ label: 'Default Flow',
+ actionName: 'replace-with-default-flow',
+ className: 'bpmn-icon-default-flow'
+ },
+ {
+ label: 'Conditional Flow',
+ actionName: 'replace-with-conditional-flow',
+ className: 'bpmn-icon-conditional-flow'
+ }
+];
+
+module.exports.PARTICIPANT = [
+ {
+ label: 'Expanded Pool',
+ actionName: 'replace-with-expanded-pool',
+ className: 'bpmn-icon-participant',
+ target: {
+ type: 'bpmn:Participant',
+ isExpanded: true
+ }
+ },
+ {
+ label: 'Collapsed Pool',
+ actionName: 'replace-with-collapsed-pool',
+ // TODO(@janstuemmel): maybe design new icon
+ className: 'bpmn-icon-lane',
+ target: {
+ type: 'bpmn:Participant',
+ isExpanded: false
+ }
+ }
+];
+
+},{}],57:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(177),
+ _dereq_(189)
+ ],
+ bpmnReplace: [ 'type', _dereq_(55) ]
+};
+},{"177":177,"189":189,"55":55}],58:[function(_dereq_,module,exports){
+'use strict';
+
+var find = _dereq_(254),
+ any = _dereq_(251),
+ filter = _dereq_(253),
+ forEach = _dereq_(255),
+ inherits = _dereq_(243);
+
+var getParents = _dereq_(45).getParents,
+ is = _dereq_(70).is,
+ isAny = _dereq_(45).isAny,
+ getBusinessObject = _dereq_(70).getBusinessObject,
+ isExpanded = _dereq_(68).isExpanded,
+ isEventSubProcess = _dereq_(68).isEventSubProcess,
+ isInterrupting = _dereq_(68).isInterrupting;
+
+
+var RuleProvider = _dereq_(183);
+
+var isBoundaryAttachment = _dereq_(61).getBoundaryAttachment;
+
+/**
+ * BPMN specific modeling rule
+ */
+function BpmnRules(eventBus) {
+ RuleProvider.call(this, eventBus);
+}
+
+inherits(BpmnRules, RuleProvider);
+
+BpmnRules.$inject = [ 'eventBus' ];
+
+module.exports = BpmnRules;
+
+BpmnRules.prototype.init = function() {
+
+ this.addRule('connection.create', function(context) {
+ var source = context.source,
+ target = context.target;
+
+ return canConnect(source, target);
+ });
+
+ this.addRule('connection.reconnectStart', function(context) {
+
+ var connection = context.connection,
+ source = context.hover || context.source,
+ target = connection.target;
+
+ return canConnect(source, target, connection);
+ });
+
+ this.addRule('connection.reconnectEnd', function(context) {
+
+ var connection = context.connection,
+ source = connection.source,
+ target = context.hover || context.target;
+
+ return canConnect(source, target, connection);
+ });
+
+ this.addRule('connection.updateWaypoints', function(context) {
+ // OK! but visually ignore
+ return null;
+ });
+
+ this.addRule('shape.resize', function(context) {
+
+ var shape = context.shape,
+ newBounds = context.newBounds;
+
+ return canResize(shape, newBounds);
+ });
+
+ this.addRule('elements.move', function(context) {
+
+ var target = context.target,
+ shapes = context.shapes,
+ position = context.position;
+
+ return canAttach(shapes, target, null, position) ||
+ canReplace(shapes, target, position) ||
+ canMove(shapes, target, position);
+ });
+
+ this.addRule([ 'shape.create', 'shape.append' ], function(context) {
+ var target = context.target,
+ shape = context.shape,
+ source = context.source,
+ position = context.position;
+
+ return canAttach([ shape ], target, source, position) || canCreate(shape, target, source, position);
+ });
+
+ this.addRule([ 'elements.delete' ], function(context) {
+
+ // do not allow deletion of labels
+ return filter(context.elements, function(e) {
+ return !isLabel(e);
+ });
+ });
+};
+
+BpmnRules.prototype.canConnectMessageFlow = canConnectMessageFlow;
+
+BpmnRules.prototype.canConnectSequenceFlow = canConnectSequenceFlow;
+
+BpmnRules.prototype.canConnectDataAssociation = canConnectDataAssociation;
+
+BpmnRules.prototype.canConnectAssociation = canConnectAssociation;
+
+BpmnRules.prototype.canMove = canMove;
+
+BpmnRules.prototype.canAttach = canAttach;
+
+BpmnRules.prototype.canReplace = canReplace;
+
+BpmnRules.prototype.canDrop = canDrop;
+
+BpmnRules.prototype.canInsert = canInsert;
+
+BpmnRules.prototype.canCreate = canCreate;
+
+BpmnRules.prototype.canConnect = canConnect;
+
+BpmnRules.prototype.canResize = canResize;
+
+/**
+ * Utility functions for rule checking
+ */
+
+function nonExistantOrLabel(element) {
+ return !element || isLabel(element);
+}
+
+function isSame(a, b) {
+ return a === b;
+}
+
+function getOrganizationalParent(element) {
+
+ var bo = getBusinessObject(element);
+
+ while (bo && !is(bo, 'bpmn:Process')) {
+ if (is(bo, 'bpmn:Participant')) {
+ return bo.processRef || bo;
+ }
+
+ bo = bo.$parent;
+ }
+
+ return bo;
+}
+
+function isTextAnnotation(element) {
+ return is(element, 'bpmn:TextAnnotation');
+}
+
+function isCompensationBoundary(element) {
+ return is(element, 'bpmn:BoundaryEvent') &&
+ hasEventDefinition(element, 'bpmn:CompensateEventDefinition');
+}
+
+function isForCompensation(e) {
+ return getBusinessObject(e).isForCompensation;
+}
+
+function isSameOrganization(a, b) {
+ var parentA = getOrganizationalParent(a),
+ parentB = getOrganizationalParent(b);
+
+ return parentA === parentB;
+}
+
+function isMessageFlowSource(element) {
+ return is(element, 'bpmn:InteractionNode') &&
+ !isForCompensation(element) && (
+ !is(element, 'bpmn:Event') || (
+ is(element, 'bpmn:ThrowEvent') &&
+ hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')
+ )
+ );
+}
+
+function isMessageFlowTarget(element) {
+ return is(element, 'bpmn:InteractionNode') &&
+ !isForCompensation(element) && (
+ !is(element, 'bpmn:Event') || (
+ is(element, 'bpmn:CatchEvent') &&
+ hasEventDefinitionOrNone(element, 'bpmn:MessageEventDefinition')
+ )
+ );
+}
+
+function getScopeParent(element) {
+
+ var bo = getBusinessObject(element);
+
+ if (is(bo, 'bpmn:Participant')) {
+ return null;
+ }
+
+ while (bo) {
+ bo = bo.$parent;
+
+ if (is(bo, 'bpmn:FlowElementsContainer')) {
+ return bo;
+ }
+ }
+
+ return bo;
+}
+
+function isSameScope(a, b) {
+ var scopeParentA = getScopeParent(a),
+ scopeParentB = getScopeParent(b);
+
+ return scopeParentA && (scopeParentA === scopeParentB);
+}
+
+function hasEventDefinition(element, eventDefinition) {
+ var bo = getBusinessObject(element);
+
+ return !!find(bo.eventDefinitions || [], function(definition) {
+ return is(definition, eventDefinition);
+ });
+}
+
+function hasEventDefinitionOrNone(element, eventDefinition) {
+ var bo = getBusinessObject(element);
+
+ return (bo.eventDefinitions || []).every(function(definition) {
+ return is(definition, eventDefinition);
+ });
+}
+
+function isSequenceFlowSource(element) {
+ return is(element, 'bpmn:FlowNode') &&
+ !is(element, 'bpmn:EndEvent') &&
+ !isEventSubProcess(element) &&
+ !(is(element, 'bpmn:IntermediateThrowEvent') &&
+ hasEventDefinition(element, 'bpmn:LinkEventDefinition')
+ ) &&
+ !isCompensationBoundary(element) &&
+ !isForCompensation(element);
+}
+
+function isSequenceFlowTarget(element) {
+ return is(element, 'bpmn:FlowNode') &&
+ !is(element, 'bpmn:StartEvent') &&
+ !is(element, 'bpmn:BoundaryEvent') &&
+ !isEventSubProcess(element) &&
+ !(is(element, 'bpmn:IntermediateCatchEvent') &&
+ hasEventDefinition(element, 'bpmn:LinkEventDefinition')
+ ) &&
+ !isForCompensation(element);
+
+}
+
+function isEventBasedTarget(element) {
+ return is(element, 'bpmn:ReceiveTask') || (
+ is(element, 'bpmn:IntermediateCatchEvent') && (
+ hasEventDefinition(element, 'bpmn:MessageEventDefinition') ||
+ hasEventDefinition(element, 'bpmn:TimerEventDefinition') ||
+ hasEventDefinition(element, 'bpmn:ConditionalEventDefinition') ||
+ hasEventDefinition(element, 'bpmn:SignalEventDefinition')
+ )
+ );
+}
+
+function isLabel(element) {
+ return element.labelTarget;
+}
+
+function isConnection(element) {
+ return element.waypoints;
+}
+
+function isParent(possibleParent, element) {
+ var allParents = getParents(element);
+ return allParents.indexOf(possibleParent) !== -1;
+}
+
+function canConnect(source, target, connection) {
+
+ if (nonExistantOrLabel(source) || nonExistantOrLabel(target)) {
+ return null;
+ }
+
+ // See https://github.com/bpmn-io/bpmn-js/issues/178
+ // as a workround we disallow connections with same
+ // target and source element.
+ // This rule must be removed if a auto layout for this
+ // connections is implemented.
+ if (isSame(source, target)) {
+ return false;
+ }
+
+ if (!is(connection, 'bpmn:DataAssociation')) {
+
+ if (canConnectMessageFlow(source, target)) {
+ return { type: 'bpmn:MessageFlow' };
+ }
+
+ if (canConnectSequenceFlow(source, target)) {
+ return { type: 'bpmn:SequenceFlow' };
+ }
+ }
+
+ var connectDataAssociation = canConnectDataAssociation(source, target);
+
+ if (connectDataAssociation) {
+ return connectDataAssociation;
+ }
+
+ if (isCompensationBoundary(source) && isForCompensation(target)) {
+ return {
+ type: 'bpmn:Association',
+ associationDirection: 'One'
+ };
+ }
+
+ if (is(connection, 'bpmn:Association') && canConnectAssociation(source, target)) {
+
+ return {
+ type: 'bpmn:Association'
+ };
+ }
+
+ if (isTextAnnotation(source) || isTextAnnotation(target)) {
+
+ return {
+ type: 'bpmn:Association'
+ };
+ }
+
+ return false;
+}
+
+/**
+ * Can an element be dropped into the target element
+ *
+ * @return {Boolean}
+ */
+function canDrop(element, target, position) {
+
+ // can move labels everywhere
+ if (isLabel(element) && !isConnection(target)) {
+ return true;
+ }
+
+ // disallow to create elements on collapsed pools
+ if (is(target, 'bpmn:Participant') && !isExpanded(target)) {
+ return false;
+ }
+
+ // allow to create new participants on
+ // on existing collaboration and process diagrams
+ if (is(element, 'bpmn:Participant')) {
+ return is(target, 'bpmn:Process') || is(target, 'bpmn:Collaboration');
+ }
+
+ // allow creating lanes on participants and other lanes only
+ if (is(element, 'bpmn:Lane')) {
+ return is(target, 'bpmn:Participant') || is(target, 'bpmn:Lane');
+ }
+
+ if (is(element, 'bpmn:BoundaryEvent')) {
+ return false;
+ }
+
+ // drop flow elements onto flow element containers
+ // and participants
+ if (is(element, 'bpmn:FlowElement') || is(element, 'bpmn:DataAssociation')) {
+ if (is(target, 'bpmn:FlowElementsContainer')) {
+ return isExpanded(target);
+ }
+
+ return isAny(target, [ 'bpmn:Participant', 'bpmn:Lane' ]);
+ }
+
+ if (is(element, 'bpmn:Artifact')) {
+ return isAny(target, [
+ 'bpmn:Collaboration',
+ 'bpmn:Lane',
+ 'bpmn:Participant',
+ 'bpmn:Process',
+ 'bpmn:SubProcess' ]);
+ }
+
+ if (is(element, 'bpmn:MessageFlow')) {
+ return is(target, 'bpmn:Collaboration');
+ }
+
+ return false;
+}
+
+function isBoundaryEvent(element) {
+ return !isLabel(element) && is(element, 'bpmn:BoundaryEvent');
+}
+
+function isLane(element) {
+ return is(element, 'bpmn:Lane');
+}
+
+/**
+ * We treat IntermediateThrowEvents as boundary events during create,
+ * this must be reflected in the rules.
+ */
+function isBoundaryCandidate(element) {
+ return isBoundaryEvent(element) ||
+ (is(element, 'bpmn:IntermediateThrowEvent') && !element.parent);
+}
+
+
+function canAttach(elements, target, source, position) {
+
+ if (!Array.isArray(elements)) {
+ elements = [ elements ];
+ }
+
+ // disallow appending as boundary event
+ if (source) {
+ return false;
+ }
+
+ // only (re-)attach one element at a time
+ if (elements.length !== 1) {
+ return false;
+ }
+
+ var element = elements[0];
+
+ // do not attach labels
+ if (isLabel(element)) {
+ return false;
+ }
+
+ // only handle boundary events
+ if (!isBoundaryCandidate(element)) {
+ return false;
+ }
+
+ // allow default move operation
+ if (!target) {
+ return true;
+ }
+
+ // disallow drop on event sub processes
+ if (isEventSubProcess(target)) {
+ return false;
+ }
+
+ // only allow drop on non compensation activities
+ if (!is(target, 'bpmn:Activity') || isForCompensation(target)) {
+ return false;
+ }
+
+ // only attach to subprocess border
+ if (position && !isBoundaryAttachment(position, target)) {
+ return false;
+ }
+
+ return 'attach';
+}
+
+
+/**
+ * Defines how to replace elements for a given target.
+ *
+ * Returns an array containing all elements which will be replaced.
+ *
+ * @example
+ *
+ * [{ id: 'IntermediateEvent_2',
+ * type: 'bpmn:StartEvent'
+ * },
+ * { id: 'IntermediateEvent_5',
+ * type: 'bpmn:EndEvent'
+ * }]
+ *
+ * @param {Array} elements
+ * @param {Object} target
+ *
+ * @return {Object} an object containing all elements which have to be replaced
+ */
+function canReplace(elements, target, position) {
+
+ if (!target) {
+ return false;
+ }
+
+ var canExecute = {
+ replacements: []
+ };
+
+ forEach(elements, function(element) {
+
+ // replace a non-interrupting start event by a blank interrupting start event
+ // when the target is not an event sub process
+ if (!isEventSubProcess(target)) {
+
+ if (is(element, 'bpmn:StartEvent') &&
+ !isInterrupting(element) &&
+ element.type !== 'label' &&
+ canDrop(element, target)) {
+
+ canExecute.replacements.push({
+ oldElementId: element.id,
+ newElementType: 'bpmn:StartEvent'
+ });
+ }
+ }
+
+ if (!is(target, 'bpmn:Transaction')) {
+ if (hasEventDefinition(element, 'bpmn:CancelEventDefinition') &&
+ element.type !== 'label') {
+
+ if (is(element, 'bpmn:EndEvent') && canDrop(element, target)) {
+ canExecute.replacements.push({
+ oldElementId: element.id,
+ newElementType: 'bpmn:EndEvent'
+ });
+ }
+
+ if (is(element, 'bpmn:BoundaryEvent') && canAttach(element, target, null, position)) {
+ canExecute.replacements.push({
+ oldElementId: element.id,
+ newElementType: 'bpmn:BoundaryEvent'
+ });
+ }
+ }
+ }
+ });
+
+ return canExecute.replacements.length ? canExecute : false;
+}
+
+function canMove(elements, target) {
+
+ // do not move selection containing boundary events
+ if (any(elements, isBoundaryEvent)) {
+ return false;
+ }
+
+ // do not move selection containing lanes
+ if (any(elements, isLane)) {
+ return false;
+ }
+
+ // allow default move check to start move operation
+ if (!target) {
+ return true;
+ }
+
+ return elements.every(function(element) {
+ return canDrop(element, target);
+ });
+}
+
+function canCreate(shape, target, source, position) {
+
+ if (!target) {
+ return false;
+ }
+
+ if (isLabel(target)) {
+ return null;
+ }
+
+ if (isSame(source, target)) {
+ return false;
+ }
+
+ // ensure we do not drop the element
+ // into source
+ if (source && isParent(source, target)) {
+ return false;
+ }
+
+ return canDrop(shape, target, position) || canInsert(shape, target, position);
+}
+
+function canResize(shape, newBounds) {
+ if (is(shape, 'bpmn:SubProcess')) {
+ return (!!isExpanded(shape)) && (
+ !newBounds || (newBounds.width >= 100 && newBounds.height >= 80)
+ );
+ }
+
+ if (is(shape, 'bpmn:Lane')) {
+ return !newBounds || (newBounds.width >= 130 && newBounds.height >= 60);
+ }
+
+ if (is(shape, 'bpmn:Participant')) {
+ return !newBounds || (newBounds.width >= 250 && newBounds.height >= 50);
+ }
+
+ if (isTextAnnotation(shape)) {
+ return true;
+ }
+
+ return false;
+}
+
+function canConnectAssociation(source, target) {
+
+ // do not connect connections
+ if (isConnection(source) || isConnection(target)) {
+ return false;
+ }
+
+ // connect if different parent
+ return !isParent(target, source) &&
+ !isParent(source, target);
+}
+
+function canConnectMessageFlow(source, target) {
+
+ return isMessageFlowSource(source) &&
+ isMessageFlowTarget(target) &&
+ !isSameOrganization(source, target);
+}
+
+function canConnectSequenceFlow(source, target) {
+
+ return isSequenceFlowSource(source) &&
+ isSequenceFlowTarget(target) &&
+ isSameScope(source, target) &&
+ !(is(source, 'bpmn:EventBasedGateway') && !isEventBasedTarget(target));
+}
+
+
+function canConnectDataAssociation(source, target) {
+
+ if (isAny(source, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&
+ isAny(target, [ 'bpmn:Activity', 'bpmn:ThrowEvent' ])) {
+ return { type: 'bpmn:DataInputAssociation' };
+ }
+
+ if (isAny(target, [ 'bpmn:DataObjectReference', 'bpmn:DataStoreReference' ]) &&
+ isAny(source, [ 'bpmn:Activity', 'bpmn:CatchEvent' ])) {
+ return { type: 'bpmn:DataOutputAssociation' };
+ }
+
+ return false;
+}
+
+function canInsert(shape, flow, position) {
+
+ // return true if we can drop on the
+ // underlying flow parent
+ //
+ // at this point we are not really able to talk
+ // about connection rules (yet)
+ return (
+ isAny(flow, [ 'bpmn:SequenceFlow', 'bpmn:MessageFlow' ]) &&
+ is(shape, 'bpmn:FlowNode') &&
+ !is(shape, 'bpmn:BoundaryEvent') &&
+ canDrop(shape, flow.parent, position));
+}
+
+},{"183":183,"243":243,"251":251,"253":253,"254":254,"255":255,"45":45,"61":61,"68":68,"70":70}],59:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(185)
+ ],
+ __init__: [ 'bpmnRules' ],
+ bpmnRules: [ 'type', _dereq_(58) ]
+};
+
+},{"185":185,"58":58}],60:[function(_dereq_,module,exports){
+'use strict';
+
+var inherits = _dereq_(243);
+
+var forEach = _dereq_(255);
+
+var getBoundingBox = _dereq_(221).getBBox;
+
+var is = _dereq_(70).is,
+ isAny = _dereq_(45).isAny,
+ isExpanded = _dereq_(68).isExpanded;
+
+var Snapping = _dereq_(192),
+ SnapUtil = _dereq_(191);
+
+var asTRBL = _dereq_(208).asTRBL;
+
+var round = Math.round;
+
+var mid = SnapUtil.mid,
+ topLeft = SnapUtil.topLeft,
+ bottomRight = SnapUtil.bottomRight,
+ isSnapped = SnapUtil.isSnapped,
+ setSnapped = SnapUtil.setSnapped;
+
+var getBoundaryAttachment = _dereq_(61).getBoundaryAttachment,
+ getParticipantSizeConstraints = _dereq_(61).getParticipantSizeConstraints,
+ getLanesRoot = _dereq_(44).getLanesRoot;
+
+
+/**
+ * BPMN specific snapping functionality
+ *
+ * * snap on process elements if a pool is created inside a
+ * process diagram
+ *
+ * @param {EventBus} eventBus
+ * @param {Canvas} canvas
+ */
+function BpmnSnapping(eventBus, canvas, bpmnRules, elementRegistry) {
+
+ // instantiate super
+ Snapping.call(this, eventBus, canvas);
+
+
+ /**
+ * Drop participant on process <> process elements snapping
+ */
+ eventBus.on('create.start', function(event) {
+
+ var context = event.context,
+ shape = context.shape,
+ rootElement = canvas.getRootElement();
+
+ // snap participant around existing elements (if any)
+ if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
+ initParticipantSnapping(context, shape, rootElement.children);
+ }
+ });
+
+ eventBus.on([ 'create.move', 'create.end' ], 1500, function(event) {
+
+ var context = event.context,
+ shape = context.shape,
+ participantSnapBox = context.participantSnapBox;
+
+ if (!isSnapped(event) && participantSnapBox) {
+ snapParticipant(participantSnapBox, shape, event);
+ }
+ });
+
+ eventBus.on('shape.move.start', function(event) {
+
+ var context = event.context,
+ shape = context.shape,
+ rootElement = canvas.getRootElement();
+
+ // snap participant around existing elements (if any)
+ if (is(shape, 'bpmn:Participant') && is(rootElement, 'bpmn:Process')) {
+ initParticipantSnapping(context, shape, rootElement.children);
+ }
+ });
+
+
+ function canAttach(shape, target, position) {
+ return bpmnRules.canAttach([ shape ], target, null, position) === 'attach';
+ }
+
+ /**
+ * Snap boundary events to elements border
+ */
+ eventBus.on([
+ 'create.move',
+ 'create.end',
+ 'shape.move.move',
+ 'shape.move.end'
+ ], 1500, function(event) {
+
+ var context = event.context,
+ target = context.target,
+ shape = context.shape;
+
+ if (target && !isSnapped(event) && canAttach(shape, target, event)) {
+ snapBoundaryEvent(event, shape, target);
+ }
+ });
+
+ /**
+ * Adjust parent for flowElements to the target participant
+ * when droping onto lanes.
+ */
+ eventBus.on([
+ 'shape.move.hover',
+ 'shape.move.move',
+ 'shape.move.end',
+ 'create.hover',
+ 'create.move',
+ 'create.end'
+ ], 1500, function(event) {
+ var context = event.context,
+ shape = context.shape,
+ hover = event.hover;
+
+ if (is(hover, 'bpmn:Lane') && !isAny(shape, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
+ event.hover = getLanesRoot(hover);
+ event.hoverGfx = elementRegistry.getGraphics(event.hover);
+ }
+ });
+
+
+ var abs = Math.abs;
+
+ var filter = _dereq_(253),
+ assign = _dereq_(377);
+
+
+ eventBus.on([
+ 'create.move',
+ 'shape.move.move'
+ ], function(event) {
+
+ var context = event.context,
+ shape = context.shape,
+ target = context.target;
+
+ var threshold = 30;
+
+ if (is(shape, 'bpmn:Lane')) {
+ if (isAny(target, [ 'bpmn:Lane', 'bpmn:Participant' ])) {
+
+ var childLanes = filter(target.children, function(c) {
+ return is(c, 'bpmn:Lane');
+ });
+
+ var y = event.y,
+ targetTrbl;
+
+ var insert = childLanes.reduce(function(insert, l) {
+
+ var laneTrbl = asTRBL(l);
+
+ if (abs(laneTrbl.top - y) < threshold) {
+ insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
+ } else
+ if (abs(laneTrbl.bottom - y) < threshold) {
+ insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
+ } else
+ if (laneTrbl.top < y && laneTrbl.bottom > y) {
+ if (abs(laneTrbl.top - y) > abs(laneTrbl.bottom - y)) {
+ insert = assign(insert || {}, { after: { element: l, y: laneTrbl.bottom } });
+ } else {
+ insert = assign(insert || {}, { before: { element: l, y: laneTrbl.top } });
+ }
+
+ }
+
+ return insert;
+ }, false);
+
+
+ if (!insert) {
+ targetTrbl = asTRBL(target);
+
+ if (abs(targetTrbl.top - y) < threshold) {
+ insert = { before: { element: target, y: targetTrbl.top } };
+ } else
+ if (abs(targetTrbl.bottom - y) < threshold) {
+ insert = { after: { element: target, y: targetTrbl.bottom } };
+ } else {
+ insert = { into: { element: target, y: (targetTrbl.top + targetTrbl.bottom) / 2 } };
+ }
+
+ }
+
+ if (insert.before && insert.after) {
+ console.log('insert between', insert.before.element.id, 'and', insert.after.element.id);
+ setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
+ setSnapped(event, 'y', insert.before.y);
+ } else
+ if (insert.after) {
+ console.log('insert after', insert.after.element.id);
+ setSnapped(event, 'x', insert.after.element.x + insert.after.element.width / 2);
+ setSnapped(event, 'y', insert.after.y);
+ } else
+ if (insert.before) {
+ console.log('insert before', insert.before.element.id);
+ setSnapped(event, 'x', insert.before.element.x + insert.before.element.width / 2);
+ setSnapped(event, 'y', insert.before.y);
+ } else
+ if (insert.into) {
+ console.log('insert into', insert.into.element.id);
+ setSnapped(event, 'x', insert.into.element.x + insert.into.element.width / 2);
+ setSnapped(event, 'y', insert.into.y);
+ }
+ }
+ }
+
+ });
+
+ eventBus.on('resize.start', 1500, function(event) {
+ var context = event.context,
+ shape = context.shape;
+
+ if (is(shape, 'bpmn:SubProcess') && isExpanded(shape)) {
+ context.minDimensions = { width: 140, height: 120 };
+ }
+
+ if (is(shape, 'bpmn:Participant')) {
+ context.minDimensions = { width: 300, height: 150 };
+ }
+
+ if (is(shape, 'bpmn:Lane') || is(shape, 'bpmn:Participant')) {
+ context.resizeConstraints = getParticipantSizeConstraints(shape, context.direction, context.balanced);
+ }
+
+ if (is(shape, 'bpmn:TextAnnotation')) {
+ context.minDimensions = { width: 50, height: 30 };
+ }
+ });
+
+}
+
+inherits(BpmnSnapping, Snapping);
+
+BpmnSnapping.$inject = [ 'eventBus', 'canvas', 'bpmnRules', 'elementRegistry' ];
+
+module.exports = BpmnSnapping;
+
+
+BpmnSnapping.prototype.initSnap = function(event) {
+
+ var context = event.context,
+ shape = event.shape,
+ shapeMid,
+ shapeBounds,
+ shapeTopLeft,
+ shapeBottomRight,
+ snapContext;
+
+
+ snapContext = Snapping.prototype.initSnap.call(this, event);
+
+ if (is(shape, 'bpmn:Participant')) {
+ // assign higher priority for outer snaps on participants
+ snapContext.setSnapLocations([ 'top-left', 'bottom-right', 'mid' ]);
+ }
+
+
+ if (shape) {
+
+ shapeMid = mid(shape, event);
+
+ shapeBounds = {
+ width: shape.width,
+ height: shape.height,
+ x: isNaN(shape.x) ? round(shapeMid.x - shape.width / 2) : shape.x,
+ y: isNaN(shape.y) ? round(shapeMid.y - shape.height / 2) : shape.y,
+ };
+
+ shapeTopLeft = topLeft(shapeBounds);
+ shapeBottomRight = bottomRight(shapeBounds);
+
+ snapContext.setSnapOrigin('top-left', {
+ x: shapeTopLeft.x - event.x,
+ y: shapeTopLeft.y - event.y
+ });
+
+ snapContext.setSnapOrigin('bottom-right', {
+ x: shapeBottomRight.x - event.x,
+ y: shapeBottomRight.y - event.y
+ });
+
+ forEach(shape.outgoing, function(c) {
+ var docking = c.waypoints[0];
+
+ docking = docking.original || docking;
+
+ snapContext.setSnapOrigin(c.id + '-docking', {
+ x: docking.x - event.x,
+ y: docking.y - event.y
+ });
+ });
+
+ forEach(shape.incoming, function(c) {
+ var docking = c.waypoints[c.waypoints.length - 1];
+
+ docking = docking.original || docking;
+
+ snapContext.setSnapOrigin(c.id + '-docking', {
+ x: docking.x - event.x,
+ y: docking.y - event.y
+ });
+ });
+
+ }
+
+ var source = context.source;
+
+ if (source) {
+ snapContext.addDefaultSnap('mid', mid(source));
+ }
+};
+
+
+BpmnSnapping.prototype.addTargetSnaps = function(snapPoints, shape, target) {
+
+ // use target parent as snap target
+ if (is(shape, 'bpmn:BoundaryEvent') && shape.type !== 'label') {
+ target = target.parent;
+ }
+
+ // add sequence flow parents as snap targets
+ if (is(target, 'bpmn:SequenceFlow')) {
+ this.addTargetSnaps(snapPoints, shape, target.parent);
+ }
+
+ var siblings = this.getSiblings(shape, target) || [];
+
+ forEach(siblings, function(s) {
+
+ // do not snap to lanes
+ if (is(s, 'bpmn:Lane')) {
+ return;
+ }
+
+ snapPoints.add('mid', mid(s));
+
+ if (is(s, 'bpmn:Participant')) {
+ snapPoints.add('top-left', topLeft(s));
+ snapPoints.add('bottom-right', bottomRight(s));
+ }
+ });
+
+
+ forEach(shape.incoming, function(c) {
+
+ if (siblings.indexOf(c.source) === -1) {
+ snapPoints.add('mid', mid(c.source));
+ }
+
+ var docking = c.waypoints[0];
+ snapPoints.add(c.id + '-docking', docking.original || docking);
+ });
+
+
+ forEach(shape.outgoing, function(c) {
+
+ if (siblings.indexOf(c.target) === -1) {
+ snapPoints.add('mid', mid(c.target));
+ }
+
+ var docking = c.waypoints[c.waypoints.length - 1];
+ snapPoints.add(c.id + '-docking', docking.original || docking);
+ });
+};
+
+
+/////// participant snapping //////////////////
+
+function initParticipantSnapping(context, shape, elements) {
+
+ if (!elements.length) {
+ return;
+ }
+
+ var snapBox = getBoundingBox(elements.filter(function(e) {
+ return !e.labelTarget && !e.waypoints;
+ }));
+
+ snapBox.x -= 50;
+ snapBox.y -= 20;
+ snapBox.width += 70;
+ snapBox.height += 40;
+
+ // adjust shape height to include bounding box
+ shape.width = Math.max(shape.width, snapBox.width);
+ shape.height = Math.max(shape.height, snapBox.height);
+
+ context.participantSnapBox = snapBox;
+}
+
+function snapParticipant(snapBox, shape, event, offset) {
+ offset = offset || 0;
+
+ var shapeHalfWidth = shape.width / 2 - offset,
+ shapeHalfHeight = shape.height / 2;
+
+ var currentTopLeft = {
+ x: event.x - shapeHalfWidth - offset,
+ y: event.y - shapeHalfHeight
+ };
+
+ var currentBottomRight = {
+ x: event.x + shapeHalfWidth + offset,
+ y: event.y + shapeHalfHeight
+ };
+
+ var snapTopLeft = snapBox,
+ snapBottomRight = bottomRight(snapBox);
+
+ if (currentTopLeft.x >= snapTopLeft.x) {
+ setSnapped(event, 'x', snapTopLeft.x + offset + shapeHalfWidth);
+ } else
+ if (currentBottomRight.x <= snapBottomRight.x) {
+ setSnapped(event, 'x', snapBottomRight.x - offset - shapeHalfWidth);
+ }
+
+ if (currentTopLeft.y >= snapTopLeft.y) {
+ setSnapped(event, 'y', snapTopLeft.y + shapeHalfHeight);
+ } else
+ if (currentBottomRight.y <= snapBottomRight.y) {
+ setSnapped(event, 'y', snapBottomRight.y - shapeHalfHeight);
+ }
+}
+
+
+/////// boundary event snapping /////////////////////////
+
+
+function snapBoundaryEvent(event, shape, target) {
+ var targetTRBL = asTRBL(target);
+
+ var direction = getBoundaryAttachment(event, target);
+
+ if (/top/.test(direction)) {
+ setSnapped(event, 'y', targetTRBL.top);
+ } else
+ if (/bottom/.test(direction)) {
+ setSnapped(event, 'y', targetTRBL.bottom);
+ }
+
+ if (/left/.test(direction)) {
+ setSnapped(event, 'x', targetTRBL.left);
+ } else
+ if (/right/.test(direction)) {
+ setSnapped(event, 'x', targetTRBL.right);
+ }
+}
+
+},{"191":191,"192":192,"208":208,"221":221,"243":243,"253":253,"255":255,"377":377,"44":44,"45":45,"61":61,"68":68,"70":70}],61:[function(_dereq_,module,exports){
+'use strict';
+
+var getOrientation = _dereq_(208).getOrientation;
+
+
+function getBoundaryAttachment(position, targetBounds) {
+
+ var orientation = getOrientation(position, targetBounds, -15);
+
+ if (orientation !== 'intersect') {
+ return orientation;
+ } else {
+ return null;
+ }
+}
+
+module.exports.getBoundaryAttachment = getBoundaryAttachment;
+
+
+
+// participant snapping box implementation /////////////////
+
+var is = _dereq_(70).is;
+
+var asTRBL = _dereq_(208).asTRBL;
+
+var collectLanes = _dereq_(44).collectLanes,
+ getLanesRoot = _dereq_(44).getLanesRoot;
+
+var abs = Math.abs,
+ min = Math.min,
+ max = Math.max;
+
+
+function addToTrbl(trbl, attr, value, choice) {
+
+ var current = trbl[attr];
+
+ // make sure to set the value if it does not exist
+ // or apply the correct value by comparing against
+ // choice(value, currentValue)
+ trbl[attr] = current === undefined ? value : choice(value, current);
+}
+
+function addMin(trbl, attr, value) {
+ return addToTrbl(trbl, attr, value, min);
+}
+
+function addMax(trbl, attr, value) {
+ return addToTrbl(trbl, attr, value, max);
+}
+
+
+var LANE_MIN_HEIGHT = 60,
+ LANE_MIN_WIDTH = 300,
+ LANE_RIGHT_PADDING = 20,
+ LANE_LEFT_PADDING = 50,
+ LANE_TOP_PADDING = 20,
+ LANE_BOTTOM_PADDING = 20;
+
+
+function getParticipantSizeConstraints(laneShape, resizeDirection, balanced) {
+
+ var lanesRoot = getLanesRoot(laneShape);
+
+ var isFirst = true,
+ isLast = true;
+
+ ///// max top/bottom size for lanes
+
+ var allLanes = collectLanes(lanesRoot, [ lanesRoot ]);
+
+ var laneTrbl = asTRBL(laneShape);
+
+ var maxTrbl = {},
+ minTrbl = {};
+
+ if (/e/.test(resizeDirection)) {
+ minTrbl.right = laneTrbl.left + LANE_MIN_WIDTH;
+ } else
+ if (/w/.test(resizeDirection)) {
+ minTrbl.left = laneTrbl.right - LANE_MIN_WIDTH;
+ }
+
+ allLanes.forEach(function(other) {
+
+ var otherTrbl = asTRBL(other);
+
+ if (/n/.test(resizeDirection)) {
+
+ if (otherTrbl.top < (laneTrbl.top - 10)) {
+ isFirst = false;
+ }
+
+ // max top size (based on next element)
+ if (balanced && abs(laneTrbl.top - otherTrbl.bottom) < 10) {
+ addMax(maxTrbl, 'top', otherTrbl.top + LANE_MIN_HEIGHT);
+ }
+
+ // min top size (based on self or nested element)
+ if (abs(laneTrbl.top - otherTrbl.top) < 5) {
+ addMin(minTrbl, 'top', otherTrbl.bottom - LANE_MIN_HEIGHT);
+ }
+ }
+
+ if (/s/.test(resizeDirection)) {
+
+ if (otherTrbl.bottom > (laneTrbl.bottom + 10)) {
+ isLast = false;
+ }
+
+ // max bottom size (based on previous element)
+ if (balanced && abs(laneTrbl.bottom - otherTrbl.top) < 10) {
+ addMin(maxTrbl, 'bottom', otherTrbl.bottom - LANE_MIN_HEIGHT);
+ }
+
+ // min bottom size (based on self or nested element)
+ if (abs(laneTrbl.bottom - otherTrbl.bottom) < 5) {
+ addMax(minTrbl, 'bottom', otherTrbl.top + LANE_MIN_HEIGHT);
+ }
+ }
+ });
+
+
+ ///// max top/bottom/left/right size based on flow nodes
+
+ var flowElements = lanesRoot.children.filter(function(s) {
+ return !s.hidden && !s.waypoints && (is(s, 'bpmn:FlowElement') || is(s, 'bpmn:Artifact'));
+ });
+
+ flowElements.forEach(function(flowElement) {
+
+ var flowElementTrbl = asTRBL(flowElement);
+
+ if (isFirst && /n/.test(resizeDirection)) {
+ addMin(minTrbl, 'top', flowElementTrbl.top - LANE_TOP_PADDING);
+ }
+
+ if (/e/.test(resizeDirection)) {
+ addMax(minTrbl, 'right', flowElementTrbl.right + LANE_RIGHT_PADDING);
+ }
+
+ if (isLast && /s/.test(resizeDirection)) {
+ addMax(minTrbl, 'bottom', flowElementTrbl.bottom + LANE_BOTTOM_PADDING);
+ }
+
+ if (/w/.test(resizeDirection)) {
+ addMin(minTrbl, 'left', flowElementTrbl.left - LANE_LEFT_PADDING);
+ }
+ });
+
+
+ return {
+ min: minTrbl,
+ max: maxTrbl
+ };
+}
+
+
+module.exports.getParticipantSizeConstraints = getParticipantSizeConstraints;
+},{"208":208,"44":44,"70":70}],62:[function(_dereq_,module,exports){
+module.exports = {
+ __init__: [ 'snapping' ],
+ snapping: [ 'type', _dereq_(60) ]
+};
+},{"60":60}],63:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377),
+ map = _dereq_(258);
+
+var LabelUtil = _dereq_(69);
+
+var is = _dereq_(70).is;
+
+var hasExternalLabel = LabelUtil.hasExternalLabel,
+ getExternalLabelBounds = LabelUtil.getExternalLabelBounds,
+ isExpanded = _dereq_(68).isExpanded,
+ elementToString = _dereq_(66).elementToString;
+
+
+function elementData(semantic, attrs) {
+ return assign({
+ id: semantic.id,
+ type: semantic.$type,
+ businessObject: semantic
+ }, attrs);
+}
+
+function collectWaypoints(waypoints) {
+ return map(waypoints, function(p) {
+ return { x: p.x, y: p.y };
+ });
+}
+
+function notYetDrawn(translate, semantic, refSemantic, property) {
+ return new Error(translate('element {element} referenced by {referenced}#{property} not yet drawn', {
+ element: elementToString(refSemantic),
+ referenced: elementToString(semantic),
+ property: property
+ }));
+}
+
+/**
+ * An importer that adds bpmn elements to the canvas
+ *
+ * @param {EventBus} eventBus
+ * @param {Canvas} canvas
+ * @param {ElementFactory} elementFactory
+ * @param {ElementRegistry} elementRegistry
+ */
+function BpmnImporter(eventBus, canvas, elementFactory, elementRegistry, translate) {
+ this._eventBus = eventBus;
+ this._canvas = canvas;
+
+ this._elementFactory = elementFactory;
+ this._elementRegistry = elementRegistry;
+ this._translate = translate;
+}
+
+BpmnImporter.$inject = [ 'eventBus', 'canvas', 'elementFactory', 'elementRegistry', 'translate' ];
+
+module.exports = BpmnImporter;
+
+
+/**
+ * Add bpmn element (semantic) to the canvas onto the
+ * specified parent shape.
+ */
+BpmnImporter.prototype.add = function(semantic, parentElement) {
+
+ var di = semantic.di,
+ element,
+ translate = this._translate;
+
+ // ROOT ELEMENT
+ // handle the special case that we deal with a
+ // invisible root element (process or collaboration)
+ if (is(di, 'bpmndi:BPMNPlane')) {
+
+ // add a virtual element (not being drawn)
+ element = this._elementFactory.createRoot(elementData(semantic));
+
+ this._canvas.setRootElement(element);
+ }
+
+ // SHAPE
+ else if (is(di, 'bpmndi:BPMNShape')) {
+
+ var collapsed = !isExpanded(semantic);
+ var hidden = parentElement && (parentElement.hidden || parentElement.collapsed);
+
+ var bounds = semantic.di.bounds;
+
+ element = this._elementFactory.createShape(elementData(semantic, {
+ collapsed: collapsed,
+ hidden: hidden,
+ x: Math.round(bounds.x),
+ y: Math.round(bounds.y),
+ width: Math.round(bounds.width),
+ height: Math.round(bounds.height)
+ }));
+
+ if (is(semantic, 'bpmn:BoundaryEvent')) {
+ this._attachBoundary(semantic, element);
+ }
+
+ this._canvas.addShape(element, parentElement);
+ }
+
+ // CONNECTION
+ else if (is(di, 'bpmndi:BPMNEdge')) {
+
+ var source = this._getSource(semantic),
+ target = this._getTarget(semantic);
+
+ element = this._elementFactory.createConnection(elementData(semantic, {
+ source: source,
+ target: target,
+ waypoints: collectWaypoints(semantic.di.waypoint)
+ }));
+
+ this._canvas.addConnection(element, parentElement);
+ } else {
+ throw new Error(translate('unknown di {di} for element {semantic}', {
+ di: elementToString(di),
+ semantic: elementToString(semantic)
+ }));
+ }
+ // (optional) LABEL
+ if (hasExternalLabel(semantic)) {
+ this.addLabel(semantic, element);
+ }
+
+
+ this._eventBus.fire('bpmnElement.added', { element: element });
+
+ return element;
+};
+
+
+/**
+ * Attach the boundary element to the given host
+ *
+ * @param {ModdleElement} boundarySemantic
+ * @param {djs.model.Base} boundaryElement
+ */
+BpmnImporter.prototype._attachBoundary = function(boundarySemantic, boundaryElement) {
+ var translate = this._translate;
+ var hostSemantic = boundarySemantic.attachedToRef;
+
+ if (!hostSemantic) {
+ throw new Error(translate('missing {semantic}#attachedToRef', {
+ semantic: elementToString(boundarySemantic)
+ }));
+ }
+
+ var host = this._elementRegistry.get(hostSemantic.id),
+ attachers = host && host.attachers;
+
+ if (!host) {
+ throw notYetDrawn(translate, boundarySemantic, hostSemantic, 'attachedToRef');
+ }
+
+ // wire element.host <> host.attachers
+ boundaryElement.host = host;
+
+ if (!attachers) {
+ host.attachers = attachers = [];
+ }
+
+ if (attachers.indexOf(boundaryElement) === -1) {
+ attachers.push(boundaryElement);
+ }
+};
+
+
+/**
+ * add label for an element
+ */
+BpmnImporter.prototype.addLabel = function(semantic, element) {
+ var bounds = getExternalLabelBounds(semantic, element);
+
+ var label = this._elementFactory.createLabel(elementData(semantic, {
+ id: semantic.id + '_label',
+ labelTarget: element,
+ type: 'label',
+ hidden: element.hidden || !semantic.name,
+ x: Math.round(bounds.x),
+ y: Math.round(bounds.y),
+ width: Math.round(bounds.width),
+ height: Math.round(bounds.height)
+ }));
+
+ return this._canvas.addShape(label, element.parent);
+};
+
+/**
+ * Return the drawn connection end based on the given side.
+ *
+ * @throws {Error} if the end is not yet drawn
+ */
+BpmnImporter.prototype._getEnd = function(semantic, side) {
+
+ var element,
+ refSemantic,
+ type = semantic.$type,
+ translate = this._translate;
+
+ refSemantic = semantic[side + 'Ref'];
+
+ // handle mysterious isMany DataAssociation#sourceRef
+ if (side === 'source' && type === 'bpmn:DataInputAssociation') {
+ refSemantic = refSemantic && refSemantic[0];
+ }
+
+ // fix source / target for DataInputAssociation / DataOutputAssociation
+ if (side === 'source' && type === 'bpmn:DataOutputAssociation' ||
+ side === 'target' && type === 'bpmn:DataInputAssociation') {
+
+ refSemantic = semantic.$parent;
+ }
+
+ element = refSemantic && this._getElement(refSemantic);
+
+ if (element) {
+ return element;
+ }
+
+ if (refSemantic) {
+ throw notYetDrawn(translate, semantic, refSemantic, side + 'Ref');
+ } else {
+ throw new Error(translate('{semantic}#{side} Ref not specified', {
+ semantic: elementToString(semantic),
+ side: side
+ }));
+ }
+};
+
+BpmnImporter.prototype._getSource = function(semantic) {
+ return this._getEnd(semantic, 'source');
+};
+
+BpmnImporter.prototype._getTarget = function(semantic) {
+ return this._getEnd(semantic, 'target');
+};
+
+
+BpmnImporter.prototype._getElement = function(semantic) {
+ return this._elementRegistry.get(semantic.id);
+};
+},{"258":258,"377":377,"66":66,"68":68,"69":69,"70":70}],64:[function(_dereq_,module,exports){
+'use strict';
+
+var filter = _dereq_(253),
+ find = _dereq_(254),
+ forEach = _dereq_(255);
+
+var Refs = _dereq_(407);
+
+var elementToString = _dereq_(66).elementToString;
+
+var diRefs = new Refs({ name: 'bpmnElement', enumerable: true }, { name: 'di' });
+
+/**
+ * Returns true if an element has the given meta-model type
+ *
+ * @param {ModdleElement} element
+ * @param {String} type
+ *
+ * @return {Boolean}
+ */
+function is(element, type) {
+ return element.$instanceOf(type);
+}
+
+
+/**
+ * Find a suitable display candidate for definitions where the DI does not
+ * correctly specify one.
+ */
+function findDisplayCandidate(definitions) {
+ return find(definitions.rootElements, function(e) {
+ return is(e, 'bpmn:Process') || is(e, 'bpmn:Collaboration');
+ });
+}
+
+
+function BpmnTreeWalker(handler, translate) {
+
+ // list of containers already walked
+ var handledElements = {};
+
+ // list of elements to handle deferred to ensure
+ // prerequisites are drawn
+ var deferred = [];
+
+ ///// Helpers /////////////////////////////////
+
+ function contextual(fn, ctx) {
+ return function(e) {
+ fn(e, ctx);
+ };
+ }
+
+ function handled(element) {
+ handledElements[element.id] = element;
+ }
+
+ function isHandled(element) {
+ return handledElements[element.id];
+ }
+
+ function visit(element, ctx) {
+
+ var gfx = element.gfx;
+
+ // avoid multiple rendering of elements
+ if (gfx) {
+ throw new Error(
+ translate('already rendered {element}', { element: elementToString(element) })
+ );
+ }
+
+ // call handler
+ return handler.element(element, ctx);
+ }
+
+ function visitRoot(element, diagram) {
+ return handler.root(element, diagram);
+ }
+
+ function visitIfDi(element, ctx) {
+
+ try {
+ var gfx = element.di && visit(element, ctx);
+
+ handled(element);
+
+ return gfx;
+ } catch (e) {
+ logError(e.message, { element: element, error: e });
+
+ console.error(translate('failed to import {element}', { element: elementToString(element) }));
+ console.error(e);
+ }
+ }
+
+ function logError(message, context) {
+ handler.error(message, context);
+ }
+
+ ////// DI handling ////////////////////////////
+
+ function registerDi(di) {
+ var bpmnElement = di.bpmnElement;
+
+ if (bpmnElement) {
+ if (bpmnElement.di) {
+ logError(
+ translate('multiple DI elements defined for {element}', {
+ element: elementToString(bpmnElement)
+ }),
+ { element: bpmnElement }
+ );
+ } else {
+ diRefs.bind(bpmnElement, 'di');
+ bpmnElement.di = di;
+ }
+ } else {
+ logError(
+ translate('no bpmnElement referenced in {element}', {
+ element: elementToString(di)
+ }),
+ { element: di }
+ );
+ }
+ }
+
+ function handleDiagram(diagram) {
+ handlePlane(diagram.plane);
+ }
+
+ function handlePlane(plane) {
+ registerDi(plane);
+
+ forEach(plane.planeElement, handlePlaneElement);
+ }
+
+ function handlePlaneElement(planeElement) {
+ registerDi(planeElement);
+ }
+
+
+ ////// Semantic handling //////////////////////
+
+ /**
+ * Handle definitions and return the rendered diagram (if any)
+ *
+ * @param {ModdleElement} definitions to walk and import
+ * @param {ModdleElement} [diagram] specific diagram to import and display
+ *
+ * @throws {Error} if no diagram to display could be found
+ */
+ function handleDefinitions(definitions, diagram) {
+ // make sure we walk the correct bpmnElement
+
+ var diagrams = definitions.diagrams;
+
+ if (diagram && diagrams.indexOf(diagram) === -1) {
+ throw new Error(translate('diagram not part of bpmn:Definitions'));
+ }
+
+ if (!diagram && diagrams && diagrams.length) {
+ diagram = diagrams[0];
+ }
+
+ // no diagram -> nothing to import
+ if (!diagram) {
+ throw new Error(translate('no diagram to display'));
+ }
+
+ // load DI from selected diagram only
+ handleDiagram(diagram);
+
+
+ var plane = diagram.plane;
+
+ if (!plane) {
+ throw new Error(translate(
+ 'no plane for {element}',
+ { element: elementToString(diagram) }
+ ));
+ }
+
+ var rootElement = plane.bpmnElement;
+
+ // ensure we default to a suitable display candidate (process or collaboration),
+ // even if non is specified in DI
+ if (!rootElement) {
+ rootElement = findDisplayCandidate(definitions);
+
+ if (!rootElement) {
+ throw new Error(translate('no process or collaboration to display'));
+ } else {
+
+ logError(
+ translate('correcting missing bpmnElement on {plane} to {rootElement}', {
+ plane: elementToString(plane),
+ rootElement: elementToString(rootElement)
+ })
+ );
+
+ // correct DI on the fly
+ plane.bpmnElement = rootElement;
+ registerDi(plane);
+ }
+ }
+
+
+ var ctx = visitRoot(rootElement, plane);
+
+ if (is(rootElement, 'bpmn:Process')) {
+ handleProcess(rootElement, ctx);
+ } else if (is(rootElement, 'bpmn:Collaboration')) {
+ handleCollaboration(rootElement, ctx);
+
+ // force drawing of everything not yet drawn that is part of the target DI
+ handleUnhandledProcesses(definitions.rootElements, ctx);
+ } else {
+ throw new Error(
+ translate('unsupported bpmnElement for {plane}: {rootElement}', {
+ plane: elementToString(plane),
+ rootElement: elementToString(rootElement)
+ })
+ );
+ }
+
+ // handle all deferred elements
+ handleDeferred(deferred);
+ }
+
+ function handleDeferred(deferred) {
+ forEach(deferred, function(d) { d(); });
+ }
+
+ function handleProcess(process, context) {
+ handleFlowElementsContainer(process, context);
+ handleIoSpecification(process.ioSpecification, context);
+
+ handleArtifacts(process.artifacts, context);
+
+ // log process handled
+ handled(process);
+ }
+
+ function handleUnhandledProcesses(rootElements) {
+
+ // walk through all processes that have not yet been drawn and draw them
+ // if they contain lanes with DI information.
+ // we do this to pass the free-floating lane test cases in the MIWG test suite
+ var processes = filter(rootElements, function(e) {
+ return !isHandled(e) && is(e, 'bpmn:Process') && e.laneSets;
+ });
+
+ processes.forEach(contextual(handleProcess));
+ }
+
+ function handleMessageFlow(messageFlow, context) {
+ visitIfDi(messageFlow, context);
+ }
+
+ function handleMessageFlows(messageFlows, context) {
+ forEach(messageFlows, contextual(handleMessageFlow, context));
+ }
+
+ function handleDataAssociation(association, context) {
+ visitIfDi(association, context);
+ }
+
+ function handleDataInput(dataInput, context) {
+ visitIfDi(dataInput, context);
+ }
+
+ function handleDataOutput(dataOutput, context) {
+ visitIfDi(dataOutput, context);
+ }
+
+ function handleArtifact(artifact, context) {
+
+ // bpmn:TextAnnotation
+ // bpmn:Group
+ // bpmn:Association
+
+ visitIfDi(artifact, context);
+ }
+
+ function handleArtifacts(artifacts, context) {
+
+ forEach(artifacts, function(e) {
+ if (is(e, 'bpmn:Association')) {
+ deferred.push(function() {
+ handleArtifact(e, context);
+ });
+ } else {
+ handleArtifact(e, context);
+ }
+ });
+ }
+
+ function handleIoSpecification(ioSpecification, context) {
+
+ if (!ioSpecification) {
+ return;
+ }
+
+ forEach(ioSpecification.dataInputs, contextual(handleDataInput, context));
+ forEach(ioSpecification.dataOutputs, contextual(handleDataOutput, context));
+ }
+
+ function handleSubProcess(subProcess, context) {
+ handleFlowElementsContainer(subProcess, context);
+ handleArtifacts(subProcess.artifacts, context);
+ }
+
+ function handleFlowNode(flowNode, context) {
+ var childCtx = visitIfDi(flowNode, context);
+
+ if (is(flowNode, 'bpmn:SubProcess')) {
+ handleSubProcess(flowNode, childCtx || context);
+ }
+
+ if (is(flowNode, 'bpmn:Activity')) {
+ handleIoSpecification(flowNode.ioSpecification, context);
+ }
+
+ // defer handling of associations
+ // affected types:
+ //
+ // * bpmn:Activity
+ // * bpmn:ThrowEvent
+ // * bpmn:CatchEvent
+ //
+ deferred.push(function() {
+ forEach(flowNode.dataInputAssociations, contextual(handleDataAssociation, context));
+ forEach(flowNode.dataOutputAssociations, contextual(handleDataAssociation, context));
+ });
+ }
+
+ function handleSequenceFlow(sequenceFlow, context) {
+ visitIfDi(sequenceFlow, context);
+ }
+
+ function handleDataElement(dataObject, context) {
+ visitIfDi(dataObject, context);
+ }
+
+ function handleBoundaryEvent(dataObject, context) {
+ visitIfDi(dataObject, context);
+ }
+
+ function handleLane(lane, context) {
+ var newContext = visitIfDi(lane, context);
+
+ if (lane.childLaneSet) {
+ handleLaneSet(lane.childLaneSet, newContext || context);
+ }
+
+ wireFlowNodeRefs(lane);
+ }
+
+ function handleLaneSet(laneSet, context) {
+ forEach(laneSet.lanes, contextual(handleLane, context));
+ }
+
+ function handleLaneSets(laneSets, context) {
+ forEach(laneSets, contextual(handleLaneSet, context));
+ }
+
+ function handleFlowElementsContainer(container, context) {
+ if (container.laneSets) {
+ handleLaneSets(container.laneSets, context);
+ }
+
+ handleFlowElements(container.flowElements, context);
+ }
+
+ function handleFlowElements(flowElements, context) {
+ forEach(flowElements, function(e) {
+ if (is(e, 'bpmn:SequenceFlow')) {
+ deferred.push(function() {
+ handleSequenceFlow(e, context);
+ });
+ } else if (is(e, 'bpmn:BoundaryEvent')) {
+ deferred.unshift(function() {
+ handleBoundaryEvent(e, context);
+ });
+ } else if (is(e, 'bpmn:FlowNode')) {
+ handleFlowNode(e, context);
+ } else if (is(e, 'bpmn:DataObject')) {
+ // SKIP (assume correct referencing via DataObjectReference)
+ } else if (is(e, 'bpmn:DataStoreReference')) {
+ handleDataElement(e, context);
+ } else if (is(e, 'bpmn:DataObjectReference')) {
+ handleDataElement(e, context);
+ } else {
+ logError(
+ translate('unrecognized flowElement {element} in context {context}', {
+ element: elementToString(e),
+ context: (context ? elementToString(context.businessObject) : 'null')
+ }),
+ { element: e, context: context }
+ );
+ }
+ });
+ }
+
+ function handleParticipant(participant, context) {
+ var newCtx = visitIfDi(participant, context);
+
+ var process = participant.processRef;
+ if (process) {
+ handleProcess(process, newCtx || context);
+ }
+ }
+
+ function handleCollaboration(collaboration) {
+
+ forEach(collaboration.participants, contextual(handleParticipant));
+
+ handleArtifacts(collaboration.artifacts);
+
+ // handle message flows latest in the process
+ deferred.push(function() {
+ handleMessageFlows(collaboration.messageFlows);
+ });
+ }
+
+
+ function wireFlowNodeRefs(lane) {
+ // wire the virtual flowNodeRefs <-> relationship
+ forEach(lane.flowNodeRef, function(flowNode) {
+ var lanes = flowNode.get('lanes');
+
+ if (lanes) {
+ lanes.push(lane);
+ }
+ });
+ }
+
+ ///// API ////////////////////////////////
+
+ return {
+ handleDefinitions: handleDefinitions
+ };
+}
+
+module.exports = BpmnTreeWalker;
+},{"253":253,"254":254,"255":255,"407":407,"66":66}],65:[function(_dereq_,module,exports){
+'use strict';
+
+var BpmnTreeWalker = _dereq_(64);
+
+
+/**
+ * Import the definitions into a diagram.
+ *
+ * Errors and warnings are reported through the specified callback.
+ *
+ * @param {Diagram} diagram
+ * @param {ModdleElement} definitions
+ * @param {Function} done the callback, invoked with (err, [ warning ]) once the import is done
+ */
+function importBpmnDiagram(diagram, definitions, done) {
+
+ var importer = diagram.get('bpmnImporter'),
+ eventBus = diagram.get('eventBus'),
+ translate = diagram.get('translate');
+
+ var error,
+ warnings = [];
+
+ /**
+ * Walk the diagram semantically, importing (=drawing)
+ * all elements you encounter.
+ *
+ * @param {ModdleElement} definitions
+ */
+ function render(definitions) {
+
+ var visitor = {
+
+ root: function(element) {
+ return importer.add(element);
+ },
+
+ element: function(element, parentShape) {
+ return importer.add(element, parentShape);
+ },
+
+ error: function(message, context) {
+ warnings.push({ message: message, context: context });
+ }
+ };
+
+ var walker = new BpmnTreeWalker(visitor, translate);
+
+ // traverse BPMN 2.0 document model,
+ // starting at definitions
+ walker.handleDefinitions(definitions);
+ }
+
+ eventBus.fire('import.render.start', { definitions: definitions });
+
+ try {
+ render(definitions);
+ } catch (e) {
+ error = e;
+ }
+
+ eventBus.fire('import.render.complete', {
+ error: error,
+ warnings: warnings
+ });
+
+ done(error, warnings);
+}
+
+module.exports.importBpmnDiagram = importBpmnDiagram;
+},{"64":64}],66:[function(_dereq_,module,exports){
+'use strict';
+
+module.exports.elementToString = function(e) {
+ if (!e) {
+ return '';
+ }
+
+ return '<' + e.$type + (e.id ? ' id="' + e.id : '') + '" />';
+};
+},{}],67:[function(_dereq_,module,exports){
+module.exports = {
+ __depends__: [
+ _dereq_(204)
+ ],
+ bpmnImporter: [ 'type', _dereq_(63) ]
+};
+},{"204":204,"63":63}],68:[function(_dereq_,module,exports){
+'use strict';
+
+var is = _dereq_(70).is,
+ getBusinessObject = _dereq_(70).getBusinessObject;
+
+module.exports.isExpanded = function(element) {
+
+ if (is(element, 'bpmn:CallActivity')) {
+ return false;
+ }
+
+ if (is(element, 'bpmn:SubProcess')) {
+ return !!getBusinessObject(element).di.isExpanded;
+ }
+
+ if (is(element, 'bpmn:Participant')) {
+ return !!getBusinessObject(element).processRef;
+ }
+
+ return true;
+};
+
+module.exports.isInterrupting = function(element) {
+ return element && getBusinessObject(element).isInterrupting !== false;
+};
+
+module.exports.isEventSubProcess = function(element) {
+ return element && !!getBusinessObject(element).triggeredByEvent;
+};
+
+},{"70":70}],69:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377);
+
+var is = _dereq_(70).is;
+
+var DEFAULT_LABEL_SIZE = module.exports.DEFAULT_LABEL_SIZE = {
+ width: 90,
+ height: 20
+};
+
+
+/**
+ * Returns true if the given semantic has an external label
+ *
+ * @param {BpmnElement} semantic
+ * @return {Boolean} true if has label
+ */
+module.exports.hasExternalLabel = function(semantic) {
+ return is(semantic, 'bpmn:Event') ||
+ is(semantic, 'bpmn:Gateway') ||
+ is(semantic, 'bpmn:DataStoreReference') ||
+ is(semantic, 'bpmn:DataObjectReference') ||
+ is(semantic, 'bpmn:SequenceFlow') ||
+ is(semantic, 'bpmn:MessageFlow');
+};
+
+
+/**
+ * Get the middle of a number of waypoints
+ *
+ * @param {Array} waypoints
+ * @return {Point} the mid point
+ */
+function getWaypointsMid(waypoints) {
+
+ var mid = waypoints.length / 2 - 1;
+
+ var first = waypoints[Math.floor(mid)];
+ var second = waypoints[Math.ceil(mid + 0.01)];
+
+ return {
+ x: first.x + (second.x - first.x) / 2,
+ y: first.y + (second.y - first.y) / 2
+ };
+}
+
+module.exports.getWaypointsMid = getWaypointsMid;
+
+
+function getExternalLabelMid(element) {
+
+ if (element.waypoints) {
+ return getWaypointsMid(element.waypoints);
+ } else {
+ return {
+ x: element.x + element.width / 2,
+ y: element.y + element.height + DEFAULT_LABEL_SIZE.height / 2
+ };
+ }
+}
+
+module.exports.getExternalLabelMid = getExternalLabelMid;
+
+
+/**
+ * Returns the bounds of an elements label, parsed from the elements DI or
+ * generated from its bounds.
+ *
+ * @param {BpmnElement} semantic
+ * @param {djs.model.Base} element
+ */
+module.exports.getExternalLabelBounds = function(semantic, element) {
+
+ var mid,
+ size,
+ bounds,
+ di = semantic.di,
+ label = di.label;
+
+ if (label && label.bounds) {
+ bounds = label.bounds;
+
+ size = {
+ width: Math.max(DEFAULT_LABEL_SIZE.width, bounds.width),
+ height: bounds.height
+ };
+
+ mid = {
+ x: bounds.x + bounds.width / 2,
+ y: bounds.y + bounds.height / 2
+ };
+ } else {
+
+ mid = getExternalLabelMid(element);
+
+ size = DEFAULT_LABEL_SIZE;
+ }
+
+ return assign({
+ x: mid.x - size.width / 2,
+ y: mid.y - size.height / 2
+ }, size);
+};
+
+},{"377":377,"70":70}],70:[function(_dereq_,module,exports){
+'use strict';
+
+/**
+ * Is an element of the given BPMN type?
+ *
+ * @param {djs.model.Base|ModdleElement} element
+ * @param {String} type
+ *
+ * @return {Boolean}
+ */
+function is(element, type) {
+ var bo = getBusinessObject(element);
+
+ return bo && (typeof bo.$instanceOf === 'function') && bo.$instanceOf(type);
+}
+
+module.exports.is = is;
+
+
+/**
+ * Return the business object for a given element.
+ *
+ * @param {djs.model.Base|ModdleElement} element
+ *
+ * @return {ModdleElement}
+ */
+function getBusinessObject(element) {
+ return (element && element.businessObject) || element;
+}
+
+module.exports.getBusinessObject = getBusinessObject;
+
+},{}],71:[function(_dereq_,module,exports){
+/**
+ * This file must not be changed or exchanged.
+ *
+ * @see http://bpmn.io/license for more information.
+ */
+
+'use strict';
+
+var domify = _dereq_(394);
+
+var domDelegate = _dereq_(393);
+
+/* jshint -W101 */
+
+// inlined ../resources/bpmnjs.png
+var logoData = module.exports.BPMNIO_LOGO = 'iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAMAAADypuvZAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADBQTFRFiMte9PrwldFwfcZPqtqN0+zEyOe1XLgjvuKncsJAZ70y6fXh3vDT////UrQV////G2zN+AAAABB0Uk5T////////////////////AOAjXRkAAAHDSURBVHjavJZJkoUgDEBJmAX8979tM8u3E6x20VlYJfFFMoL4vBDxATxZcakIOJTWSmxvKWVIkJ8jHvlRv1F2LFrVISCZI+tCtQx+XfewgVTfyY3plPiQEAzI3zWy+kR6NBhFBYeBuscJLOUuA2WVLpCjVIaFzrNQZArxAZKUQm6gsj37L9Cb7dnIBUKxENaaMJQqMpDXvSL+ktxdGRm2IsKgJGGPg7atwUG5CcFUEuSv+CwQqizTrvDTNXdMU2bMiDWZd8d7QIySWVRsb2vBBioxOFt4OinPBapL+neAb5KL5IJ8szOza2/DYoipUCx+CjO0Bpsv0V6mktNZ+k8rlABlWG0FrOpKYVo8DT3dBeLEjUBAj7moDogVii7nSS9QzZnFcOVBp1g2PyBQ3Vr5aIapN91VJy33HTJLC1iX2FY6F8gRdaAeIEfVONgtFCzZTmoLEdOjBDfsIOA6128gw3eu1shAajdZNAORxuQDJN5A5PbEG6gNIu24QJD5iNyRMZIr6bsHbCtCU/OaOaSvgkUyDMdDa1BXGf5HJ1To+/Ym6mCKT02Y+/Sa126ZKyd3jxhzpc1r8zVL6YM1Qy/kR4ABAFJ6iQUnivhAAAAAAElFTkSuQmCC';
+
+/* jshint +W101 */
+
+
+function css(attrs) {
+ return attrs.join(';');
+}
+
+var LIGHTBOX_STYLES = css([
+ 'z-index: 1001',
+ 'position: fixed',
+ 'top: 0',
+ 'left: 0',
+ 'right: 0',
+ 'bottom: 0'
+]);
+
+var BACKDROP_STYLES = css([
+ 'width: 100%',
+ 'height: 100%',
+ 'background: rgba(0,0,0,0.2)'
+]);
+
+var NOTICE_STYLES = css([
+ 'position: absolute',
+ 'left: 50%',
+ 'top: 40%',
+ 'margin: 0 -130px',
+ 'width: 260px',
+ 'padding: 10px',
+ 'background: white',
+ 'border: solid 1px #AAA',
+ 'border-radius: 3px',
+ 'font-family: Helvetica, Arial, sans-serif',
+ 'font-size: 14px',
+ 'line-height: 1.2em'
+]);
+
+var LIGHTBOX_MARKUP =
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ ' ' +
+ ' ' +
+ 'Web-based tooling for BPMN, DMN and CMMN diagrams ' +
+ 'powered by
bpmn.io .' +
+ '
' +
+ '
';
+
+
+var lightbox;
+
+function open() {
+
+ if (!lightbox) {
+ lightbox = domify(LIGHTBOX_MARKUP);
+
+ domDelegate.bind(lightbox, '.backdrop', 'click', function(event) {
+ document.body.removeChild(lightbox);
+ });
+ }
+
+ document.body.appendChild(lightbox);
+}
+
+module.exports.open = open;
+},{"393":393,"394":394}],72:[function(_dereq_,module,exports){
+module.exports = _dereq_(74);
+},{"74":74}],73:[function(_dereq_,module,exports){
+'use strict';
+
+var isString = _dereq_(374),
+ isFunction = _dereq_(369),
+ assign = _dereq_(377);
+
+var Moddle = _dereq_(80),
+ XmlReader = _dereq_(76),
+ XmlWriter = _dereq_(77);
+
+/**
+ * A sub class of {@link Moddle} with support for import and export of BPMN 2.0 xml files.
+ *
+ * @class BpmnModdle
+ * @extends Moddle
+ *
+ * @param {Object|Array} packages to use for instantiating the model
+ * @param {Object} [options] additional options to pass over
+ */
+function BpmnModdle(packages, options) {
+ Moddle.call(this, packages, options);
+}
+
+BpmnModdle.prototype = Object.create(Moddle.prototype);
+
+module.exports = BpmnModdle;
+
+
+/**
+ * Instantiates a BPMN model tree from a given xml string.
+ *
+ * @param {String} xmlStr
+ * @param {String} [typeName='bpmn:Definitions'] name of the root element
+ * @param {Object} [options] options to pass to the underlying reader
+ * @param {Function} done callback that is invoked with (err, result, parseContext)
+ * once the import completes
+ */
+BpmnModdle.prototype.fromXML = function(xmlStr, typeName, options, done) {
+
+ if (!isString(typeName)) {
+ done = options;
+ options = typeName;
+ typeName = 'bpmn:Definitions';
+ }
+
+ if (isFunction(options)) {
+ done = options;
+ options = {};
+ }
+
+ var reader = new XmlReader(assign({ model: this, lax: true }, options));
+ var rootHandler = reader.handler(typeName);
+
+ reader.fromXML(xmlStr, rootHandler, done);
+};
+
+
+/**
+ * Serializes a BPMN 2.0 object tree to XML.
+ *
+ * @param {String} element the root element, typically an instance of `bpmn:Definitions`
+ * @param {Object} [options] to pass to the underlying writer
+ * @param {Function} done callback invoked with (err, xmlStr) once the import completes
+ */
+BpmnModdle.prototype.toXML = function(element, options, done) {
+
+ if (isFunction(options)) {
+ done = options;
+ options = {};
+ }
+
+ var writer = new XmlWriter(options);
+ try {
+ var result = writer.toXML(element);
+ done(null, result);
+ } catch (e) {
+ done(e);
+ }
+};
+
+},{"369":369,"374":374,"377":377,"76":76,"77":77,"80":80}],74:[function(_dereq_,module,exports){
+'use strict';
+
+var assign = _dereq_(377);
+
+var BpmnModdle = _dereq_(73);
+
+var packages = {
+ bpmn: _dereq_(89),
+ bpmndi: _dereq_(90),
+ dc: _dereq_(91),
+ di: _dereq_(92)
+};
+
+module.exports = function(additionalPackages, options) {
+ return new BpmnModdle(assign({}, packages, additionalPackages), options);
+};
+},{"377":377,"73":73,"89":89,"90":90,"91":91,"92":92}],75:[function(_dereq_,module,exports){
+'use strict';
+
+function capitalize(string) {
+ return string.charAt(0).toUpperCase() + string.slice(1);
+}
+
+function lower(string) {
+ return string.charAt(0).toLowerCase() + string.slice(1);
+}
+
+function hasLowerCaseAlias(pkg) {
+ return pkg.xml && pkg.xml.tagAlias === 'lowerCase';
+}
+
+
+module.exports.aliasToName = function(alias, pkg) {
+ if (hasLowerCaseAlias(pkg)) {
+ return capitalize(alias);
+ } else {
+ return alias;
+ }
+};
+
+module.exports.nameToAlias = function(name, pkg) {
+ if (hasLowerCaseAlias(pkg)) {
+ return lower(name);
+ } else {
+ return name;
+ }
+};
+
+module.exports.DEFAULT_NS_MAP = {
+ 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'
+};
+
+var XSI_TYPE = module.exports.XSI_TYPE = 'xsi:type';
+
+function serializeFormat(element) {
+ return element.xml && element.xml.serialize;
+}
+
+module.exports.serializeAsType = function(element) {
+ return serializeFormat(element) === XSI_TYPE;
+};
+
+module.exports.serializeAsProperty = function(element) {
+ return serializeFormat(element) === 'property';
+};
+},{}],76:[function(_dereq_,module,exports){
+'use strict';
+
+var reduce = _dereq_(259),
+ forEach = _dereq_(255),
+ find = _dereq_(254),
+ assign = _dereq_(377),
+ defer = _dereq_(266);
+
+var Stack = _dereq_(79),
+ SaxParser = _dereq_(78).parser,
+ Moddle = _dereq_(80),
+ parseNameNs = _dereq_(85).parseName,
+ Types = _dereq_(88),
+ coerceType = Types.coerceType,
+ isSimpleType = Types.isSimple,
+ common = _dereq_(75),
+ XSI_TYPE = common.XSI_TYPE,
+ XSI_URI = common.DEFAULT_NS_MAP.xsi,
+ serializeAsType = common.serializeAsType,
+ aliasToName = common.aliasToName;
+
+function parseNodeAttributes(node) {
+ var nodeAttrs = node.attributes;
+
+ return reduce(nodeAttrs, function(result, v, k) {
+ var name, ns;
+
+ if (!v.local) {
+ name = v.prefix;
+ } else {
+ ns = parseNameNs(v.name, v.prefix);
+ name = ns.name;
+ }
+
+ result[name] = v.value;
+ return result;
+ }, {});
+}
+
+function normalizeType(node, attr, model) {
+ var nameNs = parseNameNs(attr.value);
+
+ var uri = node.ns[nameNs.prefix || ''],
+ localName = nameNs.localName,
+ pkg = uri && model.getPackage(uri),
+ typePrefix;
+
+ if (pkg) {
+ typePrefix = pkg.xml && pkg.xml.typePrefix;
+
+ if (typePrefix && localName.indexOf(typePrefix) === 0) {
+ localName = localName.slice(typePrefix.length);
+ }
+
+ attr.value = pkg.prefix + ':' + localName;
+ }
+}
+
+/**
+ * Normalizes namespaces for a node given an optional default namespace and a
+ * number of mappings from uris to default prefixes.
+ *
+ * @param {XmlNode} node
+ * @param {Model} model the model containing all registered namespaces
+ * @param {Uri} defaultNsUri
+ */
+function normalizeNamespaces(node, model, defaultNsUri) {
+ var uri, prefix;
+
+ uri = node.uri || defaultNsUri;
+
+ if (uri) {
+ var pkg = model.getPackage(uri);
+
+ if (pkg) {
+ prefix = pkg.prefix;
+ } else {
+ prefix = node.prefix;
+ }
+
+ node.prefix = prefix;
+ node.uri = uri;
+ }
+
+ forEach(node.attributes, function(attr) {
+
+ // normalize xsi:type attributes because the
+ // assigned type may or may not be namespace prefixed
+ if (attr.uri === XSI_URI && attr.local === 'type') {
+ normalizeType(node, attr, model);
+ }
+
+ normalizeNamespaces(attr, model, null);
+ });
+}
+
+
+function error(message) {
+ return new Error(message);
+}
+
+/**
+ * Get the moddle descriptor for a given instance or type.
+ *
+ * @param {ModdleElement|Function} element
+ *
+ * @return {Object} the moddle descriptor
+ */
+function getModdleDescriptor(element) {
+ return element.$descriptor;
+}
+
+/**
+ * A parse context.
+ *
+ * @class
+ *
+ * @param {Object} options
+ * @param {ElementHandler} options.rootHandler the root handler for parsing a document
+ * @param {boolean} [options.lax=false] whether or not to ignore invalid elements
+ */
+function Context(options) {
+
+ /**
+ * @property {ElementHandler} rootHandler
+ */
+
+ /**
+ * @property {Boolean} lax
+ */
+
+ assign(this, options);
+
+ this.elementsById = {};
+ this.references = [];
+ this.warnings = [];
+
+ /**
+ * Add an unresolved reference.
+ *
+ * @param {Object} reference
+ */
+ this.addReference = function(reference) {
+ this.references.push(reference);
+ };
+
+ /**
+ * Add a processed element.
+ *
+ * @param {ModdleElement} element
+ */
+ this.addElement = function(element) {
+
+ if (!element) {
+ throw error('expected element');
+ }
+
+ var descriptor = getModdleDescriptor(element);
+
+ var idProperty = descriptor.idProperty,
+ id;
+
+ if (idProperty) {
+ id = element.get(idProperty.name);
+
+ if (id) {
+ this.elementsById[id] = element;
+ }
+ }
+ };
+
+ /**
+ * Add an import warning.
+ *
+ * @param {Object} warning
+ * @param {String} warning.message
+ * @param {Error} [warning.error]
+ */
+ this.addWarning = function(warning) {
+ this.warnings.push(warning);
+ };
+}
+
+function BaseHandler() {}
+
+BaseHandler.prototype.handleEnd = function() {};
+BaseHandler.prototype.handleText = function() {};
+BaseHandler.prototype.handleNode = function() {};
+
+
+/**
+ * A simple pass through handler that does nothing except for
+ * ignoring all input it receives.
+ *
+ * This is used to ignore unknown elements and
+ * attributes.
+ */
+function NoopHandler() { }
+
+NoopHandler.prototype = new BaseHandler();
+
+NoopHandler.prototype.handleNode = function() {
+ return this;
+};
+
+function BodyHandler() {}
+
+BodyHandler.prototype = new BaseHandler();
+
+BodyHandler.prototype.handleText = function(text) {
+ this.body = (this.body || '') + text;
+};
+
+function ReferenceHandler(property, context) {
+ this.property = property;
+ this.context = context;
+}
+
+ReferenceHandler.prototype = new BodyHandler();
+
+ReferenceHandler.prototype.handleNode = function(node) {
+
+ if (this.element) {
+ throw error('expected no sub nodes');
+ } else {
+ this.element = this.createReference(node);
+ }
+
+ return this;
+};
+
+ReferenceHandler.prototype.handleEnd = function() {
+ this.element.id = this.body;
+};
+
+ReferenceHandler.prototype.createReference = function(node) {
+ return {
+ property: this.property.ns.name,
+ id: ''
+ };
+};
+
+function ValueHandler(propertyDesc, element) {
+ this.element = element;
+ this.propertyDesc = propertyDesc;
+}
+
+ValueHandler.prototype = new BodyHandler();
+
+ValueHandler.prototype.handleEnd = function() {
+
+ var value = this.body,
+ element = this.element,
+ propertyDesc = this.propertyDesc;
+
+ value = coerceType(propertyDesc.type, value);
+
+ if (propertyDesc.isMany) {
+ element.get(propertyDesc.name).push(value);
+ } else {
+ element.set(propertyDesc.name, value);
+ }
+};
+
+
+function BaseElementHandler() {}
+
+BaseElementHandler.prototype = Object.create(BodyHandler.prototype);
+
+BaseElementHandler.prototype.handleNode = function(node) {
+ var parser = this,
+ element = this.element;
+
+ if (!element) {
+ element = this.element = this.createElement(node);
+
+ this.context.addElement(element);
+ } else {
+ parser = this.handleChild(node);
+ }
+
+ return parser;
+};
+
+/**
+ * @class XMLReader.ElementHandler
+ *
+ */
+function ElementHandler(model, type, context) {
+ this.model = model;
+ this.type = model.getType(type);
+ this.context = context;
+}
+
+ElementHandler.prototype = new BaseElementHandler();
+
+ElementHandler.prototype.addReference = function(reference) {
+ this.context.addReference(reference);
+};
+
+ElementHandler.prototype.handleEnd = function() {
+
+ var value = this.body,
+ element = this.element,
+ descriptor = getModdleDescriptor(element),
+ bodyProperty = descriptor.bodyProperty;
+
+ if (bodyProperty && value !== undefined) {
+ value = coerceType(bodyProperty.type, value);
+ element.set(bodyProperty.name, value);
+ }
+};
+
+/**
+ * Create an instance of the model from the given node.
+ *
+ * @param {Element} node the xml node
+ */
+ElementHandler.prototype.createElement = function(node) {
+ var attributes = parseNodeAttributes(node),
+ Type = this.type,
+ descriptor = getModdleDescriptor(Type),
+ context = this.context,
+ instance = new Type({});
+
+ forEach(attributes, function(value, name) {
+
+ var prop = descriptor.propertiesByName[name],
+ values;
+
+ if (prop && prop.isReference) {
+
+ if (!prop.isMany) {
+ context.addReference({
+ element: instance,
+ property: prop.ns.name,
+ id: value
+ });
+ } else {
+ // IDREFS: parse references as whitespace-separated list
+ values = value.split(' ');
+
+ forEach(values, function(v) {
+ context.addReference({
+ element: instance,
+ property: prop.ns.name,
+ id: v
+ });
+ });
+ }
+
+ } else {
+ if (prop) {
+ value = coerceType(prop.type, value);
+ }
+
+ instance.set(name, value);
+ }
+ });
+
+ return instance;
+};
+
+ElementHandler.prototype.getPropertyForNode = function(node) {
+
+ var nameNs = parseNameNs(node.local, node.prefix);
+
+ var type = this.type,
+ model = this.model,
+ descriptor = getModdleDescriptor(type);
+
+ var propertyName = nameNs.name,
+ property = descriptor.propertiesByName[propertyName],
+ elementTypeName,
+ elementType,
+ typeAnnotation;
+
+ // search for properties by name first
+
+ if (property) {
+
+ if (serializeAsType(property)) {
+ typeAnnotation = node.attributes[XSI_TYPE];
+
+ // xsi type is optional, if it does not exists the
+ // default type is assumed
+ if (typeAnnotation) {
+
+ elementTypeName = typeAnnotation.value;
+
+ // TODO: extract real name from attribute
+ elementType = model.getType(elementTypeName);
+
+ return assign({}, property, { effectiveType: getModdleDescriptor(elementType).name });
+ }
+ }
+
+ // search for properties by name first
+ return property;
+ }
+
+
+ var pkg = model.getPackage(nameNs.prefix);
+
+ if (pkg) {
+ elementTypeName = nameNs.prefix + ':' + aliasToName(nameNs.localName, descriptor.$pkg);
+ elementType = model.getType(elementTypeName);
+
+ // search for collection members later
+ property = find(descriptor.properties, function(p) {
+ return !p.isVirtual && !p.isReference && !p.isAttribute && elementType.hasType(p.type);
+ });
+
+ if (property) {
+ return assign({}, property, { effectiveType: getModdleDescriptor(elementType).name });
+ }
+ } else {
+ // parse unknown element (maybe extension)
+ property = find(descriptor.properties, function(p) {
+ return !p.isReference && !p.isAttribute && p.type === 'Element';
+ });
+
+ if (property) {
+ return property;
+ }
+ }
+
+ throw error('unrecognized element <' + nameNs.name + '>');
+};
+
+ElementHandler.prototype.toString = function() {
+ return 'ElementDescriptor[' + getModdleDescriptor(this.type).name + ']';
+};
+
+ElementHandler.prototype.valueHandler = function(propertyDesc, element) {
+ return new ValueHandler(propertyDesc, element);
+};
+
+ElementHandler.prototype.referenceHandler = function(propertyDesc) {
+ return new ReferenceHandler(propertyDesc, this.context);
+};
+
+ElementHandler.prototype.handler = function(type) {
+ if (type === 'Element') {
+ return new GenericElementHandler(this.model, type, this.context);
+ } else {
+ return new ElementHandler(this.model, type, this.context);
+ }
+};
+
+/**
+ * Handle the child element parsing
+ *
+ * @param {Element} node the xml node
+ */
+ElementHandler.prototype.handleChild = function(node) {
+ var propertyDesc, type, element, childHandler;
+
+ propertyDesc = this.getPropertyForNode(node);
+ element = this.element;
+
+ type = propertyDesc.effectiveType || propertyDesc.type;
+
+ if (isSimpleType(type)) {
+ return this.valueHandler(propertyDesc, element);
+ }
+
+ if (propertyDesc.isReference) {
+ childHandler = this.referenceHandler(propertyDesc).handleNode(node);
+ } else {
+ childHandler = this.handler(type).handleNode(node);
+ }
+
+ var newElement = childHandler.element;
+
+ // child handles may decide to skip elements
+ // by not returning anything
+ if (newElement !== undefined) {
+
+ if (propertyDesc.isMany) {
+ element.get(propertyDesc.name).push(newElement);
+ } else {
+ element.set(propertyDesc.name, newElement);
+ }
+
+ if (propertyDesc.isReference) {
+ assign(newElement, {
+ element: element
+ });
+
+ this.context.addReference(newElement);
+ } else {
+ // establish child -> parent relationship
+ newElement.$parent = element;
+ }
+ }
+
+ return childHandler;
+};
+
+
+function GenericElementHandler(model, type, context) {
+ this.model = model;
+ this.context = context;
+}
+
+GenericElementHandler.prototype = Object.create(BaseElementHandler.prototype);
+
+GenericElementHandler.prototype.createElement = function(node) {
+
+ var name = node.name,
+ prefix = node.prefix,
+ uri = node.ns[prefix],
+ attributes = node.attributes;
+
+ return this.model.createAny(name, uri, attributes);
+};
+
+GenericElementHandler.prototype.handleChild = function(node) {
+
+ var handler = new GenericElementHandler(this.model, 'Element', this.context).handleNode(node),
+ element = this.element;
+
+ var newElement = handler.element,
+ children;
+
+ if (newElement !== undefined) {
+ children = element.$children = element.$children || [];
+ children.push(newElement);
+
+ // establish child -> parent relationship
+ newElement.$parent = element;
+ }
+
+ return handler;
+};
+
+GenericElementHandler.prototype.handleText = function(text) {
+ this.body = this.body || '' + text;
+};
+
+GenericElementHandler.prototype.handleEnd = function() {
+ if (this.body) {
+ this.element.$body = this.body;
+ }
+};
+
+/**
+ * A reader for a meta-model
+ *
+ * @param {Object} options
+ * @param {Model} options.model used to read xml files
+ * @param {Boolean} options.lax whether to make parse errors warnings
+ */
+function XMLReader(options) {
+
+ if (options instanceof Moddle) {
+ options = {
+ model: options
+ };
+ }
+
+ assign(this, { lax: false }, options);
+}
+
+
+/**
+ * Parse the given XML into a moddle document tree.
+ *
+ * @param {String} xml
+ * @param {ElementHandler|Object} options or rootHandler
+ * @param {Function} done
+ */
+XMLReader.prototype.fromXML = function(xml, options, done) {
+
+ var rootHandler = options.rootHandler;
+
+ if (options instanceof ElementHandler) {
+ // root handler passed via (xml, { rootHandler: ElementHandler }, ...)
+ rootHandler = options;
+ options = {};
+ } else {
+ if (typeof options === 'string') {
+ // rootHandler passed via (xml, 'someString', ...)
+ rootHandler = this.handler(options);
+ options = {};
+ } else if (typeof rootHandler === 'string') {
+ // rootHandler passed via (xml, { rootHandler: 'someString' }, ...)
+ rootHandler = this.handler(rootHandler);
+ }
+ }
+
+ var model = this.model,
+ lax = this.lax;
+
+ var context = new Context(assign({}, options, { rootHandler: rootHandler })),
+ parser = new SaxParser(true, { xmlns: true, trim: true }),
+ stack = new Stack();
+
+ rootHandler.context = context;
+
+ // push root handler
+ stack.push(rootHandler);
+
+
+ function resolveReferences() {
+
+ var elementsById = context.elementsById;
+ var references = context.references;
+
+ var i, r;
+
+ for (i = 0; !!(r = references[i]); i++) {
+ var element = r.element;
+ var reference = elementsById[r.id];
+ var property = getModdleDescriptor(element).propertiesByName[r.property];
+
+ if (!reference) {
+ context.addWarning({
+ message: 'unresolved reference <' + r.id + '>',
+ element: r.element,
+ property: r.property,
+ value: r.id
+ });
+ }
+
+ if (property.isMany) {
+ var collection = element.get(property.name),
+ idx = collection.indexOf(r);
+
+ // we replace an existing place holder (idx != -1) or
+ // append to the collection instead
+ if (idx === -1) {
+ idx = collection.length;
+ }
+
+ if (!reference) {
+ // remove unresolvable reference
+ collection.splice(idx, 1);
+ } else {
+ // add or update reference in collection
+ collection[idx] = reference;
+ }
+ } else {
+ element.set(property.name, reference);
+ }
+ }
+ }
+
+ function handleClose(tagName) {
+ stack.pop().handleEnd();
+ }
+
+ function handleOpen(node) {
+ var handler = stack.peek();
+
+ normalizeNamespaces(node, model);
+
+ try {
+ stack.push(handler.handleNode(node));
+ } catch (e) {
+
+ var line = this.line,
+ column = this.column;
+
+ var message =
+ 'unparsable content <' + node.name + '> detected\n\t' +
+ 'line: ' + line + '\n\t' +
+ 'column: ' + column + '\n\t' +
+ 'nested error: ' + e.message;
+
+ if (lax) {
+ context.addWarning({
+ message: message,
+ error: e
+ });
+
+ console.warn('could not parse node');
+ console.warn(e);
+
+ stack.push(new NoopHandler());
+ } else {
+ console.error('could not parse document');
+ console.error(e);
+
+ throw error(message);
+ }
+ }
+ }
+
+ function handleText(text) {
+ stack.peek().handleText(text);
+ }
+
+ parser.onopentag = handleOpen;
+ parser.oncdata = parser.ontext = handleText;
+ parser.onclosetag = handleClose;
+ parser.onend = resolveReferences;
+
+ // deferred parse XML to make loading really ascnchronous
+ // this ensures the execution environment (node or browser)
+ // is kept responsive and that certain optimization strategies
+ // can kick in
+ defer(function() {
+ var error;
+
+ try {
+ parser.write(xml).close();
+ } catch (e) {
+ error = e;
+ }
+
+ done(error, error ? undefined : rootHandler.element, context);
+ });
+};
+
+XMLReader.prototype.handler = function(name) {
+ return new ElementHandler(this.model, name);
+};
+
+module.exports = XMLReader;
+module.exports.ElementHandler = ElementHandler;
+},{"254":254,"255":255,"259":259,"266":266,"377":377,"75":75,"78":78,"79":79,"80":80,"85":85,"88":88}],77:[function(_dereq_,module,exports){
+'use strict';
+
+var map = _dereq_(258),
+ forEach = _dereq_(255),
+ isString = _dereq_(374),
+ filter = _dereq_(253),
+ assign = _dereq_(377);
+
+var Types = _dereq_(88),
+ parseNameNs = _dereq_(85).parseName,
+ common = _dereq_(75),
+ nameToAlias = common.nameToAlias,
+ serializeAsType = common.serializeAsType,
+ serializeAsProperty = common.serializeAsProperty;
+
+var XML_PREAMBLE = '\n',
+ ESCAPE_CHARS = /(<|>|'|"|&|\n\r|\n)/g,
+ DEFAULT_NS_MAP = common.DEFAULT_NS_MAP,
+ XSI_TYPE = common.XSI_TYPE;
+
+
+function nsName(ns) {
+ if (isString(ns)) {
+ return ns;
+ } else {
+ return (ns.prefix ? ns.prefix + ':' : '') + ns.localName;
+ }
+}
+
+function getNsAttrs(namespaces) {
+
+ function isUsed(ns) {
+ return namespaces.used[ns.uri];
+ }
+
+ function toAttr(ns) {
+ var name = 'xmlns' + (ns.prefix ? ':' + ns.prefix : '');
+ return { name: name, value: ns.uri };
+ }
+
+ var allNs = [].concat(namespaces.wellknown, namespaces.custom);
+
+ return map(filter(allNs, isUsed), toAttr);
+}
+
+function getElementNs(ns, descriptor) {
+ if (descriptor.isGeneric) {
+ return descriptor.name;
+ } else {
+ return assign({ localName: nameToAlias(descriptor.ns.localName, descriptor.$pkg) }, ns);
+ }
+}
+
+function getPropertyNs(ns, descriptor) {
+ return assign({ localName: descriptor.ns.localName }, ns);
+}
+
+function getSerializableProperties(element) {
+ var descriptor = element.$descriptor;
+
+ return filter(descriptor.properties, function(p) {
+ var name = p.name;
+
+ if (p.isVirtual) {
+ return false;
+ }
+
+ // do not serialize defaults
+ if (!element.hasOwnProperty(name)) {
+ return false;
+ }
+
+ var value = element[name];
+
+ // do not serialize default equals
+ if (value === p.default) {
+ return false;
+ }
+
+ return p.isMany ? value.length : true;
+ });
+}
+
+var ESCAPE_MAP = {
+ '\n': '10',
+ '\n\r': '10',
+ '"': '34',
+ '\'': '39',
+ '<': '60',
+ '>': '62',
+ '&': '38'
+};
+
+/**
+ * Escape a string attribute to not contain any bad values (line breaks, '"', ...)
+ *
+ * @param {String} str the string to escape
+ * @return {String} the escaped string
+ */
+function escapeAttr(str) {
+
+ // ensure we are handling strings here
+ str = isString(str) ? str : '' + str;
+
+ return str.replace(ESCAPE_CHARS, function(str) {
+ return '' + ESCAPE_MAP[str] + ';';
+ });
+}
+
+function filterAttributes(props) {
+ return filter(props, function(p) { return p.isAttr; });
+}
+
+function filterContained(props) {
+ return filter(props, function(p) { return !p.isAttr; });
+}
+
+
+function ReferenceSerializer(parent, ns) {
+ this.ns = ns;
+}
+
+ReferenceSerializer.prototype.build = function(element) {
+ this.element = element;
+ return this;
+};
+
+ReferenceSerializer.prototype.serializeTo = function(writer) {
+ writer
+ .appendIndent()
+ .append('<' + nsName(this.ns) + '>' + this.element.id + '' + nsName(this.ns) + '>')
+ .appendNewLine();
+};
+
+function BodySerializer() {}
+
+BodySerializer.prototype.serializeValue = BodySerializer.prototype.serializeTo = function(writer) {
+ var escape = this.escape;
+
+ if (escape) {
+ writer.append('');
+ }
+};
+
+BodySerializer.prototype.build = function(prop, value) {
+ this.value = value;
+
+ if (prop.type === 'String' && value.search(ESCAPE_CHARS) !== -1) {
+ this.escape = true;
+ }
+
+ return this;
+};
+
+function ValueSerializer(ns) {
+ this.ns = ns;
+}
+
+ValueSerializer.prototype = new BodySerializer();
+
+ValueSerializer.prototype.serializeTo = function(writer) {
+
+ writer
+ .appendIndent()
+ .append('<' + nsName(this.ns) + '>');
+
+ this.serializeValue(writer);
+
+ writer
+ .append( '' + nsName(this.ns) + '>')
+ .appendNewLine();
+};
+
+function ElementSerializer(parent, ns) {
+ this.body = [];
+ this.attrs = [];
+
+ this.parent = parent;
+ this.ns = ns;
+}
+
+ElementSerializer.prototype.build = function(element) {
+ this.element = element;
+
+ var otherAttrs = this.parseNsAttributes(element);
+
+ if (!this.ns) {
+ this.ns = this.nsTagName(element.$descriptor);
+ }
+
+ if (element.$descriptor.isGeneric) {
+ this.parseGeneric(element);
+ } else {
+ var properties = getSerializableProperties(element);
+
+ this.parseAttributes(filterAttributes(properties));
+ this.parseContainments(filterContained(properties));
+
+ this.parseGenericAttributes(element, otherAttrs);
+ }
+
+ return this;
+};
+
+ElementSerializer.prototype.nsTagName = function(descriptor) {
+ var effectiveNs = this.logNamespaceUsed(descriptor.ns);
+ return getElementNs(effectiveNs, descriptor);
+};
+
+ElementSerializer.prototype.nsPropertyTagName = function(descriptor) {
+ var effectiveNs = this.logNamespaceUsed(descriptor.ns);
+ return getPropertyNs(effectiveNs, descriptor);
+};
+
+ElementSerializer.prototype.isLocalNs = function(ns) {
+ return ns.uri === this.ns.uri;
+};
+
+/**
+ * Get the actual ns attribute name for the given element.
+ *
+ * @param {Object} element
+ * @param {Boolean} [inherited=false]
+ *
+ * @return {Object} nsName
+ */
+ElementSerializer.prototype.nsAttributeName = function(element) {
+
+ var ns;
+
+ if (isString(element)) {
+ ns = parseNameNs(element);
+ } else {
+ ns = element.ns;
+ }
+
+ // return just local name for inherited attributes
+ if (element.inherited) {
+ return { localName: ns.localName };
+ }
+
+ // parse + log effective ns
+ var effectiveNs = this.logNamespaceUsed(ns);
+
+ // strip prefix if same namespace like parent
+ if (this.isLocalNs(effectiveNs)) {
+ return { localName: ns.localName };
+ } else {
+ return assign({ localName: ns.localName }, effectiveNs);
+ }
+};
+
+ElementSerializer.prototype.parseGeneric = function(element) {
+
+ var self = this,
+ body = this.body,
+ attrs = this.attrs;
+
+ forEach(element, function(val, key) {
+
+ if (key === '$body') {
+ body.push(new BodySerializer().build({ type: 'String' }, val));
+ } else
+ if (key === '$children') {
+ forEach(val, function(child) {
+ body.push(new ElementSerializer(self).build(child));
+ });
+ } else
+ if (key.indexOf('$') !== 0) {
+ attrs.push({ name: key, value: escapeAttr(val) });
+ }
+ });
+};
+
+/**
+ * Parse namespaces and return a list of left over generic attributes
+ *
+ * @param {Object} element
+ * @return {Array}
+ */
+ElementSerializer.prototype.parseNsAttributes = function(element) {
+ var self = this;
+
+ var genericAttrs = element.$attrs;
+
+ var model = element.$model;
+
+ var attributes = [];
+
+ // parse namespace attributes first
+ // and log them. push non namespace attributes to a list
+ // and process them later
+ forEach(genericAttrs, function(value, name) {
+ var nameNs = parseNameNs(name);
+
+ var ns;
+
+ // parse xmlns:foo="http://foo.bar"
+ if (nameNs.prefix === 'xmlns') {
+ ns = { prefix: nameNs.localName, uri: value };
+ }
+
+ // parse xmlns="http://foo.bar"
+ if (!nameNs.prefix && nameNs.localName === 'xmlns') {
+ ns = { uri: value };
+ }
+
+ if (ns) {
+ if (model.getPackage(value)) {
+ // register well known namespace
+ self.logNamespace(ns, true);
+ } else {
+ // log custom namespace directly as used
+ self.logNamespaceUsed(ns);
+ }
+ } else {
+ attributes.push({ name: name, value: value });
+ }
+ });
+
+ return attributes;
+};
+
+ElementSerializer.prototype.parseGenericAttributes = function(element, attributes) {
+
+ var self = this;
+
+ forEach(attributes, function(attr) {
+
+ // do not serialize xsi:type attribute
+ // it is set manually based on the actual implementation type
+ if (attr.name === XSI_TYPE) {
+ return;
+ }
+
+ try {
+ self.addAttribute(self.nsAttributeName(attr.name), attr.value);
+ } catch (e) {
+ console.warn(
+ 'missing namespace information for ',
+ attr.name, '=', attr.value, 'on', element,
+ e);
+ }
+ });
+};
+
+ElementSerializer.prototype.parseContainments = function(properties) {
+
+ var self = this,
+ body = this.body,
+ element = this.element;
+
+ forEach(properties, function(p) {
+ var value = element.get(p.name),
+ isReference = p.isReference,
+ isMany = p.isMany;
+
+ var ns = self.nsPropertyTagName(p);
+
+ if (!isMany) {
+ value = [ value ];
+ }
+
+ if (p.isBody) {
+ body.push(new BodySerializer().build(p, value[0]));
+ } else
+ if (Types.isSimple(p.type)) {
+ forEach(value, function(v) {
+ body.push(new ValueSerializer(ns).build(p, v));
+ });
+ } else
+ if (isReference) {
+ forEach(value, function(v) {
+ body.push(new ReferenceSerializer(self, ns).build(v));
+ });
+ } else {
+ // allow serialization via type
+ // rather than element name
+ var asType = serializeAsType(p),
+ asProperty = serializeAsProperty(p);
+
+ forEach(value, function(v) {
+ var serializer;
+
+ if (asType) {
+ serializer = new TypeSerializer(self, ns);
+ } else
+ if (asProperty) {
+ serializer = new ElementSerializer(self, ns);
+ } else {
+ serializer = new ElementSerializer(self);
+ }
+
+ body.push(serializer.build(v));
+ });
+ }
+ });
+};
+
+ElementSerializer.prototype.getNamespaces = function() {
+
+ var namespaces = this.namespaces,
+ parent = this.parent;
+
+ if (!namespaces) {
+ namespaces = this.namespaces = parent ? parent.getNamespaces() : {
+ prefixMap: {},
+ uriMap: {},
+ used: {},
+ wellknown: [],
+ custom: []
+ };
+ }
+
+ return namespaces;
+};
+
+ElementSerializer.prototype.logNamespace = function(ns, wellknown) {
+ var namespaces = this.getNamespaces();
+
+ var nsUri = ns.uri;
+
+ var existing = namespaces.uriMap[nsUri];
+
+ if (!existing) {
+ namespaces.uriMap[nsUri] = ns;
+
+ if (wellknown) {
+ namespaces.wellknown.push(ns);
+ } else {
+ namespaces.custom.push(ns);
+ }
+ }
+
+ namespaces.prefixMap[ns.prefix] = nsUri;
+
+ return ns;
+};
+
+ElementSerializer.prototype.logNamespaceUsed = function(ns) {
+ var element = this.element,
+ model = element.$model,
+ namespaces = this.getNamespaces();
+
+ // ns may be
+ //
+ // * prefix only
+ // * prefix:uri
+
+ var prefix = ns.prefix;
+
+ var wellknownUri = DEFAULT_NS_MAP[prefix] || model && (model.getPackage(prefix) || {}).uri;
+
+ var uri = ns.uri || namespaces.prefixMap[prefix] || wellknownUri;
+
+ if (!uri) {
+ throw new Error('no namespace uri given for prefix <' + ns.prefix + '>');
+ }
+
+ ns = namespaces.uriMap[uri];
+
+ if (!ns) {
+ ns = this.logNamespace({ prefix: prefix, uri: uri }, wellknownUri);
+ }
+
+ if (!namespaces.used[ns.uri]) {
+ namespaces.used[ns.uri] = ns;
+ }
+
+ return ns;
+};
+
+ElementSerializer.prototype.parseAttributes = function(properties) {
+ var self = this,
+ element = this.element;
+
+ forEach(properties, function(p) {
+
+ var value = element.get(p.name);
+
+ if (p.isReference) {
+
+ if (!p.isMany) {
+ value = value.id;
+ }
+ else {
+ var values = [];
+ forEach(value, function(v) {
+ values.push(v.id);
+ });
+ // IDREFS is a whitespace-separated list of references.
+ value = values.join(' ');
+ }
+
+ }
+
+ self.addAttribute(self.nsAttributeName(p), value);
+ });
+};
+
+ElementSerializer.prototype.addAttribute = function(name, value) {
+ var attrs = this.attrs;
+
+ if (isString(value)) {
+ value = escapeAttr(value);
+ }
+
+ attrs.push({ name: name, value: value });
+};
+
+ElementSerializer.prototype.serializeAttributes = function(writer) {
+ var attrs = this.attrs,
+ root = !this.parent;
+
+ if (root) {
+ attrs = getNsAttrs(this.namespaces).concat(attrs);
+ }
+
+ forEach(attrs, function(a) {
+ writer
+ .append(' ')
+ .append(nsName(a.name)).append('="').append(a.value).append('"');
+ });
+};
+
+ElementSerializer.prototype.serializeTo = function(writer) {
+ var hasBody = this.body.length,
+ indent = !(this.body.length === 1 && this.body[0] instanceof BodySerializer);
+
+ writer
+ .appendIndent()
+ .append('<' + nsName(this.ns));
+
+ this.serializeAttributes(writer);
+
+ writer.append(hasBody ? '>' : ' />');
+
+ if (hasBody) {
+
+ if (indent) {
+ writer
+ .appendNewLine()
+ .indent();
+ }
+
+ forEach(this.body, function(b) {
+ b.serializeTo(writer);
+ });
+
+ if (indent) {
+ writer
+ .unindent()
+ .appendIndent();
+ }
+
+ writer.append('' + nsName(this.ns) + '>');
+ }
+
+ writer.appendNewLine();
+};
+
+/**
+ * A serializer for types that handles serialization of data types
+ */
+function TypeSerializer(parent, ns) {
+ ElementSerializer.call(this, parent, ns);
+}
+
+TypeSerializer.prototype = new ElementSerializer();
+
+TypeSerializer.prototype.build = function(element) {
+ var descriptor = element.$descriptor;
+
+ this.element = element;
+
+ this.typeNs = this.nsTagName(descriptor);
+
+ // add xsi:type attribute to represent the elements
+ // actual type
+
+ var typeNs = this.typeNs,
+ pkg = element.$model.getPackage(typeNs.uri),
+ typePrefix = (pkg.xml && pkg.xml.typePrefix) || '';
+
+ this.addAttribute(this.nsAttributeName(XSI_TYPE),
+ (typeNs.prefix ? typeNs.prefix + ':' : '') +
+ typePrefix + descriptor.ns.localName);
+
+ // do the usual stuff
+ return ElementSerializer.prototype.build.call(this, element);
+};
+
+TypeSerializer.prototype.isLocalNs = function(ns) {
+ return ns.uri === this.typeNs.uri;
+};
+
+function SavingWriter() {
+ this.value = '';
+
+ this.write = function(str) {
+ this.value += str;
+ };
+}
+
+function FormatingWriter(out, format) {
+
+ var indent = [''];
+
+ this.append = function(str) {
+ out.write(str);
+
+ return this;
+ };
+
+ this.appendNewLine = function() {
+ if (format) {
+ out.write('\n');
+ }
+
+ return this;
+ };
+
+ this.appendIndent = function() {
+ if (format) {
+ out.write(indent.join(' '));
+ }
+
+ return this;
+ };
+
+ this.indent = function() {
+ indent.push('');
+ return this;
+ };
+
+ this.unindent = function() {
+ indent.pop();
+ return this;
+ };
+}
+
+/**
+ * A writer for meta-model backed document trees
+ *
+ * @param {Object} options output options to pass into the writer
+ */
+function XMLWriter(options) {
+
+ options = assign({ format: false, preamble: true }, options || {});
+
+ function toXML(tree, writer) {
+ var internalWriter = writer || new SavingWriter();
+ var formatingWriter = new FormatingWriter(internalWriter, options.format);
+
+ if (options.preamble) {
+ formatingWriter.append(XML_PREAMBLE);
+ }
+
+ new ElementSerializer().build(tree).serializeTo(formatingWriter);
+
+ if (!writer) {
+ return internalWriter.value;
+ }
+ }
+
+ return {
+ toXML: toXML
+ };
+}
+
+module.exports = XMLWriter;
+
+},{"253":253,"255":255,"258":258,"374":374,"377":377,"75":75,"85":85,"88":88}],78:[function(_dereq_,module,exports){
+(function (Buffer){
+// wrapper for non-node envs
+;(function (sax) {
+
+sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+sax.SAXParser = SAXParser
+sax.SAXStream = SAXStream
+sax.createStream = createStream
+
+// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+// since that's the earliest that a buffer overrun could occur. This way, checks are
+// as rare as required, but as often as necessary to ensure never crossing this bound.
+// Furthermore, buffers are only tested at most once per write(), so passing a very
+// large string into write() might have undesirable effects, but this is manageable by
+// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
+// edge case, result in creating at most one complete copy of the string passed in.
+// Set to Infinity to have unlimited buffers.
+sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+var buffers = [
+ "comment", "sgmlDecl", "textNode", "tagName", "doctype",
+ "procInstName", "procInstBody", "entity", "attribName",
+ "attribValue", "cdata", "script"
+]
+
+sax.EVENTS = // for discoverability.
+ [ "text"
+ , "processinginstruction"
+ , "sgmldeclaration"
+ , "doctype"
+ , "comment"
+ , "attribute"
+ , "opentag"
+ , "closetag"
+ , "opencdata"
+ , "cdata"
+ , "closecdata"
+ , "error"
+ , "end"
+ , "ready"
+ , "script"
+ , "opennamespace"
+ , "closenamespace"
+ ]
+
+function SAXParser (strict, opt) {
+ if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
+
+ var parser = this
+ clearBuffers(parser)
+ parser.q = parser.c = ""
+ parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+ parser.opt = opt || {}
+ parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
+ parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase"
+ parser.tags = []
+ parser.closed = parser.closedRoot = parser.sawRoot = false
+ parser.tag = parser.error = null
+ parser.strict = !!strict
+ parser.noscript = !!(strict || parser.opt.noscript)
+ parser.state = S.BEGIN
+ parser.ENTITIES = Object.create(sax.ENTITIES)
+ parser.attribList = []
+
+ // namespaces form a prototype chain.
+ // it always points at the current tag,
+ // which protos to its parent tag.
+ if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
+
+ // mostly just for error reporting
+ parser.trackPosition = parser.opt.position !== false
+ if (parser.trackPosition) {
+ parser.position = parser.line = parser.column = 0
+ }
+ emit(parser, "onready")
+}
+
+if (!Object.create) Object.create = function (o) {
+ function f () { this.__proto__ = o }
+ f.prototype = o
+ return new f
+}
+
+if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
+ return o.__proto__
+}
+
+if (!Object.keys) Object.keys = function (o) {
+ var a = []
+ for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+ return a
+}
+
+function checkBufferLength (parser) {
+ var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+ , maxActual = 0
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ var len = parser[buffers[i]].length
+ if (len > maxAllowed) {
+ // Text/cdata nodes can get big, and since they're buffered,
+ // we can get here under normal conditions.
+ // Avoid issues by emitting the text node now,
+ // so at least it won't get any bigger.
+ switch (buffers[i]) {
+ case "textNode":
+ closeText(parser)
+ break
+
+ case "cdata":
+ emitNode(parser, "oncdata", parser.cdata)
+ parser.cdata = ""
+ break
+
+ case "script":
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ break
+
+ default:
+ error(parser, "Max buffer length exceeded: "+buffers[i])
+ }
+ }
+ maxActual = Math.max(maxActual, len)
+ }
+ // schedule the next check for the earliest possible buffer overrun.
+ parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
+ + parser.position
+}
+
+function clearBuffers (parser) {
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ parser[buffers[i]] = ""
+ }
+}
+
+function flushBuffers (parser) {
+ closeText(parser)
+ if (parser.cdata !== "") {
+ emitNode(parser, "oncdata", parser.cdata)
+ parser.cdata = ""
+ }
+ if (parser.script !== "") {
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ }
+}
+
+SAXParser.prototype =
+ { end: function () { end(this) }
+ , write: write
+ , resume: function () { this.error = null; return this }
+ , close: function () { return this.write(null) }
+ , flush: function () { flushBuffers(this) }
+ }
+
+try {
+ var Stream = _dereq_("stream").Stream
+} catch (ex) {
+ var Stream = function () {}
+}
+
+
+var streamWraps = sax.EVENTS.filter(function (ev) {
+ return ev !== "error" && ev !== "end"
+})
+
+function createStream (strict, opt) {
+ return new SAXStream(strict, opt)
+}
+
+function SAXStream (strict, opt) {
+ if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
+
+ Stream.apply(this)
+
+ this._parser = new SAXParser(strict, opt)
+ this.writable = true
+ this.readable = true
+
+
+ var me = this
+
+ this._parser.onend = function () {
+ me.emit("end")
+ }
+
+ this._parser.onerror = function (er) {
+ me.emit("error", er)
+
+ // if didn't throw, then means error was handled.
+ // go ahead and clear error, so we can write again.
+ me._parser.error = null
+ }
+
+ this._decoder = null;
+
+ streamWraps.forEach(function (ev) {
+ Object.defineProperty(me, "on" + ev, {
+ get: function () { return me._parser["on" + ev] },
+ set: function (h) {
+ if (!h) {
+ me.removeAllListeners(ev)
+ return me._parser["on"+ev] = h
+ }
+ me.on(ev, h)
+ },
+ enumerable: true,
+ configurable: false
+ })
+ })
+}
+
+SAXStream.prototype = Object.create(Stream.prototype,
+ { constructor: { value: SAXStream } })
+
+SAXStream.prototype.write = function (data) {
+ if (typeof Buffer === 'function' &&
+ typeof Buffer.isBuffer === 'function' &&
+ Buffer.isBuffer(data)) {
+ if (!this._decoder) {
+ var SD = _dereq_('string_decoder').StringDecoder
+ this._decoder = new SD('utf8')
+ }
+ data = this._decoder.write(data);
+ }
+
+ this._parser.write(data.toString())
+ this.emit("data", data)
+ return true
+}
+
+SAXStream.prototype.end = function (chunk) {
+ if (chunk && chunk.length) this.write(chunk)
+ this._parser.end()
+ return true
+}
+
+SAXStream.prototype.on = function (ev, handler) {
+ var me = this
+ if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
+ me._parser["on"+ev] = function () {
+ var args = arguments.length === 1 ? [arguments[0]]
+ : Array.apply(null, arguments)
+ args.splice(0, 0, ev)
+ me.emit.apply(me, args)
+ }
+ }
+
+ return Stream.prototype.on.call(me, ev, handler)
+}
+
+
+
+// character classes and tokens
+var whitespace = "\r\n\t "
+ // this really needs to be replaced with character classes.
+ // XML allows all manner of ridiculous numbers and digits.
+ , number = "0124356789"
+ , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ // (Letter | "_" | ":")
+ , quote = "'\""
+ , entity = number+letter+"#"
+ , attribEnd = whitespace + ">"
+ , CDATA = "[CDATA["
+ , DOCTYPE = "DOCTYPE"
+ , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
+ , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
+ , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
+
+// turn all the string character sets into character class objects.
+whitespace = charClass(whitespace)
+number = charClass(number)
+letter = charClass(letter)
+
+// http://www.w3.org/TR/REC-xml/#NT-NameStartChar
+// This implementation works on strings, a single character at a time
+// as such, it cannot ever support astral-plane characters (10000-EFFFF)
+// without a significant breaking change to either this parser, or the
+// JavaScript language. Implementation of an emoji-capable xml parser
+// is left as an exercise for the reader.
+var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
+
+var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
+
+quote = charClass(quote)
+entity = charClass(entity)
+attribEnd = charClass(attribEnd)
+
+function charClass (str) {
+ return str.split("").reduce(function (s, c) {
+ s[c] = true
+ return s
+ }, {})
+}
+
+function isRegExp (c) {
+ return Object.prototype.toString.call(c) === '[object RegExp]'
+}
+
+function is (charclass, c) {
+ return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
+}
+
+function not (charclass, c) {
+ return !is(charclass, c)
+}
+
+var S = 0
+sax.STATE =
+{ BEGIN : S++
+, TEXT : S++ // general stuff
+, TEXT_ENTITY : S++ // & and such.
+, OPEN_WAKA : S++ // <
+, SGML_DECL : S++ //
+, SCRIPT : S++ //
+```
+
+#### Babel
+
+[Babel](http://babeljs.io/) is a next generation JavaScript compiler. One of the features is the ability to use ES6/ES2015 modules now, even though browsers do not yet support this feature natively.
+
+```js
+import $ from "jquery";
+```
+
+#### Browserify/Webpack
+
+There are several ways to use [Browserify](http://browserify.org/) and [Webpack](https://webpack.github.io/). For more information on using these tools, please refer to the corresponding project's documention. In the script, including jQuery will usually look like this...
+
+```js
+var $ = require("jquery");
+```
+
+#### AMD (Asynchronous Module Definition)
+
+AMD is a module format built for the browser. For more information, we recommend [require.js' documentation](http://requirejs.org/docs/whyamd.html).
+
+```js
+define(["jquery"], function($) {
+
+});
+```
+
+### Node
+
+To include jQuery in [Node](nodejs.org), first install with npm.
+
+```sh
+npm install jquery
+```
+
+For jQuery to work in Node, a window with a document is required. Since no such window exists natively in Node, one can be mocked by tools such as [jsdom](https://github.com/tmpvar/jsdom). This can be useful for testing purposes.
+
+```js
+require("jsdom").env("", function(err, window) {
+ if (err) {
+ console.error(err);
+ return;
+ }
+
+ var $ = require("jquery")(window);
+});
+```
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json
new file mode 100644
index 0000000..95798d5
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/bower.json
@@ -0,0 +1,14 @@
+{
+ "name": "jquery",
+ "main": "dist/jquery.js",
+ "license": "MIT",
+ "ignore": [
+ "package.json"
+ ],
+ "keywords": [
+ "jquery",
+ "javascript",
+ "browser",
+ "library"
+ ]
+}
\ No newline at end of file
diff --git a/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js
new file mode 100644
index 0000000..5c3c456
--- /dev/null
+++ b/Rechnungseingang/target/process-test-coverage/bower_components/jquery/dist/jquery.js
@@ -0,0 +1,9814 @@
+/*!
+ * jQuery JavaScript Library v2.2.4
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-05-20T17:23Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Support: Firefox 18+
+// Can't be in strict mode, several libs including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+//"use strict";
+var arr = [];
+
+var document = window.document;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ version = "2.2.4",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = jQuery.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isFunction: function( obj ) {
+ return jQuery.type( obj ) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ // adding 1 corrects loss of precision from parseFloat (#15100)
+ var realStringObj = obj && obj.toString();
+ return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ var key;
+
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call( obj, "constructor" ) &&
+ !hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android<4.0, iOS<6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf( "use strict" ) === 1 ) {
+ script = document.createElement( "script" );
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE9-11+
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+// JSHint would error on this code due to the Symbol not being defined in ES5.
+// Defining this global in .jshintrc would create a danger of using the global
+// unguarded in another place, it seems safer to just disable JSHint for these
+// three lines.
+/* jshint ignore: start */
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+/* jshint ignore: end */
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: iOS 8.2 (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.2.1
+ * http://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2015-10-17
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // http://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, nidselect, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
+ while ( i-- ) {
+ groups[i] = nidselect + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, parent,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( (parent = document.defaultView) && parent.top !== parent ) {
+ // Support: IE 11
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( document.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var m = context.getElementById( id );
+ return m ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ docElem.appendChild( div ).innerHTML = " " +
+ "" +
+ " ";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibing-combinator selector` fails
+ if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( (oldCache = uniqueCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = " ";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = " ";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ // Support: Blackberry 4.6
+ // gEBID returns nodes no longer in the document (#6963)
+ if ( elem && elem.parentNode ) {
+
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[ 0 ] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( pos ?
+ pos.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnotwhite = ( /\S+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( jQuery.isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks( "memory" ) ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this === promise ? newDefer.promise() : this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add( function() {
+
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 ||
+ ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred.
+ // If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // Add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .progress( updateFunc( i, progressContexts, progressValues ) )
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // If we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+} );
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+} );
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called
+ // after the browser event has already occurred.
+ // Support: IE9-10 only
+ // Older IE sometimes signals "interactive" too soon
+ if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ register: function( owner, initial ) {
+ var value = initial || {};
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable, non-writable property
+ // configurability must be true to allow the property to be
+ // deleted with the delete operator
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ writable: true,
+ configurable: true
+ } );
+ }
+ return owner[ this.expando ];
+ },
+ cache: function( owner ) {
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( !acceptData( owner ) ) {
+ return {};
+ }
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+ owner[ this.expando ] && owner[ this.expando ][ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase( key ) );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key === undefined ) {
+ this.register( owner );
+
+ } else {
+
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <= 35-45+
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://code.google.com/p/chromium/issues/detail?id=378607
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data, camelKey;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = dataUser.get( elem, key ) ||
+
+ // Try to find dashed key if it exists (gh-2779)
+ // This is for 2.2.x only
+ dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
+
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ camelKey = jQuery.camelCase( key );
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = dataUser.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ camelKey = jQuery.camelCase( key );
+ this.each( function() {
+
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = dataUser.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ dataUser.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
+ dataUser.set( this, key, value );
+ }
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" ||
+ !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted,
+ scale = 1,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() { return tween.cur(); } :
+ function() { return jQuery.css( elem, prop, "" ); },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ do {
+
+ // If previous iteration zeroed out, double until we get *something*.
+ // Use string for doubling so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ initialInUnit = initialInUnit / scale;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // Break the loop if scale is unchanged or perfect, or if we've just had enough.
+ } while (
+ scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
+ );
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([\w:-]+)/ );
+
+var rscriptType = ( /^$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE9
+ option: [ 1, "", " " ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting or other required elements.
+ thead: [ 1, "" ],
+ col: [ 2, "" ],
+ tr: [ 2, "" ],
+ td: [ 3, "" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE9-11+
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( tag || "*" ) :
+ typeof context.querySelectorAll !== "undefined" ?
+ context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android<4.1, PhantomJS<2
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0-4.3, Safari<=5.1
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari<=5.1, Android<4.2
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE<=11+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE9
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Support (at least): Chrome, IE9
+ // Find delegate handlers
+ // Black-hole SVG instance trees (#13180)
+ //
+ // Support: Firefox<=42+
+ // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
+ if ( delegateCount && cur.nodeType &&
+ ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push( { elem: cur, handlers: matches } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
+ "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split( " " ),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
+ "screenX screenY toElement" ).split( " " ),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX +
+ ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
+ ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY +
+ ( doc && doc.scrollTop || body && body.scrollTop || 0 ) -
+ ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome<28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android<4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://code.google.com/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
+
+ // Support: IE 10-11, Edge 10240+
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /
+
+
+
+
+
+
+